{"#BlackLivesMatter":"ambit-content_public","$:/Error Message.png":"ambit-content_public","$:/GoogleAnalyticsAccount":"afc-base-theme","$:/GoogleAnalyticsMeasurementID":"afc-base-theme","$:/Import!!popup-AMBIT - Logic Model blank.jpg":"ambit-content_public","$:/Import!!popup-AMBIT Manual.jpg":"ambit-content_public","$:/Import!!popup-AddNewPagePic.jpg":"ambit-content_public","$:/SiteTitle":"afc-base-theme","$:/_/Admin":"ambit-content_public","$:/_/Admin/ClassicTiddlers":"ambit-content_public","$:/_/Admin/ClassicTiddlersWithTagsMacro":"ambit-content_public","$:/_/Admin/Old Tiddlers":"ambit-content_public","$:/_AFC/AboveStory/Logo":"afc-base-theme","$:/_AFC/EditDraftInfoSegment":"afc-base-theme","$:/_AFC/Fonts/UseFonts":"afc-base-theme","$:/_AFC/Macros/Image":"afc-base-theme","$:/_AFC/Macros/YouTube":"afc-base-theme","$:/_AFC/Palette":"afc-base-theme","$:/_AFC/Recent/All":"ambit-content_public","$:/_AFC/Recent/Local":"ambit-content_public","$:/_AFC/SideButtons":"ambit-content_public","$:/_AFC/SideButtons/Styles":"ambit-content_public","$:/_AFC/Startup/ConfigurePreview":"afc-base-theme","$:/_AFC/Styles/Bubbles":"ambit-content_public","$:/_AFC/Styles/DocLinks":"afc-base-theme","$:/_AFC/Styles/FadedSidebar":"afc-base-theme","$:/_AFC/Styles/HideEditButton":"afc-base-theme","$:/_AFC/Styles/Overrides":"afc-base-theme","$:/_AFC/Styles/TopMenu":"afc-base-theme","$:/_AFC/SurveyBanner":"afc-base-theme","$:/_AFC/SurveyBanner/Styles":"afc-base-theme","$:/_AFC/TagDropdown/NewHere":"afc-base-theme","$:/_AFC/TagNavigation/Styles":"ambit-content_public","$:/_AFC/TagNavigationMacro":"ambit-content_public","$:/_AFC/Tiddler/Tagged":"ambit-content_public","$:/_AFC/Tiddler/Tagged/Styles":"ambit-content_public","$:/_AFC/TiddlerInfo/Text":"afc-base-theme","$:/_AFC/consent-banner/buttons/login":"afc-base-theme","$:/_AFC/grey-wordmark.svg":"afc-base-theme","$:/_AIM/Questionnaire/01 Young person daily life - Social activities":"ambit-aim_public","$:/_AIM/Questionnaire/02 Young person daily life - Attendance at Education, Employment or Training":"ambit-content_public","$:/_AIM/Questionnaire/03 Young person daily life - Attainment in Education, Employment or Training":"ambit-content_public","$:/_AIM/Questionnaire/04 Young person daily life - Other talents and abilities":"ambit-content_public","$:/_AIM/Questionnaire/05 Young person daily life - Physical health condition":"ambit-content_public","$:/_AIM/Questionnaire/06 Young person daily life - Self care":"ambit-content_public","$:/_AIM/Questionnaire/07 Young person daily life - Physical impairment or disability":"ambit-content_public","$:/_AIM/Questionnaire/08 Young person daily life - Social development":"ambit-content_public","$:/_AIM/Questionnaire/09 Young person daily life - Social skills and interaction":"ambit-aim_public","$:/_AIM/Questionnaire/10 Socio-Economic - Provision of Stable Housing":"ambit-aim_public","$:/_AIM/Questionnaire/11 Socio-Economic - Income and Provision of Material Resources":"ambit-aim_public","$:/_AIM/Questionnaire/12 Family - Relationships":"ambit-content_public","$:/_AIM/Questionnaire/13 Family - Conflict with young person":"ambit-content_public","$:/_AIM/Questionnaire/14 Family - Parental discipline":"ambit-content_public","$:/_AIM/Questionnaire/15 Social - Supportive adult relationships outside the family":"ambit-content_public","$:/_AIM/Questionnaire/16 Social - Peer friendships":"ambit-content_public","$:/_AIM/Questionnaire/17 Social - Prosocial or antisocial peergroup":"ambit-content_public","$:/_AIM/Questionnaire/18 Mental State (1) - Cognitive ability":"ambit-content_public","$:/_AIM/Questionnaire/19 Mental State (1) - Anxiety":"ambit-content_public","$:/_AIM/Questionnaire/20 Mental State (1) - Obsessional Ideas and Compulsive Behaviour":"ambit-content_public","$:/_AIM/Questionnaire/21 Mental State (1) - Post-traumatic intrusive experience":"ambit-content_public","$:/_AIM/Questionnaire/22 Mental State (1) - Attention and concentration":"ambit-content_public","$:/_AIM/Questionnaire/23 Mental State (1) - Irritability":"ambit-content_public","$:/_AIM/Questionnaire/24 Mental State (1) - Sleep disturbance":"ambit-aim_public","$:/_AIM/Questionnaire/25 Mental State (1) - Depression":"ambit-content_public","$:/_AIM/Questionnaire/26 Mental State (1) - Self-injurious Behaviour":"ambit-content_public","$:/_AIM/Questionnaire/27 Mental State (1) - Eating problems":"ambit-content_public","$:/_AIM/Questionnaire/28 Mental State (2) - Substance misuse":"ambit-content_public","$:/_AIM/Questionnaire/29 Mental State (2) - Suicidality":"ambit-content_public","$:/_AIM/Questionnaire/30 Mental State (2) - Defiance":"ambit-content_public","$:/_AIM/Questionnaire/31 Mental State (2) - Destruction of Property":"ambit-content_public","$:/_AIM/Questionnaire/32 Mental State (2) - Physical harm to others":"ambit-content_public","$:/_AIM/Questionnaire/33 Mental State (2) - Problematic sexual behaviour":"ambit-content_public","$:/_AIM/Questionnaire/34 Mental State (2) - Psychotic experiences":"ambit-content_public","$:/_AIM/Questionnaire/35 Mental State (2) - Elated mood":"ambit-content_public","$:/_AIM/Questionnaire/36 Mental State (2) - Mentalizing Capacity":"ambit-content_public","$:/_AIM/Questionnaire/37 Response to situation - Insight":"ambit-aim_public","$:/_AIM/Questionnaire/38 Response to situation - Engagement with treatment and care":"ambit-content_public","$:/_AIM/Questionnaire/39 Measure of Complexity - Chronicity":"ambit-aim_public","$:/_AIM/Questionnaire/40 Measure of Complexity - Pervasiveness":"ambit-aim_public","$:/_AIM/Questionnaire/41 Power and Control - Experiences of Discrimination":"ambit-aim_public","$:/_AIM/Questionnaire/42 Power and Control - Experiences of Exploitation":"ambit-aim_public","$:/_AIM/Questionnaire/43 Power and Control - Online life":"ambit-aim_public","$:/_AMBIT/Palette":"ambit-theme","$:/_AMBITWheel/English":"ambit-content_public","$:/_AMBITWheel/Macros":"ambit-content_public","$:/_AMBITWheel/Styles":"ambit-content_public","$:/_AMBITWheel/Template":"ambit-content_public","$:/_Macros/ImageLink":"afc-base-theme","$:/_Macros/LinkDoc":"afc-base-theme","$:/_Macros/LinkPDF":"afc-base-theme","$:/_Macros/Video":"afc-base-theme","$:/_Menu/AIM":"ambit-content_public","$:/_Menu/AMBITReferences":"ambit-content_public","$:/_Menu/About":"ambit-content_public","$:/_Menu/Client":"ambit-content_public","$:/_Menu/Community":"ambit-content_public","$:/_Menu/Home":"ambit-content_public","$:/_Menu/Home/DropDown":"ambit-content_public","$:/_Menu/Learning":"ambit-content_public","$:/_Menu/Networks":"ambit-content_public","$:/_Menu/TOC":"ambit-content_public","$:/_Menu/TOC/DropDown":"ambit-content_public","$:/_Menu/Team":"ambit-content_public","$:/_Menu/Training":"ambit-content_public","$:/_Menu/Using the Manual":"ambit-content_public","$:/config/Manager/Filter":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/control-panel":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager":"ambit-content_public","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp":"ambit-content_public","$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/comments":"ambit-content_public","$:/config/RelinkOnRename":"ambit-willowvue_public","$:/config/TextEditor/EditorHeight/Mode":"ambit-help_public","$:/config/TimestampDisable":"ambit-content_public","$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar":"ambit-content_public","$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others":"ambit-content_public","$:/config/ViewToolbarButtons/Visibility/$:/plugins/federatial/print/button":"afc-base-theme","$:/config/peek-stylesheets/mode/--994748944":"ambit-content_public","$:/config/peek-stylesheets/open/--994748944$:/_AFC/Fonts/UseFonts":"ambit-content_public","$:/config/peek-stylesheets/open/--994748944$:/_AFC/Styles/Overrides":"ambit-content_public","$:/config/peek-stylesheets/open/--994748944$:/plugins/federatial/xememex/styles":"ambit-content_public","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/contents":"afc-base-theme","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":"ambit-content_public","$:/config/plugins/tiddlywiki/consent-banner/greeting-message":"afc-base-theme","$:/core/ui/MoreSideBar/Drafts":"afc-base-theme","$:/core/ui/SideBar/Recent":"ambit-content_public","$:/core/ui/SideBar/Tools":"ambit-content_public","$:/core/ui/ViewTemplate/subtitle":"afc-base-theme","$:/favicon.ico":"afc-base-theme","$:/images/fa5/brands/youtube":"ambit-content_public","$:/images/fa5/solid/chevron-circle-right":"ambit-content_public","$:/images/fa5/solid/clock":"ambit-content_public","$:/images/fa5/solid/comments":"ambit-content_public","$:/images/fa5/solid/mail-bulk":"ambit-content_public","$:/images/fa5/solid/sticky-note":"ambit-content_public","$:/images/fa5/solid/tasks":"ambit-content_public","$:/language/BinaryWarning/Prompt":"ambit-content_public","$:/language/Buttons/Permalink/Caption":"ambit-content_public","$:/language/Buttons/Permalink/Hint":"ambit-content_public","$:/language/Buttons/Permaview/Caption":"ambit-content_public","$:/language/Buttons/Permaview/Hint":"ambit-content_public","$:/language/SideBar/Open/Caption":"ambit-content_public","$:/language/SideBar/Recent/Caption":"ambit-content_public","$:/layout":"ambit-content_public","$:/palette":"ambit-content_public","$:/plugins/federatial/aim-questionnaire":"ambit-aim_public","$:/plugins/federatial/print/button":"afc-base-theme","$:/plugins/federatial/print/styles":"afc-base-theme","$:/plugins/federatial/print/template":"afc-base-theme","$:/plugins/federatial/print/template/inner":"afc-base-theme","$:/plugins/federatial/print/window":"afc-base-theme","$:/plugins/federatial/xememex/status-button":"afc-base-theme","$:/plugins/tiddlywiki/comments":"ambit-theme","$:/plugins/tiddlywiki/comments/sidebar":"ambit-content_public","$:/plugins/tiddlywiki/consent-banner":"afc-base-theme","$:/plugins/tiddlywiki/googleanalytics":"afc-base-theme","$:/plugins/tiddlywiki/menubar":"afc-base-theme","$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot":"ambit-content_public","$:/styles/lizTable":"ambit-content_public","$:/tags/EditTemplate":"ambit-content_public","$:/tags/MenuBar":"ambit-content_public","$:/tags/MoreSideBar":"ambit-content_public","$:/tags/SideBar":"ambit-content_public","$:/tags/TopMenu":"ambit-content_public","$:/tags/ViewTemplate":"afc-base-theme","$:/theme":"ambit-content_public","$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":"ambit-content_public","$:/themes/tiddlywiki/vanilla/metrics/storyleft":"ambit-content_public","$:/themes/tiddlywiki/vanilla/options/sidebarlayout":"ambit-content_public","$:/themes/tiddlywiki/vanilla/settings/backgroundimage":"ambit-content_public","$:/view":"ambit-content_public","(a) Work in Progress - Major change":"ambit-content_public","(b) Work in Progress - Minor change":"ambit-content_public","1. Educational-Vocational Engagement and Assessment":"ambit-content_public","1.JPG":"ambit-content_public","2. Educational-Vocational Intervention and Transition":"ambit-content_public","2.JPG":"ambit-content_public","3. Educational-Vocational Illustrative Case Vignette":"ambit-content_public","4.JPG":"ambit-content_public","4corners.PNG":"ambit-content_public","73b76b47-ee5a-4bad-b425-151e215679a0 (1).jpg":"ambit-content_public","A Guide to Editing the Manual":"ambit-content_public","ABC Diary-keeping":"ambit-content_public","ADHD":"ambit-content_public","AF-logo-RGB-Green.png":"ambit-content_public","AFNCCF":"ambit-content_public","AIM":"ambit-content_public","AIM - Key Problems":"ambit-content_public","AIM Cards":"ambit-content_public","AIM Cards Board - download here":"ambit-content_public","AIM Creative Commons Licence":"ambit-content_public","AIM Guides":"ambit-content_public","AIM Items":"ambit-content_public","AIM New Items: Experiences of Discrimination":"ambit-content_public","AIM New Items: Experiences of Exploitation":"ambit-content_public","AIM New Items: Online Life":"ambit-content_public","AIM Questionnaire: Updates and revisions":"ambit-content_public","AIM Spreadsheet":"ambit-content_public","AIM baseline scores from CASUS study":"ambit-content_public","AIM cards board - download":"ambit-content_public","AIM cards pic1.jpg":"ambit-content_public","AIM individual score.JPG":"ambit-content_public","AIM questionnaire - interactive version":"ambit-content_public","AIM questionnaire - paper version":"ambit-content_public","AIM score.JPG":"ambit-content_public","AIM suggested interventions":"ambit-content_public","AIMmenu":"ambit-content_public","ALF":"ambit-content_public","AMBIT":"ambit-content_public","AMBIT - Logic Model blank.jpg":"ambit-content_public","AMBIT Across a Complex Array of CAMHS services - Gavin Cullen and Fiona Duffy":"ambit-content_public","AMBIT Client Impact Project (ACIP)":"ambit-content_public","AMBIT Competencies":"ambit-content_public","AMBIT Competencies covered in the Basic Training":"ambit-content_public","AMBIT Conference presentations":"ambit-content_public","AMBIT Consultation Day":"ambit-content_public","AMBIT Disintegration Grid template with instructions.pdf":"ambit-content_public","AMBIT Editorial Group":"ambit-content_public","AMBIT FAQs":"ambit-content_public","AMBIT Full Competency Framework":"ambit-content_public","AMBIT Implementation follow-up":"ambit-content_public","AMBIT Informed Team Practice measure":"ambit-content_public","AMBIT Integrative Measure (AIM) - a paper Guide for Practitioners (2).pdf":"ambit-content_public","AMBIT Integrative Measure (AIM) - an online Guide for Practitioners.pdf":"ambit-content_public","AMBIT LEADS - useful training pages":"ambit-content_public","AMBIT Lead":"ambit-content_public","AMBIT Lead peer-to-peer system":"ambit-content_public","AMBIT Local Facilitators":"ambit-content_public","AMBIT Local Trainer: overcoming barriers to effective implementation":"ambit-content_public","AMBIT Manual Library of Pages":"ambit-content_public","AMBIT Manual Site Map":"ambit-content_public","AMBIT Marking the Task cards v2.pdf":"ambit-content_public","AMBIT Measures Under Development":"ambit-content_public","AMBIT Newsletter":"ambit-content_public","AMBIT Outcome Studies":"ambit-content_public","AMBIT Practice Audit Tool (APrAT)":"ambit-content_public","AMBIT Practice Audit Tool_v.2.pdf":"ambit-content_public","AMBIT Programme team safeguarding procedures":"ambit-content_public","AMBIT SERVICE EVALUATION QUESTIONNAIRE.pdf":"ambit-content_public","AMBIT Service Evaluation Questionnaire (ASEQ)":"ambit-content_public","AMBIT Stance Exercises":"ambit-content_public","AMBIT Supervision for HEE Crisis Teams":"ambit-content_public","AMBIT Team Competencies":"ambit-content_public","AMBIT Trainers":"ambit-content_public","AMBIT Training":"ambit-content_public","AMBIT Training Application Process":"ambit-content_public","AMBIT Training Principles":"ambit-content_public","AMBIT Training objectives for Risk Support training":"ambit-content_public","AMBIT Unconference 2016":"ambit-content_public","AMBIT Wheel":"ambit-content_public","AMBIT Wheel (Arabic)":"ambit-content_public","AMBIT Wheel (Catalan)":"ambit-content_public","AMBIT Wheel (Chinese - 中文)":"ambit-content_public","AMBIT Wheel (German)":"ambit-content_public","AMBIT Wheel (Japanese - 日本語)":"ambit-content_public","AMBIT Wheel (Spanish)":"ambit-content_public","AMBIT Wheel - Chinese.jpeg":"ambit-content_public","AMBIT Wheel- Visual aids for colleagues":"ambit-content_public","AMBIT Wheel-Catalan.jpg":"ambit-content_public","AMBIT Wheel.pdf":"ambit-content_public","AMBIT Wheel_B+W_round.jpg":"ambit-content_public","AMBIT Wheel_Japanese (2).jpg":"ambit-content_public","AMBIT and other Approaches, Methods and Techniques":"ambit-content_public","AMBIT as a Service Quality Improvement approach":"ambit-content_public","AMBIT card resources for supervision":"ambit-content_public","AMBIT community of practice - Teams with local AMBIT manuals":"ambit-content_public","AMBIT development topics":"ambit-content_public","AMBIT for School Refusal":"ambit-content_public","AMBIT for adults with complex trauma/relational difficulties":"ambit-content_public","AMBIT icon":"ambit-content_public","AMBIT implementation questionnaire.pdf":"ambit-content_public","AMBIT in Education":"ambit-content_public","AMBIT in adult prisons and forensic in-patient hospitals":"ambit-content_public","AMBIT in an Adolescent MH team: struggles and successes - Griffiths, Duffy, Kennedy":"ambit-content_public","AMBIT in gangs and violence prevention":"ambit-content_public","AMBIT in larger organisations (Unconference 2016)":"ambit-content_public","AMBIT is a type of pre-therapy":"ambit-content_public","AMBIT knowledge and skills questionnaire.pdf":"ambit-content_public","AMBIT logic model (2019)":"ambit-content_public","AMBIT playing cards":"ambit-content_public","AMBIT programme":"ambit-content_public","AMBIT stance cards":"ambit-content_public","AMBIT stance playing cards":"ambit-content_public","AMBIT study group development":"ambit-content_public","AMBIT study group projects":"ambit-content_public","AMBIT supervision provided by the AMBIT Programme":"ambit-content_public","AMBIT top-bar.png":"ambit-content_public","AMBIT training day 1":"ambit-content_public","AMBIT training day 2 AM":"ambit-content_public","AMBIT training day 2 PM":"ambit-content_public","AMBIT training day 3 AM":"ambit-content_public","AMBIT training day 3 PM":"ambit-content_public","AMBIT training day 4 AM":"ambit-content_public","AMBIT training day 4 PM":"ambit-content_public","AMBIT usual suspects cards":"ambit-content_public","AMBIT wheel 2014_SMALL":"ambit-content_public","AMBIT wheel 22.jpg":"ambit-content_public","AMBIT wheel Catalan.png":"ambit-content_public","AMBIT-R":"ambit-content_public","AMBIT-R Training Schedule":"ambit-content_public","AMBIT-R Training Schedule - Day 1":"ambit-content_public","AMBIT-R Training Schedule - Day 2":"ambit-content_public","AMBIT-R Training Schedule - Day 3":"ambit-content_public","AMBIT-R Training Schedule - Day 4":"ambit-content_public","AMBIT-R training programme":"ambit-content_public","AMBIT-R training programme DAY 1":"ambit-content_public","AMBIT-R training programme DAY 2":"ambit-content_public","AMBIT-R training programme DAY 3":"ambit-content_public","AMBIT-R training programme DAY 4":"ambit-content_public","AMBIT-influenced":"ambit-content_public","AMBIT: an overview":"ambit-content_public","AMBITWheel.pdf":"ambit-content_public","AMBIT_BookCover.jpg":"ambit-content_public","AMBITbook2.jpg":"ambit-content_public","AMBITbook2_small.jpg":"ambit-content_public","AMBITwheel Japanese.jpg":"ambit-content_public","AOS.PNG":"ambit-content_public","APrAT":"ambit-content_public","APrAT exercise in, or across, teams":"ambit-content_public","ARHQ":"ambit-content_public","ARHQ.jpg":"ambit-content_public","ARHQ_20.06.17.pdf":"ambit-content_public","ARHQ_WorkedExample.pdf":"ambit-content_public","AS.PNG":"ambit-content_public","ASEQpicture.png":"ambit-content_public","About 'Who does what?'":"ambit-content_public","About this Manual":"ambit-content_public","AboutContents":"ambit-content_public","Academic references":"ambit-content_public","Account of AMBIT presentation - ACAMH magazine (Autumn 2013)":"ambit-content_public","Acting Out":"ambit-content_public","Action/Making change":"ambit-content_public","Active Planning":"ambit-content_public","Active Planning - Comparing Destinations":"ambit-content_public","Active Planning - Exercise - different destinations":"ambit-content_public","Active Planning in the team culture":"ambit-content_public","Active Planning through the phases of AMBIT work":"ambit-content_public","Adapt your Discourse":"ambit-content_public","Adapting AMBIT training to risk support training":"ambit-content_public","Adapting to Circumstances":"ambit-content_public","Adaptive":"ambit-content_public","AddNewPagePic.jpg":"ambit-content_public","Adding a Tag to a page (tiddler) - video":"ambit-content_public","Adding a new page (tiddler)":"ambit-content_public","Addressing Dis-integration":"ambit-content_public","Advanced explanatory and listening skills.jpg":"ambit-content_public","Adverse Childhood Experiences (ACEs)":"ambit-content_public","Adverse Community Environments":"ambit-content_public","Advice about Role Playing":"ambit-content_public","Advice about the Implementation Plan":"ambit-content_public","Advocates (mental health, exploitation, domestic violence, etc)":"ambit-content_public","Affect":"ambit-content_public","Affect Regulation":"ambit-content_public","Affect storms":"ambit-content_public","Affective mentalization":"ambit-content_public","Agentive self":"ambit-content_public","Aims and Goals":"ambit-content_public","Aims of Family work":"ambit-content_public","Am I guilty or worried about putting increasing demands on my client?":"ambit-content_public","Ambivalence":"ambit-content_public","An Adaptation of the Disintegration Grid":"ambit-content_public","Analogies":"ambit-content_public","Anger Management":"ambit-content_public","Anna Freud National Centre for Children and Families":"ambit-content_public","Anna Oriol-Sanchez":"ambit-content_public","Anthony Scott":"ambit-content_public","Anxiety":"ambit-content_public","Are you asking people to work outside their competency/paygrade?":"ambit-content_public","Asen, Bevington (2007) Barefoot practitioners":"ambit-content_public","Assess Stage of Change":"ambit-content_public","Assessing a learning organisation":"ambit-content_public","Assessment":"ambit-content_public","Assessment for SUD-Rx":"ambit-content_public","Assessment for SUD-Rx - Giving Feedback":"ambit-content_public","AssessmentPhaseOverview.PNG":"ambit-content_public","Attachment":"ambit-content_public","Attachment Behaviours":"ambit-content_public","Attachment Definitions":"ambit-content_public","Attachment Object":"ambit-content_public","Attachment Relationship":"ambit-content_public","Attachment theory":"ambit-content_public","Auditing AMBIT practice: general principles":"ambit-content_public","Auditing AMBIT: learning from Altrecht":"ambit-content_public","Auditing AMBIT: using the APRAT":"ambit-content_public","Authors":"ambit-content_public","AutoDidact":"ambit-content_public","Autonomy":"ambit-content_public","Average score.JPG":"ambit-content_public","Awareness of impact.jpg":"ambit-content_public","Bachler (2014) Differential effects of the working alliance in family therapeutic home-based treatment of multi-problem families":"ambit-content_public","Balancing INSIDE and OUTSIDE change work":"ambit-content_public","Barriers to treatment":"ambit-content_public","Basic Structure of the Wiki Manual":"ambit-content_public","Bateman and Fonagy (2009) RCT of MBT versus SCM for BPD":"ambit-content_public","Bateman and Krawitz (2013) BPD: an evidence based guide for generalist mental health professionals":"ambit-content_public","Bateman et al (2020) 8 year follow up of MBT versus SCM for BPD":"ambit-content_public","Bearman et al (2010) Adapting CBT to fit diverse youths and contexts: applying the deployment-focused model...":"ambit-content_public","Beck Depression Inventory (BDI)":"ambit-content_public","Beck Youth Inventories (BYI)":"ambit-content_public","Before you can start a Manualizing Session":"ambit-content_public","Behaviour":"ambit-content_public","Behavioural activation":"ambit-content_public","Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams...":"ambit-content_public","Bevington et al (2012) Adolescent Mentalization-Based Integrative Therapy (AMBIT)":"ambit-content_public","Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)":"ambit-content_public","Bevington, Fuggle, Fonagy (2015) Applying attachment theory to effective practice with hard-to-reach youth: the AMBIT approach":"ambit-content_public","Biology":"ambit-content_public","Blood Borne Virus Screening":"ambit-content_public","Book.PNG":"ambit-content_public","Boundaries":"ambit-content_public","Breaking down tasks into steps":"ambit-content_public","Briefing session for senior managers/commissioners":"ambit-content_public","Broadcasting Intentions":"ambit-content_public","Broersen et al (2020) Young Patients with persistent and complex care needs require an integrated care approach":"ambit-content_public","Building a Community of Practice - Dickon Bevington":"ambit-content_public","CASUS":"ambit-content_public","CB-Principles":"ambit-content_public","CBT techniques":"ambit-content_public","CGAS":"ambit-content_public","CGI-I":"ambit-content_public","CGI-S":"ambit-content_public","CLIENT exercises from AMBIT training":"ambit-content_public","CSJ (2012) Rules of Engagement: Changing the heart of youth justice":"ambit-content_public","CUSS intro pic.png":"ambit-content_public","CUSS steps pic.png":"ambit-content_public","Can longitudinal studies help us understand AMBIT outcomes?":"ambit-content_public","Can we do AMBIT without the Manual?":"ambit-content_public","Cannabis Legal issues":"ambit-content_public","Cannabis Misuse":"ambit-content_public","Capacity to Trust.jpg":"ambit-content_public","Capture.PNG":"ambit-content_public","Captureembed.PNG":"ambit-content_public","Captureerror.PNG":"ambit-content_public","Capturenocookie.PNG":"ambit-content_public","Captureprivacy.PNG":"ambit-content_public","Captureshare.PNG":"ambit-content_public","Careful and concerned CURIOSITY":"ambit-content_public","Case discussion":"ambit-content_public","Cecchin, G. (1987). Hypothesising, circularity and neutrality revisited: an invitation to curiosity":"ambit-content_public","Challenge and Support in Therapeutic Relationships":"ambit-content_public","Challenging techniques":"ambit-content_public","Charlie Sackey":"ambit-content_public","Checking":"ambit-content_public","Child Protection":"ambit-content_public","Child Protection Referral":"ambit-content_public","Child Protection/Safeguarding Services":"ambit-content_public","Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application":"ambit-content_public","Choosing what to measure":"ambit-content_public","Chorpita, Daleiden and Weisz (2005)":"ambit-content_public","Circular interviewing":"ambit-content_public","City Bridge Trust":"ambit-content_public","Client Case Review - Date and Agenda":"ambit-content_public","Client's AMBIT Wheel":"ambit-content_public","ClientWheelDoubleSided":"ambit-content_public","ClientWheelsingle":"ambit-content_public","Clinical Global Impression (CGI)":"ambit-content_public","Clinical Outcomes for the Wellbeing Practitioner Programme for Children, Young People and their Parents/Carers: Update Report (2019.":"ambit-content_public","Coaching":"ambit-content_public","Cognitions":"ambit-content_public","Cognitive Behavioural":"ambit-content_public","Cognitive Behavioural work - CheckLists":"ambit-content_public","Cognitive approaches to SUD-Rx":"ambit-content_public","CognitiveBehavioural for SUD-Rx":"ambit-content_public","Cole, M (2009) Using Wiki technology to support student engagement: Lessons from the trenches":"ambit-content_public","Collaboration as a process and an outcome":"ambit-content_public","Colombo-style Curiosity":"ambit-content_public","Comic Relief":"ambit-content_public","Commenting - Content Moderation":"ambit-content_public","CommentingButton.jpg":"ambit-content_public","Commissioners AMBIT Toolkit":"ambit-content_public","Community":"ambit-content_public","Community of Practice":"ambit-content_public","Community of Practice (extended learning)":"ambit-content_public","Community of Practice core changes widget":"ambit-content_public","Community of Practice recent changes":"ambit-content_public","Community of practice pic.jpg":"ambit-content_public","Comorbidities":"ambit-content_public","Comparing and Sharing functions":"ambit-content_public","Competency use and importance ratings":"ambit-content_public","Concrete Mentalizing difficulties":"ambit-content_public","Conduct problems":"ambit-content_public","Confidentiality":"ambit-content_public","Connecting Conversations":"ambit-content_public","Contemplation":"ambit-content_public","Contingencies":"ambit-content_public","Copyright matters":"ambit-content_public","Core Features of AMBIT":"ambit-content_public","Create Headings, Sub-headings and Bullet points":"ambit-content_public","Create shareable weblinks to specific manual page(s)":"ambit-content_public","Createnewpageicon.jpg":"ambit-content_public","Crisis Contingency Planning":"ambit-content_public","Crisis Pathway AMBIT Online Training":"ambit-content_public","CrisisServices":"ambit-content_public","Criteria for inclusion/exclusion of CONTENT in AMBIT":"ambit-content_public","Cultural Context":"ambit-content_public","CultureOfHospitality":"ambit-content_public","Curiosity.jpg":"ambit-content_public","Current Research and Outcome Evaluations in the AMBIT Community":"ambit-content_public","DOMAINS and LEVELS of dis-integration":"ambit-content_public","Daniel Kahneman - mentalization and the value of doubt":"ambit-content_public","DataSecurity":"ambit-content_public","Daubney et al (2020) - Outcomes of Assertive Community Treatment for Adolescents with Complex Mental Health Problems Who are Difficult to Engage":"ambit-content_public","Deciding what to Manualize":"ambit-content_public","DefaultTiddlers":"ambit-content_public","Definitions & Principles of Motivational Work":"ambit-content_public","Delusions":"ambit-content_public","Depression":"ambit-content_public","Develop Discrepancy":"ambit-content_public","Developing learning organisations":"ambit-content_public","Developing maintenance routines":"ambit-content_public","Developing measurement of engagement in AMBIT":"ambit-content_public","Development of Mentalization":"ambit-content_public","Developmental Considerations":"ambit-content_public","DevelopmentalHistory":"ambit-content_public","Dgrid.PNG":"ambit-content_public","DickonBevington":"ambit-content_public","Differences between MST and AMBIT":"ambit-content_public","Dis-integratedInterventions":"ambit-content_public","Dis-integration":"ambit-content_public","Dis-integration Grid EXERCISE":"ambit-content_public","Dis-integration grid":"ambit-content_public","Dis-integration grid - Local":"ambit-content_public","Dis-integration grid practice":"ambit-content_public","Dis-integration pic.jpg":"ambit-content_public","Dis-integrationGridPicture":"ambit-content_public","Dis-integrative processes in a Family/Systemic context":"ambit-content_public","Dis-integrative processes in a Multi Disciplinary Team":"ambit-content_public","Dis-integrative processes in a Multi-Agency context":"ambit-content_public","Dis-integrative processes in an Individual Clinician":"ambit-content_public","Dis-integrativeProcesses":"ambit-content_public","Disclaimer":"ambit-content_public","Disclaimers, Security and Authorization (Licensing)":"ambit-content_public","Disintegration in networks: respect for local practice and expertise?":"ambit-content_public","Dive Boat - An Analogy":"ambit-content_public","Does AMBIT contribute to reductions in institutional interventions/care?":"ambit-content_public","Domains":"ambit-content_public","Domestic violence":"ambit-content_public","Downloadable Resources from Training":"ambit-content_public","Draft of 'AMBIT implementation questionnaire.pdf' by brionyrandell":"ambit-content_public","Draft of 'Home' by brionyrandell":"ambit-content_public","Draft of 'New Tiddler' by brionyrandell":"ambit-content_public","Draw my mind - Mentalizing Exercise":"ambit-content_public","Drawing the AMBIT Wheel":"ambit-content_public","ENDING PHASE":"ambit-content_public","EXAMPLE of a local training session":"ambit-content_public","EatingDisorders":"ambit-content_public","Edit 1.JPG":"ambit-content_public","Edit 2.JPG":"ambit-content_public","Edit 3.JPG":"ambit-content_public","Edit 4.JPG":"ambit-content_public","Editing - Difficulties with Saving Pages":"ambit-content_public","Editing and Deleting existing pages (tiddlers)":"ambit-content_public","Education employment training":"ambit-content_public","Education-Vocation Intervention phase - Example timetable and Flowchart":"ambit-content_public","Educational-Vocational Engagement Phase Flowchart":"ambit-content_public","Educational-Vocational Training":"ambit-content_public","Educational-VocationalComponents":"ambit-content_public","Educational-VocationalPrinciples":"ambit-content_public","Educational-VocationalStructure":"ambit-content_public","Educational/Vocational centre":"ambit-content_public","Egg and Triangle - Local":"ambit-content_public","Egg and Triangle.pdf":"ambit-content_public","Egg and triangle (marked)":"ambit-content_public","Elevator Pitch":"ambit-content_public","EmergencyProcedures":"ambit-content_public","EmergencyResponse":"ambit-content_public","Enactments":"ambit-content_public","Ending the work - building networks and links":"ambit-content_public","Ending the work - report writing and professional communication":"ambit-content_public","Engagement":"ambit-content_public","Engagement call":"ambit-content_public","Engagement techniques":"ambit-content_public","Engaging a team in Outcomes Measurement - Liz Cracknell and Carol Evans":"ambit-content_public","Epistemic Trust":"ambit-content_public","Epistemic Trust image.jpg":"ambit-content_public","Evaluating AMBIT trainings":"ambit-content_public","Evaluating outcomes":"ambit-content_public","Evaluation of Thinking Together in Donostia/San Sebastian, Gipuzkoa, Spain":"ambit-content_public","Evidence":"ambit-content_public","Example Google Doc Link":"ambit-content_public","Example of Manualizing- Making a Cup of Tea":"ambit-content_public","Example timetable during engagement phase":"ambit-content_public","Examples of Mentalizing Formulations":"ambit-content_public","Experts By Experience":"ambit-content_public","Explicit mentalization":"ambit-content_public","Exploitation and Substance use":"ambit-content_public","Express Empathy":"ambit-content_public","Expressed Emotion":"ambit-content_public","Extended learning":"ambit-content_public","Families and Engagement":"ambit-content_public","Family":"ambit-content_public","Family History":"ambit-content_public","Family Informal Network Members":"ambit-content_public","Family Life Space (Genogram) Techniques":"ambit-content_public","Family System Mentalizing diagram 1":"ambit-content_public","Family System Mentalizing diagram 2":"ambit-content_public","Family-Aims and Principles":"ambit-content_public","Family-Settings and Arrangements":"ambit-content_public","Features of Successful Mentalizing":"ambit-content_public","Features of UNsuccessful Mentalizing":"ambit-content_public","Features of mentalizing: awareness of the impact of emotion":"ambit-content_public","Features of mentalizing: curiosity":"ambit-content_public","Features of mentalizing: knowing that minds are opaque":"ambit-content_public","Features of mentalizing: narrative continuity":"ambit-content_public","Features of mentalizing: perspective taking":"ambit-content_public","Feedback on AMBIT Training":"ambit-content_public","Feedback please!":"ambit-content_public","Feeling":"ambit-content_public","Feeling Spinner":"ambit-content_public","Fillers":"ambit-content_public","Find a falsehood":"ambit-content_public","Fishbowl discussion":"ambit-content_public","Fishtank film clip":"ambit-content_public","Fixsen's Stages of Implementation":"ambit-content_public","Fixsen, et al (2005) Implementation Research: A Synthesis of the Literature":"ambit-content_public","Focussing on Strengths":"ambit-content_public","Follow up interviews for AMBIT teams":"ambit-content_public","Follow-up training for established teams":"ambit-content_public","Fonagy et al (2018) MST versus Management as usual (START trial)":"ambit-content_public","Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom":"ambit-content_public","Formal supervision":"ambit-content_public","Formatting Pages in AFNCCF Manuals":"ambit-content_public","Formulation and Treatment Aims":"ambit-content_public","Four corners - Training Exercise":"ambit-content_public","Fuggle Fairbairn Fonagy PDF.pdf":"ambit-content_public","Fuggle et al (2014) The AMBIT approach to outcome evaluation and manualization: adopting a learning organization approach":"ambit-content_public","Fuggle et al (2021) Improving lives: Not just saying no to substances.":"ambit-content_public","Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach":"ambit-content_public","Fuggle, Talbot, Campbell, Fonagy, Bevington (2023) Adaptive Mentalization-Based Integrative Treatment (AMBIT) for People with Multiple needs: Applications in Practice. Book, OUP":"ambit-content_public","Further reading and resources on Working with your Client":"ambit-content_public","Further reading and resources on working with your networks":"ambit-content_public","Further reading on Learning at Work":"ambit-content_public","Further reading on mentalizing":"ambit-content_public","GHQ-12":"ambit-content_public","GHQ12.pdf":"ambit-content_public","GUM":"ambit-content_public","Gemma McKenzie":"ambit-content_public","General Features of Unsuccessful Mentalizing":"ambit-content_public","General Systemic Techniques":"ambit-content_public","General features of a \"Mentalizing Stance\"":"ambit-content_public","Generalize (and Consider Change)":"ambit-content_public","Genogram picture":"ambit-content_public","Gergely, G (2004) The social construction of the subjective self":"ambit-content_public","Getting started with CBT":"ambit-content_public","Gilvarry et al (2012) Practice standards for young people with substance misuse problems":"ambit-content_public","Giving Advice":"ambit-content_public","Global Assessment of Function (GAF)":"ambit-content_public","Glossary":"ambit-content_public","Goals-based outcome measures":"ambit-content_public","Governance":"ambit-content_public","Graded Exposure":"ambit-content_public","GreetingModal":"ambit-content_public","Grid Pic.jpg":"ambit-content_public","Griffiths et al (2016) Evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 CAMHS":"ambit-content_public","Group Work":"ambit-content_public","GroupworkTabs--1450484460":"ambit-content_public","Guidance for Teams Considering Applying for Training":"ambit-content_public","Guidance for teams on selecting people for local facilitator training":"ambit-content_public","Guidelines on how to edit this manual":"ambit-howto_public","H-CAMA":"ambit-content_public","HEE health education england logo.png":"ambit-content_public","Hallucinations":"ambit-content_public","Handovers at Willow Vue":"ambit-willowvue_public","Hard to reach":"ambit-content_public","Help seeking in teams":"ambit-content_public","Helping by Edgar Schein":"ambit-content_public","Hidden, private or implicit theory":"ambit-content_public","Highlighting and reinforcing Positive Mentalizing":"ambit-content_public","HoNOSCA":"ambit-content_public","Holding the Balance":"ambit-content_public","Home":"ambit-content_public","Homework":"ambit-content_public","How do we as trainers keep ourselves on task?":"ambit-content_public","How do we help each other in this team?":"ambit-content_public","How do we measure whether our team is DOING this?":"ambit-content_public","How does Mentalizing relate to children with Autism?":"ambit-content_public","How does the AMBIT approach fit with our Service Priorities":"ambit-content_public","How long should we run trainings for?":"ambit-content_public","How much time have I spent with this client?":"ambit-content_public","How teams support each other to mentalize - Unconference Conversation, 2016":"ambit-content_public","How to ADD into what is ALREADY THERE in your manual":"ambit-content_public","How to Change the Manual Title/Icon":"ambit-content_public","How to add HyperLinks (external web links)":"ambit-content_public","How to add a PDF link":"ambit-content_public","How to add a document or PDF":"ambit-content_public","How to add a picture":"ambit-content_public","How to centre a title, phrase or image":"ambit-content_public","How to draw up a Care Plan":"ambit-content_public","How to edit - Videos":"ambit-howto_public","How to edit your team's manual":"ambit-content_public","How to embed a video":"ambit-content_public","How to get the best out of Web-based seminars":"ambit-content_public","How to run a team manualizing session":"ambit-content_public","How to speak to a DOCTOR":"ambit-content_public","How to speak to a NURSE":"ambit-content_public","How to speak to a SOCIAL WORKER":"ambit-content_public","How to speak to a...":"ambit-content_public","Human Centred Design":"ambit-content_public","Hypothesizing":"ambit-content_public","I cannot relinquish my statutory responsibilities to do this AMBIT stuff...":"ambit-content_public","I haven't got time to do this!":"ambit-content_public","I'm stuck: what next?":"ambit-content_public","IMG-20171023-WA0000.jpg":"ambit-content_public","IMG-20181129-WA0000.jpg":"ambit-content_public","IMG_20170802_151123.jpg":"ambit-willowvue_public","IMG_20170802_151345.jpg":"ambit-willowvue_public","IMP":"ambit-content_public","INITIAL PHASE":"ambit-content_public","INTERVENTION PHASE":"ambit-content_public","IPCimage3.PNG":"ambit-content_public","IPPA-R (The Inventory of Parent and Peer Attachment—Revised)":"ambit-content_public","IPT":"ambit-content_public","IPT Ending Session 6 (30 mins)":"ambit-content_public","IPT Session 1 (45 mins)":"ambit-content_public","IPT Session 2 (30 mins)":"ambit-content_public","IPT Session by Session Guide":"ambit-content_public","IPT Sessions 3-5 (Middle Phase - 30 mins)":"ambit-content_public","IPT Worksheet 1.pdf":"ambit-content_public","IPT Worksheet 15.pdf":"ambit-content_public","IPT Worksheet 2.pdf":"ambit-content_public","IPT Worksheet 3.pdf":"ambit-content_public","IPT Worksheet 4.pdf":"ambit-content_public","IPT Worksheet 5.pdf":"ambit-content_public","IPT Worksheet 6.pdf":"ambit-content_public","IPT Worksheet 7.pdf":"ambit-content_public","IPT Worksheet 8.pdf":"ambit-content_public","IS.JPG":"ambit-content_public","If I am the KeyWorker, do I hold sole responsibility for everything?":"ambit-content_public","Implementation Plan":"ambit-willowvue_public","Implementation Science":"ambit-content_public","Implementation Team":"ambit-content_public","Implementation plan template .docx":"ambit-content_public","Implementing models of practice well":"ambit-content_public","Implementing social-ecological change":"ambit-content_public","Implicit Core Beliefs":"ambit-content_public","Implicit mentalization":"ambit-content_public","Implicit psychoanalytic model":"ambit-content_public","In my beginning is my end":"ambit-content_public","Increasing 'value' in services":"ambit-content_public","Increasing 'value': the work of Michael Porter":"ambit-content_public","Increasing service value: the work of John Seddon":"ambit-content_public","Individual Differences and Disagreements":"ambit-content_public","Individual differences and AMBIT training":"ambit-content_public","Inducting new team members":"ambit-content_public","Initial Engagement - notes for trainers":"ambit-content_public","Initial introductions at a Training event":"ambit-content_public","Inside Out":"ambit-content_public","Insight and Engagement":"ambit-content_public","Integrated care systems":"ambit-content_public","Integrative":"ambit-content_public","Integrative Multimodal Practice":"ambit-content_public","IntegrativeContext":"ambit-content_public","Intention Broadcasting. Proceedings of I-KNOW ’09 and I-SEMANTICS ’09 - Von Kaufman, Richard (2009)":"ambit-content_public","Intentional stance":"ambit-content_public","Interagency collaboration Activities Scale (ICAS)":"ambit-content_public","Internal Working Model":"ambit-content_public","International Local Facilitator Training (LFT)":"ambit-content_public","Interpersonal Therapy (IPT)":"ambit-content_public","Interpreting AIM scores: the CASUS study":"ambit-content_public","Interprofessional Boundaries":"ambit-content_public","Interprofessional Collaboration":"ambit-content_public","Intervention timeline":"ambit-content_public","Interventions (by target group)":"ambit-content_public","Introducing Family Work":"ambit-content_public","Introducing Mentalization based work - addressing resistance":"ambit-content_public","Introducing the AIM measure in your service":"ambit-content_public","Introduction":"ambit-content_public","Introductions part 1":"ambit-content_public","Introductions part 2":"ambit-content_public","Involving young people in designing outcomes":"ambit-content_public","Is 'Thinking Together' a replacement or a change to Clinical Supervision?":"ambit-content_public","Is AMBIT consistent with 'Signs of Safety'?":"ambit-content_public","Is AMBIT consistent with trauma informed care?":"ambit-content_public","Is AMBIT evidence based?":"ambit-content_public","Is Mentalizing just Empathy?":"ambit-content_public","Is Mentalizing just Reflective thinking?":"ambit-content_public","Is Mentalizing just about working in the transference?":"ambit-content_public","Is my client showing help-seeking behaviours towards me/the team?":"ambit-content_public","Is there any difference between Mentalizing and Mindfulness?":"ambit-content_public","Is this relevant to me as a NON-specialist worker (not a therapist)?":"ambit-content_public","Isn't mentalizing just being supportive?":"ambit-content_public","Issues that can arise when training your own team":"ambit-content_public","Iterative":"ambit-content_public","JF.PNG":"ambit-content_public","JW.PNG":"ambit-content_public","James Fairbairn":"ambit-content_public","James Wentworth Stanley Memorial Fund":"ambit-content_public","James Wheeler":"ambit-content_public","Jason Shaw (2013) Developing a Hypertext Educational Environment using TiddlySpace":"ambit-content_public","Jensen, Bo & Vilmar (2021). What is behind the closed door? A case illustration of working with social isolation in adolescents":"ambit-content_public","Jeremy Ruston":"ambit-content_public","John Lincoln":"ambit-content_public","Johnson, Baron-Cohen et al (2005) emergence of the social brain network":"ambit-content_public","Just the facts":"ambit-content_public","Kahneman's dual process theory and the impact of affect":"ambit-content_public","Kaminski J, Pitsch A, Tomasello M (2012) Dogs steal in the dark":"ambit-content_public","Keeping Your Bearings":"ambit-content_public","Keeping secrets/different levels of disclosure within the family":"ambit-content_public","Key Problems":"ambit-content_public","Key Worker":"ambit-content_public","KeyProblemDefinitions":"ambit-content_public","KeyWorker":"ambit-content_public","Keyworker well-connected to wider team":"ambit-content_public","Kolb's Experiential Learning Model":"ambit-content_public","Kolko and Perrin (2014) The Integration of Behavioral Health Interventions in Children’s Health Care: Services, Science, and Suggestions":"ambit-content_public","Krueger and Glass (2013) Integrative Psychotherapy for Children and Adolescents: A practice-oriented literature review":"ambit-content_public","Kyratsis Y, Ahmad R, Holmes A (2012) Technology adoption and implementation in organisations - BMJ":"ambit-content_public","LEARNING at work":"ambit-content_public","LEARNING exercises from AMBIT training":"ambit-content_public","Lack of insight":"ambit-content_public","Landing lights.png":"ambit-content_public","Laura Talbot":"ambit-content_public","Lave and Wenger (1991). Situated Learning: Legitimate Peripheral Participation":"ambit-content_public","Learning - How do you engage young people? (Unconference conversation 2016)":"ambit-content_public","Learning - Making Manuals easier to use (Unconference 2016)":"ambit-content_public","Learning - Outcome measures (Unconference 2016)":"ambit-content_public","Learning - Working with young people who offend (Unconference conversation 2016)":"ambit-content_public","Learning Organisations (further reading)":"ambit-content_public","Learning about AMBIT":"ambit-content_public","Learning about Addressing Dis-integration":"ambit-content_public","Learning about Supervisory Structures":"ambit-content_public","Learning about Team Learning - a discussion exercise":"ambit-content_public","Learning about mentalizing":"ambit-content_public","Learning at Work Tools":"ambit-content_public","Learning from the ASEQ: how do teams rate themselves before training":"ambit-content_public","Learning survey":"ambit-content_public","Learning survey responses":"ambit-content_public","Learning through outcome measures":"ambit-content_public","Learning- The mentalizing stance (Unconference conversation 2016)":"ambit-content_public","Learning- Adolescent states of mind (Unconference conversation 2016)":"ambit-content_public","Learning- Barriers to help-seeking in teams - Unconference Conversation, 2016":"ambit-content_public","Learning- Does AMBIT work? (Unconference conversation 2016)":"ambit-content_public","Learning- Fitting AMBIT expertise to the expertise of others (Unconference 2016)":"ambit-content_public","Learning- What is mentalizing, really? (Unconference conversation 2016)":"ambit-content_public","LearningContents":"ambit-content_public","Lecture and discussion on Evidence":"ambit-content_public","Level of intensity":"ambit-content_public","Licensed":"ambit-content_public","Life practice":"ambit-content_public","Line-ups - exploring individual differences":"ambit-content_public","Links":"ambit-content_public","Littlechild and Smith (2013): A Handbook for interprofessional practice in the human services":"ambit-content_public","LivingSkills":"ambit-content_public","Liz Cracknell":"ambit-content_public","Liz's buttons test":"ambit-content_public","Lizpicture.jpg":"ambit-content_public","Local Facilitator Training (LFT)- training model":"ambit-content_public","Local Facilitator Training: potential barriers to achieving training objectives":"ambit-content_public","Local Facilitator implementation plan template":"ambit-content_public","Local Manualizing Tasklist":"ambit-content_public","Local Protocols":"ambit-content_public","Local Session 01: What is AMBIT?":"ambit-content_public","Local Session 02: What is AMBIT training for?":"ambit-content_public","Local Session 03: Mentalization":"ambit-content_public","Local Session 04: Working with your Team":"ambit-content_public","Local Session 05: Working with your Networks":"ambit-content_public","Local Session 06: Working with your Client pt. 1 (Mentalizing stance)":"ambit-content_public","Local Session 07: Working with your Client pt.2 (Excluded/non-standard help-seeking)":"ambit-content_public","Local Session 08: Review (1) and Auditing Team Practices":"ambit-content_public","Local Session 09: Working with your Client pt.3 (Outcomes)":"ambit-content_public","Local Session 10: Review (2) and Top-up plans":"ambit-content_public","Local Session 11: Making a real difference - Implementation Science":"ambit-content_public","Local Training Sessions: some core ideas and structure":"ambit-content_public","Log in":"ambit-content_public","Logic Models":"ambit-content_public","Logic model for AMBIT services":"ambit-content_public","Logic model for AMBIT training (as an intervention)":"ambit-content_public","Logic model.JPG":"ambit-content_public","Logic models training exercise":"ambit-content_public","LoneClimber.jpg":"ambit-content_public","MA.ICON.PNG":"ambit-content_public","MAINTENANCE PHASE":"ambit-content_public","MBT - mentalization based treatment":"ambit-content_public","MBT-A":"ambit-content_public","MBT-C":"ambit-content_public","MBT-F":"ambit-content_public","MP3's are like thoughts":"ambit-content_public","MS.JPG":"ambit-content_public","Maintaining Mind-mindedness":"ambit-content_public","Maintaining factors for problems":"ambit-content_public","Maintenance":"ambit-content_public","Maintenance and the Recovery Model":"ambit-content_public","Making plans for change":"ambit-content_public","Making zoom recordings":"ambit-content_public","MalalaQuote":"ambit-content_public","Manage CLIENT RELATIONSHIP":"ambit-content_public","Manage CLINICAL PROBLEM":"ambit-content_public","Manage Violence":"ambit-content_public","Managing Differences of Opinion":"ambit-content_public","Managing NETWORK PROBLEMS":"ambit-content_public","Managing Risk":"ambit-content_public","Manualization":"ambit-content_public","Manualization Boundaries":"ambit-content_public","Manualizing a live issue - Garry Richardson and Heather Tovey":"ambit-content_public","Manualizing exercise":"ambit-content_public","Manualizing the AIM Suggested Interventions -18.11.21 - AMBIT team AFC":"ambit-content_public","Mapping social-ecological needs and goals":"ambit-content_public","Mapping social-ecological resources":"ambit-content_public","Marianne McGowan":"ambit-content_public","Mark Dangerfield":"ambit-content_public","MarkLocalEdits.jpg":"ambit-content_public","Marked mirroring":"ambit-content_public","Marking the Task":"ambit-content_public","Mary Target":"ambit-content_public","Measuring progress against objectives":"ambit-content_public","Measuring recovery and reliable recovery":"ambit-content_public","Measuring reliable change":"ambit-content_public","Measuring the Impact of AMBIT Training":"ambit-content_public","Ment_Table_Stance_pic":"ambit-content_public","Mentalisation based therapy (MBT) - a video example and theory":"ambit-content_public","Mentalization":"ambit-content_public","Mentalization Based Work":"ambit-content_public","MentalizationBasedTabs-211931686":"ambit-content_public","MentalizationBasedTabs-461546670":"ambit-content_public","Mentalize":"ambit-content_public","Mentalize that!":"ambit-content_public","Mentalize the Moment":"ambit-content_public","Mentalize us, your trainers...":"ambit-content_public","Mentalizing":"ambit-content_public","Mentalizing - common definitions and quotes about it":"ambit-content_public","Mentalizing Levels":"ambit-content_public","Mentalizing Loop":"ambit-content_public","Mentalizing Stance in Family Work":"ambit-content_public","Mentalizing Therapy Techniques":"ambit-content_public","Mentalizing and team learning":"ambit-content_public","Mentalizing in Psychotherapy: a guide for practitioners":"ambit-content_public","Mentalizing service barriers":"ambit-content_public","Mentalizing stance- manualizing exercise":"ambit-content_public","Mentalizing the Moment (in Thinking Together)":"ambit-content_public","Mentalizing the Moment (in the Mentalizing Loop)":"ambit-content_public","Mentalizing: a summary":"ambit-content_public","Mentalizing: what it looks like":"ambit-content_public","MentalizingLoop.jpg":"ambit-content_public","MetaTeam":"ambit-content_public","Mind-Scanning":"ambit-content_public","Mini-PREACHY":"ambit-content_public","Module 1: Introductions and Mentalization":"ambit-content_public","Module 3: Working with your Team":"ambit-content_public","Module 4: Working with your networks":"ambit-content_public","Module 5: Working with your client":"ambit-content_public","Module 7: Learning at Work 2":"ambit-content_public","Module 8: Review and implementation planning":"ambit-content_public","Monitoring mental health":"ambit-content_public","Monthly Webinars.jpg":"ambit-content_public","More Actions pic.jpg":"ambit-content_public","More information on the AIM cards":"ambit-content_public","Motivational Core Aspects":"ambit-content_public","Motivational Work":"ambit-content_public","Motivational Work - Affirmations":"ambit-content_public","Motivational Work - competency checklist":"ambit-content_public","Motivational Work 1":"ambit-content_public","MtM.PNG":"ambit-content_public","Multi-Disciplinary Team":"ambit-content_public","Multi-Domain Assessment":"ambit-content_public","MultiFamilyTabs--1718654290":"ambit-content_public","MultiFamilyTabs--381715938":"ambit-content_public","MultiFamilyWork":"ambit-content_public","Multimodal":"ambit-content_public","Multiple interacting aetiologies":"ambit-content_public","Mz Sharp-Bevington.jpg":"ambit-content_public","Mz.PNG":"ambit-content_public","NET-Aim-Q":"ambit-content_public","NET-Stat-Q":"ambit-content_public","NETWORK exercises from AMBIT training":"ambit-content_public","NICE - Depression":"ambit-content_public","NICE - Sexual Health Guidelines for Youth":"ambit-content_public","NICE ADHD Guidelines":"ambit-content_public","NICE Guideline - Schizophrenia (over 18yrs)":"ambit-content_public","NICE Guidelines":"ambit-content_public","NICE Guidelines for PTSD":"ambit-content_public","NICE OCD guidelines":"ambit-content_public","Narrative Continuity.jpg":"ambit-content_public","Narrative History":"ambit-content_public","National Evaluation of the Troubled Families Programme 2015-2020: Findings. (2019) Ministry of Housing, Communities and Local Government":"ambit-content_public","Navigating the manual (finding what you need)":"ambit-content_public","NetworksContents":"ambit-content_public","Neurodevelopment and adolescence":"ambit-content_public","New referrals":"ambit-content_public","NewHere.png":"ambit-content_public","Newsletter 11 May 2020":"ambit-content_public","Newsletter 16 July 2020":"ambit-content_public","Newsletter 18 June 2020":"ambit-content_public","Newsletter 21 May 2020":"ambit-content_public","Newsletter 22 May 2020":"ambit-content_public","Newsletter 27 April 2020":"ambit-content_public","Newsletter 3 July 2020":"ambit-content_public","Newsletter 4 June 2020":"ambit-content_public","Newsletter August 2020":"ambit-content_public","Newsletter December 2020":"ambit-content_public","Newsletter January 2021":"ambit-content_public","Newsletter January/ February 2021":"ambit-content_public","Newsletter November 2020":"ambit-content_public","Newsletter October 2020":"ambit-content_public","Newsletter September 2020":"ambit-content_public","Non MZ.JPG":"ambit-content_public","Non-contingent":"ambit-content_public","Non-mentalizing, positioning and network problems":"ambit-content_public","Non-mentalizing: a summary":"ambit-content_public","Non-mentalizing: certainty":"ambit-content_public","Non-mentalizing: quick fix":"ambit-content_public","Non-mentalizing: waffle":"ambit-content_public","None of the above!":"ambit-content_public","Norberg (2021) Open - how collaboration and curiosity shaped mankind":"ambit-content_public","Normalising":"ambit-content_public","Notice and Name":"ambit-content_public","OUR LOCAL Resources and Practice":"ambit-content_public","OUR LOCAL Teamwork and Governance":"ambit-content_public","OUR Team":"ambit-willowvue_public","Obsessional compulsive disorder":"ambit-content_public","Offering unasked-for help to a team-mate (Graded Assertiveness)":"ambit-content_public","Online AIM Cards: how to set up a room to use with your client":"ambit-content_public","Opacity of other minds.jpg":"ambit-content_public","Opaqueglass.jpg":"ambit-content_public","Open Questions":"ambit-content_public","Open book pic (2).jpg":"ambit-content_public","OpenPagesPic.jpg":"ambit-content_public","OpenSource":"ambit-content_public","Ostensive communication":"ambit-content_public","Other Symptoms of Psychosis and Engagement":"ambit-content_public","Other key aspects of AMBIT in a little more detail":"ambit-content_public","Other team's AMBIT manuals":"ambit-content_public","Our Resources":"ambit-content_public","Our team and CLIENT work":"ambit-content_public","Our team and LEARNING":"ambit-content_public","Our team and NETWORKS":"ambit-content_public","Our team' strengths in CLIENT work":"ambit-content_public","Our team's challenges in CLIENT work":"ambit-content_public","Our team's challenges in LEARNING":"ambit-content_public","Our team's challenges in NETWORKING":"ambit-content_public","Our team's challenges in TEAMWORKING":"ambit-content_public","Our team's core expertise":"ambit-content_public","Our team's needs for effective CLIENT work":"ambit-content_public","Our team's needs for effective LEARNING":"ambit-content_public","Our team's needs for effective NETWORKING":"ambit-content_public","Our team's needs for effective TEAMWORKING":"ambit-content_public","Our team's strengths in LEARNING":"ambit-content_public","Our team's strengths in NETWORKING":"ambit-content_public","Our team's strengths in TEAMWORKING":"ambit-content_public","Outcome measures (T1, initial)":"ambit-content_public","Outcome measures (T2, 3 months)":"ambit-content_public","Outcome measures (T3, treatment close)":"ambit-content_public","Outcomes":"ambit-content_public","Outcomes for clients who drop out of treatment":"ambit-content_public","Outcomes for clients with multi-agency needs":"ambit-content_public","Outcomes for untreated clients":"ambit-content_public","Outcomes from the Family Intervention Programme":"ambit-content_public","Overview: LEARNING at work":"ambit-content_public","Overview: Working with your CLIENT":"ambit-content_public","Overview: Working with your NETWORKS":"ambit-content_public","Overview: Working with your TEAM":"ambit-content_public","POD":"ambit-content_public","PREACHY":"ambit-content_public","Paedakoop Team, Schlins Feldkirch Austria":"ambit-content_public","Panic Attacks":"ambit-content_public","Paranoid":"ambit-content_public","Passed Outwards Discussion - part 1":"ambit-content_public","Passed Outwards Discussion - part 2":"ambit-content_public","Passed-outwards Discussion":"ambit-content_public","Past psychiatric history":"ambit-content_public","PastMedicalHistory":"ambit-content_public","Patient-Worker Boundaries":"ambit-content_public","Pause and Review":"ambit-content_public","Perspective-taking.jpg":"ambit-content_public","Peter Fuggle":"ambit-content_public","Pharmacological":"ambit-content_public","Phases of AMBIT work":"ambit-content_public","Physical Health matters":"ambit-content_public","Pic_WellConnected":"ambit-content_public","Picture1.jpg":"ambit-content_public","Picture1.png":"ambit-content_public","Picture2.png":"ambit-content_public","Planning a training event in your team":"ambit-content_public","Planning survey":"ambit-content_public","Planning survey results":"ambit-content_public","Positioning Theory":"ambit-content_public","Positive and Negative Syndrome Scale (PANSS)":"ambit-content_public","Post Traumatic Stress":"ambit-content_public","Post-training outcome goals":"ambit-content_public","Practical examples of sustaining the AMBIT approach - Jones, Jones and Schofield":"ambit-content_public","Practice":"ambit-content_public","Practices: LEARNING at work":"ambit-content_public","Practices: Working with your CLIENT":"ambit-content_public","Practices: Working with your NETWORKS":"ambit-content_public","Practices: Working with your TEAM":"ambit-content_public","Pre-contemplation":"ambit-content_public","Pre-mentalistic stances":"ambit-content_public","Preconditions for Team Learning":"ambit-content_public","Presenting Problems":"ambit-content_public","Pretend mode":"ambit-content_public","Pro-gram picture":"ambit-content_public","Problem solving":"ambit-content_public","Problem-solving checklist":"ambit-content_public","Problems in teams":"ambit-content_public","Processing a New Referral":"ambit-content_public","ProfessionalNetworkMembers":"ambit-content_public","Progressive Muscle Relaxation":"ambit-content_public","Pros and Cons (Decisional Balance) exercise":"ambit-content_public","Pseudomentalization difficulties":"ambit-content_public","Psychiatrist":"ambit-content_public","Psychic equivalence":"ambit-content_public","PsychoEducation":"ambit-content_public","Psychodynamic":"ambit-content_public","Psychodynamic theory":"ambit-content_public","Psychometrics and Psychometric Tests":"ambit-content_public","Psychosis":"ambit-content_public","Published/Current Outcome Studies":"ambit-content_public","Qualitative feedback from AMBIT training":"ambit-content_public","Qualitative feedback on usefulness of AMBIT":"ambit-content_public","QuickWins":"ambit-content_public","RFQ-YV (Reflective Functioning Questionnaire-Youth Version)":"ambit-content_public","RS.PNG":"ambit-content_public","Randomised Control Trial":"ambit-content_public","Rating Scales":"ambit-content_public","Re-breathing":"ambit-content_public","Re-traumatization":"ambit-content_public","Rebecca Smith":"ambit-content_public","Recent Reflections on Facilitating the Sculpt":"ambit-content_public","RecentChangesPic.jpg":"ambit-content_public","Reciprocity":"ambit-content_public","Referral Criteria":"ambit-content_public","Reflecting comments":"ambit-content_public","Reflections on Thinking Together":"ambit-content_public","Reflections on the TTT Training 2016":"ambit-content_public","Reflective Quorum":"ambit-content_public","Reframing":"ambit-content_public","Reinforcement":"ambit-content_public","Relapse":"ambit-content_public","Relapse prevention":"ambit-content_public","RelatToHelpDiagram":"ambit-content_public","Relationship to help":"ambit-content_public","Research collaboration with Roskilde team in Denmark - the MAP study":"ambit-content_public","Respect for Evidence":"ambit-content_public","Respect local practice and expertise":"ambit-content_public","RespectLocalPracticeImage":"ambit-content_public","Restoring family capacity":"ambit-content_public","Return to Purpose":"ambit-content_public","Reviewing change":"ambit-content_public","Revisiting AMBIT":"ambit-content_public","Rich internal life - pic":"ambit-content_public","Ripples in a Pond":"ambit-content_public","Ripples_picture":"ambit-content_public","Risk Assessment - paper form":"ambit-content_public","Risk Management- Challenge and Support":"ambit-content_public","Risk of suicide":"ambit-content_public","Risk support - key aspects of practice":"ambit-content_public","RiskAssessment":"ambit-content_public","Rituals and Disciplines":"ambit-content_public","Role of the Chair":"ambit-content_public","Role of the Scribe":"ambit-content_public","Role of the Team Learning Support Worker":"ambit-content_public","Roles and Responsibilities in an AMBIT team":"ambit-content_public","Roles in the AMBIT Community of Practice":"ambit-content_public","Roll with Resistance":"ambit-content_public","Rossouw, Fonagy (2012) Mentalization-based treatment for self-harm in adolescents: a randomized controlled trial":"ambit-content_public","Royal College of Psychiatrists - Standards for Crisis/Outreach services":"ambit-content_public","Rx":"ambit-content_public","SELF REPRESENTATION":"ambit-content_public","SMART goals":"ambit-content_public","SNAPSHOT.PNG":"ambit-content_public","STIs":"ambit-content_public","SUD":"ambit-content_public","SUD-Rx":"ambit-content_public","SUD-Rx - Who should be present at sessions?":"ambit-content_public","SUD-Rx Session 1 - 2":"ambit-content_public","SUD-Rx Session 3":"ambit-content_public","SUD-Rx Session 4":"ambit-content_public","SUD-Rx Session 5":"ambit-content_public","SUD-Rx Session 6 - FINAL":"ambit-content_public","SUD-Rx Sessions - CheckLists":"ambit-content_public","SUD-Rx Techniques":"ambit-content_public","SUD-Rx principles":"ambit-content_public","SUSTAIN best practice":"ambit-content_public","Safeguarding Children and Young People from Sexual Exploitation":"ambit-content_public","Save tick.jpg":"ambit-content_public","SaveCloudicon.jpg":"ambit-content_public","Scaffolding existing relationships":"ambit-content_public","Schein's seven principles of helping":"ambit-content_public","Score 15 - Family functioning":"ambit-content_public","Scoring AIM data":"ambit-content_public","Screening Tool for Sexual Exploitation by Brook":"ambit-content_public","Screening for biological illness":"ambit-content_public","Screenshot_20180323-002957-01.jpeg":"ambit-content_public","Sculpting a network":"ambit-content_public","Sculpting the AMBIT wheel: a training exercise":"ambit-content_public","Search Bar":"ambit-content_public","Secure Base":"ambit-content_public","Seddon, J. (2008) Systems Thinking in the Public Sector":"ambit-content_public","Self Injurious Behaviour":"ambit-content_public","Self-directed learning":"ambit-content_public","Self-efficacy":"ambit-content_public","Senge (2006, 2nd edition) The Fifth Discipline: the Art and Practice of the Learning Organisation. Random House Business Books":"ambit-content_public","Senge: Discipline 1 - Systems Thinking":"ambit-content_public","Senge: Discipline 2 - Personal Mastery":"ambit-content_public","Senge: Discipline 3 - Mental Models":"ambit-content_public","Senge: Discipline 4 - Shared Vision":"ambit-content_public","Senge: Discipline 5 - Team Learning":"ambit-content_public","Senge: eight strategies to develop a learning organisation":"ambit-content_public","Senge: the characteristics of 'Learning Disabled' Organisations":"ambit-content_public","Sensitive attunement":"ambit-content_public","Separation":"ambit-content_public","Service Delivery":"ambit-content_public","Service User Feedback":"ambit-content_public","Session Feedback Form.pdf":"ambit-content_public","Session Plan for three hour training session on Mentalization":"ambit-content_public","Session Rating Scale":"ambit-content_public","SessionPlans":"ambit-content_public","Setting up Mentalization based work":"ambit-content_public","Setting up a first meeting":"ambit-content_public","Setting up your manuals account.pdf":"ambit-content_public","Settings for AMBIT implementations":"ambit-content_public","Sharp et al (2006) Imagining your child's mind":"ambit-content_public","Sharp, C. and Bevington, D. \"Mentalizing in Psychotherapy: a guide for practitioners\" Guilford, 2022":"ambit-content_public","SideBar":"ambit-content_public","Sidebar.png":"ambit-content_public","Signs of Safety Child Protection Practice Framework (2011)":"ambit-content_public","Signs of safety evaluation (2021)":"ambit-content_public","Simmering Down":"ambit-content_public","Siri (2012) Mentalization-based therapy for adolescents":"ambit-content_public","SiteIcon":"ambit-content_public","SiteMap.PNG":"ambit-content_public","SiteSubtitle":"ambit-willowvue_public","SiteTitle":"ambit-willowvue_public","Slice and Dice Method":"ambit-content_public","Slide1.JPG":"ambit-content_public","Slide2.JPG":"ambit-content_public","Slow engagement":"ambit-content_public","Social Capital":"ambit-content_public","Social Ecology":"ambit-content_public","Social-Ecological Work":"ambit-content_public","SocialCognitiveTheory":"ambit-content_public","SocialEcologyPicture":"ambit-content_public","Sort Cards":"ambit-content_public","Specific diagnoses and their corresponding mentalizing failures":"ambit-content_public","Specific interventions":"ambit-content_public","Sponsors":"ambit-content_public","Spot the non-mentalizing":"ambit-content_public","Spot the non-mentalizing 2":"ambit-content_public","Spot the non-mentalizing 3":"ambit-content_public","Spot the non-mentalizing 4":"ambit-content_public","Spot the non-mentalizing 5":"ambit-content_public","Stages of Change":"ambit-content_public","Stages of Change and Mz pic":"ambit-content_public","StagesPicture":"ambit-content_public","Stance Features: LEARNING at work":"ambit-content_public","Stance Features: Working with your CLIENT":"ambit-content_public","Stance Features: Working with your NETWORKS":"ambit-content_public","Stance Features: Working with your TEAM":"ambit-content_public","Stance-Domains.JPG":"ambit-content_public","Stance-RespectEvidence.JPG":"ambit-content_public","Stance-Scaffolding.JPG":"ambit-content_public","Starting a NEW CASE - CheckLists":"ambit-content_public","Starting an AMBIT service":"ambit-content_public","Stating the Case":"ambit-content_public","StatusUpdate.jpg":"ambit-content_public","Stethoscope Games":"ambit-content_public","Stigma":"ambit-content_public","Stigma and Engagement":"ambit-content_public","Straussner and Fewell (2011) Children of Substance-Abusing Parents: Dynamics and Treatment":"ambit-content_public","Strengths and Difficulties Questionnaire (SDQ)":"ambit-content_public","Strengths in RELATIONSHIPS":"ambit-content_public","StrengthsResiliencies":"ambit-content_public","Studies relevant to AMBIT":"ambit-content_public","Sub-pages":"ambit-content_public","Sub-topic":"ambit-content_public","SubsistenceSupport":"ambit-content_public","Substance Use History":"ambit-content_public","Substance use":"ambit-content_public","Substance use disorder - treatment":"ambit-content_public","SubstanceUseDisorder":"ambit-content_public","Suggested Team Training Sessions":"ambit-content_public","Suggested structure for an (internal) AMBIT Supervision session":"ambit-content_public","Suicide Attempt":"ambit-content_public","Suicide Warnings":"ambit-content_public","Summarising":"ambit-content_public","SupervisoryStructures":"ambit-content_public","Support for the AMBIT Community of Practice":"ambit-content_public","Sustaining AMBIT practice after training: lessons from a group of front line teams":"ambit-content_public","Sustaining an AMBIT approach in an acute adolescent in-patient setting - Whittick, Morrell, Fairbairn, Thulbourn and Millard":"ambit-content_public","Sutcliffe et al, 2004 - Communication failures: an insidious contributor to medical mishaps":"ambit-content_public","Syed, 2016 Black Box Thinking":"ambit-content_public","SystemsTheory":"ambit-content_public","TEAM exercises from AMBIT training":"ambit-content_public","THRIVE-Framework.jpg":"ambit-content_public","THRIVE: Advice and support":"ambit-content_public","THRIVE: Help":"ambit-content_public","THRIVE: More help":"ambit-content_public","THRIVE: Risk support":"ambit-content_public","TV phone-in or Documentary games":"ambit-content_public","Tags":"ambit-content_public","Take Home Messages":"ambit-content_public","Take a deep dive":"ambit-content_public","Taking Aim":"ambit-content_public","Taking Responsibility for integration":"ambit-content_public","Taking a break":"ambit-content_public","Talbot, Fuggle, Foyston and Lawson (2020) - Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years":"ambit-content_public","Team Meetings":"ambit-content_public","Team Thinking Together exercise":"ambit-content_public","Team around the Worker":"ambit-content_public","Team around the Worker - pic":"ambit-content_public","Team meetings survey":"ambit-content_public","Team meetings survey results":"ambit-content_public","Team training session: deciding on the intervention":"ambit-content_public","Team training session: what interventions do we do?":"ambit-content_public","TeamLearning.png":"ambit-content_public","Technical aspects of how to set up wiki manuals":"ambit-content_public","Teleological thinking":"ambit-content_public","Terminating non-mentalizing interactions":"ambit-content_public","Test page for Willow Vue site":"ambit-willowvue_public","The 'What's it like to be...' exercise":"ambit-content_public","The AIM Cards - a Guide for Practitioners (1).pdf":"ambit-content_public","The AIM Questionnaire: What it is and how to use it":"ambit-content_public","The AMASS Team":"ambit-content_public","The AMBIT Lead - role and responsibilities":"ambit-content_public","The AMBIT Pro-Gram":"ambit-content_public","The AMBIT Pro-Gram: an example":"ambit-content_public","The AMBIT Study Group":"ambit-content_public","The Coping With Stress Course - Gregory Clarke":"ambit-content_public","The Development Design Administration and Psychometric Properties of the AMBIT Integrative Measure (AIM).pdf":"ambit-content_public","The Development and Properties of the AIM":"ambit-content_public","The Egg and Triangle":"ambit-content_public","The Inquisitive Stance":"ambit-content_public","The Thrive framework":"ambit-content_public","The Troubled Families Programme: an overview":"ambit-content_public","The Troubled Families Programme: the intervention model":"ambit-content_public","The Water of Systems Change (2018)":"ambit-content_public","The Worker's Mentalizing Stance":"ambit-content_public","The World Health Organisation Quality of Life– BREF questionnaire (WHOQOL-BREF)":"ambit-content_public","The group activity of manualizing":"ambit-content_public","The many sides of mentalizing":"ambit-content_public","The work of Jos De Blok":"ambit-content_public","Theoretical foundations of Family Work":"ambit-content_public","Theoretical/Explanatory Frameworks":"ambit-content_public","Theories: LEARNING at work":"ambit-content_public","Theories: Working with your CLIENT":"ambit-content_public","Theories: Working with your NETWORKS":"ambit-content_public","Theories: Working with your TEAM":"ambit-content_public","Theory":"ambit-content_public","Theory behind the Individual key-worker relationship model":"ambit-content_public","Theory in Practice":"ambit-content_public","Therapeutic Bargain":"ambit-content_public","Therapeutic relationship":"ambit-content_public","Therapist's use of Self":"ambit-content_public","Thinking":"ambit-content_public","Thinking Together":"ambit-content_public","Thinking Together - Local":"ambit-content_public","Thinking Together - Training exercise":"ambit-content_public","Thinking Together example":"ambit-content_public","Thinking Together exercise":"ambit-content_public","Thinking apart example":"ambit-content_public","This is the same as academic theory X, Y, Z...!":"ambit-content_public","Thought Blocking":"ambit-content_public","Thought disorder":"ambit-content_public","TiddlyManual":"ambit-content_public","TiddlyWiki":"ambit-content_public","Tomasello et al (2005) Understanding and sharing intentions: The origins of cultural cognition":"ambit-content_public","Top tips for AMBIT Trainers":"ambit-content_public","TopCloudIcon.png":"ambit-content_public","Topic":"ambit-content_public","Tower of Babel":"ambit-content_public","TowerOfBabel.jpg":"ambit-content_public","Training Challenge":"ambit-content_public","Training Exercises for Keyworker well-connected to wider team":"ambit-content_public","Training Exercises for Managing Risk":"ambit-content_public","Training Exercises for Mentalization":"ambit-content_public","Training Exercises for Respect for Evidence":"ambit-content_public","Training Exercises for Respect local practice and expertise":"ambit-content_public","Training Exercises for Scaffolding existing relationships":"ambit-content_public","Training Exercises for Taking Responsibility for integration":"ambit-content_public","Training Exercises for Working in multiple domains":"ambit-content_public","Training Exercises for the Keyworker Relationship":"ambit-content_public","Training Exercises on AMBIT in general":"ambit-content_public","Training Feedback":"ambit-content_public","Training Feedback for 2018":"ambit-content_public","Training Feedback for 2019":"ambit-content_public","Training Feedback for 2020-21":"ambit-content_public","Training Resources":"ambit-content_public","Training exercise: Managing transitions across services":"ambit-content_public","Training exercises":"ambit-content_public","TrainingCore":"ambit-content_public","TrainingManualization":"ambit-content_public","Trauma":"ambit-content_public","Trauma informed care":"ambit-content_public","Trauma-focussed CBT":"ambit-content_public","Treatment":"ambit-content_public","Triggers for problems":"ambit-content_public","Tronick and Cohn: Infant-Mother Face-to-Face Interaction: Coordination and Miscoordination":"ambit-content_public","Trying out the AIM cards":"ambit-content_public","URL.JPG":"ambit-content_public","Unconferenceboard":"ambit-content_public","Understanding Risk in face to face working":"ambit-content_public","Understanding and Breaking the Intergenerational Cycle of Abuse in Families Enrolled in Routine Mental Health and Welfare Services by Investigating the Feasibility and Effectiveness of a Mentalization-Based Early Intervention Program (UBICA-II Study): Study Protocol for a Non-Randomized, Open-Label, Single-Arm Feasibility Study , Dittman et al 2023":"ambit-content_public","Ungar (2007) Too safe for our own good":"ambit-content_public","Ungar et al (2013) Service use, risk factors and resilience in adolescents using multiple services":"ambit-content_public","Upstream (Background) Factors":"ambit-content_public","Use the Mental Health Act":"ambit-content_public","User Guide":"ambit-content_public","Using AMBIT to Reduce In Patient Admissions - Sarah Harmon":"ambit-content_public","Using the AIM":"ambit-content_public","Using the manual as a REFERENCE tool (looking stuff up)":"ambit-content_public","Using the manual to CONNECT with other AMBIT workers":"ambit-content_public","Using the manual to RECORD learning (manualization)":"ambit-content_public","Using the online AIM Cards":"ambit-content_public","Using1.JPG":"ambit-content_public","Using2.JPG":"ambit-content_public","Using3.JPG":"ambit-content_public","Using4.JPG":"ambit-content_public","Using5.JPG":"ambit-content_public","Using6.JPG":"ambit-content_public","UsingTheManualContents":"ambit-content_public","VB.PNG":"ambit-content_public","Verity Beehan":"ambit-content_public","Video introduction to Thinking Together":"ambit-content_public","Video introduction to disintegration":"ambit-content_public","Videos":"ambit-content_public","Violence":"ambit-content_public","Walker, Conlan and Laforce (2011) A paper on the wraparound approach":"ambit-content_public","We do most of this AMBIT stuff already - what is DIFFERENT in what you are teaching?":"ambit-content_public","We want a hospital bed, not a home visit!":"ambit-content_public","Wearing different hats":"ambit-content_public","Wearing different hats.jpg":"ambit-content_public","Wearing different hats2.jpg":"ambit-content_public","Web-based AMBIT Lead seminars":"ambit-content_public","Webinar 10 Sept 2020 - Implementation: Making Change Happen (Wandsworth 6 years on)":"ambit-content_public","Webinar 11 June 2020 - Online mentalizing (and Active Planning)":"ambit-content_public","Webinar 14 May 2020 Working with Networks, Remotely":"ambit-content_public","Webinar 23rd July 2020 - AMBIT in a youth and community setting - who trusts who?":"ambit-content_public","Webinar 25 June 2020 Using AMBIT to influence whole systems change":"ambit-content_public","Webinar 28 May 2020 - What Works about AMBIT":"ambit-content_public","Webinar 28 May 2020 - What Works about AMBIT local.url":"ambit-content_public","Webinar 30 April 2020 Meeting People Where They Are, Remotely":"ambit-content_public","Webinar 6th August 2020: Working with young people who use substances":"ambit-content_public","Webinar 8 October 2020: AMBIT in Educational Settings":"ambit-content_public","Webinar 9 April 2020 Staying Connected & Adapting Through Change":"ambit-content_public","Webinar 9th July 2020- Moving Out of Lockdown":"ambit-content_public","Webinar Notes":"ambit-content_public","Webinarsfortnightly (1).jpg":"ambit-content_public","Weighing Pros and Cons":"ambit-content_public","Weisz, Jensen-Doss, Hawley (2006) Evidence-based youth psychotherapies versus Usual Care":"ambit-content_public","Weisz, Simpson-Gray (2008) Evidence-Based Psychotherapy for Children and Adolescents":"ambit-content_public","Welcome to Day 2 of Your AMBIT Training - AM":"ambit-content_public","Welcome to Day 2 of Your AMBIT Training - PM":"ambit-content_public","Welcome to Day 3 of your AMBIT Training AM":"ambit-content_public","Welcome to Day One of Your AMBIT Training":"ambit-content_public","Welcome to day 3 of Your AMBIT Training - PM":"ambit-content_public","Welcome to day 4 of your AMBIT training AM":"ambit-content_public","Welcome to day 4 of your AMBIT training PM":"ambit-content_public","What I would to like to learn and what should be preserved?":"ambit-content_public","What are the expected outcomes for AMBIT clients if they do not receive any help?":"ambit-content_public","What do we mean when we say \"That's (not) very AMBIT!\" - Dickon Bevington":"ambit-content_public","What do workers here need in order to do their job well?":"ambit-content_public","What does AMBIT stand for?":"ambit-content_public","What helps a team to learn?":"ambit-content_public","What if people just hate the word \"mentalization\"?":"ambit-content_public","What if workers don't want to mentalize?":"ambit-content_public","What is the difference between the AIM measure and AIM cards":"ambit-content_public","What is your AMBIT? (blank AMBIT wheel)":"ambit-content_public","What makes me me?":"ambit-content_public","What makes the work with clients hard?":"ambit-content_public","What negative feelings does the work bring up for workers?":"ambit-content_public","What positive feelings does the work bring up for workers?":"ambit-content_public","What purpose am I using the AIM for?":"ambit-content_public","What to do?":"ambit-content_public","What's the problem?":"ambit-content_public","WhatInfluencesPractice_pic":"ambit-content_public","Wheel and probs.jpeg":"ambit-content_public","Wheel with client highlighted.jpg":"ambit-content_public","When (how quickly) are we meant to implement this material?":"ambit-content_public","Where are we in the therapeutic journey?":"ambit-content_public","WhichInterventionWhen":"ambit-content_public","Who does what?":"ambit-content_public","Who has your rope pic.jpg":"ambit-content_public","Who is this manual for?":"ambit-content_public","Whole systems change":"ambit-content_public","Why intervene simultaneously in multiple domains?":"ambit-content_public","Why mentalizing matters: epistemic trust":"ambit-content_public","Wilson, G. T. (1998). Manual-based treatment and clinical practice":"ambit-content_public","Work on the Self":"ambit-content_public","Worker energy for change exercise":"ambit-content_public","Working in multiple domains":"ambit-content_public","Working with other professionals":"ambit-content_public","Working with the Family/Carers":"ambit-content_public","Working with the Individual":"ambit-content_public","Working with the Professional Network":"ambit-content_public","Working with the Social Ecology":"ambit-content_public","Working with your CLIENT":"ambit-content_public","Working with your NETWORKS":"ambit-content_public","Working with your TEAM":"ambit-content_public","YPOR - Drug and Alcohol Outcomes":"ambit-content_public","Your Manual":"ambit-content_public","_GoogleDocsIcons_docs":"afc-base-theme","_GoogleDocsIcons_sheets":"afc-base-theme","_GoogleDocsIcons_slides":"afc-base-theme","adam-solomon-WHUDOzd5IYU-unsplash.jpg":"ambit-content_public","afclogo.PNG":"ambit-content_public","aim cards room.jpg":"ambit-content_public","aim instructions.jpg":"ambit-content_public","aim instructions2.jpg":"ambit-content_public","aim2.jpg":"ambit-content_public","aimcardsroom2024.pcio":"ambit-content_public","alexei-scutari-5Zg64OwXJg8-unsplash (1).jpg":"ambit-content_public","anastasia-petrova-xu2WYJek5AI-unsplash (1).jpg":"ambit-content_public","angrycat.jpg":"ambit-content_public","ap..PNG":"ambit-content_public","beapicture.jpg":"ambit-content_public","billiepicture.jpg":"ambit-content_public","books pic.jpg":"ambit-content_public","books.PNG":"ambit-content_public","brain.jpg":"ambit-content_public","branden-harvey-wyN0QFDiXw0-unsplash (1).jpg":"ambit-content_public","broadcasting Pic.jpg":"ambit-content_public","christian-wiediger-NmGzVG5Wsg8-unsplash (1).jpg":"ambit-content_public","complexity pic.jpg":"ambit-content_public","copy room.jpg":"ambit-content_public","cs.PNG":"ambit-content_public","custom link.jpg":"ambit-content_public","dickon":"ambit-content_public","dickonpicture.jpg":"ambit-content_public","diego-ph-SZYreZsJ-fE-unsplash (1).jpg":"ambit-content_public","dog.png":"ambit-content_public","download (1).jfif":"ambit-content_public","dylan-gillis-KdeqA3aTnBY-unsplash (1).jpg":"ambit-content_public","elevatorpitch.png":"ambit-content_public","end page content":"ambit-content_public","energy":"ambit-content_public","everton-vila-AsahNlC0VhQ-unsplash (1).jpg":"ambit-content_public","facil.PNG":"ambit-content_public","free-to-use-sounds-W_FHuUQKNP0-unsplash (1).jpg":"ambit-content_public","getting-started-icons.png":"ambit-content_public","gm.PNG":"ambit-content_public","graph":"ambit-content_public","graph2":"ambit-content_public","graph3":"ambit-content_public","graph3 page2":"ambit-content_public","graph4":"ambit-content_public","hello.jpg":"ambit-content_public","help seeking.png":"ambit-content_public","ht.JPG":"ambit-content_public","iCON.PNG":"ambit-content_public","iFrames - a 'window on a web-page'":"ambit-content_public","ian-dooley-3NCA3tbaE5I-unsplash.jpg":"ambit-content_public","iceberg.jpg":"ambit-content_public","image.png":"ambit-content_public","inshoes.jpg":"ambit-content_public","ipcimage.png":"ambit-content_public","jehyun-sung-6U5AEmQIajg-unsplash (1).jpg":"ambit-content_public","jl.bw.PNG":"ambit-content_public","john-schnobrich-2FPjlAyMQTA-unsplash (1).jpg":"ambit-content_public","laurapicture.jpg":"ambit-content_public","law1.jpg":"ambit-content_public","law2.jpg":"ambit-content_public","leap.jpg":"ambit-content_public","left":"ambit-content_public","logic-model-310517.pdf":"ambit-content_public","login.PNG":"ambit-content_public","lose some weight.jpg":"ambit-content_public","luciano-de-sa-ObwMZBdEWdI-unsplash (1).jpg":"ambit-content_public","lysander-yuen-wk833OrQLJE-unsplash (1).jpg":"ambit-content_public","map.PNG":"ambit-content_public","mark the task ttt.jpg":"ambit-content_public","mark.jpg":"ambit-content_public","md.PNG":"ambit-content_public","measuring pic 2.jpg":"ambit-content_public","mentalizingmonkeys.jpg":"ambit-content_public","mm.PNG":"ambit-content_public","mod4.jpg":"ambit-content_public","module 3.jpg":"ambit-content_public","module 5.jpg":"ambit-content_public","module 8.jpg":"ambit-content_public","mz the moment ttt.jpg":"ambit-content_public","mz.jpg":"ambit-content_public","nathan-anderson-kTaIjvHsyJg-unsplash.jpg":"ambit-content_public","navigating.jpg":"ambit-content_public","neonbrand-zFSo6bnZJTw-unsplash (1).jpg":"ambit-content_public","news head.jpg":"ambit-content_public","nicole-honeywill-dGxOgeXAXm8-unsplash.jpg":"ambit-content_public","nn.PNG":"ambit-content_public","outcome pic.jpg":"ambit-content_public","page-background.svg":"ambit-content_public","patrick-perkins-8VurHsVsls4-unsplash (1).jpg":"ambit-content_public","patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg":"ambit-content_public","pavan-trikutam-71CjSSB83Wo-unsplash.jpg":"ambit-content_public","peterpicture.jpg":"ambit-content_public","pre-conditions for learning.jpg":"ambit-content_public","puzzle.jpg":"ambit-content_public","ratchet":"ambit-content_public","reasons for being here":"ambit-content_public","remove review tag":"ambit-content_public","return to purpose ttt.jpg":"ambit-content_public","return.jpg":"ambit-content_public","right":"ambit-content_public","ripples.jpg":"ambit-content_public","room options and import from file.jpg":"ambit-content_public","screen.png":"ambit-content_public","session 2 page 1":"ambit-content_public","sign up.jpg":"ambit-content_public","siora-photography-cixohzDpNIo-unsplash (1).jpg":"ambit-content_public","stance tension client.jpg":"ambit-content_public","stance tension learning.jpg":"ambit-content_public","stance tension networks.jpg":"ambit-content_public","stance tension team.jpg":"ambit-content_public","start game.jpg":"ambit-content_public","state the case ttt.jpg":"ambit-content_public","state.jpg":"ambit-content_public","studying together image.jpg":"ambit-content_public","sympt.PNG":"ambit-content_public","team learning situations-min.jpg":"ambit-content_public","teleology drinking at work.jpg":"ambit-content_public","thinking monkey.jpg":"ambit-content_public","thinkingtogether poster.pdf":"ambit-content_public","tile motif.png":"ambit-content_public","togimg.PNG":"ambit-content_public","txtMainTab--2007612701":"ambit-willowvue_public","what to measure pic (2).jpg":"ambit-content_public","what to measure pic.jpg":"ambit-content_public","whyamihere.gif":"ambit-content_public","working together image.jpg":"ambit-content_public","world.PNG":"ambit-content_public","yourrooms.jpg":"ambit-content_public"}
{"#BlackLivesMatter":"\"d961373bc419cacde1ded7d384b94e0b\"","$:/Error Message.png":"\"243b5e5390dc1abf2351c0ab679c7252\"","$:/GoogleAnalyticsAccount":"\"1d6a12df4239d409d489167749c0bed1\"","$:/GoogleAnalyticsMeasurementID":"\"18911c203bbfeecb9a7a5da94216ac89\"","$:/Import!!popup-AMBIT - Logic Model blank.jpg":"\"b7ed5dc37a9fa82b81e0216aec211235\"","$:/Import!!popup-AMBIT Manual.jpg":"\"b3e5b7caaea862b35c105565501acecd\"","$:/Import!!popup-AddNewPagePic.jpg":"\"aa708a4a0c9837e8bb2aae82fee805d3\"","$:/SiteTitle":"\"62a34ada40d526ad54cf162a479f6bd6\"","$:/_/Admin":"\"7e27fee731c3840a9ce9712e006a7120\"","$:/_/Admin/ClassicTiddlers":"\"e8d79c1420fe19d5b97decfe2a0f6f1e\"","$:/_/Admin/ClassicTiddlersWithTagsMacro":"\"531ebf5b405a65ad8fda74c9bd8fe37d\"","$:/_/Admin/Old Tiddlers":"\"9ff308375ed23e78562faeb7ad73c916\"","$:/_AFC/AboveStory/Logo":"\"f90abc11b7d842cf11d2e8dd07d781e5\"","$:/_AFC/EditDraftInfoSegment":"\"14b97bb8d45794bfb36bf9192951e8f5\"","$:/_AFC/Fonts/UseFonts":"\"7a194c57092242bf0f99c79bd6e28fe2\"","$:/_AFC/Macros/Image":"\"c187fbc8c037e27fd02504e25c0aa644\"","$:/_AFC/Macros/YouTube":"\"571226f519b51c4b102ca27cec59bbcf\"","$:/_AFC/Palette":"\"fd38d130d30f4c51a258cfb1425339a9\"","$:/_AFC/Recent/All":"\"699b50456ec9bca15847e239f74f475c\"","$:/_AFC/Recent/Local":"\"50fe829d28e41a0ff49f27a87ecea34b\"","$:/_AFC/SideButtons":"\"c7ab48a9272008146b9c204ae9b7c608\"","$:/_AFC/SideButtons/Styles":"\"bcc61a8fee54fc09cbe0319b24f28363\"","$:/_AFC/Startup/ConfigurePreview":"\"d186a5c9b65e35420bbf7741b3c5f117\"","$:/_AFC/Styles/Bubbles":"\"585551f2d0412e463b55da6a212834f7\"","$:/_AFC/Styles/DocLinks":"\"406c2d60bf469bba7f5ce36c04f5ce08\"","$:/_AFC/Styles/FadedSidebar":"\"f429edacd34f19f1559a3779bc8d8dab\"","$:/_AFC/Styles/HideEditButton":"\"051c89709a3e30ce00bcd654225c25f4\"","$:/_AFC/Styles/Overrides":"\"34c7de5409fa262ece619897eb8cf27d\"","$:/_AFC/Styles/TopMenu":"\"b0cd98b814e1a1a2bea0e34aa3e2e60c\"","$:/_AFC/SurveyBanner":"\"b3015c7cf7503a0e11b08600c77311c8\"","$:/_AFC/SurveyBanner/Styles":"\"a2ccfcbd8fd68cad395e3149bf599069\"","$:/_AFC/TagDropdown/NewHere":"\"45deec1e2ad63899621dfb64b7cbe229\"","$:/_AFC/TagNavigation/Styles":"\"c4f0cb327cd8e9dfbd6e0d6198cd29c6\"","$:/_AFC/TagNavigationMacro":"\"760d053258599600c4d1ead08f1bd648\"","$:/_AFC/Tiddler/Tagged":"\"c6a782e8239abe2a39e338f3af81b428\"","$:/_AFC/Tiddler/Tagged/Styles":"\"59786658b670977cf54e600f83d2da1b\"","$:/_AFC/TiddlerInfo/Text":"\"535865a9e975de227599cdd32f4ccc9e\"","$:/_AFC/consent-banner/buttons/login":"\"53924a18efd5ea26807b35fb2f545f68\"","$:/_AFC/grey-wordmark.svg":"\"d2b3a7add5aea8657db3bbeb3b498ae1\"","$:/_AIM/Questionnaire/01 Young person daily life - Social activities":"\"3dc1ee99451af67f59cbdcbc5e35d0b1\"","$:/_AIM/Questionnaire/02 Young person daily life - Attendance at Education, Employment or Training":"\"341f76404b5c6f3fbd51505ce20120f8\"","$:/_AIM/Questionnaire/03 Young person daily life - Attainment in Education, Employment or Training":"\"8846560a4d0256982f6cf80a6c069c77\"","$:/_AIM/Questionnaire/04 Young person daily life - Other talents and abilities":"\"404e6afabea3ddade14979e2c528e612\"","$:/_AIM/Questionnaire/05 Young person daily life - Physical health condition":"\"810e60d67d18c0fd9cfd07aa5ee522cf\"","$:/_AIM/Questionnaire/06 Young person daily life - Self care":"\"d15eaa1d8646c60a29c43de0a712b7bf\"","$:/_AIM/Questionnaire/07 Young person daily life - Physical impairment or disability":"\"828323999da198613a7f2e9cf8c2190d\"","$:/_AIM/Questionnaire/08 Young person daily life - Social development":"\"4e49cb0a28dc5fbdad5bcc0d0d5721a7\"","$:/_AIM/Questionnaire/09 Young person daily life - Social skills and interaction":"\"56a38b235bd6a98121438006427235f9\"","$:/_AIM/Questionnaire/10 Socio-Economic - Provision of Stable Housing":"\"b387dad1d005b8a06d6b2ae80a960b07\"","$:/_AIM/Questionnaire/11 Socio-Economic - Income and Provision of Material Resources":"\"010fc49488b0cb23958c9b7ec50e066e\"","$:/_AIM/Questionnaire/12 Family - Relationships":"\"a20e73acd1745efe4ba4ff9f476f0086\"","$:/_AIM/Questionnaire/13 Family - Conflict with young person":"\"9519c2fdb61185ed7f435d8bee2ef789\"","$:/_AIM/Questionnaire/14 Family - Parental discipline":"\"3054dc845c31856e9b479a5295bdb896\"","$:/_AIM/Questionnaire/15 Social - Supportive adult relationships outside the family":"\"21431a4591dcf88d167f7e67ded1ae84\"","$:/_AIM/Questionnaire/16 Social - Peer friendships":"\"d20308c2c0887c66bf5f2edae4e64665\"","$:/_AIM/Questionnaire/17 Social - Prosocial or antisocial peergroup":"\"06fcc0b39000d4ae0e388916ac758efa\"","$:/_AIM/Questionnaire/18 Mental State (1) - Cognitive ability":"\"676d812c6b41fa921d85ce75f9b6286d\"","$:/_AIM/Questionnaire/19 Mental State (1) - Anxiety":"\"81d1e06448d7bdcc5a0076012943a4f8\"","$:/_AIM/Questionnaire/20 Mental State (1) - Obsessional Ideas and Compulsive Behaviour":"\"fc1c28a58c01ab26e5024f85bdffe3fb\"","$:/_AIM/Questionnaire/21 Mental State (1) - Post-traumatic intrusive experience":"\"390e25e97140d20b44483d210eba9fc4\"","$:/_AIM/Questionnaire/22 Mental State (1) - Attention and concentration":"\"2ba2b0f782eff7655383ba59f4f038a0\"","$:/_AIM/Questionnaire/23 Mental State (1) - Irritability":"\"1d7808915c53bc3ace9d724236333aca\"","$:/_AIM/Questionnaire/24 Mental State (1) - Sleep disturbance":"\"942bccbcc3085ea5823440d4e0eca6f6\"","$:/_AIM/Questionnaire/25 Mental State (1) - Depression":"\"87f2f5f371ed36732c45e43daa10aa63\"","$:/_AIM/Questionnaire/26 Mental State (1) - Self-injurious Behaviour":"\"a9f2c2fb4143ea58b9bd3e39771d6690\"","$:/_AIM/Questionnaire/27 Mental State (1) - Eating problems":"\"46244f818071d49e8729077eb9d6218f\"","$:/_AIM/Questionnaire/28 Mental State (2) - Substance misuse":"\"0b477a4823bf1f60e094e3a6d2cbaaa1\"","$:/_AIM/Questionnaire/29 Mental State (2) - Suicidality":"\"81802a6e895c7d07a331bf9c52f0d190\"","$:/_AIM/Questionnaire/30 Mental State (2) - Defiance":"\"81504695baa504385244b21e0db0d211\"","$:/_AIM/Questionnaire/31 Mental State (2) - Destruction of Property":"\"b7e9fd51ea066f1edbdae83461586c3f\"","$:/_AIM/Questionnaire/32 Mental State (2) - Physical harm to others":"\"7dee99e1dbdb3aed0cf0324d46b44cd0\"","$:/_AIM/Questionnaire/33 Mental State (2) - Problematic sexual behaviour":"\"49e8054830058eb6f43e4260e2c9f7c6\"","$:/_AIM/Questionnaire/34 Mental State (2) - Psychotic experiences":"\"a15936e3f5cb0ae52f52e5946ab90c8c\"","$:/_AIM/Questionnaire/35 Mental State (2) - Elated mood":"\"ceb4b74ddce45570a6a832dda5e7e35b\"","$:/_AIM/Questionnaire/36 Mental State (2) - Mentalizing Capacity":"\"4e0d06f39c923c0b30ab24c1cbb2254c\"","$:/_AIM/Questionnaire/37 Response to situation - Insight":"\"865d9ef82511b0d4ce8ebc68ccca6208\"","$:/_AIM/Questionnaire/38 Response to situation - Engagement with treatment and care":"\"8f35458416483fabae30a0e28e76f531\"","$:/_AIM/Questionnaire/39 Measure of Complexity - Chronicity":"\"1d8ddbad9b787b7c889aed2b09f6ca17\"","$:/_AIM/Questionnaire/40 Measure of Complexity - Pervasiveness":"\"e1f88d9c0ad213b4abbdf3b3c419f67f\"","$:/_AIM/Questionnaire/41 Power and Control - Experiences of Discrimination":"\"b4f8939cac3bcc9704ea7b922f717199\"","$:/_AIM/Questionnaire/42 Power and Control - Experiences of Exploitation":"\"91d4b2a9aa15b8ea0652d2232f7af919\"","$:/_AIM/Questionnaire/43 Power and Control - Online life":"\"2bbd0a3f24fbbbbcfbe502ce278084d8\"","$:/_AMBIT/Palette":"\"19d35fae5d6d7922baef9f7cacd0c07d\"","$:/_AMBITWheel/English":"\"667a1360f1ff74a6303d367afc1bbea0\"","$:/_AMBITWheel/Macros":"\"0fb65589691fb4eb97938b1090ff8605\"","$:/_AMBITWheel/Styles":"\"1028ed177beca78e6a46fab746bb26aa\"","$:/_AMBITWheel/Template":"\"f4a6796938d8921b04e06b97a9caca12\"","$:/_Macros/ImageLink":"\"3bbbf684a6393e57386fd7a0bcf1b94e\"","$:/_Macros/LinkDoc":"\"bea2d309a4d3c118bad5d5b78472977d\"","$:/_Macros/LinkPDF":"\"1833c49010a51b795109546425d87189\"","$:/_Macros/Video":"\"76773c71485bfc36f916e293e1eb17b8\"","$:/_Menu/AIM":"\"42f268421decb650e02a200b77d174ca\"","$:/_Menu/AMBITReferences":"\"fcc85811af5047f63e6cad159e532fa1\"","$:/_Menu/About":"\"9db8f88c11aa4b63c4638b6bd586db12\"","$:/_Menu/Client":"\"f75f5eb4fe44614492c608b0fbbd10c8\"","$:/_Menu/Community":"\"4ed2af20490aaa45f1daeed3b3029db6\"","$:/_Menu/Home":"\"389b8f9ea142b8fc48c5c769cf5a264f\"","$:/_Menu/Home/DropDown":"\"ca3136000653d1fcfb5561b16f9f3ade\"","$:/_Menu/Learning":"\"0e4bf817db1b87660a2d3dcb7ea094f1\"","$:/_Menu/Networks":"\"874fb037902ec2f448b495e8bd8c6de3\"","$:/_Menu/TOC":"\"2e7d7e4407fbfcb6935068cc7e3179f5\"","$:/_Menu/TOC/DropDown":"\"c0e2edd463d80199d44af3099b5ce84b\"","$:/_Menu/Team":"\"9eeaabfc8eb36ebe473ff6e3d53618cd\"","$:/_Menu/Training":"\"7b000d9a6b7a07da8b440aad08eaca90\"","$:/_Menu/Using the Manual":"\"5e5fd95bef27536b460addb3e719056b\"","$:/config/Manager/Filter":"\"97b7fbe184fe9c53c5721e03bd96e5c2\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/control-panel":"\"d56e740bc27082495dafea1fafe3edf2\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home":"\"df18716e2e19633980532fab554b0395\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import":"\"2f370e0bb591b8a5616194699f3e5483\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview":"\"c54bcc91ee278e5c8294472239665c53\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager":"\"618d75e8493ffdf7657c2490d043a05c\"","$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp":"\"564a60a20284bcbb88c5ad5a0462322c\"","$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/comments":"\"628f0624f6dc7a9d720f9a173c4e3260\"","$:/config/RelinkOnRename":"\"8c4a87ff6a7992f8491760f501e76f4e\"","$:/config/TextEditor/EditorHeight/Mode":"\"e94d636ffea634b997641b48e338dc43\"","$:/config/TimestampDisable":"\"19669633b7ca215c8d16d1306ca20c24\"","$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar":"\"4b65094df85fa735b3a9e6e487ed56b9\"","$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others":"\"4545697180d1bc247fa6ba6ec326bddc\"","$:/config/ViewToolbarButtons/Visibility/$:/plugins/federatial/print/button":"\"0e15c4427b0db8bc7ab25e467aa8c0bd\"","$:/config/peek-stylesheets/mode/--994748944":"\"8a7d6a2c5c9f21de8aaba9d88b5cf6b4\"","$:/config/peek-stylesheets/open/--994748944$:/_AFC/Fonts/UseFonts":"\"7871f2c75ccab661b4d67fea3b8e05f6\"","$:/config/peek-stylesheets/open/--994748944$:/_AFC/Styles/Overrides":"\"1486b3f22137cd765b97da39b322b281\"","$:/config/peek-stylesheets/open/--994748944$:/plugins/federatial/xememex/styles":"\"effaad0aebe1aa9ed479982184398df6\"","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/contents":"\"d86d3acf25e62ebab56871fef1e7faae\"","$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":"\"fbf8005033d9c7f808823f229851edd7\"","$:/config/plugins/tiddlywiki/consent-banner/greeting-message":"\"135d7ecf1b4eb392c0f8a6563befb5db\"","$:/core/ui/MoreSideBar/Drafts":"\"bc8030c66ff72ad4a0d9f0000f16600d\"","$:/core/ui/SideBar/Recent":"\"40f515250d71c7526356c9d7a7299b53\"","$:/core/ui/SideBar/Tools":"\"c5e950685826b5e35404f9fd7d76e4e9\"","$:/core/ui/ViewTemplate/subtitle":"\"b0c8d4a1cfa25413f198cc963d3f4ef8\"","$:/favicon.ico":"\"9233b4d8e50d7c217c16a80d623deedb\"","$:/images/fa5/brands/youtube":"\"db629429384ea8e68139b4116e6bfaf7\"","$:/images/fa5/solid/chevron-circle-right":"\"cbcc19ae3159dcc813b783a52538a923\"","$:/images/fa5/solid/clock":"\"05364a511579bacbaffb5d21f8819431\"","$:/images/fa5/solid/comments":"\"fe10a7092dee51bb2a8709fd8caea293\"","$:/images/fa5/solid/mail-bulk":"\"2f2ee27f20ee7cf8e8c55ea239cd32b4\"","$:/images/fa5/solid/sticky-note":"\"6450e192751d07c73f624eea1ddcf72a\"","$:/images/fa5/solid/tasks":"\"02d4eab31850fe0785a73d346fcd1155\"","$:/language/BinaryWarning/Prompt":"\"5988758a313af63d075b9ae8f151fae3\"","$:/language/Buttons/Permalink/Caption":"\"52e3873d59162ebfd244e601e5d4b3aa\"","$:/language/Buttons/Permalink/Hint":"\"fce78115b56cf5c2a9d47b05456bc7e1\"","$:/language/Buttons/Permaview/Caption":"\"e3335188fe5be70940c26039f797dc1b\"","$:/language/Buttons/Permaview/Hint":"\"d47170a715369b6ebfe7bf417a36d7da\"","$:/language/SideBar/Open/Caption":"\"2cced2a067d0fe373420d7b43d2e8896\"","$:/language/SideBar/Recent/Caption":"\"cbc5f48e8bfff7be65569bb417caa347\"","$:/layout":"\"ce0c9f02bf1eba409860d51447a50ff1\"","$:/palette":"\"9c2442a40fdae97d8dfddc05ef58bf8c\"","$:/plugins/federatial/aim-questionnaire":"\"649f5ed36158fd3060a2ef8da038fa8c\"","$:/plugins/federatial/print/button":"\"e25177d0c3d818bbe28b1a7f36bc0b4c\"","$:/plugins/federatial/print/styles":"\"2ea66bf6be0fb2a73f32ce9825fd325a\"","$:/plugins/federatial/print/template":"\"581a8671a3e18319afcd6ff8c916f21e\"","$:/plugins/federatial/print/template/inner":"\"bd9a103267a6863fbaa0fb1fbe2e66ed\"","$:/plugins/federatial/print/window":"\"968a343265c864d64a865e478bbf912a\"","$:/plugins/federatial/xememex/status-button":"\"2277ef8c8a197aef0bbd393f2a6dbfbb\"","$:/plugins/tiddlywiki/comments":"\"9e27c732ee7da173697f5b88bfab804c\"","$:/plugins/tiddlywiki/comments/sidebar":"\"52f620b7b6c12fffdb7e23e0b741d9b2\"","$:/plugins/tiddlywiki/consent-banner":"\"9fabdf6138d07ba9e123427fb3c50329\"","$:/plugins/tiddlywiki/googleanalytics":"\"3fb55c0cc1b173e87ed6c6d092acdec8\"","$:/plugins/tiddlywiki/menubar":"\"414c88bf626bb22343e801593cc9bb0f\"","$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot":"\"7c6648573f9bb338975a3ad66cbcbc59\"","$:/styles/lizTable":"\"f8aa08a29d3750a7c19daac3f753682e\"","$:/tags/EditTemplate":"\"45c5c1480892185b25feb0a1300e47d3\"","$:/tags/MenuBar":"\"15e08278de06dd775d910a5a0ea0639f\"","$:/tags/MoreSideBar":"\"e35c0294e3c58d3ed322ce46a06cc7a5\"","$:/tags/SideBar":"\"1bb191b6987a6854b309341e61cd901c\"","$:/tags/TopMenu":"\"83fb9741a48a38238d1c108e4b45d7dd\"","$:/tags/ViewTemplate":"\"d665195bf405c0eff27ac5c2807b7287\"","$:/theme":"\"82092a2e032790cfa231d9b57aefca73\"","$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":"\"1f1a5c93fa4e34ab9fefb745dd069349\"","$:/themes/tiddlywiki/vanilla/metrics/storyleft":"\"4e73252990e01b1915baad8a4b8af6b4\"","$:/themes/tiddlywiki/vanilla/options/sidebarlayout":"\"1b5a726b251535d567555c34bc29ebe9\"","$:/themes/tiddlywiki/vanilla/settings/backgroundimage":"\"238ea3a6cbf4383048425c617d1f0de5\"","$:/view":"\"4cec52497a6e42508020bc8a7e150c70\"","(a) Work in Progress - Major change":"\"b7d117a37e395e49e40098665231cb48\"","(b) Work in Progress - Minor change":"\"9792188722d468f169b7ae22c113b380\"","1. Educational-Vocational Engagement and Assessment":"\"cd566d5ee1fd531694042f2333d12c69\"","1.JPG":"\"0040936e0d9fa2345d521032acb22e33\"","2. Educational-Vocational Intervention and Transition":"\"f48a5bf1f37ce9dcc17eb140c376f041\"","2.JPG":"\"3d56464fde6e63d3f9d7e7feebc9f355\"","3. Educational-Vocational Illustrative Case Vignette":"\"b4456af9afca75c1c732ea46a4cc4f16\"","4.JPG":"\"fd473dfe8af867075bd9b4910da7347b\"","4corners.PNG":"\"9b5bed0972cf3240d4bc3c10f9a6bcf9\"","73b76b47-ee5a-4bad-b425-151e215679a0 (1).jpg":"\"3061379391c67d84f1a45cc297b3eacf\"","A Guide to Editing the Manual":"\"3ce870dbbfd0c4154232e1996b93b750\"","ABC Diary-keeping":"\"a7795154768176a719d0b37743fe6d2a\"","ADHD":"\"71bfb07ae5ae40ab8f3a185871ea7c3f\"","AF-logo-RGB-Green.png":"\"4e39406992604441d53e2862767bc892\"","AFNCCF":"\"b4801c10d2b73bdb8be291c4647d350a\"","AIM":"\"71f87a1863f99fcd62f94f7aa0087c9f\"","AIM - Key Problems":"\"238a619f9baa8c4e85038bc31729a542\"","AIM Cards":"\"d15c2e020064f24c1de074c921598329\"","AIM Cards Board - download here":"\"fb91d218d9f470c561cd8c80f50feda4\"","AIM Creative Commons Licence":"\"3759f1ab4bf38fd41a3f3dc877b2579d\"","AIM Guides":"\"67b985e8ec5f9f361a76e50e0d4acb1f\"","AIM Items":"\"24fabc934516ca4889fbe45f19c2da38\"","AIM New Items: Experiences of Discrimination":"\"72fcb7b3fc1d08fb31758d4964bb1a28\"","AIM New Items: Experiences of Exploitation":"\"30998c46f18b38118c7b0db151fb4190\"","AIM New Items: Online Life":"\"9f086cb891fb54d79dbc467f70fc7005\"","AIM Questionnaire: Updates and revisions":"\"9fc65d4ec12c19953e1513b6c2815249\"","AIM Spreadsheet":"\"56b2a6772978f5b3f63483a73ce00a4e\"","AIM baseline scores from CASUS study":"\"8611b75bf8db24c5b848f79cfec4a651\"","AIM cards board - download":"\"7bb494cd1b1db658d947a5bf96af4999\"","AIM cards pic1.jpg":"\"cd55acd833e66a7ee000bad9c6965977\"","AIM individual score.JPG":"\"80862b2bfe41d9b85b60215da3ace697\"","AIM questionnaire - interactive version":"\"3127d19d70cd1a6a3862ec92da6d09ff\"","AIM questionnaire - paper version":"\"f6087af4dd312d44906ea27005e383c0\"","AIM score.JPG":"\"501c40486ddbf74ab1ebb29c39165812\"","AIM suggested interventions":"\"756ac26d789d8623666a5d7fbefad4ab\"","AIMmenu":"\"f3f0d4e331e9f490b14be555bd836c57\"","ALF":"\"72a827d30a60539bf6746d6316ceee09\"","AMBIT":"\"6cbc61774a3fdc25e8f1e8819e94fa4a\"","AMBIT - Logic Model blank.jpg":"\"239895e62bdc9493203c80a67047ff16\"","AMBIT Across a Complex Array of CAMHS services - Gavin Cullen and Fiona Duffy":"\"af7113dff4ba390bfd84a9ad8f6d7553\"","AMBIT Client Impact Project (ACIP)":"\"e4f2e00f72d27d85ffa107064e4876e2\"","AMBIT Competencies":"\"13b54f7c312c7fb044d8aa2cd1c0a4cf\"","AMBIT Competencies covered in the Basic Training":"\"9da737d8c6d7c015a86e9f859d012df7\"","AMBIT Conference presentations":"\"c9d0f3d759fc1a10fd3738f02eefdb14\"","AMBIT Consultation Day":"\"3de898f794614da5c3a6e536dfb23eef\"","AMBIT Disintegration Grid template with instructions.pdf":"\"04f64ff005df328a520b4ccbf3c3cf65\"","AMBIT Editorial Group":"\"010e6d0db07bc348c564c86d57ef226e\"","AMBIT FAQs":"\"ceeda8c0b4e03cbfb6e9f623894c503b\"","AMBIT Full Competency Framework":"\"2f4a0c5a434888fef28d14f1d6fe52e4\"","AMBIT Implementation follow-up":"\"4f577f7643468a2102fe52664fca2e6c\"","AMBIT Informed Team Practice measure":"\"69e5a9c790e3daa993f60826a2bf54f8\"","AMBIT Integrative Measure (AIM) - a paper Guide for Practitioners (2).pdf":"\"0eeae7391a1310caf2a9d27bb5d62428\"","AMBIT Integrative Measure (AIM) - an online Guide for Practitioners.pdf":"\"d5e1f6b752e434e1f77687fecade331b\"","AMBIT LEADS - useful training pages":"\"43afb464521828192923775fa0a71abe\"","AMBIT Lead":"\"b30b8ef66d64e2d005ada6432d6a960a\"","AMBIT Lead peer-to-peer system":"\"7f5be4adf49428a966c45d4058ed39b2\"","AMBIT Local Facilitators":"\"7789a7798e82360756a2e840efd0b8af\"","AMBIT Local Trainer: overcoming barriers to effective implementation":"\"646e0c9c99f6711679aa372fab6442f3\"","AMBIT Manual Library of Pages":"\"25c36b18335b5685392ffde1b1966485\"","AMBIT Manual Site Map":"\"87b411fb7cec15a7ba2aca195b63da3f\"","AMBIT Marking the Task cards v2.pdf":"\"0844a7f0f5e8d167d264560dfcfe5ebd\"","AMBIT Measures Under Development":"\"79d483d9c760c41a7e11068ec98b3fa3\"","AMBIT Newsletter":"\"f6e978ad23d3bf0cd6173d848eda4b3b\"","AMBIT Outcome Studies":"\"614c38bbd793c1890994b8e672714d0d\"","AMBIT Practice Audit Tool (APrAT)":"\"2e32d613622a7f75561854e2f95808d7\"","AMBIT Practice Audit Tool_v.2.pdf":"\"7c871866ab84725aa0618ade9c1e3fd0\"","AMBIT Programme team safeguarding procedures":"\"b4d3ef4a98ff8f93c8cddd2699ba54c1\"","AMBIT SERVICE EVALUATION QUESTIONNAIRE.pdf":"\"c80ce6658e05c391a13db3dece9fec6e\"","AMBIT Service Evaluation Questionnaire (ASEQ)":"\"036a5450e2f56d93585beccf53bc628f\"","AMBIT Stance Exercises":"\"237c2e05b9b9543ca98cd6eea4b5f624\"","AMBIT Supervision for HEE Crisis Teams":"\"7d6aef8871e27bcc2ee7b7a912b8f700\"","AMBIT Team Competencies":"\"c48970eb293534e3a452626fade44b37\"","AMBIT Trainers":"\"9b61f6cfa46e65c9dc36841ab18c8e94\"","AMBIT Training":"\"d097508ac30a82ceed51124bfc7b0cf2\"","AMBIT Training Application Process":"\"6e98697b883a2957df3fe492d6d5e71e\"","AMBIT Training Principles":"\"905c1e87f8f74f8141f7a61b0f4f89d6\"","AMBIT Training objectives for Risk Support training":"\"52f26be20d66452db19bbaa8a96d3dab\"","AMBIT Unconference 2016":"\"d82d219fddf952984b80d7683a47b117\"","AMBIT Wheel":"\"7e3d8d7230fdc2cf9fa364a76c181637\"","AMBIT Wheel (Arabic)":"\"26ca5f11c0fc6700df271308aeb1f84f\"","AMBIT Wheel (Catalan)":"\"e8fa82aba307f041d47511a52bf39a27\"","AMBIT Wheel (Chinese - 中文)":"\"f984c728e9188bb8c4a1f5c787ecc022\"","AMBIT Wheel (German)":"\"1cd1c539d0f90539be42afd2716f1cd1\"","AMBIT Wheel (Japanese - 日本語)":"\"7e499f1beb3eec6b99298d3c4433faff\"","AMBIT Wheel (Spanish)":"\"fe5f3a351dfbbba5461dc29fa46ac6b0\"","AMBIT Wheel - Chinese.jpeg":"\"caf22a9e144954dcb6169ad0cb4fa7c5\"","AMBIT Wheel- Visual aids for colleagues":"\"6411364e16b5294a260f8067a3c5397d\"","AMBIT Wheel-Catalan.jpg":"\"702a213f04de0e4b775dcd8fda0030fb\"","AMBIT Wheel.pdf":"\"5e5cf76359377fe2af6b044788a8e5ed\"","AMBIT Wheel_B+W_round.jpg":"\"0c590953e750b5132b3c45f896451f0d\"","AMBIT Wheel_Japanese (2).jpg":"\"68d11a8abdfc88597c019555ce7ba7ce\"","AMBIT and other Approaches, Methods and Techniques":"\"9a242faa2a68162f0ef9fb1bed70b34c\"","AMBIT as a Service Quality Improvement approach":"\"ab2c37a7318ccefefa6f493f1b7956f0\"","AMBIT card resources for supervision":"\"2cc7126b23d06ddeea946d549e541bcf\"","AMBIT community of practice - Teams with local AMBIT manuals":"\"042d3c4c921cfdcd312655989b0d6d72\"","AMBIT development topics":"\"37ca26e010e4834611462866d3e40bbf\"","AMBIT for School Refusal":"\"a6547ecdfb5b525ca004298f2a33cdc4\"","AMBIT for adults with complex trauma/relational difficulties":"\"a5bcaaef13e38227bdafff5203ecc259\"","AMBIT icon":"\"25499478a17d3c96358de15ba5aaba38\"","AMBIT implementation questionnaire.pdf":"\"96ed1a1a0f586d3a11cedc9825492fd0\"","AMBIT in Education":"\"e4bc2f3b9b3179def722ce8d69703833\"","AMBIT in adult prisons and forensic in-patient hospitals":"\"c8f9fdea2a461980ee6b8c62547439d5\"","AMBIT in an Adolescent MH team: struggles and successes - Griffiths, Duffy, Kennedy":"\"9038c33c36bd1b38b70e44c0d1d5449a\"","AMBIT in gangs and violence prevention":"\"be4f964fda641d01683841089232c431\"","AMBIT in larger organisations (Unconference 2016)":"\"a566cc8bf4989a7fad2c17d53d7d8329\"","AMBIT is a type of pre-therapy":"\"7001fb471a4a0966cb11d51e8a585ea8\"","AMBIT knowledge and skills questionnaire.pdf":"\"76db2f71daf924d89b0ba187e20f157e\"","AMBIT logic model (2019)":"\"928d9ece07f1cc909765c8a1dcc3bfac\"","AMBIT playing cards":"\"a033cc4a51d8a3058a472799de5d2ead\"","AMBIT programme":"\"dfa22382b8cbef9372e45ec280c0397c\"","AMBIT stance cards":"\"633510fdb1fef29dcbac1af6f2585bb9\"","AMBIT stance playing cards":"\"dc760310b7e629947b8f0f53974a9c74\"","AMBIT study group development":"\"d32c753cbf3863a67973f84c1b1e02ad\"","AMBIT study group projects":"\"b8834bc05e68d1f07dc1dcd65144a746\"","AMBIT supervision provided by the AMBIT Programme":"\"9c6819fbd941c52d783f8f0448aaf07e\"","AMBIT top-bar.png":"\"93d10a6b3fc5db3bf0282e3059f2eec7\"","AMBIT training day 1":"\"cff99ffca9141278ac17563e4bb66279\"","AMBIT training day 2 AM":"\"e7746c127559dd7ab7a1af5f8a8a010d\"","AMBIT training day 2 PM":"\"13a6b8a372008fb01fe0a8bbee3ec62c\"","AMBIT training day 3 AM":"\"8294494e688f7e1b6b17e0d1db699ccf\"","AMBIT training day 3 PM":"\"e378c36a45485c2e82987fc1072cd8af\"","AMBIT training day 4 AM":"\"145c1fee321b821e5f13508eafd1ed36\"","AMBIT training day 4 PM":"\"2b9205f3fcc415eed4855b99ef007e34\"","AMBIT usual suspects cards":"\"a7398eaabc74230cdf91de971ffc6a00\"","AMBIT wheel 2014_SMALL":"\"c9cbf4e2da52454bf97eb6d0d558caad\"","AMBIT wheel 22.jpg":"\"0f0ac35c4c660204638aebac152943b8\"","AMBIT wheel Catalan.png":"\"ec9a2154a45f5e4ed72255a3618db7b4\"","AMBIT-R":"\"3cdad311dbe37fd1f7e025d3d2b12817\"","AMBIT-R Training Schedule":"\"1231464397c24579bfb3e9895fccf456\"","AMBIT-R Training Schedule - Day 1":"\"1cd73170fea839f534992b000fda1938\"","AMBIT-R Training Schedule - Day 2":"\"aa51e9b43a4f526b084b91ffd4fba1c7\"","AMBIT-R Training Schedule - Day 3":"\"2a526c7f38266af261cd8bfe63083c0a\"","AMBIT-R Training Schedule - Day 4":"\"6a642b7df029bce24272a9613463a44e\"","AMBIT-R training programme":"\"5e4e844c6919f67c82ca758ad1ffeeaa\"","AMBIT-R training programme DAY 1":"\"e7807e55b2482c048183f2e59469a72b\"","AMBIT-R training programme DAY 2":"\"064917825c9d21b0e62a717ef65f076d\"","AMBIT-R training programme DAY 3":"\"ea8a1a620a56faf7aa108adb2eb51287\"","AMBIT-R training programme DAY 4":"\"9ec3b9ec9fc84fdd1c1fc1c43bed7877\"","AMBIT-influenced":"\"73131ccc28c0c785aae8446c2800f163\"","AMBIT: an overview":"\"0db8cb80e39c119d32d1a3f67b6da166\"","AMBITWheel.pdf":"\"c453eadaebe65a7c130269c9cddf5530\"","AMBIT_BookCover.jpg":"\"e59624123ae145df7d2239e100a96352\"","AMBITbook2.jpg":"\"c360038bebe3a55667965c4e427b439e\"","AMBITbook2_small.jpg":"\"2b7b2136e184fc796f0ca10b9430b05d\"","AMBITwheel Japanese.jpg":"\"0dda00659de6e6eeb5fbbf552bf0be86\"","AOS.PNG":"\"efbb50ec9f1adcea84234f30bfde84a5\"","APrAT":"\"106f25e3bb4d3002a006259e1a18d9fb\"","APrAT exercise in, or across, teams":"\"9245947ba742244fb4a7aaad8282b184\"","ARHQ":"\"d0aaa3ff3e5cd0273de6c67cc70595e3\"","ARHQ.jpg":"\"033aadce12cddc3c8949a34a139feed1\"","ARHQ_20.06.17.pdf":"\"ed80bd572c7964f6e7c3ebf5469618fe\"","ARHQ_WorkedExample.pdf":"\"1d4de5042ea84c9ea0c71e40e3fbdfe8\"","AS.PNG":"\"d52d990ccd3606e2e49966f2e43da54f\"","ASEQpicture.png":"\"ebb3588d8b78d33f6c6a1bc2bc84005a\"","About 'Who does what?'":"\"b5802419f76b98a7517d3af37478a0fc\"","About this Manual":"\"96314aaa9fd345d2605032079fefc087\"","AboutContents":"\"e4c167bd14ed6b8db9ac4b16c1a6dc83\"","Academic references":"\"a8740ab160e6851e1ef80ffcfa717148\"","Account of AMBIT presentation - ACAMH magazine (Autumn 2013)":"\"f3d96d327624e989440dc0aec64e437a\"","Acting Out":"\"4f8f0f306467189e00153aeb377321d9\"","Action/Making change":"\"0ecf54d961d8737a86fb1a1321c58efa\"","Active Planning":"\"805a9aa960c7f415377fe798ed7e6c65\"","Active Planning - Comparing Destinations":"\"766676a58a19a38585102784ba094e2f\"","Active Planning - Exercise - different destinations":"\"3efab1e4db3762471742d84b43ab5a9e\"","Active Planning in the team culture":"\"21a2fccb4d54612832dc6f95d7b84c4f\"","Active Planning through the phases of AMBIT work":"\"89327d3995e5a6be5e77a77859df16b7\"","Adapt your Discourse":"\"65af7eafeaa7eb4f72f289f45dc5bada\"","Adapting AMBIT training to risk support training":"\"7bb36b1ce5856036fa04436b3e51bf2a\"","Adapting to Circumstances":"\"d22c75b996486fe998ca1f95d9730cb0\"","Adaptive":"\"9d5a6c3e45fbeaa43850d2cb85657bf9\"","AddNewPagePic.jpg":"\"9fbad19213ef9cae228d0cf7f42d8d5f\"","Adding a Tag to a page (tiddler) - video":"\"6a255d489314c7217fc97b81f7192511\"","Adding a new page (tiddler)":"\"2a00123543be272232883b287cb54f6b\"","Addressing Dis-integration":"\"7dca4b301841cd4aaded0c93d96e3114\"","Advanced explanatory and listening skills.jpg":"\"2161f9f5be7edd33669d58f2175e0f08\"","Adverse Childhood Experiences (ACEs)":"\"b1bf55a4e22762afd8aa990ba5c1caf3\"","Adverse Community Environments":"\"d694a23cb0334ece86814cf0e87f4972\"","Advice about Role Playing":"\"6650f30915e819ecbd6b51df4a4ae007\"","Advice about the Implementation Plan":"\"4d5b3e0f689189af47c7a9059a59c92f\"","Advocates (mental health, exploitation, domestic violence, etc)":"\"8cf7fbcea19f504755109ab347b65162\"","Affect":"\"03004e6939a38352f0f84e1409470a8a\"","Affect Regulation":"\"98b218099994452fe70098288d1afa98\"","Affect storms":"\"87866a72a744812d30cab1c12381fe38\"","Affective mentalization":"\"d5be18262e1cca804cc62ecf589af9e2\"","Agentive self":"\"7e4c57b48fdaf36bcbe554b4d5aab171\"","Aims and Goals":"\"8a6e29825ace10e723f93858a1fef48f\"","Aims of Family work":"\"58c283e1e1da52b99d74af289bfaa899\"","Am I guilty or worried about putting increasing demands on my client?":"\"29aca9c70367eea2a3c2dfb244e7462d\"","Ambivalence":"\"26374146fc502fee6d01aaa6b284b2bc\"","An Adaptation of the Disintegration Grid":"\"5c0a2b8ef934341a3fcb4a60bb4097fd\"","Analogies":"\"d9466501e06c3cde055a3390181b1982\"","Anger Management":"\"a81b40f75bb00c86dea5827a0a6814a3\"","Anna Freud National Centre for Children and Families":"\"72f94f489d5fb4e97bb105fbb6161d69\"","Anna Oriol-Sanchez":"\"a7749570a5db69d23a76ed755cd88cc7\"","Anthony Scott":"\"23923a3172872d70ec2be93c6f340086\"","Anxiety":"\"d809879c6a7fbede8bb710dc03eb0e01\"","Are you asking people to work outside their competency/paygrade?":"\"f83170623b40199268c8e3969f186ea0\"","Asen, Bevington (2007) Barefoot practitioners":"\"1a61d2c2ff42f514af574ab17c2ede8e\"","Assess Stage of Change":"\"d150f68e030f6fd8e072b454b1f2d514\"","Assessing a learning organisation":"\"1c0f2bb73015dd1deca6568dc48fafb9\"","Assessment":"\"3bd58b498f40919466d12393afaa0195\"","Assessment for SUD-Rx":"\"2128e724d5db185a758d9b84b8eac43c\"","Assessment for SUD-Rx - Giving Feedback":"\"9f6baaa350eecd6d197b9408459b7267\"","AssessmentPhaseOverview.PNG":"\"efd80a265d383f42dd6ff999f2145ae5\"","Attachment":"\"f9289f69766fb73664fd4ac4e16ce5eb\"","Attachment Behaviours":"\"c7c9dcef359e27968c3842010a31a912\"","Attachment Definitions":"\"c03d164aa28b6cabf3a235c29d98b944\"","Attachment Object":"\"f0bee9247fc2bc19322b933fff9cf071\"","Attachment Relationship":"\"c4f07d4520134d8ed96aefa6fcb8048d\"","Attachment theory":"\"19c825321affb77046c0598cc058f5ad\"","Auditing AMBIT practice: general principles":"\"72e870154cf3bc6c195b841db7ce0f33\"","Auditing AMBIT: learning from Altrecht":"\"4bb4a6a4fca13a030031b148b9466d24\"","Auditing AMBIT: using the APRAT":"\"a3e8a8dbca35c501f49faaf4a6079c77\"","Authors":"\"ff406eb43e3502fba83a709d48497674\"","AutoDidact":"\"91cad3227e9f37e2db4db07344a9f8d5\"","Autonomy":"\"829d06ddfd90714a9b1c851c18f63458\"","Average score.JPG":"\"931f009f6233707e808d86f1c4e3a6d3\"","Awareness of impact.jpg":"\"3e86d42dac0c10054e3f77f4d1a71942\"","Bachler (2014) Differential effects of the working alliance in family therapeutic home-based treatment of multi-problem families":"\"ef9f89f3bd707b1cdb44f62914e1870d\"","Balancing INSIDE and OUTSIDE change work":"\"e79cd14015efd58056f57150ae4a530e\"","Barriers to treatment":"\"fa1504e1b43df155d0a4c56d5c1c8d7b\"","Basic Structure of the Wiki Manual":"\"8d68d03b80580c66646ceb76b7a765cb\"","Bateman and Fonagy (2009) RCT of MBT versus SCM for BPD":"\"2bbc9940f716e9684f8d5e012741c5a9\"","Bateman and Krawitz (2013) BPD: an evidence based guide for generalist mental health professionals":"\"cc770bc11fc568501f7874a3c616c4b4\"","Bateman et al (2020) 8 year follow up of MBT versus SCM for BPD":"\"111e57d7f8108e95eafaf238fdef26e2\"","Bearman et al (2010) Adapting CBT to fit diverse youths and contexts: applying the deployment-focused model...":"\"420be25f8d324950e7d1dd834854578f\"","Beck Depression Inventory (BDI)":"\"c9107fef1ba2d1a5038d1f1519c09fda\"","Beck Youth Inventories (BYI)":"\"048ad0163a9c699ae2ef9a3f480feae7\"","Before you can start a Manualizing Session":"\"4ed00b0690a828dee34ca239e1a11001\"","Behaviour":"\"a98a3182702afde054e78240b5795b34\"","Behavioural activation":"\"74bf44b4aec1a74f2af74d454fa62688\"","Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams...":"\"d5ad0bd694beb8e8f2c84e603a001987\"","Bevington et al (2012) Adolescent Mentalization-Based Integrative Therapy (AMBIT)":"\"f6d4b5a946fef1e6e9bedff762c12c12\"","Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)":"\"e1d87eaa01e713e4cd54d01f3a53e8c9\"","Bevington, Fuggle, Fonagy (2015) Applying attachment theory to effective practice with hard-to-reach youth: the AMBIT approach":"\"04ce940c28555d1efe1fbdbeddaa971e\"","Biology":"\"320100457f8cafe00db90d44fafec941\"","Blood Borne Virus Screening":"\"e2cf1ff0067583c28de4a826b9da8411\"","Book.PNG":"\"f9a326b8720ddd900cfba149207f2160\"","Boundaries":"\"b2bf6194aa5f4979df443574b41d6794\"","Breaking down tasks into steps":"\"fa037c8053950bce8387547781259d43\"","Briefing session for senior managers/commissioners":"\"fde4cb40179e160c3904a08cde767c3d\"","Broadcasting Intentions":"\"fe877dbb59b714dc52d6bcc2b91b4ead\"","Broersen et al (2020) Young Patients with persistent and complex care needs require an integrated care approach":"\"199a281d1ae6eb3f385a94962465017f\"","Building a Community of Practice - Dickon Bevington":"\"d854f31ef385ef6befdd149d37202e82\"","CASUS":"\"fe9df5d772c036b4f7ab100a9b4287da\"","CB-Principles":"\"70873f6c419b9f5762e45e40d0f6ea3a\"","CBT techniques":"\"03c585c1fe77d67025a3b680387b4a78\"","CGAS":"\"06dda3648e15f5bffa9c6dfae9edacd2\"","CGI-I":"\"35ac18ad3d412c2b23ebf7aa971f52aa\"","CGI-S":"\"4a3f1365997791ecdabf8f88b8d12ca7\"","CLIENT exercises from AMBIT training":"\"8ff10a41f2b0c1f5a4ffcf255134b849\"","CSJ (2012) Rules of Engagement: Changing the heart of youth justice":"\"3dc6be04043aefe4d061323da538e161\"","CUSS intro pic.png":"\"06ce4fb5d5d874216ba1cb26629ebc7a\"","CUSS steps pic.png":"\"a626a1beacfa8d325b27cde002c59730\"","Can longitudinal studies help us understand AMBIT outcomes?":"\"9ea961b3a8c8ed222e10b0440abd9e49\"","Can we do AMBIT without the Manual?":"\"85a78697185f708677497bd14379280d\"","Cannabis Legal issues":"\"4b4cf1cf1a9424178f300493da1c8887\"","Cannabis Misuse":"\"e3d4f5135235fb3ea68191c27e45d8b9\"","Capacity to Trust.jpg":"\"769156e0d73da59e577295239c477fd3\"","Capture.PNG":"\"19f69d878ebe032b75a5089549c99007\"","Captureembed.PNG":"\"33634a26175e65387dace7e71b8d5122\"","Captureerror.PNG":"\"63ea0f5749481c4341d7829828fcd8dc\"","Capturenocookie.PNG":"\"7eba44d7bf3b9bf96f2abded6b0affa4\"","Captureprivacy.PNG":"\"790201372da657eb4dae140f43c32106\"","Captureshare.PNG":"\"fa46e0bfe8f60d52d4dd9fe543dcc991\"","Careful and concerned CURIOSITY":"\"d4ab2c93cf80b2e63de176b06aed80e2\"","Case discussion":"\"c53bfd412c65d3bdb776a1ab487dac50\"","Cecchin, G. (1987). Hypothesising, circularity and neutrality revisited: an invitation to curiosity":"\"e627c21fef4cb304d942513d546c9f57\"","Challenge and Support in Therapeutic Relationships":"\"817559b4da39c1efd6b1a36858fbd63e\"","Challenging techniques":"\"1a501bd5c25e17c4c61e44044d03d2b1\"","Charlie Sackey":"\"4e930f1b39e5e03f2423fd4af95e49e9\"","Checking":"\"478f3b4d0f7d21e3aa74d01ef09d1147\"","Child Protection":"\"35385caf4cbdca0fae2c8c5be9224c4a\"","Child Protection Referral":"\"e3453d5db36805d32908772cfd0f2107\"","Child Protection/Safeguarding Services":"\"921d1b350814b48939b95bc324669042\"","Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application":"\"a680e8b2a88fe42a738b380e6d72e47b\"","Choosing what to measure":"\"9ae186852e58e443bd05e075678e805a\"","Chorpita, Daleiden and Weisz (2005)":"\"ac18d8b2ce52e376a807d04e08c02230\"","Circular interviewing":"\"9e301fba2d51407b076bf3f623798d7a\"","City Bridge Trust":"\"9e525ffe1eeb94d56460de99594ddc79\"","Client Case Review - Date and Agenda":"\"fdef67e14719b70dd8750a4a79256610\"","Client's AMBIT Wheel":"\"93398266ec381c7113dccecc99d8fd68\"","ClientWheelDoubleSided":"\"99f3234a286e42307f4bda89f893366d\"","ClientWheelsingle":"\"9b1dd21dde160fcdce2c531dbab49edb\"","Clinical Global Impression (CGI)":"\"63286ec98305d397ad6719f978af8197\"","Clinical Outcomes for the Wellbeing Practitioner Programme for Children, Young People and their Parents/Carers: Update Report (2019.":"\"a865538975b816c35f14a2ed81beafac\"","Coaching":"\"6859cfa44795d9c246a46d8b6f7aa035\"","Cognitions":"\"8d0e1af6416dec4dfe0cbd07f7cfb928\"","Cognitive Behavioural":"\"52f500d6b78b4067ce8ae1cf93272a1a\"","Cognitive Behavioural work - CheckLists":"\"a14f58024dc0be8b4447f3cd9fb5a777\"","Cognitive approaches to SUD-Rx":"\"f03deb78a7d9dbde55212a6f3f8c8a6f\"","CognitiveBehavioural for SUD-Rx":"\"943890cce8e349851e13647ddc202866\"","Cole, M (2009) Using Wiki technology to support student engagement: Lessons from the trenches":"\"699739a1ad75969488047e9985c8aeff\"","Collaboration as a process and an outcome":"\"5395384f342c1accfe13d426dcc79794\"","Colombo-style Curiosity":"\"1e53919868ca9da91846ad703f96427e\"","Comic Relief":"\"4c083f54121033325d7fc5d70d1f9e9b\"","Commenting - Content Moderation":"\"2d874422896345fae111260522dfa1ba\"","CommentingButton.jpg":"\"913bfe84dc068b7b72b29256648930e3\"","Commissioners AMBIT Toolkit":"\"c2b104e13d315ca0c16671291afa5105\"","Community":"\"20db78cc45f51210f791d0f1aba933d8\"","Community of Practice":"\"f2b4a953a211b56002a71d82a44b9cbe\"","Community of Practice (extended learning)":"\"2603537ef8278d1f22c79077ea17c293\"","Community of Practice core changes widget":"\"8cfa6b2a118cc248c703421584a5c6c3\"","Community of Practice recent changes":"\"784b52573f50f900b0e561b3c9f86909\"","Community of practice pic.jpg":"\"7bb5fb333d820887d825fa64803ac4b3\"","Comorbidities":"\"b3f3f1a6bb1d3889b32b2b7312bddec4\"","Comparing and Sharing functions":"\"4348bd4811d8137897647e3c3d7eb4c2\"","Competency use and importance ratings":"\"b5d492e1f909dc25b2d92ec5bcb2aaf3\"","Concrete Mentalizing difficulties":"\"ae7ea1b76cbeadf675d36e9081d80f77\"","Conduct problems":"\"46b0274ccf13378e7c78ead630fa45b2\"","Confidentiality":"\"0cd5427c713cd8aa37c74759ee94012a\"","Connecting Conversations":"\"a81f59bb1b9f75712536aac21e1a0f64\"","Contemplation":"\"c8ecfd8a6fe7f0e44e7503ec102cfa8b\"","Contingencies":"\"03904e35f44e2a7e4cad2fea3bc1af81\"","Copyright matters":"\"0cc52ee8e83eff12368de8cebbf44098\"","Core Features of AMBIT":"\"b30e96e75997d7df53d0b273923366b4\"","Create Headings, Sub-headings and Bullet points":"\"6ac7117e743ce0db6f158b5cfc335a4f\"","Create shareable weblinks to specific manual page(s)":"\"f15f56233e37b0460db3d4d507dcbbb9\"","Createnewpageicon.jpg":"\"1e203c5a22f111a25c7e130b0976f56c\"","Crisis Contingency Planning":"\"e6f2b3b09b93df28f7a74de50a681b06\"","Crisis Pathway AMBIT Online Training":"\"810c188cc47ef863f30b2a17f6fff7b0\"","CrisisServices":"\"db8496f198aedcd9d7c2ad51d897b612\"","Criteria for inclusion/exclusion of CONTENT in AMBIT":"\"fc573ab7613101092670f0e6612b2cf8\"","Cultural Context":"\"524d4d7c75e0aca32d3e4a7c2699adaa\"","CultureOfHospitality":"\"6aea118d8587aa83cc8dfa2f88938903\"","Curiosity.jpg":"\"6650f6395d02b6900fb434421b9824a8\"","Current Research and Outcome Evaluations in the AMBIT Community":"\"828f4ede4bfb5ddfc6b1052e9d7339ac\"","DOMAINS and LEVELS of dis-integration":"\"373c99c3374a3bb03772a8a2471ff84e\"","Daniel Kahneman - mentalization and the value of doubt":"\"c24805a47c23b56676e1272377f067ee\"","DataSecurity":"\"04c4872f737c9ee591ab6c0d7d5dab68\"","Daubney et al (2020) - Outcomes of Assertive Community Treatment for Adolescents with Complex Mental Health Problems Who are Difficult to Engage":"\"e1b46f646e2136776c9084fd1a155f20\"","Deciding what to Manualize":"\"bfce837cc3cccd1a9d0321ce5c4c1c52\"","DefaultTiddlers":"\"2245f7ff16a37c29c044520637f91201\"","Definitions & Principles of Motivational Work":"\"008902bd1ef722d64d4c70338dd02889\"","Delusions":"\"fb498940b020a50b613e8fc46d18e213\"","Depression":"\"95b4900401af17aa49e9511314eac2b0\"","Develop Discrepancy":"\"386fb904d10c607b0e57e075c7cd654e\"","Developing learning organisations":"\"78520bc4db3d23e80ee883e95fafffd4\"","Developing maintenance routines":"\"55f7a0dbcd1e1dcaf7a3e9d1c8d0a91b\"","Developing measurement of engagement in AMBIT":"\"30778dad61f67280a807f6534af175c3\"","Development of Mentalization":"\"de5a7d1922be21d571bf04f89a0fb8c9\"","Developmental Considerations":"\"4158b0af98f14a6f7796b90cbd98b7c1\"","DevelopmentalHistory":"\"a55d4eb79bc9e7edd1cfc898f3866abb\"","Dgrid.PNG":"\"0c26a6da5b925e760e073f8d6c93a44f\"","DickonBevington":"\"f145d8dc7bc5e60a902ace0a674221e8\"","Differences between MST and AMBIT":"\"c817d647e0be5996817c498a0f8cbc38\"","Dis-integratedInterventions":"\"dc73559b62aabeb29e92e3f65199b690\"","Dis-integration":"\"b39b164e7fb8bb73ef65da987a183eeb\"","Dis-integration Grid EXERCISE":"\"7d74ed1808358538b537fd5998df5058\"","Dis-integration grid":"\"01ba783f07f3918d0c11003dec9a117f\"","Dis-integration grid - Local":"\"6c82b0a8071851560e8d3ef971ecb4ad\"","Dis-integration grid practice":"\"e48482c29c57120d8d68a63de5b7a17d\"","Dis-integration pic.jpg":"\"410591d107d9adc892b872739e8ffc0d\"","Dis-integrationGridPicture":"\"aef0800ed0a943037527b60a4ad39573\"","Dis-integrative processes in a Family/Systemic context":"\"e0fa7b22a98c456a03130d4af10c816a\"","Dis-integrative processes in a Multi Disciplinary Team":"\"97b7d9d35ad3748b882470a66ac77aff\"","Dis-integrative processes in a Multi-Agency context":"\"edfd4ad8ed19a662c581c8841d695ba0\"","Dis-integrative processes in an Individual Clinician":"\"bf1d6270fd43721d4d89f655347c2540\"","Dis-integrativeProcesses":"\"0d17d935408ba190ba7e21cf6ab2df53\"","Disclaimer":"\"ac462f6eb61b1e699188684f85eb1751\"","Disclaimers, Security and Authorization (Licensing)":"\"d941f369713220720738dff58d82e169\"","Disintegration in networks: respect for local practice and expertise?":"\"872a58b2b0bd97c668cd513a7ed466e6\"","Dive Boat - An Analogy":"\"477cb927b877df6560b54e3374a2a302\"","Does AMBIT contribute to reductions in institutional interventions/care?":"\"0b74e5ce7f020fd3ca6330440fa460b8\"","Domains":"\"2118b7e36ee41c4aac4f68009b55046b\"","Domestic violence":"\"9134bd3638e0812a48151e2c66734ff3\"","Downloadable Resources from Training":"\"0ccb5c41d6a71b03b45932a61a83f1cf\"","Draft of 'AMBIT implementation questionnaire.pdf' by brionyrandell":"\"477f069094778c82c710045aeb5533fd\"","Draft of 'Home' by brionyrandell":"\"8ee09acb296b22fe1f359f631130164a\"","Draft of 'New Tiddler' by brionyrandell":"\"fed3d4aaea525ff2d0f1ab48ad6601de\"","Draw my mind - Mentalizing Exercise":"\"0772ed5a05754c9427b6e5a788fdce4b\"","Drawing the AMBIT Wheel":"\"a15ec2cef8bfd4deded4ea22f7577241\"","ENDING PHASE":"\"a70f68284021ff87708f7b5ccdfc4355\"","EXAMPLE of a local training session":"\"998575e022bdaec9478561df0fc4d810\"","EatingDisorders":"\"0e4db133241da13ca055dddff6fe8760\"","Edit 1.JPG":"\"7c8b15701bfa1ea4531a65aeb44090db\"","Edit 2.JPG":"\"cf829ce3c5e649ee29e33fe04c749471\"","Edit 3.JPG":"\"68902e151d90ea72246dd7ce7f981d9c\"","Edit 4.JPG":"\"356969cdc11050d9948cef4b17cad0e3\"","Editing - Difficulties with Saving Pages":"\"dec9f8696d751b2db07efa41ba77291c\"","Editing and Deleting existing pages (tiddlers)":"\"096d23638f5b8b97543fdbf4417dc715\"","Education employment training":"\"f0ff445ad246457f5acdd80dfa934d2e\"","Education-Vocation Intervention phase - Example timetable and Flowchart":"\"e8575cc30d212926c65b78e2f440e3e1\"","Educational-Vocational Engagement Phase Flowchart":"\"997d88479493716dd03e6033f9b0ac7e\"","Educational-Vocational Training":"\"85b4d80e97fa4c64d34f8c064f1fed63\"","Educational-VocationalComponents":"\"26866001092365c1e34da2c96a802ce7\"","Educational-VocationalPrinciples":"\"d062509c63102d3b1cbb272258e79e94\"","Educational-VocationalStructure":"\"d14fe38b9575fe2dc5c8182f417f3de7\"","Educational/Vocational centre":"\"9847518b7ad77d2460e3e4d09faadeb8\"","Egg and Triangle - Local":"\"4122f10071f319bdd1ebd5eb12a07020\"","Egg and Triangle.pdf":"\"1505a609ff9be82a46bc8aa6ff2d3103\"","Egg and triangle (marked)":"\"50053617f688d1e4768e8b82d665b52e\"","Elevator Pitch":"\"0ec21881ff6fb556fba3ce42801a04d2\"","EmergencyProcedures":"\"039347fc3ca4bd56ae234f76980a239d\"","EmergencyResponse":"\"dd76c434524b9d6c57494ef6363b4de8\"","Enactments":"\"7bde5f92b6f06456c3ae8949b8a988a9\"","Ending the work - building networks and links":"\"3e50e853eb8465b5ae4cebf7e988049a\"","Ending the work - report writing and professional communication":"\"47429b27b2a5e09f3eb648b58b9a3f33\"","Engagement":"\"59fc8987bea946d8199034f5e91fa126\"","Engagement call":"\"789fb59bca5c0d0330bcdb2b3e146920\"","Engagement techniques":"\"b7720e9628dc83522072f720e1355891\"","Engaging a team in Outcomes Measurement - Liz Cracknell and Carol Evans":"\"966b5dedfaa83f5059a23335ae796c52\"","Epistemic Trust":"\"0c4a968022000f38c9188e6802d1b830\"","Epistemic Trust image.jpg":"\"c31c00a9c23ab3a53e34b8d1b940f113\"","Evaluating AMBIT trainings":"\"c59903a7ad82f43be7d0cf2ed76c3f9f\"","Evaluating outcomes":"\"4ebf20cbb3c284c73ce661a6572b6f1b\"","Evaluation of Thinking Together in Donostia/San Sebastian, Gipuzkoa, Spain":"\"86a10b0bb5c5f11dfab805c52771226a\"","Evidence":"\"5236213d3ab6fb27565833d3371362b8\"","Example Google Doc Link":"\"909f5a511f3a085300868bdb5d9f3ab2\"","Example of Manualizing- Making a Cup of Tea":"\"e9bb03560663a7a65ab7f968d73f04f0\"","Example timetable during engagement phase":"\"7991f457a157ffeebe10085a17d1445e\"","Examples of Mentalizing Formulations":"\"705ea001f68a275cde5f4c473a5ea407\"","Experts By Experience":"\"65c9d1c9fd4895e11a3164909a0f28a6\"","Explicit mentalization":"\"0026a1e971d69868c01755fe5fbcb9ba\"","Exploitation and Substance use":"\"040e874d77619f2f19944ab384bfd344\"","Express Empathy":"\"f276b967f257678bf672b7978ad12eb3\"","Expressed Emotion":"\"0ca6cee71475b081a4fb7f5fdaf5bd2c\"","Extended learning":"\"972c23ab75b9791b906d1e54dacf414b\"","Families and Engagement":"\"ca875933d6f3d2d307ea854a8e57fc8f\"","Family":"\"dc1675720e028fc915402e6a670ec0eb\"","Family History":"\"8aca8a042248cd0ff6184ab8f1e9654a\"","Family Informal Network Members":"\"40f2f478bd9046b176902029feed1df5\"","Family Life Space (Genogram) Techniques":"\"147836367d9a6f712187ca688bbc34ba\"","Family System Mentalizing diagram 1":"\"ec521fff5eef1bf6722ba1c74df81c89\"","Family System Mentalizing diagram 2":"\"018000e85ef5232a84a5032f6766ce7f\"","Family-Aims and Principles":"\"e4efe033398ade5a693ab295a2941e17\"","Family-Settings and Arrangements":"\"6e4d17d15f5fcacb99f1fa39e1048a2c\"","Features of Successful Mentalizing":"\"7b44edb594a66344935a6cea0e39735e\"","Features of UNsuccessful Mentalizing":"\"fa5390cb3153e03c767c92759d7fc12b\"","Features of mentalizing: awareness of the impact of emotion":"\"6cfc4ab88e8cd2615b57d4effcd6dc35\"","Features of mentalizing: curiosity":"\"9fab698bbafa4a414d5374f78d882961\"","Features of mentalizing: knowing that minds are opaque":"\"a4a2b482ddb182546ed2124480c54c09\"","Features of mentalizing: narrative continuity":"\"ac474ea3883c8ab7515dffa369ab8893\"","Features of mentalizing: perspective taking":"\"96055720d07a683cf1c968af719956dc\"","Feedback on AMBIT Training":"\"54ae7c30ad27eeb8a712af738d74416c\"","Feedback please!":"\"da5aca097ae3afd27db7dc0ded79fc3b\"","Feeling":"\"4b34e448696a9e1e4fb82e6447d243fb\"","Feeling Spinner":"\"6413094ff7129d06657a21f57a86dc3e\"","Fillers":"\"e50b15f9a0fa36fec52143e0914de58e\"","Find a falsehood":"\"58e8291b276aced59706e2e7546eb9cc\"","Fishbowl discussion":"\"9973a85a6d4abbffe97050892aec1a9d\"","Fishtank film clip":"\"08e3751b90232c0713813ef8717c0bde\"","Fixsen's Stages of Implementation":"\"73ff3c62e2de82a3ca373f82fa0b6dde\"","Fixsen, et al (2005) Implementation Research: A Synthesis of the Literature":"\"48f848439e197df67fc7496da61b7b25\"","Focussing on Strengths":"\"7c4a8cac6487f1329a6f1a3356a2ab79\"","Follow up interviews for AMBIT teams":"\"0883da032a9ac10a143c539c789acbb2\"","Follow-up training for established teams":"\"50fda4ca72eb8e57a00b1214d6a4bca7\"","Fonagy et al (2018) MST versus Management as usual (START trial)":"\"14dd174f061c9d0d3f95f55f80ae392e\"","Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom":"\"abda23877b7e7121019d886b185783cd\"","Formal supervision":"\"1021fa714be8b4eba9de4caedb223de0\"","Formatting Pages in AFNCCF Manuals":"\"4a2ac1aef03d9ed5cdbec5e2436652a8\"","Formulation and Treatment Aims":"\"0556fd5c0ef25c1fa8479976437997ef\"","Four corners - Training Exercise":"\"f4045caca865bb846bebb74212c9bda6\"","Fuggle Fairbairn Fonagy PDF.pdf":"\"0d6d9002807dbbe5e2aacdde96151939\"","Fuggle et al (2014) The AMBIT approach to outcome evaluation and manualization: adopting a learning organization approach":"\"41a470c8f5d28fe8f2bb8913571d3458\"","Fuggle et al (2021) Improving lives: Not just saying no to substances.":"\"24bc86f3eb0050afa2e2417c3f2a3f60\"","Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach":"\"5299a7c8159ca23257e6cf80e5d55403\"","Fuggle, Talbot, Campbell, Fonagy, Bevington (2023) Adaptive Mentalization-Based Integrative Treatment (AMBIT) for People with Multiple needs: Applications in Practice. Book, OUP":"\"09b09326098819340433a05a555936cc\"","Further reading and resources on Working with your Client":"\"89880217c87c4b4d5b388100b94c3e24\"","Further reading and resources on working with your networks":"\"d1c733b92ff564a311b2b596d6cfe898\"","Further reading on Learning at Work":"\"9ff792b445f3639002acd6d9314d0a0d\"","Further reading on mentalizing":"\"27e222df118bc1acb4fb2414f1612d57\"","GHQ-12":"\"a5842aa958ae6e1fc47e7eeb86eb031e\"","GHQ12.pdf":"\"38d90dc7da5c9ed2b652f73b0d76994c\"","GUM":"\"3346458e25bed1ab2fe44c64c9ea45e2\"","Gemma McKenzie":"\"cc979f5c645f66aeaead8b6a6398126d\"","General Features of Unsuccessful Mentalizing":"\"fe23a3ae243ee11eabba6563075fc43a\"","General Systemic Techniques":"\"a6a320924a4cf85583c8480662721b25\"","General features of a \"Mentalizing Stance\"":"\"88a8e653d5427292d75bad45f28ac42a\"","Generalize (and Consider Change)":"\"d6832c28802a5fb2d167aef139086a8a\"","Genogram picture":"\"d2ca0ec0583f05f4610b55a9c46fba7b\"","Gergely, G (2004) The social construction of the subjective self":"\"ca425fbf4f798603185b7903d5197c53\"","Getting started with CBT":"\"6ff15bd480cb610c3f7a2ec0a43bc67a\"","Gilvarry et al (2012) Practice standards for young people with substance misuse problems":"\"3e999280b03c7608e453e0d27f89857c\"","Giving Advice":"\"697ad4991250e93c4db494ba0d66426a\"","Global Assessment of Function (GAF)":"\"2a2ff7cae969d71897d2c5f2ead42837\"","Glossary":"\"79996f228735606f5e5127138ef7451c\"","Goals-based outcome measures":"\"589c9d3deeca5071f736d33f86716293\"","Governance":"\"89fcac4de8b0396c62b3d1d151635451\"","Graded Exposure":"\"93040d7b85e8e486463519ec3bf99dc9\"","GreetingModal":"\"2e5d4f551adb272673959cb39026267a\"","Grid Pic.jpg":"\"b51f8b43a92093744f709c0bd3b28f0f\"","Griffiths et al (2016) Evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 CAMHS":"\"876e46f3c1345ad6ded6b61277df7d6f\"","Group Work":"\"4ec6d5094172b828c36f2b2ba08534b0\"","GroupworkTabs--1450484460":"\"cefa19ab99e99893c25590a90965e2d2\"","Guidance for Teams Considering Applying for Training":"\"ecd1d1f96cf7674300095d417ffd34d2\"","Guidance for teams on selecting people for local facilitator training":"\"bb834faf030a795db0bdb5bb4aacee9b\"","Guidelines on how to edit this manual":"\"5f7ed5bf471a11db1e131eb84373310d\"","H-CAMA":"\"ec95ad4c8d5b5bf716bef8741db80fd1\"","HEE health education england logo.png":"\"0eaea154218bf801124caef82a5d83ed\"","Hallucinations":"\"9e68058572918c9e130c820a05ede581\"","Handovers at Willow Vue":"\"5cce2c9cfd9fa15273f3f1863066cc12\"","Hard to reach":"\"737b52d5bafbb2315717a651535634ad\"","Help seeking in teams":"\"4125d722c14d725d915ce869348fb5d1\"","Helping by Edgar Schein":"\"a4e8cb23da4b3279ed4cd85170e84576\"","Hidden, private or implicit theory":"\"7ad6daf865ff84e0687fb72a57240b7b\"","Highlighting and reinforcing Positive Mentalizing":"\"85d86174a52209a53f72d21b8cc0b139\"","HoNOSCA":"\"50a998efadf821daf93751a048d92cad\"","Holding the Balance":"\"49867538e9a6f871b0c8c25910057735\"","Home":"\"c67d0289d16bf45d7c06e29b6f8c387b\"","Homework":"\"2bd42ccf3a70a9575409c7d49f84fa95\"","How do we as trainers keep ourselves on task?":"\"d8c022fc5ed05a27fe79886d8ffd8743\"","How do we help each other in this team?":"\"a099a7d287252bb4a6cff8dba70f1146\"","How do we measure whether our team is DOING this?":"\"11ead1824968412c8de2199751b49d66\"","How does Mentalizing relate to children with Autism?":"\"d2da1d6ce7e9f99b542015a6eb9815de\"","How does the AMBIT approach fit with our Service Priorities":"\"422be773a8e6e8121bd895a3c4d81f51\"","How long should we run trainings for?":"\"4cea1d095abe8f16515edaafbac8a637\"","How much time have I spent with this client?":"\"56377ef70e640bfaa56c3d467e854e45\"","How teams support each other to mentalize - Unconference Conversation, 2016":"\"996bf8aabc3ca8be5f38158780faa093\"","How to ADD into what is ALREADY THERE in your manual":"\"c5e803d686b8ccda4ca26beffca83c26\"","How to Change the Manual Title/Icon":"\"e426996fb804f2a34dfd58803ba748d4\"","How to add HyperLinks (external web links)":"\"889c8a39ba5afd79c770ac6de0a06d62\"","How to add a PDF link":"\"f39cb79e2f10bb70ad3d5888219abe53\"","How to add a document or PDF":"\"11bd037889681f7ca3a8e848f411da96\"","How to add a picture":"\"ac0b64015dc718271f1815f95681a905\"","How to centre a title, phrase or image":"\"d7f0b89e0f54727358e1fedf20214c75\"","How to draw up a Care Plan":"\"8d82bd728a9734cc60ebf97acd727084\"","How to edit - Videos":"\"745867a435b152674441fa4ddf9dc4ae\"","How to edit your team's manual":"\"e3b86502db4b077518baabf5a839e14e\"","How to embed a video":"\"c8e8514ac5b725e326d6e305e68ad72b\"","How to get the best out of Web-based seminars":"\"db1e38e0af79921f18be935ac55bb8e8\"","How to run a team manualizing session":"\"487b8e70be89e0ba024b6ee01ddd92dc\"","How to speak to a DOCTOR":"\"2c2dc65aaf8ee65d1b27a6cb44a430f1\"","How to speak to a NURSE":"\"2258a2023d127ba9a902bc85d2d61730\"","How to speak to a SOCIAL WORKER":"\"0d124d0f38c3d5048f1c99c1a8276df6\"","How to speak to a...":"\"a52601d8c133ff7601997d24fa4a11ee\"","Human Centred Design":"\"6bb6c95fed29590a3cac158667f9e15d\"","Hypothesizing":"\"8296d6b23505b86ca84b2f194233c40a\"","I cannot relinquish my statutory responsibilities to do this AMBIT stuff...":"\"c10dbe020b257e6bf6a1e054d0c0cee5\"","I haven't got time to do this!":"\"6f43a9336ac6e7c4d0b4bbaf7ff1ad98\"","I'm stuck: what next?":"\"6a9a85b7cd28f84fcf1409be89d086f9\"","IMG-20171023-WA0000.jpg":"\"fc226b4bad6a1a8c9762ef8df7833cb7\"","IMG-20181129-WA0000.jpg":"\"aa12cab27bebb8e09b88916616a63619\"","IMG_20170802_151123.jpg":"\"50c2850e694de2aa4795421503c0fbc3\"","IMG_20170802_151345.jpg":"\"93b419cd7b5a760c05595bd909f319d8\"","IMP":"\"fbf45448d4ecaccb489179a9d930daae\"","INITIAL PHASE":"\"f1820b9b24fffd741af374ff69c7cb6b\"","INTERVENTION PHASE":"\"0520fd5fe70eea6bdac46bf5807fbd28\"","IPCimage3.PNG":"\"dee8d1811ac26316564d18680a6fa00d\"","IPPA-R (The Inventory of Parent and Peer Attachment—Revised)":"\"8c7ee571e732bb14a0b5da4952c53285\"","IPT":"\"dc1c26bbec6e48ed033dd7cfd3f84305\"","IPT Ending Session 6 (30 mins)":"\"348b3157bec0f40abfcc7f3069023c06\"","IPT Session 1 (45 mins)":"\"1f1a627ad6978ad61a67e765846af96c\"","IPT Session 2 (30 mins)":"\"6b6fbcdeb0d14230021a8ac088fe771e\"","IPT Session by Session Guide":"\"02cd84c041a871a298771b0f2664a68f\"","IPT Sessions 3-5 (Middle Phase - 30 mins)":"\"6c9a58837dbffb91a910f1a0be9d334f\"","IPT Worksheet 1.pdf":"\"0d9ccda5c88c1a14e19b05175b2daa10\"","IPT Worksheet 15.pdf":"\"8c29d0addb7294805203e807425c3bcf\"","IPT Worksheet 2.pdf":"\"36b75ce4ffddcf09526978e996f5f498\"","IPT Worksheet 3.pdf":"\"c1cdc7cd95330e074c08f734aa227e7e\"","IPT Worksheet 4.pdf":"\"1ff3b88a974ea2cb50a9f6d07fc494a5\"","IPT Worksheet 5.pdf":"\"205a290f143e986d10a51056aa322f20\"","IPT Worksheet 6.pdf":"\"b26f22cbfe2a1b88097a267ba665acca\"","IPT Worksheet 7.pdf":"\"71da5bbc49a7ee2c3c5bfe8841c6e365\"","IPT Worksheet 8.pdf":"\"64ca2af3ed9761152cc3b822da3127ea\"","IS.JPG":"\"8707c3d30f6adf02a08cc53e7a81e33b\"","If I am the KeyWorker, do I hold sole responsibility for everything?":"\"0960923defbc6e9d0def3dc98bba9113\"","Implementation Plan":"\"5464cd9762d3ed99919d30bbd5e05bcd\"","Implementation Science":"\"78c501d42f87e7326fdc3a82be50b1a4\"","Implementation Team":"\"98cbb02ca778510b7420c8711ac4746e\"","Implementation plan template .docx":"\"f80022835151e1d4710284f779ffda96\"","Implementing models of practice well":"\"47442fb0a7110cc5a09377f63e6cf7b0\"","Implementing social-ecological change":"\"2f9478d0a3c7127fc13e7077bd332368\"","Implicit Core Beliefs":"\"7bb0ff44cff10bf1d9ee1a2199133a8c\"","Implicit mentalization":"\"5b9ed466ef818ff3a047a4c1f2783a3a\"","Implicit psychoanalytic model":"\"052bbc66378c6d7c9e8a457f661b8789\"","In my beginning is my end":"\"f87a5a0528389c646570a380e8e39292\"","Increasing 'value' in services":"\"0261c1da7eb3f82e4bc49bd7816c6240\"","Increasing 'value': the work of Michael Porter":"\"fe2221d861b73d05ede9615ee302d0e7\"","Increasing service value: the work of John Seddon":"\"4347a0fc8dd600b0f4e4f9b6bf3f47ff\"","Individual Differences and Disagreements":"\"d36713866f55edac8f6c3d70d2c015ba\"","Individual differences and AMBIT training":"\"014b9cb39fadd8c3b0ef133fe42085d2\"","Inducting new team members":"\"e55827884160b0ac3a3ef1bac2483c97\"","Initial Engagement - notes for trainers":"\"40402154a9edd1c2b821454cd32f91d3\"","Initial introductions at a Training event":"\"1b08387c3ed161d18a66c89aecd63eda\"","Inside Out":"\"bf035cd9bd3776e9847af318695abf7e\"","Insight and Engagement":"\"738ba626f056618442123ff83319f935\"","Integrated care systems":"\"545eca206e862a4001bc32f3c1bbdb00\"","Integrative":"\"b68550e4583efff65479258b630df131\"","Integrative Multimodal Practice":"\"33cdbeafecece75479e129a7771cb701\"","IntegrativeContext":"\"140b255599ac080115faf3a71f3393e4\"","Intention Broadcasting. Proceedings of I-KNOW ’09 and I-SEMANTICS ’09 - Von Kaufman, Richard (2009)":"\"e303add8c51d27b752fd931783ff38ad\"","Intentional stance":"\"fa2cec624a2908f2693d8375da8435cc\"","Interagency collaboration Activities Scale (ICAS)":"\"e3cab136271985a37725c683c790863e\"","Internal Working Model":"\"3d8e8a9cae46c759fb787c5cde9584c2\"","International Local Facilitator Training (LFT)":"\"363836f59ced3ff0f9542106a2e0f528\"","Interpersonal Therapy (IPT)":"\"a1c7e6ec4ab3ac76f98917191726a69a\"","Interpreting AIM scores: the CASUS study":"\"7657f85e9be5a6533ca5a6fd6a144bf4\"","Interprofessional Boundaries":"\"4f8107bc0d4d1b48df8370ae9721b1db\"","Interprofessional Collaboration":"\"66ad23dda93634aa983a0ce84d9716d9\"","Intervention timeline":"\"354ac2fc7f7fa8848c1ec1d78dc16224\"","Interventions (by target group)":"\"10fef2991d595dc926f0c7a3e334cfab\"","Introducing Family Work":"\"d28aa46229bda1263eee5ab369d28baf\"","Introducing Mentalization based work - addressing resistance":"\"12cccc8f4a6b27a3af44b15abe598602\"","Introducing the AIM measure in your service":"\"51db1517c1a075856c1cc38c2c61bc2a\"","Introduction":"\"145a9d7ec51c0220dbc5b4aa5f519b81\"","Introductions part 1":"\"c3d6e5085179e7455792c8a3e92839a8\"","Introductions part 2":"\"38c81a5f021e57cb4856d498561a7045\"","Involving young people in designing outcomes":"\"e074064abe582fcc8f1220635e9da9c0\"","Is 'Thinking Together' a replacement or a change to Clinical Supervision?":"\"9367eea0a70009fc742fa94cef2b156e\"","Is AMBIT consistent with 'Signs of Safety'?":"\"11871ba5e13336d5633ae5cf2c5740f7\"","Is AMBIT consistent with trauma informed care?":"\"60ee2cbfb561c55ee7b0631cc09d9447\"","Is AMBIT evidence based?":"\"2812dad632a5a951607f56887e6e85c6\"","Is Mentalizing just Empathy?":"\"29b46636fc80fa47c0ec52523e8a8586\"","Is Mentalizing just Reflective thinking?":"\"02cfbd271ac11eafba0e14a4d862218f\"","Is Mentalizing just about working in the transference?":"\"fd2566a0b632be03fe37c4da0b20c37e\"","Is my client showing help-seeking behaviours towards me/the team?":"\"2b3e734a41befe291ee1dcc3065d9f8d\"","Is there any difference between Mentalizing and Mindfulness?":"\"e7cfe2a8d835b35bdd56ec308a080048\"","Is this relevant to me as a NON-specialist worker (not a therapist)?":"\"7802447b4ea9e0633221302f681b3cd2\"","Isn't mentalizing just being supportive?":"\"ba7753223d915b0c7937e6c413fa3d0b\"","Issues that can arise when training your own team":"\"f5c8b32e4f39fa9e53e0ee922e739b46\"","Iterative":"\"a8d12ec25887ebf1a32744ded95521f4\"","JF.PNG":"\"63b6a3c769602650a3e354d4c721f041\"","JW.PNG":"\"946d9e6438a3ac5354ea62e1da83a205\"","James Fairbairn":"\"e2043d75c5cbb5a03c9fdb40d560c262\"","James Wentworth Stanley Memorial Fund":"\"2a3e81be0ad93008dbba7a9799d0e6ae\"","James Wheeler":"\"0343a005f009b14527ef2bf672ce0f8e\"","Jason Shaw (2013) Developing a Hypertext Educational Environment using TiddlySpace":"\"b2dcce3d518826466731e91ccf4a39eb\"","Jensen, Bo & Vilmar (2021). What is behind the closed door? A case illustration of working with social isolation in adolescents":"\"0bce2259e0185260e0e6cd5dccb6af07\"","Jeremy Ruston":"\"3f50a8de85b1cc46547cb553a56d43b0\"","John Lincoln":"\"d16e55f32103becaf4a7bda65eb755bc\"","Johnson, Baron-Cohen et al (2005) emergence of the social brain network":"\"051e42bdc12c121e831d908710c7c3ec\"","Just the facts":"\"14c83ae98c5f93abdd21e519712982e3\"","Kahneman's dual process theory and the impact of affect":"\"5fbed712e6b8f9415bcd8ba538ba6d90\"","Kaminski J, Pitsch A, Tomasello M (2012) Dogs steal in the dark":"\"8e56794ed0f9a2a3c82494fbee2a356a\"","Keeping Your Bearings":"\"7ef6d7b032cfb4f0985595b046f18d02\"","Keeping secrets/different levels of disclosure within the family":"\"12cc53d665e015e00caa650e6984e11c\"","Key Problems":"\"aeb2004e2cc67e16002cd410fbb3d898\"","Key Worker":"\"97e3af0ec6c67e7aff0097167c3d3803\"","KeyProblemDefinitions":"\"c93a4abd775a292ba8eb0176419f2a4e\"","KeyWorker":"\"b0dddbf0c1848fcb76790f405756e979\"","Keyworker well-connected to wider team":"\"2b54ca378f497a1be5581d8f5b3f1e22\"","Kolb's Experiential Learning Model":"\"c4a2c52f88bf7e9af983de0194c3ae35\"","Kolko and Perrin (2014) The Integration of Behavioral Health Interventions in Children’s Health Care: Services, Science, and Suggestions":"\"3e2d9613952fa5345c084cb07fbae965\"","Krueger and Glass (2013) Integrative Psychotherapy for Children and Adolescents: A practice-oriented literature review":"\"a3839bb1e2da2b636dadd952c600e0de\"","Kyratsis Y, Ahmad R, Holmes A (2012) Technology adoption and implementation in organisations - BMJ":"\"2455dc7cb204bc4f7accd27c9bbd0578\"","LEARNING at work":"\"a026acdac0c5b0fc398f7d0847808937\"","LEARNING exercises from AMBIT training":"\"d5ca25317aebbeabab0715bff76ce3b6\"","Lack of insight":"\"530b467db8351a56daac16287ead2a37\"","Landing lights.png":"\"ba4a06e4c5c57ec2980efa93cc0586b6\"","Laura Talbot":"\"c4dff96fcb7b4837ae9b04a609942c19\"","Lave and Wenger (1991). Situated Learning: Legitimate Peripheral Participation":"\"891ddc76e3449639d5ea7ff9acc7cd91\"","Learning - How do you engage young people? (Unconference conversation 2016)":"\"dffde1cb5e2b3bee598b80f0a8fd337c\"","Learning - Making Manuals easier to use (Unconference 2016)":"\"a0eddd77039b8fb638965aca17526746\"","Learning - Outcome measures (Unconference 2016)":"\"c993506367b48a6b0b338ae5b77ac6b2\"","Learning - Working with young people who offend (Unconference conversation 2016)":"\"f7271b61c1460a1799eff80ead2b3dad\"","Learning Organisations (further reading)":"\"930fb4e7fa2486699c6c226640f99d15\"","Learning about AMBIT":"\"08a9fd4078e8135fc17e97d40114ed2e\"","Learning about Addressing Dis-integration":"\"19a4202bf616a391598b3a677dbc872a\"","Learning about Supervisory Structures":"\"9138f959d70a1c69f81a6c5b7da39866\"","Learning about Team Learning - a discussion exercise":"\"dfb0bbc40294f7d7ee86f2833cd248ef\"","Learning about mentalizing":"\"96972798c14aa0a5d71ece1e6c8ec877\"","Learning at Work Tools":"\"23b5e185a1ae2db9f459253d6e845368\"","Learning from the ASEQ: how do teams rate themselves before training":"\"d5e31927b4f8628a0ea5ba561ed9fd11\"","Learning survey":"\"adee718b172e46152943170cc486de21\"","Learning survey responses":"\"a039a79a32128cf4440f986adb150040\"","Learning through outcome measures":"\"eab3f3327c07d12bc3c60f38df0b2c2a\"","Learning- The mentalizing stance (Unconference conversation 2016)":"\"9ed5aa76714952a07eabe3c398dd6c1b\"","Learning- Adolescent states of mind (Unconference conversation 2016)":"\"de436f782e16c61b53a15abcb6914d98\"","Learning- Barriers to help-seeking in teams - Unconference Conversation, 2016":"\"6ee56995be995870a123c6d564a372c7\"","Learning- Does AMBIT work? (Unconference conversation 2016)":"\"4825e158494ce0333523a9d94cf6df1d\"","Learning- Fitting AMBIT expertise to the expertise of others (Unconference 2016)":"\"59150c47015c7de6092f7e8f6a9cc773\"","Learning- What is mentalizing, really? (Unconference conversation 2016)":"\"ebe4096dc5b7c2ab24dd3b411cfd8d5b\"","LearningContents":"\"93488f7511c6b5393957ab406a73b788\"","Lecture and discussion on Evidence":"\"598d9ca5b5272f6d3f8d7e452d564b6e\"","Level of intensity":"\"3dc3885780e604191e771914901d419b\"","Licensed":"\"64632df3777fb8ff3656d063938a28fc\"","Life practice":"\"c0e26520bc2572e3bdc593ce640ba908\"","Line-ups - exploring individual differences":"\"1da7888970774738b549ebf766913318\"","Links":"\"05b52ff9550bf81e01a61aa97b9adbb4\"","Littlechild and Smith (2013): A Handbook for interprofessional practice in the human services":"\"027a3c7355c943594fbac5f1526b2830\"","LivingSkills":"\"33acc30935b6e98658dad65611d37da0\"","Liz Cracknell":"\"071919f6bffcb29539cef3ddbef54b63\"","Liz's buttons test":"\"e2cf5691693e138c4df9d6ded1f88a3c\"","Lizpicture.jpg":"\"a6f19cda48bcfe2fe13de77e0ddc1c50\"","Local Facilitator Training (LFT)- training model":"\"d6703e9927fdb2459f98411baccc66b4\"","Local Facilitator Training: potential barriers to achieving training objectives":"\"8306bb43e0bd92c724797d50940087f8\"","Local Facilitator implementation plan template":"\"59c4e9e1ea84b7a74ca7d09f87830875\"","Local Manualizing Tasklist":"\"1ddba096e2804f002b8c1110fddbaa7c\"","Local Protocols":"\"faf08a583238f54473ad3f2de5c6687b\"","Local Session 01: What is AMBIT?":"\"479709534e7bc0a269f32a2a9f28d813\"","Local Session 02: What is AMBIT training for?":"\"bc31e563115592b4fc7a7fd44ff8782e\"","Local Session 03: Mentalization":"\"1f15e4f06aea7ff81f44b0e731fd0484\"","Local Session 04: Working with your Team":"\"38f20d9d5e5adb56641ce6bf8de933ae\"","Local Session 05: Working with your Networks":"\"ee47c6852086da38889a43f45b2eebc1\"","Local Session 06: Working with your Client pt. 1 (Mentalizing stance)":"\"879a501ff8ef6aa0445b908a89b775c2\"","Local Session 07: Working with your Client pt.2 (Excluded/non-standard help-seeking)":"\"a1895a60af037ad4e796fd5f7f012543\"","Local Session 08: Review (1) and Auditing Team Practices":"\"c182326a8552d4c935a4e65bd23b59b7\"","Local Session 09: Working with your Client pt.3 (Outcomes)":"\"f88b5739c49cd7289468232e47e7edf9\"","Local Session 10: Review (2) and Top-up plans":"\"14f8433f4fcb5034f53b80a7edfc7dbf\"","Local Session 11: Making a real difference - Implementation Science":"\"45aad715a5230cd16ba0e256fdf5cc03\"","Local Training Sessions: some core ideas and structure":"\"d1b646cd034a5ba363ea61c8e01f4674\"","Log in":"\"ace6e85ccc12e7f944900c45cab44547\"","Logic Models":"\"b15457b514aeae34153d9e6240890b9c\"","Logic model for AMBIT services":"\"7e6a2036b367ef1d0e3e43120ed13588\"","Logic model for AMBIT training (as an intervention)":"\"40e50c3afbc9a024a8db9e88df6dba2a\"","Logic model.JPG":"\"b6c475b8614954c730fa524c9e62d711\"","Logic models training exercise":"\"437f39f4c847c0e0a0bd1b72a677bb50\"","LoneClimber.jpg":"\"90fa7f9a5e7381116bb03374430825b4\"","MA.ICON.PNG":"\"515845c08313761a4b732f1ff731ac82\"","MAINTENANCE PHASE":"\"8d2b0099942021c2475cdae46c74d227\"","MBT - mentalization based treatment":"\"fd0264917c9287627c1091e813820a27\"","MBT-A":"\"1f19ff59e426355766fbef0449e772d3\"","MBT-C":"\"45585f49a1c9d8588865f3962a1ba60a\"","MBT-F":"\"b3b694c5d6f5f9f72de88ee739bbaa63\"","MP3's are like thoughts":"\"280dc97199ba59a30eb915d9fe6c6205\"","MS.JPG":"\"b985f5e79a50dfe7a9274d86fc220487\"","Maintaining Mind-mindedness":"\"62e2d0c2ee2eae73f980b3602bb10c63\"","Maintaining factors for problems":"\"98bba1034058232476024757ea50faad\"","Maintenance":"\"af36b39f56ffeb0df91f720e8cd23c5c\"","Maintenance and the Recovery Model":"\"f6738990c8b20eb446a1d40a46fbecd8\"","Making plans for change":"\"440a0be407c3db8df29e5e3674aa16d0\"","Making zoom recordings":"\"9298b7a3bafef4742995a1be00a50b32\"","MalalaQuote":"\"b26ef05282006bc92fa8ea48c80c5ada\"","Manage CLIENT RELATIONSHIP":"\"26e7079c6138e65f1e14bba81cd9e6e7\"","Manage CLINICAL PROBLEM":"\"fcf80ea5c49e07d918a4acb13bc79e32\"","Manage Violence":"\"a9d5e1c427a1f1e3435962d39d6ac94d\"","Managing Differences of Opinion":"\"4d6787b9efd0024f68abe56bd964e22c\"","Managing NETWORK PROBLEMS":"\"be7a874671263bd6a20cbe6244f39279\"","Managing Risk":"\"d70df3c2d1a01cc5ce274eff3f452911\"","Manualization":"\"408d240ed5fbb9e914b5d4c54ead354d\"","Manualization Boundaries":"\"609bd905641ed32f6e6a32203fdde42b\"","Manualizing a live issue - Garry Richardson and Heather Tovey":"\"531e7f4817bde3f78155938d22da4009\"","Manualizing exercise":"\"4e69debc2791f8de3b77412b0a190ccb\"","Manualizing the AIM Suggested Interventions -18.11.21 - AMBIT team AFC":"\"8045874f689b020f7b5c3c07620583e5\"","Mapping social-ecological needs and goals":"\"bde2118d899c0dd662157bae30f4f6a4\"","Mapping social-ecological resources":"\"8476db6833b39f4d8007c116b893f053\"","Marianne McGowan":"\"0be7eb8927fac76f400afc161f0ba04d\"","Mark Dangerfield":"\"9799d769d9274aaa63b006a9fb56ad11\"","MarkLocalEdits.jpg":"\"145e0a3ab9795e893c0d9c68d9e7710e\"","Marked mirroring":"\"1dc032d3bc681cc4275d9be6c6581ade\"","Marking the Task":"\"20db36f55f2264693a8734db794a56ec\"","Mary Target":"\"f730dabde4474f191a0028986f491c06\"","Measuring progress against objectives":"\"40466b0fcf61b4794f48104bfce5691b\"","Measuring recovery and reliable recovery":"\"474da22791e6eb59b552793aa60bf7e7\"","Measuring reliable change":"\"27f4f61749f0c040ef8887542874b5a7\"","Measuring the Impact of AMBIT Training":"\"47014ef15454f71deac8b133d8bbd179\"","Ment_Table_Stance_pic":"\"4b1ab4297653aa8ed2cfdb51d791c62f\"","Mentalisation based therapy (MBT) - a video example and theory":"\"04b03295752a9855321e4fb82a998bbb\"","Mentalization":"\"715f6cf9b4d2c750e6ed6c0a978b0360\"","Mentalization Based Work":"\"6ff6ac01ba3d7b08e0868230e1c1cd6a\"","MentalizationBasedTabs-211931686":"\"812ce2477d6e3b30b6d9b8890eac775a\"","MentalizationBasedTabs-461546670":"\"9ba92ff65a759a3545bc18f607da960a\"","Mentalize":"\"5629307f1eba8bda4902b7f4d6295edc\"","Mentalize that!":"\"60ff7a493a3c02038a8213527c40b21a\"","Mentalize the Moment":"\"aad161bb46e4b96c0dfc51c6f8eee3a2\"","Mentalize us, your trainers...":"\"ba3372c3000cb2b228388d4ea5c87173\"","Mentalizing":"\"da5d282f8cfc543eb86ef417550b5b00\"","Mentalizing - common definitions and quotes about it":"\"198cc9dce6bc4e3883e16eaafd70d13c\"","Mentalizing Levels":"\"295684cb739c5f80a7d3ad23bcd38147\"","Mentalizing Loop":"\"4e3fbbca21115dd0af49091ad8451722\"","Mentalizing Stance in Family Work":"\"a76768b261c21cd4110eb3143c04b486\"","Mentalizing Therapy Techniques":"\"bab32348057a1b1ba72300e24620d4ef\"","Mentalizing and team learning":"\"5db95f9220ca9a3db8f0e9c83a911f84\"","Mentalizing in Psychotherapy: a guide for practitioners":"\"c51aedc39e7b21786209ae5d105067f7\"","Mentalizing service barriers":"\"4532815d186efc85d45876ed7098844e\"","Mentalizing stance- manualizing exercise":"\"b5f42356a8f1c6724aef63916eee553a\"","Mentalizing the Moment (in Thinking Together)":"\"79c8803993f0eb27f198dd74af7b59e5\"","Mentalizing the Moment (in the Mentalizing Loop)":"\"45bfbfd504388398990ab8c1182bcc83\"","Mentalizing: a summary":"\"d1aa176168ab96608eace8139a0df430\"","Mentalizing: what it looks like":"\"1c3ca295852120fc642daa2f50c1990b\"","MentalizingLoop.jpg":"\"0045edceafd4c2631fef7ec261f20b03\"","MetaTeam":"\"93904b05def89ce7069ca063fd700094\"","Mind-Scanning":"\"802d041209794e42e9e2dc03a83500d2\"","Mini-PREACHY":"\"e78c1ebcfc96482b808dc43459853add\"","Module 1: Introductions and Mentalization":"\"21ee0bcdf9790adb84a9527c3879a641\"","Module 3: Working with your Team":"\"4a84365b89b67cbd2a74c70c9122beae\"","Module 4: Working with your networks":"\"3be92edde7f9e591102b04dd8d531469\"","Module 5: Working with your client":"\"922fe1908a9e832ad434455fa35c5b28\"","Module 7: Learning at Work 2":"\"513a3fc74eb056cc1381ef30aefd20ad\"","Module 8: Review and implementation planning":"\"319b41eea0a5e369caf62c1f12fa281a\"","Monitoring mental health":"\"cae5e2ef3b66bbbcc3d48b7b5f4fbb50\"","Monthly Webinars.jpg":"\"7a75ac94bd1425f81296f58ad951232c\"","More Actions pic.jpg":"\"b473ea498e1198e3ba2e8ef896f808b2\"","More information on the AIM cards":"\"2c70781c5336d6f4d2c120769247bd3a\"","Motivational Core Aspects":"\"4290cd130d84f08281df2200917c97d1\"","Motivational Work":"\"4f3bd14b1fd678032377a273eeb2ff98\"","Motivational Work - Affirmations":"\"56a6adf8caf156c0ddc74887ba5cc375\"","Motivational Work - competency checklist":"\"96417474c6b8a3ceadb26f0fa4595c7c\"","Motivational Work 1":"\"11ff0e85c717fcf1c3344299e6963dac\"","MtM.PNG":"\"b7e1ff56c739fc4efeec94e562129074\"","Multi-Disciplinary Team":"\"72546abc6c46026f79fbd0b73d7bc257\"","Multi-Domain Assessment":"\"8abe3941844afe88f92d7d7b3f3d562e\"","MultiFamilyTabs--1718654290":"\"e46133579981a3a5d03e6fd3a1d168a8\"","MultiFamilyTabs--381715938":"\"8edd9e9c6b79a3e77c91f41ae251eb0c\"","MultiFamilyWork":"\"3a464cf7f88168db03fbeb7730d109c2\"","Multimodal":"\"0d31cfe78431df27c44b14eb74751ed9\"","Multiple interacting aetiologies":"\"756c0c6122896e5ef39bd2006da5d551\"","Mz Sharp-Bevington.jpg":"\"6ece2621cb86f2f21b1749788554db2b\"","Mz.PNG":"\"d2589c5a5519bba0a65b97c2dff21c01\"","NET-Aim-Q":"\"7533936cffc446dc912d2ccc5d43e653\"","NET-Stat-Q":"\"312cf1c81179bb09f49cd6c79cc5b276\"","NETWORK exercises from AMBIT training":"\"3f7818debc5b89fda73f2314ed65d5f1\"","NICE - Depression":"\"f7485c45bbfa08fb5a6ac1194f55a55e\"","NICE - Sexual Health Guidelines for Youth":"\"def97bbcd8873503c9872d6d7a60b5bc\"","NICE ADHD Guidelines":"\"40ff352a2c5c08034edba47a8a1c6a8f\"","NICE Guideline - Schizophrenia (over 18yrs)":"\"b908252a0d44a85f175c591c6ace6558\"","NICE Guidelines":"\"46e1c604a71180ca65b7641adcd0da32\"","NICE Guidelines for PTSD":"\"d4d9d3df11a55b5fc20cf113a276b37c\"","NICE OCD guidelines":"\"2f562a1a03f0e7679e5d5e6dea4353e6\"","Narrative Continuity.jpg":"\"d338abb6d796dfd265d8480d961e2c32\"","Narrative History":"\"e3f0e3afa3f2e6746c3b99bba1e36d3c\"","National Evaluation of the Troubled Families Programme 2015-2020: Findings. (2019) Ministry of Housing, Communities and Local Government":"\"5325e4044644444d2eb3b2ac4913f2b3\"","Navigating the manual (finding what you need)":"\"7b8c16d234cafd7195e49f8ea21232ba\"","NetworksContents":"\"5b025048c4ad14fbdf4a0f766513d8df\"","Neurodevelopment and adolescence":"\"f0665484baa376dc988a423ab1e37708\"","New referrals":"\"b426534e54fb98e9ce40cbe5bc63cf9a\"","NewHere.png":"\"ce6c0c8e03de1f61143a83587e330d59\"","Newsletter 11 May 2020":"\"3230a9560ca5deca5b1831dad6cc2a13\"","Newsletter 16 July 2020":"\"b4e6efa12f5d1b4e60ef5e828d3ffea6\"","Newsletter 18 June 2020":"\"513600bcaac8b4835d3ba54acae08250\"","Newsletter 21 May 2020":"\"0f2d0d40e9f1ec2a8566ca35432dc150\"","Newsletter 22 May 2020":"\"a8ee8afa80ca8a32922dc3ab1259e36e\"","Newsletter 27 April 2020":"\"5989a2c270ddc8b48d2bd2154b5f1a24\"","Newsletter 3 July 2020":"\"f8826bac851196da87a31648f4b78494\"","Newsletter 4 June 2020":"\"71b4a7831e46d985c563188032b2fff2\"","Newsletter August 2020":"\"ca8fe8bc5a0f854840ba1c90d6b09231\"","Newsletter December 2020":"\"e646bd84b48160225b88a60d913c9e48\"","Newsletter January 2021":"\"e1b07af04f7d52cfe1a2814174a26a49\"","Newsletter January/ February 2021":"\"7966af9d50088e6c2568386a331ab341\"","Newsletter November 2020":"\"7221d429a0f637da997c55349b9ac589\"","Newsletter October 2020":"\"0f7108dc4c7680f518606f2fc4515830\"","Newsletter September 2020":"\"e8e4f1e2dce1ef31555d047ee1a41873\"","Non MZ.JPG":"\"4d7bad668a23e8bdb0d5d0b8b4a6ad65\"","Non-contingent":"\"4e58193c28343ef9cd564116d6cd8691\"","Non-mentalizing, positioning and network problems":"\"bcd21fe8ba5284d0ef9639869eb17038\"","Non-mentalizing: a summary":"\"2932bafec2ef6b687d9af291f87ce4e2\"","Non-mentalizing: certainty":"\"340272f981fc2cfa5706eadb419af1f7\"","Non-mentalizing: quick fix":"\"9fd84207c567a162c45c6c6c3b428045\"","Non-mentalizing: waffle":"\"d47fe02de6bd4842b52d13accd8ae81a\"","None of the above!":"\"e5abe87565f8c13308f705fb0ea255e2\"","Norberg (2021) Open - how collaboration and curiosity shaped mankind":"\"fcff7e78ccc51f2892ce468295fc948f\"","Normalising":"\"6608481f24c48657d6842461e71d7621\"","Notice and Name":"\"bf7378dc9d0af8e29431c1e1c1d72e32\"","OUR LOCAL Resources and Practice":"\"d822f9fb4c1e01afc520d537b0b1b531\"","OUR LOCAL Teamwork and Governance":"\"39518a4c2d5c18de826b369f390627e6\"","OUR Team":"\"c8b754ab22c17946b1d97b302374fd7c\"","Obsessional compulsive disorder":"\"60d4e1915efac884a8ac7ec322f6c883\"","Offering unasked-for help to a team-mate (Graded Assertiveness)":"\"d0ae2e2f1b730f2f08f0fa536210c5d4\"","Online AIM Cards: how to set up a room to use with your client":"\"2619d3786f7f8aa672deea6dbb44e1a3\"","Opacity of other minds.jpg":"\"e21097eabf5dcef5c3c5543611a95f0f\"","Opaqueglass.jpg":"\"9397dccc877d42b204b1d1cefc5716ae\"","Open Questions":"\"5647ee14f56069f6800e4ec281d7714d\"","Open book pic (2).jpg":"\"489f70cf1463419a12f1666d743979c8\"","OpenPagesPic.jpg":"\"89781034b7156dd61510c8f1bdba0c45\"","OpenSource":"\"0d123c8d084d33634cd2f65a1909844a\"","Ostensive communication":"\"6fd86a3e40010297b77172eb43917e1d\"","Other Symptoms of Psychosis and Engagement":"\"6045eadf25d312dc420500eb5a011ae9\"","Other key aspects of AMBIT in a little more detail":"\"f291baabb12e43f63584d1ca8d1d62f3\"","Other team's AMBIT manuals":"\"574fc65c89266b66f17b286397d5581a\"","Our Resources":"\"10ebceb05ceed81d5187dbed24a99661\"","Our team and CLIENT work":"\"69e347e369ed53bfe45df30ac5e077b8\"","Our team and LEARNING":"\"1ba1096b190eb3f9aabb54a03f8878f9\"","Our team and NETWORKS":"\"0a1d1a8b457ce4395730ec26893634e3\"","Our team' strengths in CLIENT work":"\"50dd726791b166f1a4edf2daa2f2e060\"","Our team's challenges in CLIENT work":"\"2e355a1bec872246585f93feb98a9404\"","Our team's challenges in LEARNING":"\"a63b4a8f8e911d9b428f1d71e3925112\"","Our team's challenges in NETWORKING":"\"57f090742dd2c56c1fa5075b30d9ecdc\"","Our team's challenges in TEAMWORKING":"\"490447c5e979c2a5e9421a9f0b9bdecc\"","Our team's core expertise":"\"2c5c1ab2168787db5d2e45dd7d5db826\"","Our team's needs for effective CLIENT work":"\"a5ace1485b90b86bfc764e78e05b4d10\"","Our team's needs for effective LEARNING":"\"fc7ae574632e87ed3815109c78a997dd\"","Our team's needs for effective NETWORKING":"\"58c7135d7a7054fa37a12cfb8282c046\"","Our team's needs for effective TEAMWORKING":"\"b793de92d503db119fc495d4efe30e88\"","Our team's strengths in LEARNING":"\"e25dac1dc39acce2216c2a26f0f8ddb0\"","Our team's strengths in NETWORKING":"\"1896c1ad99ada809613a2bf003532fd9\"","Our team's strengths in TEAMWORKING":"\"fb323ca9f3105f4e95bc3d066793483b\"","Outcome measures (T1, initial)":"\"4ccbea4d07c0a78cfebe8baf6c6dec5b\"","Outcome measures (T2, 3 months)":"\"a718a27a281e2ea7803235712bc54d06\"","Outcome measures (T3, treatment close)":"\"bc60f491681f6b7d6f7cfde24dba60c4\"","Outcomes":"\"8320fab18b8aff28bc0d1bae0277a0ec\"","Outcomes for clients who drop out of treatment":"\"6afe1c48af569fac75b6940fd3c20a53\"","Outcomes for clients with multi-agency needs":"\"a90c630b0b50b4c696683a6742e6cfb3\"","Outcomes for untreated clients":"\"0e6a7fce72e902d01de61faf3cd089a3\"","Outcomes from the Family Intervention Programme":"\"bc85d25bb12e54db06ef1b807854121a\"","Overview: LEARNING at work":"\"9af2005fbc017d6cf971062f31b4e86e\"","Overview: Working with your CLIENT":"\"f43ffed22fc9ed13c66b916b54ba55fd\"","Overview: Working with your NETWORKS":"\"0d5c2ab233c80418e357c27142062b37\"","Overview: Working with your TEAM":"\"d8dfab622d454df0ee60c0f42018ff39\"","POD":"\"9d5407bd2b5fd7d522749c344243edec\"","PREACHY":"\"07e83944522c5135f543f2fc73e09771\"","Paedakoop Team, Schlins Feldkirch Austria":"\"37156196ee1cc945ee8bc7f1a5041a04\"","Panic Attacks":"\"5a0a6fef9c576af84bb4a74292314e10\"","Paranoid":"\"cc14dd3b4f44ec230f56aab6028ed109\"","Passed Outwards Discussion - part 1":"\"311a756bcaeaa06231c1b355e93986d7\"","Passed Outwards Discussion - part 2":"\"4235c06485b835dd46b556a08e3a68d8\"","Passed-outwards Discussion":"\"0f6cf15b925eab588b5cc947de74a1fe\"","Past psychiatric history":"\"8cdec988bd4aac15e5b66586d02c97a4\"","PastMedicalHistory":"\"d86cdb29a75a5c1b4d7e78fa789b4d33\"","Patient-Worker Boundaries":"\"5ab67415870e0a870ef0c4f8a4023523\"","Pause and Review":"\"74f0c33ced81409a13eef92aa9984324\"","Perspective-taking.jpg":"\"bfdbe0e10a113167fa70b1296cd0d6e4\"","Peter Fuggle":"\"31f6fde8aeafd2ad9b091733893ddab6\"","Pharmacological":"\"0c9bc52067cb7a9dd25d67f85e9b966b\"","Phases of AMBIT work":"\"ac86cfbecc5753a2cf93ba84f25972c5\"","Physical Health matters":"\"e9d8001f371daf3ac2c5e5f6ea9c4b2e\"","Pic_WellConnected":"\"6bd8005d58ed3368fbad743dda18e791\"","Picture1.jpg":"\"8d6714bbeb0614febfce0423c9800d81\"","Picture1.png":"\"3273d70695d001071babe39c31b375e9\"","Picture2.png":"\"60ff8eb831cc7fd9bea5e88b05063c70\"","Planning a training event in your team":"\"dba94d596117478eaeda83170278f8bc\"","Planning survey":"\"d2e8917a6e9dc7e2df188feffea4722c\"","Planning survey results":"\"a9f81df86bfdb78c116a18994c20802f\"","Positioning Theory":"\"4a648136be0d393dbd237d7dc50b23ac\"","Positive and Negative Syndrome Scale (PANSS)":"\"64670929cd34dea6c66a2181cb98a9fb\"","Post Traumatic Stress":"\"242a3fddb1c15c2b5e8614aaf2a2ff0a\"","Post-training outcome goals":"\"997548fc767721a99e4b4db51436a6fb\"","Practical examples of sustaining the AMBIT approach - Jones, Jones and Schofield":"\"2ebc23a47888b39e529d0d0f759737c3\"","Practice":"\"039d47962716967f8553bb7f7ba19440\"","Practices: LEARNING at work":"\"6bd5969e9e16d386c0473649934ba00e\"","Practices: Working with your CLIENT":"\"50067b727cf31eafdbcc56fd72e9595b\"","Practices: Working with your NETWORKS":"\"8473186ab51ba8eab5e2258ccfcb8893\"","Practices: Working with your TEAM":"\"211d23984fdbd4feada574abc0e16512\"","Pre-contemplation":"\"27e0bd9056ed8423044a4ceae52484ff\"","Pre-mentalistic stances":"\"8870d2e7b1b3a137f7ea5c3de2f179a3\"","Preconditions for Team Learning":"\"f8cf2b7cfb49ed94f933673c1c2f617c\"","Presenting Problems":"\"7cd48e3f023e5af9db1fcf3baee3f381\"","Pretend mode":"\"4cb262b592641e5dfa20f3d0fcb88201\"","Pro-gram picture":"\"62ce2792ec29b5012c0c4d0baa2b9b2a\"","Problem solving":"\"bdb15b681ebfcf1cb9f2503155c9cd02\"","Problem-solving checklist":"\"d4e794be4d86ec7a97919e7cb36b44ce\"","Problems in teams":"\"3834726ad4ec46d82c7d4720c2939a9a\"","Processing a New Referral":"\"4615ee386bc0c95c98730d3548e84c06\"","ProfessionalNetworkMembers":"\"cd720b125d449e5a5605e253cc3756c7\"","Progressive Muscle Relaxation":"\"a9aaaca0a61818d4c1cebe9752fe061d\"","Pros and Cons (Decisional Balance) exercise":"\"7159bf8431740483d04d602e2a2bba46\"","Pseudomentalization difficulties":"\"a82983b877154372f203326865a8cc34\"","Psychiatrist":"\"d0f50cafa2cd7597fbc7acda98fa8ee0\"","Psychic equivalence":"\"4d37753617eac19734d2df131d75d700\"","PsychoEducation":"\"0095ea67d9580e7df97c9f5cd3cd8b87\"","Psychodynamic":"\"281bcd9932aca921d9677db06407cda6\"","Psychodynamic theory":"\"51269b4150ac49e1737a7897c95d1b1f\"","Psychometrics and Psychometric Tests":"\"21039fc6adecfaca45470b1b3563adc6\"","Psychosis":"\"89901372e42fe0d4a719b74b68ff154d\"","Published/Current Outcome Studies":"\"e70abd4bee98168316e7aab4955db924\"","Qualitative feedback from AMBIT training":"\"baf1eb10f93a43247a77f65023920e45\"","Qualitative feedback on usefulness of AMBIT":"\"4d7165abd0f5be10a1aa5bec820d2b69\"","QuickWins":"\"b72b1fd145f3893bca2478ea74d20dd8\"","RFQ-YV (Reflective Functioning Questionnaire-Youth Version)":"\"d0556c32b8050ede961cee9127c2c83c\"","RS.PNG":"\"a9c908686dc838af8233578b8d0aef3e\"","Randomised Control Trial":"\"6ec9b081ff5f31dcbdc7b5b35d1dab69\"","Rating Scales":"\"b9d54856330fadf1545988687a03ce7f\"","Re-breathing":"\"41d812a1466aa1d1d42708e8cdc5f088\"","Re-traumatization":"\"47f26eb2884b71d0f07b971699d158f2\"","Rebecca Smith":"\"8ce2f773e0d5abaae637ff8c566abd23\"","Recent Reflections on Facilitating the Sculpt":"\"dd9d70c003db275c4dd7e35d4212a2fa\"","RecentChangesPic.jpg":"\"a458fc4531f895ef894448b5c7bbafe5\"","Reciprocity":"\"c00bbc79d280c72913a071b17025c3c7\"","Referral Criteria":"\"991c1b2a1a9955a8877d34a611bcd5d3\"","Reflecting comments":"\"7f1a4b93607dc94b87b6cc7c6b6f989c\"","Reflections on Thinking Together":"\"2d63f99be081ecb99e8a299751ffbb32\"","Reflections on the TTT Training 2016":"\"cd81df249a95e0bd1d59a4885c69cb51\"","Reflective Quorum":"\"862ac25e3f6cb7f718a179738e65d493\"","Reframing":"\"90a78c45b0910c65833ed591f1f9faf3\"","Reinforcement":"\"5787ee24ae2a29da02d5f90556a05de0\"","Relapse":"\"117d2bb0513e90a4cb8a96f2df96c736\"","Relapse prevention":"\"e4b6903f4c7414251bf745a9636fb1cb\"","RelatToHelpDiagram":"\"b6f0198ba79571b567fc857c950d4c2e\"","Relationship to help":"\"e34b616a6f9585cc559d0e792f65d04a\"","Research collaboration with Roskilde team in Denmark - the MAP study":"\"ab8ef5e3a235152404b4809fef2e4a80\"","Respect for Evidence":"\"735a74e34a6aef38c81cd1d5bb035359\"","Respect local practice and expertise":"\"1541cc129627e6da2445b225a6647467\"","RespectLocalPracticeImage":"\"f0ce1538d6b0119955874e7adb0f5e2e\"","Restoring family capacity":"\"88593863edcbfb2e085719b008f8f970\"","Return to Purpose":"\"d03179a0bb352becfbef6cf086af8e15\"","Reviewing change":"\"58fd5f8cf0238ba5568384648dee8617\"","Revisiting AMBIT":"\"98ab59e3a2fb046ee6a38b70c1a76896\"","Rich internal life - pic":"\"6f49b12988fbb467c766f8c6f68f7b14\"","Ripples in a Pond":"\"4415aba401cee992e496be05c2cc86d4\"","Ripples_picture":"\"6755ee01ee52023870f5d7dc010188b8\"","Risk Assessment - paper form":"\"e64bd374f31c2cd0e9ea56463557722e\"","Risk Management- Challenge and Support":"\"8ef1f5b42b31873218dceb8f68e1a3b5\"","Risk of suicide":"\"7a341f1b6bef84f23b16cd965c8d6362\"","Risk support - key aspects of practice":"\"11c3cb6125420760d47614bc6bcf4a1d\"","RiskAssessment":"\"7afe7e6d104d6db5f94c2ac3f86875a3\"","Rituals and Disciplines":"\"f41c6cde550c45728f3c1c7a2b678113\"","Role of the Chair":"\"eedc01a9255210cf48635745b775627b\"","Role of the Scribe":"\"120a94a15811fefb0ee0a4426cf91c54\"","Role of the Team Learning Support Worker":"\"0c5f512ea8bae4ca14c974e63475eb5a\"","Roles and Responsibilities in an AMBIT team":"\"3ba4a67709d09fd09925e18cb4360fbb\"","Roles in the AMBIT Community of Practice":"\"447379c9dd92acee485d8749cec8ab3c\"","Roll with Resistance":"\"a2b733cca625ac142926169c3a6ece9d\"","Rossouw, Fonagy (2012) Mentalization-based treatment for self-harm in adolescents: a randomized controlled trial":"\"f8da4ec6cc4d3efee3d75635e016c1a9\"","Royal College of Psychiatrists - Standards for Crisis/Outreach services":"\"acee31cdf4db7feee33e6ec10c7e6884\"","Rx":"\"fb6039a435f04295c34292006903c241\"","SELF REPRESENTATION":"\"09cfbad9afa6a9b2e13af5109dc2c93b\"","SMART goals":"\"6ff611c60461e1b2fa9f1754770428d8\"","SNAPSHOT.PNG":"\"bda21598284eeb7d176902fda59f3d26\"","STIs":"\"50404c989e1ad500784e54dd50434b49\"","SUD":"\"f7ea67694f71e0c958e9ac15f028c745\"","SUD-Rx":"\"23926e0b26c66a759d4de09ca361efa1\"","SUD-Rx - Who should be present at sessions?":"\"175b4558b37ae0fb05eea2264289e9e6\"","SUD-Rx Session 1 - 2":"\"81eb68a591a3774525b264ed667b79a8\"","SUD-Rx Session 3":"\"8fcc014f4a09a00d2d1b08b4cc4ecafd\"","SUD-Rx Session 4":"\"42bde80bcebd785457d72b72a894e170\"","SUD-Rx Session 5":"\"1b20d51d7c364e9564234cb57a471ab8\"","SUD-Rx Session 6 - FINAL":"\"b4425d5ae1bd0baf8782f50045d22de1\"","SUD-Rx Sessions - CheckLists":"\"a51632cb798c0ee1c3c3625801371ede\"","SUD-Rx Techniques":"\"147d29ac268ebb365eb60f8a266e5a16\"","SUD-Rx principles":"\"a2761c7ce45e935a18c93eabba714fff\"","SUSTAIN best practice":"\"6f2aea4beb3da5d3e4b4e7ef8d5aa2bf\"","Safeguarding Children and Young People from Sexual Exploitation":"\"1749d01d9c7bccc18346cf7ff5b68491\"","Save tick.jpg":"\"1854187796abc4e801da41ebae85ef50\"","SaveCloudicon.jpg":"\"ba0dc054b42b9cd4906863599ad2cfe1\"","Scaffolding existing relationships":"\"36a494ddf839dca35239fba06a9bf136\"","Schein's seven principles of helping":"\"551869320487ac7b83044292cfa737b3\"","Score 15 - Family functioning":"\"d41483972a8df9a4f73d3e7f75b81764\"","Scoring AIM data":"\"62ebce90225edde6b9ba4609389ed26f\"","Screening Tool for Sexual Exploitation by Brook":"\"85b8073c11c8c687ac6bff1e5fc83b6d\"","Screening for biological illness":"\"0bce45375c6693320e7d2521e8ccb1f0\"","Screenshot_20180323-002957-01.jpeg":"\"537c1162aaf0151d29b0356e3a7ff132\"","Sculpting a network":"\"99333fcb9e781a30c03519147533067e\"","Sculpting the AMBIT wheel: a training exercise":"\"5048e884470ebe477fe06c182db5c832\"","Search Bar":"\"9d4547927e0ca920716f1e424d64ca98\"","Secure Base":"\"7724d572ce6a5b06b7d6fa72d78156a1\"","Seddon, J. (2008) Systems Thinking in the Public Sector":"\"b0f57d501f9c9ed6d8fa8765fbb4c92b\"","Self Injurious Behaviour":"\"56a4aba72350e209f91b751469297cb0\"","Self-directed learning":"\"da72eb7e703b7b66324c632320701d6f\"","Self-efficacy":"\"2b5429d8bab579fd058f78de84c1632d\"","Senge (2006, 2nd edition) The Fifth Discipline: the Art and Practice of the Learning Organisation. Random House Business Books":"\"f6c9be7484f5a34788dc530e4c6e973f\"","Senge: Discipline 1 - Systems Thinking":"\"829e6822db25375573eb6b935440e39c\"","Senge: Discipline 2 - Personal Mastery":"\"b007b5692a16e4b068d16051263957ba\"","Senge: Discipline 3 - Mental Models":"\"d95d30acf73656501c0cfa3d1ea2393a\"","Senge: Discipline 4 - Shared Vision":"\"d75e64588d9be9b3590146b5cd6faa16\"","Senge: Discipline 5 - Team Learning":"\"bd2d2f0ce2f95cb0816e6ad01c0a6989\"","Senge: eight strategies to develop a learning organisation":"\"8681556a821900e8d312df0eee76232c\"","Senge: the characteristics of 'Learning Disabled' Organisations":"\"bd91dd63e0ead5b4d9841f0e2c27c1a3\"","Sensitive attunement":"\"c8cb0a934044bc125affe6c8a2613165\"","Separation":"\"dfa3f7a20122ff16a8a2482018f69021\"","Service Delivery":"\"276af25317d87d8688926d9a4e0c8069\"","Service User Feedback":"\"9d79e3e4d9d84e86b8a0d7a07376e9bc\"","Session Feedback Form.pdf":"\"a3be1e5430658f63cf14bcc6309ece99\"","Session Plan for three hour training session on Mentalization":"\"2e44b6581c8ddad18f42c31736a264c7\"","Session Rating Scale":"\"fcc7d18056ecd12134893932e0952d84\"","SessionPlans":"\"f11e7af1243fd57139505d8e8dc7f3b8\"","Setting up Mentalization based work":"\"c9045ffbc41ad30b96543ec4292cf7ec\"","Setting up a first meeting":"\"5a8ab1ab5b3eeb340c4cafad5036a0c2\"","Setting up your manuals account.pdf":"\"7412048d0923ea647b4c62d258d8eebd\"","Settings for AMBIT implementations":"\"2eb98b1cf9cacd656afe42fd2877a5b7\"","Sharp et al (2006) Imagining your child's mind":"\"fcbe5d1ce528adb3300a89ed2b015c97\"","Sharp, C. and Bevington, D. \"Mentalizing in Psychotherapy: a guide for practitioners\" Guilford, 2022":"\"781b8e3d4ba721177862b9d8df6aaaf1\"","SideBar":"\"74e43345fe8129c8de5b80f57ce1ad27\"","Sidebar.png":"\"68b8ce1f5815e2913b54da21ec19e80a\"","Signs of Safety Child Protection Practice Framework (2011)":"\"4ea35fe5acd18e5c05a019d18896e4d8\"","Signs of safety evaluation (2021)":"\"7fb21416b892a34b9fedcb56426df67f\"","Simmering Down":"\"dfda147e742c3d45bd358267e7e7d969\"","Siri (2012) Mentalization-based therapy for adolescents":"\"9dad94ec4321aa97277bce50fd7fee9f\"","SiteIcon":"\"3a31328ef88cb31f9071b6f87ef2b1e3\"","SiteMap.PNG":"\"8eea15f3d3681aad77debd010da99656\"","SiteSubtitle":"\"725289f3d13290482e60ad191e126737\"","SiteTitle":"\"e7629b43a9bd2d3d2a761b6b3d513c4c\"","Slice and Dice Method":"\"2f6b6ef849a61bdd0264a37c4fa4da9a\"","Slide1.JPG":"\"b8e1bff375f460cfb22eff69d50a7a98\"","Slide2.JPG":"\"190881a46750e517632f92b5d9d1a93d\"","Slow engagement":"\"fc151349464cd57639dc1aba0125d972\"","Social Capital":"\"d7c63b2c7c2301fc38947be82ba2e098\"","Social Ecology":"\"f68d687a4208c2449e3e53dcd05d1007\"","Social-Ecological Work":"\"878160acd9f627a787e6e4d6f24f57d2\"","SocialCognitiveTheory":"\"e3170314ef03842e5c5c3c0009a11ceb\"","SocialEcologyPicture":"\"53018ac6971674d88564604bf3376d0f\"","Sort Cards":"\"c2a68282798dbabd1e3513d8790013c6\"","Specific diagnoses and their corresponding mentalizing failures":"\"febe24a55519f14e4e9c7cae8a88877b\"","Specific interventions":"\"c82f6a8d4107e3c805048678e8ea0862\"","Sponsors":"\"5855e02c2467b1d36aa66bc7bdbb45ae\"","Spot the non-mentalizing":"\"777bb1811753525730384ff55167a960\"","Spot the non-mentalizing 2":"\"657ad460040279849766d7df93ea4aac\"","Spot the non-mentalizing 3":"\"9899e82749a1953afe69823191cee98b\"","Spot the non-mentalizing 4":"\"4268090a80b2da25b4542648a9aa1068\"","Spot the non-mentalizing 5":"\"78a20e33f107f59574d6a2f55153321a\"","Stages of Change":"\"bd68bb582e7c270ca3a3dbb0b95ea62c\"","Stages of Change and Mz pic":"\"3655bc9df9cebdeddb931e98e99e16b0\"","StagesPicture":"\"1b4e69c89fb8e52b97dd183b449d8f30\"","Stance Features: LEARNING at work":"\"5f95275424b24ccef282c48cd53dab20\"","Stance Features: Working with your CLIENT":"\"0290a55cc461367d967f1440fc9a9616\"","Stance Features: Working with your NETWORKS":"\"3c5fc66b4c6e5eedb504ee1f56e51ed1\"","Stance Features: Working with your TEAM":"\"69d68c4de14fd32a7606d21333264e72\"","Stance-Domains.JPG":"\"5a2b9fb481d2c04832f049266b43a7ff\"","Stance-RespectEvidence.JPG":"\"fe576ae0cd0b7cf559f5a7844b4d88b5\"","Stance-Scaffolding.JPG":"\"0ffa29a95e20465d3c32a7b57dac436c\"","Starting a NEW CASE - CheckLists":"\"50df4ac594c5a0cdacfd1f7b3590954f\"","Starting an AMBIT service":"\"477e852a3c6b6a91aef2bf348476e256\"","Stating the Case":"\"d7eb71448e973d4dcff9982bd79a2bb3\"","StatusUpdate.jpg":"\"0c8856431e5f7d671eedca13649de2d5\"","Stethoscope Games":"\"5ad8ba45c65292457aa50b25e1afadbc\"","Stigma":"\"6a52cdcbe8210f1cbc08851486993a9f\"","Stigma and Engagement":"\"77de94c9f7200e5a298b141962e0520f\"","Straussner and Fewell (2011) Children of Substance-Abusing Parents: Dynamics and Treatment":"\"4b9568c51a2524413f7c8d54b422bc58\"","Strengths and Difficulties Questionnaire (SDQ)":"\"55a996a1f37c3bca58249bb528621584\"","Strengths in RELATIONSHIPS":"\"de8dd23c742a70512d2fe738de7cb7bd\"","StrengthsResiliencies":"\"a94ea5fd6113cee5be57f34b9dbc9c03\"","Studies relevant to AMBIT":"\"9deb585ee47e6e3df53d7488ad2a2a50\"","Sub-pages":"\"ac977520a428aebb3ce57321ff3bf5ad\"","Sub-topic":"\"0777e798cbe2bd64b898017f92c6b997\"","SubsistenceSupport":"\"28535fe30b3292f9bf635850a2900b8b\"","Substance Use History":"\"a35a7938bccfee1e1cd31c6c1c7f65a9\"","Substance use":"\"4e02e1af49ffb79b80294ae43c5363aa\"","Substance use disorder - treatment":"\"e8053c83092fd85c12162bc72ec6f437\"","SubstanceUseDisorder":"\"05f4ff6456e24e2dbd91548b80391b68\"","Suggested Team Training Sessions":"\"4633dff3d3c24851ecd6a940b54995e3\"","Suggested structure for an (internal) AMBIT Supervision session":"\"df7b85099bfaa08504203d82ef15b870\"","Suicide Attempt":"\"49c37996e6c7bcfeab9b4c6456ac9982\"","Suicide Warnings":"\"95aab7c7e22b16caa18c4489098071ae\"","Summarising":"\"200913b88782db8835b08c81508c217f\"","SupervisoryStructures":"\"d73690e73008d603592edb8156bd7091\"","Support for the AMBIT Community of Practice":"\"9eb3abba5ba8a5342021367cea30a7de\"","Sustaining AMBIT practice after training: lessons from a group of front line teams":"\"203a6a0c052ca81d4a13676d3611ba59\"","Sustaining an AMBIT approach in an acute adolescent in-patient setting - Whittick, Morrell, Fairbairn, Thulbourn and Millard":"\"afc64224d5578d2a52152bff3ee041df\"","Sutcliffe et al, 2004 - Communication failures: an insidious contributor to medical mishaps":"\"4a6e883647446f5b88cb079645dac2f1\"","Syed, 2016 Black Box Thinking":"\"3edf2b549d456d41de326dbde905115f\"","SystemsTheory":"\"4ee0e74218b4b59cac60dd2ab765e195\"","TEAM exercises from AMBIT training":"\"e0b7894dfa3dc0218269590d02b25f40\"","THRIVE-Framework.jpg":"\"a595798b3ec57abc48cb73a0ac7c8152\"","THRIVE: Advice and support":"\"362a825cfe25bd44b0ac6b7129775296\"","THRIVE: Help":"\"a9236cc219935f4c0cfb2cee3704261c\"","THRIVE: More help":"\"cc00048d1e3d08aaa2f41c9d4a8b63ac\"","THRIVE: Risk support":"\"1bc1b9dcf3d543570a6f27c0ac131b8f\"","TV phone-in or Documentary games":"\"444ee679fed8e0cf485965e9521cb9b1\"","Tags":"\"92f1fb0b9262bae9ab6a6da288244635\"","Take Home Messages":"\"d8561e05a68c4c0d1b9fb18e1558af60\"","Take a deep dive":"\"e7375ff08fbd49a92fdb94ff384b40b7\"","Taking Aim":"\"ffe39a8cc66f383497467dd8b3e99a39\"","Taking Responsibility for integration":"\"b2325953109107ec7b54f8d3a1f29b9d\"","Taking a break":"\"d89896fa8a37c022fd402b3f5f0412b9\"","Talbot, Fuggle, Foyston and Lawson (2020) - Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years":"\"ad95f53695067b3a42fa740d7e9b7e49\"","Team Meetings":"\"f8975996fae356f84cc7ab7f8a10a9ff\"","Team Thinking Together exercise":"\"f1518a5947ae5b3cb2d1f9148cfd82c6\"","Team around the Worker":"\"9fbf27728034549226fba61e70c53ac9\"","Team around the Worker - pic":"\"3a0fcdd0318c83562fbb28e1ef090b1b\"","Team meetings survey":"\"4428b97d8b3f79566ad714f316d08a5b\"","Team meetings survey results":"\"73fab813e36a2924cd3adce5f390605d\"","Team training session: deciding on the intervention":"\"8be6ae1a4532b6edd19a36ca40ef348e\"","Team training session: what interventions do we do?":"\"0b80650c083a1e930343110322ed4803\"","TeamLearning.png":"\"67f9d35fa4254f1b3b354d57a9e9ddef\"","Technical aspects of how to set up wiki manuals":"\"257f33ac6d55a629f53332248f70dba3\"","Teleological thinking":"\"9591fc020593202a9e9f29ef15cedb29\"","Terminating non-mentalizing interactions":"\"7950f81cdb2c83d9ff1e427f742df657\"","Test page for Willow Vue site":"\"26c69ea582ea60fdbaa0cb7eca78ddda\"","The 'What's it like to be...' exercise":"\"f67c02447294a79def5ecbe11a365ca9\"","The AIM Cards - a Guide for Practitioners (1).pdf":"\"f80ab448f4c1bbd1d1dce9be33842ff2\"","The AIM Questionnaire: What it is and how to use it":"\"4e3e76528a338308d4fc34814a8a5494\"","The AMASS Team":"\"70866773d20b6403cc8315aaf55cbc4d\"","The AMBIT Lead - role and responsibilities":"\"eb7cc300244e38fd2390b9891491b2b2\"","The AMBIT Pro-Gram":"\"6dded19f90f9c5ba1cad180c3fdf825d\"","The AMBIT Pro-Gram: an example":"\"23520c2d66c63939618bfb432ce368b2\"","The AMBIT Study Group":"\"a441632c10235563dd819e3612cd02da\"","The Coping With Stress Course - Gregory Clarke":"\"69b04db14d478022db965da063f4b0d2\"","The Development Design Administration and Psychometric Properties of the AMBIT Integrative Measure (AIM).pdf":"\"9f42b38ef49ae0c879df33a46589b5c6\"","The Development and Properties of the AIM":"\"37c42c9d40d7913169fe6534eb0de427\"","The Egg and Triangle":"\"5dab31a02f93f9d534ab4c78d0c47a19\"","The Inquisitive Stance":"\"f37ace6e2e21b8d71f5cae8a7269b498\"","The Thrive framework":"\"625497787eed0004cba686e7d2badb63\"","The Troubled Families Programme: an overview":"\"c830bc98fcdb37d106ff73cb81088e20\"","The Troubled Families Programme: the intervention model":"\"8ff71be8a3b49fd42347a0dea0bab5b9\"","The Water of Systems Change (2018)":"\"8453d1c6d212861d61813f99635ec4f8\"","The Worker's Mentalizing Stance":"\"31f693eb26f0ad7f5fd7b01ff023557b\"","The World Health Organisation Quality of Life– BREF questionnaire (WHOQOL-BREF)":"\"2ca505afb685cc231dba401a36cc7b73\"","The group activity of manualizing":"\"69ee716a9556fb8f0b8255e53e5d5cdd\"","The many sides of mentalizing":"\"0359859e5fde93db584642f2195566e6\"","The work of Jos De Blok":"\"23183107d8434b7629ca75b2b66d8558\"","Theoretical foundations of Family Work":"\"4083552f6c82e4844170eda2b1da4226\"","Theoretical/Explanatory Frameworks":"\"e784725093d73bd43cb91049346ec124\"","Theories: LEARNING at work":"\"1c12a8b527c4c7d7719d8b703560a456\"","Theories: Working with your CLIENT":"\"7ca99b71767bef2041ca1125edf09835\"","Theories: Working with your NETWORKS":"\"c9407d2184303fb0e795878f9d3290eb\"","Theories: Working with your TEAM":"\"10630c651c425b5683ce34a7a065fc99\"","Theory":"\"8b4ec036f8faee45d9876b6cfe7137d4\"","Theory behind the Individual key-worker relationship model":"\"d904ac4a253dd79efbbc649dbe58f2af\"","Theory in Practice":"\"79a208ddce1053f647279659884b9afa\"","Therapeutic Bargain":"\"22d118dc7b5fb31ee05142894ee6f805\"","Therapeutic relationship":"\"3e54fdd022eebeedcb30082ef6f93e80\"","Therapist's use of Self":"\"2d6d97cbbac4bf08d8f929b36dd00f0b\"","Thinking":"\"4950dc39f9118a20b10dec09759d5274\"","Thinking Together":"\"d56d6d7ea28722e9c3dc00c94f05fabc\"","Thinking Together - Local":"\"40c64d365f74eb118e7ae4ec87d3a32c\"","Thinking Together - Training exercise":"\"33146a2ea1de24a810ac2b2d3ee1e2ca\"","Thinking Together example":"\"7b0c899dfd822d769822e19e2d06c841\"","Thinking Together exercise":"\"ae52b277570384f5be74df26023c6788\"","Thinking apart example":"\"cb527f655f829514dceff272d713dbc1\"","This is the same as academic theory X, Y, Z...!":"\"dd558953b1ee5e46eb950db9a2d9f5c8\"","Thought Blocking":"\"9278b1d5fb1dae11285d305d8a5ebb66\"","Thought disorder":"\"7ed71fee36e48bcb7f5fd5ecfc8df350\"","TiddlyManual":"\"ffe415386c4fd6de7421b82de30e6b10\"","TiddlyWiki":"\"000e8d032c45d592491c4f6a889c0431\"","Tomasello et al (2005) Understanding and sharing intentions: The origins of cultural cognition":"\"99df42e29212a6fe06f7b43645f422fd\"","Top tips for AMBIT Trainers":"\"10ce5fe8e2ffb31d8d7a97e9e6647e66\"","TopCloudIcon.png":"\"10834ce3e03686139d33a403addc61f4\"","Topic":"\"946aff4b64bd45f1d96038fe96b3b986\"","Tower of Babel":"\"975dd6680a1c24822adcb86594ac1211\"","TowerOfBabel.jpg":"\"5d68204f39013b1b7cd00c3ada6c7280\"","Training Challenge":"\"196c97c8dd67320672692384a891f5e7\"","Training Exercises for Keyworker well-connected to wider team":"\"01bb343f15118b7c9ba3ec6e4a435183\"","Training Exercises for Managing Risk":"\"a9381e9625e6259e9f6d01a7d84b6fff\"","Training Exercises for Mentalization":"\"d274a4b1d149fa68a672df4a983aa726\"","Training Exercises for Respect for Evidence":"\"5b9aecf5f6d66abbf8d1ca49cb1abf24\"","Training Exercises for Respect local practice and expertise":"\"adad5b5b23f2637d8f4e2629cc82e2e7\"","Training Exercises for Scaffolding existing relationships":"\"d450f5f79407360f6db516849f819aa4\"","Training Exercises for Taking Responsibility for integration":"\"2f6710abe5dde510a2fd1bf8c821df40\"","Training Exercises for Working in multiple domains":"\"c54ebf6acbcc5b5c5214308dfeac63d0\"","Training Exercises for the Keyworker Relationship":"\"d585a10c1e162cf28febde3f2e0e4aca\"","Training Exercises on AMBIT in general":"\"b96a9fac949a7999dbdfd347f4f78642\"","Training Feedback":"\"f7ab24b567c29afe73490ce9a41fdd5d\"","Training Feedback for 2018":"\"e7ae5aee7086f577923644eaca348001\"","Training Feedback for 2019":"\"10c89ad814ff1f8dffbe8e9e1a5c7c17\"","Training Feedback for 2020-21":"\"17ee50bb48b67a92762a5a83d8acde6a\"","Training Resources":"\"1e4cc24b00eb3e89dd746fac8191d01d\"","Training exercise: Managing transitions across services":"\"db69468b53dba9b5ec2b8814268ab0f1\"","Training exercises":"\"a348ac32b771ffa3654eba3f330ea009\"","TrainingCore":"\"42ff1248371585f0a0e0246dd02759a3\"","TrainingManualization":"\"e6ad576828dfa4ce731893bef7498adc\"","Trauma":"\"148a51de8ed70d4774ff833c2f397f8e\"","Trauma informed care":"\"4586454ff152e52ce07d3b1c22757785\"","Trauma-focussed CBT":"\"1a763480c2e2ffe657c28f68ccb42f16\"","Treatment":"\"7120901af89348b202f0e4a1f55d5e16\"","Triggers for problems":"\"e637fc756ff57ea2964f9df494cf3a8c\"","Tronick and Cohn: Infant-Mother Face-to-Face Interaction: Coordination and Miscoordination":"\"fde61b9715c1731d404706c6aa1e8d23\"","Trying out the AIM cards":"\"7abc71679963c60115e8f3b33cf7651b\"","URL.JPG":"\"f72fff435635af72c9bd6932e7af35f8\"","Unconferenceboard":"\"f5c6e453ba40e22a6eae003db8c8c639\"","Understanding Risk in face to face working":"\"381085d9119056b84684dcabd7b5a627\"","Understanding and Breaking the Intergenerational Cycle of Abuse in Families Enrolled in Routine Mental Health and Welfare Services by Investigating the Feasibility and Effectiveness of a Mentalization-Based Early Intervention Program (UBICA-II Study): Study Protocol for a Non-Randomized, Open-Label, Single-Arm Feasibility Study , Dittman et al 2023":"\"93605f49ff563a389a23e22a100a8d72\"","Ungar (2007) Too safe for our own good":"\"60907c061bc82f4e0e2777ca8745eab9\"","Ungar et al (2013) Service use, risk factors and resilience in adolescents using multiple services":"\"fd82018540ed027621b6004c1104f0f3\"","Upstream (Background) Factors":"\"deea250e0aa9f5d5510c7327f7559fc7\"","Use the Mental Health Act":"\"32a1899f578a7b646e817cc3a3fa7804\"","User Guide":"\"188e3eb2eaef04cd48a28068e232d547\"","Using AMBIT to Reduce In Patient Admissions - Sarah Harmon":"\"f70e6aa4c9d9cf97ed22432d0838eb8c\"","Using the AIM":"\"fe6009800759e83db2c60eea03a0160b\"","Using the manual as a REFERENCE tool (looking stuff up)":"\"a383a67b8b00f7ad7cc839817b046ced\"","Using the manual to CONNECT with other AMBIT workers":"\"74f77857e74db14735c2311f3caa0fb8\"","Using the manual to RECORD learning (manualization)":"\"bd9d0610be10ffde9ef862775c4e4d06\"","Using the online AIM Cards":"\"42f16a06cac1a5be510ac2ecab119db4\"","Using1.JPG":"\"c0ed258a406cc4597f26fb8d62956017\"","Using2.JPG":"\"42058ab8082c1ae508f304a35b15c679\"","Using3.JPG":"\"5333b5839c4ee999fc33cfef4972f27a\"","Using4.JPG":"\"2b8de3f498e040b2c4acf188e2abda3f\"","Using5.JPG":"\"fbeb35657a55cf1462ff6d38a114e449\"","Using6.JPG":"\"b3def0168ccdcdd34f556f321bac6ac9\"","UsingTheManualContents":"\"cead2202a707facb6234fd4e1b3879a7\"","VB.PNG":"\"1d0263b9d38df5aabf97baf1731bfcba\"","Verity Beehan":"\"43eb21adea45cf1ca21b7de4dec2f18c\"","Video introduction to Thinking Together":"\"7235c173ef160414d44d60d8597abea6\"","Video introduction to disintegration":"\"1591ebe9cdd3b31306dc57f29ad68032\"","Videos":"\"77a33599227c43a553d2971b0368c2a4\"","Violence":"\"407e8fcde2c71abbfbec7911373b28e6\"","Walker, Conlan and Laforce (2011) A paper on the wraparound approach":"\"f9467fe5f0d5e39961a9bccad2b61114\"","We do most of this AMBIT stuff already - what is DIFFERENT in what you are teaching?":"\"657d838af315944992073c7b5bba895d\"","We want a hospital bed, not a home visit!":"\"e16a8e666a41f546c8e5252f6a2d5908\"","Wearing different hats":"\"d13950cc8cd58866c36e203b1f340f7d\"","Wearing different hats.jpg":"\"9998658d035b1b18011403c0b2a3d851\"","Wearing different hats2.jpg":"\"eaff0b7f95284eb87b0f79dbdf70bf93\"","Web-based AMBIT Lead seminars":"\"cd9c6a4541898a8e9a121a87988848f9\"","Webinar 10 Sept 2020 - Implementation: Making Change Happen (Wandsworth 6 years on)":"\"fba00d4cc397fc0ac5759ecf4a171d21\"","Webinar 11 June 2020 - Online mentalizing (and Active Planning)":"\"f177b684d9d58a651c8f33b8c2569149\"","Webinar 14 May 2020 Working with Networks, Remotely":"\"6adb8f4b2abe22599461b6140a9289be\"","Webinar 23rd July 2020 - AMBIT in a youth and community setting - who trusts who?":"\"613eef3a08873d0988914a7c4d189005\"","Webinar 25 June 2020 Using AMBIT to influence whole systems change":"\"16958b508decab8e2a0dd3de54980e00\"","Webinar 28 May 2020 - What Works about AMBIT":"\"6bca5dae60fddb4daac6da2e4c297e66\"","Webinar 28 May 2020 - What Works about AMBIT local.url":"\"dacba6a1c231a8fa673d90f014015e29\"","Webinar 30 April 2020 Meeting People Where They Are, Remotely":"\"cc6d919e3cfdb2104297ca248434c6c3\"","Webinar 6th August 2020: Working with young people who use substances":"\"baa4061d1fd117acde8faf904ed49a0b\"","Webinar 8 October 2020: AMBIT in Educational Settings":"\"3c42f821a85987f36171f947f10fe076\"","Webinar 9 April 2020 Staying Connected & Adapting Through Change":"\"5c9652ef9c0f32a6ce83c988cd0b35c2\"","Webinar 9th July 2020- Moving Out of Lockdown":"\"a0540284e19637989a6c6c69c600424c\"","Webinar Notes":"\"36259a2e16198c498290a539e2f70175\"","Webinarsfortnightly (1).jpg":"\"41dfd451f773483c8011e8cc53974c32\"","Weighing Pros and Cons":"\"a5846a2b74e44a8e4ab1a8eb759d323e\"","Weisz, Jensen-Doss, Hawley (2006) Evidence-based youth psychotherapies versus Usual Care":"\"db87c68f065b826bae7241d97677623f\"","Weisz, Simpson-Gray (2008) Evidence-Based Psychotherapy for Children and Adolescents":"\"c85fa4e9d62959dcf4804cd1c3f17426\"","Welcome to Day 2 of Your AMBIT Training - AM":"\"b5db1975336f6128526af50315c4755a\"","Welcome to Day 2 of Your AMBIT Training - PM":"\"fe937ac32381d81b2f79ef894138ed39\"","Welcome to Day 3 of your AMBIT Training AM":"\"361c054cb4169652b3aae91b6abcff41\"","Welcome to Day One of Your AMBIT Training":"\"b5ea8f9669c9bf80f0b7a8236db8a0be\"","Welcome to day 3 of Your AMBIT Training - PM":"\"180fb109a54c4e4989045a4a5ac668c8\"","Welcome to day 4 of your AMBIT training AM":"\"2aba03f1ac84e73fd4033e43d509d258\"","Welcome to day 4 of your AMBIT training PM":"\"6047b11c490aae08e646353d34aa663b\"","What I would to like to learn and what should be preserved?":"\"804e4493817d21d8fddf16c7e00ef837\"","What are the expected outcomes for AMBIT clients if they do not receive any help?":"\"c235c284cd67235fcc90910f13840f30\"","What do we mean when we say \"That's (not) very AMBIT!\" - Dickon Bevington":"\"f2b1b2edbf524b0eb5c05a88a67e56a1\"","What do workers here need in order to do their job well?":"\"1557ba5d9db4434aa22aa58aa4ddb5f2\"","What does AMBIT stand for?":"\"97f52182fac465b107a192fe04bc5f07\"","What helps a team to learn?":"\"2ece3820359b000118bc88d502166ec9\"","What if people just hate the word \"mentalization\"?":"\"d71746e9e30a33d8b66238d6ec56676e\"","What if workers don't want to mentalize?":"\"1863bc4c690caf3fe330eadddc845156\"","What is the difference between the AIM measure and AIM cards":"\"db298f97f5567918411bf3baf9dd4292\"","What is your AMBIT? (blank AMBIT wheel)":"\"1605327c6f5157e13de7a5da5cdc59a7\"","What makes me me?":"\"af6ff091ab555a721a952d6d51757d0a\"","What makes the work with clients hard?":"\"0931dda36b5d7b561bf1a6edebd2926b\"","What negative feelings does the work bring up for workers?":"\"1e6e3375a23c908d232283d5bde72acf\"","What positive feelings does the work bring up for workers?":"\"4778832032a2bca902f30d9540bbca43\"","What purpose am I using the AIM for?":"\"77b10d1a4dd84f780b1889c8073f240a\"","What to do?":"\"5543519f8ff9b00ae44307e55978aa64\"","What's the problem?":"\"267cf4c2ddb17144b2516b8f35da6d8d\"","WhatInfluencesPractice_pic":"\"846365aaf53654f06c5cfaf397c92b48\"","Wheel and probs.jpeg":"\"b10782d4bdfefcb910de376029e50098\"","Wheel with client highlighted.jpg":"\"5ff963c226db8eeb3cc5a641f71777cc\"","When (how quickly) are we meant to implement this material?":"\"c8dabbca03eda0b583052b9db8519bab\"","Where are we in the therapeutic journey?":"\"6abfc27e077d8fa581e1b8765da7bc93\"","WhichInterventionWhen":"\"cda43eeea41b3eab292395a884d9ec06\"","Who does what?":"\"501c98b503bd7760c06905d83fa6a67e\"","Who has your rope pic.jpg":"\"c8c1e4a0ca45ad2be9d379236dc79099\"","Who is this manual for?":"\"76c8298ccf05e37bdb75ac83aed44428\"","Whole systems change":"\"bc146fcff6f56877c2af95eae0f7bd9f\"","Why intervene simultaneously in multiple domains?":"\"7e2eebbeed41385c484ca563dd0ddfbd\"","Why mentalizing matters: epistemic trust":"\"80cfe5a6ab587a453d0fd333386395f1\"","Wilson, G. T. (1998). Manual-based treatment and clinical practice":"\"3a1d33ffba7708a65c7d127bef85aaa5\"","Work on the Self":"\"4bfc5a7efa8821f0c9c4e6c32c5198dd\"","Worker energy for change exercise":"\"ae926a3984ccf2b9e7972f4e7b5afad3\"","Working in multiple domains":"\"ebd34261bc028f3e3aa560501ac232e8\"","Working with other professionals":"\"bd4dcd729b597a66075e11f257753da3\"","Working with the Family/Carers":"\"aa957f77707bad986f4ea07b8b447e24\"","Working with the Individual":"\"5acbe2dfb57c9bfbccbf4ffc22c00042\"","Working with the Professional Network":"\"e5cf1dd0abfefe31d26bbb712868adba\"","Working with the Social Ecology":"\"68c28b7bc116071907dc99b63e555e37\"","Working with your CLIENT":"\"73c06aa076413efd4d4ab227995ba1f2\"","Working with your NETWORKS":"\"6028b11b2d90a239455a0df15d242219\"","Working with your TEAM":"\"480394ab16ded209950d20e8507983a2\"","YPOR - Drug and Alcohol Outcomes":"\"5be453cdcf023a3d0c1d9bec452298f8\"","Your Manual":"\"c9f847634b17091cf4c4a522799068b0\"","_GoogleDocsIcons_docs":"\"9d4fed4e0e53ef07414e690889b5f0df\"","_GoogleDocsIcons_sheets":"\"644ac0405d219c505fcce761df1a4d87\"","_GoogleDocsIcons_slides":"\"88ad487247d895b8d80e7212b448945f\"","adam-solomon-WHUDOzd5IYU-unsplash.jpg":"\"2bd41fe71cdf168e3b4269a123252390\"","afclogo.PNG":"\"3ddde72e4607d10d51e9aa443a982036\"","aim cards room.jpg":"\"bcf6dc5e6fb5e83ff9cd46e3cae04e22\"","aim instructions.jpg":"\"f16cf93a801daf27efb89dc322c05fe3\"","aim instructions2.jpg":"\"c332dbe5d1e4a23c03ee9b501695e279\"","aim2.jpg":"\"0b50b01fdd232678a6004c295415fc0c\"","aimcardsroom2024.pcio":"\"311ffbd1b83c0937ee457920d5493ef2\"","alexei-scutari-5Zg64OwXJg8-unsplash (1).jpg":"\"68970c9ef5fea30c7c94b586b9d7a78a\"","anastasia-petrova-xu2WYJek5AI-unsplash (1).jpg":"\"a2b6ff644fc4da159ac7ed7894f2184e\"","angrycat.jpg":"\"1a4551990ce8c4a48b8d023bc7d83cef\"","ap..PNG":"\"a1da2044ddd9b6173b59a3fcd1123576\"","beapicture.jpg":"\"a0f726d2966c63cc2c3aa612c13f3c53\"","billiepicture.jpg":"\"eac825d5323711796a70cf9279922174\"","books pic.jpg":"\"abf6ef58e417ac0efb2debdaf70c56dc\"","books.PNG":"\"c11d0861f84c046db67f2fc65ebadebe\"","brain.jpg":"\"6a7827d5c9f13ab7563db02bd39b3c9b\"","branden-harvey-wyN0QFDiXw0-unsplash (1).jpg":"\"a873fa26003255f2bcc3914318cd5ff3\"","broadcasting Pic.jpg":"\"633291fa1bc948c6ada9db8964f47be2\"","christian-wiediger-NmGzVG5Wsg8-unsplash (1).jpg":"\"95c4ed45ab819886119f3a473d48da03\"","complexity pic.jpg":"\"6778faea5eac883697a0763b26fff8b9\"","copy room.jpg":"\"77f8b0216e9b2d3cc2518b74bbd59056\"","cs.PNG":"\"a2c29b0ae600ad1b5d00d6a6fa37a7d6\"","custom link.jpg":"\"79c0467aecf423facd9f2ab2349e549c\"","dickon":"\"feafd3dd41cf3f5fad6bdef1dc06f1d8\"","dickonpicture.jpg":"\"d0c3bbb7f2509c6a99ebed03108ae53d\"","diego-ph-SZYreZsJ-fE-unsplash (1).jpg":"\"910d8ed3e45b0366407ab4fc6c863f46\"","dog.png":"\"35eaf94ca02837d57e0d3dbc0f6232b4\"","download (1).jfif":"\"328f0d3117550ab148016e52b9e895aa\"","dylan-gillis-KdeqA3aTnBY-unsplash (1).jpg":"\"cc037348bbd03d8c10a93d82aa8c589b\"","elevatorpitch.png":"\"fc9811759f7173f05603557fb8b1ef08\"","end page content":"\"fbed38ee8e7267d445c9d305b9a09984\"","energy":"\"dade208f225cdfd0cb0cb92beefeb462\"","everton-vila-AsahNlC0VhQ-unsplash (1).jpg":"\"0ff5c71cc1b52a81a51a11071c199217\"","facil.PNG":"\"613ad64df4badabc32794c3157380194\"","free-to-use-sounds-W_FHuUQKNP0-unsplash (1).jpg":"\"c6ddbdc57b7aac12497c4a1582fe85a8\"","getting-started-icons.png":"\"9ac08c109e00868d781b225190ba4e10\"","gm.PNG":"\"5403c673f77541f363ccbcb212d94e85\"","graph":"\"b4e8dc1c5019959df35d18af0d89cd10\"","graph2":"\"9c449744dd41098ad34a8fb797b2af5b\"","graph3":"\"89150a7e7704f502248259b1d880bce4\"","graph3 page2":"\"c50db130580e3583c11bb642dcef7b86\"","graph4":"\"dde43f0c7888db9aaac7ddfe9b433ab1\"","hello.jpg":"\"e80d4fa7ac3ee1845a4e937e3237ebad\"","help seeking.png":"\"3b7012b34089754b4116696962cf745d\"","ht.JPG":"\"42c719c66fc5daf358878e969a42ceb8\"","iCON.PNG":"\"9c12aa481542e38df00ee5cf2ad65256\"","iFrames - a 'window on a web-page'":"\"835f140377a0b4aef305520c403b8c6f\"","ian-dooley-3NCA3tbaE5I-unsplash.jpg":"\"5ca3a15bd2c42783316fb24403450ebd\"","iceberg.jpg":"\"fa2f9c8acf08aef48b29d10582ac41c0\"","image.png":"\"ed6a69eeaea7b8d2ba4e6758ae765d49\"","inshoes.jpg":"\"a87eceaa86a244c07af7c8f3594f515e\"","ipcimage.png":"\"91ec7321056cf4934f014af8733e4b06\"","jehyun-sung-6U5AEmQIajg-unsplash (1).jpg":"\"b9ab988787dbbe76877bcda9d944d687\"","jl.bw.PNG":"\"9e4c9b21f6b7c1098178995528217c92\"","john-schnobrich-2FPjlAyMQTA-unsplash (1).jpg":"\"f4f9bbc869d85dc666d3bb9708a11c2a\"","laurapicture.jpg":"\"8447685c55d6a75453dc843212475ce0\"","law1.jpg":"\"88d7476d67132184f94cc2850161b0fd\"","law2.jpg":"\"edaef7db6d5b1b0f7e1b4be3433e3051\"","leap.jpg":"\"4debd839a5fe18dd429f4fa546e9a0e3\"","left":"\"894f77e61172000c1682c2a4ce17aac3\"","logic-model-310517.pdf":"\"3b67d73a711913884cf67b6e749bea2f\"","login.PNG":"\"d1f3c40e6079afd49f4f7469f25896dd\"","lose some weight.jpg":"\"90b610cc892b89e120d8332f8ab1ecd4\"","luciano-de-sa-ObwMZBdEWdI-unsplash (1).jpg":"\"47697bcf07783c2974ddda912dcb6430\"","lysander-yuen-wk833OrQLJE-unsplash (1).jpg":"\"f918d7dd7468e9578f166a81c0049958\"","map.PNG":"\"3ea2bbb99cc66af797e4d50082f640a1\"","mark the task ttt.jpg":"\"8c2d937b5066d430a7a4f1068ec45ac5\"","mark.jpg":"\"abfd0678e82780e93df35d496863dc79\"","md.PNG":"\"a31d0ad7e6c93b76dc7b8fb1bb507824\"","measuring pic 2.jpg":"\"2f99ad92ef1cd02b108783e32477ff37\"","mentalizingmonkeys.jpg":"\"83362113b0c7352cd2b9fb32af2bb29d\"","mm.PNG":"\"bda18fcd3f2723cbca3cb2c469dcbed2\"","mod4.jpg":"\"16a5a7371d3a4e9f70405b27e58ba8fa\"","module 3.jpg":"\"40c0d84503abe4a3ea40b2d3c8882258\"","module 5.jpg":"\"d392c03e657aca66a7b76aad3b44e3b3\"","module 8.jpg":"\"ce5216afbbd1f22c9867966950501130\"","mz the moment ttt.jpg":"\"d50a973c76e1f780ac188add4344579c\"","mz.jpg":"\"e7dbcc68415d32cd160a83d25b987b0c\"","nathan-anderson-kTaIjvHsyJg-unsplash.jpg":"\"8baea92b28329acf825825e4d5d840e9\"","navigating.jpg":"\"943f693e60c666ae4f99d391d4010860\"","neonbrand-zFSo6bnZJTw-unsplash (1).jpg":"\"e8b57365f8b929f28e5ddb856fb58342\"","news head.jpg":"\"8cea88daa686dae5f2e69eaaf9ac767a\"","nicole-honeywill-dGxOgeXAXm8-unsplash.jpg":"\"2ed411e1ddaf30ea8f3b5991bee140ff\"","nn.PNG":"\"4f552020576f107a715217482bd514ac\"","outcome pic.jpg":"\"9aed6fc67f71aeaa0cc5dd3fabd52379\"","page-background.svg":"\"9ca4624ac0594b9363e08808d07b4b31\"","patrick-perkins-8VurHsVsls4-unsplash (1).jpg":"\"2eaf1c447ebfdf1d28330036eaa041c3\"","patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg":"\"5cb6b2b550dd4fa6328ea9612f17c2db\"","pavan-trikutam-71CjSSB83Wo-unsplash.jpg":"\"e0db0e61e8168abc903d7782c6a77bcb\"","peterpicture.jpg":"\"59b00e0b527d4e6b02569da7d1ae41e0\"","pre-conditions for learning.jpg":"\"d2a9e6c7e502b52c571d41e82a976598\"","puzzle.jpg":"\"f26cc1fb26c968e5f67f57c7ca7174bf\"","ratchet":"\"b4e7c5fd97a537c893190609c61a9c5b\"","reasons for being here":"\"ecb1d91d6d0331a8be20c6fff7c31192\"","remove review tag":"\"40fd3127082ba41d816093584d462723\"","return to purpose ttt.jpg":"\"8052c8d5a7204cdaf9c497d8aba36503\"","return.jpg":"\"456d2c2bc832a31be4ab479930570461\"","right":"\"9176ccd95a6fd2cf62e77821ee6c6f4b\"","ripples.jpg":"\"18c21b9803ad151a484f61c4647df6e4\"","room options and import from file.jpg":"\"c1bfc3a42327434e5fcd6565b4818d92\"","screen.png":"\"7dbaaa7372dc45f0ac4810e2160d33cb\"","session 2 page 1":"\"6118492bb361bf8826af5f23e4b827c3\"","sign up.jpg":"\"8e59366d6c81c677f79a6601b67af3af\"","siora-photography-cixohzDpNIo-unsplash (1).jpg":"\"9d827341bc7e3e00572f8946c65e45af\"","stance tension client.jpg":"\"b75c52e6366c6ef7f23fd52caba57e35\"","stance tension learning.jpg":"\"9b9a75ff4dadc11f92c60261119c61e3\"","stance tension networks.jpg":"\"8ba19590a706cae2048b159fd2a75974\"","stance tension team.jpg":"\"45b30928e4c2313c74a883eeecd2cdbe\"","start game.jpg":"\"6a6bf11953a0405cc8a14ee372b3552c\"","state the case ttt.jpg":"\"05eea26b466002d63e7e839f2dbadd76\"","state.jpg":"\"cd8e3457ec48e8c6e0e3541b7b07679e\"","studying together image.jpg":"\"2180330f309aa508895f99912f7cac31\"","sympt.PNG":"\"aca8f4ce910119b1b44755e9576ef821\"","team learning situations-min.jpg":"\"6730826f1205a8a5153d41e019d21147\"","teleology drinking at work.jpg":"\"67aa180d7bf3423d96fc2769dfe0c1d9\"","thinking monkey.jpg":"\"6f53aeb1d8e506f804b7ae2667499698\"","thinkingtogether poster.pdf":"\"198a3edbdd66ee535680a106a3665193\"","tile motif.png":"\"27273baab32246e981957330f8a08c69\"","togimg.PNG":"\"494cacc7f331dec74a021c643ef5cf52\"","txtMainTab--2007612701":"\"162a3c9b1b47bc161b29d3feb4fc6ce3\"","what to measure pic (2).jpg":"\"9d1b53e038c570e44da827ed5f82f950\"","what to measure pic.jpg":"\"477e5494f1d699f9eca8c1a60c57b460\"","whyamihere.gif":"\"18c7cd5f2187c1c148984996a876710f\"","working together image.jpg":"\"0e9d4b75ff742887be79b9494a249733\"","world.PNG":"\"eaf4cd6e2076c4a25b36c3c357b776d5\"","yourrooms.jpg":"\"86feda764781cb31f9b73d53dbc9ffaf\""}
https://8y1wh49hn1.execute-api.eu-west-2.amazonaws.com/prod/
4s50tg1b4toisc43c4q42gsceq
eu-west-2:2756d3cb-8b8b-47a9-8248-595a9d254d91
AMBIT stands unambiguously in support of Black Lives Matter, recognising the disproportionate harms that fall on people of colour as a result of systemic discrimination and all forms of racism, and the need for an active stance of anti-racism. See also [[Equity, Diversity, and Inclusion (EDI) in AMBIT]].
[img width=150 [SiteIcon]]<br/>{{SiteTitle}}
Administrative tiddler listings:
* [[Tiddlers written in old "classic" syntax|$:/_/Admin/ClassicTiddlers]]
* [[Classic tiddlers using the <<tabs>> macro|$:/_/Admin/ClassicTiddlersWithTagsMacro]]
* [[Tiddlers last edited before a cut-off date|$:/_/Admin/Old Tiddlers]]
This listing shows all tiddlers still using the older "classic" wikitext type:
<ol>
<$list filter="[all[tiddlers]type[text/x-tiddlywiki]sort[]]">
<li>
<$link>
<$text text=<<currentTiddler>>/>
</$link>
</li>
</$list>
</ol>
This listing shows all tiddlers still using the older "classic" wikitext type that include the `<<tags>>` macro:
<ol>
<$list filter="[all[tiddlers]type[text/x-tiddlywiki]search[<<tabs]sort[]]">
<li>
<$link>
<$text text=<<currentTiddler>>/>
</$link>
</li>
</$list>
</ol>
This listing shows all tiddlers that date from before a particular year. Edit the tiddler to change the cut-off date.
<ol>
<$list filter="[all[tiddlers]] :filter[get[modified]compare:date:lteq[2016]] +[sort[modified]]">
<li>
<$link>
<$view field="modified" format="date" template="DDth MMM YYYY"/>: <$text text=<<currentTiddler>>/>
</$link>
</li>
</$list>
</ol>
<div class="tc-afc-above-story-logo">
[img width=160 [$:/_AFC/grey-wordmark.svg]]
</div>
<$reveal type="nomatch" state=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<div class="tc-xememex-tiddler-info tc-subtitle">
Bag: <$view tiddler="$:/state/federatial/xememex/tiddlers/bag" index=<<currentTiddler>>>(none)</$view>
</div>
</$reveal>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: normal;
font-weight: 300;
src: url(/fonts/$:/_fonts/FormaDJRBanner-Light.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: italic;
font-weight: 300;
src: url(/fonts/$:/_fonts/FormaDJRBanner-LightItalic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: normal;
font-weight: 400;
src: url(/fonts/$:/_fonts/FormaDJRBanner-Regular.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: italic;
font-weight: 400;
src: url(/fonts/$:/_fonts/FormaDJRBanner-Italic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: normal;
font-weight: 500;
src: url(/fonts/$:/_fonts/FormaDJRBanner-Medium.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: italic;
font-weight: 500;
src: url(/fonts/$:/_fonts/FormaDJRBanner-MediumItalic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: FormaDJRBanner;
font-style: italic;
font-weight: 700;
src: url(/fonts/$:/_fonts/FormaDJRBanner-BoldItalic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: normal;
font-weight: 400;
src: url(/fonts/$:/_fonts/Mulish-Regular.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: italic;
font-weight: 400;
src: url(/fonts/$:/_fonts/Mulish-Italic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: normal;
font-weight: 700;
src: url(/fonts/$:/_fonts/Mulish-Bold.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: italic;
font-weight: 700;
src: url(/fonts/$:/_fonts/Mulish-BoldItalic.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: normal;
font-weight: 900;
src: url(/fonts/$:/_fonts/Mulish-Black.woff) format("woff");
}
@font-face {
font-display: swap;
font-family: Mulish;
font-style: italic;
font-weight: 900;
src: url(/fonts/$:/_fonts/Mulish-BlackItalic.woff) format("woff");
}
html body.tc-body {
font-family: "Mulish";
}
.tc-top-menu,
.tc-site-title,
.tc-site-subtitle,
h1, h2, h3, h4, h5, h6 {
font-family: "FormaDJRBanner";
letter-spacing: 0.09em;
font-weight: 600;
text-align: left;
}
h1 button, h2 button, h3 button, h4 button, h5 button, h6 button {
letter-spacing: 0.09em;
}
.tc-site-title {
font-weight: bold;
}
body .tc-titlebar h2 {
font-weight: 700;
}
\define image(title,width,height)
<$image source=<<__title__>> width=<<__width__>> height=<<__height__>>/>
\end
\define embed-video(code)
<$reveal state="$:/state/consent-banner/accepted" type="match" text="yes" tag="div">
<iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</$reveal>
<$reveal state="$:/state/consent-banner/accepted" type="nomatch" text="yes" tag="div">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</$reveal>
\end
<<embed-video KtCUr83XgyE>>
afc-white: #fff
afc-black: #000
afc-black-half: #888888
afc-grey: #f8f8f8
afc-light-grey: #f4f4f4
afc-dark-grey: #bfbfbf
afc-darken-grey: #03070a
afc-dark-blue: #232d5a
afc-solid-turquoise: #64c3d7
afc-mid-turquoise: #afdce6
afc-light-turquoise: #eff8f9
afc-solid-purple: #645fa5
afc-mid-purple: #aaa0cd
afc-light-purple: #e4e1f2
afc-solid-pink: #ed73aa
afc-mid-pink: #f0afcb
afc-light-pink: #fbe3f0
afc-solid-yellow: #ffe516
afc-mid-yellow: #ffebaf
afc-light-yellow: #fff6e1
afc-solid-green: #73be6e
afc-mid-green: #bedcaf
afc-light-green: #d7ead9
consent-banner-background: <<colour afc-light-purple>>
consent-banner-foreground: <<colour afc-dark-blue>>
consent-banner-link-foreground: <<colour afc-dark-blue>>
consent-banner-button-border: <<colour afc-dark-blue>>
consent-banner-button-foreground: <<colour afc-dark-blue>>
consent-banner-button-background: <<colour afc-light-purple>>
consent-banner-button-hover-foreground: <<colour afc-light-purple>>
consent-banner-button-hover-border: <<colour afc-light-purple>>
consent-banner-button-hover-background: <<colour afc-dark-blue>>
consent-banner-button-default-foreground: <<colour afc-light-purple>>
consent-banner-button-default-background: <<colour afc-dark-blue>>
menubar-background: <<colour afc-solid-purple>>
menubar-foreground: <<colour afc-white>>
page-footer-background: <<colour afc-solid-green>>
page-footer-foreground: <<colour afc-white>>
alert-background: <<color afc-white>>
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #fff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #34c734
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: <<color afc-black>>
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: #bbb
notification-background: #ffffdd
notification-border: #999999
page-background: <<color afc-light-turquoise>>
pre-background: #f5f5f5
pre-border: #cccccc
primary: <<colour afc-solid-purple>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #aaaaaa
sidebar-foreground-shadow: rgba(0,0,0,0)
sidebar-foreground: <<colour afc-dark-blue>>
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #f4f4f4
sidebar-tab-background: #e0e0e0
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: #e4e4e4
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: <<colour afc-dark-blue>>
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #d8d8d8
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: <<colour afc-mid-yellow>>
tag-foreground: <<colour afc-black>>
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: <<colour afc-dark-blue>>
tiddler-controls-foreground-selected: <<colour afc-black>>
tiddler-controls-foreground: <<colour afc-solid-turquoise>>
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: <<colour afc-dark-blue>>
tiddler-title-foreground: #182955
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
\define timeline-title()
<$view field="title"/> <$list filter="[all[current]frombag{$:/plugins/federatial/xememex/config/recipe}]" variable="listItem"><span style="display:inline-block;background:#ff4;border:1px solid #cc0;color:black;padding:0 2px;border-radius:4px;font-size:0.8em;line-height:1.3;">local</span></$list>
\end
<$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}}/>
<$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}} subfilter="frombag{$:/plugins/federatial/xememex/config/recipe}"/>
<!--
<$list filter="[<currentTiddler>!is[tiddler]]" variable="ignore">
<div class="tc-sidebuttons">
<a href="mailto:manuals@annafreud.org?subject=Feedback%20on%20the%20manuals" target="__blank">
{{$:/core/images/plugin-generic-language}} Give Feedback
</a>
</div>
</$list>
-->
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.tc-sidebuttons {
position: fixed;
right: 0;
top: 50%;
width: 8em;
}
.tc-sidebuttons svg {
fill: <<colour background>>;
float: left;
width: 2em;
height: 2em;
margin-right: 4px;
}
.tc-sidebuttons a {
display: block;
background: <<colour afc-green>>;
padding: 4px;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
font-weight: bold;
text-decoration: none;
color: <<colour background>>;
}
.tc-sidebuttons a:hover {
background: <<colour afc-pale-green>>;
}
<$action-setfield $tiddler="$:/state/showeditpreview" $value="yes"/>
<$action-setfield $tiddler="$:/state/editpreviewtype" $value="$:/core/ui/EditTemplate/body/preview/output"/>
/* ------------------------------------------
PURE CSS SPEECH BUBBLES
by Nicolas Gallagher
- http://nicolasgallagher.com/pure-css-speech-bubbles/
http://nicolasgallagher.com
http://twitter.com/necolas
Created: 02 March 2010
Version: 1.2 (03 March 2011)
Dual licensed under MIT and GNU GPLv2 Nicolas Gallagher
------------------------------------------ */
/* NOTE: Some declarations use longhand notation so that it can be clearly
explained what specific properties or values do and what their relationship
is to other properties or values in creating the effect */
/* ============================================================================================================================
== BUBBLE WITH AN ISOCELES TRIANGLE
** ============================================================================================================================ */
/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-isosceles {
position:relative;
padding:15px;
margin:1em 0 3em;
color:#000;
background:#f3961c; /* default background for browsers without gradient support */
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#f9d835), to(#f3961c));
background:-moz-linear-gradient(#f9d835, #f3961c);
background:-o-linear-gradient(#f9d835, #f3961c);
background:linear-gradient(#f9d835, #f3961c);
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* Variant : for top positioned triangle
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-top {
background:-webkit-gradient(linear, 0 0, 0 100%, from(#f3961c), to(#f9d835));
background:-moz-linear-gradient(#f3961c, #f9d835);
background:-o-linear-gradient(#f3961c, #f9d835);
background:linear-gradient(#f3961c, #f9d835);
}
/* Variant : for left/right positioned triangle
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-left {
margin-left:50px;
background:#f3961c;
}
/* Variant : for right positioned triangle
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-right {
margin-right:50px;
background:#f3961c;
}
/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */
/* creates triangle */
.bubbles-triangle-isosceles:after {
content:"";
position:absolute;
bottom:-15px; /* value = - border-top-width - border-bottom-width */
left:50px; /* controls horizontal position */
border-width:15px 15px 0; /* vary these values to change the angle of the vertex */
border-style:solid;
border-color:#f3961c transparent;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* Variant : top
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-top:after {
top:-15px; /* value = - border-top-width - border-bottom-width */
right:50px; /* controls horizontal position */
bottom:auto;
left:auto;
border-width:0 15px 15px; /* vary these values to change the angle of the vertex */
border-color:#f3961c transparent;
}
/* Variant : left
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-left:after {
top:16px; /* controls vertical position */
left:-50px; /* value = - border-left-width - border-right-width */
bottom:auto;
border-width:10px 50px 10px 0;
border-color:transparent #f3961c;
}
/* Variant : right
------------------------------------------ */
.bubbles-triangle-isosceles.bubbles-right:after {
top:16px; /* controls vertical position */
right:-50px; /* value = - border-left-width - border-right-width */
bottom:auto;
left:auto;
border-width:10px 0 10px 50px;
border-color:transparent #f3961c;
}
/* ============================================================================================================================
== BUBBLE WITH A RIGHT-ANGLED TRIANGLE
** ============================================================================================================================ */
/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-right {
position:relative;
padding:15px;
margin:1em 0 3em;
color:#fff;
background:#075698; /* default background for browsers without gradient support */
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698));
background:-moz-linear-gradient(#2e88c4, #075698);
background:-o-linear-gradient(#2e88c4, #075698);
background:linear-gradient(#2e88c4, #075698);
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* Variant : for top positioned triangle
------------------------------------------ */
.bubbles-triangle-right.bubbles-top {
background:-webkit-gradient(linear, 0 0, 0 100%, from(#075698), to(#2e88c4));
background:-moz-linear-gradient(#075698, #2e88c4);
background:-o-linear-gradient(#075698, #2e88c4);
background:linear-gradient(#075698, #2e88c4);
}
/* Variant : for left positioned triangle
------------------------------------------ */
.bubbles-triangle-right.bubbles-left {
margin-left:40px;
background:#075698;
}
/* Variant : for right positioned triangle
------------------------------------------ */
.bubbles-triangle-right.bubbles-right {
margin-right:40px;
background:#075698;
}
/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-right:after {
content:"";
position:absolute;
bottom:-20px; /* value = - border-top-width - border-bottom-width */
left:50px; /* controls horizontal position */
border-width:20px 0 0 20px; /* vary these values to change the angle of the vertex */
border-style:solid;
border-color:#075698 transparent;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* Variant : top
------------------------------------------ */
.bubbles-triangle-right.bubbles-top:after {
top:-20px; /* value = - border-top-width - border-bottom-width */
right:50px; /* controls horizontal position */
bottom:auto;
left:auto;
border-width:20px 20px 0 0; /* vary these values to change the angle of the vertex */
border-color:transparent #075698;
}
/* Variant : left
------------------------------------------ */
.bubbles-triangle-right.bubbles-left:after {
top:16px;
left:-40px; /* value = - border-left-width - border-right-width */
bottom:auto;
border-width:15px 40px 0 0; /* vary these values to change the angle of the vertex */
border-color:transparent #075698;
}
/* Variant : right
------------------------------------------ */
.bubbles-triangle-right.bubbles-right:after {
top:16px;
right:-40px; /* value = - border-left-width - border-right-width */
bottom:auto;
left:auto;
border-width:15px 0 0 40px; /* vary these values to change the angle of the vertex */
border-color:transparent #075698 ;
}
/* ============================================================================================================================
== BUBBLE WITH AN OBTUSE TRIANGLE
** ============================================================================================================================ */
/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-obtuse {
position:relative;
padding:15px;
margin:1em 0 3em;
color:#fff;
background:#c81e2b;
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#f04349), to(#c81e2b));
background:-moz-linear-gradient(#f04349, #c81e2b);
background:-o-linear-gradient(#f04349, #c81e2b);
background:linear-gradient(#f04349, #c81e2b);
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* Variant : for top positioned triangle
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-top {
background:-webkit-gradient(linear, 0 0, 0 100%, from(#c81e2b), to(#f04349));
background:-moz-linear-gradient(#c81e2b, #f04349);
background:-o-linear-gradient(#c81e2b, #f04349);
background:linear-gradient(#c81e2b, #f04349);
}
/* Variant : for left positioned triangle
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-left {
margin-left:50px;
background:#c81e2b;
}
/* Variant : for right positioned triangle
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-right {
margin-right:50px;
background:#c81e2b;
}
/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */
/* creates the wider right-angled triangle */
.bubbles-triangle-obtuse:before {
content:"";
position:absolute;
bottom:-20px; /* value = - border-top-width - border-bottom-width */
left:60px; /* controls horizontal position */
border:0;
border-right-width:30px; /* vary this value to change the angle of the vertex */
border-bottom-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :after */
border-style:solid;
border-color:transparent #c81e2b;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* creates the narrower right-angled triangle */
.bubbles-triangle-obtuse:after {
content:"";
position:absolute;
bottom:-20px; /* value = - border-top-width - border-bottom-width */
left:80px; /* value = (:before's left) + (:before's border-right/left-width) - (:after's border-right/left-width) */
border:0;
border-right-width:10px; /* vary this value to change the angle of the vertex */
border-bottom-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :before */
border-style:solid;
border-color:transparent #fff;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* Variant : top
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-top:before {
top:-20px; /* value = - border-top-width - border-bottom-width */
bottom:auto;
left:auto;
right:60px; /* controls horizontal position */
border:0;
border-left-width:30px; /* vary this value to change the width of the triangle */
border-top-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :after */
border-color:transparent #c81e2b;
}
.bubbles-triangle-obtuse.bubbles-top:after {
top:-20px; /* value = - border-top-width - border-bottom-width */
bottom:auto;
left:auto;
right:80px; /* value = (:before's right) + (:before's border-right/left-width) - (:after's border-right/left-width) */
border-width:0;
border-left-width:10px; /* vary this value to change the width of the triangle */
border-top-width:20px; /* vary this value to change the height of the triangle. must be equal to the corresponding value in :before */
border-color:transparent #fff;
}
/* Variant : left
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-left:before {
top:15px; /* controls vertical position */
bottom:auto;
left:-50px; /* value = - border-left-width - border-right-width */
border:0;
border-bottom-width:30px; /* vary this value to change the height of the triangle */
border-left-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :after */
border-color:#c81e2b transparent;
}
.bubbles-triangle-obtuse.bubbles-left:after {
top:35px; /* value = (:before's top) + (:before's border-top/bottom-width) - (:after's border-top/bottom-width) */
bottom:auto;
left:-50px; /* value = - border-left-width - border-right-width */
border:0;
border-bottom-width:10px; /* vary this value to change the height of the triangle */
border-left-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :before */
border-color:#fff transparent;
}
/* Variant : right
------------------------------------------ */
.bubbles-triangle-obtuse.bubbles-right:before {
top:15px; /* controls vertical position */
bottom:auto;
left:auto;
right:-50px; /* value = - border-left-width - border-right-width */
border:0;
border-bottom-width:30px; /* vary this value to change the height of the triangle */
border-right-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :after */
border-color:#c81e2b transparent;
}
.bubbles-triangle-obtuse.bubbles-right:after {
top:35px; /* value = (:before's top) + (:before's border-top/bottom-width) - (:after's border-top/bottom-width) */
bottom:auto;
right:-50px; /* value = - border-left-width - border-right-width */
left:auto;
border:0;
border-bottom-width:10px; /* vary this value to change the height of the triangle */
border-right-width:50px; /* vary this value to change the width of the triangle. must be equal to the corresponding value in :before */
border-color:#fff transparent;
}
/* ============================================================================================================================
== BUBBLE WITH A BORDER AND TRIANGLE
** ============================================================================================================================ */
/* THE SPEECH BUBBLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-border {
position:relative;
padding:15px;
margin:1em 0 3em;
border:5px solid #A9A9A9;
color:#333;
background:#fff;
/* css3 */
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* Variant : for left positioned triangle
------------------------------------------ */
.bubbles-triangle-border.bubbles-left {
margin-left:30px;
}
/* Variant : for right positioned triangle
------------------------------------------ */
.bubbles-triangle-border.bubbles-right {
margin-right:30px;
}
/* THE TRIANGLE
------------------------------------------------------------------------------------------------------------------------------- */
.bubbles-triangle-border:before {
content:"";
position:absolute;
bottom:-20px; /* value = - border-top-width - border-bottom-width */
left:40px; /* controls horizontal position */
border-width:20px 20px 0;
border-style:solid;
border-color:#A9A9A9 transparent;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* creates the smaller triangle */
.bubbles-triangle-border:after {
content:"";
position:absolute;
bottom:-13px; /* value = - border-top-width - border-bottom-width */
left:47px; /* value = (:before left) + (:before border-left) - (:after border-left) */
border-width:13px 13px 0;
border-style:solid;
border-color:#fff transparent;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* Variant : top
------------------------------------------ */
/* creates the larger triangle */
.bubbles-triangle-border.bubbles-top:before {
top:-20px; /* value = - border-top-width - border-bottom-width */
bottom:auto;
left:auto;
right:40px; /* controls horizontal position */
border-width:0 20px 20px;
}
/* creates the smaller triangle */
.bubbles-triangle-border.bubbles-top:after {
top:-13px; /* value = - border-top-width - border-bottom-width */
bottom:auto;
left:auto;
right:47px; /* value = (:before right) + (:before border-right) - (:after border-right) */
border-width:0 13px 13px;
}
/* Variant : left
------------------------------------------ */
/* creates the larger triangle */
.bubbles-triangle-border.bubbles-left:before {
top:10px; /* controls vertical position */
bottom:auto;
left:-30px; /* value = - border-left-width - border-right-width */
border-width:15px 30px 15px 0;
border-color:transparent #A9A9A9;
}
/* creates the smaller triangle */
.bubbles-triangle-border.bubbles-left:after {
top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
bottom:auto;
left:-21px; /* value = - border-left-width - border-right-width */
border-width:9px 21px 9px 0;
border-color:transparent #fff;
}
/* Variant : right
------------------------------------------ */
/* creates the larger triangle */
.bubbles-triangle-border.bubbles-right:before {
top:10px; /* controls vertical position */
bottom:auto;
left:auto;
right:-30px; /* value = - border-left-width - border-right-width */
border-width:15px 0 15px 30px;
border-color:transparent #A9A9A9;
}
/* creates the smaller triangle */
.bubbles-triangle-border.bubbles-right:after {
top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
bottom:auto;
left:auto;
right:-21px; /* value = - border-left-width - border-right-width */
border-width:9px 0 9px 21px;
border-color:transparent #fff;
}
/* ============================================================================================================================
== SPEECH BUBBLE ICON
** ============================================================================================================================ */
.bubbles-example-commentheading {
position:relative;
padding:0;
color:#b513af;
}
/* creates the rectangle */
.bubbles-example-commentheading:before {
content:"";
position:absolute;
top:9px;
left:-25px;
width:15px;
height:10px;
background:#b513af;
/* css3 */
-webkit-border-radius:3px;
-moz-border-radius:3px;
border-radius:3px;
}
/* creates the triangle */
.bubbles-example-commentheading:after {
content:"";
position:absolute;
top:15px;
left:-19px;
border:4px solid transparent;
border-left-color:#b513af;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* ============================================================================================================================
== BLOCKQUOTE WITH RIGHT-ANGLED TRIANGLE
** ============================================================================================================================ */
.bubbles-example-right {
position:relative;
padding:15px 30px;
margin:0;
color:#fff;
background:#5a8f00; /* default background for browsers without gradient support */
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#b8db29), to(#5a8f00));
background:-moz-linear-gradient(#b8db29, #5a8f00);
background:-o-linear-gradient(#b8db29, #5a8f00);
background:linear-gradient(#b8db29, #5a8f00);
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* display of quote author (alternatively use a class on the element following the blockquote) */
.example-right + p {margin:15px 0 2em 85px; font-style:italic;}
/* creates the triangle */
.bubbles-example-right:after {
content:"";
position:absolute;
bottom:-50px;
left:50px;
border-width:0 20px 50px 0px;
border-style:solid;
border-color:transparent #5a8f00;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* ============================================================================================================================
== BLOCKQUOTE WITH OBTUSE TRIANGLE
** ============================================================================================================================ */
.bubbles-example-obtuse {
position:relative;
padding:15px 30px;
margin:0;
color:#000;
background:#f3961c; /* default background for browsers without gradient support */
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#f9d835), to(#f3961c));
background:-moz-linear-gradient(#f9d835, #f3961c);
background:-o-linear-gradient(#f9d835, #f3961c);
background:linear-gradient(#f9d835, #f3961c);
/* Using longhand to avoid inconsistencies between Safari 4 and Chrome 4 */
-webkit-border-top-left-radius:25px 50px;
-webkit-border-top-right-radius:25px 50px;
-webkit-border-bottom-right-radius:25px 50px;
-webkit-border-bottom-left-radius:25px 50px;
-moz-border-radius:25px / 50px;
border-radius:25px / 50px;
}
/* display of quote author (alternatively use a class on the element following the blockquote) */
.example-obtuse + p {margin:10px 150px 2em 0; text-align:right; font-style:italic;}
/* creates the larger triangle */
.bubbles-example-obtuse:before {
content:"";
position:absolute;
bottom:-30px;
right:80px;
border-width:0 0 30px 50px;
border-style:solid;
border-color:transparent #f3961c;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* creates the smaller triangle */
.bubbles-example-obtuse:after {
content:"";
position:absolute;
bottom:-30px;
right:110px;
border-width:0 0 30px 20px;
border-style:solid;
border-color:transparent #fff;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* ============================================================================================================================
== TWITTER
** ============================================================================================================================ */
.bubbles-example-twitter {
position:relative;
padding:15px;
margin:100px 0 0.5em;
color:#333;
background:#eee;
/* css3 */
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
.bubbles-example-twitter p {font-size:28px; line-height:1.25em;}
/* this isn't necessary, just saves me having to edit the HTML of the demo */
.bubbles-example-twitter:before {
content:url(twitter-logo.gif);
position:absolute;
top:-60px;
left:0;
width:155px;
height:36px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates the triangle */
.bubbles-example-twitter:after {
content:"";
position:absolute;
top:-30px;
left:50px;
border:15px solid transparent;
border-bottom-color:#eee;
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
/* display of quote author (alternatively use a class on the element following the blockquote) */
.bubbles-example-twitter + p {padding-left:15px; font:14px Arial, sans-serif;}
/* ============================================================================================================================
== NUMBER
** ============================================================================================================================ */
.bubbles-example-number {
position:relative;
width:200px;
height:200px;
margin:50px 0 200px;
text-align:center;
font:140px/200px Arial, sans-serif;
color:#fff;
background:#C91F2C;
}
/* creates the larger triangle */
.bubbles-example-number:before {
content:"";
position:absolute;
bottom:-140px;
right:0;
border-width:0 0 140px 140px;
border-style:solid;
border-color:transparent #C91F2C;
}
/* creates the larger triangle */
.bubbles-example-number:after {
content:"";
position:absolute;
bottom:-140px;
right:85px;
border-width:0 0 140px 55px;
border-style:solid;
border-color:transparent #fff;
}
/* ============================================================================================================================
== PINCHED SPEECH BUBBLE (more CSS3)
** ============================================================================================================================ */
.bubbles-pinched {
position:relative;
padding:15px;
margin:50px 0 3em;
text-align:center;
color:#fff;
background:#333;
/* css3 */
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* creates a rectangle of the colour wanted for the pointy bit */
.bubbles-pinched:before {
content:"";
position:absolute;
top:-20px;
left:50%;
width:100px;
height:20px;
margin:0 0 0 -50px;
background:#333;
}
/* creates a rounded rectangle to cover part of the rectangle generated above */
.bubbles-pinched:after {
content:"";
position:absolute;
top:-20px;
left:0;
width:50%;
height:20px;
background:#fff;
/* css3 */
-webkit-border-bottom-right-radius:15px;
-moz-border-radius-bottomright:15px;
border-bottom-right-radius:15px;
}
/* creates the other rounded rectangle */
.bubbles-pinched > :first-child:before {
content:"";
position:absolute;
top:-20px;
right:0;
width:50%;
height:20px;
background:#fff;
/* css3 */
-webkit-border-bottom-left-radius:15px;
-moz-border-radius-bottomleft:15px;
border-bottom-left-radius:15px;
}
/* ============================================================================================================================
== OVAL SPEECH BUBBLE (more CSS3)
** ============================================================================================================================ */
.bubbles-oval-speech {
position:relative;
width:270px;
padding:50px 40px;
margin:1em auto 50px;
text-align:center;
color:#fff;
background:#5a8f00;
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#b8db29), to(#5a8f00));
background:-moz-linear-gradient(#b8db29, #5a8f00);
background:-o-linear-gradient(#b8db29, #5a8f00);
background:linear-gradient(#b8db29, #5a8f00);
/*
NOTES:
-webkit-border-radius:220px 120px; // produces oval in safari 4 and chrome 4
-webkit-border-radius:220px / 120px; // produces oval in chrome 4 (again!) but not supported in safari 4
Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
*/
-webkit-border-top-left-radius:220px 120px;
-webkit-border-top-right-radius:220px 120px;
-webkit-border-bottom-right-radius:220px 120px;
-webkit-border-bottom-left-radius:220px 120px;
-moz-border-radius:220px / 120px;
border-radius:220px / 120px;
}
.bubbles-oval-speech p {font-size:1.25em;}
/* creates part of the curve */
.bubbles-oval-speech:before {
content:"";
position:absolute;
z-index:-1;
bottom:-30px;
right:50%;
height:30px;
border-right:60px solid #5a8f00;
background:#5a8f00; /* need this for webkit - bug in handling of border-radius */
/* css3 */
-webkit-border-bottom-right-radius:80px 50px;
-moz-border-radius-bottomright:80px 50px;
border-bottom-right-radius:80px 50px;
/* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
-webkit-transform:translate(0, -2px);
-moz-transform:translate(0, -2px);
-ms-transform:translate(0, -2px);
-o-transform:translate(0, -2px);
transform:translate(0, -2px);
}
/* creates part of the curved pointy bit */
.bubbles-oval-speech:after {
content:"";
position:absolute;
z-index:-1;
bottom:-30px;
right:50%;
width:60px;
height:30px;
background:#fff;
/* css3 */
-webkit-border-bottom-right-radius:40px 50px;
-moz-border-radius-bottomright:40px 50px;
border-bottom-right-radius:40px 50px;
/* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
-webkit-transform:translate(-30px, -2px);
-moz-transform:translate(-30px, -2px);
-ms-transform:translate(-30px, -2px);
-o-transform:translate(-30px, -2px);
transform:translate(-30px, -2px);
}
/* ============================================================================================================================
== OVAL THOUGHT BUBBLE (more CSS3)
** ============================================================================================================================ */
.bubbles-oval-thought {
position:relative;
width:270px;
padding:50px 40px;
margin:1em auto 80px;
text-align:center;
color:#fff;
background:#075698;
/* css3 */
background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698));
background:-moz-linear-gradient(#2e88c4, #075698);
background:-o-linear-gradient(#2e88c4, #075698);
background:linear-gradient(#2e88c4, #075698);
/*
NOTES:
-webkit-border-radius:220px 120px; // produces oval in safari 4 and chrome 4
-webkit-border-radius:220px / 120px; // produces oval in chrome 4 (again!) but not supported in safari 4
Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
*/
-webkit-border-top-left-radius:220px 120px;
-webkit-border-top-right-radius:220px 120px;
-webkit-border-bottom-right-radius:220px 120px;
-webkit-border-bottom-left-radius:220px 120px;
-moz-border-radius:220px / 120px;
border-radius:220px / 120px;
}
.bubbles-oval-thought p {font-size:1.25em;}
/* creates the larger circle */
.bubbles-oval-thought:before {
content:"";
position:absolute;
bottom:-20px;
left:50px;
width:30px;
height:30px;
background:#075698;
/* css3 */
-webkit-border-radius:30px;
-moz-border-radius:30px;
border-radius:30px;
}
/* creates the smaller circle */
.bubbles-oval-thought:after {
content:"";
position:absolute;
bottom:-30px;
left:30px;
width:15px;
height:15px;
background:#075698;
/* css3 */
-webkit-border-radius:15px;
-moz-border-radius:15px;
border-radius:15px;
}
/* ============================================================================================================================
== OVAL SPEECH BUBBLE WITH QUOTATION MARKS (more CSS3)
** ============================================================================================================================ */
.bubbles-oval-quotes {
position:relative;
width:400px;
height:350px;
margin:2em auto 10px;
color:#000;
background:#ffed26;
/* css3 */
/*
NOTES:
-webkit-border-radius:Apx Bpx; // produces oval in safari 4 and chrome 4
-webkit-border-radius:Apx / Bpx; // produces oval in chrome 4 (again!) but not supported in safari 4
Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
*/
-webkit-border-top-left-radius:400px 350px;
-webkit-border-top-right-radius:400px 350px;
-webkit-border-bottom-right-radius:400px 350px;
-webkit-border-bottom-left-radius:400px 350px;
-moz-border-radius:400px / 350px;
border-radius:400px / 350px;
}
/* creates opening quotation mark */
.bubbles-oval-quotes:before {
content:"\201C";
position:absolute;
z-index:1;
top:20px;
left:20px;
font:80px/1 Georgia, serif;
color:#ffed26;
}
/* creates closing quotation mark */
.bubbles-oval-quotes:after {
content:"\201D";
position:absolute;
z-index:1;
bottom:0;
right:20px;
font:80px/0.25 Georgia, serif;
color:#ffed26;
}
.bubbles-oval-quotes p {
width:250px;
height:250px;
padding:50px 0 0;
margin:0 auto;
text-align:center;
font-size:35px;
}
/* creates smaller curve */
.bubbles-oval-quotes p:before {
content:"";
position:absolute;
z-index:-1;
bottom:-30px;
right:55%;
width:180px; /* wider than necessary to make it look a bit better in IE8 */
height:60px;
background:#fff; /* need this for webkit - bug in handling of border-radius */
/* css3 */
-webkit-border-bottom-right-radius:40px 50px;
-moz-border-radius-bottomright:40px 50px;
border-bottom-right-radius:40px 50px;
/* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
-webkit-transform:translate(-30px, -2px);
-moz-transform:translate(-30px, -2px);
-ms-transform:translate(-30px, -2px);
-o-transform:translate(-30px, -2px);
transform:translate(-30px, -2px);
}
/* creates larger curve */
.bubbles-oval-quotes p:after {
content:"";
position:absolute;
z-index:-2;
bottom:-30px;
right:25%;
height:80px;
border-right:200px solid #ffed26;
background:#ffed26; /* need this for webkit - bug in handling of border-radius */
/* css3 */
-webkit-border-bottom-right-radius:200px 100px;
-moz-border-radius-bottomright:200px 100px;
border-bottom-right-radius:200px 100px;
/* using translate to avoid undesired appearance in CSS2.1-capabable but CSS3-incapable browsers */
-webkit-transform:translate(0, -2px);
-moz-transform:translate(0, -2px);
-ms-transform:translate(0, -2px);
-o-transform:translate(0, -2px);
transform:translate(0, -2px);
/* reduce the damage in FF3.0 */
display:block;
width:0;
}
.bubbles-oval-quotes + p {
position:relative; /* part of the IE8 width compromise */
width:150px;
margin:0 0 2em;
font-size:18px;
font-weight:bold;
}
/* ============================================================================================================================
== RECTANGLE-BORDER STYLE WITH CURVE
** ============================================================================================================================ */
.bubbles-rectangle-speech-border {
position:relative;
padding:50px 15px;
margin:1em 0 3em;
border:10px solid #5a8f00;
text-align:center;
color:#333;
background:#fff;
/* css3 */
-webkit-border-radius:20px;
-moz-border-radius:20px;
border-radius:20px;
}
/* creates larger curve */
.bubbles-rectangle-speech-border:before {
content:"";
position:absolute;
z-index:10;
bottom:-40px;
left:50px;
width:50px;
height:30px;
border-style:solid;
border-width:0 10px 10px 0;
border-color:#5a8f00;
background:transparent;
/* css3 */
-webkit-border-bottom-right-radius:80px 50px;
-moz-border-radius-bottomright:80px 50px;
border-bottom-right-radius:80px 50px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates smaller curve */
.bubbles-rectangle-speech-border:after {
content:"";
position:absolute;
z-index:10;
bottom:-40px;
left:50px;
width:20px;
height:30px;
border-style:solid;
border-width:0 10px 10px 0;
border-color:#5a8f00;
background:transparent;
/* css3 */
-webkit-border-bottom-right-radius:40px 50px;
-moz-border-radius-bottomright:40px 50px;
border-bottom-right-radius:40px 50px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates a small circle to produce a rounded point where the two curves meet */
.bubbles-rectangle-speech-border > :first-child:before {
content:"";
position:absolute;
bottom:-40px;
left:45px;
width:10px;
height:10px;
background:#5a8f00;
/* css3 */
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* creates a white rectangle to cover part of the oval border*/
.bubbles-rectangle-speech-border > :first-child:after {
content:"";
position:absolute;
bottom:-10px;
left:76px;
width:24px;
height:15px;
background:#fff;
}
/* ============================================================================================================================
== OVER SPEECH BUBBLE, EMPTY, WITH BORDER (more CSS3)
** ============================================================================================================================ */
.bubbles-oval-speech-border {
position:relative;
padding:70px 30px;
margin:1em auto 60px;
border:10px solid #f3961c;
text-align:center;
color:#333;
background:#fff;
/* css3 */
/*
NOTES:
-webkit-border-radius:240px 140px; // produces oval in safari 4 and chrome 4
-webkit-border-radius:240px / 140px; // produces oval in chrome 4 (again!) but not supported in safari 4
Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
*/
-webkit-border-top-left-radius:240px 140px;
-webkit-border-top-right-radius:240px 140px;
-webkit-border-bottom-right-radius:240px 140px;
-webkit-border-bottom-left-radius:240px 140px;
-moz-border-radius:240px / 140px;
border-radius:240px / 140px;
}
/* creates larger curve */
.bubbles-oval-speech-border:before {
content:"";
position:absolute;
z-index:2;
bottom:-40px;
right:50%;
width:50px;
height:30px;
border-style:solid;
border-width:0 10px 10px 0;
border-color:#f3961c;
margin-right:-10px;
background:transparent;
/* css3 */
-webkit-border-bottom-right-radius:80px 50px;
-moz-border-radius-bottomright:80px 50px;
border-bottom-right-radius:80px 50px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates smaller curve */
.bubbles-oval-speech-border:after {
content:"";
position:absolute;
z-index:2;
bottom:-40px;
right:50%;
width:20px;
height:31px;
border-style:solid;
border-width:0 10px 10px 0;
border-color:#f3961c;
margin-right:20px;
background:transparent;
/* css3 */
-webkit-border-bottom-right-radius:40px 50px;
-moz-border-radius-bottomright:40px 50px;
border-bottom-right-radius:40px 50px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates a small circle to produce a rounded point where the two curves meet */
.bubbles-oval-speech-border > :first-child:before {
content:"";
position:absolute;
z-index:1;
bottom:-40px;
right:50%;
width:10px;
height:10px;
margin-right:45px;
background:#f3961c;
/* css3 */
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
/* creates a white rectangle to cover part of the oval border*/
.bubbles-oval-speech-border > :first-child:after {
content:"";
position:absolute;
z-index:1;
bottom:-10px;
right:50%;
width:30px;
height:15px;
background:#fff;
}
/* ============================================================================================================================
== OVER THOUGHT BUBBLE, EMPTY, WITH BORDER (more CSS3)
** ============================================================================================================================ */
.bubbles-oval-thought-border {
position:relative;
padding:70px 30px;
margin:1em auto 80px;
border:10px solid #c81e2b;
text-align:center;
color:#333;
background:#fff;
/* css3 */
/*
NOTES:
-webkit-border-radius:240px 140px; // produces oval in safari 4 and chrome 4
-webkit-border-radius:240px / 140px; // produces oval in chrome 4 (again!) but not supported in safari 4
Not correct application of the current spec, therefore, using longhand to avoid future problems with webkit corrects this
*/
-webkit-border-top-left-radius:240px 140px;
-webkit-border-top-right-radius:240px 140px;
-webkit-border-bottom-right-radius:240px 140px;
-webkit-border-bottom-left-radius:240px 140px;
-moz-border-radius:240px / 140px;
border-radius:240px / 140px;
}
/* creates the larger circle */
.bubbles-oval-thought-border:before {
content:"";
position:absolute;
z-index:10;
bottom:-40px;
right:100px;
width:50px;
height:50px;
border:10px solid #c81e2b;
background:#fff;
/* css3 */
-webkit-border-radius:50px;
-moz-border-radius:50px;
border-radius:50px;
/* reduce the damage in FF3.0 */
display:block;
}
/* creates the smaller circle */
.bubbles-oval-thought-border:after {
content:"";
position:absolute;
z-index:10;
bottom:-60px;
right:50px;
width:25px;
height:25px;
border:10px solid #c81e2b;
background:#fff;
/* css3 */
-webkit-border-radius:25px;
-moz-border-radius:25px;
border-radius:25px;
/* reduce the damage in FF3.0 */
display:block;
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.tc-ext-doc-link {
color: <<color primary>>;
fill: <<color primary>>;
font-size: 1.2em;
font-weight: bold;
font-family: Mulish;
text-decoration: none;
border-radius: 4px;
padding: 0.3em;
margin: 0.3em -0.3em 0.3em -0.3em;
border: 2px solid transparent;
}
.tc-ext-doc-link svg {
vertical-align: middle;
height: 0.75em;
}
.tc-ext-doc-link img {
vertical-align: middle;
height: 1.3em;
}
.tc-ext-doc-link:hover {
color: <<color background>>;
fill: <<color background>>;
background: <<color primary>>;
border: 2px solid rgba(0,0,0,0.5);
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
<<if-sidebar """
.tc-sidebar-scrollable {
background: linear-gradient(to right,rgba(255,255,255,0) 0%,rgba(255,255,255,0.85) 42px,rgba(255,255,255,0.85) 100%);
}
""">>
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
<<if-sidebar """
.tc-sidebar-scrollable {
background: linear-gradient(to right,rgba(255,255,255,0.85) 0%,rgba(255,255,255,0.85) 100%);
}
""">>
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Fedit,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Finfo,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-btn-\%24\%3A\%2Fcore\%2Fui\%2FButtons\%2Fmore-tiddler-actions,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-tags-wrapper,
html body.tc-body .tc-tiddler-frame.tc-tagged-HideEditButton .tc-tagged-by {
display: none;
}
button.tc-tiddlylink, a.tc-tiddlylink {
font-weight: bold;
}
.tc-afc-above-story-logo {
background: <<colour afc-light-purple>>;
margin: -0.5em -0.5em 1.5em -0.5em;
padding: 0.5em 0.5em 0.5em 0.5em;
border-radius: 0.25rem;
}
h1, h2, h3, h4, h5, h6 {
margin: 0.75em -0.25em 0.25em -0.25em;
padding: 0.25em 0.25em 0.25em 0.25em;
border-radius: 0.25rem;
color: <<colour afc-dark-blue>>;
}
h1 {
background: <<colour afc-solid-turquoise>>;
}
h2 {
background: <<colour afc-solid-purple>>;
color: <<colour afc-white>>;
}
h3 {
background: <<colour afc-solid-yellow>>;
}
h4 {
background: <<colour afc-solid-green>>;
}
h5 {
background: <<colour afc-solid-pink>>;
}
.tc-titlebar h2,
h1.tc-site-title {
background: none;
color: <<colour afc-dark-blue>>;
}
div.tc-thumbnail-caption {
background: <<colour afc-dark-blue>>;
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.tc-topbar-right {
top: 0;
right: 0;
}
.tc-topbar-left {
display: inline-block;
top: 0;
left: 0;
width: 100%;
}
nav.tc-top-menu p {
margin: 0;
}
nav.tc-top-menu > ul {
position: relative;
list-style-type: none;
margin: 0;
padding: 0 0 0 42px;
text-transform: uppercase;
background: <<colour top-menu-background>>;
<<box-shadow "1px 1px 5px rgba(0, 0, 0, 0.3)">>
}
nav.tc-top-menu > ul > li {
display: inline-block;
margin: 0;
padding: 0;
}
nav.tc-top-menu > ul > li > a,
nav.tc-top-menu > ul > li > button {
display: block;
font-weight: 700;
color: <<colour top-menu-foreground>>;
fill: <<colour top-menu-foreground>>;
text-decoration: none;
padding: 0.5em;
margin: 0;
background: none;
border: none;
cursor: pointer;
text-transform: inherit;
border-radius: 0;
text-decoration: none;
}
nav.tc-top-menu > ul > li > a.tc-selected,
nav.tc-top-menu > ul > li > button.tc-selected {
background: <<colour top-menu-foreground>>;
color: <<colour top-menu-background>>;
fill: <<colour top-menu-background>>;
}
nav.tc-top-menu > ul > li svg {
width: 1em;
height: 1em;
fill: <<colour top-menu-foreground>>;
}
nav.tc-top-menu > ul > li > a:hover,
nav.tc-top-menu > ul > li > button:hover {
background: rgba(0,0,0,0.25);
border-radius: 0;
text-decoration: none;
}
nav.tc-top-menu .tc-drop-down {
max-height: 70vh;
overflow: auto;
}
nav.tc-top-menu .tc-drop-down a {
text-decoration: none;
}
nav.tc-top-menu .tc-drop-down button {
display: inline-block;
width: auto;
}
nav.tc-top-menu .tc-drop-down ol {
margin: 0;
}
<$list filter="[{$:/_AFC/SurveyBanner/URL}!is[blank]]" variable="ignore">
<a href={{$:/_AFC/SurveyBanner/URL}} target="_blank" class="tc-survey-banner">
<div class="tc-survey-banner-heading">
{{$:/core/images/plugin-generic-language}}
Help us improve
</div>
<div class="tc-survey-banner-body">
We are hoping to gather valuable feedback on your use and opinion of the Wiki Manuals. By sharing your thoughts and opinions, you will contribute directly to ongoing improvements. It will take no longer than 10 minutes of your time to complete.
</div>
</a>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock
.tc-survey-banner {
background: <<colour afc-light-green>>;
color: <<colour afc-dark-blue>>;
fill: <<colour afc-dark-blue>>;
padding: 1em;
text-shadow: none;
border-radius: 8px;
line-height: 1.2;
text-decoration: none;
display: block;
margin-right: 1em;
}
.tc-survey-banner:hover {
background: <<colour afc-dark-blue>>;
color: <<colour afc-light-green>>;
fill: <<colour afc-light-green>>;
}
.tc-survey-banner-heading {
font-size: 2em;
font-weight:bold;
margin-bottom: 0.5em;
}
.tc-survey-banner-heading svg {
width: 1em;
height: 1em;
vertical-align: text-bottom;
}
<hr/>
<$button class="tc-btn-invisible">
<$set name="tags" filter="[<currentTiddler>]">
<$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/>
Create new tiddler tagged '<$text text=<<currentTiddler>>/>'
</$set>
</$button>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.tc-tag-navigation-buttons {
clear: both;
display: flex;
font-size: em;
border: 1px solid #c1e1ea;
}
.tc-tag-navigation-button-previous,
.tc-tag-navigation-button-next {
cursor: pointer;
border: none;
background: #c1e1ea;
border-radius: 4px;
padding: 5px; color: white;
}
.tc-tag-navigation-button-middle {
flex: 1; font-size: 100%;
}
.tc-tag-navigation-body {
padding: 0.5em;
border-left: 1px solid #c1e1ea;
border-right: 1px solid #c1e1ea;
}
.tc-tag-navigation-button-previous:hover {
background-color:#94d2e3;
}
.tc-tag-navigation-button-next:hover {
background-color:#94d2e3;
}
\define tag-navigation-buttons()
<div class="tc-tag-navigation-buttons">
<$list filter="[<__tag__>tagging[]allbefore<currentTiddler>limit[1]]" variable="ignore">
<$button class="tc-tag-navigation-button tc-tag-navigation-button-previous">
<$action-setfield $tiddler=<<state>> $value={{{ [<__tag__>tagging[]before<currentTiddler>] }}}/>
{{left}} previous
</$button>
</$list>
<$button class="tc-tag-navigation-button tc-tag-navigation-button-middle tc-btn-invisible">
<$action-navigate $to=<<__tag__>>/>
(<$text text={{{ [<__tag__>tagging[]allbefore<currentTiddler>count[]add[1]] }}}/> of <$text text={{{ [<__tag__>tagging[]count[]] }}}/>)
</$button>
<$list filter="[<__tag__>tagging[]allafter<currentTiddler>limit[1]]" variable="ignore">
<$button class="tc-tag-navigation-button tc-tag-navigation-button-next">
<$action-setfield $tiddler=<<state>> $value={{{ [<__tag__>tagging[]after<currentTiddler>] }}}/>
next {{right}}
</$button>
</$list>
</div>
\end
\define tag-navigation(tag)
<div class="tc-tag-navigation">
<$set name="state" value=<<qualify "$:/state/tag-navigation">>>
<$set name="state" value={{{ [<state>addsuffix[/]addsuffix<__tag__>] }}}>
<$tiddler tiddler={{{ [<state>get[text]] ~[<__tag__>tagging[]first[]] }}}>
<<tag-navigation-buttons>>
<div class="tc-tag-navigation-body tc-tiddler-body">
<h1><$text text={{!!title}}/></h1>
<$transclude mode="block"/>
</div>
<<tag-navigation-buttons>>
</$tiddler>
</$set>
</$set>
</div>
\end
\whitespace trim
<div style="clear:both;">
</div>
<$list filter="[<currentTiddler>!hide-subpages[yes]]" variable="none">
<$list filter="[tag<currentTiddler>!tag[hide-subpage]limit[1]]" variable="none">
<div class="tc-tagged-by" style="float:right;">
Subpages:
<ul>
<$list filter="[tag<currentTiddler>!tag[hide-subpage]]">
<li>
<$link to=<<currentTiddler>>>
<$text text=<<currentTiddler>>/>
</$link>
</li>
</$list>
</ul>
</div>
</$list>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
body.tc-body .tc-tiddler-body {
clear: none;
}
.tc-tagged-by {
max-width: 50%;
font-size: 0.8em;
background: <<colour afc-light-yellow>>;
padding: 1em;
margin: 0.5em -0.5em 0.5em 0.5em;
border-radius: 4px;
border-top: 8px solid <<colour afc-solid-yellow>>;
}
.tc-tagged-by ul {
margin: 0;
list-style: none;
padding-left: 0;
}
<textarea readonly="readonly" style="width:100%;height:10em;"><$text text={{!!text}}/></textarea>
<$button message="tm-login" class="tc-consent-button tc-btn-invisible">
Login
</$button>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 230 53" class="header__logo--desktop">
<g class="logo-icon">
<path fill="#FFDC16" d="M5.546 36.716 0 47.398 10.682 53l3.88-7.47c-3.716-2.032-6.885-5.052-9.016-8.814Zm4.562-8.843 2.322-.412c.71 4.12 3.251 7.47 6.639 9.337l6.01-11.589-6.803-13.099-8.168 15.763Z"></path>
<path fill="#64C3D7" d="M34.23 26.5c-1.911-3.707-.49-8.293 3.197-10.215L28.986 0l-13.36 7.003 2.65 5.107 1.585-3.048 10.682 5.602-5.464 10.573L39.476 53l13.36-7.003-8.442-16.284c-3.688 1.95-8.25.494-10.163-3.213Z"></path>
<path fill="#AFDCE6" d="m19.861 9.062-1.585 3.048 6.803 13.1 5.464-10.573L19.86 9.062Z"></path>
<path fill="#645FA5" d="M44.394 29.713c3.688-1.922 5.136-6.508 3.196-10.216-1.912-3.707-6.475-5.162-10.163-3.212l6.967 13.428Z"></path>
<path fill="#AAA0CD" d="M34.23 26.5c1.913 3.707 6.476 5.163 10.164 3.213l-6.967-13.429c-3.688 1.923-5.108 6.509-3.196 10.216Z"></path>
<path fill="#ED73AA" d="m29.068 48.03-1.694-9.694c-2.978.412-5.846-.165-8.305-1.538l-4.508 8.733a22.757 22.757 0 0 0 14.507 2.499ZM2.814 29.164a23.297 23.297 0 0 0 2.732 7.551l4.562-8.842-7.294 1.29Z"></path>
<path fill="#F0AFCB" d="m12.457 27.461-2.322.412-4.59 8.87a23.222 23.222 0 0 0 9.016 8.815l4.508-8.76c-3.36-1.895-5.901-5.218-6.611-9.337Z"></path>
</g>
<g class="logo-text">
<path fill="#000" d="M81.957 38.336a.594.594 0 0 1-.546-.385l-2.022-6.123h-9.288l-1.967 6.123c-.082.193-.3.385-.546.385h-3.36c-.192 0-.328-.192-.274-.385l8.06-22.957c.081-.192.3-.385.546-.385h4.671c.246 0 .465.165.547.385L85.7 37.95c.055.165-.082.385-.273.385h-3.47Zm-3.66-9.941-3.58-10.82-3.496 10.82h7.076Zm9.152 9.941c-.192 0-.41-.192-.41-.412l.164-7.8-.137-8.841c0-.193.191-.413.41-.413h3.142c.19 0 .41.193.41.412l-.055 2.142c1.12-1.62 3.06-2.938 5.655-2.938 3.633 0 5.901 2.444 5.901 6.838v3.597l.136 7.003c0 .192-.191.412-.409.412h-3.36c-.192 0-.41-.192-.41-.412l.136-7.003v-3.487c0-2.472-1.338-3.762-3.196-3.762-2.05 0-3.934 1.73-4.29 5.354v1.895l.055 7.003c0 .192-.19.412-.41.412H87.45Zm18.194 0c-.191 0-.41-.192-.41-.412l.164-7.8-.136-8.841c0-.193.191-.413.409-.413h3.142c.191 0 .41.193.41.412l-.055 2.142c1.12-1.62 3.06-2.938 5.655-2.938 3.634 0 5.901 2.444 5.901 6.838v3.597l.137 7.003c0 .192-.191.412-.41.412h-3.333c-.191 0-.41-.192-.41-.412l.137-7.003v-3.487c0-2.472-1.339-3.762-3.196-3.762-2.049 0-3.934 1.73-4.289 5.354v1.895l.054 7.003c0 .192-.191.412-.41.412h-3.36Zm30.188 0c-.191 0-.41-.192-.41-.412l.055-1.977c-1.202 1.702-3.005 2.718-5.355 2.718-4.781 0-7.349-3.927-7.349-9.007 0-5.053 2.787-9.117 7.431-9.117 2.268 0 4.043.879 5.218 2.581l-.082-1.84c0-.192.191-.412.41-.412h3.333c.191 0 .41.193.41.412l-.164 8.266.164 8.376c0 .192-.192.412-.41.412h-3.251Zm-4.562-2.527c2.732 0 4.289-2.032 4.316-6.068.027-4.037-1.475-6.262-4.234-6.29-2.924-.027-4.372 2.225-4.372 5.96-.027 4.064 1.421 6.398 4.29 6.398Zm17.593 2.527c-.191 0-.41-.192-.41-.412l.273-11.451-.273-11.452c0-.192.192-.412.41-.412h14.452c.191 0 .41.193.41.412v2.444c0 .193-.192.412-.41.412h-10.545l-.192 7.305h10.245c.191 0 .41.192.41.412v2.444c0 .192-.191.412-.41.412h-10.245l.192 9.474c0 .192-.192.412-.41.412h-3.497Zm17.129 0c-.191 0-.41-.192-.41-.412l.164-8.403-.164-8.239c0-.192.192-.412.41-.412h3.306c.191 0 .41.193.382.412l-.109 2.719c1.284-2.17 3.579-3.24 6.065-3.24.273 0 .546.027.765.055.218.027.41.247.41.466v2.362a.398.398 0 0 1-.41.385c-.191-.028-.465-.028-.738-.028-3.223 0-5.764 1.867-5.983 5.767l.082 8.156c0 .192-.191.412-.41.412h-3.36Zm26.828-5.959c.191 0 .382.192.327.412-.491 3.295-3.332 5.959-7.922 5.959-5.601 0-8.633-3.762-8.633-9.062 0-5.52 3.196-9.172 8.496-9.172 5.328 0 8.387 3.597 8.524 9.474 0 .192-.191.412-.41.412h-12.539c.164 3.734 1.693 5.492 4.589 5.492 2.076 0 3.47-.989 3.961-3.076a.521.521 0 0 1 .492-.412h3.115v-.027Zm-7.677-9.035c-2.431 0-3.879 1.483-4.316 4.311h8.414c-.164-2.279-1.475-4.311-4.098-4.311Zm16.391 15.406c-3.633 0-5.901-2.444-5.901-6.838v-3.598l-.109-7.002c0-.192.191-.412.41-.412h3.306c.191 0 .409.192.409.412l-.109 7.003V31.8c0 2.472 1.339 3.762 3.169 3.762 2.049 0 3.934-1.73 4.289-5.355v-1.895l-.027-7.002c0-.192.191-.412.41-.412h3.333c.191 0 .409.192.409.412l-.163 7.799.136 8.842c0 .193-.191.412-.41.412h-3.141c-.192 0-.41-.192-.41-.412l.109-2.142c-1.147 1.62-3.114 2.939-5.71 2.939Zm24.724-.412c-.191 0-.409-.192-.409-.412l.082-1.977c-1.175 1.702-3.006 2.718-5.328 2.718-4.781 0-7.349-3.927-7.349-9.007 0-5.053 2.787-9.117 7.431-9.117 2.268 0 4.043.879 5.191 2.554l-.082-8.046c0-.192.191-.412.41-.412h3.36c.191 0 .41.192.41.412l-.164 10.874.164 12.028c0 .193-.191.412-.41.412h-3.306v-.027Zm-4.535-2.5c2.705 0 4.289-2.031 4.317-6.068.027-4.064-1.475-6.344-4.235-6.371-2.923-.055-4.371 2.28-4.371 6.014-.027 4.064 1.421 6.426 4.289 6.426Z"></path>
</g>
</svg>
Young person is involved in non-mandatory organized school or community activities, such as sports, clubs, faith groups, etc.
Attendance at School, Employment or Training courses. This is a measure of the extent of meaningful activity in the young person's life Behaviour and attainment are coded separately. Rate the attendance by the young person in the most recent academic, training or work environment, during the most recent 3-month period for which information is available.
Functioning in school, employment or training; includes academic performance and behaviour. Since intellectual ability is recorded elsewhere, do not adjust this rating for perceived ability. Rate how the young person is functioning in the most recent academic or work environment, during the most recent 3-month period for which information is available.
Skills/talents in activities such as athletics, art, music, mechanical, computers
Includes major illnesses or injuries and chronic conditions such as diabetes, arthritis, side effects of medication, physical effects of alcohol/substance abuse. Excludes transient conditions e.g. influenza, sprained wrist.
The extent to which the young person performs tasks such as hygiene, dressing, eating, and attention to personal health needs in age-appropriate manner; if the young person has not been given the opportunity to learn a particular skill (e.g. tie shoes because he has no shoes with ties), do not penalize, and rate on overall functioning.
Rating of general impairment or disability from any cause that limits or prevents movement, or impairs sight or hearing, or otherwise interferes with personal functioning. Includes impairment resulting from congenital conditions, side effects of medication, physical disabilities resulting from accidents, etc. DO NOT SELECT THIS AS A KEY PROBLEM if the disability is not amenable to change.
Rate social development and maturity, in comparison with peers of the same culture and age. This item would cover (although is not limited to) the kinds of problems with social interaction that are commonly observed in pervasive developmental disorders such as the autistic spectrum. DO NOT SELECT THIS AS A KEY PROBLEM IF A DEVELOPMENTAL DEFICIT IS NOT AMENABLE TO CHANGE.
Young person is engaging, likeable, interested in interacting with people. Social skills and interaction may be reduced for many reasons. For (lilfe-long) developmental problems in managing reciprocal relationships (such as autistic spectrum difficulties) see also item 08 Young person daily life - Social development.
Child or young person's ability to access stable, appropriate housing. For older adolescents the assumption that the home is a //family// home may not be appropriate.
Family's ability to provide concrete resources for the young person; e.g. financial stability, appropriate housing, clothing, etc. In the case of older adolescents living independently, this may refer to their capacity to access the same independently, via work or appropriate benefits.
The quality of interaction and affection __between members of the immediate family__ (parents and siblings and others living in the home). If variable, rate the best available relationship.
The ways anger, conflict, and negative feelings are expressed and managed in the relationship; rate the relationship between the young person and the immediate family member in which there is the most problematic conflict.
Parent or caregiver's typical patterns of discipline, limits, and rule-setting for the young person; too harsh, inconsistent, or inadequate discipline may be a problem. If young person spends regular time in two households (e.g., divorced parents), and there are inconsistencies between discipline in the two, rate the effect of the combination of the two. If any indication of abuse, ensure that this is recorded in carefully in the history, and that Child Protection issues have been considered.
Describes relationships with adults outside the family, such as teachers, coaches, neighbours, parents of friends, aunt or uncle, pastor, etc.
The extent to which the young person seeks out, relates to, and becomes attached to peers
The extent to which the young person’s friendship group is identified as pro-social or antisocial.
Young person is bright, quick to learn, able to comprehend.
Includes irrational fears and phobias, general anxiety, worries, and panic-like symptoms, repeatedly asking questions and seeking reassurance, or restless, agitated behaviour if clearly associated with anxiety. These will often be provoked by new situations or people in milder forms, or more pervasive fears and inhibitions at higher levels of severity.
Obsessional ideas are recurrent, persistent thoughts, impulses, or images that enter the mind despite the person's efforts to exclude them, often recognized by the person as unrealistic. Compulsive behaviours are repetitive and purposeful behaviours associated with a subjective sense that they must be carried out, e.g. checking, washing.
Recurrent trauma-related thoughts, images, feelings, or behaviours that have a highly charged, frightening, or overwhelming quality, are associated with emotional arousal, and which enter the person's mind in a manner that is beyond voluntary control. Includes intrusive memories, nightmares, flashbacks, reenactments. Excludes depressive ideation, obsessional ideas, or ideation associated with specific phobias.
The extent to which the young person can focus on a task for appropriate periods of time without distraction or interruption of concentrated effort, without one-to-one supervision or other individual attention. Rate typical behaviour, not lapses in attention due to fatigue or situation-specific factors.
General level of response to frustration, disappointment, criticisms, or provocation. Includes irritability associated with manic states.
Difficulties with sleep and arousal, including insomnia (difficulty initiating sleep), excessive daytime sleepiness, nightmares, night terrors, sleep apnoea, sleepwalking, and narcolepsy. Rated on the basis of how much distress and functional disturbance is associated with the problem, regardless of whether sleep is the primary concern.
Depression may be manifest in sadness, tearfulness, irritability, lethargy, boredom, etc.; one of the principal factors being an inability to take pleasure in normally pleasurable things. Lack of activity or withdrawal associated with negative symptoms of psychosis are not rated unless there is clear evidence of dysphoric mood.
Includes purposeful and self-injurious behaviour; excludes suicidal behaviour, or unclearly motivated behaviours which can or do result in injury. Ambiguous behaviours (e.g. punching a wall) may be considered self-injurious if repeated after causing pain or injury. Self-tattooing/piercing are considered self-harm, but professional tattooing or piercing are not.
Includes all forms of eating disorders, whether restricting calories, binge eating with or without purging, pica etc. Increase or decrease in caloric intake as a result of depression or other problem is rated under Self Care (06). Includes not eating for reasons associated with delusional states e.g. belief that food is poisoned.
Use of alcohol or illicit drugs (not cigarettes) without parental approval; culturally sanctioned use such as sips of parents' wine are not rated; in a restricted environment such as in young person unit or correctional facility, severity should be based on observations of attitude and interest expressed and apparent intentions regarding abstinence/treatment.
Suicidality is rated on the basis of both behaviour and ideation. There must be clear evidence of intention to cause self-harm to rate behaviour as a suicide attempt; accidental self-injury is not rated. Also, do not include injury or illness as a consequence of other symptomatic behaviour such as substance abuse or eating disorder, unless specific suicidal intent is expressed. Use the Risk Assessment and Care Plan if this scores >1
A style of opposition, noncompliance, and/or refusal to follow directives from authority figures (parents, teachers, social workers, police, etc); some degree of defiance is normally expected, and behaviour should be rated as problematic only if it deviates from age and cultural norms.
Refers to deliberate destruction of the young person's own or other people's property, whether in rage episodes or not, such as graffiti, breaking windows, throwing things, etc.
Aggressive and/or sadistic behaviour that could or does result in harm to other people or animals; socially or culturally sanctioned forms of aggression (e.g. hunting, killing insects) are not considered, unless they are conducted in an unusually sadistic manner (e.g. taking pleasure in pulling the wings off butterflies). Use the Risk Assessment and Care Plan if this scores >1.
Rate preoccupations, anxieties and behaviours that cause distress, conflict, or risk to the young person or others. These may include acting out, such as promiscuity, abuse, or exhibitionism, or inhibitions, such as obsessive worrying about sexual matters or anxieties that inhibit social interactions. Gender identity issues are not rated here unless accompanied by problematic sexual anxieties or behaviours. Use the Risk Assessment and Care Plan if this scores >1
Presence of psychotic symptoms, such as Delusions (firmly held false beliefs held without objective evidence, often impossible or highly improbable. Delusions are not affected by rational argument or evidence to the contrary, and are not a conventional belief in the context of the person's social or cultural background) or Hallucinations (any experience of objectively unrealistic perceptions, such as hearing, seeing, hallucinations of touch or smelling things that others do not, when NOT under the influence of intoxicating substances. Rate descriptively only, not based on presumed cause. Rate flashbacks only if they are experienced as real, rather than as intense memory.)
Mood which is unusually 'high', 'giddy', manic, unrealistically happy, out of proportion to real events. Irritability associated with manic states is rated separately.
The capacity the young person has to show sensitive recognition of other people's changing mental states and the effect these have upon their actions, or to reflect thoughtfully upon affective states of their own. When present, the young person demonstrates 'mind-mindedness', but when absent there may be callous, unemotional traits or an incapacity to tolerate frustration and affective states without resorting to defensive or displacement activities.
The extent to which the young person demonstrates an age-appropriate awareness and understanding of his/her problems/difficulties.
The extent to which the young person is successfully engaged in the development and carrying out of his or her treatment and care.
The length of time the young person has experienced significant behavioural or emotional problems (not limited to the presenting problem)
The extent to which the major problems the young person presents are evident in multiple settings or domains of functioning e.g. family, education, psychological, physical, social-environmental.
This is the experience and impact of discrimination upon a young person and their life. This includes discrimination on the basis of race, gender, ethnicity, culture, age, ability, sexuality, class and religion. This can be discrimination that has happened over a long time and in multiple areas of life as well as more specific incidents or experiences. This can also include discrimination from within one's own culture or community as well as intersecting differences which may be the target of discrimination.
Experiences of exploitation. People in positions of power or authority misusing power to coerce or control the young person. This includes grooming, sexual and criminal exploitation and any experiences where young people are pressured to do things that they do not wish to do which may be harmful. Note, it may be difficult for a young person to recognise experiences of exploitation themselves.
How the young person uses the internet in their life. This captures positive and negative ways that being online can impact on a young person. Positive uses may include learning, social connections, relaxation and enjoyment whilst negative uses may include (for example) internet addiction, impact on daily life functioning, experiences of bullying, porn, radicalisation (not exclusive).
ambit-white: #ffffff
ambit-black: #222222
ambit-green: #209377
ambit-pale-green: #6cbeaf
ambit-blue: #155dac
ambit-purple: #925195
ambit-orange: #eb7837
ambit-brown: #786e65
ambit-light-grey: #e2e2e2
ambit-very-light-grey: #f2f2f2
ambit-mid: rgba(232, 232, 232, 0.84)
top-menu-background: <<colour ambit-purple>>
top-menu-foreground: <<colour ambit-white>>
page-footer-background: <<colour ambit-green>>
page-footer-foreground: <<colour ambit-white>>
alert-background: <<colour ambit-white>>
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #fff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #34c734
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: <<colour ambit-black>>
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: <<colour ambit-green>>
notification-background: #ffffdd
notification-border: #999999
page-background: <<colour ambit-light-grey>>
pre-background: #f5f5f5
pre-border: #cccccc
primary: <<colour ambit-blue>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: <<colour ambit-green>>
sidebar-foreground-shadow: rgba(255,255,255, 0.8)
sidebar-foreground: #acacac
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #f4f4f4
sidebar-tab-background: #e0e0e0
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: #e4e4e4
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: #999999
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #d8d8d8
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: #ec6
tag-foreground: #ffffff
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: <<colour ambit-green>>
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: #c0c0c0
tiddler-title-foreground: #182955
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
<$vars
text-outer-line-1-nne="Managing"
text-outer-line-2-nne="risk"
text-outer-line-1-ene="Meeting Multiple"
text-outer-line-2-ene="Needs"
text-outer-line-1-wnw="Individual key"
text-outer-line-2-wnw="relationship"
text-outer-line-1-nnw="Scaffolding"
text-outer-line-2-nnw="relationships"
text-outer-line-1-ssw="Respect for local"
text-outer-line-2-ssw="practice and expertise"
text-outer-line-1-wsw="Keyworker well-"
text-outer-line-2-wsw="connected to the team"
text-outer-line-1-ese="Integrating "
text-outer-line-2-ese="the help"
text-outer-line-1-sse="Respect"
text-outer-line-2-sse="for evidence"
text-inner-line-1-n="Working with"
text-inner-line-2-n="your CLIENT"
text-inner-line-small-1-n=""
text-inner-line-1-e="Working with"
text-inner-line-2-e="your"
text-inner-line-3-e="NETWORKS"
text-inner-line-small-1-e=""
text-inner-line-small-2-e=""
text-inner-line-1-s="LEARNING"
text-inner-line-2-s="at work"
text-inner-line-small-1-s=""
text-inner-line-1-w="Working"
text-inner-line-2-w="with"
text-inner-line-3-w="your TEAM"
text-inner-line-small-1-w=""
text-inner-line-small-2-w=""
text-middle="Mentalizing"
link-ring-outer-nne="Managing Risk"
link-ring-outer-ene="Working in multiple domains"
link-ring-outer-wnw="KeyWorker"
link-ring-outer-nnw="Scaffolding existing relationships"
link-ring-outer-ssw="Respect local practice and expertise"
link-ring-outer-wsw="Keyworker well-connected to wider team"
link-ring-outer-ese="Addressing Dis-integration"
link-ring-outer-sse="Respect for Evidence"
link-ring-inner-n="Working with your CLIENT"
link-ring-inner-e="Working with your NETWORKS"
link-ring-inner-s="LEARNING at work"
link-ring-inner-w="Working with your TEAM"
link-middle="Mentalization"
>
<$transclude tiddler="$:/_AMBITWheel/Template" mode="inline"/>
</$vars>
\define ambit-wheel(size,language:"English")
<$vars
wheel-size="$size$"
>
<$transclude tiddler="$:/_AMBITWheel/$language$" mode="inline"/>
</$vars>
\end
\define ambit-wheel-iconic(ring,language:"English")
<$vars
svg-classes="no-text faded unfade-$ring$"
wheel-size="50px"
>
<$transclude tiddler="$:/_AMBITWheel/$language$" mode="inline"/>
</$vars>
\end
\define colour-background() <<colour afc-white>>
\define colour-outer-ring-background() #4f4f4f
\define colour-outer-ring-background-faded() <<colour afc-white>>
\define colour-inner-ring-background() <<colour afc-darken-grey>>
\define colour-inner-ring-background-faded() <<colour afc-light-grey>>
\define colour-north-text() <<colour afc-solid-pink>>
\define colour-east-text() <<colour afc-solid-yellow>>
\define colour-south-text() <<colour afc-solid-turquoise>>
\define colour-west-text() <<colour afc-solid-green>>
\define colour-middle-background() <<colour afc-white>>
\define colour-middle-text() <<colour afc-dark-blue>>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock
/* Variants */
.ambit-wheel.faded .path-ring-outer {
fill: <<colour-outer-ring-background-faded>>;
}
.ambit-wheel.faded .path-ring-inner {
fill: <<colour-inner-ring-background-faded>>;
}
/* Remove default link styling */
.ambit-wheel a.tc-tiddlylink-missing {
font-style: normal;
}
.ambit-wheel a.tc-tiddlylink:hover {
text-decoration: none;
}
/* Ring colours */
.ambit-wheel .circle-background {
fill: <<colour-background>>;
}
.ambit-wheel .path-ring-outer {
fill: <<colour-outer-ring-background>>;
}
.ambit-wheel .ring-outer-nne:hover .path-ring-outer,
.ambit-wheel .ring-outer-nnw:hover .path-ring-outer,
.ambit-wheel.unfade-outer-nne .path-ring-outer-nne,
.ambit-wheel.unfade-outer-nnw .path-ring-outer-nnw {
fill: <<colour-north-text>>;
}
.ambit-wheel .ring-outer-ene:hover .path-ring-outer,
.ambit-wheel .ring-outer-ese:hover .path-ring-outer,
.ambit-wheel.unfade-outer-ene .path-ring-outer-ene,
.ambit-wheel.unfade-outer-ese .path-ring-outer-ese {
fill: <<colour-east-text>>;
}
.ambit-wheel .ring-outer-sse:hover .path-ring-outer,
.ambit-wheel .ring-outer-ssw:hover .path-ring-outer,
.ambit-wheel.unfade-outer-ssw .path-ring-outer-ssw,
.ambit-wheel.unfade-outer-sse .path-ring-outer-sse {
fill: <<colour-south-text>>;
}
.ambit-wheel .ring-outer-wsw:hover .path-ring-outer,
.ambit-wheel .ring-outer-wnw:hover .path-ring-outer,
.ambit-wheel.unfade-outer-wnw .path-ring-outer-wnw,
.ambit-wheel.unfade-outer-wsw .path-ring-outer-wsw {
fill: <<colour-west-text>>;
}
.ambit-wheel .ring-outer:hover .text-outer {
fill: <<colour-outer-ring-background>>;
}
.ambit-wheel .path-ring-inner {
fill: <<colour-inner-ring-background>>;
}
.ambit-wheel .ring-inner-n:hover .path-ring-inner,
.ambit-wheel.unfade-inner-n .path-ring-inner-n {
fill: <<colour-north-text>>;
}
.ambit-wheel .ring-inner-e:hover .path-ring-inner,
.ambit-wheel.unfade-inner-e .path-ring-inner-e {
fill: <<colour-east-text>>;
}
.ambit-wheel .ring-inner-s:hover .path-ring-inner,
.ambit-wheel.unfade-inner-s .path-ring-inner-s {
fill: <<colour-south-text>>;
}
.ambit-wheel .ring-inner-w:hover .path-ring-inner,
.ambit-wheel.unfade-inner-w .path-ring-inner-w {
fill: <<colour-west-text>>;
}
.ambit-wheel .ring-inner:hover .text-inner {
fill: <<colour-inner-ring-background>>;
}
.ambit-wheel .text-outer-nne,
.ambit-wheel .text-outer-nnw,
.ambit-wheel .text-inner-n {
fill: <<colour-north-text>>;
}
.ambit-wheel .text-outer-ene,
.ambit-wheel .text-outer-ese,
.ambit-wheel .text-inner-e {
fill: <<colour-east-text>>;
}
.ambit-wheel .text-outer-sse,
.ambit-wheel .text-outer-ssw,
.ambit-wheel .text-inner-s {
fill: <<colour-south-text>>;
}
.ambit-wheel .text-outer-wnw,
.ambit-wheel .text-outer-wsw,
.ambit-wheel .text-inner-w {
fill: <<colour-west-text>>;
}
/* Middle colours */
.ambit-wheel .middle .circle-middle {
fill: <<colour-middle-background>>;
}
.ambit-wheel .middle .text-middle {
fill: <<colour-middle-text>>;
}
.ambit-wheel .middle:hover .circle-middle {
fill: <<colour-middle-text>>;
}
.ambit-wheel .middle:hover .text-middle {
fill: <<colour-middle-background>>;
}
/* Text styles */
.ambit-wheel .text-outer,
.ambit-wheel .text-inner,
.ambit-wheel .text-middle {
text-anchor: middle;
font-family: Helvetica-Bold, Helvetica;
font-size: 14px;
font-weight: bold;
}
.ambit-wheel .text-inner {
font-size: 16px;
}
.ambit-wheel .text-middle {
font-size: 17px;
}
/* Variants */
.ambit-wheel.no-text {
pointer-events: none;
}
.ambit-wheel.no-text text {
display: none;
}
<svg width={{{ [<wheel-size>] ~[[500px]] }}} height={{{ [<wheel-size>] ~[[500px]] }}} viewBox="0 0 500 500" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" class={{{ ambit-wheel [<svg-classes>] +[join[ ]]}}}>
<g stroke="none" fill="#000">
<!-- Background -->
<circle class="circle-background" cx="249" cy="249" r="249"></circle>
<!-- Outer rings -->
<$link to=<<link-ring-outer-nne>> class="ring-outer ring-outer-nne">
<path class="path-ring-outer path-ring-outer-nne" d="M249.980442,0 C318.014091,0 379.700478,27.1758611 424.776451,71.2644313 L384.579724,111.461003 C350.611236,78.4525586 304.544048,57.8285743 253.665668,56.8765571 L253.664188,0.0293536996 L249.980442,0 Z"></path>
<g transform="rotate(22.5 250 250)" class="text-outer text-outer-nne">
<text>
<tspan x="250" y="26"><<text-outer-line-1-nne>></tspan>
</text>
<text>
<tspan x="250" y="46"><<text-outer-line-2-nne>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-ene>> class="ring-outer ring-outer-ene">
<path class="path-ring-outer path-ring-outer-ene" d="M499.96088,246.841053 L443.111556,246.841053 L443.112459,246.805781 C442.288715,195.999648 421.849272,149.961896 389.037447,115.935839 L429.235942,75.7371432 C472.336608,120.064838 499.136956,180.324498 499.96088,246.841053 Z"></path>
<g transform="rotate(67.5 250 250)" class="text-outer text-outer-ene">
<text>
<tspan x="250" y="26"><<text-outer-line-1-ene>></tspan>
</text>
<text>
<tspan x="250" y="46"><<text-outer-line-2-ene>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-wnw>> class="ring-outer ring-outer-wnw">
<path class="path-ring-outer path-ring-outer-wnw" d="M71.2443388,75.2045366 L111.441588,115.400569 C78.3189623,149.486488 57.6665866,195.754938 56.8478317,246.842547 L0.0062929926,246.842547 L0.0139343633,245.865793 C1.09044628,179.469671 28.0508378,119.365662 71.2443388,75.2045366 Z"></path>
<g transform="rotate(292.5 250 250)" class="text-outer text-outer-wnw">
<text>
<tspan x="250" y="26"><<text-outer-line-1-wnw>></tspan>
</text>
<text>
<tspan x="250" y="46"><<text-outer-line-2-wnw>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-nnw>> class="ring-outer ring-outer-nnw">
<path class="path-ring-outer path-ring-outer-nnw" d="M247.348398,0.0135848288 L247.348398,56.8630379 L246.817736,56.8674745 C195.99881,57.6832808 149.948798,78.1246403 115.915643,110.943609 L75.717765,70.7443242 C120.162352,27.5300886 180.622994,0.702232997 247.348398,0.0135848288 Z"></path>
<g transform="rotate(337.5 250 250)" class="text-outer text-outer-nnw">
<text>
<tspan x="250" y="26"><<text-outer-line-1-nnw>></tspan>
</text>
<text>
<tspan x="250" y="46"><<text-outer-line-2-nnw>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-ssw>> class="ring-outer ring-outer-ssw">
<path class="path-ring-outer path-ring-outer-ssw" d="M247.348398,443.140321 L247.348398,499.977775 L245.877757,499.967016 C179.735509,498.902814 119.835458,472.152319 75.7172374,429.255163 L115.916451,389.05717 C150.067821,421.989756 196.319482,442.458677 247.348398,443.140321 Z"></path>
<g transform="rotate(22.5 250 250)" class="text-outer text-outer-ssw">
<text>
<tspan x="250" y="460"><<text-outer-line-1-ssw>></tspan>
</text>
<text>
<tspan x="250" y="480"><<text-outer-line-2-ssw>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-wsw>> class="ring-outer ring-outer-wsw">
<path class="path-ring-outer path-ring-outer-wsw" d="M0,253.159736 L56.8483983,253.157895 L56.8484244,253.194219 C57.6765004,304.267536 78.3271306,350.522187 111.442123,384.599981 L71.2443172,424.795441 C27.8396148,380.418372 0.827164392,319.942125 0,253.159736 Z"></path>
<g transform="rotate(67.5 250 250)" class="text-outer text-outer-wsw">
<text>
<tspan x="250" y="460"><<text-outer-line-1-wsw>></tspan>
</text>
<text>
<tspan x="250" y="480"><<text-outer-line-2-wsw>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-ese>> class="ring-outer ring-outer-ese">
<path class="path-ring-outer path-ring-outer-ese" d="M499.980442,250 C499.980442,317.766192 473.01783,379.23493 429.235195,424.263625 L389.037331,384.064281 C421.857142,350.030002 442.298577,303.978194 443.113051,253.157441 L499.954714,253.156722 L499.980442,250 Z"></path>
<g transform="rotate(292.5 250 250)" class="text-outer text-outer-ese">
<text>
<tspan x="250" y="460"><<text-outer-line-1-ese>></tspan>
</text>
<text>
<tspan x="250" y="480"><<text-outer-line-2-ese>></tspan>
</text>
</g>
</$link>
<$link to=<<link-ring-outer-sse>> class="ring-outer ring-outer-sse">
<path class="path-ring-outer path-ring-outer-sse" d="M384.579039,388.539663 L424.776506,428.735515 C380.515854,472.02665 320.24023,499.011362 253.665217,499.973387 L253.665217,443.123451 C304.543433,442.171554 350.610516,421.547816 384.579039,388.539663 Z"></path>
<g transform="rotate(337.5 250 250)" class="text-outer text-outer-sse">
<text>
<tspan x="250" y="460"><<text-outer-line-1-sse>></tspan>
</text>
<text>
<tspan x="250" y="480"><<text-outer-line-2-sse>></tspan>
</text>
</g>
</$link>
<!-- Inner rings -->
<$link to=<<link-ring-inner-n>> class="ring-inner ring-inner-n">
<path class="path-ring-inner path-ring-inner-n" d="M249.473661,62.1188274 C299.944603,62.1188274 345.754692,82.0743083 379.444237,114.525578 L296.436658,197.533183 C283.958377,186.004833 267.275457,178.960933 248.947346,178.960933 C230.887053,178.960933 214.424222,185.800479 202.007734,197.030691 L119.503086,114.525578 C153.192631,82.0743083 199.00272,62.1188274 249.473661,62.1188274 Z"></path>
<text class="text-inner text-inner-large text-inner-n">
<tspan x="250" y="115"><<text-inner-line-1-n>></tspan>
<tspan x="250" y="140"><<text-inner-line-2-n>></tspan>
</text>
<text class="text-inner text-inner-small text-inner-n">
<tspan x="250" y="154"><<text-inner-line-small-1-n>></tspan>
</text>
</$link>
<$link to=<<link-ring-inner-e>> class="ring-inner ring-inner-e">
<path class="path-ring-inner path-ring-inner-e" d="M436.842082,249.487248 C436.842082,299.95819 416.886602,345.768279 384.435332,379.457824 L300.877587,295.900544 C312.107799,283.484056 318.947346,267.021225 318.947346,248.960933 C318.947346,230.901149 312.108184,214.438736 300.877587,202.02237 L383.919234,118.982989 C416.674894,152.721632 436.842082,198.749291 436.842082,249.487248 Z"></path>
<text class="text-inner text-inner-large text-inner-e">
<tspan x="375" y="220"><<text-inner-line-1-e>></tspan>
<tspan x="375" y="244"><<text-inner-line-2-e>></tspan>
<tspan x="375" y="268"><<text-inner-line-3-e>></tspan>
</text>
<text class="text-inner text-inner-small text-inner-e">
<tspan x="375" y="300"><<text-inner-line-small-1-e>></tspan>
<tspan x="375" y="320"><<text-inner-line-small-2-e>></tspan>
</text>
</$link>
<$link to=<<link-ring-inner-s>> class="ring-inner ring-inner-s">
<path class="path-ring-inner path-ring-inner-s" d="M296.436658,300.388682 L379.978981,383.931792 C346.240241,416.688059 300.21215,436.855669 249.473661,436.855669 C198.735704,436.855669 152.708045,416.688481 118.969402,383.932821 L202.008783,300.892123 C214.425149,312.121771 230.887562,318.960933 248.947346,318.960933 C267.275457,318.960933 283.958377,311.917033 296.436658,300.388682 Z"></path>
<text class="text-inner text-inner-large text-inner-s">
<tspan x="250" y="368"><<text-inner-line-1-s>></tspan>
<tspan x="250" y="392"><<text-inner-line-2-s>></tspan>
</text>
<text class="text-inner text-inner-small text-inner-s">
<tspan x="250" y="407"><<text-inner-line-small-1-s>></tspan>
</text>
</$link>
<$link to=<<link-ring-inner-w>> class="ring-inner ring-inner-w">
<path class="path-ring-inner path-ring-inner-w" d="M115.029118,118.981929 L197.519596,201.471621 C185.991246,213.949901 178.947346,230.632821 178.947346,248.960933 C178.947346,267.289044 185.991246,283.971964 197.519596,296.450245 L114.511991,379.457824 C82.0607213,345.768279 62.1052404,299.95819 62.1052404,249.487248 C62.1052404,198.74876 82.2728509,152.720668 115.029118,118.981929 Z"></path>
<text class="text-inner text-inner-large text-inner-w">
<tspan x="125" y="220"><<text-inner-line-1-w>></tspan>
<tspan x="125" y="244"><<text-inner-line-2-w>></tspan>
<tspan x="125" y="268"><<text-inner-line-3-w>></tspan>
</text>
<text class="text-inner text-inner-small text-inner-w">
<tspan x="125" y="300"><<text-inner-line-small-1-w>></tspan>
<tspan x="125" y="320"><<text-inner-line-small-2-w>></tspan>
</text>
</$link>
<!-- Middle Text -->
<$link to=<<link-middle>> class="middle">
<circle class="circle-middle" cx="249" cy="249" r="62"></circle>
<text class="text-middle">
<tspan alignment-baseline="middle" x="250" y="250"><<text-middle>></tspan>
</text>
</$link>
</g>
</svg>
\define image-link-body(image,caption,width,height,color,background-color,icon)
<div class="tc-thumbnail-wrapper" style="width:$width$px;height:$height$px;">
<div class="tc-thumbnail-image">[img[$image$]]</div><div class="tc-thumbnail-icon" style="fill:$color$;color:$color$;">
$icon$
</div><div class="tc-thumbnail-caption">
$caption$
</div>
</div>
\end
\define image-link(link,image,caption,width,height,color,background-color,icon)
<$link to="""$link$"""><$macrocall $name="image-link-body" icon=<<__icon__>> color=<<__color__>> background-color=<<__background-color__>> image=<<__image__>> caption=<<__caption__>> width=<<__width__>> height=<<__height__>>/></$link>
\end
\define image-link-ext(link,image,caption,width,height,color,background-color,icon)
<a href="""$link$""" target="_blank" rel="noopener noreferrer"><$macrocall $name="image-link-body" icon=<<__icon__>> color=<<__color__>> background-color=<<__background-color__>> image=<<__image__>> caption=<<__caption__>> width=<<__width__>> height=<<__height__>>/></a>
\end
\define link-doc(caption,url,type:"docs")
<a href="""$url$""" class="tc-ext-doc-link" style="" target="_blank" rel="noopener noreferrer" title="Open in Google Docs">
{{$:/core/images/chevron-right}}<$image source={{{ [tag[$:/_GoogleDocsIcon]caption<__type__>] }}}/> $caption$
</a>
\end
\define link-pdf(caption,url,colour:"#55c6a7")
<a href="""$url$""" class="tc-btn-big-green" style="background-color:$colour$;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/file}} $caption$
</a>
\end
\define embed-video(code)
<iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
\end
<div class="tc-table-of-contents">
<<toc-selective-expandable 'AIMmenu'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'AboutContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Community'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'HomeContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Core Features of AMBIT'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'TrainingContents'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'UsingTheManualContents'>>
</div>
! Our use of cookies
We use necessary cookies to make our site work. We’d also like to set optional analytics to help us improve it. We won’t set optional cookies unless you enable them. Using this tool will set a cookie on your device to remember your preferences.
Anna Freud provides this wiki platform for external teams who are responsible for the content, including cookies, that are added to their individual manuals. Guidance for teams on how to embed correctly has been added to the user guide.
For more detailed information about the cookies we use, see our <a href="https://www.annafreud.org/your-privacy/" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">Cookies page</a>.
---
!! Necessary cookies
Necessary cookies enable core functionality such as security, network management, and accessibility. You may disable these by changing your browser settings, but this may affect how the website functions.
---
!! Analytics cookies
We’d like to set non-essential cookies, such as Google Analytics, to help us to improve our website by collecting and reporting information on how you use it. The cookies collect information in a way that does not directly identify anyone. For more information on how these cookies work, please see our <a href="https://www.annafreud.org/your-privacy/" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">Cookies page</a>. If you are 16 or under, please ask a parent or carer for consent before accepting.
---
<$list filter={{$:/core/Filters/Drafts!!filter}} >
<div class="tc-menu-list-item">
<$link><$view field="title"/></$link> <$list filter="[all[current]frombag{$:/plugins/federatial/xememex/config/recipe}]" variable="listItem"><span style="display:inline-block;background:#ff4;border:1px solid #cc0;color:black;padding:0 2px;border-radius:4px;font-size:0.8em;line-height:1.3;">local</span></$list>
</div>
</$list>
<div class="tc-more-sidebar">
<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/Recent]!has[draft.of]]" default="$:/_AFC/Recent/All" state="$:/state/tab/recentsidebar" class="tc-vertical" />
</div>
\define lingo-base() $:/language/ControlPanel/
\define config-title()
$:/config/PageControlButtons/Visibility/$(listItem)$
\end
<<lingo Basics/Version/Prompt>> <<version>>
<$set name="tv-config-toolbar-icons" value="yes">
<$set name="tv-config-toolbar-text" value="yes">
<$set name="tv-config-toolbar-class" value="">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem">
<div style="position:relative;" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>
<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <$transclude tiddler=<<listItem>>/> <i class="tc-muted"><$transclude tiddler=<<listItem>> field="description"/></i>
</div>
</$list>
</$set>
</$set>
</$set>
<$transclude tiddler="$:/core" subtiddler="$:/core/ui/ViewTemplate/subtitle"/>
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAACApJREFUeAHdmQmIlkUYxzfNq0NTo8PIlDKPyi4qi0yhErWkEoROhSxTISOVosuorCwUtKKiEC3tUCTNbonW9UpJ7c4y274kxDQ30y631H7/z31lvmlm3mu1b33gt+/MM8/zzMz7zvltRUX5S3OaeAO8CRthOcyHU+CAllb07l7YBLsNqurS23ieBwecNKFHY2ALmB2P0osN/S+ku8MBI73pydcQddb1XGeVryd/LDRoaUrrJ8IucHU60m312CxBfzA0SOlEq1dC1MnQc1XA7tGG2Pt+NHp7oFP2y6gM2P5D2bnQYORqWloLdid9+QK2s2PsP6O8MZS9jKCFO8HXWVP/DXbXgOa4tkblzXI7PZzyshZ1xm60K6+pMRq0LZqibe8vcPlIp8NSCyhLOZ9W/Qm+xkd6LXZaHH2ic0Jk63qO8jn+n/oOVP4TuBps6qZgo20xJJoOX4DpZ6arKWsUCrC/yw6iwkVgNtKVvjNFw/rHxNMOUzZyKy1xdTjS6QA0MkNrQ+eHlzPE2ycuHYn6G0SddT3vyVjz9YG4qrMsFsO5gUbqZWhvzyrNcawB10uVrm/WwPXld3agcWrgV3BIzsqm4+97AZNyxs7trh8xfI3TvO+Zu4aKiqsCdXxYD/Ezh9A+7uu89FMzRy51bEPWd4vUgSl4SwwWltaTOndTwEMLVDOYDn+ATn2boQDaw7+EHZBEtAashc4OY9WhRfhbR9k+VbUkuo6kvhFQGSiTjy5Jn8BkuAzi1onQQtsf//0mPahpGqwAX+d1bd0QKHf5aYTMhD6gQ5Ut+jHF5SfdUNt4X+QHEfRTiBqxzEhHuui5PFAW2YSea/C/BcxL0h2BmHdR5pW852V98aWgvby7UUs7I20ndQ3OI11wfha+gevqAv1a93Q94qaPyydW1xqLl8D1pUIXHg1/Ndbll1VXSby7AzEnUFavoittAXwNXh0o+zxQ5ouXRK/trsoT+yH0XkmzDWrx0VwbDyE/bXE+0bBdCPp1V78LHAaHwzGgbawTNIe0ou3uIlgCOn2adwBts7lFv7NNgyRfY0HAbmRMS7QmnQ6jYB6o8UnqNG10hqgx/G4mnUua4D0LzEpC6XcDtpembIlGiBa69wMxXW1Zi320Fl1OOrM0xXM+uCqxdb9jpymiHcEui/LdKMsq2mVmQNIfU7/HVi9BUyuz6LweNT70fAc7HTklGro+2/ZFi3x/zsTdt+DZ9WrN0Y6VSeJ+xVFltXCjFT00BY60bLNmtSDrF+MdYHfazr+WpZLeOP0dE3wb5a45HZoyx+NTn3I7wbaA3Wk7PyxNpUdgvDEm6AbKz/AEDS2YXT0+WdQaBRri60DtsTtt5nWXSDz9no4Jpjd+EvjkeQrMys30xT6nDPo+Rj3fk95k5M06o7RGZqycg0VoldVR9pKYKA9QHlVqP2+J8U1T/JZVz1LyOoTZdZr5K0IVaEitiglwWyhAXdnNgRhTEvgnMennqeN1jz56CTofNPFVMCDGeY7P0dL3CsTRC84rhxKgAFGn7GdVoEy2w8EplWjtYFFeR9Kki0jbQBxNoVaQRybhHLXL9XyKch2AXGXSVYOO9iVyJjmfg/T3l1jHZ74LxBsc7+616EGJXqKvrVoI24DOJj4b6QdCibxAzuewnrIWJdbxmScD8d6Od3danIw2bqUfUuepL/w1+Pqkk+te0dV2K/iMR++1TJ7oG4inL9gxeaii5XH8LYCvjdIvBFOGkPHZa6c7KjLuFTDUnb11ZJjiqZU29LXS7AYa0rri+jojvY7E9iGrGbqfA37DKCvK4/z1BU+68teFKnmEFivdHNuVWLszugHqtOdrX6Qf63aveCLgOzfy+cJhtAFdJegikXa44lKULvzdBVEj7eeLe8y8f4dSot3H9rPzz3kj7PmVyLaP8jX4NZJvVIkUi+BjMBuurzUG/rN1oIsTjaCoQvupOno5AuguMh1se1d+AXZaw3yiNm8Dl690xY/7KokVUBswlPFKOBvSyFkYmy/TbsiPlOvcIGkJ4+AXsO1ceY1c+cSJVnyXv3T95ax/PfkMXPoPsL8Sko6IGTHxZ1F+N2yJsTPbshrbdpBEHsHI9DXTI6IAaoBZkCRdwEcLXT84BHyihm4HM6bWmMWwDLTTmGVx6XnY6zicVPSboi/m+IOMKANJT4Mkw8pwKyZr+bsKdALUwekHUKe1HTaF8+AkaAHHwAmQRSbidCdoWiWVXhgu9Bg/Y+tPRFEJu8sMTY/BkEW64uTrz0xXQI2KYZBmTvoqyKvXl54KR0JW6YCjrx2zQ0G1HT0Gaeeor7K0+k+o+4JQAxOWtcfOV/ec4kHAE2gres23DvAgbIZ9LWroCtACuQaqIa+E1jTdSxJLcyyHgg5LoSup722H9Nr7F8BHYNrpI9wDaVZ9zEvkQnJmTDM9rcQyRUaHFy1KmkMFMIMmSWtaaYhXgnaPvyDk9zPl40HDOa1ci4Mv9mRzG0wb2LTXMDsNuoFejvJC2562w19BX7MAOsFpu2wFOoX2gaSijmh6vAEaMYq1C0Ki6Xufx2Bcfb0AT/xYdWMsJsDYWEu3ge4pn4NeqI7VOvdrNOkqrBes3xH0HAAu0ZQuCxlEKzTMfUM1r77SE7s3+rKRo2nJK5C3sz5/+yVo6hxRNr03GtKT9DLwdSSP3nwJut2WtWhxfA/ydNjlW1UXU9trg5DOtPJhqAZXh9LqdhJnHrSBBien0uIxMBc2QJrO12CvEaUv3xaK8i9e8Ax/5Ku5fAAAAABJRU5ErkJggg==
<svg class="tc-image-youtube tc-image-button" width="22pt" height="22pt" viewBox="0 0 576 512"><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
<svg class="tc-image-chevron-circle-right tc-image-button" width="22pt" height="22pt" viewBox="0 0 512 512"><path d="M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm113.9 231L234.4 103.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L285.1 256 183.5 357.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L369.9 273c9.4-9.4 9.4-24.6 0-34z"/></svg>
<svg class="tc-image-clock tc-image-button" width="22pt" height="22pt" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm57.1 350.1L224.9 294c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v137.7l63.5 46.2c5.4 3.9 6.5 11.4 2.6 16.8l-28.2 38.8c-3.9 5.3-11.4 6.5-16.8 2.6z"/></svg>
<svg class="tc-image-comments tc-image-button" width="22pt" height="22pt" viewBox="0 0 576 512"><path d="M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z"/></svg>
<svg class="tc-image-mail-bulk tc-image-button" width="22pt" height="22pt" viewBox="0 0 576 512"><path d="M160 448c-25.6 0-51.2-22.4-64-32-64-44.8-83.2-60.8-96-70.4V480c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V345.6c-12.8 9.6-32 25.6-96 70.4-12.8 9.6-38.4 32-64 32zm128-192H32c-17.67 0-32 14.33-32 32v16c25.6 19.2 22.4 19.2 115.2 86.4 9.6 6.4 28.8 25.6 44.8 25.6s35.2-19.2 44.8-22.4c92.8-67.2 89.6-67.2 115.2-86.4V288c0-17.67-14.33-32-32-32zm256-96H224c-17.67 0-32 14.33-32 32v32h96c33.21 0 60.59 25.42 63.71 57.82l.29-.22V416h192c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zm-32 128h-64v-64h64v64zm-352-96c0-35.29 28.71-64 64-64h224V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v192h96v-32z"/></svg>
<svg class="tc-image-sticky-note tc-image-button" width="22pt" height="22pt" viewBox="0 0 448 512"><path d="M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z"/></svg>
<svg class="tc-image-tasks tc-image-button" width="22pt" height="22pt" viewBox="0 0 512 512"><path d="M139.61 35.5a12 12 0 0 0-17 0L58.93 98.81l-22.7-22.12a12 12 0 0 0-17 0L3.53 92.41a12 12 0 0 0 0 17l47.59 47.4a12.78 12.78 0 0 0 17.61 0l15.59-15.62L156.52 69a12.09 12.09 0 0 0 .09-17zm0 159.19a12 12 0 0 0-17 0l-63.68 63.72-22.7-22.1a12 12 0 0 0-17 0L3.53 252a12 12 0 0 0 0 17L51 316.5a12.77 12.77 0 0 0 17.6 0l15.7-15.69 72.2-72.22a12 12 0 0 0 .09-16.9zM64 368c-26.49 0-48.59 21.5-48.59 48S37.53 464 64 464a48 48 0 0 0 0-96zm432 16H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"/></svg>
copy link to current page
Copy a direct link to this page
Copy direct link to my open pages
{"tiddlers":{"$:/plugins/federatial/aim-questionnaire/Categories/A":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/A","tags":"AIMCategory","letter":"A","caption":"<<aim-lingo CategoryYoungPersonDailyLife>>"},"$:/plugins/federatial/aim-questionnaire/Categories/B":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/B","tags":"AIMCategory","letter":"B","caption":"<<aim-lingo CategorySocioEconomic>>"},"$:/plugins/federatial/aim-questionnaire/Categories/C":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/C","tags":"AIMCategory","letter":"C","caption":"<<aim-lingo CategoryFamily>>"},"$:/plugins/federatial/aim-questionnaire/Categories/D":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/D","tags":"AIMCategory","letter":"D","caption":"<<aim-lingo CategorySocial>>"},"$:/plugins/federatial/aim-questionnaire/Categories/E":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/E","tags":"AIMCategory","letter":"E","caption":"<<aim-lingo CategoryMentalState>>"},"$:/plugins/federatial/aim-questionnaire/Categories/F":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/F","tags":"AIMCategory","letter":"F","caption":"<<aim-lingo CategoryResponseToSituation>>"},"$:/plugins/federatial/aim-questionnaire/Categories/G":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/G","tags":"AIMCategory","letter":"G","caption":"<<aim-lingo CategoryMeasureOfComplexity>>"},"$:/plugins/federatial/aim-questionnaire/Categories/H":{"title":"$:/plugins/federatial/aim-questionnaire/Categories/H","tags":"AIMCategory","letter":"H","caption":"<<aim-lingo CategoryPowerAndControl>>"},"$:/plugins/federatial/aim-questionnaire/Language/en-GB":{"title":"$:/plugins/federatial/aim-questionnaire/Language/en-GB","type":"application/x-tiddler-dictionary","text":"BodyDownloadCSV: Click the button to download a .CSV file of the scores which can be opened in Microsoft Excel or Google Sheets\nBodyDownloadScoresWordDocument: Click the button to download a .DOC file of the scores which can be opened in Microsoft Word or Google Docs\nButtonClearAllAnswers: clear\nButtonCopyCSVToClipboard: Copy scores data to clipboard\nButtonDownloadCSV: Download scores .CSV file\nBodyDownloadScoresWordDocument: Download scores .DOC file\nBodyDownloadSuggestionsWordDocument: Download suggestions .DOC file\nButtonHideQuestions: hide questions\nButtonNext: next\nButtonPrevious: previous\nButtonShowAllQuestions: show all questions\nButtonShowQuestions: show questions\nCategoryFamily: Family\nCategoryMeasureOfComplexity: Measure of Complexity\nCategoryMentalState: Mental State\nCategoryPowerAndControl: Power and Control\nCategoryResponseToSituation: Response to Situation\nCategorySocial: Social\nCategorySocioEconomic: Socio-Economic\nCategoryYoungPersonDailyLife: Young Person Daily Life\nClearAnswersNo: No, leave existing answers alone\nClearAnswersPrompt: Are you sure you wish to clear all existing answers?\nClearAnswersYes: Yes, clear all existing answers\nContactPhaseHeading: This questionnaire is for:\nContactPhaseUnspecified: Unspecified\nContactPhaseStart: The start of contact\nContactPhaseEnd: The end of contact\nHeadingDownloadCSV: Download CSV file\nHeadingDownloadWordDocument: Download results as Word Document\nLabelKeyProblem: This is a key problem (<<key-question-number>> of <<max-key-questions>>)\nOverviewSuggestedInterventions: These interventions are suggestions according to the AIM results and are based on available evidence. They are a guide and can be useful as a way of checking that these options have been considered, rather than directing a worker to what they must do.\nOverviewSuggestionsFocal: Each suggested intervention is ranked in order of how ''severe'' the set of problems are (their averaged AIM scores) that indicate that particular intervention. This is good for ''focusing on the most severe problems''\nOverviewSuggestionsGlobal: Each suggested intervention is ranked according to how many different problems (that is AIM items scoring greater than 2) the young person has which that particular intervention is relevant for. This is good for ''covering the whole set of problems and causes''\nOverviewSuggestionsLimit: Limit suggested interventions only to those relevant for items identified as ''key problems''\nPreviewDownloadCSV: Preview:\nQuestionFooter: (<<question-number>> of <<max-questions>> questions completed)\nResultsKeyProblems: Key Problems\nResultsKeyProblemsNone: (None)\nResultsNotAvailableBlocked: The results will be available when all <<max-questions>> questions have been answered – <<questions-answered>> have been answered so far\nResultsNotAvailableWarning: ''NOTE'': Only <<questions-answered>> out of <<max-questions>> questions have been answered; the suggestion interventions below relate only to those <<questions-answered>> items\nResultsOverview: The results of the assessment are available as numerical scores, and to drive the suggested interventions. [[Guide to scoring AIM data|Scoring AIM data]]\nResultsQuestionScores: Question Scores\nResultsSubscaleScores: Subscale Scores\nResultsTotalScore: Total Score:\nTabDownload: Download\nTabQuestionsWizard: Questions\nTabQuestionsList: List View\nTabResults: Results\nTabScores: Scores\nTabSuggestedInterventions: Suggested Interventions\nTabSuggestionsFocal: Focal\nTabSuggestionsGlobal: Global\nTabSuggestionsLimit: Limit\n"},"$:/plugins/federatial/aim-questionnaire/Macros":{"title":"$:/plugins/federatial/aim-questionnaire/Macros","tags":"$:/tags/Macro","text":"\\define aim-lingo(string)\n<$transclude tiddler={{{ [{$:/language}get[name]] ~[[en-GB]] +[addprefix[$:/plugins/federatial/aim-questionnaire/Language/]] }}} index=<<__string__>>><$transclude tiddler=\"$:/plugins/federatial/aim-questionnaire/Language/en-GB\" index=<<__string__>>/></$transclude>\n\\end\n\n\\define aim-questionnaire()\n<div class=\"tc-aim-panel\">\n<<tabs tabsList:\"$:/plugins/federatial/aim-questionnaire/Questions/Wizard $:/plugins/federatial/aim-questionnaire/Questions/List $:/plugins/federatial/aim-questionnaire/Results\" default:\"$:/plugins/federatial/aim-questionnaire/Questions/Wizard\">>\n</div>\n\\end\n\n\\define aim-clear-all-answers-actions()\n<$list filter=\"[tag<question-tag>]\">\n<$action-deletetiddler $tiddler={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>] }}}/>\n<$action-deletetiddler $tiddler={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<currentTiddler>] }}}/>\n</$list>\n\\end\n\n\\define aim-clear-all-answers-button()\n<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-clear\" popup=<<qualify \"$:/state/popup/aim-clear\">>>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$text text=\" \"/>\n\t<<aim-lingo ButtonClearAllAnswers>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/aim-clear\">> type=\"popup\" position=\"below\" tag=\"div\">\n\t<div class=\"tc-drop-down-wrapper tc-aim-navigation-button-drop-down\">\n\t\t<div class=\"tc-drop-down\">\n\t\t\t<p>\n\t\t\t\t<<aim-lingo ClearAnswersPrompt>>\n\t\t\t</p>\n\t\t\t<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-clear\">\n\t\t\t\t<<aim-clear-all-answers-actions>>\n\t\t\t\t<<aim-lingo ClearAnswersYes>>\n\t\t\t</$button>\n\t\t\t<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-next\">\n\t\t\t\t<<aim-lingo ClearAnswersNo>>\n\t\t\t</$button>\n\t\t</div>\n\t</div>\n</$reveal>\n\\end\n\n\\define aim-incomplete-results-blocked()\n<p><br>\n<$vars questions-answered={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]is[tiddler]count[]] }}} max-questions={{{ [tag{$:/config/federatial/aim-questionnaire/aim-question-tag}count[]] }}}>\n<<aim-lingo ResultsNotAvailableBlocked>>\n</$vars>\n</p>\n\\end\n\n\\define aim-incomplete-results-warning-message()\n<p><br>\n<$vars questions-answered={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]is[tiddler]count[]] }}} max-questions={{{ [tag{$:/config/federatial/aim-questionnaire/aim-question-tag}count[]] }}}>\n<<aim-lingo ResultsNotAvailableWarning>>\n</$vars>\n</p>\n\\end\n\n\\define aim-incomplete-results-warning()\n<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]!is[tiddler]] +[limit[1]]\">\n<<aim-incomplete-results-warning-message>>\n</$list>\n\\end\n\n\\define aim-show-contact-phase()\n<$let contactPhaseTitle={{{ [{$:/status/UserName}else[anon]addprefix[$:/temp/AIM/Answer/]addsuffix[/ContactPhase]] }}}>\n<$text text={{{ [<contactPhaseTitle>get[text]else[unspecified]] }}}/>\n</$let>\n\\end\n\n\\define aim-selectively-show-contact-phase()\n<$let contactPhaseTitle={{{ [{$:/status/UserName}else[anon]addprefix[$:/temp/AIM/Answer/]addsuffix[/ContactPhase]] }}}>\n<$list filter=\"[<contactPhaseTitle>get[text]else[unspecified]!match[unspecified]]\" variable=\"ignore\">\n<$text text={{{ [<contactPhaseTitle>get[text]] }}}/>\n</$list>\n</$let>\n\\end"},"$:/plugins/federatial/aim-questionnaire/Questions/List":{"title":"$:/plugins/federatial/aim-questionnaire/Questions/List","caption":"<<aim-lingo TabQuestionsList>>","text":"\\whitespace trim\n\n\\define category-tag() AIMCategory\n\\define question-tag() AIMQuestion\n\\define key-question-reduction() [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<currentTiddler>get[text]match[yes]then[1]else[0]add<accumulator>]\n\\define max-key-questions() 6\n\n<table>\n\t<tbody>\n\t\t<$list filter=\"[all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}sort[letter]get[letter]]\" variable=\"category\">\n\t\t\t<$vars category-class={{{ [<currentTiddler>get[category]addprefix[tc-aim-category-]] }}}>\n\t\t\t\t<tr class=\"tc-aim-questions-list-category\">\n\t\t\t\t\t<td colspan=\"9\">\n\t\t\t\t\t\t\t<$transclude tiddler={{{ [all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}field:letter<category>] }}} field=\"caption\"/>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr class=\"tc-aim-questions-list-heading\">\n\t\t\t\t\t<td>No.</td>\n\t\t\t\t\t<td>Key</td>\n\t\t\t\t\t<td>Question</td>\n\t\t\t\t\t<td>0+</td>\n\t\t\t\t\t<td>0</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t</tr>\n\t\t\t\t<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<category>]\" variable=\"question\">\n\t\t\t\t\t<$vars answerTitle={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<question>] }}} keyAnswerTitle={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<question>] }}}>\n\t\t\t\t\t\t<tr class=\"tc-aim-questions-list-question\">\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<$text text={{{ [<question>get[number]] }}}/>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<$checkbox tiddler=<<keyAnswerTitle>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\" disabled={{{ [<keyAnswerTitle>get[text]else[no]match[yes]then[no]] [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}reduce<key-question-reduction>compare:number:gteq<max-key-questions>then[yes]] }}}/>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<$text text={{{ [<question>get[caption]] }}}/>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<$list filter=\"0plus 0 1 2 3 4\" variable=\"answer\">\n\t\t\t\t\t\t\t\t<$vars answerFieldName={{{ [<answer>addprefix[answer]] }}}>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<$list filter=\"[<question>has<answerFieldName>]\" variable=\"ignore\">\n\t\t\t\t\t\t\t\t\t\t\t<$radio tiddler=<<answerTitle>> field=\"text\" value=<<answer>>/>\n\t\t\t\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</$vars>\n\t\t\t\t</$list>\n\t\t\t</$vars>\n\t\t</$list>\n\t</tbody>\n</table>\n\n<div class=\"tc-aim-navigation-buttons\">\n\t<<aim-clear-all-answers-button>>\n</div>\n"},"$:/plugins/federatial/aim-questionnaire/Questions/Wizard":{"title":"$:/plugins/federatial/aim-questionnaire/Questions/Wizard","caption":"<<aim-lingo TabQuestionsWizard>>","text":"\\whitespace trim\n\n\\define category-tag() AIMCategory\n\\define question-tag() AIMQuestion\n\\define key-question-reduction() [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<currentTiddler>get[text]match[yes]then[1]else[0]add<accumulator>]\n\\define max-key-questions() 6\n\n<$set name=\"state\" value=<<qualify \"$:/state/aim-navigation\">>>\n\t<$set name=\"state\" value={{{ [<state>addsuffix[/]addsuffix{$:/config/federatial/aim-questionnaire/aim-question-tag}] }}}>\n\t\t<$tiddler tiddler={{{ [<state>get[text]] ~[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]first[]] }}}>\n\t\t\t<$vars answerTitle={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>] }}} keyAnswerTitle={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<currentTiddler>] }}} category-class={{{ [<currentTiddler>get[category]addprefix[tc-aim-category-]] }}} >\n\t\t\t\t<div class={{{ tc-aim-questions tc-aim-category-faded [<category-class>] +[join[ ]] }}}>\n\t\t\t\t\t<div class=\"tc-aim-status\">\n\t\t\t\t\t\t<div class=\"tc-aim-indicators\">\n\t\t\t\t\t\t\t<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}]\">\n\t\t\t\t\t\t\t\t<div class={{{ tc-aim-indicator [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>is[tiddler]then<currentTiddler>get[category]addprefix[tc-aim-category-]] +[join[ ]] }}}>\n\t\t\t\t\t\t\t\t</div>\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-aim-popup\">\n\t\t\t\t\t\t\t<$button popup=<<qualify \"$:/state/popup/aim-navigation\">> class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}}<$text text=\" \"/><<aim-lingo ButtonShowAllQuestions>><$text text=\" \"/>{{$:/core/images/down-arrow}}\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<$reveal state=<<qualify \"$:/state/popup/aim-navigation\">> type=\"popup\" position=\"belowleft\" tag=\"div\">\n\t\t\t\t\t\t\t<div class=\"tc-drop-down-wrapper\">\n\t\t\t\t\t\t\t\t<div class=\"tc-drop-down\">\n\t\t\t\t\t\t\t\t\t<$list filter=\"[all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}sort[letter]get[letter]]\" variable=\"category\">\n\t\t\t\t\t\t\t\t\t\t<div class={{{ [[tc-dropdown-item-plain]] +[join[ ]] }}}>\n\t\t\t\t\t\t\t\t\t\t\t''<$transclude tiddler={{{ [all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}field:letter<category>] }}} field=\"caption\"/>''\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<category>]\" variable=\"question\">\n\t\t\t\t\t\t\t\t\t\t\t<$button class={{{ [[tc-btn-invisible]] [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<question>has[text]then<question>get[category]addprefix[tc-aim-category-]] [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<question>get[text]else[no]match[yes]then[tc-aim-question-key-problem]] +[join[ ]] }}}>\n\t\t\t\t\t\t\t\t\t\t\t\t<$action-setfield $tiddler=<<state>> $field=\"text\" $value=<<question>>/>\n\t\t\t\t\t\t\t\t\t\t\t\t<$text text={{{ [<question>get[number]] }}}/><$text text=\" \"/>-<$text text=\" \"/><$text text={{{ [<question>get[caption]] }}}/>\n\t\t\t\t\t\t\t\t\t\t\t\t<$vars answerTitle={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<question>] }}}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<$list filter=\"[<answerTitle>get[text]else[no]match[yes]]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"tc-aim-question-key-problem-indicator\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<$text text=\" \"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{$:/core/images/star-filled}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"tc-aim-question\">\n\t\t\t\t\t\t<h3 class={{{ [<currentTiddler>get[category]addprefix[tc-aim-category-]] +[join[ ]] }}}><$text text={{!!number}}/></h3>\n\t\t\t\t\t\t<h2><$transclude tiddler={{{ [<currentTiddler>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\"/></h2>\n\t\t\t\t\t\t<h1><$text text={{!!caption}}/></h1>\n\t\t\t\t\t\t<$transclude mode=\"block\"/>\n\t\t\t\t\t\t<div class={{{ tc-aim-answer [<keyAnswerTitle>get[text]match[yes]then[tc-aim-key-answer-selected]] +[join[ ]] }}}>\n\t\t\t\t\t\t\t<$checkbox tiddler=<<keyAnswerTitle>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\" disabled={{{ [<keyAnswerTitle>get[text]else[no]match[yes]then[no]] [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}reduce<key-question-reduction>compare:number:gteq<max-key-questions>then[yes]] }}}>\n\t\t\t\t\t\t\t\t<$text text=\" \"/>\n\t\t\t\t\t\t\t\t<$vars key-question-number={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}reduce<key-question-reduction>] }}}>\n\t\t\t\t\t\t\t\t\t<<aim-lingo LabelKeyProblem>>\n\t\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t\t</$checkbox>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<$list filter={{!!list}} variable=\"answer\">\n\t\t\t\t\t\t\t<$vars answerFieldName={{{ [<answer>addprefix[answer]] }}}>\n\t\t\t\t\t\t\t\t<div class={{{ tc-aim-answer [<answerTitle>get[text]match<answer>then[tc-aim-answer-selected]] +[join[ ]] }}}>\n\t\t\t\t\t\t\t\t\t<$radio tiddler=<<answerTitle>> field=\"text\" value=<<answer>>>\n\t\t\t\t\t\t\t\t\t\t<$text text=\" \"/>''<$text text=<<answer>>/>''<$text text=\" = \"/><$text text={{{ [<currentTiddler>get<answerFieldName>] }}}/>\n\t\t\t\t\t\t\t\t\t</$radio>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"tc-aim-navigation-buttons\">\n\t\t\t\t\t\t<<aim-clear-all-answers-button>>\n\t\t\t\t\t\t<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]allbefore<currentTiddler>limit[1]]\" variable=\"ignore\">\n\t\t\t\t\t\t\t<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-previous\">\n\t\t\t\t\t\t\t\t<$action-setfield $tiddler=<<state>> $value={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]before<currentTiddler>] }}}/>\n\t\t\t\t\t\t\t\t{{$:/core/images/left-arrow}}\n\t\t\t\t\t\t\t\t<$text text=\" \"/>\n\t\t\t\t\t\t\t\t<<aim-lingo ButtonPrevious>>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]allafter<currentTiddler>limit[1]]\" variable=\"ignore\">\n\t\t\t\t\t\t\t<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-next\" disabled={{{ [<answerTitle>is[tiddler]then[no]else[yes]] }}}>\n\t\t\t\t\t\t\t\t<$action-setfield $tiddler=<<state>> $value={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]after<currentTiddler>] }}}/>\n\t\t\t\t\t\t\t\t<<aim-lingo ButtonNext>>\n\t\t\t\t\t\t\t\t<$text text=\" \"/>\n\t\t\t\t\t\t\t\t{{$:/core/images/right-arrow}}\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]!is[tiddler]] +[limit[1]else[true]match[true]]\">\n\t\t\t\t\t\t\t<$button class=\"tc-aim-navigation-button tc-aim-navigation-button-results\">\n\t\t\t\t\t\t\t\t<$action-setfield $tiddler=<<tabsState>> $value=\"$:/plugins/federatial/aim-questionnaire/Results\"/>\n\t\t\t\t\t\t\t\t{{$:/core/images/save-button}}\n\t\t\t\t\t\t\t\t<$text text=\" results\"/>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"tc-aim-navigation-footer\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<$vars question-number={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]is[tiddler]count[]] }}} max-questions={{{ [{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]count[]] }}}>\n\t\t\t\t\t\t\t\t<<aim-lingo QuestionFooter>>\n\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t\t<$list filter=\"[{$:/state/aim-questionnaire/edit-mode}match[show]]\" variable=\"ignore\">\n\t\t\t\t<div class=\"tc-aim-navigation-edit-mode\">\n\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-heading\">\n\t\t\t\t\tEdit question text\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-body\">\n\t\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-item\">\n\t\t\t\t\t\t\tQuestion caption:\n\t\t\t\t\t\t\t<$edit-text field=\"caption\" tag=\"textarea\" autoHeight=\"yes\" minHeight=\"1em\"/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-item\">\n\t\t\t\t\t\t\tQuestion text:\n\t\t\t\t\t\t\t<$edit-text field=\"text\" autoHeight=\"yes\" minHeight=\"1em\"/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<$list filter={{!!list}} variable=\"answer\">\n\t\t\t\t\t\t\t<$vars answerFieldName={{{ [<answer>addprefix[answer]] }}}>\n\t\t\t\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-item\">\n\t\t\t\t\t\t\t\t\t<$text text=<<answer>>/>:\n\t\t\t\t\t\t\t\t\t<$edit-text field=<<answerFieldName>> tag=\"textarea\" autoHeight=\"yes\" minHeight=\"1em\"/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</$vars>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t<div class=\"tc-aim-navigation-edit-mode-item\">\n\t\t\t\t\t\t\tQuestion tiddler is from bag: <$text text={{{ [[$:/state/federatial/xememex/tiddlers/bag]getindex<currentTiddler>] }}}/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</$list>\n\t\t</$tiddler>\n\t</$set>\n</$set>\n"},"$:/plugins/federatial/aim-questionnaire/Results":{"title":"$:/plugins/federatial/aim-questionnaire/Results","caption":"<<aim-lingo TabResults>> <$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]!is[tiddler]] +[limit[1]else[true]match[true]]\"><span class=\"tc-aim-result-flag\">{{$:/core/images/download-button}}</span></$list>","text":"<p>\n<<aim-lingo ResultsOverview>>\n</p>\n\n<$let contactPhaseTitle={{{ [{$:/status/UserName}else[anon]addprefix[$:/temp/AIM/Answer/]addsuffix[/ContactPhase]] }}}>\n<p class=\"tc-aim-contact-phase\">\n<<aim-lingo ContactPhaseHeading>>\n<ol>\n<li>\n<$radio tiddler=<<contactPhaseTitle>> value=\"unspecified\" default=\"unspecified\">\n<<aim-lingo ContactPhaseUnspecified>>\n</$radio>\n</li>\n<li>\n<$radio tiddler=<<contactPhaseTitle>> value=\"start\" default=\"unspecified\">\n<<aim-lingo ContactPhaseStart>>\n</$radio>\n</li>\n<li>\n<$radio tiddler=<<contactPhaseTitle>> value=\"end\" default=\"unspecified\">\n<<aim-lingo ContactPhaseEnd>>\n</$radio>\n</li>\n</ol>\n</p>\n</$let>\n\n<<tabs tabsList:\"$:/plugins/federatial/aim-questionnaire/Results/Scores $:/plugins/federatial/aim-questionnaire/Results/Download\" default:\"$:/plugins/federatial/aim-questionnaire/Results/Scores\">>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Download":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Download","caption":"<<aim-lingo TabDownload>>","text":"\\define download-scores()\n! <<aim-lingo HeadingDownloadWordDocument>>\n\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/plugins/federatial/aim-questionnaire/Results/Scores/DocTemplate\" filename=\"aim-scores.doc\"/>\n{{$:/core/images/download-button}} <<aim-lingo BodyDownloadScoresWordDocument>>\n</$button>\n\n! <<aim-lingo HeadingDownloadCSV>>\n\n<<aim-lingo BodyDownloadCSV>>\n\n<$button class=\"tc-btn-big-green\">\n{{$:/core/images/download-button}} <<aim-lingo ButtonDownloadCSV>>\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/plugins/federatial/aim-questionnaire/CSVDownloadTemplate\" filename=\"results.csv\" separator=\",\"/>\n</$button>\n\n<$button class=\"tc-btn-big-green\">\n<$vars separator={{{ [charcode[9]] }}}>\n<$wikify name=\"CSV-data\" text={{$:/plugins/federatial/aim-questionnaire/CSVDownloadTemplate}}>\n<$action-sendmessage $message=\"tm-copy-to-clipboard\" $param=<<CSV-data>>/>\n</$wikify>\n</$vars>\n{{$:/core/images/copy-clipboard}} <<aim-lingo ButtonCopyCSVToClipboard>>\n</$button>\n\n<<aim-lingo PreviewDownloadCSV>>\n\n<div class=\"tc-aim-download-results\">\n<$vars separator=\",\">\n<$wikify name=\"CSV\" text={{$:/plugins/federatial/aim-questionnaire/CSVDownloadTemplate}}>\n<$vars table={{{ [<CSV>split[,]join[</td><td>]addprefix[<table><tbody><tr><td>]addsuffix[</td></tr></tbody></table>]addsuffix<linebreak>] }}}>\n<<table>>\n</$vars>\n</$wikify>\n</$vars>\n</div>\n\\end\n\n<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]!is[tiddler]] +[limit[1]else[true]match[true]]\" emptyMessage=<<aim-incomplete-results-blocked>>>\n\n<<download-scores>>\n\n</$list>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Scores":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Scores","caption":"<<aim-lingo TabScores>>","text":"\\define total-reduction()\n[{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>get[text]else[0]add<accumulator>]\n\\end\n\n\\define show-scores()\n!! <<aim-lingo ResultsTotalScore>> <$text text={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}reduce<total-reduction>] }}}/>\n\n!! <<aim-lingo ResultsSubscaleScores>>\n\n<table>\n<tbody>\n<$list filter=\"[all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}]\" variable=\"category\">\n<tr>\n<td>\n<$transclude tiddler=<<category>> field=\"caption\"/>\n</td>\n<td>\n<$vars category-letter={{{ [<category>get[letter]] }}}>\n<$text text={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<category-letter>reduce<total-reduction>] }}}/>\n</$vars>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n\n!! <<aim-lingo ResultsQuestionScores>>\n\n<table>\n<tbody>\n<$list filter=\"[all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}]\" variable=\"category\">\n<$vars category-letter={{{ [<category>get[letter]] }}}>\n<tr>\n<td colspan=\"2\">\n''<$transclude tiddler=<<category>> field=\"caption\"/>''\n</td>\n<td>\n''<$text text={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<category-letter>reduce<total-reduction>] }}}/>''\n</td>\n</tr>\n<$list filter=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<category-letter>]\" variable=\"question\">\n<tr>\n<td>\n<$text text={{{ [<question>get[number]] }}}/>\n</td>\n<td>\n<$text text={{{ [<question>get[caption]] }}}/>\n</td>\n<td>\n<$text text={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<question>get[text]else[0]] }}}/><$text text={{{ [<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]get[text]match[yes]then[*]] }}}/>\n</td>\n</tr>\n</$list>\n</$vars>\n</$list>\n</tbody>\n</table>\n\n!! <<aim-lingo ResultsKeyProblems>>\n\n<table>\n<tbody>\n<$vars key-question-filter=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:category<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]get[text]else[no]match[yes]then[1]else[0]] +[sum[]compare:number:gt[0]] \">\n<$list filter=\"[all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}get[letter]filter<key-question-filter>]\" variable=\"category-letter\" emptyMessage=\"\"\"\n<tr>\n<td>\n<<aim-lingo ResultsKeyProblemsNone>>\n</td>\n</tr>\n\"\"\">\n<tr>\n<td colspan=\"3\">\n''<$transclude tiddler={{{ [all[tiddlers+shadows]tag{$:/config/federatial/aim-questionnaire/aim-category-tag}field:letter<category-letter>] }}} field=\"caption\"/>''\n</td>\n</tr>\n<$list filter=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}category<category-letter>]\" variable=\"question\">\n<$list filter=\"[<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]get[text]match[yes]]\" variable=\"ignore\">\n<tr>\n<td>\n<$text text={{{ [<question>get[number]] }}}/>\n</td>\n<td>\n<$text text={{{ [<question>get[caption]] }}}/>\n</td>\n<td>\n<$text text={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<question>get[text]else[0]] }}}/>\n</td>\n</tr>\n</$list>\n</$list>\n</$list>\n</$vars>\n</tbody>\n</table>\n\\end\n\n<$list filter=\"[{$:/config/federatial/aim-questionnaire/aim-question-tag}tagging[]addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]!is[tiddler]] +[limit[1]else[true]match[true]]\" emptyMessage=<<aim-incomplete-results-blocked>>>\n\n<<show-scores>>\n\n</$list>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Scores/DocTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Scores/DocTemplate","text":"\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <title>AIM Assessment Results</title>\n <style>\n body {\n font-family: \"Verdana\", sans-serif;\n }\n </style>\n</head>\n<body>\n<h1>AIM Assessment Scores</h1>\n<p style=\"font-style:italic;\">`<$wikify name=\"date\" text=\"<<now [UTC]YYYY0MM0DD0hh0mm0ssXXX>>\"><$text text={{{ [<date>format:date[hh:mm, DDth MMM YYYY]] }}} /></$wikify>`</p>\n<p style=\"font-weight:bold;\">Client name:</p>\n<p style=\"font-weight:bold;\">DOB:</p>\n<p style=\"font-weight:bold;\">Name of person completing AIM:</p>\n<p>Completed at <span style=\"font-weight:bold;\">\n`\n<<aim-selectively-show-contact-phase>>\n`\n</span> of contact</p>\n`{{$:/plugins/federatial/aim-questionnaire/Results/Scores||$:/core/templates/html-tiddler}}`\n</body>\n</html>`"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions","caption":"<<aim-lingo TabSuggestedInterventions>>","text":"<<aim-lingo OverviewSuggestedInterventions>>\n\n<<tabs tabsList:\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal $:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global $:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit\" default:\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal\">>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/DocTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/DocTemplate","text":"\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <title>AIM Assessment Results</title>\n <style>\n html,body,p {\n font-family: \"Verdana\", sans-serif;\n\tfont-size: 18px;\n\tline-height: 1.2;\n }\n .tc-list-item {\n\t line-height: 1.2;\n\t margin: 0;\n }\n h1, h2, h3, h4, h5, h6 {\n\t line-height: 1.2;\n\t font-weight: bold;\n\t margin: 0.5em 0;\n }\n h1 {\n\t font-size: 17px;\n }\n h2 {\n\t font-size: 16px;\n }\n h3 {\n\t font-size: 15px;\n }\n h4 {\n\t font-size: 14px;\n }\n h5 {\n\t font-size: 13px;\n }\n h6 {\n\t font-size: 12px;\n }\n\n\ttable {\n\t\twidth: auto;\n\t\tmax-width: 100%;\n\t\tcaption-side: bottom;\n\t\tmargin-top: 1em;\n\t\tmargin-bottom: 1em;\n\t\tborder: 0.5px solid #000;\n\t}\n\n\ttable th, table td {\n\t\tborder: 1px solid #000;\n\t\tmargin: 0.2em;\n\t\tpadding: 0;\n\t\ttext-align: left;\n\t}\n\n\ttable thead tr td, table th {\n\t\tfont-weight: bold;\n\t}\n\n\ttable tfoot tr td {\n\t}\n\n </style>\n</head>\n<body>\n<h1>AIM Assessment Suggestions</h1>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tr>\n<th>Date</th>\n<td>`<$vars date=<<now [UTC]YYYY0MM0DD0hh0mm0ssXXX>>><$text text={{{ [<date>format:date[0hh:0mm, DDth MMM YYYY]] }}} /></$vars>` </td>\n</tr>\n<tr>\n<th>Client Name</th>\n<td></td>\n</tr>\n<tr>\n<th>D.O.B.</th>\n<td></td>\n</tr>\n<th>Completed by</th>\n<td></td>\n</tr>\n<tr>\n<th></th>\n<td>\nCompleted at `\n<<aim-selectively-show-contact-phase>>\n` of contact\n</td>\n</tr>\n</table>\n<p>`\n<<aim-lingo OverviewSuggestedInterventions>>\n<<aim-incomplete-results-warning>>\n`</p>`\n<$tiddler tiddler=<<content>>>\n<$transclude tiddler=\"$:/core/templates/html-tiddler\"/>\n</$tiddler>\n`</body>\n</html>`"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal","caption":"<<aim-lingo TabSuggestionsFocal>>","text":"\\define expanded-state()\n[<currentTiddler>addprefix[$:/state/expanded-answer/focal/]]\n\\end\n\n<<aim-lingo OverviewSuggestionsFocal>>\n\n<<aim-incomplete-results-warning>>\n\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/DocTemplate\" filename=\"results.doc\" content=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal/DocTemplate\"/>\n{{$:/core/images/download-button}} <<aim-lingo BodyDownloadSuggestionsWordDocument>>\n</$button>\n\n<!-- Define a filter for to compute the average score of the questions tagged with the current intervention -->\n<$vars\n\taverageScoreForIntervention=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[0]average[]]\"\n>\n<!-- Loop through all the interventions, descendingly sorted by their average score -->\n<ol class=\"tc-aim-results-interventions\">\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<averageScoreForIntervention>]\">\n<!-- Skip any interventions whose average score is zero -->\n<$list filter=\"[subfilter<averageScoreForIntervention>compare:number:ne[0]]\" variable=\"ignore\">\n<li>\n<!-- Display the intervention and average score -->\n<span class=\"tc-aim-results-intervention\">\n<span class=\"tc-aim-results-score\">\n<span class=\"tc-aim-results-score-small\">\n<$text text={{{ [subfilter<averageScoreForIntervention>fixed[1]] }}}/>\n</span>\n</span>\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"match\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"show\">\n<<aim-lingo ButtonShowQuestions>>\n</$button>\n</$reveal>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"hide\">\n<<aim-lingo ButtonHideQuestions>>\n</$button>\n</$reveal>\n</span>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<ol class=\"tc-aim-results-intervention-questions\">\n<!-- Loop through the questions tagged with this intervention -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<averageScoreForIntervention>compare:number:ne[0]]\" variable=\"question\">\n<$list filter=\"[<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]has[text]]\" variable=\"ignore\">\n<li>\n<!-- Display the question and its score -->\n<$link to=<<question>>>\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n</$link> (<$text text={{{ [<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[-]] }}}/>)\n</li>\n</$list>\n</$list>\n</ol>\n</$reveal>\n</li>\n</$list>\n</$list>\n</ol>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal/DocTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Focal/DocTemplate","text":"! Focal\n\n<<aim-lingo OverviewSuggestionsFocal>>\n\n<!-- Define a filter for to compute the average score of the questions tagged with the current intervention -->\n<$vars\n\taverageScoreForIntervention=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[0]average[]]\"\n>\n<!-- Loop through all the interventions, descendingly sorted by their average score -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<averageScoreForIntervention>]\">\n<!-- Skip any interventions whose average score is zero -->\n<$list filter=\"[subfilter<averageScoreForIntervention>compare:number:ne[0]]\" variable=\"ignore\">\n<!-- Display the intervention and average score -->\n<h2>\n<$text text={{{ [subfilter<averageScoreForIntervention>fixed[1]] }}}/>\n<$text text=<<currentTiddler>>/>\n</h2>\n<!-- Loop through the questions tagged with this intervention -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<averageScoreForIntervention>compare:number:ne[0]]\" variable=\"question\">\n<$list filter=\"[<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]has[text]]\" variable=\"ignore\">\n<!-- Display the question and its score -->\n<p class=\"tc-list-item\">\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n(<$text text={{{ [<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[-]] }}}/>)\n</p>\n</$list>\n</$list>\n</$list>\n</$list>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global","caption":"<<aim-lingo TabSuggestionsGlobal>>","text":"\\define expanded-state()\n[<currentTiddler>addprefix[$:/state/expanded-answer/global/]]\n\\end\n\n<<aim-lingo OverviewSuggestionsGlobal>>\n\n<<aim-incomplete-results-warning>>\n\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/DocTemplate\" filename=\"results.doc\" content=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global/DocTemplate\"/>\n{{$:/core/images/download-button}} <<aim-lingo BodyDownloadSuggestionsWordDocument>>\n</$button>\n<!--\nDefine two filters:\n* a reduction filter to number of questions tagged with a particular intervention that have a score greater than 2\n* a sorting filter to sort interventions by the number of questions scoring greater than 2\n* a filtering filter to select questions scoring greater than 2\n-->\n<$vars\n global-ranking-reduction=\"[{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>get[text]else[0]compare:number:gt[2]then[1]else[0]add<accumulator>]\"\n global-ranking-sort=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>]\"\n global-ranking-filter=\"[addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[0]compare:number:gt[2]]\"\n>\n<ol class=\"tc-aim-results-interventions\">\n<!-- Loop through the interventions, descendly sorted by the number of questions scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<global-ranking-sort>]\">\n<!-- Ignore any interventions that have zero questions scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>compare:number:ne[0]]\" variable=\"ignore\">\n<li>\n<!-- Display the question and the number of answers scoring greater than 2 -->\n<span class=\"tc-aim-results-intervention\">\n<span class=\"tc-aim-results-score\">\n<$text text={{{ [tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>] }}}/>\n</span>\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"match\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"show\">\n<<aim-lingo ButtonShowQuestions>>\n</$button>\n</$reveal>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"hide\">\n<<aim-lingo ButtonHideQuestions>>\n</$button>\n</$reveal>\n</span>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<ol class=\"tc-aim-results-intervention-questions\">\n<!-- Loop through the questions tagged with this intervention that have answers scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<global-ranking-filter>]\" variable=\"question\">\n<li>\n<!-- Display the question and its score -->\n<$link to=<<question>>>\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n</$link> (rating <$text text={{{ [<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[-]] }}}/>)\n</li>\n</$list>\n</ol>\n</$reveal>\n</li>\n</$list>\n</$list>\n</ol>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global/DocTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Global/DocTemplate","text":"! Global\n\n<<aim-lingo OverviewSuggestionsGlobal>>\n\n<!--\nDefine two filters:\n* a reduction filter to number of questions tagged with a particular intervention that have a score greater than 2\n* a sorting filter to sort interventions by the number of questions scoring greater than 2\n* a filtering filter to select questions scoring greater than 2\n-->\n<$vars\n global-ranking-reduction=\"[{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>get[text]else[0]compare:number:gt[2]then[1]else[0]add<accumulator>]\"\n global-ranking-sort=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>]\"\n global-ranking-filter=\"[addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[0]compare:number:gt[2]]\"\n>\n<!-- Loop through the interventions, descendly sorted by the number of questions scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<global-ranking-sort>]\">\n<!-- Ignore any interventions that have zero questions scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>compare:number:ne[0]]\" variable=\"ignore\">\n<!-- Display the question and the number of answers scoring greater than 2 -->\n<h2>\n<$text text={{{ [tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>] +[reduce<global-ranking-reduction>] }}}/>\n<$text text=<<currentTiddler>>/>\n</h2>\n<!-- Loop through the questions tagged with this intervention that have answers scoring greater than 2 -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<global-ranking-filter>]\" variable=\"question\">\n<!-- Display the question and its score -->\n<p class=\"tc-list-item\">\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n(rating <$text text={{{ [<question>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]get[text]else[-]] }}}/>)\n</p>\n</$list>\n</$list>\n</$list>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit","caption":"<<aim-lingo TabSuggestionsLimit>>","text":"\\define expanded-state()\n[<currentTiddler>addprefix[$:/state/expanded-answer/limit/]]\n\\end\n\n<<aim-lingo OverviewSuggestionsLimit>>\n\n<<aim-incomplete-results-warning>>\n\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/DocTemplate\" filename=\"results.doc\" content=\"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit/DocTemplate\"/>\n{{$:/core/images/download-button}} <<aim-lingo BodyDownloadSuggestionsWordDocument>>\n</$button>\n\n<!-- Define a filter to compute the number of key questions tagged with the current intervention -->\n<$vars\n numberKeyQuestionsForIntervention=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]get[text]match[yes]count[]]\"\n keyQuestionsForIntervention=\"[addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]field:text[yes]]\"\n>\n<!-- Loop through all the interventions, descendingly sorted by their score -->\n<ol class=\"tc-aim-results-interventions\">\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<numberKeyQuestionsForIntervention>]\">\n<!-- Skip any interventions whose average score is zero -->\n<$list filter=\"[subfilter<numberKeyQuestionsForIntervention>compare:number:ne[0]limit[1]]\" variable=\"ignore\">\n<li>\n<!-- Display the intervention and average score -->\n<span class=\"tc-aim-results-intervention\">\n<span class=\"tc-aim-results-score\">\n<$text text={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]field:text[yes]count[]] }}}/>\n</span>\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"match\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"show\">\n<<aim-lingo ButtonShowQuestions>>\n</$button>\n</$reveal>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"span\">\n<$button set={{{ [subfilter<expanded-state>] }}} setTo=\"hide\">\n<<aim-lingo ButtonHideQuestions>>\n</$button>\n</$reveal>\n</span>\n<$reveal stateTitle={{{ [subfilter<expanded-state>] }}} type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<ol class=\"tc-aim-results-intervention-questions\">\n<!-- Loop through the questions tagged with this intervention -->\n<$list filter=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<keyQuestionsForIntervention>]\" variable=\"question\">\n<li>\n<!-- Display the question -->\n<$link to=<<question>>>\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n</$link>\n</li>\n</$list>\n</ol>\n</$reveal>\n</li>\n</$list>\n</$list>\n</ol>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit/DocTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/Results/Suggestions/Limit/DocTemplate","text":"! Limit\n\n<<aim-lingo OverviewSuggestionsLimit>>\n\n<<aim-incomplete-results-warning>>\n\n<!-- Define a filter to compute the number of key questions tagged with the current intervention -->\n<$vars\n numberKeyQuestionsForIntervention=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]get[text]match[yes]count[]]\"\n keyQuestionsForIntervention=\"[addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]field:text[yes]]\"\n>\n<!-- Loop through all the interventions, descendingly sorted by their score -->\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}] +[tags[]] -[{$:/config/federatial/aim-questionnaire/aim-question-tag}] -[[hide-subpage]] +[!sortsub:number<numberKeyQuestionsForIntervention>]\">\n<!-- Skip any interventions whose average score is zero -->\n<$list filter=\"[subfilter<numberKeyQuestionsForIntervention>compare:number:ne[0]limit[1]]\" variable=\"ignore\">\n<!-- Display the intervention and average score -->\n<h2>\n<$text text={{{ [all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>addprefix[/]addprefix{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]field:text[yes]count[]] }}}/>\n<$text text=<<currentTiddler>>/>\n</h2>\n<!-- Loop through the questions tagged with this intervention -->\n<$list filter=\"[all[tiddlers]tag{$:/config/federatial/aim-questionnaire/aim-question-tag}tag<currentTiddler>filter<keyQuestionsForIntervention>]\" variable=\"question\">\n<!-- Display the question -->\n<p class=\"tc-list-item\">\n<$text text={{{ [<question>get[number]] }}}/>\n<$transclude tiddler={{{ [<question>get[category]addprefix[$:/plugins/federatial/aim-questionnaire/Categories/]] }}} field=\"caption\" mode=\"inline\"/>\n-\n<$text text={{{ [<question>get[caption]] }}}/>\n</p>\n</$list>\n</$list>\n</$list>\n</$vars>\n"},"$:/plugins/federatial/aim-questionnaire/Styles":{"title":"$:/plugins/federatial/aim-questionnaire/Styles","tags":"$:/tags/Stylesheet","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\nhtml body.tc-body .tc-tiddler-frame.tc-tagged-AIMQuestion .tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fedit,\nhtml body.tc-body .tc-tiddler-frame.tc-tagged-AIMQuestion .tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Finfo,\nhtml body.tc-body .tc-tiddler-frame.tc-tagged-AIMQuestion .tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fmore-tiddler-actions,\nhtml body.tc-body .tc-tiddler-frame.tc-tagged-AIMQuestion .tc-tag-list-item[data-tag-title=\"AIMQuestion\"],\nhtml body.tc-body .tc-tiddler-frame.tc-tagged-AIMQuestion .tc-tag-list-item[data-tag-title=\"hide-subpage\"] {\n\tdisplay: none;\n}\n\n.tc-aim-panel .tc-tab-set > .tc-tab-buttons button {\n\tfont-size: 1.2em;\n\tfont-weight: bold;\n\tpadding: 0.5em;\n}\n\n.tc-aim-result-flag {\n\tfill: red;\n}\n\n.tc-aim-panel > .tc-tab-set > .tc-tab-content {\n\tmargin-top: 0;\n}\n\n.tc-aim-panel > .tc-tab-set > .tc-tab-content > .tc-reveal > p {\n\tmargin: 0;\n}\n\n.tc-aim-panel .tc-aim-popup {\n\ttext-align: right;\n}\n\n.tc-aim-panel .tc-aim-popup button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-aim-panel .tc-aim-popup button svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-aim-panel .tc-aim-indicators {\n\tdisplay: flex;\n\twidth: 100%;\n\tbackground: <<colour background>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-aim-panel .tc-aim-indicators .tc-aim-indicator {\n\tflex-grow: 1;\n\tdisplay: inline-block;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n\tmin-width: 4px;\n\tmin-height: 1em;\n}\n\n.tc-aim-panel .tc-aim-status .tc-drop-down button {\n\tpadding-top: 2px;\n\tpadding-bottom: 2px;\n}\n.tc-aim-panel .tc-aim-status .tc-drop-down button.tc-aim-question-key-problem {\n\tfont-weight: bold;\n}\n\n.tc-aim-panel .tc-aim-status .tc-drop-down button .tc-aim-question-key-problem-indicator {\n\tfloat: right;\n\tpadding-left: 0.5em;\n}\n\n.tc-aim-panel .tc-aim-status .tc-drop-down button .tc-aim-question-key-problem-indicator svg {\n\tfill: red;\n}\n\n.tc-aim-panel .tc-aim-status .tc-dropdown-item-plain {\n\tcolor: #969696;\n}\n\n.tc-aim-panel .tc-aim-questions {\n\tborder-left: 1px solid <<colour tab-divider>>;\n\tborder-right: 1px solid <<colour tab-divider>>;\n\tborder-bottom: 1px solid <<colour tab-divider>>;\n\tline-height: 1.4;\n\tpadding: 1em;\n}\n\n.tc-aim-navigation-buttons {\n\ttext-align: center;\n}\n\nbutton.tc-aim-navigation-button {\n\twidth: auto;\n\tcursor: pointer;\n\tborder: none;\n\tbackground: <<colour foreground>>;\n\tpadding: 5px;\n\tmargin: 0 0.5em;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tborder-radius: 0.25em;\n}\n\nbutton.tc-aim-navigation-button-clear {\n\tbackground: #e46666;\n}\n\nbutton.tc-aim-navigation-button-previous {\n\tbackground: #6666e4;\n}\n\nbutton.tc-aim-navigation-button-next {\n\tbackground: #2bad2b;\n}\n\nbutton.tc-aim-navigation-button-next:disabled {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour muted-foreground>>;\n}\n\nbutton.tc-aim-navigation-button-next:disabled svg {\n\tfill: <<colour foreground>>;\n}\n\nbutton.tc-aim-navigation-button-results {\n\tbackground: #ffaf16;\n}\n\nbutton.tc-aim-navigation-button:hover {\n background-color: <<colour muted-foreground>>;\n}\n\n.tc-aim-navigation-footer {\n\ttext-align: center;\n\tmargin-top: 1em;\n\tcolor: #9e9e9e;\n}\n\n.tc-aim-navigation-button-drop-down {\n\ttext-align: left;\n}\n\n.tc-aim-question h3 {\n\tfloat: left;\n\tfont-size: 4em;\n\tline-height: 1;\n\tpadding: 0.25em;\n\tmargin: 0 0.25em 0.25em 0;\n\tborder-radius: 0.125em;\n\t<<box-shadow \"2px 2px 6px 1px rgba(0, 0, 0, 0.5)\">>\n\tborder: 1px solid rgba(0,0,0,0.3);\n}\n\n.tc-aim-question h2 {\n\tfont-size: 1.5em;\n\tline-height: 1.1;\n\tmargin: 0;\n}\n\n.tc-aim-question h1 {\n\tfont-size: 2em;\n\tline-height: 1.1;\n\tfont-weight: bold;\n\tmargin: 0;\n}\n\n.tc-aim-question p {\n\tclear: both;\n\tfont-size: 1.5em;\n}\n\n.tc-aim-question .tc-aim-answer {\n\tmargin: 0.5em 0;\n\tborder-radius: 1em;\n}\n\n.tc-aim-question .tc-aim-answer:hover {\n\tbackground: #ffffff;\n}\n\n.tc-aim-question .tc-aim-answer label {\n\tdisplay: block;\n\tpadding: 0.25em;\n}\n\n.tc-aim-question .tc-aim-answer-selected {\n\tbackground-color: #ffff77;\n}\n\n.tc-aim-question .tc-aim-key-answer-selected {\n\tbackground: #ffc9c9;\n}\n\n.tc-aim-question-done {\n}\n\n.tc-aim-navigation-edit-mode {\n\tmargin-top: 1em;\n\tborder: 1px solid <<colour tab-divider>>;\n\tbackground-color: #e0bfbb20;\n}\n\n.tc-aim-navigation-edit-mode-heading {\n\tbackground-color: #333;\n\tcolor: #fff;\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n}\n\n.tc-aim-navigation-edit-mode-body {\n\tpadding: 0 1em;\n}\n\n.tc-aim-navigation-edit-mode-item {\n\tmargin: 1em 0;\n}\n\n.tc-aim-navigation-edit-mode-item textarea {\n\twidth: 100%;\n}\n\n.tc-aim-questions-list-category {\n\tfont-weight: bold;\n\tcolor: #969696;\n\tfont-size: 1.4em;\n\tline-height: 1.8em;\n}\n\n.tc-aim-questions-list-heading {\n\tcolor: #969696;\n}\n\n.tc-aim-questions-list-question {\n\n}\n\n.tc-aim-contact-phase ol {\n\tlist-style: none;\n\tpadding-left: 0;\n}\n\n.tc-aim-results-interventions {\n\tlist-style: none;\n\tpadding-left: 0;\n}\n\n.tc-aim-results-interventions .tc-aim-results-intervention {\n\tfont-size: 1.5em;\n\tline-height: 1.5;\n}\n\n.tc-aim-results-interventions .tc-aim-results-intervention .tc-aim-results-score {\n\tdisplay: inline-block;\n\ttext-align: center;\n\tfont-weight: bold;\n\tbackground-color: #34c734;\n\tcolor: <<colour background>>;\n\tpadding: 0.25em;\n\tborder-radius: 3em;\n\tmargin: 0.25em;\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-aim-results-interventions .tc-aim-results-intervention .tc-aim-results-score .tc-aim-results-score-small {\n\tfont-size: 0.8em;\n\tpadding: 0;\n\tvertical-align: text-bottom;\n}\n\n.tc-aim-results-interventions .tc-aim-results-intervention button {\n\tfont-size: 0.5em;\n\tline-height: 1;\n\tdisplay: inline-block;\n\tpadding: 4px;\n\tmargin: 2px 4px 2px 4px;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tborder: none;\n\tborder-radius: 2px;\n\ttext-decoration: none;\n}\n\n.tc-aim-results-interventions > li {\n\tline-height: 1.5;\n}\n\n.tc-aim-results-intervention-questions {\n\tlist-style: none;\n\tpadding-left: 1em;\n}\n\n.tc-aim-results-intervention-questions > li {\n\tline-height: 1.5;\n}\n\n.tc-aim-download-results {\n\twidth: 100%;\n\toverflow-x: scroll;\n\twhite-space: nowrap;\n}\n\n.tc-aim-category-A {background-color: #bfbbe0;}\n\n.tc-aim-category-A.tc-aim-category-faded {background-color: #bfbbe020;}\n\n.tc-aim-category-B {background-color: #d4bac3;}\n\n.tc-aim-category-B.tc-aim-category-faded {background-color: #d4bac320;}\n\n.tc-aim-category-C {background-color: #ebc6b1;}\n\n.tc-aim-category-C.tc-aim-category-faded {background-color: #ebc6b120;}\n\n.tc-aim-category-D {background-color: #fad9ae;}\n\n.tc-aim-category-D.tc-aim-category-faded {background-color: #fad9ae20;}\n\n.tc-aim-category-E {background-color: #fee99a;}\n\n.tc-aim-category-E.tc-aim-category-faded {background-color: #fee99a20;}\n\n.tc-aim-category-F {background-color: #fff172;}\n\n.tc-aim-category-F.tc-aim-category-faded {background-color: #fff17220;}\n\n.tc-aim-category-G {background-color: #ffcd42;}\n\n.tc-aim-category-G.tc-aim-category-faded {background-color: #ffcd4220;}\n\n.tc-aim-category-H {background-color: #f79577;}\n\n.tc-aim-category-H.tc-aim-category-faded {background-color: #f7957720;}\n\n.tc-aim-ui-editor-list {\n}\n\n.tc-aim-ui-editor-list-item {\n\tbackground-color: #e8e8e8;\n\tmargin-bottom: 1em;\n}\n\n.tc-aim-ui-editor-list textarea {\n\twidth: 100%;\n}\n\n.tc-aim-ui-editor-list-heading {\n\tbackground: #333;\n\tcolor: #fff;\n}\n\n.tc-aim-ui-editor-list-body {\n\tpadding: 0 1em;\n}\n\n.tc-aim-ui-editor-list-body-item {\n}\n"},"$:/plugins/federatial/aim-questionnaire/CSVDownloadTemplate":{"title":"$:/plugins/federatial/aim-questionnaire/CSVDownloadTemplate","text":"\\whitespace trim\n<$vars sortby=\"[get[number]]\" linebreak=\"\n\">\n<$text text=<<separator>>/>\n<<now \"YYYY-MM-DD\">>\n<$text text=<<separator>>/>\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}sortsub:number<sortby>]\" counter=\"counter\">\n<$text text={{{ [{$:/status/UserName}else[anon]addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>get[text]] ~[[missing]] =0 +[replace[0plus]] }}}/>\n<$list filter=\"[<counter-last>!match[yes]]\">\n<$text text=<<separator>>/>\n</$list>\n</$list>\n<$text text=<<separator>>/>\n<<aim-show-contact-phase>>\n<$text text=<<linebreak>>/>\n</$vars>"},"$:/config/federatial/aim-questionnaire/aim-category-tag":{"title":"$:/config/federatial/aim-questionnaire/aim-category-tag","text":"AIMCategory"},"$:/config/federatial/aim-questionnaire/aim-question-tag":{"title":"$:/config/federatial/aim-questionnaire/aim-question-tag","text":"AIMQuestion"},"$:/plugins/federatial/aim-questionnaire/config":{"title":"$:/plugins/federatial/aim-questionnaire/config","text":"Tag used to identify AIM Questions: <$edit-text tiddler=\"$:/config/federatial/aim-questionnaire/aim-question-tag\" tag=\"input\"/>\n\nTag used to identify AIM Categories: <$edit-text tiddler=\"$:/config/federatial/aim-questionnaire/aim-category-tag\" tag=\"input\"/>\n\n---\n\n<$list filter=\"[{$:/state/aim-questionnaire/edit-mode}!match[show]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-setfield $tiddler=\"$:/state/aim-questionnaire/edit-mode\" $value=\"show\"/>\nSwitch on edit mode\n</$button>\n</$list>\n\n<$list filter=\"[{$:/state/aim-questionnaire/edit-mode}match[show]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\" style=\"background-color: red;\">\n<$action-setfield $tiddler=\"$:/state/aim-questionnaire/edit-mode\" $value=\"hide\"/>\nSwitch off edit mode\n</$button>\n</$list>\n\n---\n\nEdit user interface strings:\n\n<div class=\"tc-aim-ui-editor-list\">\n<$list filter=\"[[$:/plugins/federatial/aim-questionnaire/Language/en-GB]indexes[]sort[]]\" variable=\"index\">\n<div class=\"tc-aim-ui-editor-list-item\">\n<div class=\"tc-aim-ui-editor-list-heading\">\n''<$text text=<<index>>/>''<br>\n</div>\n<div class=\"tc-aim-ui-editor-list-body\">\n<div class=\"tc-aim-ui-editor-list-body-item\">\n//<$text text={{{ [[$:/plugins/federatial/aim-questionnaire/Language/en-GB]getindex<index>] }}}/>//\n</div>\n<div class=\"tc-aim-ui-editor-list-body-item\">\n<$edit-text tiddler={{{ [{$:/language}get[name]] ~[[en-GB]] +[addprefix[$:/plugins/federatial/aim-questionnaire/Language/]] }}} index=<<index>> autoHeight=\"yes\" minHeight=\"1em\"/>\n</div>\n</div>\n</div>\n</$list>\n</div>\n"},"$:/plugins/federatial/aim-questionnaire/debug":{"title":"$:/plugins/federatial/aim-questionnaire/debug","text":"\\define answers() =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus =0 =1 =2 =3 =4 =0plus\n\n!! Suggested Interventions\n\n[[Click here|$:/plugins/federatial/aim-questionnaire/Results/Suggestions]] to view the suggested interventions.\n\n!! Answer All Questions\n\nFor testing purposes, this button answers all questions with a random answer.\n\n<$button>\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}]\" counter=\"counter\">\n<$action-setfield $tiddler={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/Answer/]addsuffix[/]addsuffix<currentTiddler>] }}} $value={{{ [subfilter<answers>nth<counter>] }}}/>\n</$list>\n<$list filter=\"1 3 7 12 32 42\">\n<$list filter=\"[tag{$:/config/federatial/aim-questionnaire/aim-question-tag}field:number<currentTiddler>]\">\n<$action-setfield $tiddler={{{ [{$:/status/UserName}addprefix[$:/temp/AIM/KeyAnswer/]addsuffix[/]addsuffix<currentTiddler>] }}} $value=\"yes\"/>\n</$list>\n</$list>\nAnswer all questions\n</$button>"},"$:/plugins/federatial/aim-questionnaire/readme":{"title":"$:/plugins/federatial/aim-questionnaire/readme","text":"! Introduction\n\n! Usage\n\nUse the following macro to display the questionnaire and results:\n\n```\n<<aim-questionnaire>>\n```\n\n! Translating the AIM Questionnaire\n\nTo translate the questionnaire into a different language:\n\n# Install the TiddlyWiki language plugin for the desired language, and note the language code (eg, Castellano Spanish is `es-ES`)\n# Clone the tiddler $:/plugins/federatial/aim-questionnaire/Language/en-GB\n# Replace the `en-GB` in the title with the language code (eg `es-ES`)\n# Edit the definitions in the tiddler to match the language\n#* Take care to keep the macro calls intact (eg `<<key-question-number>>`)\n# Choose the tag used to identify question tiddlers and enter it in the \"config\" tab of this plugin\n# Translate the English questions and answers into the target language\n#* Translate the titles of the tiddlers to the target language\n#* Add tags corresponding to the interventions suggested by each question\n# Use the \"language\" button in the sidebar \"Tools\" tab to switch to the target language to test the translation\n\n"}}}
\whitespace trim
\define print-button()
<$button tooltip="print" aria-label="print" class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-open-window" template="$:/plugins/federatial/print/window" windowTitle={{$:/config/plugins/federatial/print/window-title}}/>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/print-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text="print"/>
</span>
</$list>
</$button>
\end
<$list filter="[<currentTiddler>tagging[]role[heading]limit[1]]" variable="ignore" emptyMessage=<<print-button>>>
<$text text=""/>
</$list>
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.tc-export-controls {
background: #dfddf9;
margin: -1em -1em 0 -1em;
padding: 1em;
border-bottom: 2px solid black;
}
.tc-export-controls textarea {
width: 100%;
}
.tc-export-header {
margin-top: 1em;
padding: 1em;
border: 1px solid black;
}
@media print {
.tc-unprintable {
display: none;
}
}
<$transclude tiddler="$:/plugins/federatial/print/template/inner" mode="block"/>
! <$view field="title"/>
{{!!text}}
\whitespace trim
<$set name="themeTitle" value={{$:/view}}>
<$set name="tempCurrentTiddler" value=<<currentTiddler>>>
<$set name="currentTiddler" value={{$:/language}}>
<$set name="languageTitle" value={{!!name}}>
<$set name="currentTiddler" value=<<tempCurrentTiddler>>>
<$importvariables filter="[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]">
<div class="tc-unprintable tc-export-controls">
<$button message="tm-print" tooltip="Print this page">
Print
</$button>
</div>
<$transclude tiddler="$:/plugins/federatial/print/template" mode="block"/>
</$importvariables>
</$set>
</$set>
</$set>
</$set>
</$set>
!! This tiddler is present to disable the default login status pill that Xememex provides
{"tiddlers":{"$:/config/Comments/EnableFilter":{"title":"$:/config/Comments/EnableFilter","text":"[all[current]!is[system]]\n"},"$:/plugins/tiddlywiki/comments/above-story":{"title":"$:/plugins/tiddlywiki/comments/above-story","tags":"$:/tags/AboveStory","text":"<$reveal state=\"$:/config/Comments/EnableWikiComments\" type=\"match\" text=\"yes\" default=\"no\">\n\n<$tiddler tiddler=\"$:/SiteTitle\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n\n</$tiddler>\n\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/add-comment-button-actions":{"title":"$:/plugins/tiddlywiki/comments/add-comment-button-actions","text":"<$set name=\"username\" value={{$:/status/UserName}} emptyValue=\"(anonymous)\">\n<$set name=\"target\" filter=\"[<currentTiddler>]\">\n<$action-createtiddler $basetitle={{{ [[Comment by ']addsuffix<username>addsuffix[' on ']addsuffix<currentTiddler>addsuffix[']] }}} role=\"comment\" list=<<target>> text=\"\" edit-mode=\"yes\"/>\n</$set>\n</$set>\n"},"$:/plugins/tiddlywiki/comments/add-comment-button":{"title":"$:/plugins/tiddlywiki/comments/add-comment-button","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"div\" class=\"tc-comment-button\">\n<$button class=\"tc-btn-invisible\" actions={{$:/plugins/tiddlywiki/comments/add-comment-button-actions}}>\nadd comment {{$:/core/images/add-comment}}\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/comments-template":{"title":"$:/plugins/tiddlywiki/comments/comments-template","text":"<div class=\"tc-comments\">\n<ol class=\"tc-comment-list\">\n<$list filter=\"[all[tiddlers+shadows]role[comment]contains<currentTiddler>sort[created]!has[draft.of]]\">\n<li>\n<div class=\"tc-comment-entry\">\n<div class=\"tc-comment-entry-heading\">\n<$link>{{!!creator}} at <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DDD DDth MMM YYYY\"/></$link>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/CommentToolbarButton]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$list>\n</div>\n<div class=\"tc-comment-entry-body\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$edit-text tiddler=<<currentTiddler>> tag=\"textarea\" focus=\"true\"/>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"!!edit-mode\" text=\"yes\">\n<$transclude tiddler=<<currentTiddler>> mode=\"block\"/>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n</$reveal>\n</div>\n</div>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n</li>\n</$list>\n</ol>\n</div>\n"},"$:/plugins/tiddlywiki/comments/config":{"title":"$:/plugins/tiddlywiki/comments/config","text":"\\define select(description,filter)\n<$button>\n<$action-setfield $tiddler=\"$:/config/Comments/EnableFilter\" $value=<<__filter__>>/>\n$description$\n</$button>\n\\end\n\n! Wiki Comments\n\n<$checkbox tiddler=\"$:/config/Comments/EnableWikiComments\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Comments/EnableWikiComments\">Allow wiki-level comments as well as tiddler comments</$link> </$checkbox>\n\n! Tiddler Comments\n\nThis filter expression determines which tiddlers will have commenting enabled:\n\n<$edit-text tiddler=\"$:/config/Comments/EnableFilter\" tag=\"input\"/>\n\nOr you can choose a preselected filter:\n\n* <<select \"All tiddlers except system tiddlers\" \"[all[current]!is[system]]\">>\n* <<select \"Only tiddlers tagged 'commentable'\" \"[all[current]tag[commentable]]\">>\n* <<select \"Disable all commenting\" \"\">>\n"},"$:/plugins/tiddlywiki/comments/filter-all-comments":{"title":"$:/plugins/tiddlywiki/comments/filter-all-comments","tags":"$:/tags/Filter","filter":"[role[comment]!sort[modified]]","description":"All comments","text":""},"$:/plugins/tiddlywiki/comments/footer-view-template-segment":{"title":"$:/plugins/tiddlywiki/comments/footer-view-template-segment","tags":"$:/tags/ViewTemplate","list-after":"$:/core/ui/ViewTemplate/body","text":"<$list filter={{$:/config/Comments/EnableFilter}} variable=\"ignore\">\n<div class=\"tc-comments-segment\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/comments-template\" mode=\"inline\"/>\n</div>\n</$list>"},"$:/plugins/tiddlywiki/comments/header-view-template-segment":{"title":"$:/plugins/tiddlywiki/comments/header-view-template-segment","tags":"$:/tags/ViewTemplate","list-before":"$:/core/ui/ViewTemplate/body","text":"\\define display-original-comment()\n<$link><$text text=<<currentTiddler>>/></$link>\n\\end\n\n\\define find-original-comment(exclude)\n<$list filter=\"[<currentTiddler>role[comment]]\" emptyMessage=<<display-original-comment>> variable=\"ignore\">\n<$list filter=\"[list<currentTiddler>sort[title]] -[enlist<__exclude__>]\">\n<$set name=\"newExclude\" filter=\"[enlist<__exclude__>] [<currentTiddler>]\">\n<$macrocall $name=\"find-original-comment\" exclude=<<newExclude>>/>\n</$set>\n</$list>\n</$list>\n\\end\n\n<$list filter=\"[all[current]role[comment]]\" variable=\"ignore\">\n<div class=\"tc-is-comment-header\">\n<p>\nThis tiddler is a comment on\n<$list filter=\"[list<currentTiddler>sort[title]]\">\n<span class=\"tc-small-gap-right\"><<find-original-comment>></span>\n</$list>\n</p>\n<$list filter=\"[list<currentTiddler>role[comment]sort[title]limit[1]]\" variable=\"ignore\">\n<p>\nParent comments:\n</p>\n<ul>\n<$list filter=\"[list<currentTiddler>role[comment]sort[title]]\">\n<li>\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n</li>\n</$list>\n</ul>\n</$list>\n</div>\n</$list>\n"},"$:/plugins/tiddlywiki/comments/readme":{"title":"$:/plugins/tiddlywiki/comments/readme","text":"This plugin provides a simple means for adding threaded comments to tiddlers.\n\n* Click the \"add comment\" button to make a new comment, and then click the \"save\" button to save it\n* You can comment on a tiddler itself, or add a comment to an existing comment\n* The sidebar tab ''Comments'' lists a timeline of all comments\n* Comments are attributed to the username stored in the system tiddler [[$:/status/UserName]]\n* By default, comments are available on all non-system tiddlers. The ''config'' tab lets you customise which tiddlers can accept comments by specifying a filter extension\n* The buttons for adding and editing comments are only available if the system tiddler [[$:/status/IsReadOnly]] is not set to `yes`\n* Use the \"All comments\" option in the $:/AdvancedSearch ''Filter'' tab to see or export all comments\n\n!! Data Model\n\nThe data model employed by the comments plugin is very simple:\n\n* Comment tiddlers are identified by the `role` field being set to `comment`\n* The `list` field of comment tiddlers lists the tiddlers to which this comment applies\n** It is thus possible for a comment to be applied to multiple tiddlers at once\n** The links between comments can be preserved when renaming them by using the relink checkbox in the edit template\n* The `edit-mode` field of comment tiddlers is set to `yes` to display it in edit mode, or `no` to display it in view mode\n* The `saved-text` field is updated when switching to edit mode so that it can be restored if the user cancels\n\n"},"$:/plugins/tiddlywiki/comments/sidebar-segment":{"title":"$:/plugins/tiddlywiki/comments/sidebar-segment","tags":"$:/tags/SideBarSegment","list-after":"$:/core/ui/SideBarSegments/site-subtitle","text":"<$reveal state=\"$:/config/Comments/EnableWikiComments\" type=\"match\" text=\"yes\" default=\"no\">\n<$tiddler tiddler=\"$:/SiteTitle\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/comments/add-comment-button\" mode=\"inline\"/>\n</$tiddler>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/sidebar":{"title":"$:/plugins/tiddlywiki/comments/sidebar","tags":"$:/tags/SideBar","caption":"Comments","text":"<div class=\"tc-timeline\">\n<$list filter=\"[all[tiddlers+shadows]role[comment]has[modified]!sort[modified]eachday[modified]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"modified\" format=\"date\" template=\"DDth MMM YYYY\"/>\n<$list filter=\"[all[tiddlers+shadows]role[comment]sameday:modified{!!modified}!sort[modified]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link>Comment by '<$view field=\"modifier\">(anonymous)</$view>'</$link> on\n<$list filter=\"[list<currentTiddler>sort[title]]\">\n<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>\n</$list>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n"},"$:/plugins/tiddlywiki/comments/styles":{"title":"$:/plugins/tiddlywiki/comments/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-is-comment-header {\n\tpadding: 0.25em;\n\tborder: 2px solid <<colour message-foreground>>;\n\tborder-radius: 4px;\n\tbackground: <<colour message-background>>;\n}\n\n.tc-comments-segment {\n\tborder-top: 2px solid <<colour message-border>>;\n}\n\n.tc-comment-button button {\n\twidth: 100%;\n\ttext-align: right;\n}\n\n.tc-sidebar-scrollable .tc-comment-button button {\n\twidth: auto;\n\ttext-align: right;\n}\n\n.tc-comment-button button svg {\n\tfill: <<colour download-background>>;\n\theight: 2em;\n\twidth: 2em;\n}\n\n.tc-comments {\n}\n\n.tc-comment-list {\n\tlist-style: none;\n padding-left: 0;\n}\n\n.tc-comment-list .tc-comments {\n\tpadding-left: 1em;\n}\n\n.tc-comment-entry {\n\tposition: relative;\n\tborder: 2px solid <<colour message-border>>;\n\tborder-radius: 4px;\n\tmargin: 0.5em 0 0 0;\n\tbackground: <<colour message-background>>;\n}\n\n.tc-comment-entry-heading {\n\tfont-size: 0.7em;\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tbackground: <<colour message-background>>;\n\tcolor: <<colour message-foreground>>;\n\tpadding: 0 0.5em;\n}\n\n.tc-comment-entry-body {\n\tfont-size: 0.8em;\n\tpadding: 0 0.5em;\n}\n\n.tc-comment-entry-body textarea {\n\tfont-size: 1.1em;\n\twidth: 100%\n}\n"},"$:/tags/CommentToolbarButton":{"title":"$:/tags/CommentToolbarButton","list":"[[$:/plugins/tiddlywiki/comments/toolbar-button-cancel]] [[$:/plugins/tiddlywiki/comments/toolbar-button-delete]] [[$:/plugins/tiddlywiki/comments/toolbar-button-save]] [[$:/plugins/tiddlywiki/comments/toolbar-button-edit]]"},"$:/plugins/tiddlywiki/comments/toolbar-button-cancel":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-cancel","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"no\"/>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"text\" $value={{!!saved-text}}/>\ncancel\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-delete":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-delete","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-deletetiddler $tiddler=<<currentTiddler>>/>\ndelete\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-edit":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-edit","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"nomatch\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"yes\"/>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"saved-text\" $value={{!!text}}/>\nedit\n</$button>\n</$reveal>\n</$reveal>\n"},"$:/plugins/tiddlywiki/comments/toolbar-button-save":{"title":"$:/plugins/tiddlywiki/comments/toolbar-button-save","tags":"$:/tags/CommentToolbarButton","text":"<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"no\" default=\"no\" tag=\"span\">\n<$reveal type=\"match\" state=\"!!edit-mode\" text=\"yes\">\n<$button>\n<$action-setfield $tiddler=<<currentTiddler>> $field=\"edit-mode\" $value=\"no\"/>\nsave\n</$button>\n</$reveal>\n</$reveal>\n"}}}
<div class="tc-timeline">
<$list filter="[all[tiddlers+shadows]role[comment]has[modified]!sort[modified]eachday[modified]]">
<div class="tc-menu-list-item">
<$view field="modified" format="date" template="DDth MMM YYYY"/>
<$list filter="[all[tiddlers+shadows]role[comment]sameday:modified{!!modified}!sort[modified]]">
<div class="tc-menu-list-subitem">
<$link>Comment by '<$view field="modifier">(anonymous)</$view>'</$link> on
<$list filter="[list<currentTiddler>sort[title]]">
<$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link>
</$list>
</div>
</$list>
</div>
</$list>
</div>
{"tiddlers":{"$:/plugins/tiddlywiki/consent-banner/banner":{"title":"$:/plugins/tiddlywiki/consent-banner/banner","tags":"$:/tags/PageTemplate","text":"\\whitespace trim\n\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"match\" text=\"\" tag=\"div\">\n\n<div class=\"tc-consent-backdrop\">\n\n</div>\n\n<div class=\"tc-consent-banner tc-consent-banner-left\">\n\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" mode=\"block\"/>\n\n<div class=\"tc-consent-buttons\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ConsentBanner/Button]]\">\n\n<$transclude tiddler=<<currentTiddler>> mode=\"inline\"/>\n\n</$list>\n\n</div>\n\n</div>\n\n</$reveal>\n"},"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper":{"title":"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper","text":"\\define styles()\nwidth:$(width)$;height:$(height)$;\n\\end\n\n<div class=\"tc-blocked-embedded-content\" style=<<styles>>>\n<div class=\"tc-blocked-embedded-content-inner\">\n<div class=\"tc-blocked-embedded-content-inner-inner\">\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message\" mode=\"inline\"/>\n</div>\n</div>\n</div>\n"},"$:/plugins/tiddlywiki/consent-banner/buttons/accept":{"title":"$:/plugins/tiddlywiki/consent-banner/buttons/accept","tags":"$:/tags/ConsentBanner/Button","text":"<$button message=\"tm-consent-accept\" class=\"tc-consent-button tc-consent-button-default tc-btn-invisible\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}}\n</$button>\n"},"$:/plugins/tiddlywiki/consent-banner/buttons/decline":{"title":"$:/plugins/tiddlywiki/consent-banner/buttons/decline","tags":"$:/tags/ConsentBanner/Button","text":"<$button message=\"tm-consent-decline\" class=\"tc-consent-button tc-btn-invisible\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}}\n</$button>\n"},"$:/config/DefaultColourMappings/consent-banner-backdrop-background":{"title":"$:/config/DefaultColourMappings/consent-banner-backdrop-background","text":"rgba(0,0,0,0.2)"},"$:/config/DefaultColourMappings/consent-banner-background":{"title":"$:/config/DefaultColourMappings/consent-banner-background","text":"#009677"},"$:/config/DefaultColourMappings/consent-banner-button-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-background","text":"transparent"},"$:/config/DefaultColourMappings/consent-banner-button-border":{"title":"$:/config/DefaultColourMappings/consent-banner-button-border","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-default-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-default-background","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-default-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-default-foreground","text":"#009677"},"$:/config/DefaultColourMappings/consent-banner-button-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-foreground","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-background":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-background","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-border":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-border","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-button-hover-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-button-hover-foreground","text":"#009577"},"$:/config/DefaultColourMappings/consent-banner-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-foreground","text":"#fff"},"$:/config/DefaultColourMappings/consent-banner-hr-background":{"title":"$:/config/DefaultColourMappings/consent-banner-hr-background","text":"rgba(255,255,255,.25)"},"$:/config/DefaultColourMappings/consent-banner-link-foreground":{"title":"$:/config/DefaultColourMappings/consent-banner-link-foreground","text":"#fff"},"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content":{"title":"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content","text":"yes"},"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message","text":"Blocked embedded content from<br/><a href=<<url>> class=\"tc-tiddlylink-external\" target=\"_blank\" rel=\"noopener noreferrer\"><$text text=<<url>>/></a>\n\n<hr/>\n\n{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock"},"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message","text":"<div class=\"tc-blocked-embedded-content\" style=\"width:100%;\">\n\n<div class=\"tc-blocked-embedded-content-inner\">\n\n<div class=\"tc-blocked-embedded-content-inner-inner\">\n\nBlocked raw content\n\n<hr/>\n\n{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock\n\n</div>\n\n</div>\n\n</div>\n"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption","text":"Accept"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint","text":"Accept cookies"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption","text":"Clear"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint","text":"Clear cookies"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption","text":"Decline"},"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint":{"title":"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint","text":"Decline cookies"},"$:/config/cookie-consent-required":{"title":"$:/config/cookie-consent-required","text":"yes"},"$:/config/plugins/tiddlywiki/consent-banner/greeting-message":{"title":"$:/config/plugins/tiddlywiki/consent-banner/greeting-message","text":"! Our use of cookies\n\nWe use necessary cookies to make our site work. We’d also like to set optional analytics to help us improve it. We won’t set optional cookies unless you enable them. Using this tool will set a cookie on your device to remember your preferences.\n\n---\n\n!! Necessary cookies\n\nNecessary cookies enable core functionality such as security, network management, and accessibility. You may disable these by changing your browser settings, but this may affect how the website functions.\n\n---\n\n!! Analytics cookies\n\nWe’d like to set non-essential cookies, such as Google Analytics, to help us to improve our website by collecting and reporting information on how you use it. The cookies collect information in a way that does not directly identify anyone.\n\n---\n"},"$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content":{"title":"$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content","tags":"$:/tags/Macro","text":"<$set name=\"tv-block-embedded-content\" value={{{ [{$:/config/cookie-consent-required}else[no]match[yes]then{$:/state/consent-banner/accepted}!match[yes]then[yes]] }}}/>\n"},"$:/plugins/tiddlywiki/consent-banner/config":{"title":"$:/plugins/tiddlywiki/consent-banner/config","text":"! [[Greeting Message|$:/config/plugins/tiddlywiki/consent-banner/greeting-message]]\n\n<div style=\"\">\n\n<div style=\"display:inline-block;vertical-align:top;width:45%;\">\n\n<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" tag=\"textarea\" class=\"tc-edit-texteditor\"/>\n\n</div>\n\n<div style=\"display:inline-block;vertical-align:top;width:45%;margin:0.5em;border:1px solid black;padding:0.5em;\" class=\"tc-consent-banner\">\n\n<$transclude tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/greeting-message\" mode=\"block\"/>\n\n</div>\n\n</div>\n\n! Buttons\n\n|[[Accept caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption\" tag=\"input\"/> |\n|[[Accept hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint\" tag=\"input\"/> |\n|[[Decline caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption\" tag=\"input\"/> |\n|[[Decline hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint]] |<$edit-text tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint\" tag=\"input\"/> |\n\n! [[Consent Accepted Status|$:/state/consent-banner/accepted]]\n\nCurrent status: {{$:/state/consent-banner/accepted}} (blank indicates that consent has not yet been granted or declined)\n\n<$button message=\"tm-consent-accept\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}}\n</$button>\n\n<$button message=\"tm-consent-decline\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}}\n</$button>\n\n<$button message=\"tm-consent-clear\" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint}}>\n{{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption}}\n</$button>\n\n! Embedded Content Blocking\n\n//Requires page reload//\n\n<$checkbox tiddler=\"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> Block all embedded content such as <iframe>, <embed> and <object> unless consent has been granted</$checkbox>\n"},"$:/plugins/tiddlywiki/consent-banner/docs":{"title":"$:/plugins/tiddlywiki/consent-banner/docs","text":"! Features\n\nIf the same wiki is opened in multiple tabs then once the warning has been accepted or declined in one tab then the other tabs will autonatically follow suit.\n\nConsent is automatically granted if the user logged in (ie the tiddler [[$:/status/IsLoggedIn]] is set to `yes`).\n\n! Consent Banner Palette Entries\n\nAdd these entries to your current colour palette to change the colours used by the consent banner:\n\n* ''consent-banner-backdrop-background'' - the colour of the backdrop behind the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-backdrop-background}})\n* ''consent-banner-background'' - the background colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-background}})\n* ''consent-banner-button-background'' - the background colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-background}})\n* ''consent-banner-button-border'' - the border colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-border}})\n* ''consent-banner-button-default-background'' - the background colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-background}})\n* ''consent-banner-button-default-foreground'' - the foreground colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-foreground}})\n* ''consent-banner-button-foreground'' - the foreground colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-foreground}})\n* ''consent-banner-button-hover-background'' - the background colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-background}})\n* ''consent-banner-button-hover-border'' - the border colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-border}})\n* ''consent-banner-button-hover-foreground'' - the foreground colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-foreground}})\n* ''consent-banner-foreground'' - the foreground colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-foreground}})\n* ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}})\n* ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}})\n\n! Embedded Content Blocking\n\nUnless disabled via the config tab, content embedded via <iframe>, <embed> or <object> is blocked until the user consents to accept cookies.\n\n!! Implementation Details\n\nEmbedded content is blocked if the variable `tv-block-embedded-content` is set to `yes`. It is set to the current consent status by a [[global macro|$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content]]:\n\n<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content}}/>\n\n! ~YouTube macro\n\nA simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values:\n\n* ''empty or missing'' - the user has yet to accept or decline to give their consent\n* `yes` - the user has granted consent\n* `no` - the user has declined consent\n\n! Customising banner buttons\n\nThe [[\"accept\"|$:/plugins/tiddlywiki/consent-banner/buttons/accept]] and [[\"decline\"|$:/plugins/tiddlywiki/consent-banner/buttons/decline]] buttons in the banner are individual tiddlers with the tag [[$:/tags/ConsentBanner/Button]], allowing them to be customised and extended.\n\nA common use case is to add a \"login\" button allowing users to login directly to bypass the banner. This could be implemented as a tiddler tagged [[$:/tags/ConsentBanner/Button]] with the following text:\n\n```\n<$button message=\"tm-login\" class=\"tc-consent-button tc-btn-invisible\">\nLogin\n</$button>\n```\n\n! Integration with other plugins\n\nThird party plugins that set cookies can configure themselves to defer setting cookies until the user grants consent. There are several parts to this mechanism:\n\n* The consent-banner plugin includes a shadow tiddler [[$:/config/cookie-consent-required]] with the text `yes`. The third-party plugin should inspect this tiddler at startup; if it is not set to \"yes\" then it can proceed to set tiddlers immediately\n* Otherwise, the third-party plugin should listen for changes to the tiddler [[$:/state/consent-banner/accepted]] and only start setting cookies when and if the value changes to \"yes\"\n\nThe [[Google Analytics plugin|https://github.com/TiddlyWiki/TiddlyWiki5/tree/master/plugins/tiddlywiki/googleanalytics]] shows an example of how this mechanism can be implemented.\n"},"$:/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\nAn override of the raw widget that blocks raw content until the user has consented to accept cookies\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\tthis.blocked = this.getVariable(\"tv-block-embedded-content\",\"no\") === \"yes\";\n\tif(this.blocked) {\n\t\tthis.makeChildWidgets([{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message\"}\n\t\t\t}\n\t\t}]);\n\t\t// Render child widgets\n\t\tthis.renderChildren(parent,null);\n\t} else {\n\t\tvar div = this.document.createElement(\"div\");\n\t\tdiv.innerHTML=this.parseTreeNode.html;\n\t\tparent.insertBefore(div,nextSibling);\n\t\tthis.domNodes.push(div);\n\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\tif(this.blocked) {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.raw = RawWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/plugins/tiddlywiki/consent-banner/readme":{"title":"$:/plugins/tiddlywiki/consent-banner/readme","text":"The ''consent-banner'' plugin helps make websites that are compliant with \"cookie legislation\" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]].\nIt presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits.\n\nBy default, content embedded with <iframe>, <embed> and <object> is blocked unless the user consents to accept cookies.\n\nConsent status is available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies.\n\nPlease note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice.\n"},"$:/plugins/tiddlywiki/consent-banner/startup.js":{"title":"$:/plugins/tiddlywiki/consent-banner/startup.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/consent-banner/startup.js\ntype: application/javascript\nmodule-type: startup\n\nStartup initialisation\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 = \"consent-banner\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"render\"];\nexports.synchronous = true;\n\nvar CHECK_CONSENT_INTERVAL = 1000, // Milliseconds between checking local storage\n\tIS_LOGGED_IN_TITLE = \"$:/status/IsLoggedIn\",\n\tCONSENT_KEY = \"COOKIE_CONSENT\", // Local storage keyname\n\tCONSENT_TITLE = \"$:/state/consent-banner/accepted\", // \"\": undeclared, \"yes\": accepted, \"no\": declined\n\tCONFIG_BLOCK_EMBEDDED_CONTENT_TITLE = \"$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content\",\n\tEMBEDDED_MESSAGE_WRAPPER_TITLE = \"$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper\";\n\nexports.startup = function() { \n\tvar consentState = \"\",\n\t\tsetConsentStatus = function(state) {\n\t\t\tif(consentState !== state) {\n\t\t\t\tconsentState = state;\n\t\t\t\t// Write to local storage\n\t\t\t\twindow.localStorage.setItem(CONSENT_KEY,state);\n\t\t\t\t// Write to a state tiddler\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler({\n\t\t\t\t\ttitle: CONSENT_TITLE,\n\t\t\t\t\ttext: state\n\t\t\t\t}));\n\t\t\t}\n\t\t},\n\t\tcalculateConsentStatus = function() {\n\t\t\t// Consent is implied for logged in users, otherwise we check local storage\n\t\t\treturn ($tw.wiki.getTiddlerText(IS_LOGGED_IN_TITLE) === \"yes\" && \"yes\") || window.localStorage.getItem(CONSENT_KEY) || \"\";\n\t\t},\n\t\tcheckConsentStatus = function() {\n\t\t\tsetConsentStatus(calculateConsentStatus());\n\t\t\tif(consentState === \"\") {\n\t\t\t\tpollConsentStatus();\n\t\t\t}\n\t\t},\n\t\tpollConsentStatus = function() {\n\t\t\tsetTimeout(checkConsentStatus,CHECK_CONSENT_INTERVAL);\n\t\t};\n\t// Set the current consent status\n\tcheckConsentStatus();\n\t// Listen for consent messages\n\t$tw.rootWidget.addEventListener(\"tm-consent-accept\",function(event) {\n\t\tsetConsentStatus(\"yes\");\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-consent-decline\",function(event) {\n\t\tsetConsentStatus(\"no\");\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-consent-clear\",function(event) {\n\t\tsetConsentStatus(\"\");\n\t});\n\t// Add our element rendering hook\n\tif($tw.wiki.getTiddlerText(CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE,\"no\") === \"yes\") {\n\t\t$tw.hooks.addHook(\"th-rendering-element\",function(parseTreeNodes,widget) {\n\t\t\tif(parseTreeNodes) {\n\t\t\t\treturn parseTreeNodes;\n\t\t\t}\n\t\t\tif([\"iframe\",\"object\",\"embed\"].indexOf(widget.tag) !== -1 && widget.getVariable(\"tv-block-embedded-content\",\"no\") === \"yes\") {\n\t\t\t\tvar url = widget.getAttribute(\"src\"),\n\t\t\t\t\taddUnitsIfMissing = function(str) {\n\t\t\t\t\t\tstr = \"\" + str;\n\t\t\t\t\t\treturn str + ((\"\" + parseInt(str,10)) === str ? \"px\" : \"\");\n\t\t\t\t\t},\n\t\t\t\t\twidth = addUnitsIfMissing(widget.getAttribute(\"width\",\"\")),\n\t\t\t\t\theight = addUnitsIfMissing(widget.getAttribute(\"height\",\"\"));\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"vars\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\turl: {type: \"string\", value: url},\n\t\t\t\t\t\t\twidth: {type: \"string\", value: width},\n\t\t\t\t\t\t\theight: {type: \"string\", value: height}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"transclude\",\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\ttiddler: {type: \"string\", value: EMBEDDED_MESSAGE_WRAPPER_TITLE},\n\t\t\t\t\t\t\t\t\tmode: {type: \"string\", value: \"inline\"}\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\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/tiddlywiki/consent-banner/styles":{"title":"$:/plugins/tiddlywiki/consent-banner/styles","tags":"$:/tags/Stylesheet","text":".tc-consent-backdrop {\n\tz-index: 1999;\n\tposition: fixed;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: <<colour consent-banner-backdrop-background>>;\n}\n\n.tc-consent-banner-left {\n\tz-index: 2000;\n\tposition: fixed;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\tmax-width: 500px;\n\toverflow-y: auto;\n}\n\n.tc-consent-banner {\n\tpadding: 1em;\n\tbackground: <<colour consent-banner-background>>;\n\tcolor: <<colour consent-banner-foreground>>;\n\tbox-shadow: 0 0 20px rgba(0,0,0,.2);\n}\n\n.tc-consent-banner a.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour consent-banner-link-foreground>>;\n\tbackground-color: inherit;\n}\n\n.tc-consent-banner a.tc-tiddlylink-external:visited {\n\tcolor: <<colour consent-banner-link-foreground>>;\n\tbackground-color: inherit;\n}\n\n.tc-consent-banner hr {\n\tclear: both;\n\tpadding: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-align: left;\n\tborder: 0 none;\n\tmargin: 24px 0;\n\theight: 1px;\n\tmax-height: 1px;\n\tbackground: <<colour consent-banner-hr-background>>;\n}\n\n.tc-consent-buttons {\n\t\n}\n\n.tc-consent-banner .tc-consent-button {\n\tmargin-right: 1em;\n}\n\n.tc-consent-button {\n\tborder: 1px solid <<colour consent-banner-button-border>>;\n\tmargin-top: 1em;\n\tpadding: 0.75em 1.5em;\n\tcolor: <<colour consent-banner-button-foreground>>;\n\tbackground: <<colour consent-banner-button-background>>;\n\tfont-weight: bold;\n}\n\n.tc-consent-button:hover {\n\tcolor: <<colour consent-banner-button-hover-foreground>>;\n\tborder-color: <<colour consent-banner-button-hover-border>>;\n\tbackground: <<colour consent-banner-button-hover-background>>;\n\topacity: .6;\n}\n\n.tc-consent-button-default {\n\tcolor: <<colour consent-banner-button-default-foreground>>;\n\tbackground: <<colour consent-banner-button-default-background>>;\n}\n\n.tc-blocked-embedded-content {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tcolor: <<colour background>>;\n\tbackground: <<colour muted-foreground>>;\n\tborder: 1px solid <<colour foreground>>;\n\t<<box-shadow \"inset 0 0 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-blocked-embedded-content-inner {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n}\n\n.tc-blocked-embedded-content-inner-inner {\n\tdisplay: inline-block;\n\ttext-align: center;\n}\n\n.tc-blocked-embedded-content-inner-inner hr {\n background: <<colour foreground>>;\n height: 1px;\n width: 80%;\n border: none;\n}\n"},"$:/plugins/tiddlywiki/consent-banner/youtube":{"title":"$:/plugins/tiddlywiki/consent-banner/youtube","tags":"$:/tags/Macro","text":"\\define embed-video-with-consent(code)\n<$set name=\"tv-block-embedded-content\" value=\"no\">\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"match\" text=\"yes\" tag=\"div\">\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/$code$\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n</$reveal>\n<$reveal state=\"$:/state/consent-banner/accepted\" type=\"nomatch\" text=\"yes\" tag=\"div\">\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/$code$\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n</$reveal>\n</$set>\n\\end\n\n! Macro source\n\n<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/youtube}}/>\n\n! Example\n\n<<embed-video-with-consent KtCUr83XgyE>>\n"}}}
{"tiddlers":{"$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js":{"title":"$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/googleanalytics/googleanalytics.js\ntype: application/javascript\nmodule-type: startup\n\nRuns Google Analytics with the measurement ID in the tiddler `$:/GoogleAnalyticsMeasurementID`\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 = \"google-analytics\";\nexports.platforms = [\"browser\"];\nexports.synchronous = true;\n\nvar CONFIG_CONSENT_REQUIRED_TITLE = \"$:/config/cookie-consent-required\", // \"yes\" or \"no\" (the default)\n\tCONSENT_TITLE = \"$:/state/consent-banner/accepted\"; // \"\": undeclared, \"yes\": accepted, \"no\": declined\n\nexports.startup = function() {\n\tvar hasInitialised = false,\n\t\tinitialiseGoogleAnalytics = function() {\n\t\t\tconsole.log(\"Initialising Google Analytics\");\n\t\t\thasInitialised = true;\n\t\t\tvar gaMeasurementID = $tw.wiki.getTiddlerText(\"$:/GoogleAnalyticsMeasurementID\",\"\").replace(/\\n/g,\"\");\n\t\t\tvar url =\"https://www.googletagmanager.com/gtag/js?id=\" + gaMeasurementID;\n\t\t\twindow.dataLayer = window.dataLayer || [];\n\t\t\twindow.gtag = function() { window.dataLayer?.push(arguments); };\n\t\t\twindow.gtag(\"js\",new Date());\n\t\t\twindow.gtag(\"config\",gaMeasurementID);\n\t\t\tconst scriptElement = window.document.createElement(\"script\");\n\t\t\tscriptElement.async = true;\n\t\t\tscriptElement.src = url;\n\t\t\twindow.document.head.appendChild(scriptElement);\n\t\t};\n\t// Initialise now if consent isn't required\n\tif($tw.wiki.getTiddlerText(CONFIG_CONSENT_REQUIRED_TITLE) !== \"yes\") {\n\t\tinitialiseGoogleAnalytics();\n\t} else {\n\t\t// Or has been granted already\n\t\tif($tw.wiki.getTiddlerText(CONSENT_TITLE) === \"yes\") {\n\t\t\tinitialiseGoogleAnalytics();\n\t\t} else {\n\t\t\t// Or when our config tiddler changes\n\t\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t\tif(changes[CONSENT_TITLE]) {\n\t\t\t\t\tif(!hasInitialised && $tw.wiki.getTiddlerText(CONSENT_TITLE) === \"yes\") {\n\t\t\t\t\t\tinitialiseGoogleAnalytics();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n\n\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/tiddlywiki/googleanalytics/readme":{"title":"$:/plugins/tiddlywiki/googleanalytics/readme","text":"This plugin enables you to use Google Analytics to track access to your online TiddlyWiki document.\n\nBy default, the user is not asked for permission before initialising Google Analytics. This plugin also optionally integrates with the \"Consent Banner\" plugin (also found in the official plugin library) so that Google Analytics is not initialised until the user grants explicit permission.\n\n[[Source code|https://github.com/TiddlyWiki/TiddlyWiki5/blob/master/plugins/tiddlywiki/googleanalytics]]\n"},"$:/plugins/tiddlywiki/googleanalytics/settings":{"title":"$:/plugins/tiddlywiki/googleanalytics/settings","text":"''[[Google Analytics Measurement ID|$:/GoogleAnalyticsMeasurementID]]'': (mandatory) a code of the form `G-XXXXXXXXXX` where X are digits or uppercase letters<br/><$edit-text tiddler=\"$:/GoogleAnalyticsMeasurementID\" default=\"\" tag=\"input\"/>\n\n"},"$:/plugins/tiddlywiki/googleanalytics/usage":{"title":"$:/plugins/tiddlywiki/googleanalytics/usage","text":"!! Create a Google Analytics account\n\nIf you don't already have an account:\n\n# Go to the Google Analytics website: http://www.google.com/analytics/\n# Click the ''Access Google Analytics'' button and follow instructions to set up your account\n# Enter the URL where the wiki is hosted\n# Note the Tracking ID for this domain of the form `G-XXXXXXXXXX`\n\n!! Install the plugin on your local copy of the TiddlyWiki\n\n# ''Backup your TiddlyWiki''. Just in case\n# Install the plugin via the plugin manager in control panel\n# Save the TiddlyWiki andrefresh the page to load the plugin\n# Go to [[$:/ControlPanel]] > Plugins tab and unfold the Google Analytics Plugin\n# Go to the //settings// tab and edit the parameters\n# Save the TiddlyWiki\n\n!! Upload the new version of your TiddlyWiki\n\n# Upload the saved TiddlyWiki to Tiddlyhost, GitHub, GitLab or other web host\n# Return to your Google Analytics page to check that your site is being tracked\n"}}}
{"tiddlers":{"$:/config/DefaultColourMappings/menubar-foreground":{"title":"$:/config/DefaultColourMappings/menubar-foreground","text":"#fff"},"$:/config/DefaultColourMappings/menubar-background":{"title":"$:/config/DefaultColourMappings/menubar-background","text":"#5778d8"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols","text":"hide"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server","text":"hide"},"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar":{"title":"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar","text":"hide"},"$:/config/plugins/menubar/TableOfContents/Tag":{"title":"$:/config/plugins/menubar/TableOfContents/Tag","text":"TableOfContents"},"$:/config/plugins/menubar/breakpoint":{"title":"$:/config/plugins/menubar/breakpoint","text":"620px"},"$:/plugins/tiddlywiki/menubar/config":{"title":"$:/plugins/tiddlywiki/menubar/config","tags":"$:/tags/ControlPanel/Toolbars","caption":"Menu Bar","text":"\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\n\n! Menu Bar Configuration\n\n!! Menu Items\n\nSelect which menu items will be shown. You can also drag items to reorder them.\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/MenuBar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n\n!! Breakpoint Position\n\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/breakpoint\" default=\"\" tag=\"input\"/>\n\n!! Contents Tag\n\nThe tag for the ~TableOfContents used in the Contents dropdown\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/TableOfContents/Tag\" default=\"\" tag=\"input\"/>\n\n!! Menu Bar Colours\n\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\n"},"$:/plugins/tiddlywiki/menubar/items/contents":{"title":"$:/plugins/tiddlywiki/menubar/items/contents","caption":"Contents","description":"Table of Contents","is-dropdown":"yes","tags":"$:/tags/MenuBar","text":"<div class=\"tc-table-of-contents\">\n\n<$macrocall $name=\"toc-selective-expandable\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\n\n</div>\n"},"$:/plugins/tiddlywiki/menubar/items/hamburger":{"title":"$:/plugins/tiddlywiki/menubar/items/hamburger","tags":"$:/tags/MenuBar","caption":"Hamburger","description":"Show the full menu bar on a narrow screen","custom-menu-content":"{{$:/plugins/tiddlywiki/menubar/items/hamburger}}","show-when":"narrow","text":"<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"yes\">\n{{$:/core/images/menu-button}}\n</$button>\n</$list>\n<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"no\">\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/pagecontrols":{"title":"$:/plugins/tiddlywiki/menubar/items/pagecontrols","tags":"$:/tags/MenuBar","description":"Page controls from the sidebar","caption":"Page controls","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\" mode=\"inline\"/>","text":"\\whitespace trim\n\\define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\t<$set name=\"hidden\" value=<<config-title>>>\n\t\t<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n\t\t\t<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t</$set>\n\t\t</$list>\n\t</$set>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/search":{"title":"$:/plugins/tiddlywiki/menubar/items/search","custom-menu-content":"{{$:/plugins/tiddlywiki/menubar/items/search}}","description":"Search","caption":"Search","tags":"$:/tags/MenuBar","text":"\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<__storeTitle__>get[text]] }}}>\n<$list filter=\"[<__tiddler__>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]\"/>\"\"\">\n<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\whitespace trim\n<$vars searchTiddler=\"$:/temp/menubarsearch/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<span style=\"margin: 0 0.5em;\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<form class=\"tc-form-inline\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/menubarsearch\" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> \n\t\trefreshTitle=\"$:/temp/menubarsearch/refresh\" tag=\"input\" type=\"search\" focusPopup=\"$:/state/popup/menubar-search-dropdown\" \n\t\tclass=\"tc-popup-handle tc-menu-show-when-wide\" placeholder=\"Search...\" default=\"\" cancelPopups=\"yes\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> inputCancelActions=<<cancel-search-actions>> \n\t\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</form>\n</$keyboard>\n</$keyboard>\n</span>\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/state/popup/menubar-search-dropdown\" type=\"nomatch\" text=\"\" default=\"\">\n\n<div class=\"tc-block-dropdown tc-search-drop-down\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">Type your search terms</div>\"\"\" variable=\"ignore\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [<searchTiddler>get[text]] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$list>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n</$vars>\n"},"$:/plugins/tiddlywiki/menubar/items/server":{"title":"$:/plugins/tiddlywiki/menubar/items/server","tags":"$:/tags/MenuBar","description":"Server options","caption":"Server","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/server\" mode=\"inline\"/>","text":"<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\" variable=\"ignore\">\n<$transclude tiddler=\"$:/core/ui/Buttons/save-wiki\" mode=\"inline\"/>\n</$list>\n<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\" variable=\"ignore\">\n<$button message=\"tm-login\">\nLogin\n</$button>\n</$list>\n"},"$:/plugins/tiddlywiki/menubar/items/sidebar":{"title":"$:/plugins/tiddlywiki/menubar/items/sidebar","caption":"Sidebar","description":"Sidebar","is-dropdown":"yes","tags":"$:/tags/MenuBar","text":"<$scrollable fallthrough=\"none\" class=\"tc-popup-keep tc-menubar-dropdown-sidebar\">\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\" mode=\"inline\"/>\n\n</$scrollable>\n"},"$:/plugins/tiddlywiki/menubar/items/topleftbar":{"title":"$:/plugins/tiddlywiki/menubar/items/topleftbar","tags":"$:/tags/MenuBar","description":"Items from $:/tags/TopLeftBar","caption":"Legacy Top Left Bar","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/topleftbar\" mode=\"inline\"/>","text":"<$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>"},"$:/plugins/tiddlywiki/menubar/items/toprightbar":{"title":"$:/plugins/tiddlywiki/menubar/items/toprightbar","tags":"$:/tags/MenuBar","description":"Items from $:/tags/TopRightBar","caption":"Legacy Top Right Bar","custom-menu-content":"<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/toprightbar\" mode=\"inline\"/>","custom-menu-styles-wide":"float: right;","text":"<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"},"$:/plugins/tiddlywiki/menubar/menu":{"title":"$:/plugins/tiddlywiki/menubar/menu","tags":"$:/tags/PageTemplate","text":"\\define menubar-inner(size)\n<ul class=\"tc-menubar-list\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$list filter=\"[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\" variable=\"ignore\">\n<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\n<$list filter=\"[<currentTiddler>!is-dropdown[yes]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Dropdown -->\n\t<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n\t<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n\t<$button popup=<<dropdown-state>> selectedClass=\"tc-selected\">\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t<$text text=\" \"/>\n\t<span class=\"tc-menubar-dropdown-arrow\">\n\t<$transclude tiddler=\"$:/core/images/down-arrow\" mode=\"inline\"/>\n\t</span>\n\t</$set>\n\t</$button>\n\t</$set>\n\t</$set>\n\"\"\">\n<$list filter=\"[<currentTiddler>has[custom-menu-content]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Link -->\n\t<$link to={{!!target}}>\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t</$set>\n\t</$link>\n\"\"\">\n<!-- Custom content -->\n<$transclude field=\"custom-menu-content\" mode=\"inline\"/>\n</$list>\n</$list>\n</li>\n</$list>\n</$list>\n</$list>\n</ul>\n\\end\n\n<$list filter=\"[<tv-config-static>!match[yes]]\" variable=\"ignore\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\" variable=\"listItem\">\n<nav class=\"tc-menubar tc-adjust-top-of-scroll\">\n<div class=\"tc-menubar-narrow\">\n<<menubar-inner narrow>>\n</div>\n<div class=\"tc-menubar-wide\">\n<<menubar-inner wide>>\n</div>\n<div style=\"clear:both;\"/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n<$reveal type=\"popup\" state=<<dropdown-state>> position={{{ [<currentTiddler>get[dropdown-position]else[below]] }}} class={{{ [<currentTiddler>get[class]] }}} tag=\"div\">\n<div class=\"tc-drop-down\">\n<$transclude/>\n</div>\n</$reveal>\n</$set>\n</$set>\n</$list>\n</$list>\n</nav>\n</$list>\n</$list>\n"},"$:/core/ui/PageTemplate/topleftbar":{"title":"$:/core/ui/PageTemplate/topleftbar","text":"<!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->"},"$:/core/ui/PageTemplate/toprightbar":{"title":"$:/core/ui/PageTemplate/toprightbar","text":"<!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->"},"$:/plugins/tiddlywiki/menubar/readme":{"title":"$:/plugins/tiddlywiki/menubar/readme","text":"!! Introduction\n\nThis plugin provides a menu bar with the following features:\n\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\n* Menu items can be individually enabled via the control panel\n* Responds to reduced screen width by abbreviating the menu items to a \"hamburger\" dropdown\n\n!! Menu Item Tiddlers\n\nMenu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by this plugin:\n\n|!Field Name |!Purpose |\n|title |Each menu item must have a unique title (not shown to the user) |\n|description |Description for use in listings |\n|tags |Must contain `$:/tags/MenuBar` |\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\n|target |For simple link menu items specifies a tiddler title as the target of the link |\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\n|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') |\n|text |For dropdown menu items, specifies the body of the dropdown |\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\n\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\n\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\n"},"$:/plugins/tiddlywiki/menubar/styles":{"title":"$:/plugins/tiddlywiki/menubar/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\define breakpoint-plus-one()\n<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\n\\end\n\n\\define set-sidebar-scrollable-top-if-hamburger()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n\\end\n\n\\define set-sidebar-scrollable-top()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n<$reveal state=\"$:/state/popup/menubar/hamburger\" type=\"match\" text=\"yes\">\n\n\t<$set name=\"itemCount\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\n\n\t\t.tc-sidebar-scrollable {\n\t\t\tmargin-top: calc(<<itemCount>> * 2em);\n\t\t}\n\n\t</$set>\n\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\nnav.tc-menubar {\n\tposition: fixed;\n\tz-index: 850;\n\tdisplay: inline-block;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\nnav.tc-menubar ul.tc-menubar-list {\n\tposition: relative;\n\tlist-style-type: none;\n\tmargin: 0;\n\tpadding: 0 0 0 42px;\n\tbackground: <<colour background>>;\n\tbackground: <<colour menubar-background>>;\n\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\thtml nav.tc-menubar ul.tc-menubar-list {\n\t\tpadding: 0 0 0 8px;\n\t}\n\n}\n\nnav.tc-menubar li.tc-menubar-item {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\n\tdisplay: block;\n}\n\nnav.tc-menubar li.tc-menubar-item > a,\nnav.tc-menubar li.tc-menubar-item > button {\n\tdisplay: inline-block;\n/*\ttext-transform: uppercase; */\n\tline-height: 1;\n\tfont-weight: 700;\n\tcolor: <<colour foreground>>;\n\tcolor: <<colour menubar-foreground>>;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n\ttext-decoration: none;\n\tpadding: 0.5em;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item svg {\n\ttransition: none;\n\twidth: 1em;\n\theight: 1em;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n}\n\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:hover,\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\nnav.tc-menubar li.tc-menubar-item > button:hover {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:active,\nnav.tc-menubar li.tc-menubar-item > button:active svg,\nnav.tc-menubar li.tc-menubar-item > button:active {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down,\nnav.tc-menubar .tc-block-dropdown {\n\tmax-width: 70vw;\n\tmax-height: 70vh;\n\toverflow: auto;\n}\n\nnav.tc-menubar .tc-drop-down a {\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\n\tdisplay: inline-block;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-drop-down ol {\n\tmargin: 0;\n}\n\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\n\tdisplay: inline;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t.tc-menubar-wide {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (min-width: <<breakpoint-plus-one>>) {\n\n\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\n\t.tc-menubar-narrow {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t<<set-sidebar-scrollable-top-if-hamburger>>\n\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t<<set-sidebar-scrollable-top>>\n\n}\n@media print {\n\n\tnav.tc-menubar {\n\t\tdisplay: none;\n\t}\n\n}\n"},"$:/tags/MenuBar":{"title":"$:/tags/MenuBar","list":"$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar"}}}
<$button class="tc-btn-invisible">
<$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}>
<$action-sendmessage $message="tm-download-file" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>
</$wikify>
{{$:/core/images/download-button}} Download offline version
</$button>
.lizTable tr td:nth-child(2){
width:10%; background-color: white;
}
.lizTable tr:nth-child(1){
height:60px; background-color: aliceblue;
}
.lizTable{
border: none;
}
.lizTable tr td{
border: none;
}
.lizTable tr td:nth-child(1){
width:40%;
}
.lizTable tr td:nth-child(3){
width:40%;
}
.lizTable tr:nth-child(2)
{
background-color:white;
color:transparent; height:30px;
}
$:/themes/tiddlywiki/snowwhite
Create a drop-down list of all recent : <<tag [[(a) Work in Progress - Major change]]>>
* ''We do not track extremely minor content changes'', such as fixing broken links, correcting typos, or improving the layout - members of the [[AMBIT Editorial Group]] work independently on these "housekeeping" tasks.
* ''Major changes'' require more "sign-off" than ''Minor changes''
!!(a) Work in Progress - Major change
This is used to [[tag|Tags]] changes flowing from group discussions in the [[AMBIT Editorial Group]] and in order to be posted in the AMBIT manual they require a minimum of three members to agree, but to be properly accepted they require sign off from at the very least the significantly more for the highest level changes proposed.
The highest level of major changes mark a response to new evidence drawn from wider theoretical/experimental advances. They generally mark a //significant change in direction// (the removal of one of the [[Specific interventions]], or addition of a new one, for instance; or a change to the [[Core Features of AMBIT]] represented in the [[AMBIT Wheel]].)
!!(b) Work in Progress - Minor change
This [[tags|Tags]] changes that are generally new pages that introduce some small element of new theory of practice, or which are formed to better elaborate an existing area, but which do not represent any kind of fundamental shift in direction or practice - but are rather "clarifications" or "embellishments" on existing content.
For example:
* The response to a local outcomes evaluation by a local AMBIT-influenced team that demonstrates wide applicability for other teams, but comes without the assurance of a randomized controlled trial.
* These changes are more likely to be smaller //components of practice//, or examples of stylistic approaches to a problem.
* The practice recommendation or "example" will be judged as marking a subtle shift in the direction of the "steer" that has previously been offered by the manual, although not one that - if all other things remaining unchanged - would be likely to have a significant impact on outcomes.
** For instance, the addition of video illustrating a technique for introducing the use of playing cards developed as a young persons' version of the [[AIM Cards]] - this (new) approach to the use of the cards (themselves an innovation from the AFC, building on the Clinician-rated [[AIM]]) was developed locally and evaluated locally in the AMASS team in Islington. It was agreed in the Editorial Group that this approach, while without formal validation evidence, was worth sharing as by doing so there may be scope for a formal validation exercise.)
Drop down list of all recent : <<tag [[(b) Work in Progress - Minor change]]>>
* ''We do not track extremely minor content changes'', such as fixing broken links, correcting typos, or improving the layout - members of the [[AMBIT Editorial Group]] work independently on these "housekeeping" tasks.
* ''Major changes'' require more "sign-off" than ''Minor changes''
!!(a) Work in Progress - Major change
This is used to [[tag|Tags]] changes flowing from group discussions in the [[AMBIT Editorial Group]] and in order to be posted in the AMBIT manual they require a minimum of three members to agree, but to be properly accepted they require sign off from at the very least the significantly more for the highest level changes proposed.
The highest level of major changes mark a response to new evidence drawn from wider theoretical/experimental advances. They generally mark a //significant change in direction// (the removal of one of the [[Specific interventions]], or addition of a new one, for instance; or a change to the [[Core Features of AMBIT]] represented in the [[AMBIT Wheel]].)
!!(b) Work in Progress - Minor change
This [[tags|Tags]] changes that are generally new pages that introduce some small element of new theory of practice, or which are formed to better elaborate an existing area, but which do not represent any kind of fundamental shift in direction or practice - but are rather "clarifications" or "embellishments" on existing content.
For example:
* The response to a local outcomes evaluation by a local AMBIT-influenced team that demonstrates wide applicability for other teams, but comes without the assurance of a randomized controlled trial.
* These changes are more likely to be smaller //components of practice//, or examples of stylistic approaches to a problem.
* The practice recommendation or "example" will be judged as marking a subtle shift in the direction of the "steer" that has previously been offered by the manual, although not one that - if all other things remaining unchanged - would be likely to have a significant impact on outcomes.
** For instance, the addition of video illustrating a technique for introducing the use of playing cards developed as a young persons' version of the [[AIM Cards]] - this (new) approach to the use of the cards (themselves an innovation from the AFC, building on the Clinician-rated [[AIM]] was developed locally and evaluated locally in the AMASS team in Islington. It was agreed in the Editorial Group that this approach, while without formal validation evidence, was worth sharing as by doing so there may be scope for a formal validation exercise.)
!Keeping assessment integrated:
''NB Section A below is the least necessary information gathering activity that a [[Key Worker]] will need to undertake in situations where an Education/Vocational Centre provision does //not// exist.''
The intention is always to integrate as much of the young person’s education/vocational realities into the overall treatment package to avoid the splitting that commonly exists between education and mental health services.
There is an [[Educational-Vocational Engagement Phase Flowchart]].
!SECTION A
''Preliminary information gathering and arrangements for attendance:''
!!!If young person is School Age (<16yrs):
(a) ''If attending school'':
Gather information from the YP and/or their family about their current education situation:
##Which school? Address? Phone number? Email address?
##What year?
##Name of tutor/head of year/SENCO?
##Position in relation to public examinations?
##Status of any course work/ deadlines missed or pending?
(b) ''If not attending school'':
##Who in the education service is, or should be, responsible for their education provision?
##Education Welfare Officer?
##Educational Psychologist involved?
##Learning mentor?
##Extend information by contacting relevant education professionals in the young person's school or college. Potentially the tutor, head of year, or SENCO (Special Educational Needs Cooordinator), in the first instance.
##Education history from records and teacher knowledge.
##Any Statement of Special Educational Needs?
###Current?
###In the past?
###Being applied for?
##Academic performance?
###Any pattern of deterioration?
##Knowledge about family circumstances? Any significant events/crises?
##Siblings/relatives in school?
##Peer group relationships? Friendship group? Isolation? History and any recent changes? Bullying? Drugs?
##Relationships with teaching staff?
##Relationships with ancillary staff?
##Public examination status?
##Course work situation, deadlines missed or pending?
##Other professionals or agencies known to be involved?
(d) ''School-age but not currently attending school:''
Information can be gathered from main school teachers, particularly the SENCO, as well as from Education Welfare Officers, Educational Psychologists, Learning Mentors or Connexions Personal Advisors (responsible for working with 13 to 19 year olds).
##How long out of school?
##Any legal action current or being contemplated?
## attempts to reengage YP in school? Who involved? What happened? Family participation/support?
##Current alternative education provision or attempt at provision?
##Other professionals or agencies known to be involved? Social Services, G.P.?
##Is there information about any previous exclusions and reports written for school governors?
!!!If above School Age:
##What educational level achieved?
###Exam results
###Basic literacy/numeracy skills
##Current employment status?
##Vocational Schemes, training, higher educational training?
##Aspirations regarding career and further educational opportunities?
!Engagement
Negotiation will need to take place between the [[Key Worker]] and the young person, to get to (or be brought to) the Education/Vocational Centre.
##See [[Motivational Work]]
##See [[Engagement techniques]] for further detail.
##If the initial information gathering/liaison exercise turns up a significant professional or family member for the young person, they may be persuaded to accompany the young person on the first one or two occasions to the Education/Vocational Centre.
!SECTION B
''Key tasks and activities during first two weeks of actual attendance.'' - see an [[Example timetable during engagement phase]]
(a) ''Educational Assessment''
Educational tasks and activities to be given to the young person during teaching sessions to complement information already obtained from teachers and other education professionals. Because of individual or small group context the information gained will be both current and potentially more detailed than may have been available before.
National Curriculum levels in Literacy and Numeracy could be obtained, as well as getting a basic Reading Age.
A whole range of educational or psychometric tests could be used as deemed necessary for more detailed assessment profile.
(b) ''Social Assessment''
This is carried out by observing the YP in a range of contexts and activities in the education centre.
**Relationship with peers - observed in formal, semi-structured and informal contexts.
**Formal - observation of relationships in small group tightly structured teaching situations
**Semi-structured - observation in less formal activities drama, art, cooking etc.
**Informal - observation in breaks and free time around the education centre.
**Relationships with authority figures - observations made in similar contexts to above and in addition, during one-to-one conversations.
**Relationship to learning - observations made in teaching situations.
It is important to note that much information that will contribute to both the educational and social assessment will be derived from the "routine" teaching context. Everything that the young person does during this assessment phase shouldn't look only like assessment.
(c) ''Family Assessment''
As appropriate, relevant family members will be encouraged to participate in elements of the education programme. This will provide opportunities to observe relationships between the young person and their family in a range of contexts not normally available either on home visits or in mainly structured family interviews. The contexts will be based on both individual family as well as multi family activities. The information obtained will be additional to that gained in regular family interviews.
(d) ''Individual Assessment''
The young person will be withdrawn from the education programme group for individual interviews as necessary.
!Intervention
As the educational assessment becomes completed there is an increased capacity to tailor the academic/vocational element of the programme more specifically to meet the needs of the young person.
There is an [[Education-Vocation Intervention phase - Example timetable and Flowchart]].
This may involve more public exam work or support for course work. Alternatively, it may become clear that more sophisticated teaching delivery is required in relation to a YP's specific learning difficulty. This may entail intensive literacy or numeracy input.
Equally, as the social assessment information becomes available, the individual and family targets and objectives will become clearer and the programme can be adjusted accordingly.
The basic structure of the sample timetable above will remain the same but with an increasing emphasis on making the necessary connections with the young person's future placement after leaving the Education/Vocational Centre. This may involve meetings with the school, further education college or work experience placement professionals. The Connexions Personal Advisers will be particularly useful in helping to facilitate this transition as they have the responsibility for working with young people to help them negotiate any of these moves.
The young person should reduce attendance at the Education/Vocational Centre to 3 sessions per week at some stage during the second phase. This is to support their reintegration back to school or their transition into college or work experience placement whilst they are still part of the Education/Vocational Centre programme and available to get the most support from it.
!Background to Referring Crisis
Sixteen year old Darren was referred to the team by his family and friends, who had become extremely anxious and frightened by his abnormal behaviour during the past six hours.
He was a member of the local youth theatre and was performing in a production they were putting on at a local theatre. He had turned up for the show late and clearly under the influence of cannabis and alcohol. He was in an agitated state but insisted that he was all right to go on. Very quickly it became clear that he was not fit to continue as he was standing on the stage staring blankly around him disrupting the whole performance. He resisted attempts to persuade him to leave and had to be physically carried off. He did not calm down and had to be restrained when he started to bang his head repeatedly against the dressing room wall. He said he could hear voices telling him to kill himself. His family was called but neither his mother nor father was willing to come. However, his younger brother turned up to take him home. It took the two youth theatre leaders, one of Darren's friends and his brother to chaperone him back to his house. When his condition continued to deteriorate into the night the KW was called.
Because Darren was so agitated and a danger to himself and threatening violence particularly to his brother, in consultation with the psychiatrist the Keyworker decided to medicate him.
!Education Liaison -
During the next three days whilst the KW was doing intense work with Darren and his family in the home, the Education/Vocational Centre teacher/therapist contacted the SENCO of his school. She found out that Darren had a long history of disaffection and truancy since his transfer from primary school. However when he was at school he had been very good at drama and music and was said to be a talented drummer. He had poor relationships with most of the school staff but was well liked by one drama teacher who had encouraged him to join the youth theatre. He was in the middle of his GCSE final year but was way behind in virtually all of his course work and was in danger of not being entered for any of his exams. He was said to have no real friends at school and was described as a loner and a bit of an "oddball". In contrast, the SENCO said that Darren's younger brother was a high achiever, sporty and popular. The SENCO had only met Darren's mother but had been alarmed by her highly critical manner of talking about him.
On the fourth day, the KW felt confident enough that Darren's condition had stabilised sufficiently for him to be brought to the Education/Vocational Centre.
!Education/Vocational Centre Attendance: Phase One
(See [[1. Educational-Vocational Engagement and Assessment]])
During the first two-week assessment period the following key observations were gathered:
*Educational Assessment
Darren was initially very reluctant to participate in any areas of the educational programme. However once he did start to engage it was possible to carry out a reading test which showed that he had a reading age of 9.5. This clearly showed why he would have difficulties accessing the secondary school curriculum. Further testing showed that he had some word recognition difficulties consistent with a mild form of dyslexia. His numeracy skills were average for his age. He talked about his liking for drama but mainly focused on his ambition to be a professional drummer.
*Social Assessment
At first he would only stay in the Education/Vocational Centre if the KW promised to stay with him. He would not join in any activities at all for the first three days but stayed on the fringes covertly observing what was going on. He was surly but not aggressive in his manner towards the staff. He kept his hood up during this phase.
In the break periods he was gradually encouraged to talk by one of the other young people in the group. After day four he slowly started to participate in the education programme. Once his hood came down it became increasingly easy to sustain a conversation with him for short periods.
He could not be taught in a group with anyone else because he would "wind up" others to the point that violence would either happen or be threatened.
After initial reluctance he would agree to be taught one-to-one and would be relatively co-operative. He would quickly become discouraged if he could not be successful with a piece of work straight away and would frequently tear something up if it was less than perfect in his eyes.
*Family Assessment
The KW persuaded Darren's mother to attend some of the multi family group meetings. She was consistently critical of him and blamed him for all the trouble that he had caused the family. Darren became totally withdrawn and silent during these meetings. His younger brother came to one meeting. He was also critical of Darren and complained about how embarrassed he felt about having an older brother who showed him up at school.
In the individual family meetings which were attended by all the family including Darren's father, it appeared that Darren's breakdown or illness had had the effect of bringing together what had formerly been a fairly disconnected family. Harshness, criticism and mutual blame characterised the family communication patterns.
*Individual Assessment
Darren engaged well with his individual therapy and talked about his feelings of being a failure and about his anger towards everybody in his family. He said that he had felt suicidal in the past but currently had no such thoughts. He said that he wanted to get his life together and make a career for himself as a drummer.
!Education/Vocational Centre Attendance: Phase Two
(See [[2. Educational-Vocational Intervention and Transition]])
A literacy programme was devised to specifically help Darren with his reading difficulties.
Through connections with the school SENCO curriculum relevant to his GCSE subjects was brought to the Education/Vocational Centre for Darren to do. He was helped to organise himself so that he would be able to take four of the GCSEs that it was still possible for him to enter. The SENCO also arranged for him to slowly reintegrate into the school first of all via the drama lessons but with a plan to increase as his confidence and self esteem improved.
In the [[MultiFamilyWork]] meetings other members of the group started to challenge Darren's mother about the amount of criticism that she aimed in his direction. She began to talk about her feelings of guilt and frustration and how she had felt unable to help Darren. She had always known he had more problems with his schoolwork than his brother but hadn't been able to get anybody to offer any help.
She and Darren created targets for each other; significantly, she would try to be less critical and he would try to stop winding up his brother.
In YP group meetings the others in the programme were able to see behind Darren's "loner presentation" and were able to help him to face up to his avoidance behaviour as well as supporting him in his feelings of anger about his family's lack of understanding and support.
Peer group relationships around the Education/Vocational Centre improved significantly as Darren reduced his winding up behaviour towards others.
The family meetings also focused on the negative ways that everybody related to each other. Cross-generational patterns were relevant for both Darren's mother and father. Strains in the marital relationship were discussed in separate couple sessions. Darren and his brother were able to resolve some of their jealousies and rivalries to a limited extent.
In his individual sessions Darren switched between more pragmatic work in relation to his fears about drug and alcohol misuse and deeper issues related to his feelings of hopelessness and inadequacy.
Through links with the youth theatre leaders, Darren was encouraged to take up drumming lessons with a local musician.
At the end of the three months he had returned to school part time, was not misusing alcohol or cannabis and reported that he had not heard any voices since soon after the initial crisis.
!What's here, and what's elsewhere?
!!!This page covers:
* 1. Creating new pages
* 2. Editing existing content
* 3. Adding tags
* 4. Adding links
* 5. Sharing your work
!!!Elsewhere:
* For a more ''basic guide'' see the [[User Guide]].
* For ''more detailed information'' about using the wiki-manuals that the [[Anna Freud National Centre for Children and Families]] use, including navigation and more complicated editing tasks (adding videos, recorded sound, formatting text to create headings, italics, bullet pint lists, etc, etc, etc), see the separate [[GUIDE FOR ANNA FREUD MANUALS|https://manuals.annafreud.org/guide/]].
!!Help:
If you get into any difficulties with the manual or just have a question about the manual, or can give us feedback (we LOVE feedback positive or negative) please contact ambit@annafreud.org
!!''1. Creating a New Page''
Once you are logged in, create a new page by clicking the + sign to the right of the homepage. The new page will open in its 'editing view', with boxes where you can add text for the ''title'' (by default it is titled "New Tiddler" because in this software pages are known as "Tiddlers"... don't ask!), [[Tags]], and ''content'' (which can be simple text, or can include pictures, videos, sound recordings):
[img[AddNewPagePic.jpg]]
!!''2. Edit an Existing Page''
Find the page you wish to edit, click the //‘pen icon’// and the page will open in the same format as when you create a new page.
[img[Edit 2.JPG]]
!!''3. Adding Tags''
[img[Edit 4.JPG]]
!!''4. Adding Links''
When editing or creating a new page, highlight a word or phrase that you wish to link, then click the ‘//link icon//’ (chain link) and search for the topic/page you wish to link this to. When selected, this will create a link from the chosen word or phrase to the relevant page.
[img[Edit 5.JPG]]
!! 5. Sharing your work (or any interesting content) with colleagues
{{ht.JPG}}
Create an instant address link ("URL") that you can email or text to colleagues - that will open a copy of the manual with specific chosen page(s) pre-opened.
* Get the page(s) you want to share opened in your manual.
* Use the crazy looking hashtag just above the search engine to copy the URL of all the current pages you have open to your clipboard.
{{URL.JPG}}
* Open your text or email programme, and 'paste' the URL address in, press send and share the link with your colleagues.
* This function means that you can direct your colleagues to specific pages, so if you wanted to share the page that was created at the last team meeting for everyone to review, or something that came up in supervision , etc, you can link them directly to that single page.
* ''This function effectively turns the whole manual into a big filing cabinet of individual shareable worksheets!''
-----
!!!Useful Links
* ''Basic guide'' to navigating/usage - [[User Guide]]
* ''More detailed guide'' (external link) for more detailed editing tips (formatting text, adding videos, pictures, PDFs, sound, etc): [[Anna Freud Manuals General Guide|https://manuals.annafreud.org/guide]])
* ''Advice to enthusiastic manualizers'' about [[Fitting what you ADD into what is ALREADY THERE in your manual]] (not reinventing too many wheels, or duplicating content)
This is a common example of a [[Training Challenge]] (a less off-putting term for 'homework') set in a [[Cognitive Behavioural]] approach.
''THE PURPOSE OF DIARY KEEPING IN CBT''
Sometimes diary keeping is carried out without being clear what the purpose of diary keeping is. As an approach CBT is concerned with trying to enable the young person to make changes in their daily life and is less focussed on changes that take place in the therapy itself. Diary keeping is a method of trying to connect the therapy sessions with real events in the young person's life. One of the ways that the young person's life is kept at a distance from the therapy is by the young person providng vague, general statements about themselves and the events of their week. For example atypical enquiry can go as follows. 'How are you?' 'Okay'. 'How has your week been? 'Okay'. 'Been out much?' 'A bit' 'Had any good days?' 'Not sure'. etc Such general evaluative statemetns are of little value in CBT. It can be similar when the statements are negative e.g 'How has your week been?' 'Shit'. The purpose of diary keeping is rarely to obtain a comprehensive picture of the whole week's events but more to locate one specific event that can then be explored in more detail as a way of getting these general statements.
Most young people find keeping a diary record of what happens during the week very hard to do. Do not be discouraged by this but be extremely practical about how to encourage young person to begin to keep very simple records of what has happened in between sessions.
''Start with a simple frequency diary''. This simply asks the young person to notice whether a certain thing happneded on a particular day. For example, having a row with a parent. Getting the young person to notice if this happened each day. In practice, at the following session, the young person may turn up without any record etc and you may need to go through the week asking for each day. What may be very helpful is to get interested in the days that NO ROWS took place.
Nowadays, young people can ''use mobile phones'' or other IT equipment to keep records of things. For some young people I have suggested they write a quick text message to themselves as a reminder of something that happened. There may be circumstances that it is appropriate to have an arrangement for the young person to text the therapist as a record keeping task. This can be excellent but needs to be set up with very clear task boundaries so that young people do not expect a therapist response to all such messages.
if you have suggested a diary task, it is ''CRUCIAL'' that you are very interested in what the young person has done around this at the following session. If you minimise or forget, you model the very behaviour which you are trying to change.
If the young person is able to do some frequency diary work, it may be possible to move on to doing more complex diary work using an ABC format (see below). This allows for a close analysis of the possible [[Reinforcement]] of particular behvaiours, and the design of new [[Contingencies]] that might help to //reduce// the reinforcement of undesired behaviours, and //increase// the reinforcement of desired behaviours. The purpose of this is twofold. Firstly, it may provide some ideas about how negative behaviours are being encouraged by their consequences. Secondly, it may help the young person to see 'patterns of interactions' rather than just being dominated by own feelings and thoughts.
*Ask the young person to keep a diary sheet, either simply recording daily drug/alcohol consumption (or any other behaviour that is targetted, such as self-injury) or, preferably, (as it gathers more information to work with) recording ''__A, B, C__'';
!A = Antecedents
What came ''just before'' the target behaviour (e.g. smoking the joint/the aggressive outburst/etc) - //"Where were you? Who else was there? What were you thinking? What do you remember feeling?/etc."// (It is easy to see that thinking about these things is getting close to [[Mentalizing]].)
!B = Behaviours
What ''actually happened''? (e.g. smoked 1, 2, 3 joints...)
!C = Consequences
What happened ''afterwards?'' Think of short term effects (fun? paranoia? fights? Police?) and longer term effects (parental arguments, trouble at school...) - see [[Weighing Pros and Cons]] for more ideas on this.
Attention Deficit Hyperactivity Disorder
This is a neurodevelopmental disorder - the common core features of ADHD are:
*Attention problems (distractibility, difficulty staying on task)
*Impulsivity (the opposite of looking before you leap)
*Hyperactivity (high levels of physical energy and movement - "like a motor always on the go")
!Comorbidities
ADHD is associated with a wide range of other difficulties (co-morbidities), including:
* [[Conduct problems]]
* Educational under-achievement
* Disorganisation
* Low self esteem
* [[SubstanceUseDisorder]]
* Family dysfunction
In adolescence (as opposed to younger childhood) it is not uncommon that the main difficulties expienced are related less to the "core deficits" (Attention, Activity, Impulse control) and more to the "satellite problems" that arise as co-morbidities.
!Treatment
Prescribing medication is the mainstay of treatment at earlier ages, alongside work with the family, school, and young person to help manage behaviours and associated mood problems. Treatment may take the form of ''controlled drugs'' such as methylphenidate (a "Stimulant" drug, that seems to preferentially stimulate the frontal area of the brain, boosting the "executive" part of the brain that controls decision-making, and reduces impulsivity. This treatment may be difficult at older ages. This is particularly so if it is those co-morbidities that are now the main problem, and in general starting treatment late is much less effective than starting it earlier in the life course, with a view to helping establish good peer and family relations, improved school performance, and better self esteem.
If [[SubstanceUseDisorder]] is a problem this makes use of the "stimulant" medications such as methylphenidate even more difficult, because of perceived risks of misuse of this medication (slow release preparations do reduce this risk, and there are non-stimulant alternatives, but these are still often insufficient to impact on other patterned behaviours that have begun to become ingrained.)
There are well researched and evidenced protocols for managing ADHD, in the UK these are provided in the [[NICE ADHD Guidelines]]
[[Anna Freud National Centre for Children and Families]]
!!!This page connects together all pages related to AIM
The AIM is a way of measuring client outcomes and evaluating outcomes
!!!AIM stands for 'AMBIT Integrative Measure'
!!!There are 2 different formats of the AIM, namely the AIM Questionnaire and the AIM Cards.
This can sometimes cause confusion so we think that it is helpful for workers to understand the differences between these two formats. The content of the two formats is the same but their format, purpose and use is different.
The following pages describe each of these aspects separately
!![[(i) The AIM questionnaire|The AIM Questionnaire: What it is and how to use it]]
*''The AIM questionnaire is completed by the worker from the __workers' perspective__''
*It provides a holistic measure of client functioning
*The AIM questionnaire measures: Daily life-function, socio-economic factors, family relationships, social relationships, mental state, clients' response to their situation, the complexity of the difficulties, and issues around power and control influencing a clients' life
*It can be used as a measure at the beginning and end of work with clients to track how the work has gone, whether the goals set have been met, and whether things have changed in a clients' life. At a service or team level it can provide a rich source of information about the clients that have been seen, and act as a resource for teams to learn about the work they do
*[[We have recently updated and revised the AIM questionnaire|AIM Questionnaire: Updates and revisions]]. This was done by the Anna Freud Centre team in 2021. It is now includes an ''additional 3 questions'' which cover issues related to experiences of ''discrimination, exploitation and online life''. These questions are categorised under a new subscale called 'power and control'. There have also been some minor wording changes to improve clarity
''There are 2 formats for completing the AIM questionnaire''
!!![[1. The AIM questionnaire - Interactive version|AIM questionnaire - interactive version]]
This version is completed online through this wiki manual. It scores the questionnaire automatically and provides a downloadable summary of results along with a list of suggested interventions based on the scoring output
!!![[2. The AIM questionnaire- paper version|AIM questionnaire - paper version]]
The paper version of the questionnaire can be downloaded and printed for completion
Please see below for a downloadable practitioner guide for the AIM questionnaire
[[Practitioner guide AIM questionnaire|AMBIT Integrative Measure (AIM) - a paper Guide for Practitioners (2).pdf]]
!![[(ii) The AIM cards|AIM Cards]]
*''The AIM cards'' are an AMBIT client tool and are ''used together with clients'' as a way of assessing, building relationships and developing an understanding of the client's needs from __the ''clients' own perspective''__. The AIM cards are used to explore and make explicit our clients' views and experiences
*They are a set of cards covering the same areas of functioning as the AIM questionnaire (the cards map onto each question in the AIM questionnaire) however they are worded in ways which we hope are accessible for clients
*There is an [[online version of the AIM cards|Using the online AIM Cards]]
*''The AIM cards differ from the AIM questionnaire which is rated by the worker from the workers' perspective''. For more on this see [[Difference between the AIM questionnaire and AIM cards|What is the difference between the AIM measure and AIM cards]]
Please see below for a downloadable practitioner guide for the AIM cards
[[Practitioner guide AIM cards|The AIM Cards - a Guide for Practitioners (1).pdf]]
!!Purpose
To explain what Key Problems are, as we define them in the [[AIM]], and how we use these to clarify what we will work on together with our client.
!!Definition
"Key Problems" refers to one of the scoring options in the [[AIM]]. The ''key problems'' give the option to mark a particular item in the AIM questionnaire as a "Key Problem". We then use these to help guide what we will address together with our client.
!!! Criteria for labelling a problem as a KEY PROBLEM
*Key problems are those that are the most important ones to change within the proposed period of contact, in order to allow meaningful improvements in this clients' life
*Key Problems must be amenable to CHANGE: problems that are NOT AMENABLE TO CHANGE should NOT be selected as Key Problems, for instance:
*Learning Disability
*Physical Disability
!!Collaboration with client
The AIM Questionnaire (see [[interactive version|AIM questionnaire - interactive version]] or [[paper version|AIM questionnaire - paper version]]) is carried out from the perspective of the worker. ''The key problems are recorded from the perspective of the worker.''
*However, it is essential that we agree together with our client the Key Problems which we will address together. It is important that Key Problems have meaning to the client/their family
*We accept that certain problems (for instance, a psychotic illness about which the young person has no insight, or an addiction that the young person is denying) will need to be negotiated, and we may see these differently to the client
*We invite workers to highlight and make explicit differences of opinion about what is or is not seen as a Key Problem. For example, to compare and contrast the workers' and clients' perspectives with the intention of thinking together about how these different perspectives have arisen (holding a [[mentalizing stance|General features of a "Mentalizing Stance"]])
* Workers can record the clients' view of the key problems from the AIM alongside their own perspective if they wish
*[[The AIM cards|AIM Cards]] are the AMBIT tool for exploring the clients' perspective on the key issues in their life. The AIM cards map directly on to the items in the AIM questionnaire
!!Limit the number of Key Problems
When filling in the [[AIM]], you must limit the number of Key problems to 6 or less, otherwise they lose their value as markers of the MOST pressing issues to address.
!!!Consultation
*The [[AIM]], where Key Problems are first defined, is a //Clinician/Practitioner-rated scale//, ''but the Key Problems which will be the focus of treatment should be agreed in consultation with:''
*Client
*Family members
*Other parts of the Professional Network (see [[Working with other professionals]])
*The Supervisory Structures that are in place
In establishing a shared plan about the focus of the work together AMBIT proposes the [[Active Planning |Active Planning]] stance. This addresses how as workers we attempt to hold a balance between both attuning to our clients' whilst making explicit our own perspectives and intentions.
''There may be times when as a worker our perspective on a key problems (and the perspective of others around the client) is very different to our clients' view, and that this does not change.''
For example,
*A client may deny that Drug use is a Key Problem, whilst family and others all say it is...
*A parent may deny that their own mental health problem is a Key Problem for the young person...
**In this case our plans and aims would need to address these DIFFERENT perspectives and hold a balance between both [[Managing Risk]] and[[ scaffolding relationships|Scaffolding existing relationships]]
The AIM cards are a client-rated version of the [[AIM]]. They are a set of 43 cards, representing the 43 [[AIM Items]]: 8 domains of a person's life and functioning.
This page covers:
*How to purchase packs of AIM cards
*Using the AIM cards online (free)
*Using the AIM cards as a tool to support [[Active Planning]]
*Using the AIM cards to measure outcomes
<center>{{AIM cards pic1.jpg}}</center>
!!How to purchase packs of AIM cards
You can purchase packs of AIM cards by [[emailing us|mailto:ambit@annafreud.org]]. You can pay electronically via the website, or by invoice.
!!Using the AIM cards online
You can also use a free online version of the AIM cards which can be used with clients remotely, as well as face to face.
Read our [[instructions on how to set up your AIM cards online|Online AIM Cards: how to set up a room to use with your client]]. You will need to download a small file to set up your cards for the first time, but once you've done that once you can create multiple AIM cards rooms for use with different clients.
Then watch this fantastic step-by-step video guide to using the cards with a young person; it was created by ''Lateesha Parkes'', an educational outreach worker from [[AMASS, in Islington|https://manuals.annafreud.org/ambit-amass/index.html]]:
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/VJe_r-fHLLo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!Using the AIM cards for Active Planning
The AIM cards are an example of applying the [[Active Planning]] triangle in practice.They are used to ''sensitively attune'' to the clients' perspectives, to ''broadcast our intentions'' as the worker, and to begin developing a focus or structure for work together. The AIM cards can be used as a [[ Goal Based Outcome measure|Goals-based outcome measures]] to develop and measure specific goals based on what matters most to the client.
>//This is an example of a page that has been ''cloned and customised'' from the original work by the ''AMASS team in Islington'' - to whom we are immensely grateful.//
The AMASS Team have developed a framework for using the AIM cards. Their suggested steps and learning points are set out below. Here we also highlight examples of the ''active planning triangle'' with the intention of showing how active planning may look in practice.
''Please note this framework can be adapted according to the client and service context''.
''When to use the AIM cards''
The AIM cards are usually used fairly early on in the contact with the client, as part of efforts to build a relationship. It is usually helpful that the client has met the worker at least once before using the cards. Exactly when they're used will vary according to the degree to which the worker thinks that the client would find it ok to share a bit about how things are with someone who they don't know/yet trust and the extent to which they are actively help-seeking.
It can be helpful to hold in mind that using the cards can help build [[Epistemic Trust]], if the worker takes care to reflect back what they are learning about the clients' perspective from completing the cards ''(sensitive attunement)''
Similarly, a client does not have to be actively or explicitly help-seeking in order for the cards to be used. In fact, it can be more helpful for the worker not to assume any help-seeking on the part of the client when using the cards, instead holding in mind that their first priority is to understand how life is currently from the clients' perspective ''(sensitive attunement'')
!!!A Board to play on
You may find the [[AIM Cards Board - download here]] (designed by ''Emily Daly'' at ''Leeds and York Partnership Trust'') to be a helpful resource in structuring your use of the cards with a client. Below are guidance notes, but remember that this is just a resource and there may be other ways that you can adapt them for use; please let us know if you have suggestions!
!!Using the cards in face to face work
''1. Introducing the cards''-
the worker should explain to the client what the cards are and their purpose. This is an example ''[[Broadcasting Intentions]]''.
>//I've bought some cards along that I do with lots of people when I'm trying to get to know them. These cards have got different topics on that relate to different areas of a person’s life//
>// I'd like to try to understand a bit how life is for you at the moment, to see if there's anything I could be helpful with - how does that sound?//
>//If you're not sure, you can take a look at the cards and then decide if you'd like me to bring them again another time - that's totally fine too
''(sensitive attunement)''//
''2. Agree how to look through the cards'' - Would they prefer to read through the cards themselves? or if they would like them to be read out by the worker? Remind them they can always ask for help with reading and can ask you questions if there are any that they are not sure about.
''Agree on how to divide up the cards - as a first step, usually 3 piles:''
*Things that are difficult/a problem
*Things that are going well/are strengths, and
*It doesn't apply to me
''3. Client sorts through the cards''-
allow the client to take the lead.
The worker should try to notice how actively the client looks to involve the worker in the process, and attune to this. The worker should hold in mind that using the cards is about understanding the clients' ideas about their life ''(sensitive attunement)'' rather than the worker seeking to influence these.
Quite often, some extra piles can develop (i.e. sometimes a problem; not sure etc).
Pay attention to how much the client seems able to tolerate naming something as a difficulty – some people will describe things in a high impact way “Really hard for me”; others will only be able to acknowledge something being difficult, but with minimal impact (i.e. sometimes a problem). Either way, we consider anything that is labelled as a bit of a difficulty as something that constitutes a “problem” and we don't talk it up or down in terms of severity or frequency - go with the clients' current description ''(sensitive attunement'').
Similarly, notice how easy the client finds it to identify strengths and attune to their level of comfort with this.
Check in on how they found the process of sorting and if it would be ok for you to ask a bit more about some of the cards.
''4.Exploring the strengths pile''-
start with the strengths – explore each of these in detail. The purpose is to show interest and build a bit of an understanding about areas of life that are going well.
It can be helpful to offer some summaries back about what you feel you are learning about them, their skills, strengths and abilities as you look through this pile ''(sensitive attunment)''.
In time, it can be helpful to support the client to think about how their strengths might help with some of the areas they are finding more difficult. Time spent focusing on strengths may also help them to feel comfortable in the session and potentially more open to move onto exploring aspects of their life that might feel more difficult.
''5. Exploring the difficulties pile''-
lay out the difficulties cards on the table. Ask them if they would be ok with talking you through why they chose these cards as difficulties. If so, ask where they would like to start.
Again, attune to how much exploration the client can tolerate, so that they are not feeling pressured into talking about things that are too uncomfortable or difficult ''(sensitive attunement)''.
Comment on the process in a sensitive manner - i.e. let them know how well they are doing about thinking about something that’s difficult; notice if they are finding it hard; check if they are ok to continue.
Follow the clients' lead in terms of how much they wish to share about these cards at this stage. Using the cards can help us learn how able the client is to think about themselves and their situation and how much they feel willing/able/ready to accept some help with these matters ''(sensitive attunment).''
''6. Exploring how the cards fit together''- it can be helpful to explore whether the client feels that there are any links between the cards that they have chosen.
Ask them to arrange the cards around to reflect this – for example, difficulties at school or with family might go together with a series of other cards.
Let the client take the lead in this. Usually, this process results in the cards being sorted into a smaller number of groups, around particular themes (e.g. how things are at home or at school or with friends, for example). The worker can ask questions to gain an understanding of why the client feels that certain cards go together, supporting them in the process of trying to make some sense of how these areas of difficulty might fit together and be influencing each other.
''7. Explore whether there is anything that the client might want help with''-
it is important that workers do not assume that a client wants to have help (from them) just because they have identified something as an area of difficulty.
With this in mind, it can be helpful for the worker to:
Ask the client whether there are any of the difficulty cards that they would like to see looking a bit different. Are there any areas that they would make a change to if they could? If they identify some, check in about whether its something that they think you could be useful for by meeting together. Which cards would be their priority to focus on (usually 2-4 cards is realistic).
Here is a point where we may ''broadcast intentions''
>// I’d really like to be helpful if I can, so if there were any of the cards here that you feel you would like some help with, then I would be happy to try to help if I can//
Attune to the degree to which the client seems comfortable with the idea of being in need – it may be more appropriate to position them as the expert.
>// You’ve got a lot of strengths/things you’re good at; maybe we can figure out a way that those could help with the things that are feeling more tricky at the moment//
''8.Contract what help might look like and where to start''-
think with the client about how to turn these cards into goals, decide which they would like to start with and think about how you might begin to work on these cards together ''(making a plan!)''.
!!Using AIM cards to measure outcomes:
*The client can rate the severity of the problem indicated on the card (or cards) that they feel are most important to change or to focus on. They are able to rate how much this affects them at the moment, using the numbers on the cards. This can then be used as a [[Goals-based outcome measure|Goals-based outcome measures]] and tracked over the course of the work together. This is a helpful way of checking 'how are things now?' in relation to what matters most to the client in comparison with the beginning of the work together. If the clients' rating is not changing, or getting worse this is also really important, as it can open conversations about why this might be, what might need to change for the ratings to move from x to x. Ratings can be plotted on a graph showing progress or change over time. This can also be shared and reflected on with the client.
*At the end of the intervention the AIM card session can be repeated and the ratings of the chosen cards can be compared from the pre-intervention AIM card session.
!!Adaptions and translations of the AIM cards
Some teams have adapted the cards to fit with their local context and different client groups. The AIM cards have also been translated into different languages;
!!!AIM cards for clients with a learning disability
*The ''Hertfordshire Learning Disability Service'' has adapted the cards to fit with their client group. Please contact Helen Fletcher at __helen.fletcher6@nhs.net__
!!! AIM cards for adults/parents
*Please contact Bee Huter and Michael Hollenstein from the ''Vorarlberger Kinderdorf team in Bregenz, Austria'' for information about this adaption
__b.huter@voki.at__ and __m.hollenstein@voki.at__
!!! AIM cards for younger children
*The ''Brent Schools Emotional Heath and Well Being Team'' have adapted the cards to fit for younger clients. Please contact __west@brent.gov.uk__
!!!For AIM cards translated into German
please contact __b.huter@voki.at__ __m.hollenstein@voki.at__ from the ''Vorarlberger Kinderdorf team in Bregenz, Austria''
!!!For AIM cards translated into Spanish
Please contact the ''ECID team in Barcelona'' via
__Anna.Oriol-Sanchez@annafreud.org__
!What's here?
The downloadable board shown below offers a simple structured way to use the AIM cards with a client.
!Credits
This is a resource developed by ''Emily Daly'' in the ''Leeds and York Partnership Trust'', and we are grateful to her for giving permission to share it here.
![[Manualization]] in practice
This is a very good example of how local innovations that are developed in response to local needs can quickly be shared across a whole [[Community of Practice]] via a continually developing and improving wiki approach to [[manualizing|Manualization]].
{{AIM cards board - download}}
!What does this license apply to?
This license applies to all written material relating to the [[AIM]] questionnaire which remains the copyright of the AMBIT Programme at Anna Freud in London.
!Released under license:
The AMBIT Integrative Measure (AIM) is an abbreviated and modified version of the FACE Young Person’s Assessment tool, developed in 1998-99 by Paul Clifford in conjunction with Peter Fonagy and colleagues at the Child and Family Center at the Menninger Clinic. The Young Person’s Assessment is an adaptation of the FACE Adult Mental Health Assessment developed by Paul Clifford. Copyright in FACE items (all AIM items save items 36, 41, 42 and 43) resides with Imosphere Ltd., the publisher of FACE tools and are used in the AIM with permission.
''FACE assessment tools are currently offered as a copyrighted instrument by Imosphere'' (https://imosphere.com/)
<html><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" property="dct:title" rel="dct:type">AMBIT AIM - Adolescent Integrative Measure</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://manuals.annafreud.org/ambit" property="cc:attributionName" rel="cc:attributionURL"></a> is released under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>.<br/><br />Permissions beyond the scope of this license may be available at <a xmlns:cc="http://creativecommons.org/ns#" href="https://annafreud.org" rel="cc:morePermissions">https://annafreud.org</a></html>.
!Summary of terms:
''You are free:''
* to Share — to copy, distribute and transmit the work
* to Remix — to adapt the work
''Under the following conditions:''
* ''Attribution'' — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
* ''Noncommercial'' — You may not use this work for commercial purposes.
* ''Share Alike'' — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
''With the understanding that:''
* ''Waiver'' — Any of the above conditions can be waived if you get permission from the copyright holder.
* ''Public Domain'' — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license.
* ''Other Rights'' — In no way are any of the following rights affected by the license:
** Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations;
** The author's moral rights;
** Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights.
''Notice'' — For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to the Creative Commons webpage defining this licence, [[here|http://creativecommons.org/licenses/by-nc-sa/3.0/]].
In 2023, the AMBIT team at Anna Freud wrote a series of guides for practitioners about how to use the AIM Questionnaire and the AIM Cards. The intention was to simplify information for front line practitioners into brief guidance documents. There are three of these.
You can download these documents from this page.
!!!!The AIM - a paper guide for practitioners.
This is for those who want to use a paper version of the AIM Questionnaire
{{AMBIT Integrative Measure (AIM) - a paper Guide for Practitioners (2).pdf}}
!!!!The AIM - an online guide for practitioners
This is for those who want to use the online version of the AIM Questionnaire
{{AMBIT Integrative Measure (AIM) - an online Guide for Practitioners.pdf}}
!!!!The AIM Cards - a guide for practitioners
This is an introduction to the use of the AIM cards for practitioners.
{{The AIM Cards - a Guide for Practitioners (1).pdf}}
!!!!The development, administration and psychometric properties of the AIM Questionnaire
There is also a detailed resource document on the AIM which describes its development and the psychometric characteristics of the measure.
{{The Development Design Administration and Psychometric Properties of the AMBIT Integrative Measure (AIM).pdf}}
!!Purpose
The purpose of this page is to provide you with an overview of the 43 items of the [[AIM]] with their corresponding subscales.
!!Subscales
!!!Young person daily life
1. Social Activities
2. Attendance at Education, Employment or Training
3. Attainment in Education, Employment or Training
4. Other talents or abilities
5. Physical Health Condition
6. Self Care
7. Physical Impairment or Disability
8. Social Development
9. Social Skills and Interaction
!!!Socio-Economic
10. Provision of Stable Housing
11. Income and Provision of Material Resources
!!!Family
12. Relationships
13. Conflict with Young Person
14. Parental Disapline
!!!Social
15. Supportive adult relationship outside the family
16. Peer friendships
17. Prosocial and antisocial peer group
!!!Mental State
18. Cognitive Ability
19. Anxiety
20. Obsessional Ideas and Complusive Behaviour
21. Post-traumatic intrusive experience
22. Attention and Concertration
23. Irritability
24. Sleep Disturbance
25. Depression
26. Deliberate Self-harm
27. Eating problems
28. Substance misuse
29. Suicidaility
30. Defiance
31. Destruction of property
32. Physical harm to others
33. Problematic sexual behaviour
34. Psychotic experiences
35. Elated mood
36. Mentalizing capacity
!!!Response to situation
37. Insight
38. Engagement with treatment and care
!!!Measure of Complexity
39. Chronicity
40. Pervasivness
!!!Power and Control
41. Experiences of discrimmination
42. Experiences of exploitation
43. Online life
!!!Purpose of page:
!!!This page has been created to describe 1 of the 3 new questions ('items') for the AIM
These new Items are included in both the AIM questionnaire (paper and interactive versions). They are also included in the AIM cards
Please also see 2 other pages that contain details of the remaining 2 new items:
*[[Experiences of Exploitation|AIM New Items: Experiences of Exploitation]]
*[[Online Life|AIM New Items: Online Life]]
These 3 items are categorised together under the new subscale in the AIM questionnaire called 'Power and control'
Title of this new AIM item is:
! Experiences of Discrimination
Explanation and scoring guide contained in the AIM Questionnaire:
//''Experiences of discrimination.
This is the experience and impact of discrimination upon a young person and their life. This includes discrimination on the basis of race, gender, ethnicity, culture, age, ability, sexuality, class and religion. This can be discrimination that has happened over a long time and in multiple areas of life as well as more specific incidents or experiences. This can also include discrimination from within one's own culture or community as well as intersecting differences which may be the target of discrimination''//
0+= Strength. Young person has not experienced discrimination but is actively aware of issues around racism and discrimination and acts as an ally to others who experience discrimination
0= No problem. Young person has not had experiences of discrimination
1=Minor problem. Young person has experienced very infrequent discrimination which has not caused ongoing distress or identifiable barriers in the young person's life.
2= Moderate problem. Young person has experienced discrimination which has caused distress and or impacted to a moderate degree on the young person's sense of self- identity and sense of safety. The emphasis here is on the impact on the young person and their life.
3= Severe problem. Young person experiences discrimination which causes ongoing distress and impacts on the young persons sense of control, self identity and sense of safety. The young person experiences barriers to achieving their goals due to discrimination.
4= Very severe problem. Discrimination is a recurrent and significant ongoing life barrier for the young person. It impacts on the young person's capacity to do the things they want to do in life and causes ongoing distress and trauma, leaving the young person feeling very unsafe in the world.
!!Language for this item on corresponding AIM card:
<<<
''"Being treated //__unfairly__//... - relating to race, gender, sexuality, background, physical appearance, religion, age, abilities"''
!!!Purpose of page:
!!!This page has been created to describe 1 of the 3 new items for the AIM questionnaire
Please also see 2 other pages that contain details of the remaining 2 new items:
*[[Experiences of Discrimminatio|AIM New Items: Experiences of Discrimination]]n
*[[Online Life|AIM New Items: Online Life]]
These 3 items will be grouped together under the new subscale in the AIM questionnaire called 'Power and control'
Title of this new AIM item will be:
! Experiences of Exploitation
Explanation and scoring guide contained in the AIM Questionnaire:
// ''Experiences of exploitation. People in positions of power or authority misusing power to coerce or control the young person. This includes grooming, sexual and criminal exploitation, radicalisation and any experiences where young people are pressured to do things that they do not wish do do and which may be harmful. Note, it may be difficult for a young person to recognise experiences of exploitation themselves''//
0+= Strength. No experiences of exploitation. Young person has good sense of self agency and shows examples of recognising and responding positively to misuses of power by others
0= No Problem. No experiences of exploitation
1=Minor problem. Young person is sometimes in situations where there is a risk to them of being exploited. Or, young person has encountered infrequent and minor attempts by others to exploit them or misuse power over them. These have not been successful and young person has been able to identify these attempts as 'not ok'. These have not had an ongoing impact
2=Moderate problem. Young person is frequently in situations where there is a risk to them of being exploited. Or, there is evidence that others have attempted to exploit the young person and that the young person has been impacted by this. The young person finds it difficult to recognise or manage the situation.
3= Severe problem. There is clear evidence of exploitation. This impacts on the young person and places them at clear risk. The risk and harm is ongoing and the young person is not able to recognise or act in ways to remove them self from the control of others
4=Very severe problem. Severe control and exploitation causing significant harm or trauma to the young person and placing them at ongoing severe risk. Young person is controlled to the degree that they do not have the capacity to recognise risks or change the situation and there are considerable barriers to intervening or to the young person escaping the situation
!!Language on corresponding AIM card:
<<<
''"Experience of people trying to (take advantage of me) make me do things I don't want to do or don't feel comfortable doing"''
<<<
!!!Purpose of page:
!!!This page has been created to describe 1 of the 3 new questions ('items') for the AIM
These new Items are included in both the AIM questionnaire (paper and interactive versions). They are also included in the AIM cards
Please also see 2 other pages that contain details of the remaining 2 new items:
*[[Experiences of Discrimmination|41 Power and Control - Experiences of Discrimination]]
*[[Experiences of Exploitation|AIM New Items: Experiences of Exploitation]]
These 3 items are categorised together under the new domain in the AIM questionnaire called 'Power and control'
Title of this new AIM item is:
! Online Life
Explanation and scoring guide contained in the AIM Questionnaire:
//''Online life: how the young person uses the internet in their life. This captures positive and negative ways that being online can impact on a young person. Positive uses may include learning, social connections, relaxation and enjoyment whilst negative uses may include internet addiction, impact on daily life functioning, experiences of bullying, porn, radicalisation and doxxing (not exclusive)''//
0+= Young person uses the internet in ways which enrich their life (e.g. in relationships or
or meaningful activities). Internet use is appropriate, developmentally healthy and the young person shows good insight into downsides or risks to being online. Young person regulates their internet use in line with this awareness
0= No problem. Uses internet in ways that are appropriate for learning, enjoyment and social connection without any difficulty
1= Minor problem. Young person shows some difficulties in regulating how much, when, or what they do online to the degree that others express minor concerns about this. Internet use does not lead to clear risks to the young person
2= Moderate problem. Others around the young person express concerns about the young person's online life and internet has a clear impact on the young person's capacity to carry out developmentally appropriate tasks. Online life leads to infrequent but potentially risky situations or harm to young person or others.
3=Severe problem. Clear impact of being online upon the young persons' life or wellbeing. This includes engaging in recurrent risky or harmful behaviours online
4= Very severe problem- Online life impacts on the young persons daily functioning in an ongoing and harmful way. There is an impact across multiple areas of life functioning due to internet use. Risks of harm that happen due to online behaviour are high and continued
!!Language on corresponding AIM Card:
<<<
''How I use the internet in my life''
''//Do any things you do online, or how much you are online, cause worry or problems (for you or others)?
Are there positive ways in which being online helps your life?//
!!!The purpose of this page is to explain the additions and updates to the AIM questionnaire that we completed in August 2021
The AIM questionnaire now includes an additional 3 new questions or 'items' (there are now 43 items in total)
''The three new items are grouped together under a new subscale called 'power and control'''
''The new items are:''
1. [[Experiences of Discrimination|AIM New Items: Experiences of Discrimination]]
2. [[Experiences of Exploitation|AIM New Items: Experiences of Exploitation]]
3. [[Online life|AIM New Items: Online Life]]
!!!Why have we revised the AIM questionnaire?
This work has been influenced by recent social movements and events, in particular the death of George Floyd and the Black Lives Matter movement, which has also prompted a wider journey within the Anna Freud Centre with the goal of being an anti-racism organisation.
Part of this thinking within the AMBIT team has been to reflect on the potential connection with issues including racism, discrimination and power and the AMBIT model. In this context, one practical relevant area is the way in which we need our assessment and engagement tools to explicitly ask about and open curiosity with our clients (and teams) around themes of discrimination and abuse of power.
!!!The AIM questionnaire can now also be used through an online version hosted within this wiki manual.
[[The AIM questionnaire- interactive version |AIM questionnaire - interactive version]]
We believe this development gives teams important new opportunities and functions that improve the original AIM questionnaire:
(i) Workers can quickly access and fill in the AIM questionnaire online via the ambit wiki manual
(ii) Scores are calculated automatically and it is possible to immediately see a clear summary of the clients' scores. These can be downloaded or printed out and added to a clients' notes
(ii) The client scores can then be quickly transfered into a specifically designed spreadsheet that is freely available and can be held within the team. This allows the data to be managed, stored and visually represented. Please see [[Scoring AIM data]] to download and learn how to use the AIM spreadsheet
(iv) [[The AIM questionnaire- interactive version|AIM questionnaire - interactive version]] gives workers a list of suggested interventions for their client after the scores have been entered. These suggested interventions connect the clients' profile of scores with current evidence about the kind of interventions that are most likely to be helpful and supported by evidence
''Please note
The [[AIM cards|AIM Cards]] will also be updated with the 3 new items added to the current 40 AIM cards '' and will be available to purchase via the AIM cards page
.
!!!General points
*We think that creating a new subscale for the AIM (Power and Control) is more helpful than changing or editing the questions that already exist, as this could impact on the validity of teams' data that they have already collected. This might cause problems for teams in comparing clients' outcomes at a later stage.
*For teams who have already been using the AIM questionnaire and would like to compare scores for clients after they start using the new revised version, the new subscale can be scored separately so as to allow this comparison against previous scores
[[The AIM questionnaire paper version can be downloaded here|AIM questionnaire - paper version]]
*We encourage teams to adopt the revised version of the AIM questionnaire and would very much welcome feedback on the new items and online system
*The AIM questionnaire original version will be phased out over time
Source: Cheryl Hunter and James Fairbairn
!! ''Purpose of this page''
This page provides a downloadable spreadsheet for the AIM for workers wishing to record results when using the [[AIM|AIM]] questionnaire. This page also gives instructions on how to use the spreadsheet.
!! ''How to use the spreadsheets''
''1) ''''Intention of the spreadsheets''
The spreadsheets are designed to:
* Help teams quickly and easily record AIM scores
* Help teams visualise change in individuals and across teams over time
* Help teams share data easily with [[AMBIT study group|The AMBIT Study Group]]
The spreadsheets are currently in English, but teams are welcome to translate for their own use.
''2) How to use the spreadsheets''
Instructions for use and a summary of the AIM measure are included on the AIM sheet of the spreadsheet.
Ratings should be inputted into the sheet named 'Data'. Each row should represent one individual's data. You insert the person's identifier (e.g., name or ID number) into the first column. If you scroll across, you will see that Timepoint 1 (T1) scores are coloured in Blue and Timepoint 2 (T2) scores are coloured in Orange. You can also record the date of completion (for T1 and T2).
Formulas will generate totals and averages for you so that you only have to enter the ratings.
The Data sheet is automatically linked to the 'Individual Scores', 'Individual Graphs', 'Team Scores' and 'Team Graphs' sheets.
The Key Problems sheet needs to be filled in separately to the Data sheet.
''AIM summary''
The [[AIM|AIM]] is a worker rated measure, where each item is rated between 0-4 with the worker's 'best guess' rating of that item. When rating the AIM, you can use a "0+" to indicate an area of particular strength, but it is advised not to use this score on the spreadsheet as it will disrupt any score change calculations. Use "0" instead.
With the AIM, you can also choose to identify ket problems. Key problems act as goal-based outcomes for the client and they should be the most important targets for intervention. Only modifiable items should be considered and the same key problems should be measured at T1 and T2. You can only choose up to 6 key problems.
''Score meanings''
* 0= No problem
* 1= Mild
* 2= Moderate
* 3= Severe
* 4= Very Severe.
Higher scores indicate worse functioning.
We have adopted a pragmatic rule that the total AIM scores can be compared if at least 80% (32 out of 40) items are completed.
For subscales, the scores can also be compared if over 80% of subscale items are completed. The spreadsheet also calculates the average item score (per individual, and across cases) - this will be out of 4 (from -4 to + 4, dependent on direction of change).
Negative change scores indicate a decline in functioning between time 1 and time 2, positive change scores indicate an improvement.
''3) Sheets Summary''
''AIM''
Summarises the instructions for using the spreadsheet and the AIM measure
''Data Sheet''
Where you enter the raw ratings of the AIM at T1 and T2.
''Individual Scores Sheet''
Automatically re-orders the data so that you can quickly scan across individuals and compare time 1 and time 2 scores for individuals.
''Individual Graphs Sheet''
//This sheet is only included in the Ten Cases version of the spreadsheet as there are a lot of possible graphs generated per person.//
You will see automatically generated graphs for each individual. These include a comparison of AIM score at time 1 and time 2, plus change in score; comparison of each sub-scale score at time and time 2, plus in subscale score.
''Team Scores Sheet''
Automatically displays mean item scores and subscale scores at T1 and T2 (plus change between T1 and T2) for the entire team dataset.
''Team Graphs Sheet''
Automatically displays graphs for AIM total score and AIM subscale scores at T1 and T2, and change over time.
''Key Problems Sheet''
Allows you to record the Key problems, and track change in them over time, and generates graphs.
There is a section on the sheet for the worker to record the specific key problems for each individual using the AIM Item Numbers (see 'appendix' sheet for items list with associated numbers).
''Appendix Sheet''
Lists the items on the AIM with an associated number. The number matches with the numbers on the AIM and the AIM cards.
''4) Outputs''
There are different outputs generated within the spreadsheet.
The y-axis on the generated graphs always indicates the highest and lowest possible scores, e.g., for item scores, the highest possible score is 4 and the lowest is 0; for the full AIM, the highest possible score is 160 and the lowest is 0; for the mental state subscale, the highest possible score is 76 and the lowest is 0.
* Individual graphs (only in the ten cases spreadsheet)
** AIM scores at T1 and T2 and change
** AIM sub-scale scores at T1 and T2 and change
//Example output: AIM score at T1 and T2 for an individual//
[img[AIM individual score.JPG]]
* Team graphs (in both spreadsheets)
** Average item score across clients at T1 and T2 (Average item score offers a more precise indicator of change than comparing total or subscale AIM scores)
** Average AIM scores across clients at T1 and T2 and change between times
** Average AIM sub-scale scores across clients at T1 and T2 and change between times
//Example output: Average item score//
[img[AIM score.JPG]]
//Example output: Average AIM score across clients at T1 and T2//
[img[Average score.JPG]]
''5) Links to Spreadsheets''
There are two version of the spreadsheet that are filled in in the same way.
The reasoning is that most teams will want to know whether they are making a difference to their clients across their service, and therefore the "Team Level" spreadsheet allows you to collect up to 100 people's data at a time and will generate graphs that visualise this. It would be too cumbersome and slow down the spreadsheet to include the capacity to generate individual client graphs as well, so a smaller spreadsheet ("Ten cases") is provided that allows you to automatically generate individual client graphs as well as group graphs.
We recommend that teams use the team level spreadsheet for //all your team's data// and copy over a particular client case into the ten cases spreadsheet if you want to visualise change on total AIM scores or AIM domains for an individual client.
''//Here are the links to the spreadsheets://''
<<link-pdf "AIM Data Collection Spreadsheet - Ten Cases" "https://drive.google.com/file/d/1JWfSYwrxNb5ONyfzv5xaa1ezbOUd3xpT/view?usp=sharing">>
<<link-pdf "AIM Data Collection Spreadsheet - Team Level Data" "https://drive.google.com/file/d/1GtJMWA_aEfnf-0p1SV0ww-WH80Vva0Vw/view?usp=sharing">>
''Technical notes''
* The spreadsheets are protected to prevent accidental deletion of the formulas (which generate sums and averages and outputs). If a team want to edit the spreadsheet formulas, they can do so by entering the password "ambit"
* The spreadsheets also lose this protection if opened in google sheets
Please read about [[AMBIT Client Impact Project|AMBIT Client Impact Project (ACIP)]] which describes a developing protocol of how to use the AIM measure. This protocol is developing in response to feedback from teams who are currently trialling the AIM as part of their practice.
The CASUS study collected AIM measures for a sample of 100 cases. This page provides a simple summary of these scores.
The baseline (at start of treatment) mean domain and total scores are shown below.
Domain and Mean scores
#Daily Life 5.8
#Socio-economic 0.7
#Family 2.6
#Social relationships 2.1
#Mental health 14.2
#Responsiveness 0.9
#Complexity 4.8
Mean total score was 27. 89 (SD 11.98)
This sample was a group of young people with significant substance use problems and other life difficulties (multiple needs).
The measure was taken at the ir early contact with the service.
Below is the AIM questionnaire paper version, which you can download from the manual by clicking on the corner box. Please see the page on the [[AIM|AIM]] which describes how to use this measure, how to score it and how it was developed.
[[https://docs.google.com/document/d/1iVIItDQ6xmwfpWffWyuj8I9TFML2cf7OI3jBrySsHtI]]:
<html><iframe src="https://docs.google.com/document/d/1iVIItDQ6xmwfpWffWyuj8I9TFML2cf7OI3jBrySsHtI/preview" width="640" height="480"></iframe></html>
----
!Introduction
Many of the young people AMBIT is designed for have high levels of [[Complexity]] and [[Comorbidities]]. It can be difficult to decide [[which intervention|WhichInterventionWhen]] to use, when, and the AMBIT [[AIM]] assessment can help you in this task by analysing your results and generating suggested interventions in the form of ranked lists, which provide direct [[Links]] to the manualized interventions.
!How does it work?
At the end of the [[AIM questionnaire - interactive version]] you will see a final page titled ''AIM Results''. At the bottom of that page you will see the ''Suggested Interventions'' section.
The AIM questionnaire collects the severity scores you have entered across the 40 items in the questionnaire for your client, and then uses quite simple algorithms to rank potentially useful (evidence-based) interventions for the problems you have identified with your client. These algorithms are explained below.
The fact that //''different lists''// of suggested interventions are generated is in itself designed to communicate to the [[Key Worker]] that, because the lives and difficulties of young people we work with a generally marked by COMPLEXITY, ''there is NOT a simple mechanical relationship between "problem //a//" and "intervention //x//"''
Thus the [[Key Worker]] is encouraged to use these lists as an additional layer of 'mentalized' oversight on a case; one that offers a more or less objective //perspective// on the options open to him or her, or to discuss them in [[supervision|SupervisoryStructures]] The lists should be used to monitor whether or not what is being delivered is broadly in line with other thinking, and to stimulate questions if there is wide variance between what is suggested and what is actually being offered:
>''//"Am I offering my 'favourite' interventions, rather than the ones most suited to the needs of this person at this time and place?"//''
See also WhichInterventionWhen for other advice on how to sequence what to do, or [[I'm stuck: what next?]] if you are at a more general impasse.
!How does it rank interventions?
In order to make it quite clear that this is not a "check-box" exercise, and that there must be flexibility for the worker in deciding what to do, there are different ways to sort these suggestions, depending on whether you want to look at addressing the whole spread of a young person's difficulties (''GLOBAL ranking''), or to focus on the most severe ones first (''FOCAL ranking''), and whether you want to limit your attention just to the [[Key Problems]].
* ''GLOBAL RANKING'' - each suggested intervention is ranked according to //how many different problems// (that is, AIM items scoring greater than 2) the young person has //which that particular intervention has evidence for being effective in treating//. This is good for selecting interventions that will COVER THE WIDER SET OF PROBLEMS AND THEIR CAUSES, in particular for finding approaches that might address some of the [[Comorbidities]] that frequently act as //maintaining factors// for the young person's difficulties.
* ''FOCAL RANKING'' - each suggested intervention is ranked in order of how SEVERE the set of problems it has evidence for being effective in treating are (their averaged AIM scores). This is good for FOCUSING THE MOST EFFECTIVE INTERVENTIONS ON HELPING WITH THE MOST SEVERE PROBLEMS.
* ''LIMIT'', as the title suggests, this limits the suggested interventions that are ranked in both of the above sorting algorithms //only to those relevant for items identified as KEY PROBLEMS//.
= [[AMBIT Local Facilitators]]
!!''What does AMBIT mean?''
*''__AMBIT__'' ///ˈæmbɪt///
**''Noun.''
***a. Scope or extent
***b. Limits, boundary, or circumference
***c. ''A sphere of action, expression, or influence''</center>
*''__Etymology:__''
**16th Century: from Latin //ambitus// a going round, from //ambīre// to go round, from //ambi-// + //īre// to go
!!''AMBIT as a way of working?''
The word AMBIT itself is preferred as opposed to its use as an acronym A.M.B.I.T. (''[[Adaptive]] [[Mentalization]]-Based [[Integrative]] [[Treatment]]'')
!!''From A.M.B.I.T. to AMBIT to //"ambit-"//''
Best of all, refer to ''ambit-'': this is the prefix that starts the address to the many local versions of the online wiki [[manuals|Manualization]]. There is little of ambit- without the //local expertise// that adopts, adapts and helps itself to shape the onwards development through its own contribution of outcomes from the work.
!!''Introductory material on AMBIT:''
1. See [[AMBIT: an overview]], or learn about [[Mentalization]] and how this can act as an [[Integrative]] framework for work in a multi-modal, multi-agency context.
2. [[Core Features of AMBIT]] goes into more detail
3. The [[AMBIT Wheel]] provides a good reminder.
!!''Past versions...''
As this model of practice has developed over the past years it has been through various name changes - since 2001 it has been known as both [[IMP]] and [[M-BIO]], and originally AMBIT stood for ''Adolescent'' Mentalization Based Integrative Treatment, rather than ''Adaptive'', which was adopted when significant numbers of teams began working with clients outside the originally targeted adolescent age range.
Part 1:
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/N5UT0SHTH40?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/N5UT0SHTH40?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Part 2:
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/EdAQd1Zye2w?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/EdAQd1Zye2w?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!AMBIT Client Impact Project (ACIP)
!!!!Source: Peter Fuggle
!!Introduction
ACIP is a project being carried through a collaboration out between teams influenced by the AMBIT model.
Outcomes can be measured in a diverse number of ways, depending on whether the focus is the client, the worker, the team, the network and the service. There is no single way of measuring outcomes in AMBIT. The basic stance is curiosity about whether the work is proving helpful to the client, worker, team or network.
Outcomes work for AMBIT has been hugely influenced by outcomes work in other projects at the AFNCCF where principles of low burden and simplicity have been demonstrated to be critical to successful implementation.
AMBIT encourages local diversification according to service and client needs. Any method of evaluating outcomes that is going to be used as part of the general AMBIT approach needs to be able to accommodate to local service variations. We expect that additional local ways of evaluating outcomes can be bolted on to this core framework. The intention is to create a small shared thread of data across very different services and teams.
The criteria for being part of the collaboration is that the participating team has been trained in AMBIT and that they are willing to explore the value and benefit of this shared approach to outcome monitoring by testing the suggested framework in their service.
!!Purpose of the project
The primary aim of the project is to:
*Develop a low burden, simple outcomes system that could be used in multiple contexts to evaluate whether clients of AMBIT teams improve in life functioning during their contact with the service.
The secondary aims of the project are to:
*find out whether it is feasible to obtain outcomes from a variety of teams using a shared outcomes approach so that outcome data can be accumulated across multiple settings.
*develop a method that might become a routine component of the AMBIT approach.
!!Stages of Project
*Consult with academic and AMBIT community. This involved holding a study day in 2019 attended by teams from across the world to consider the problem of outcome measurement. This resulted in the setting up of[[ the AMBIT Study Group |The AMBIT Study Group]]which has begun in 2020.
*Complete data analysis on CASUS data. A substantial series of outcome data from the CASUS team has been used to explore ways of assessing outcome for an AMBIT trained team. This work is nearing completion and will be submitted for publication in 2020.
*Design of low burden outcomes framework The analysis of the CASUS data has provided an invaluable opportunity to test different outcome methods and the need to pay attention to important details of any agreed method. The conclusion of this preliminary work is to propose the following core method of evaluating impact of AMBIT trained teams on client functioning.
The core components of this are:
*''A single measure''. The approach involves the use of one measure, the AMBIT Integrative Measure ([[AIM]]). This involves 40 item ratings.
*''Two time points''. The measure is completed by the worker on two time points. Time Point 1 is near the beginning of the work with the young person. Usually this will be after the worker has had a couple of contacts with the client. The exact details of this will vary for each team. Time Point 2 is when the active work with the client comes to an end. Some teams may have follow up arrangements but the intention is that the second time point is when active help has been concluded.
*''The informant''. For this project, the AIM is completed by the allocated worker. It is completed from the worker’s perspective. As a mentalization based approach it is important to be clear about this. It is not completed as if the worker is imagining what the client might say. This is consistent with the process of Active Planning where their intention is to explicitly contrast the perspective of the worker with the perspective of the client. The use of the AIM here could be part of the workers understanding of the client that is shared with the client as part of active planning.
* ''Relationship of outcome monitoring and mentalization based practice''. In the discussions about developing this method, there has been a lot of discussion about how outcome measures interface with therapeutic work in which the perspective of the client is central to the helping process. The use of a worker rated AIM is not intended to undermine this central tenet of practice.
Many teams may wish to amplify this basic measure by also exploring the clients understanding of the issues raised in the AIM by:
*Use of the [[AIM cards|AIM Cards]] with the client as a method of obtaining a client perspective on the AIM items.
*Exploring key problems from young person’s perspective and contrasting these with perceived key problems by the worker.
For this project, the intention is not to try to develop a ‘true’ rating for the AIM by engaging the client but to retain a clear understanding that this is based on the workers understanding. We recognise that there are many complexities to this as ratings by the worker will be influenced by how well the worker knows the client. In our wider experience of outcomes work, it is often a major mistake if an outcomes framework tries to capture such complexities as it leads to method that is potentially more sensitive but undeliverable as a core outcome method.
!!AIM Scores.
The AIM produces three levels of scores to be considered about a case or the work of a team as whole; a total score, seven domain scores and 40 item scores.
For a team we would suggest that the total AIM score is the primary outcome score. The difference between the Total AIM score at Time 1 and Time 2 would be the primary outcome measure. In theory this could range for 160-0. From current data we would anticipate that total scores will range between 10-50.
!!![[Reliable Change |Measuring reliable change]]
From the CASUS data, we have calculated the reliable change criteria. This is the degree of change between Time 1 and Time 2 that suggests that the change may be greater than chance variation. For the Total AIM score this is 12.91. This means that any case where there is a difference in total scores of more than 12.91 is a case that has achieved reliable change.
!!!Domain scores
In addition to total scores, the AIM will also have the ability to generate domain scores for the seven domains covered by the AIM and also to generate individual item scores. As domains have a wide variation in number of items, domain scores are best presented as mean item scores for each domain. These will range between 0-4.
!!!Item scores
Our experience so far is that individual item scores are very informative. Some of these item (e.g. anxiety) are frequently scored high in the vulnerable populations the teams will generally serve.
The purpose of the project is to explore the degree of similarity and variation between teams on all three levels of analysis offered by the AIM.
!!Project plan.
At the core of this project is a collaboration between members of the AMBIT Study Group and the AMBIT Team at the Anna Freud Centre. All of the current proposal etc needs ot be discussed and considered by the AMBIT Study Group.
The Project Plan has three parts,:
*1. develop an agreed core model of outcome evaluation
*2. Collect data from a number of participating teams
*3. Collectively reflect on the learning from this and revise framework from this.
Teams participating in the Project need to be actively attempting to use this framework in their work with clients. There is no required number of cases for a participating team at this stage. The intention is to hold a meeting of the Study Group in March 2020 to review examples of actual outcome monitoring and to consolidate guidance and good practice.
At this initial stage, data will be shared through excel spreadsheets. The longer term plan is to explore the use of an on-line outcome monitoring system called POD for this work. This again can be considered at the March meeting of the Study Group.
The intention is that by the end of 2020 we will have a substantive data set based on data from a number of teams. This may provide the basis for fresh thinking about the AMBIT approach and what we learn from the outcomes of clients coming through AMBIT teams.
!!''Introduction''
Descriptions of competencies can be a bit daunting and dry but they are also very useful in being clear about the core aspects of the model and what practitioners should know and do.
The AMBIT Project Group at the [[Anna Freud National Centre for Children and Families]] has been working on trying to define the core competencies for a practitioner working in an AMBIT trained team. We recognise that different teams will adopt some parts of the AMBIT approach more than others and that it is not a requirement that all practitioners are competent in all the 20 competencies outlined below.
We would greatly welcome comments and suggestions from current AMBIT trained teams about whether the competencies outlined here represent their understanding of the core AMBIT approach.
Adaptations of these competences for individual teams would be especially interesting and welcome.
!!''The overall competency framework for AMBIT''
!!!Individual Competencies
AMBIT competencies for individual workers are organised into three parts;
* ''Part A: Basic knowledge for AMBIT''
* ''Part B: Basic practice for AMBIT''
** [[AMBIT Competencies covered in the Basic Training]] lists the ten most basic components (Part A and Part B).
* ''Part C: Advanced knowledge and practice for AMBIT.''
** [[AMBIT Full Competency Framework]] adds ten further competencies (Part C) which are listed together with the ten covered in the Basic Training (Part A and Part B).
*** Thus, ''overall, there are twenty competencies''.
*** There is a self-audit scoring scheme included in that list
*** Embrace the importance of [[Work on the Self]] and use this to direct AutoDidact activities as teams or individuals.
!!!Team Competencies
Because AMBIT is explicitly and exclusively a ~TEAM-BASED approach, there is also a list of team-based practices that require the kind of [[Working with your TEAM]] that AMBIT promotes:
* [[AMBIT Team Competencies]]
!!!This page is being re-drafted (15.09.22)
!What is here?
This page lists the ''core knowledge and skills'' that we cover in our [[AMBIT Training]]s, and that we would hope trainees will leave a training with a basic grasp of.
This material is being ''re-edited in 2022'' in the light of our experiences of training teams for the last 5 years since the page was last edited (note that over the last 3 years trainings have been predominantly ONLINE, rather than face to face.)
!1. General:
!!General: Knowledge
*An understanding of ''the kinds of problems that AMBIT was co-designed to help with''. E.g.
** Multiple intersecting needs
** High risk/Worker stress/Burnout
** Low conventional help-seeking/High mistrust in professional help
** Limited evidence base for the client group
*Knowledge of the basic AMBIT framework summarised in the AMBIT wheel
** See [[AMBIT Wheel]] and [[Core Features of AMBIT]]
* Understand why AMBIT is a TEAM approach ( see [[Working with your TEAM]])
!!General: Skills
* Being able to set up team processes which support deliberate and explicit attention across the four quadrants of the [[AMBIT Wheel]]
!2. Mentalizing
!!Mentalizing: Knowledge
*An ability to draw on knowledge about the nature of mentalizing (see [[Mentalization]])
*An ability to draw on knowledge about the developmental basis of processes of mentalization
*An ability to recognise mentalizing and patterns of non-mentalizing in both self and others (see [[Implicit mentalization]]; [[Explicit mentalization]]; Quick fix thinking; Pretend mode and Certainty)
*An ability to draw on knowledge of the vulnerability to loss of mentalization in self and others.
!!Mentalizing: Skills
*An ability to use explicit [[Mentalization]] with clients
** Using this to develop, maintain and generalise [[Epistemic Trust]]
** E.g. [[The Therapist's Mentalizing Stance]] and [[General features of a "Mentalizing Stance"]]
*An ability to build interventions based on //who the client has epistemic trust with//
** E.g. developing or using a [[Team around the Worker]]
* An ability to balance worker intentions and client intentions in planned work
** E.g. see [[Active Planning]]
* An ability to work towards //developing help for the client as a system// rather than (just) as an individual dyadic relationship
!3. Team
!!TEAM: Knowledge
*Understanding the fluctuating mentalizing capacity of colleagues within a team (including oneself) in response to anxiety, stress and other //expected// aspects of work with hard to reach young people (see [[Ripples in a Pond]]).
*Basic knowledge of help-seeking theory, and how this supports a [[Well-connected team|Keyworker well-connected to wider team]]
!!TEAM: Skills
*An ability to apply mentalization in one’s interactions between colleagues within the team (see [[Work on the Self]] and [[Is Mentalizing just Reflective thinking?]]).
*An ability to use [[Thinking Together]]
** to support ''individual'' colleagues' mentalizing (giving and receiving help)
** in ''group'' ([[Team Meetings]]) settings.
*An ability to challenge colleagues (or offer uninvited help) where there is evidence of non-mentalizing and/or risk
** See [[Graded assertiveness in challenging a team member]]
!4. Client
!!CLIENT: Knowledge
* Understanding the burden of multiple intersecting needs
* Knowledge of the theory of [[Epistemic Trust]] and its relation to [[Mentalization]] and learning/change in clients
* Understanding the causes and implications of Epistemic mistrust
* Understanding the risks in mechanisms of change (teaching/telling as teleology, listening/attunement as pretend, broadcasting as psychic equivalence)
!!CLIENT: Skills
*An ability to use explicit [[Mentalization]] with clients
** Using this to develop, maintain and generalise [[Epistemic Trust]]
** E.g. [[The Therapist's Mentalizing Stance]] and [[General features of a "Mentalizing Stance"]]
*An ability to build interventions based on //who the client has epistemic trust with//
** E.g. developing or using a [[Team around the Worker]]
* An ability to balance worker intentions and client intentions in planned work
** E.g. see [[Active Planning]]
* An ability to work towards //developing help for the client as a system// rather than (just) as an individual dyadic relationship
!5. Network
!!NETWORK: Knowledge
* Understanding the concept, causes and //inevitability// of network [[Dis-integration]]
** The presence and persistence of beliefs/narratives about the practice of other agencies, and how these arise.
** The impact of stress on inter-agency and inter-professional mentalizing
** The presence of contradictory goals between different agencies
* Understanding the impact of Dis-integration: on clients
* Understanding the value of [[Addressing Dis-integration]] to produce more effective systems of help
!!NETWORK: skills
*An ability to apply explicit mentalization to staff from other agencies
** see [[Addressing Dis-integration]]
*Ability to adopt or recover a position of respect towards staff from other agencies :
** Using the [[Dis-integration grid]] to target and support [[Connecting Conversations]]
** Developing techniques for creating more mentalizing relationships across professionals and agencies in a network
* An ability to build an understanding of the network through the eyes of the client:
** Using [[The AMBIT Pro-Gram]]
** Using sculpting techniques, etc
*An ability to accept that different agencies may be required to prioritise different aspects of a young person’s needs and that these different priorities may create tensions within a network around a young person (see [[Mentalizing service barriers]]).
!6. Learning
!!LEARNING: Knowledge
* Understanding what a Learning Organisation is and why it is essential
* Understanding that Mentalizing and Epistemic Trust create the conditions for Learning
** Understanding necessary conditions for ''Team'' learning
** Understanding the barriers to team learning
* Know about the AMBIT manual and its functions
* Understand the value of measuring impact
** outcomes as a way of supporting team learning
!!LEARNING: Skills
* Developing and Sustaining an explicit learning space for the team
** [[Manualization]] as way of applying this space
* Skills in using the manual
** Reference text
** Recording team learning
** Connecting with the [[Community of Practice]]
* Using an Outcome measure that '''measures what matters'''
** An example: the [[AIM questionnaire - interactive version]]
----
!OLD text (Drafting continues...)
!!What is this?
See [[AMBIT Competencies]] for a description of this. The list below is ''just the first half'' of the [[AMBIT Full Competency Framework]] - that is, just the core elements of practice that we hope trainees will achieve in their initial [[AMBIT Training]].
!!!Self-AUDIT
A simple exercise in thinking about your skills is to rate yourself on each of the competencies. Rate yourself against each of the following 20 competencies according to the following scale:
__''Scoring:''__ ''0'' = Not confident, ''1'' = Becoming confident, ''2'' = Confident
!!PART A: KNOWLEDGE FOR AMBIT
!!1. Knowledge of the theory of [[Mentalization]]*
*An ability to draw on knowledge about the nature of mentalizing (see [[Mentalization]])
*An ability to draw on knowledge about the developmental basis of processes of mentalization
*An ability to recognise mentalizing and patterns of non-mentalizing in both self and others (see [[Implicit mentalization]]; [[Explicit mentalization]]; Quick fix thinking; Pretend mode and Certainty)
*An ability to draw on knowledge of the vulnerability to loss of mentalization in self and others.
* Knowledge of the theory of [[Epistemic Trust]] and its relation to [[Mentalization]]
!!2. Knowledge of the AMBIT approach*
*An understanding of the kinds of problems that AMBIT was co-designed to help with. E.g.
** Multiple intersecting needs
** High risk/Worker stress/Burnout
** Low conventional help-seeking/High mistrust in professional help
** Limited evidence base for the client group
*Knowledge of the basic AMBIT framework summarised in the AMBIT wheel
** See [[AMBIT Wheel]] and [[Core Features of AMBIT]]
!!3. Understand the 4 Quadrants and how Mentalizing is applied in each:
** Understand why AMBIT is a TEAM approach ( see [[Working with your TEAM]])
* Understand the 8 elements of a principled stance:
** Understanding the principle of a balance between competing dilemmas in each quadrant
*** Keyworker well-connected
*An ability to describe the AMBIT stance features
!!PART B: AMBIT PRACTICE
!!3. Ability to use mentalization in their work with clients
*An ability to use explicit [[Mentalization]] with clients
** Using this to develop, maintain and generalise [[Epistemic Trust]]
** E.g. [[The Therapist's Mentalizing Stance]] and [[General features of a "Mentalizing Stance"]]
*An ability to build interventions based on //who the client has epistemic trust with//
** E.g. developing or using a [[Team around the Worker]]
* An ability to balance worker intentions and client intentions in planned work
** E.g. see [[Active Planning]]
* An ability to work towards //developing help for the client as a system// rather than (just) as an individual dyadic relationship
!!Balancing the team and workers' attention (4 quadrants)
** Being able to set up team processes which support deliberate and explicit attention across the four quadrants of the [[AMBIT Wheel]]
!!4. Ability to apply mentalization to work with colleagues*
*An ability to draw on knowledge of mentalization to recognise that the mentalizing capacity of colleagues within a team (including oneself) is likely to fluctuate in response to anxiety, stress and other expected aspects of work with hard to reach young people (see [[Ripples in a Pond]]).
*An ability to draw on knowledge of attachment and mentalization to work towards creating a sense of safety within a team in order to facilitate mentalizing in oneself and others (see [[Secure Base]]).
*An ability to draw on knowledge of attachment theory to recognise the value of availability and responsiveness in work between colleagues in a team (see [[Attachment theory]]).
!!5. Ability to apply mentalization to work across agencies and see problems from multiple institutional standpoints*
*An ability to make sense of the behaviour of staff from other agencies in terms of understandable mental states and intentions of agents in that organisation (see [[Addressing Dis-integration]]).
*An ability to recognise that beliefs about the practice of other agencies is likely to be influenced by unbalanced feedback patterns about such agencies (see [[Dis-integrative processes in a Multi-Agency context]]).
*An ability to adopt a position of respect towards staff from other agencies and to demonstrate this by positive curiosity about their work with the young person (see [[Non-mentalizing, positioning and network problems]]).
*An ability to accept that different agencies may be required to prioritise different aspects of a young person’s needs and that these different priorities may create tensions within a network around a young person (see [[Mentalizing service barriers]]).
!!6. Ability to intervene in multiple domains*
*An ability to make sense of a young person's difficulties by considering the impact of these problems on many areas of his/her life and to recognise the way that these difficulties are likely to interact together (see [[Working in multiple domains]]).
*An ability to work with both individual and systemic difficulties in trying to improve the life chances of the young person (see [[SystemsTheory]]).
*An ability to engage with the wider community such as schools, colleges and youth services in working with the young person (see [[Working with the Social Ecology]]).
* An ability to apply basic systemic ideas and techniques to intervening in relationship problems both within the family and between the family members and people in the wider community (see [[Family Work]]).
*An ability to consider how wider systems, commissioning arrangements, service procedures and local policies impact on the work with young people and to aim to support such systems to operate in a more coherent way (see [[Addressing Dis-integration]]).
!!7. Ability to scaffold existing relationships to provide help.
*An ability to explore with the young person their experience of relationships with others in their network and to facilitate the young person in mentalizing both their own and others’ experiences of such relationships (see [[Relationship to help]]).
*An ability to be guided by the young person about who may be most helpful to them about their key problems independent of the person’s professional status or background training (see [[The AMBIT Pro-Gram]]).
*An ability to focus work on building capacity and availability in existing (and potentially long lasting) resiliencies identified in the young person’s social ecology (see [[Focussing on Strengths]]).
*An ability to actively support (by joining them at meetings etc) a young person’s engagement with more mainstream therapeutic, educational or social care/youth agencies (see [[Working in multiple domains]]).
*An ability and willingness (temporarily, and with due attention to professional boundaries) to step outside of formally defined roles in order to support the work of another agency - if doing so supports the establishment of improved working and more effective intervention in another functional domain (see [[Key Worker]] and [[Why intervene simultaneously in multiple domains?]]).
!!8. Ability to think together with colleagues*
*An ability to draw on knowledge about the high likelihood and impact of episodes of non-mentalizing in the worker doing work of this kind (see [[Features of UNsuccessful Mentalizing]] and [[Keyworker well-connected to wider team]]).
*An ability to apply mentalization in one’s interactions between colleagues within the team (see [[Work on the Self]] and [[Is Mentalizing just Reflective thinking?]]).
*An ability to use the ‘thinking together’ approach to consulting with a colleague in a team, as a way of ensuring that sense is made of the worker’s own feelings about a particular young person or clinical situation, and the possible impact of this upon the work. (see [[Thinking Together]]).
*An ability to respond to colleagues who seek help around a particular case in helping them to think together about the dilemmas around a particular young person or clinical situation (see [[Thinking Together]]).
*An ability to challenge colleagues where evidence of a non-mentalizing approach to the work is present, and to support them to regain their own mentalized explanations for the behaviours that they are working with (see [[Local Session 04: Working with your Team]]).
!!9. Ability to assess network functioning using a disintegration grid.*
*An ability to identify all key participants from the youth’s professional network who have an investment in the youth’s outcomes, including family members where appropriate and other formal and informal key stakeholders (see [[The AMBIT Pro-Gram]]).
*An ability to make sense of the behaviour of others in the network in terms of intentional mental states (e.g. to apply the same insistence upon mentalized explanations for behaviour in working with professional colleagues as in working with young people and their families) (see [[Addressing Dis-integration]]).
*An ability to work proactively to identify gaps (or dis-integrations) in the work of the multi-agency network, that might (mostly inadvertently) either diminish the effectiveness of the interventions by some parts of of the network, or damage the young person or family’s experience of contact with these various facets of “help” from the wider system by presenting them with conflicting or overwhelming demands (see [[Dis-integration grid]]).
*An ability to facilitate collaboration between professionals at all levels of the service system that takes into account professional beliefs about the nature of the young person’s difficulties, what may be helpful in addressing these problems, and beliefs about role responsibilities in a multi-agency system (see [[Addressing Dis-integration|Addressing Dis-integration]]).
*An ability to help each of the key agencies to identify desired outcomes or initial goals, and to use this information to set overall treatment goals (see [[Advice on setting Treatment Aims and Goals]]).
!!10. Ability to manualize specific local practice.*
*An ability to use the local web based version of the AMBIT manual in a fluent and confident way:
**To locate the manual via a browser (www.tiddlymanuals.com)
**To open it and orient oneself to the sections of the screen desktop
**To navigate it and find specific material via the search function, via the indexes, or by following links, references and topics/sub-topics in the “Show related information” panel.
**To use the “Snapshot” function in the manual in order to share a specific page or set of pages with a colleague
*An ability to draw on basic knowledge as to how the manual has been constructed and how a local version of it may be adapted to describe and develop solutions to local service challenges (see [[User Guide]]).
*An ability to engage in team discussion about important areas of practice with young people in order to develop a shared approach to a particular difficulty or situation that commonly arises with this client group (see [[Manualization]]).
*An ability to contribute into achieving a consensus approach to common clinical dilemmas based on team reflection and discussion and to manualize practice guidance from this (see [[Respect local practice and expertise]]).
*An ability to reflect with team colleagues on interactions with young people and/or professionals in the network and in a systematic way agreed within the team (e.g. discussion in a team meeting) in order to enable collective learning about effective practice (see [[Team Meetings]]).
*An ability to make use of the team wiki manual in order to ensure that clinical decision making is consistent with evidence based practice and the AMBIT model as applied to the specific local team (see [[User Guide]]).
** Advanced: attachment and mentalization to work towards creating a sense of safety within a team in order to facilitate mentalizing in oneself and others (see [[Secure Base]]).
----
See [[AMBIT Full Competency Framework]] for the extended list of competencies, and [[AMBIT Team Competencies]] for competencies relating to whole teams rather tan individuals.
----
!!DEVELOPING EVIDENCE ABOUT THESE COMPETENCIES
!!!!Relative Importance and Use of these competencies:
We asked 41 AMBIT practitioners at the AMBIT conference 2014 to give each competency a relative rating of its ''importance'' and its ''use in current practice''.
High scores indicate more importance/use (see [[Competency use and importance ratings]]).
This page has links to AMBIT Conference presentations made by a variety of teams and collaborators which took place during the early years of the development of AMBIT between 2013-2016.
!!2016
*See [[AMBIT Unconference 2016]]
!!2015
*Not videoed
!!2014
* [[AMBIT in an Adolescent MH team: struggles and successes - Griffiths, Duffy, Kennedy]]
* [[Sustaining an AMBIT approach in an acute adolescent in-patient setting - Whittick, Morrell, Fairbairn, Thulbourn and Millard]]
* [[Practical examples of sustaining the AMBIT approach - Jones, Jones and Schofield]]
* [[What do we mean when we say "That's (not) very AMBIT!" - Dickon Bevington]]
!!2013
* [[Building a Community of Practice - Dickon Bevington]]
* [[Learning organisation - is the concept useful in AMBIT? - Peter Fuggle]]
* [[Using AMBIT to Reduce In Patient Admissions - Sarah Harmon]]
* [[Manualizing a live issue - Garry Richardson and Heather Tovey]]
* [[AMBIT Across a Complex Array of CAMHS services - Gavin Cullen and Fiona Duffy]]
* [[Engaging a team in Outcomes Measurement - Liz Cracknell and Carol Evans]]
!!What is an AMBIT consultation day?
An AMBIT consultation is offered as standard to all teams enquiring about, or preparing for, AMBIT training, after the initial engagement call. The broad purpose of the consultation day is to reach a shared understanding with a team (or organisation) about whether embarking on AMBIT training will be useful to them and if so, what the training objectives might be.
The day will be facilitated by two trainers from the AMBIT Programme, one of whom will be a senior AMBIT trainer.
!!The format of the day
Depending on the size of the team or organisation, the consultation day may consist of either a half or full day.
A consultation day is comprised of the following elements:
* Exploration with the team/organisation around its core purpose, strengths and needs
* Exploration with the team about how it currently learns and develops
* Supporting the team to clarify the training objectives for an AMBIT training
* Providing a brief overview of AMBIT
* Providing information about the different training routes and implementation support packages available
!!Full day or half day?
*For teams who are seeking to embark upon a large-scale programme of training (e.g. one involving multiple teams within an area or organisation), the consultation day is most usefully undertaken in two halves. We recommend a morning session which includes key stakeholders or representatives from the different teams who will be the recipients of the training, followed by an afternoon session which includes frontline practitioners from these teams to ensure that the views of both are fully captured. The agenda of the sessions will be similar, with the intention that elements of the discussion from the morning (including the provisional training objectives agreed) can be shared and discussed with the frontline practitioners during the afternoon session in order to seek out and incorporate their views.
*Where training is being sought by an individual team, the consultation day can either be undertaken with a half-day or full-day session, according to the team’s preference. The full day will allow for a more in depth exploration of the above areas and a more detailed overview of the AMBIT framework.
This is the AMBIT Programme team at the AFNCCF
Using the yellow tags below you can find links to a whole series of Frequently Asked Questions about AMBIT in general, that have arisen in trainings or conferences over the past years. Below you will see that there are also FAQ's about the Training, and for Local Trainers.
This is a resource that will be built upon and we invite users of the manual to offer further suggestions about useful subjects for FAQs.
Click the button below to select a question you are interested in:
*<<tag [[AMBIT FAQs]]>>
*<<tag [[Training FAQs]]>>
*<<tag [[LOCAL trainers FAQs]]>>
!!Introduction
AMBIT training aims to provide team members with [[AMBIT Competencies covered in the Basic Training]], but as AMBIT is a framework for [[LEARNING at work]], so the full range of competencies is wider. Listed below is the full range of competencies that team's should aim to cover. See also [[AMBIT Team Competencies]] that cover the [[Core Features of AMBIT]].
!!~Self-AUDIT
A self-audit exercise is suggested with these competencies.
Rate yourself against each of the following 20 competencies according to the following scale, in order to direct further training:
__''Scoring:''__ ''0'' = Not confident, ''1'' = Becoming confident, ''2'' = Confident
!!PART A: KNOWLEDGE FOR AMBIT
!!!1. Knowledge of the theory of [[Mentalization]]*
*An ability to draw on knowledge about the nature of mentalizing (see [[Mentalization]])
*An ability to draw on knowledge about the developmental basis of processes of mentalization (see [[Secure Base]] and [[Marked mirroring]])
*An ability to recognise mentalizing and patterns of non-mentalizing in both self and others (see [[Implicit mentalization]]; [[Explicit mentalization]]; [[Teleological thinking]]; [[Pretend mode]] and [[Psychic equivalence]])
*An ability to draw on knowledge that the vulnerability to loss of mentalization leaves the young person exposed to more primitive modes of experiencing internal reality that, in turn, undermines the coherence of self-experience (see [[Concrete Mentalizing difficulties]])
!!!2. Knowledge of the AMBIT approach*
*An ability to draw on knowledge of the basic AMBIT framework (“core features”) summarised in the AMBIT wheel (see [[AMBIT Wheel]] and [[Core Features of AMBIT]]).
*An ability to describe the AMBIT stance and the principle of holding the balance between competing dilemmas that are represented in it (see [[The Worker's Mentalizing Stance]] and [[General features of a "Mentalizing Stance"]]).
*An ability to describe the four key practices in the AMBIT approach and to understand the relationship between the four practices as part of an integrated approach to effective intervention (see [[Working with your CLIENT]]; [[Working with your TEAM]];[[Working with your NETWORKS]];[[LEARNING at work]]).
*An ability to recognise the limitations of the relative lack of evidence for the AMBIT approach for hard to reach young people (see [[Respect for Evidence]] and [[Is AMBIT evidence based?]]).
!!PART B: AMBIT PRACTICE
!!!3. Ability to use mentalization in their work with young people and their carers*
*An ability to draw on knowledge that the intervention aims at increasing the young person’s capacity to mentalize (see [[Highlighting and reinforcing Positive Mentalizing]]).
*An ability to draw on knowledge that AMBIT formulates some of the mental vulnerabilities associated with hard to reach young people as resulting from the fragility of mentalization in the context of attachment relationships (see [[Formulation and Treatment Aims]]).
*An ability to draw on knowledge of the developmental factors and experiences that are typically associated with a vulnerability to loss of mentalization (see [[Developmental Considerations]]).
*An ability to adopt the mentalizing stance in working with young people (see [[The Worker's Mentalizing Stance]] and [[General features of a "Mentalizing Stance"]]).
*An ability to use the mentalizing loop in working with young people and their carers (see [[Mentalizing Loop]]).
!!!4. Ability to apply mentalization to work with colleagues*
*An ability to draw on knowledge of mentalization to recognise that the mentalizing capacity of colleagues within a team (including oneself) is likely to fluctuate in response to anxiety, stress and other expected aspects of work with hard to reach young people (see [[Ripples in a Pond]]).
*An ability to draw on knowledge of attachment and mentalization to work towards creating a sense of safety within a team in order to facilitate mentalizing in oneself and others (see [[Secure Base]]).
*An ability to draw on knowledge of attachment theory to recognise the value of availability and responsiveness in work between colleagues in a team (see [[Attachment theory]]).
!!!5. Ability to apply mentalization to work across agencies and see problems from multiple institutional standpoints*
*An ability to make sense of the behaviour of staff from other agencies in terms of understandable mental states and intentions of agents in that organisation (see [[Addressing Dis-integration]]).
*An ability to recognise that beliefs about the practice of other agencies is likely to be influenced by unbalanced feedback patterns about such agencies (see [[Dis-integrative processes in a Multi-Agency context]]).
*An ability to adopt a position of respect towards staff from other agencies and to demonstrate this by positive curiosity about their work with the young person (see [[Non-mentalizing, positioning and network problems]]).
*An ability to accept that different agencies may be required to prioritise different aspects of a young person’s needs and that these different priorities may create tensions within a network around a young person (see [[Mentalizing service barriers]]).
!!!6. Ability to intervene in multiple domains*
*An ability to make sense of a young person's difficulties by considering the impact of these problems on many areas of his/her life and to recognise the way that these difficulties are likely to interact together (see [[Working in multiple domains]]).
*An ability to work with both individual and systemic difficulties in trying to improve the life chances of the young person (see [[SystemsTheory]]).
*An ability to engage with the wider community such as schools, colleges and youth services in working with the young person (see [[Working with the Social Ecology]]).
* An ability to apply basic systemic ideas and techniques to intervening in relationship problems both within the family and between the family members and people in the wider community (see [[Family Work]]).
*An ability to consider how wider systems, commissioning arrangements, service procedures and local policies impact on the work with young people and to aim to support such systems to operate in a more coherent way (see [[Addressing Dis-integration]]).
!!!7. Ability to scaffold existing relationships to provide help.
*An ability to explore with the young person their experience of relationships with others in their network and to facilitate the young person in mentalizing both their own and others’ experiences of such relationships (see [[Relationship to help]]).
*An ability to be guided by the young person about who may be most helpful to them about their key problems independent of the person’s professional status or background training (see [[The AMBIT Pro-Gram]]).
*An ability to focus work on building capacity and availability in existing (and potentially long lasting) resiliencies identified in the young person’s social ecology (see [[Focussing on Strengths]]).
*An ability to actively support (by joining them at meetings etc) a young person’s engagement with more mainstream therapeutic, educational or social care/youth agencies (see [[Working in multiple domains]]).
*An ability and willingness (temporarily, and with due attention to professional boundaries) to step outside of formally defined roles in order to support the work of another agency - if doing so supports the establishment of improved working and more effective intervention in another functional domain (see [[Key Worker]] and [[Why intervene simultaneously in multiple domains?]]).
!!!8. Ability to think together with colleagues*
*An ability to draw on knowledge about the high likelihood and impact of episodes of non-mentalizing in the worker doing work of this kind (see [[Features of UNsuccessful Mentalizing]] and [[Keyworker well-connected to wider team]]).
*An ability to apply mentalization in one’s interactions between colleagues within the team (see [[Work on the Self]] and [[Is Mentalizing just Reflective thinking?]]).
*An ability to use the ‘thinking together’ approach to consulting with a colleague in a team, as a way of ensuring that sense is made of the worker’s own feelings about a particular young person or clinical situation, and the possible impact of this upon the work. (see [[Thinking Together]]).
*An ability to respond to colleagues who seek help around a particular case in helping them to think together about the dilemmas around a particular young person or clinical situation (see [[Thinking Together]]).
*An ability to challenge colleagues where evidence of a non-mentalizing approach to the work is present, and to support them to regain their own mentalized explanations for the behaviours that they are working with (see [[Local Session 04: Working with your Team]]).
!!!9. Ability to assess network functioning using a disintegration grid.*
*An ability to identify all key participants from the youth’s professional network who have an investment in the youth’s outcomes, including family members where appropriate and other formal and informal key stakeholders (see [[The AMBIT Pro-Gram]]).
*An ability to make sense of the behaviour of others in the network in terms of intentional mental states (e.g. to apply the same insistence upon mentalized explanations for behaviour in working with professional colleagues as in working with young people and their families) (see [[Addressing Dis-integration]]).
*An ability to work proactively to identify gaps (or dis-integrations) in the work of the multi-agency network, that might (mostly inadvertently) either diminish the effectiveness of the interventions by some parts of of the network, or damage the young person or family’s experience of contact with these various facets of “help” from the wider system by presenting them with conflicting or overwhelming demands (see [[Dis-integration grid]]).
*An ability to facilitate collaboration between professionals at all levels of the service system that takes into account professional beliefs about the nature of the young person’s difficulties, what may be helpful in addressing these problems, and beliefs about role responsibilities in a multi-agency system (see [[Addressing Dis-integration]]).
*An ability to help each of the key agencies to identify desired outcomes or initial goals, and to use this information to set overall treatment goals (see [[Advice on setting Treatment Aims and Goals]]).
!!!10. Ability to manualize specific local practice.*
*An ability to use the local web based version of the AMBIT manual in a fluent and confident way:
**To locate the manual via a browser (www.tiddlymanuals.com)
**To open it and orient oneself to the sections of the screen desktop
**To navigate it and find specific material via the search function, via the indexes, or by following links, references and topics/sub-topics in the “Show related information” panel.
**To use the “Snapshot” function in the manual in order to share a specific page or set of pages with a colleague.
*An ability to draw on basic knowledge as to how the manual has been constructed and how a local version of it may be adapted to describe and develop solutions to local service challenges.
*An ability to engage in team discussion about important areas of practice with young people in order to develop a shared approach to a particular difficulty or situation that commonly arises with this client group (see [[Manualization]]).
*An ability to contribute into achieving a consensus approach to common clinical dilemmas based on team reflection and discussion and to manualize practice guidance from this (see [[Respect local practice and expertise]]).
*An ability to reflect with team colleagues on interactions with young people and/or professionals in the network and in a systematic way agreed within the team (e.g. discussion in a team meeting) in order to enable collective learning about effective practice (see [[Team Meetings]]).
*An ability to make use of the team wiki manual in order to ensure that clinical decision making is consistent with evidence based practice and the AMBIT model as applied to the specific local team (see [[User Guide]]).
!!PART C: ADVANCED COMPETENCIES
!!!11. Knowledge of the common difficulties of under-served, (or ‘hard to reach’) young people and their families/carers across [[multiple domains|Working in multiple domains]].
*An ability to draw on knowledge of the psychological and interpersonal difficulties experienced by young people and family members/carers with multiple mental health, educational and social needs who are not seeking help for such problems (‘[[Hard to reach]]’ or Under-Served).
*An ability to draw on knowledge of the multiple risks factors ([[Complexity]]) that influence hard to reach young people (e.g. at the level of the individual, family/carers, peer, school and community).
*An ability to draw on knowledge of [[Family]] phenomena commonly associated with the multiple mental health needs of a ‘hard to reach’ young person (e.g. disorganised [[Attachment]] patterns, inconsistent parenting style, negative marital interactions, psychiatric disorders (Diagnoses), [[Physical Health matters]]), Educational needs (see [[Educational-Vocational Training]]), the [[SocialEcology]] (such as social service entitlements and economic factors (e.g. poverty) in a young person’s life - see [[Social-Ecological Work]] and [[SubsistenceSupport]].
*An ability to reflect on the lack of [[Evidence]] associated with psychological therapies associated with this complex and often co morbid group
*An ability to draw on knowledge of the long term psychological, social and economic consequences of social exclusion such dropping-out of school, college and work and/or a history of offending (e.g. reduced wages, limited career opportunities and housing restrictions) and its links to [[Complexity]] and the nature of [[Hard to reach]] populations.
*An ability to draw on knowledge about the general (and specific local) approach to provision of services for such young people – and the psychological impact of multi-agency involvement in “complex” or “multi-problem” cases. See [[Addressing Dis-integration]].
!!!12. Knowledge of Attachment theory and help seeking as a way of making sense of 'Hard to reach' young people.
*An ability to draw on knowledge of [[Attachment theory]] and the processes involved in help seeking, as well as the implications of lack of help seeking (or atypical forms of help-seeking) for young people whose [[Relationship to help]] may contribute to them being described as [[Hard to reach]].
*An ability to draw on knowledge that a [[Mentalization]] based approach is grounded in [[Attachment theory]].
*An ability to adapt methods of practice to take into account the young person’s previous experiences of seeking help from adults (see [[Contingencies]], as opposed to [[Non-contingent]] responses).
!!!13. Knowledge of systemic principles that inform the AMBIT approach
*An ability to draw on knowledge of [[SystemsTheory]] - that whatever affects one member of a system (e.g. a family, school or multi-agency network) may affect all other members.
*An ability to draw on knowledge that patterns of interaction within and outside a group may affect each member of that group (see [[Positioning Theory]]).
*An ability to draw on knowledge that patterns of interaction between professionals working with a young person may affect each member of such a network Dis-integration.
!!!14. Ability to engage with young people and their social context
*An ability to recognise the factors that inhibit [[Engagement]] with help for young people and to adapt the intervention to accommodate to these factors (see [[Relationship to help]] and the [[Therapeutic Bargain]]).
*An ability to identify trusted adults in the network around the young person (either family or professionals) and, where appropriate, to work through such adults in order to enhance the young person’s capacity to develop trust in others around key issues in his/her life (see StrengthsResiliencies and [[Scaffolding existing relationships]].)
*An ability to carry out a process of gradual [[Engagement]] with a young person through the use of persistence that takes into account a formulation of the young person’s difficulty in responding to offers of help.
*An ability to promote engagement by employing core clinical skills ([[Engagement techniques]] including ordinary skills such as empathy, warmth, reflective listening, reframing, flexibility and instilling hope for change).
*An ability to draw on knowledge that engagement is a process over time rather than a single event and that a young person’s behaviour (e.g. contacting the service when upset or angry) may indicate (through the lens of [[Attachment theory]]) positive shifts in [[Engagement]] as much as what they say about the relationship (e.g. you’re all rubbish).
!!!15. Ability to complete an AIM assessment.*
*An ability to draw on knowledge about the value of carrying an assessment of different [[Domains]] of a young person’s life (see [[Working in multiple domains]]).
*An ability to complete an [[AIM]] assessment of a young person either with a member of the network who knows the young person well or a family member as part of an initial assessment of the young person’s needs.
*An ability to complete an [[AIM]] assessment with the young person either using the ([[AIM questionnaire|AIM questionnaire - interactive version]]) or by using the [[AIM Cards]] as a method of understanding the young person’s perspective on his life and problems.
*An ability to score the AIM assessment and to use the [[AIM]] in the AMBIT manual to generate suggested interventions for that specific range of presenting problems indicated from that assessment.
*An ability to share the results of an AIM assessment with the young person and to construct a shared understanding of its meaning.
!!!16. Ability to develop a mentalized formulation of the young person’s difficulties
*An ability to summarise information about a young person from a range of different sources in a concise and coherent manner. See [[Formulation and Treatment Aims]]. This builds on the idea of providing //narrative continuity// (one of the [[Features of Successful Mentalizing]]).
*An ability to reflect on the [[Formulation and Treatment Aims]] and to develop a description of the young person that takes account of their likely mental states and intentionality.
*An ability to share this mentalized [[Formulation and Treatment Aims]] with the young person in a manner which supports the capacity of the young person’s mentalizing and does not raise anxiety and/or affect (for instance see [[Assessment for SUD-Rx - Giving Feedback]])
!!!17. Ability to develop a shared care plan with the young person
*An ability to be curious about the young person’s ideas as to what would make his/her life better and, where possible, develop these into goals for the work together (see [[The Inquisitive Stance]] as part of [[The Worker's Mentalizing Stance]])
*An ability to process information gleaned from, and about, the young person and their network, using peer/supervisory support where indicated, and to draw up a preliminary ‘roadmap’ for the therapeutic work that might be possible or necessary (see [[Active Planning]]).
*An ability to broadcast one’s own therapeutic intentions ([[Broadcasting Intentions]]), concerns, non-negotiables, hopes, etc, tentatively, as a “work in progress”, inviting authentic collaboration to develop a care plan that takes account of the young person’s beliefs’ about what will be helpful.
*An ability to communicate ideas about evidence based interventions (see [[Respect for Evidence]]) in ordinary language to a young person in order to discuss what is likely to be helpful , and why.
*An ability to liaise with the young person about how the agreed care plan is communicated with family members and/or the professional network - see [[Active Planning]].
!!!18. Ability to support the measurement of individual and team clinical outcomes
*An ability to recognise the importance of remaining curious as to whether a particular method of work with a young person is be experienced as helpful to them - see
[[Evaluating outcomes]] and [[Respect for Evidence]]
*An ability to support and contribute to the development of systematic methods within a team to evaluating whether young people are experiencing the service as beneficial to their problems.
*An ability to focus on continued evaluation of outcome from multiple perspectives, ensuring that both the young person and the AMBIT worker communicate their respective viewpoints and consider the viewpoint of the other.
!!!19. Ability to identify with, and access support from, the wider AMBIT Community of Practice.
*An understanding of the ideas behind the [[Community of Practice]] that AMBIT seeks to develop and support.
* An understanding of the way that the AMBIT tiddlymanual has “layers of authorship” – with all local versions sharing a common core, but being empowered to add to or overwrite this content in their own local version (see [[User Guide]]).
*An ability to locate links to other local versions of the AMBIT manual via the [[www.tiddlymanuals.com|http://www.tiddlymanuals.com]] signposting site
*An understanding of the “[[OpenSource]]” aspects of the development of AMBIT
!!!!Features not currently working
*//An ability to use the manual to see updates on the manualizing work by other AMBIT teams in the AMBIT Community of Practice//.
*//An ability to identify whether a page in the manual exists in different versions in other local manuals, and to compare those two versions.//
!!!20. Ability to reflect on one's own, and the team's fidelity to AMBIT
*An ability to access and use the APrAT self audit form in relation to a specific case.
*An ability to use this [[AMBIT Competencies]] framework to evaluate one's own further training needs.
*An ability to audit the team's practice against the [[Core Features of AMBIT]]
*An ability to accept the inevitability of variation in outcomes in one's work with young people and families/carers.
*Demonstrate an openness to accept and learn from outcomes that have proven less successful than intended (See [[LEARNING at work]]).
!!DEVELOPING EVIDENCE ABOUT THE COMPETENCIES
!!!!Relative Importance and Use of these competencies:
We asked 41 AMBIT practitioners at the AMBIT conference 2014 to give each competency a relative rating of its ''importance'' and its ''use in current practice''.
High scores indicate more importance/use (see [[Competency use and importance ratings]]).
The idea is to construct an interview framework for exploring the impact of AMBIT on the work of your team?
The intention is to avoid creating a sense of defensiveness about not having done things properly and to create a space where the impact of the training can be reflected on - both the presence and absence of impact.
What lines of enquiry should we explore?
The image of a river delta where AMBIT might be one stream, that it contributes to the river or that it just dried up!!
Open questions
More specific enquiries
!!!Introduction
This audit tool/measure was designed as a way of asking AMBIT trained teams to self evaluate the degree to which their general practice was influenced by AMBIT principles and practices. It can be completed by a team manager or by the team as a whole and takes about five minutes to complete. We do not know the reliability or validity of these ratings but the measure was completed by a range of AMBIT trained teams who found the measure very acceptable to use. So it has some indication of face validity and made sense to teams who had been trained in AMBIT.
The measure has four sections that focus on
*The teams experience of AMBIT training
*The use of mentalizing
*AMBIT methods
*AMBIT as learning
!!!Section 1: AMBIT training
Each section has five items. For the Training section, each item is rated as to whether this aspect of training has taken place. For example, has the team completed a four day AMBIT training? This would be rated as Yes or No which would have a score of 1 (Yes) or 0 (No). So a team that has completed all five aspects of AMBIT training would have a total score of 5 for that section.
The five items are as follows:-
#team has had some workshops on AMBIT
#team has completed four day training
#team trains its own staff
#team trains other teams in its own organisation
#team trains other teams in other agencies
!!! Section 2: The use of mentalizing
For sections 2, 3 and 4, each item is rated on a three point scale.
#Hardly at all - less than 10% of the time.
#Occasionally, not regularly - less than 50% of the time.
#Most of the time - more than 50% of the time.
The five items are as follows:-
#Direct client interventions are generally informed by mentalizing
#Individual and/or group supervision are generally informed by mentalizing.
#Work on client networks is generally informed by mentalizing
#Informal worker conversations are generally informed by mentalizing.
#The team has a shared language informed by AMBIT.
The total maximum score for this section would be 15. Higher scores indicate a higher level of influence of AMBIT on general practice of the team.
!!!Section 3:The use of AMBIT methods
Each item is rated on the three point scale. The total score for this section is 15. Higher scores indicate greater use of AMBIT methods.
The five items are as follows:-
#The service works to scaffold relationships in the client's network.
#The team uses the theory of epistemic trust in its work either with clients, teams or networks.
#The team uses thinking together in their work in individual or in group meetings.
#The team actively considers Client Networks either by using a Pro-gram or a disintegration grid or by other methods.
#The team uses Active Planning in its work.
!!!Section 4: AMBIT as learning
Each item is rated on the same three point scale. The total score for this section is 15. Higher scores indicate team has more team learning practice.
#The team maintains connectedness between team members either by check-ins or by a team culture of shared responsibility or by other means.
#The team discusses its own methods of practice in a structured way.
#The team records shared learning about its practice in a wiki manual or by other means.
#Client needs are assessed using a mentalizing approach (e.g. AIM cards, mentalized formulation or other methods)
#Client outcomes are routinely collected and help the team to understand changes in the clients life.
!!!Interpretation of scores
The total possible score for this measure is 50 and the lowest possible score is 15. There are no threshold to determine whether a team is sufficiently AMBIT informed. The value of the measure is that is may be possible to monitor change in team practice over time or to identify gaps in current practice that may deserve reflection and possible practice development or change.
!!!Practical aspects
The measure has been formatted in Microsoft Forms and can be found here (this is currently being sorted out as to the best link for this).
<iframe width="640px" height="480px" src="https://forms.office.com/Pages/ResponsePage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUOEpHN0k2ODVZNEQ4M1M3OU5ZV1o2QkNPMiQlQCN0PWcu&embed=true" frameborder="0" marginwidth="0" marginheight="0" style="border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
The following are useful pages in the manual - to look through as part of your initial training, but also to refer to in the future.
!!1. AMBIT Training and Implementation in general
* [[AMBIT Training]], especially
** [[TrainingCore]]
* [[Implementation Science]]
** The [[Implementation Team]]
** The [[Implementation Plan]]
!!2. How to help sustain AMBIT principles in the team
* [[SUSTAIN best practice]]
!!3. Holding a manualising conversation/meeting in your team.
* [[Manualization]] is the basic page with links from it that covers everything, including how to manualize.
!!4. Technical skills for using the manual
* [[User Guide]] - the general page on USING THE MANUAL - this includes material on the best techniques for reading and searching content, as well as technical help and lots more.
* [[How to edit - Videos]]
!!5. How to increase access of the manual to team members.
* Do check out the incredibly useful [[Create shareable weblinks to specific manual page(s)]] button to gather specific links to useful pages that you can email to colleagues.
* Make the manual your Browser HOMEPAGE
* Organisational support for getting the manual to work in a big IT system such as an NHS Trust: [[Technical aspects of how to set up wiki manuals]]
!!6. How to run a team training event using the manual
* [[Planning a training event in your team]]
* [[Suggested Team Training Sessions]]
* [[Training exercises]]
!!7. How to develop and use the AMBIT Community of Practice
* See the material on [[Community of Practice]]
* See [[Other team's AMBIT manuals]]
* Consider the use of QUID PRO QUO arrangements between teams, so that external "consultants" can swap between teams to observe discussions and provide mentalizing reflections - much like the [[Fishbowl discussion]] exercises we use in training.
This page is a tag which links together all the tiddlers (pages) relevant to the AMBIT lead role.
The AMBIT approach does not prescribe on the organisational structure for a team using AMBIT. It assumes their will be a variety of leadership arrangements within different teams. However, AMBIT practice is unlikely to be sustained without one or preferably two people within the team taking on the role of sustaining the skills and practice of AMBIT - which we refer to as the [[AMBIT Lead]] and the [[Implementation Team]].
See also:
* [[The AMBIT Lead - role and responsibilities]]
* [[AMBIT LEADS - useful training pages]]
----
!!Sub Pages
Below are the pages that are tagged with 'AMBIT Lead':
<<list-links "[tag[AMBIT Lead]]">>
!!Work in Progress
This is a system that is currently (June 2015) being brought in to AMBIT training - but is not yet fully operational.
!!What is this?
* A peer-to-peer support system for a pair of [[AMBIT Lead]]s in one team to connect with a pair in another team.
* This relationship is established during the AMBIT Lead training
* Allocation of AMBIT peer-to-peer partnerships:
** Peers are allocated by the AMBIT training project team before the AMBIT Basic Training Day 3 (AMBIT Leads)
** The criteria are variable but will include similarity of work, geographical proximity, etc
* We emphasise that ''this is a WORK relationship, not a social relationship''!
** There is no block on the formation of alternative or additional peer-to-peer relationships.
!!What is the intention?
* To keep AMBIT on the agenda of a local team
* To create an opportunity for [[AMBIT Lead]]s to co-train their own team alongside a visiting [[AMBIT Lead]] (or [[AMBIT Local Facilitators]]) from another team
* To increase the confidence and competence of the [[AMBIT Lead]]s
* To create teams that are not only [[Well connected|Keyworker well-connected to wider team]] internally, but externally, too - across the the AMBIT [[Community of Practice]].
!!How might it work?
* Introduction at the AMBIT Basic Training Day 3 (AMBIT Leads)
!!Barriers for this to work
* It could be exposing for an AMBIT Lead from one team to talk to the AMBIT Lead from another team about //what is making this work hard//.
!!!!//Page in development//
<a class="tc-float-right">[img width= 200 [facil.PNG]]</a>
!!!This page has 2 purposes:
#To gather together resources, ideas and tips to support local facilitators in implementing and developing AMBIT within their own services.
#A guide for the AMBIT lead trainers from the Anna Freud Centre to support implementation before, during and after a local facilitator training.
!!Who are the Local Facilitators?
Local Facilitators are local team members who will facilitate training sessions in their local teams/services.
Local facilitators receive training and ongoing support in this role and will have attended the
[[Local Facilitator training|Local Facilitator Training (LFT)- training model]] (previously known as AMBIT Train The Trainer model).
!! Helping local facilitators to connect and work together
Sometimes there are a number of workers from different services and agencies who come together to train as local facilitators. This can bring a valuable opportunity to develop relationships (i.e. integration) across networks. The local facilitators can get to know each other and each others' services throughout the training process. This brings the potential to work jointly and help train each others' services afterwards.
''In our experience local facilitators from different service contexts working together can be a really useful approach. For example, when introducing aspects of AMBIT back to their own teams, having a 'visiting co-facilitator' from another team can bring different perspectives and knowledge and can help build relationships across services.''
<a class="tc-float-right">[img width= 200 [map.PNG]]</a>
!!Mapping out who is where
Sometimes the network of people attending local facilitator training is quite complex and needs 'mapping out' (this may need to happen at an earlier point in the training or at the consultation day).
Mapping helps to begin planning how people might stay connected and work together after the training as well as who might work with who through some of the group exercises in the training.
This kind of 'mapping the system' could happen in different ways depending on the needs/goals of the services. This would need to be discussed with commissioners attending to think about their ideas/hopes for developing AMBIT going forward across systems.
''Some ways to do 'mapping' are:''
* AMBIT lead trainers set up a physical sculpt with the local facilitators, whereby people can position themselves in relation to:
#Who works closer to whom (//geographically//) - This can help guide who might most easily connect up and work jointly in implementation
#Service areas/cross over of client groups - i.e. teams who do similar work in which it would be beneficial to join up to train e.g. a social care team and CAMHS team both whom see many of the same clients
#Other ways of mapping?
!!!Local facilitators staying well connected after the training
*A Google Map with pins dropped for each of the local facilitators work base. This can be put in the local manual (this idea was developed by a member of the Lancashire cohort 4)
*Local facilitators using Whattsapp groups to organise trainings together, develop plans and support each other
*Local facilitator meetings- more formal/structured meetings bringing together the local facilitators to make plans and support each other with the training
*A launch day- bringing together as many of the local facilitators as possible with commissioners and managers to plan the 'vision' going forward, review support and next steps, and to learn together from the process of implementation so far. This would be supported by some of the training team from the Anna Freud Centre with a view to manualizing these areas as a larger group
!!!Other support for local facilitators
*[[AMBIT supervision provided by the AMBIT Programme]] (from the Anna Freud Centre AMBIT training team) - this would need to be planned within the network of local facilitators around how they might best use it, in what groups and format etc. //NB this might be a useful topic to plan at a local facilitator day or a 'launch day'//
*Further support in using the wiki manual - the AMBIT team offer support/demonstrations/workshops on using the manual and manualizing
*Support in helping you measure and 'get curious about change' for your client groups - Teams can join an AMBIT project using the AIM measure to learn about outcomes in your service and explore how these can be used to develop practice
----
!Tools for Local Facilitators
!!Below is a list of resources/links and info for local facilitators:
!!!0. ...Before anything else...
As facilitator of a [[Mentalization]]-based approach, YOU are the main resource, and YOUR local expertise, and YOUR being known (with some [[Epistemic Trust]]) by your colleagues, are your key tools.
''What this means'' is that your first role/duty in facilitating for your team is to work at ''mentalizing them'' (their experience of their work, their hopes, fears, beliefs, intentions regarding this 'AMBIT stuff') - this is how we help our clients and open the minds of our clients to whatever help we might have for them... ''it is no different for our colleagues/peers/trainees/etc...'' This is much more important than remembering the precise terms for the three forms of non-mentalizing, or whether to spell mentalize with a 'z' or an 's'!
!!!1. Training Resources
The page [[Training Resources]] offers a collection of the AMBIT training resources, including training slides, all videos, and links to all our training exercises.
!!!2. Training plans
on key AMBIT topics - these are simple guides which can be adapted and developed to fit your local contexts:
** [[Local Session 01: What is AMBIT?]]
**[[Local Session 02: What is AMBIT training for?]]
**[[Local Session 03: Mentalization]]
**[[Local Session 04: Working with your Team]]
**[[Local Session 05: Working with your Networks]]
**[[Local Session 06: Working with your Client pt. 1 (Mentalizing stance)]]
**[[Local Session 07: Working with your Client pt.2 (Hard to reach)]]
** [[Local Session 08: Review (1) and Auditing Team Practices]]
** [[Local Session 09: Working with your Client pt.3 (Outcomes)]]
** [[Local Session 10: Review (2) and Top-up plans]]
** [[Local Session 11: Making a real difference - Implementation Science]]
!!! [[AMBIT Service Evaluation Questionnaire (ASEQ)]]
A questionnaire which asks workers about their views on how mentalizing is applied across the four AMBIT quadrants in their service/work. It can be used to plan areas that might be beneficial for future training and to measure change after training.
!!![[AMBIT Implementation Questionnaire|AMBIT implementation questionnaire.pdf]]
A tool to measure which aspects of AMBIT practice are being used by workers
Below is a template setting out a timeframe for stages of implementation over the first 6 months for local facilitators.
<<link-doc "Implementation Template" "https://drive.google.com/open?id=1YtWLG5DLiw237xcMVkB1JZGJoezRTKnB">>
!!Other tips
* In our experience it has been useful for local facilitators to begin integrating parts of AMBIT relevant to them in their own practice before training others
* Starting training in small manageable bits rather than attempting to 'roll out long blocks of training' at first can help to build confidence as facilitators and develop curiosity within teams....
*Introducing one or two ideas in your own team in small 'bite size chunks'- thinking about the aspects of AMBIT that might be most relevant or interesting to your own teams first
See [[Overcoming barriers to implementation|AMBIT Local Trainer: overcoming barriers to effective implementation]]
for information about common barriers to implementation and ideas to address these. Additionally, click the yellow tag to see a drop dow list of <<tag [[LOCAL trainers FAQs]]>>.
!Task - define a shared problem
!!1. Dealing with a ''//lack of enthusiasm//'' in team members
* Acknowledging the inertia that political situations/funding/job insecurity etc tend to bring.
* Risk of disappointment if early sessions are seen as "falling flat"
* Moving from Quick Fix to patient work towards a longer term goal
!!!Ideas
* Moving from Quick Fix to Quick Wins - clarifying clear objectives //that make sense to the team// early on
** "Doing AMBIT" is ''NOT'' an objective! Avoid connecting outcomes to "doing AMBIT" - stick with benefits for clients... and yet to avoid making outcomes focus into a BURDEN
** MAYBE having staff feeling more enthusiastic about the work is an OUTCOME in itself?
*** Playfulness - the play of ideas
**** //"Suivrez la Juissance!"// (follow the joy/juice!) - Lacan
*** The capacity of the team to EXPLORE together
*** To ACCEPT the stressfulness of the work we do, including thinking about new ways of working together.
**** //"Making the best of an impossible job"// - Bion
* Think about what might help members of this team feel SAFE enough to do this work, or unsafe in ways that inhibit such exploration?
* Team's capacity to use [[Mentalization]] for itself will likely have an impact on how successful it is in working with young people.
!!2. Risk that ''//we are perceived as dangerous "agents of change"//''
** Implicit sense of a hierarchy ("you went off to London")
** Getting into fights about control/letting go
** Telling team they are "doing it wrong"
** that "you are more equal than we are"
!!3. Concerns about the ''//dependence upon specific person (me)//''
* That it's "//up to you to DO AMBIT TO THE TEAM//"!
** Need to make ways for this to be a shared enterprise
** Creating curiosity to listen
!!4. ''//TIME and other PRACTICAL concerns//''
* Avoid this being an ADDITIONAL BURDEN,
* Avoid a focus on "WHAT" (else) we should be doing, and rather for this to be about "HOW" we do what we already do.
!!5.''We are trying to train "old hands"''
* Our "trainees" know all the tricks about trying to implement change in behaviours!
* Keep our practice and methods transparent ([[Broadcasting Intentions]])
!Principles/Resources
* Define our [[AMBIT]] - where can we expect to have influence?
** We have control over what we communicate about our work
** We have the capacity to (make an effort to) mentalize our work colleagues
* We have existing relationships within these teams
* ''"If isn't broken, don't fix it"'':
** There are probably things //this team, here// does NOT need any training on
* ''Openness'':
** Supporting conditions for a team to recognise that not all we do is crowned with success all the time
** This is a policy agenda - engaging in dialogue about which of our policies address our needs, and which need improvement.
!Ideas
* Offering feedback on our experience first, rather than unfolding an "agenda for change" ([[Broadcasting Intentions]])
* Inviting hopes and concerns from the team - keep it snappy!
* What are the things this team does very well, that any training must NOT BREAK!
* Creating an initial schedule with the team
* Encourage/foster "Yes, AND!" responses, rather than Yes, BUT"
!Measures of effective change
* How would you know this had made a positive difference?
** How would the team define critical positive change?
** See material on [[Implementation Science]]
** Consider your [[Implementation Plan]]
** Recruit your [[Implementation Team]]
<<list-links "[!is[system]!is[image]sort[]]">>
!!The Top-Bar menu for the AMBIT Manual:
The ''Top Bar Menu'' (pictured below) is your main entrance to all the ''content'':
<center>{{AMBIT top-bar.png}}</center>
|There is also a [[SideBar]] to the right (or in mobile phone versions this is positioned below the top-bar menu); this menu offers different ways of ''seeing what pages you currently have open, and sorting, searching, saving existing (or importing new) content''. It can be folded out of view if you don't want it to clutter your view.|
!!!The Top Bar contents are listed below:
Click on the arrows to the left hand side of each item, to reveal the dropdown menus
!!Home
<div class="tc-table-of-contents">
<<toc-selective-expandable 'HomeContents'>>
</div>
!!About
<div class="tc-table-of-contents">
<<toc-selective-expandable 'AboutContents'>>
</div>
!!Using the Manual
<div class="tc-table-of-contents">
<<toc-selective-expandable 'UsingTheManualContents'>>
</div>
!!Community
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Community'>>
</div>
!!AIM
<div class="tc-table-of-contents">
<<toc-selective-expandable 'AIMmenu'>>
</div>
!!Search bar
[[Search Bar]]
!![[Log in]]/Cloud icon
Once you are logged in the [[Log in]] ''phrase'' will automatically be replaced by a Cloud icon.
[img[TopCloudIcon.png]]
//You only need to be logged in if you want to edit content// - you can see everything without logging in, as this is an [[OpenSource]] resource. This cloud icon (there is another one on the [[SideBar]]) shows (a) that you are logged in, and (b) the status of your wiki's synchronisation with the web (if you hover over it a tick confirms that the wiki is synchronised - this is only relevant if you are editing content. You can edit content even if you offline, and the wiki should synchronise when it next connects to the internet, but only if the webpage )
!!!This page collects together measures that are being developed by AMBIT influenced teams or the AMBIT team at the Anna Freud Centre.
The idea is that they measure aspects of team, client, learning or network functioning
* The [[AIM]] has recently been updated (August 2021) to address experiences of power and control.
*The [[NET-AIM-Q|NET-Aim-Q]] was developed by Dr Janne Walløe Vilmar & Dr Stefan Lock Jensen in [[Regions Sjaelland,Denmark|https://manuals.annafreud.org/ambit-denmark/index.html]]. The aim of the measure is to create an ongoing focus on the quality of network meetings, encouraging mentalizied cooperative meetings
*[[The NET-STAT-Q|NET-Stat-Q]] was developed by Dr Janne Walløe Vilmar & Dr Stefan Lock Jensen in [[Regions Sjaelland, Denmark|https://manuals.annafreud.org/ambit-denmark/index.html]]. This measure is an extension of the NET-Aim-Q
*The ''AMBIT Relationship to Help Questionnaire'' ([[ARHQ]]) is hardly an outcome measure, strictly speaking, but it could conceivably be used as such. It relates to the [[Client's AMBIT Wheel]] and offers 8 questions to probe the client's relationship to help: what work are they doing in relation to their self, to working with help, to making that "help" helpful, and to learning about what works for them
*In AMBIT we are interested in [[recruiting service users to take part in the process of designing outcome measures|Involving young people in designing outcomes]] and shaping how we might use them in more helpful ways. Please see the CORC website who are currently working closely with young champions around the theme of outcome measures. CORC have been producing information and gathering feedback from young people around how we can make outcome measures more user friendly and helpful. For more on this see [[here|https://www.corc.uk.net/for-young-people/]]
*in 2023, the AMBIT team at Anna Freud developed an audit tool called the ''AMBIT Informed Team Practice measure''. The psychometric properties of this measure are unknown and because of this we call it an audit tool. The purpose of this audit tool is for teams to self assess the degree to which their practice is informed by the AMBIT approach. It is a very short self assessment questionnaire and more details of this measure can be found at [[AMBIT Informed Team Practice measure]]
The AMBIT newsletter is a way to stay connected to the AMBIT community of practice and is open to anyone interested in AMBIT and all those who work in health, social care, youth, education and criminal justice settings who work with people with multiple needs.
!!Previous Editions
You can read previous editions [[here|https://us13.campaign-archive.com/?u=aa2c9f8b722440e7e05bedb82&id=bb903e3cf2]]
!!Sign up
[[Sign up|https://annafreud.us13.list-manage.com/subscribe?u=aa2c9f8b722440e7e05bedb82&id=32f0f223cf]] to receive a quarterly newsletter with updates on relevant theory, research, events and resources.
This tag gathers any material about CURRENT or PUBLISHED studies that examine [[Outcomes]] from ''AMBIT-influenced teams''.
See also <<tag [[Studies relevant to AMBIT]]>> for studies and work that is not directly about AMBIT but which is highly relevant to our work.
!!What is the APrAT?
This is a simple questionnaire and exercise to give teams a basic reflective measure of how closely they have followed AMBIT principles in a particular case, and to help them [[SUSTAIN best practice]].
!!How to do it?
Try to do at least one APrAT every three months with the team.
#Set aside an hour to do this - see the [[APrAT exercise in, or across, teams]].
# Pick one case - preferably one that has given particular cause for concern in the recent past.
# Using the questions below, audit the 8 AMBIT stance indicators (see [[Core Features of AMBIT]]) around this case.
# Look at the results, identify //which stance indicator is the most relevant for the team to improve its practice//, and look at the [[AMBIT Stance Exercises]] to locate a relevant exercise to practice this.
!!The Questionnaire
Full size version here: [[AMBIT Practice Audit Tool_v.2.pdf]]
[img[AMBIT Practice Audit Tool_v.2.pdf]]
!!Video introduction
Using an APrAT questionnaire to help you plan the local training sessions that your team might benefit from.
<html><iframe width="640" height="360" src="//www.youtube.com/embed/1ERcDJgTn3g" frameborder="0" allowfullscreen></iframe></html>
!!!The purpose of this page is to set out some steps that we, the AMBIT programme team, will take if a safeguarding issue arises within our activities
Our roles as AMBIT trainers, consultants and supervisors means that we do not have accountability for the practice of the teams and services we work with however we all have responsibility for safeguarding.
It is possible that safeguarding issues may arise through any number of contexts within which we operate and we are likely to hear about safeguarding situations in our roles, however there may be times when we feel that a situation or concern has not been appropriately addressed by the team or service that we are working with. It may be that we continue to hold concerns about a safeguarding situation/information which we feel requires further attention by the organisation.
Because of our position as trainers/consultants it is unlikely we would know relevant client details to be able to make direct safeguarding referrals, however our role in safeguarding would involve sharing our concerns with the organization we ae working with (and more widely when appropriate e.g. our own AFNCCF safeguarding team, other agencies etc)
!!!Steps for AMBIT programme team
* Recognising a safeguarding concern because we have some questions about how a safeguarding situation has been managed
*If the risk appears to be urgent then we would follow the centre's safeguarding policies by reporting the concern to the designated Anna Freud Centre safeguarding lead and safeguarding oversight group
*Following our principles ([[Keyworker well-connected to wider team]]) we would think together with a colleague in order to attend to us , the workers' feelings about the concern, alongside getting some help in any other aspects of the issue that we might need. This would happen whether the risk seems immediate or not.
*If the risk does not appear to be immediate we would bring our concerns to the AMBIT program team (either to supervision with colleagues, or to the next possible discussion forum)
*Recording of the concerns/situation would happen in the safeguarding log. This is a place to make a note of key details (including date and context), nature of the concerns, any actions and next steps
*When safeguarding concerns are not urgent, recording could happen during/after the team discussion as what to record may be more apparent after discussion with our team
!!Links for AMBIT Programme staff
(these links are only accessible to members of staff)
*[[Safeguarding records folder|https://annafreud.sharepoint.com/:f:/r/sites/AMBITprogramme/Shared%20Documents/Safeguarding%20records?csf=1&web=1&e=zB1DO7]]
*[[Safeguarding adults and children information on staff intranet|https://www.annafreud.org/intranet/practical-info/safeguarding-and-child-protection/]]
!!The ASEQ
[img[ASEQpicture.png]]
The AMBIT Service Evaluation Questionnaire is designed as a pre- and post-training evaluation of the impact of AMBIT training, ''or can be used as a "temperature check" for an AMBIT-influenced team, to help highlight where ongoing training and practice would be best invested:''
* ''Q's 1 - 4:'' probe the AMBIT quadrant [[Working with your CLIENT]]
* ''Q's 5 - 8:'' probe the AMBIT quadrant [[Working with your TEAM]]
* ''Q's 9 - 12:'' probe the AMBIT quadrant [[Working with your NETWORKS]]
* '' Q's 13 - 16:'' probe the AMBIT quadrant [[LEARNING at work]]
!!TRAINING EXERCISE:
!!!Download a Spreadsheet and start team learning
An Excel spreadsheet is downloadable [[here|https://drive.google.com/drive/folders/1_eCO8A1-sU9U6nqCDdlTh8RBD_1jhhFY?usp=sharing]].
* Teams collect individual team members' scores and aggregate them in the spreadsheet
* The spreadsheet automatically generates a set of graphs to show the distribution of (anonymized) individual scores for each AMBIT quadrant, and for individual questions (see tabs on the spreadsheet)
* Print out these graphs and post them in a prominent place in the team office
* Invite team members to place respectful graffiti on the graphs reflecting on:
** these aggregated experiences of working in this team
** what explicit learning might the team want to focus on in the coming months (which answers highlight the most important area for the team to develop its practice in)?
* Repeat annually?
Here we are just gathering all the various [[Training exercises]] in the manual together under headings that sort them according to which area of the AMBIT stance they best support:
!On the AMBIT stance and ways of working //as a whole//:
<<tag [[Training Exercises on AMBIT in general]]>>
!On the separate components of the Stance:
<<tag [[Training Exercises for Mentalization]]>>
<<tag [[Training Exercises for the Keyworker Relationship]]>>
<<tag [[Training Exercises for Keyworker well-connected to wider team]]>>
<<tag [[Training Exercises for Scaffolding existing relationships]]>>
<<tag [[Training Exercises for Managing Risk]]>>
<<tag [[Training Exercises for Working in multiple domains]]>>
<<tag [[Training Exercises for Taking Responsibility for integration]]>>
<<tag [[Training Exercises for Respect local practice and expertise]]>>
<<tag [[Training Exercises for Respect for Evidence]]>>
Groups may not be so well known as some will come from briefer training than the four day AMBIT training.
People will have done Module 3 (AMBIT training) and Module 4 (MI and Mz).
*Supervision groups have 5 people,
*will have four supervisions, once a month.
*16 groups are being held each month.
*1.5 hours per supervision.
*Mixed groups not in teams.
*Some people may have two lots of supervision if they have done both modules.
There may be difficulties in attendance. People under pressure. May easily cancel.
!!How set it up from the start?
*Getting to know each other - they will have met previously.
*common factor is around crisis work and being able to share experiences together.
*Emphasising the importance of working together on these issues.
*Need to make connections. Recognise the challenges of not being trained as a whole team.
*reflections on impact of training - what are key take home messages?
*discuss pressure on coming; discussing commitment to attend.
*first steps to creating a community practice
*Linking to implementation plan
**staying connected
**thinking about own AMBIT
**Sharing AMBIT with your team
**Influencing managers - how does it work as a team approach if only one person has been trained.
!!Developing a structure
*check-in
*connect with crisis manual
*making a plan together
*Identify and work on a dilemma
*Practice a tool such as thinking together and disintegration
*Manualizing key learning points in crisis manual at the end of the session.
The [[AMBIT Full Competency Framework]] describes 20 competencies for an individual worker in an AMBIT trained team. However, AMBIT is unambiguously a team approach and alongside this individual framework we are developing some ideas about what a team competency framework would look like. This page indicates some initial work on this idea. Our proposal is that an AMBIT team could be identified as having five core competencies of its work. These are:-
The team's ability to:-
#''Mentalize the Client''
#''Mentalize the Team''
#''Mentalize the Network''
#''Learn as a team''
#''Evaluate client outcomes''
We have tried to think about how a team competency can be demonstrated. For each of the five competencies, we have included a list of possible alternative ways in which this aspect of team practice could be shown. Teams are not expected to do all of these but if they are doing none of them, then perhaps a part of the AMBIT model is not being used. This may be appropriate but it would seem useful if it is explicit and choisen rather than happening by default.
However, we are nervous about appearing to reduce a competency to a single practice. This would be unhelpful but, at the same time, if there is no explicit way by which a competency could be observed to be taking place, there is a possibility that the competency itself may be marginal to mainstream team work. As ever, the AMBIT approach is to try to balance top down definitions with appropriate local adaptations.
!1. Mentalizing the client
An ability for the team to support each other in supporting an intervention which aims at increasing the client's capacity to mentalize.
An ability for the team to support each other in adopting the mentalizing stance in working with their clients.
An ability for the team to support each other in using the mentalizing loop in working with their clients.
!!!Team Practices that support Mentalizing the Client
*Group supervision in which a team member presents a case and the rest of the group mentalize the client and the worker either through discussion or through role play.
*Explicitly using the mentalizing stance or the mentalizing loop in joint work with their client.
*Using the mentalizing approach explicitly as part of individual supervision.
!2. Mentalizing with your team
An ability for the team to support each other in recognising that the mentalizing capacity of colleagues within a team (including oneself) is likely to fluctuate in response to anxiety, stress and other expected aspects of work with their clients.
An ability for the team to support each other in using the ‘thinking together’ approach to consulting with a colleague in a team, as a way of ensuring that sense is made of the worker’s own feelings about a particular young person or clinical situation, and the possible impact of this upon the work.
An ability for the team to support each other in being able to challenge colleagues where evidence of a non-mentalizing approach to the work is present, and to support them to regain their own mentalized explanations for the behaviours that they are working with.
!!!Team Practices that support Mentalizing the Team
*Using 'thinking together' method of case discussion in team meetings.
*Using 'thinking together' in individual supervision.
*Training all new staff in the team about 'thinking together'
!3. Mentalizing the Network
An ability for the team to support each other in making sense of the behaviour of staff from other agencies in terms of understandable mental states and intentions of agents in that organisation.
An ability for the team to support each other in adopting a position of respect towards staff from other agencies and to demonstrate this by positive curiosity about their work with the young person.
An ability for the team to support each other to identify all key participants from the client's professional network who have an investment in their outcomes, including family members where appropriate and other formal and informal key stakeholders.
An ability for the team to support each other in facilitating collaboration between professionals at all levels of the service system that takes into account professional beliefs about the nature of the young person’s difficulties, what may be helpful in addressing these problems, and beliefs about role responsibilities in a multi-agency system.
!!!Team Practices that support Mentalizing the Network
*Using a Program to map out the network
*Using the method of network sculpting to reflect on difficult cases
*Using the dis-integration Grid as part of case formulation
*Using network sculpting as part of team training events.
!4. Learning as a Team
An ability to reflect with team colleagues on interactions with client's and/or professionals in the network in a systematic way agreed within the team (e.g. discussion in a team meeting) in order to enable collective learning about effective practice.
An ability for the team to support each other to make use of the team wiki manual to support their learning.
An ability for the team to support each other to engage in team discussion about important areas of practice with their clients in order to develop a shared approach to a particular difficulty or situation that commonly arises with this client group.
An ability to contribute into achieving a consensus approach to common clinical dilemmas based on team reflection and discussion and to manualize practice guidance from this.
!!!Team Practices that support Learning as a Team
*Having reflective team discussions about good practice around live clinical issues. Having planned manualising meeting at set times throughout the year.
*Using the manual as part of case discussion.
*Re-writing aspects of core AMBIT practice adapted to local service needs
!5.Evaluating Client Outcomes
An ability for the team to support each other to remain curious as to whether a particular method of work with a client is experienced as helpful to them.
An ability to support and contribute to the development of systematic methods within a team to evaluating whether clients are experiencing the service as beneficial to their problems.
An ability of the team to support each other to complete an AIM assessment with a client or with a member of the network who knows the client's wellbeing well or a family member as part of an initial assessment of the client's needs. .
!!!Team Practices supporting Evaluating Client Outcomes
*Having a systematic method of recording client outcomes at the point of discharge
*Discussing client outcomes as part of team awaydays.
*Reporting on client outcomes to the commissioners and including the team in such reports
*Meeting with client to consider outcomes and how these could be improved.
AMBIT was originally devised out of work developed by a group of practitioners at the Anna Freud National Centre for Children and Families and the Marlborough Family Centre.
For information on the current AMBIT team see:
<<image-link "AMBIT programme" "jehyun-sung-6U5AEmQIajg-unsplash (1).jpg" "Meet the Team" "295">>
There are also [[AMBIT Assistant Trainers]] who are experienced practitioners currently working in [[AMBIT-influenced]] teams
This page directs you to where you can find out about training in AMBIT, and also acts as a tag which gathers sub-topics under the heading of <<tag [[AMBIT Training]]>> - this includes, for instance, all of the training exercises and resources that we use in delivering AMBIT training
!!AMBIT Training Programme
Adaptive Mentalization-Based Integrative Treatment (AMBIT) is one of a number of emerging adaptations of MBT. The AMBIT approach provides tools for putting [[Mentalization]] to use in work //not just// with clients, but with team colleagues and across wider inter-agency networks, too and to support learning in a team (which is closely connected to the activity of mentalizing). AMBIT is as much a //framework for local improvement and learning// as it is a unitary and fixed method of therapy. This is especially because AMBIT stresses the need for //local adaptation//, and the //sharing of emerging evidence and best practice//. It is an [[OpenSource]] approach, and shares all its learning via this award-winning wiki-based approach to treatment manualization - the [[AMBIT Manual|Manualization]].
!!Training in AMBIT
* The ''AMBIT Training Programme'' is based at [[AFNCCF]] in London
*As the approach expands there are also a growing number of ''International AMBIT-accredited Training Centres'' preparing to open or opening (Fundacio Vidal i Barraquer in Barcelona was the first in 2022).
!!Pathways for AMBIT training
* ''These are all laid out in the [[AFNCCF main website, AMBIT Training section|https://www.annafreud.org/clinical-support-and-services/adaptive-mentalization-based-integrative-treatment-ambit/ambit-training-consultation-and-supervision/]]'' and this is where to go if you are interested in exploring the options/costs, etc.
* Currently there are number of ''different pathways'' and approaches by which AMBIT training is delivered:
** Single team trainings
** Multiple team trainings
** Local Training facilitator trainings
** Largescale locality-wide multi-agency trainings
* There are also Supervision Packages that come with trainings, or can be bought in addition.
* Choosing which training and preparing for this is actually part of the training
**Step1- AMBIT Engagement Call
**Step 2- [[AMBIT Consultation Day]]
**Step 3- Deciding on the Appropriate Training
** Step 4- Choosing a Supervision Package
!!''1. Expression of interest''
*Enquiries about [[AMBIT Training]] from teams/services go to [[The AMBIT Project Coordinator|mailto:ambit@annafreud.org]].
*We will send out published papers and a link to the AMBIT manual
*We will also make initial enquiries about the size of the team, whether it is statutory or voluntary sector and annual income of the team if voluntary sector.
*We will ask the enquirer to fill in an Expression of Interest form
!!''2. Engagement Call''
In order to assist with the process of establishing whether the AMBIT Programme can be of help to a team or service, we follow up initial enquiries by scheduling an engagement call. This is a 30 minute telephone conference call between you (it can be more than one person as relevant) and either the AMBIT Programme Lead or Deputy Lead.
<<link-pdf "Engagement Call" "https://drive.google.com/file/d/1TxIUFm5cZhDIE4z2_JzX-anpGLlkVb0q/view?usp=sharing">>
!!''3. Consultation Day ''
An AMBIT consultation is offered as standard to all teams enquiring about undertaking AMBIT training, after the initial engagement call. The broad purpose of the consultation day is to reach a shared understanding with a team (or organisation) about whether embarking on AMBIT training will be useful to them and if so, what the training objectives might be. The meetings can involve senior managers, clinicians and all staff due to attend a training. The day will be facilitated by two trainers from the AMBIT Programme, one of whom will be the AMBIT Programme Lead or Deputy Lead.
After the Consultation day the AMBIT programme will send a consultation report, summarising the key themes arising from the day, training objectives and make
recommendations about training routes and implementation support should the
team/organisation wish to proceed with booking an AMBIT training. It is important to the
AMBIT programme that training is useful for teams and as such, there is no obligation to
book training after the consultation day if it does not feel as if it would assist the team
with their development.
<<link-pdf "Consultation Day" "https://drive.google.com/file/d/15KR2OzpDhpc6uup3A1SOdi6-VMLighjK/view?usp=sharing">>
!!''4. Application Review and Acceptance''
Following the Consultation day the application is reviewed, and a decision will be made //jointly// about whether the team wants to proceed with [[AMBIT Training]], and if so, by which route. Arrangements for training will be finalised with [[The AMBIT Project Coordinator|mailto:ambit@annafreud.org]]
!!!!!//Note//- //At any stage in the application process, it may be helpful for teams to hold a [[Briefing session for senior managers/commissioners]]//
!!''Intention''
The intention of the AMBIT project at the [[AFNCCF]] is to provide free, OpenSource resources for supporting and developing effective practice with young people whose needs are multiple, complex, and who are subject to social exclusion and who may not be seen as "help-seeking" in conventional terms.
!!''"There is no such thing as an AMBIT team"'':
* We talk instead of [[AMBIT-influenced]] teams
* AMBIT is focused on supporting IMPROVEMENT in relation to locally-defined organisational/service goals.
!!''Locally defined service goals''
In pursuit of these locally-defined service goals, AMBIT training is designed to:
* ''Support'' [[LEARNING at work]] so that local teams can develop, record and broadcast their own excellence and learning.
* ''Provides a robust foundation of theory and integrated practices''
** (see [[AMBIT: an overview]], and note the explicitly evidence-based and manualized interventions here: <<tag [[Specific interventions]]>> which are integrated within the broader framework of AMBIT.
** The content of AMBIT //has been shaped by the teams trained//, with encouraging early outcomes data published (see [[Academic references]]).
** ''Share all of our [[Training exercises]]'' that have been found to be helpful over multiple trainings.
** ''Encourage wide dissemination through supporting'' locally-delivered training sessions:
*** <<tag [[Planning a training event in your team]]>>
!!''No rigidity''
There is no rigidly fixed method of being trained in the AMBIT approach, but note the following:
* ''We do NOT train individuals in AMBIT'' - it is a team approach
!!''Respect Local Practice and Expertise''
*We do not want to leave workers with a sense that their existing skills are wrong or devalued.
*Rather than giving didactic teaching about what we want people to do and then asking them to practice this, it is helpful to introduce new techniques by first examining present practice and existing skills.
*This includes looking at what can go wrong in present practices.
*It may include looking at video or role play examples of "unsuccessful" attempts to achieve the basic aims of the skill to practice.
*AMBIT seeks to AUGMENT these existing skills by adding mentalizing to a range of existing and perfectly legitimate skills, rather than REPLACING them.
!!''Manualizing''
*When teaching people to [[Manualize|Manualization]] material - pay attention to how new material they generate is fitted into (integrated with) //existing material// in the manual.
* Use the search facility to check for similar or overlapping topics and themes
* Consider what related material is already there, and what [[Links]] and [[Tags]] should be added.
* If considering whether to tag a new page, first open the tag ([[Topic]]) and look at the other sub-topics gathered under it - would this new page be "in the right company" with these other sub-topics?
!!''Emphasis on resisting Shame''
*We constantly emphasise the ordinariness of anxiety in the work, and the fact that there should be no shame attached to feeling anxious in the work we do
*There is much that workers //should// feel anxious about.
*AMBIT seeks to help them maintain safe, sustainable and effective practice in spite of this.
!!What are our training objectives?
* Training for local workers to help them implement the Thrive framework - specifically in the quadrant of Risk Support
* ''Questions for Commissioners/Managers - (pre-training consultation): ''
**should our training include a basic introduction to Risk Support?
** Managers and Commissioners will understand Risk Support, however some of the workers attending may be less familiar, especially if the THRIVE transformation is relatively new
** Sometimes there is patchy/varied understanding about the nature of Thrive in a local setting
* ''An overarching objective for an AMBIT Risk Support Training'' should be to create/build upon relationships across the different agencies that are sharing responsibility (see #1 above)
** It makes little logical sense therefore, to run a THRIVE Risk Support training with only one agency or team...
** Managers commissioning an AMBIT for THRIVE RISK SUPPORT training will understand this context and will need to help us to direct this
* ''How to implement'' [[Team around the Worker]] will be a key part of a training
** Remember that [[Team around the Worker]] is highly adaptable as a principle that can be applied in many different ways
** This is NOT suggesting that such a process/principle would be fully worked out and decided during a training - but a conversation would be started
** We are training workers to create teams around particular families
** We are training workers to take responsibility for addressing Dis-integration
** Using [[Dis-integration grid]] and [[Connecting Conversations]] as a key part of the process of a relational referral. The point of a referral in such instances is at least in part to help strengthen the system of help - rather than just to shift responsibility/accountability
For AMBIT's 4th annual conference, on 2nd June 2016, we ditched the traditional conference format adhered to in previous years in favour of a style more in keeping with the AMBIT's tradition of co-creation and the project's ambitions to foster and sustain a [[Community of Practice]] for AMBIT-influenced teams and individuals: the ''unconference''. The [[unconference | https://en.wikipedia.org/wiki/Unconference]] format provided a loosely structured space for peer-to-peer sharing of ideas, good practice and learning.
At the beginning of the day, participants were invited to make a note on small pieces of paper of particular conversations they would like to lead or take part in. These ideas were then mapped to the quadrant of the [[AMBIT Wheel]] to which they most related, and organised into five "Unconference Conversation" topics for each quadrant: [[Working with your CLIENT]], [[Working with your NETWORKS]], [[LEARNING at work]] and [[Working with your TEAM]]. We then had a participant-created schedule for the morning, with sessions relating to each quadrant to run concurrently in separate rooms. The schedule was displayed on a board so that participants could choose their own timetable for the morning:
<<image [[Unconferenceboard]]>>
Notes made by facilitators in each unconference conversation are available here, arranged by quadrant.
|bgcolor(pink):<<tag [[Working with your CLIENT Unconference Conversations]]>>|
|bgcolor(lightgreen):<<tag [[Working with your NETWORKS Unconference Conversations]]>> |
|bgcolor(yellow):<<tag [[LEARNING at work Unconference conversations]]>> |
|bgcolor(lightblue):<<tag [[Working with your TEAM Unconference conversations]]>> |
In the afternoon we played some games designed to prompt thinking about ''Dis-integration'' (which involved silly glasses and balloons) and the use of the [[Community of Practice]] (which involved post-it notes on foreheads and long bits of elastic). We also offered three short, pre-planned talks with a view to sharing practice, sparking conversation and seeking feedback and collaboration:
*AMBIT training across a locality - James Wheeler
*Thinking about the AMBIT Wheel from a young person's perspective - Dickon Bevington
*Starting an AMBIT-influenced team from scratch: establishing a partnership between the AMBIT Project and an NHS healthcare team - Liz Cracknell
A "cafe corner" was open all day to create a space for those serendipitous encounters with fellow participants which feedback from previous conferences tells us sometimes create the most valued learning opportunities.
See also the [[Core Features of AMBIT]] for text and video to support this diagram.
!!!Download!
You can Download the AMBIT Wheel diagram as a PDF [[here|AMBIT Wheel.pdf]]
!!!Diagram:
See <<tag [[AMBIT Wheel]]>> for versions in other languages (or submit your translated version for us to include!)
Click on where you want to go (or scroll down for more content.)
<<ambit-wheel size:490px>>
!Explanation
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/VC-xzsR89s0?hl=en_US&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/VC-xzsR89s0?hl=en_US&version=3&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!There's more: a client's version
The AMBIT Wheel is primarily designed for the benefit of workers - helping them to map or [[mark|Marking the Task]] and [[balance|Holding the Balance]] the range and scope of their work tasks.
A new development currently under review is a "matched" (segment-for-segment) version, the [[Client's AMBIT Wheel]]. Early feedback about this from practitioners at the 2016 AMBIT conference was positive - as a way of shaping workers' understanding of their work from the client's point of view. Whether sharing it with clients (as a form of PsychoEducation aid) adds any value is undetermined as yet.
!!Feedback from AMBIT-influenced teams
>>"We have found that we have managed to embed use of the 'Wheel' in the team meeting (members elect to think with a view to a particular quadrant)"
>>> AMBIT-influenced team, 2014
[img[IMG-20181129-WA0000.jpg]]
[img[AMBIT Wheel-Catalan.jpg]]
[img[AMBIT Wheel - Chinese.jpeg]]
[img[IMG-20171023-WA0000.jpg]]
With thanks and respect to Twitter friend, @kogommi! AMBIT is built on sharing and collaboration.
[img[AMBIT Wheel_Japanese (2).jpg]]
Thanks to the ECID team (https://manuals.annafreud.org/ambit-ecid)
[img[AMBIT wheel Catalan.png]]
!!''Combining the ambit wheel and the APrAT''
This page includes two visual aids created by ''Alastair Wakely'', Harmful Sexual Behaviour Services Coordinator in Wiltshire and B&NES. They were created by combining the ambit wheel and the APrAT questions. Colleagues can have these up in their offices as a quick reference for checking an AMBIT view about a case.
You can download these by clicking the pop out button on the top right hand corner, which will direct you to google docs where you can download them from.
!!!''AMBIT Wheel with Tools''
<iframe src="https://drive.google.com/file/d/1X3lupnmO9Av6cmeta5dkj1R6b6tyrhNI/preview" width="640" height="480"></iframe>
!!!''AMBIT Wheel with APrAT Questions''
<iframe src="https://drive.google.com/file/d/1llNxnnfg2pD4NI-46tp6IjfOSWRzfrxs/preview" width="640" height="480"></iframe>
AMBIT is not an exclusive approach and aims to support evidence based methods of practice and local based expert practice within its overall framework.
Such weaving together of multiple influences on local team practice requires team learning and probably manualising in order to address problems of disintegration.
For example, there is sometimes concern as to whether AMBIT would undermine safeguarding practice based on [[Signs of Safety]]. Our experience is that AMBIT is entirely compatible with this approach but local discussion will be needed to unpick where anxieties arise.
One extremely useful framework for unpicking such difficulties is the paper by John Burnham paper who separates out three levels of intervention namely "Approach, Method, Technique" so that, for example, an AMBIT technique such as thinking together may easily support the Signs of Safety approach.
!!!Reference.
Human Systems: The Journal of Systemic Consultation & Management- Vol 3. 1992 KCC 3-26
Approach - method - technique: distinctions and creating connections
John Burnham, Principal Family Therapist, Charles Burns Clinic (Birmingham and Director of Training in Systemic Therapy, Kensington Consultation Centre (London).
In some ways AMBIT is at least much an approach to support Quality Improvement in a service, as it is a "therapy". Another way of putting this is that if mentalizing is useful for our clients and their families, it's just as useful us as professionals and our teams. See sub-topics under this heading for material relating to Service Improvement and [[Implementation Science]]
We have produced 3 sets of cards for use within supervision or case discussion contexts, which are based on ideas from several different AMBIT teams who had developed and used such cards in their team meetings. Each of these card sets is described below.
''AMBIT stance cards''
The [[AMBIT stance playing cards|AMBIT stance playing cards]] were developed by the CASUS team, a substance use service for adolescents in Cambridgeshire. Each area of the AMBIT stance is printed on individual cards which are dealt out to team members. Each team member is responsible for holding that particular area of the stance in mind during the discussions. The purpose of this is to support a team to remain "on balance" by attending to the four different domains of AMBIT - Client, Team, Network and Learning - within the discussion taking place.
''AMBIT Marking the Task cards''
These cards were based on cards developed by the AMASS team in Islington, an edge of care team for adolescents, for use in their weekly group supervision. The purpose of the cards is to assist team members in [[Marking the Task]], which is the first of the four steps in [[Thinking Together|Thinking Together]]. The cards contain a number of different categories of task that a worker might want help with. Sometimes selecting a clear and specific task can be a challenge for workers, particularly since the experience of having a dilemma or feeling stuck is often related to a loss of mentalizing, which can make it more challenging for a worker to think through "//What exactly do I need help with?//". The intention of getting a worker to select the relevant card and place it on the table is therefore to help with both the identification of the task and to create a playful way of helping the worker and the team hold the boundary around being clear about task //before //moving into [[Stating the Case|Stating the Case]] i.e. ("//You can't start until you've chosen your card and helped us understand what the task is//!").
''AMBIT usual suspects cards''
Developed by CASUS workers, these cards are intended to be given out to team members who are wanting to assist a worker in thinking about addressing [[Dis-integration|Addressing Dis-integration]] within a network. The worker can select the relevant professionals from the pack of cards, assign each of these cards to a member of the team and ask each team member to mentalize that worker's perspective in the discussion that follows. This may help to identify areas of agreement, dis-integration and possibilities for [[connecting conversations|Connecting Conversations]] that may be helpful.
----
This page provides a link to the signposting site for wiki manuals at the Anna Freud Centre. If you scroll down, you can find a button called 'other versions' which then enables you to see all the manuals that have been created over the last ten years.
<html><iframe src="https://manuals.annafreud.org/"height="900" width="100%"></iframe></html>
''Possible topics for supervision''
* Sharing aspects of AMBIT with team structures- both formally and informally. The importance for Whitney as not just being the only person that holds these ideas and ways of working
*Linked to the above- how do we then create team cohesion and help the team to manage dilemma's or draw on support from each other
It is important to understand the team and network context in a bit more detail:
NDIS is an insurance scheme that Empower works under.
This provides lots of different services- skills training, supervision, development. Most clients have a high level of complexity and Whitney as the lead holds a lot of the thinking and pressure.
We work with support coordinators, OT's etc- they are also funded by NDIS and carry out pieces of work with the clients. This is the professional network (in relation to AMBIT) sometimes this works well and these workers connect with us and we think with them
When empower is the main provider it can be really har when there is not good communication with other providers e.g. arpund their complex needs in order to discuss what may help/how best to support
Notes required: See ECID team in Barcelona or the U-Start team in Copenhagen
* Altrecht is a large service working in the Netherlands with adults diagnosed with Personality Disorder
<?xml version="1.0" encoding="UTF-8"?>
<svg width="43px" height="45px" viewBox="0 0 43 45" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->
<title>Tweaked</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Tweaked" transform="translate(1.000000, 1.000000)">
<path d="M28.261108,37.72152 C32.774605,38.282784 37.148956,37.296204 40.830399,35.164055 C40.787487,30.613632 39.200485,26.326332 36.503712,22.900034 C37.966618,21.419312 38.870178,19.384754 38.870178,17.140627 C38.870178,12.61534 35.197853,8.944153 30.673794,8.944153 C30.037663,8.944153 29.418346,9.016699 28.823757,9.1540556 C27.08588,5.4563637 24.246313,2.326004 20.658958,0.2500706 C17.127851,2.2917614 14.233307,5.3868523 12.46357,9.180688 C11.834939,9.026104 11.177836,8.944153 10.501737,8.944153 C5.9776745,8.944153 2.3053513,12.61534 2.3053513,17.140627 C2.3053513,19.427237 3.243475,21.496262 4.755543,22.98352 C2.7228107,25.587366 1.3028564,28.727465 0.7499676,32.218975 C0.5920753,33.215385 0.5102024,34.206371 0.5,35.186111 C2.577057,36.384048 4.9039583,37.228745 7.412227,37.625893 C9.288881,37.923088 11.1463385,37.950703 12.945194,37.737427 C14.12627,40.813965 17.109684,42.99993 20.600092,42.99993 C24.096514,42.99993 27.084187,40.806438 28.261108,37.72152 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M10.573699,17.919729 C10.664197,27.584873 17.722935,36.064259 27.584494,37.625908 C32.336346,38.378387 36.965256,37.402596 40.830399,35.164047 C40.739204,25.498386 33.681347,17.019924 23.818739,15.458342 C19.067179,14.705864 14.438599,15.681564 10.573699,17.919775 L10.573699,17.919729 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M10.573699,17.919729 C10.664197,27.584873 17.722935,36.064259 27.584494,37.625908 C32.336346,38.378387 36.965256,37.402596 40.830399,35.164047 C40.739204,25.498386 33.681347,17.019924 23.818739,15.458342 C19.067179,14.705864 14.438599,15.681564 10.573699,17.919775 L10.573699,17.919729 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M20.646036,35.170868 C25.72836,32.232002 29.49223,27.11087 30.48191,20.864998 C31.823906,12.3902855 27.669273,4.3067846 20.658957,0.2500706 C15.576397,3.188795 11.812689,8.3099995 10.823613,14.555935 C9.480789,23.029884 13.635868,31.113808 20.64596,35.170868 L20.646036,35.170868 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M20.646036,35.170868 C25.72836,32.232002 29.49223,27.11087 30.48191,20.864998 C31.823906,12.3902855 27.669273,4.3067846 20.658957,0.2500706 C15.576397,3.188795 11.812689,8.3099995 10.823613,14.555935 C9.480789,23.029884 13.635868,31.113808 20.64596,35.170868 L20.646036,35.170868 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M0.499999,35.186127 C2.5770607,36.384052 4.9039564,37.228725 7.4122124,37.625908 C18.40492,39.366714 28.740063,31.857986 30.481976,20.865194 C30.639755,19.868818 30.7215,18.877884 30.731598,17.898239 C28.654385,16.700291 26.327187,15.855526 23.818539,15.458342 C12.82593,13.717536 2.4906597,21.226402 0.7499542,32.21899 C0.592085,33.215385 0.5102167,34.206367 0.499999,35.186104 L0.499999,35.186127 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M0.499999,35.186127 C2.5770607,36.384052 4.9039564,37.228725 7.4122124,37.625908 C18.40492,39.366714 28.740063,31.857986 30.481976,20.865194 C30.639755,19.868818 30.7215,18.877884 30.731598,17.898239 C28.654385,16.700291 26.327187,15.855526 23.818539,15.458342 C12.82593,13.717536 2.4906597,21.226402 0.7499542,32.21899 C0.592085,33.215385 0.5102167,34.206367 0.499999,35.186104 L0.499999,35.186127 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M20.600092,42.999935 C16.076015,42.999935 12.4037,39.327541 12.4037,34.80344 C12.4037,30.278149 16.076015,26.606936 20.600092,26.606936 C25.124168,26.606936 28.796501,30.278149 28.796501,34.80344 C28.796501,39.327541 25.124168,42.999935 20.600092,42.999935 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M20.600092,42.999935 C16.076015,42.999935 12.4037,39.327541 12.4037,34.80344 C12.4037,30.278149 16.076015,26.606936 20.600092,26.606936 C25.124168,26.606936 28.796501,30.278149 28.796501,34.80344 C28.796501,39.327541 25.124168,42.999935 20.600092,42.999935 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M30.67379,25.337133 C26.149714,25.337133 22.477398,21.664742 22.477398,17.140636 C22.477398,12.615347 26.149714,8.944134 30.67379,8.944134 C35.197865,8.944134 38.870197,12.615347 38.870197,17.140636 C38.870197,21.664742 35.197865,25.337133 30.67379,25.337133 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M30.67379,25.337133 C26.149714,25.337133 22.477398,21.664742 22.477398,17.140636 C22.477398,12.615347 26.149714,8.944134 30.67379,8.944134 C35.197865,8.944134 38.870197,12.615347 38.870197,17.140636 C38.870197,21.664742 35.197865,25.337133 30.67379,25.337133 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M10.501752,25.337133 C5.9776745,25.337133 2.30536,21.664742 2.30536,17.140636 C2.30536,12.615347 5.9776745,8.944134 10.501752,8.944134 C15.025827,8.944134 18.698158,12.615347 18.698158,17.140636 C18.698158,21.664742 15.025827,25.337133 10.501752,25.337133 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M10.501752,25.337133 C5.9776745,25.337133 2.30536,21.664742 2.30536,17.140636 C2.30536,12.615347 5.9776745,8.944134 10.501752,8.944134 C15.025827,8.944134 18.698158,12.615347 18.698158,17.140636 C18.698158,21.664742 15.025827,25.337133 10.501752,25.337133 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
</g>
</svg>
There are a number of groups and individuals working on applications of AMBIT in Education, in the UK, Spain and Germany. A chapter in the most recent AMBIT book covers its application in Teacher Trainings (in Germany) and this page is currently a marker for further content about this particular context for implementing [[AMBIT-influenced]] practice.
Please contact the AMBIT programme at [[AFNCCF]] for further details and to be put in touch with other workers in this field
* HMP Wakefield
* Rejion Sjaelland is a forensic MH (locked) setting in Denmark using AMBIT to work with very high risk patients
* HMP Bronzefield - this was the first iteration of AMBIT in the prison service and led to much learning that has been built on by more recent projects.
!!update:
See also the paper published two years later by this group in 2016:
[[Griffiths et al (2016) Evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 CAMHS]]
!AMBIT conference presentation 2014:
<html><iframe width="560" height="315" src="//www.youtube.com/embed/NMcx8Xm-y70?list=PLaZguIPxZjqaudOxA29jJE-ds2eGT3HoV" frameborder="0" allowfullscreen></iframe></html>
More notes required here...
* The V.I.P. (Violence Intervention Project) in London has been using AMBIT for some years now
* other teams and services, include:
** MAC (Music and Change)
** Redthread
** Safer London
A rather hurried but packed conversation:
* ''Where to start?''
** How to introduce an organisation to AMBIT
** How to introduce AMBIT to the organisation
* We discussed the ''usefulness of the theory of Dis-integration'' - as the "natural resting state" of all complex multi-professional [let alone multi-agency] networks.
** Establishing this ''reduces the likelihood ''professional shame'''' in talking about this (and reduces the possibility of workers in trouble shrinking away from help-seeking.)
* We discussed how critical it is to have ''Top-down and bottom-up conversations with staff in the organisation'' (senior managers/commissioners/CEO's AS WELL as street level workers; the latter are often easier to engage with the material and ideas.)
** Beware senior managers who engage AMBIT trainings more because "We need to spend this money before the end of the year, or it will be taken away from us" than because of an understanding of authentic need in the team.
** Discussion of the PREP day of pre-training preparation (see [[AMBIT Consultation Day]])
** Never seems to have been as much senior management engagement as we wanted/thought we had achieved before the event!
* ''Barriers to discussion with senior management/commissioners''
** More difficult for managers to acknowledge a "learning gap" in their team, and to acknowledge their own need to understand what might be seen as "detailed clinical practice"...
** Easy to misunderstand the systemic/organisational implications of an AMBIT training
** Do the people commissioning AMBIT training understand what it is they are inviting in?!
* ''Upwards conversations "By Stealth"''
** Small influential "corridor conversations"
** Talking "their language" - especially outcomes.
*** see other discussion on [[Learning- Does AMBIT work? (Unconference conversation 2016)]]
*** Use of [[Elevator Pitch]] exercise with team: ''can you create an elevator pitch that summarises in 1 minute:''
**** The goals of the (training) project?
**** The Barriers to successful completion of the team's [[Implementation Plan]]
**** Proposed solutions to these barriers?
AMBIT is in some senses a way of working with young people or adult clients whose [[Relationship to help]] is non-conventional or troubled, and before they are ready to receive more mainstream forms of help.
[[Active Planning]] provides:
|bgcolor(lightgrey): ''A FRAMEWORK for developing relationships'' where [[Epistemic Trust]] can be established |
And together with the other elements of [[AMBIT|AMBIT: an overview]] seeks to provide:
|bgcolor(lightgrey): ''CONTEXTS in which sustainable therapeutic change is most likely to become possible'' |
AMBIT aims to capture - from research-based [[Evidence]], workers, and [[Experts By Experience]] - some of the key dilemmas that workers experience, and to collect evidence-based practices that may assist with managing this, which are described as the [[Core Features of AMBIT]].
This is an old (2019) version of the AMBIT logic model for AMBIT training as an intervention.
It has been updated with the recent iteration[[ here|Logic model for AMBIT training (as an intervention)]]
!!!@@color:red;''Target''@@
For health, social care, education and voluntary sector teams working with:
*highly vulnerable populations with multiple needs
*including mental health needs
*where the clients relationship to helping systems, or the interactions between different elements of those systems, is part of the problem
!!!@@color:orange;''Intervention''@@
The intervention is AMBIT training which has the following components.
*Working out training needs
*Teaching about AMBIT
*Practising AMBIT skills
*Learning as a team
*Implementation Planning
!!!@@color:blue;''Change mechanisms''@@
*Trainee recognition of self in model
*Shared awareness of individual/team strengths and needs (Implicit - > Explicit)
*Creation of Epistemic Trust & openness to learn
*Increase in knowledge about AMBIT
*Increase competence in applying AMBIT skills
*Increased team/system cohesion
*Co-created implementation plan
!!!@@color:green;''Outcomes''@@
*Increase trainee effectiveness with client group
*Increase in trainee capacity to manage feelings appropriate to the work.
*Increased knowledge about AMBIT
*Positive attitude towards AMBIT as a shared framework for help
*Competence and confidence in improved AMBIT skills
*Implementation plan (balanced across AMBIT quadrants) in place by end of training
* Longer term: improved 'clinical' outcomes for clients as a result of:
** Improved engagement
We have produced 4 sets of <<tag [[AMBIT playing cards]]>>, three of which are for use within supervision or case discussion contexts, which are based on ideas from several different AMBIT teams who had developed and used such cards in their team meetings. Each of these card sets is described or linked to below:
''AMBIT AIM cards''
<center>{{AIM cards pic1.jpg}}</center>
The AMBIT [[AIM Cards]] are designed to be //used with a client// in helping to measure what matters to them, and to help them make links and prioritise work (they are an aid to [[Active Planning]] as well as providing a client rated version of the clinician/worker-rated [[AIM]] questionnaire). There is more detail at [[AIM Cards]].
''AMBIT stance cards''
The [[AMBIT stance playing cards]] were developed by the CASUS team, a substance use service for adolescents in Cambridgeshire.
{{AMBIT stance playing cards}}
Each area of the AMBIT stance is printed on individual cards which are dealt out to team members. Each team member is responsible for holding that particular area of the stance in mind during the discussions. The purpose of this is to support a team to remain "on balance" by attending to the four different domains of AMBIT - Client, Team, Network and Learning - within the discussion taking place.
''AMBIT Marking the Task cards''
The [[AMBIT Marking the Task cards|AMBIT Marking the Task cards v2.pdf]] cards are based on cards developed by the AMASS team in Islington, an edge of care team for adolescents, for use in their weekly group supervision.
{{AMBIT Marking the Task cards v2.pdf}}
The purpose of the cards is to assist team members in [[Marking the Task]], which is the first of the four steps in [[Thinking Together|Thinking Together]]. The cards contain a number of different categories of task that a worker might want help with. Sometimes selecting a clear and specific task can be a challenge for workers, particularly since the experience of having a dilemma or feeling stuck is often related to a loss of mentalizing, which can make it more challenging for a worker to think through "//What exactly do I need help with?//". The intention of getting a worker to select the relevant card and place it on the table is therefore to help with both the identification of the task and to create a playful way of helping the worker and the team hold the boundary around being clear about task //before //moving into [[Stating the Case|Stating the Case]] i.e. ("//You can't start until you've chosen your card and helped us understand what the task is//!").
''AMBIT usual suspects cards''
Developed by CASUS workers, the [[AMBIT usual suspects cards.pdf]] are intended to be given out to team members who are wanting to assist a worker in thinking about ''Dis-integration'' within a network.
{{AMBIT usual suspects cards}}
The worker can select the relevant professionals from the pack of cards, assign each of these cards to a member of the team and ask each team member to mentalize that worker's perspective in the discussion that follows. This may help to identify areas of agreement, dis-integration and possibilities for [[connecting conversations|Connecting Conversations]] that may be helpful. Additionally the cards may be used within a group discussion or individual supervision to “sculpt” a network in order to make sense of the client’s system of help, visually map out dis-integration and consider the the differing perspectives. This is a quick and easy alternative to the [[Sculpting a network]] exercise and use of [[The AMBIT Pro-Gram]].
The AMBIT programme is led by [[Laura Talbot]] & [[Liz Cracknell]]. [[DickonBevington]] and [[Peter Fuggle]] are consultants to the programme, which is hosted at the [[Anna Freud National Centre for Children and Families]].
AMBIT is the work of a group of original [[Authors]], led by DickonBevington and [[Peter Fuggle]], but it has only come into its current shape through the contributions of hundreds of practitioners in the many teams that have had [[AMBIT Training]] and have given feedback from the field.
<div style="background-color:lightblue">
<h1>Contact us</h1>
</div>
You can contact us via email [ext[ambit@annafreud.org|mailto:ambit@annafreud.org]] or, if you have a login, please feel free to leave a ''comment ''on the manual. You will see the comment box at the bottom of each page!
Alternatively, you can contact the AFNCCF details of which can be found on our website https://www.annafreud.org/
<div style="font-size:0.7em;text-align:left;margin-top:3em;margin-bottom:3em;">
<a href="mailto:ambit@annafreud.org" class="tc-btn-big-green" style="background-color:#5E9FCA;">
{{$:/core/images/mail}} Email the AMBIT programme
</a>
<a href="https://twitter.com/AFCambit" class="tc-btn-big-green" style="background-color:#5E9FCA;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/twitter}} @AFCambit on Twitter
</a></div>
<div style="background-color:lightblue">
<h1>Programme Staff</h1>
</div>
!!Dickon Bevington
{{DickonBevington}}
<div style="clear:both;"/>
!!Peter Fuggle
{{Peter Fuggle}}
<div style="clear:both;"/>
!!Laura Talbot
{{Laura Talbot}}
<div style="clear:both;"/>
!!Liz Cracknell
{{Liz Cracknell}}
<div style="clear:both;"/>
!!Rebecca Smith
{{Rebecca Smith}}
<div style="clear:both;"/>
!!Mark Dangerfield
{{Mark Dangerfield}}
<div style="clear:both;"/>
<div style="background-color:lightblue">
<h1>AMBIT Assistant Trainers</h1>
</div>
!!Verity Beehan
{{Verity Beehan}}
<div style="clear:both;"/>
!!John Lincoln
{{John Lincoln}}
<div style="clear:both;"/>
<div style="background-color:lightblue">
<h1>AMBIT Study Group Leads</h1>
</div>
!!James Fairbairn
{{James Fairbairn}}
<div style="clear:both;"/>
!!Anna Oriol- Sanchez
{{Anna Oriol-Sanchez}}
<div style="clear:both;"/>
This is a means of helping a team to [[SUSTAIN best practice]] in their day to day work during [[Team Meetings]].
{{AMBIT stance cards}}
A set of playing cards with the each of main elements of the AMBIT stance (see [[Core Features of AMBIT]]) printed on one, is shuffled and the cards are dealt - one to each team member - at the beginning of a team meeting.
The holder of each card becomes a "stance monitor" for that particular aspect of practice during case discussions, trying to keep a focus for that meeting on whether there are particular aspects of practice influenced by that element of the stance that should be emphasised.
This technique works best if a certain amount of playfulness is allowed to lubricate the serious intent underlying it. Stance bingo is an alternative that has been suggested...
<html><iframe width="640" height="360" src="//www.youtube.com/embed/gFOlVBLCmwY?rel=0" frameborder="0" allowfullscreen></iframe></html>
!! Background context to the study group
The AMBIT [[Community of Practice]] has grown considerably over the last 10 years with towards 300 teams and services completing AMBIT training and a continued high level of interest from other services nationally and internationally in the model.
In general, [[feedback from teams|Feedback on AMBIT Training]] (in relation to the experience of training and impact on their service) is very positive. However, with the growth and increased reach of the model there is a clear need to formally and rigorously evaluate the effectiveness of an AMBIT influenced approach. To date, there have been some smaller scale evaluations of AMBIT influenced services and evaluations currently underway e.g. CASUS.
Given the need to evaluate we are eager to investigate questions including:
# ''Whether an AMBIT influenced approach is effective?'' i.e. Does it help those areas that we intend it to (client functioning, team function, network function and learning).
#''Does it help clients and teams in meeting their own specific goals? ''
#''Does it cause any unforeseen problems? ''
#''How does it work?'' i.e. does it work in any of the ways that we would predict based on the theories which underpin it? What are the things that mediate or moderate outcomes?
There are a number of challenges in evaluating outcomes across AMBIT influenced teams. In particular, the nature of ambit itself- as an adaptive approach aimed to be applied in different ways across different contexts and with different client groups. There are no 2 AMBIT influenced teams who work in exactly the same way (although there will be common features of ‘core practice’ across teams).
//In February 2019 AMBIT influenced teams met together with researchers and academics to work on the theme of outcome evaluation. Some key points came from this including://
#''Measuring client functioning'' should be a primary outcome for any evaluation of AMBIT influenced teams. This means measuring whether there is a change in overall functioning for the client from beginning to end of contact (rather than just measuring changes in specific symptoms)
#[[Logic Models]] can be an important to underpin the evaluation. These are ways of breaking down the (i) resources needed, (ii) the activities that go on and (iii) the outcomes expected.
!!Evaluation pilot
There is currently a pilot evaluation project already underway with 5 AMBIT influenced teams who are trialling the use of the AIM as a pre and post outcome measure with their clients. These teams have been offered the use of [[Patient Outcomes Database (POD)|POD - a web based outcome measurement system]], an online secure data collection system, to record and pool their outcomes. There is also a shared spread sheet available for those teams not using POD.
These teams have taken part in a training day around evaluation, aiming to stimulate thinking about outcomes, the potential purpose and use of outcomes in their team, as well as training in the AIM.
!!''Plan for the AMBIT study group''
''The overall purpose of the group is'':
* To develop the AMBIT [[Community of Practice]], increase collaboration and build relationships between teams
*Support [[learning|LEARNING at work]] together in ways that are lively, creative and interesting!
*Build on the work that has started already within the AMBIT community and in the evaluation pilot teams
*Work together on defined shared projects. These will include building a shared data set and evaluation of the AMBIT influenced approach using the AIM as a first measure
*To work with client group representatives in developing the use of [[Evaluating outcomes]] in AMBIT
*Stimulate further post graduate research around AMBIT
<a class="tc-float-right">[img width= 300 [world.PNG]]</a>
!! Group membership
*The group will have representation from Europe, America and Australia
*Representatives of each team will be asked to commit to joining the larger study group twice a year, with a combination of multi-site and face to face meetings. Smaller sub-groups will join together more frequently. //Costs for attendance at meetings would need to be covered by local teams.//
*Teams joining the group would be required to use the [[AIM]] questionnaire and AIM ‘6 key problems’ as outcome measures pre and post intervention and share these with the group as part of the evaluation project
*After the group is established we will work as a closed group for a period towards shared specific objectives, including the evaluation project
*We intend that this would lead to publication of some of the work separately and together as a group
*We would like to stimulate shared learning around the model and it’s relation to the client groups that AMBIT teams work. We will use some of the AMBIT structures and theory to support collaboration and learning within the group meetings
''In draft''***
!NB: This refers to external supervisions provided by the AMBIT Programme at AFNCCF to external (AMBIT) teams
!!!1. The different functions of supervision
* Supporting ''Effective implementation of AMBIT practice''
** Facilitating local teams to use their OWN local implementation plans within their own practice
**Education - remind people of the model, helping people to consolidate learning of the AMBIT approach through relating it to their ACTUAL WORK DILEMMAS
**Case-based: helping a team with practice dilemmas related specific cases
**Encourage teams to consider all parts of the approach e.g. remind people to pay attention to all four directions in their work
**Helping local team facilitators to develop their local 'training' function
* Creating an ''Explicit Reflective Learning space'':
** what has gone well?
**what has been a challenge?
**why?
**what are the lessons?
**acknowledging and validating and managing difficult emotions in the work
**using our position at the edge of the pond
* An opportunity to ''record this learning''
** Collaborating to agree what is learned
** Manualizing the learning points
* Developing a ''Network of AMBIT influence'':
** Encouraging continued CONNECTIONS:
*** to ''each other''
*** to ''us at AFNCCF''
*** to the ''Community of Practice''
**''Sharing AMBIT practices/understandings'' across the local network/systems
!!Support AMBIT Local Facilitators to facilitate learning for their team
!!!2. How we do supervision:
* [[Thinking Together]] is the main structure:
** Use Marking the Task as an exercise to:
*** Shape the direct help provided by this supervision session around what the help-seekers think will be helpful for them...
*** Help the supervisor focus on THEIR personal responsibility to be actively mentalizing self and other (note the supervisor's isolation in this role) - Marking the Task enables the supervisor to ask for the help of the supervisees in this respect (//Have I mentalized the nature of this task, do you think?//)
** Provide teaching about the nature of Thinking Together and Mz
''TO BE CONTINUED... (Work in Progress)''
Important that the AFNCCF AMBIT Programme use this page as a place to share their experiences, because ''note that Supervision is one of the ONLY activities that we do in ISOLATION''... so sharing our practices and experiences is important to learn, and get assurance of some consistency of method.
Other points to debate/share:
* do we manualize during sessions? When? how? When NOT? Why should we not?
* are there OTHER structures apart from Thinking Together than people use?
* When do we shift into more of a 'training' mode?
Etc Etc
!!!3. Connection between training, supervision and implementation support
!!!4. Structure/s for sessions
!!!5. Tools for supervision (including APrAT and ASEQ)
!!!6. How do we seek feedback on supervision
!!!7. On administrating: pairing teams up for supervision
<<tag-navigation tag:"Module 1: Introductions and Mentalization">>
<<tag-navigation tag:"Module 3: Working with your Team">>
<<tag-navigation tag:"Module 4: Working with your networks">>
<<tag-navigation tag:"Module 5: Working with your client">>
<<tag-navigation tag:"Module 6: Learning at work 1">>
<<tag-navigation tag:"Module 7: Learning at Work 2">>
<<tag-navigation tag:"Module 8: Review and implementation planning">>
The following content is curated under the heading [[AMBIT-R training programme]]:
{{AMBIT-R training programme}}
This is just the TIMETABLE for the AMBIT-R programme (AMBIT for residential settings) - see the detailed trainer instructions for each day here: <<tag [[AMBIT-R training programme]]>>
<<tag [[AMBIT-R Training Schedule]]>>
!Day 1
{{AMBIT-R Training Schedule - Day 1}}
!Day 2
{{AMBIT-R Training Schedule - Day 2}}
!Day 3
{{AMBIT-R Training Schedule - Day 3}}
!Day 4
{{AMBIT-R Training Schedule - Day 4}}
Below is the training schedule for __ [[Day 1|AMBIT-R training programme DAY 1]]__ of AMBIT-R training.
----
1. Activity: Before we start, where are you now?
2. Activity: Introductions
3. Discussion: Planning the day
4. Exercise: What are your existing strengths?
!!>BREAK for COFFEE/TEA
5. What makes this work hard?
5(a) Activity: Describe the challenges
5(b) Activity: Create examples (Who are Our Clients?)
6. Activity: Develop Training Goals for the team
7. Discussion: What PROBLEMS is AMBIT designed to help with?
8. THE CORE IDEA: MENTALIZING
!!>BREAK for LUNCH
8. (Continued) WATCH FISH TANK CLIP
9. PRACTICE Mentalizing WITH TEAM-MATES.
9(a) ''Reminder - it's not just our clients whose mentalizing wobbles!''
9(b) Exercise: The [[Passed-outwards Discussion]] or 'POD'
9(c) Additional Trainer/facilitator notes on the POD:
!!>TEA BREAK
10. Putting it together: What's the POINT of mentalizing?
10(a) Exercise: Obstacle Course - taking advice!
10(b) Teaching on Epistemic Trust
11. Putting it together: what is AMBIT?
!!>END OF DAY
Below is the training schedule for __[[Day 2|AMBIT-R training programme DAY 2]]__ of AMBIT-R training.
----
1. Recap and feedback on DAY 1 (up to 30 minutes)
2. Preparing for today
3. EXERCISE: "a well-connected team"
3 (a) - Taking stock of our team
3(b) Help-giving for team-mates can be hard to do
!!>TEA/COFFEE BREAK
4. A disciplined approach to helping conversations: "Thinking Together"
4(a) Play the video introducing [[Thinking Together]]
4(b) Play one of the video demonstrations of "Thinking Together"
4(c) Practice this
4(d) Take feedback from groups: How was it for you?
4(e) Practitioner reflections on using Thinking Together in the field
!!>BREAK - LUNCH
5. Team around the Worker
5(a) Exercise
5(b) Think about the position of ''RESIDENTIAL CARE WORKERS''
6. Working with our NETWORKS
6(a) Dis-integration: a painful truth in complex systems
6(b) Group discussion: Wearing Different hats
6(c) Facilitated brief Group Feedback
!!>BREAK - TEA
6(d) Addressing Dis-integration
6(e) Mapping a system of help: the AMBIT Pro-Gram
7. Concluding remarks and reflections
!!>END OF DAY
Below is the training schedule for [[Day 3|AMBIT-R training programme DAY 3]] of AMBIT-R training.
----
1. Feedback
2. Plan for day
3. Why mentalizing matters in the work we do: Epistemic Trust
4. Putting mentalizing to work with clients: the Mentalizing Stance
5. Active Planning: applying the mentalizing stance to Planning help for clients
!!>COFFEE BREAK
6. Working with Networks: Sculpting
7. Working with Networks: The Dis-integration Grid
!!>LUNCH
8. Learning at work
8 (a) Line-up exercise
!!>BREAK FOR TEA
8(b) LEARNING at work conversation
8(c) Manualizing exercise, and the Wiki Manual
Feedback and end
!!>END OF DAY
Below is the training schedule for __[[Day 4|AMBIT-R training programme DAY 4]] __of AMBIT-R training.
----
!!>Trainers/Facilitators notes
!!>Feedback and orientation
!!>Plan for the day
1. General theme: fostering important conversations
2. Practice: Team Meetings
!!>Coffee/Tea Break
2. (Continued) Practice: Team Meetings
!!>LUNCH
3. Learning: Using measures/outcomes in the team
4. Implementing //what matters to the team//
4(a) Exercise: Trolley dash
4(b) ''Changing behaviours in a team is very hard''
!!>TEA BREAK
5. Catch up time
!!>END
!!Background reading for trainers
!!!__What is AMBIT-R?__
For a dropdown menu of ''trainer's instructions'' for running each day's training curriculum: <<tag [[AMBIT-R training programme]]>>
For the ''timetable for each day'' of AMBIT-R training, click here: <<tag [[AMBIT-R Training Schedule]]>>
AMBIT-R stands for ''AMBIT-RESIDENTIAL'', a specific adaptation of the AMBIT training ''designed with and for workers in the Children's Residential Care sector, in and around the Great Manchester area''.
This adaptation was made possible by funding from ''Health Education England (HEE)'' and by our partners in ''Manchester City Council'', especially those members of staff in Children's Residential Care settings across the City who took part in the original three waves of training, that led to the development of this curriculum
!!!__Structure of the AMBIT-R training__
The core theory and practices of AMBIT are the same in AMBIT-R, but the training programme has been adapted to suit the needs and preferences of the workers in this field. There has been a particular effort to keep explanations of theory to a minimum, and to reflect preferences for //learning-by-doing// rather than through abstract (powerpoint illustrated) accounts.
!!!__BEFORE YOU START A TRAINING: Preparation__
See [[AMBIT Consultation Day]] and these notes made in Manchester:
In planning the training with commissioners, team managers and team members always ask the question: '''WHY ARE WE BEING ASKED TO DELIVER TRAINING HERE?'''
* It is important to recognise that the teams we train ''ALREADY KNOW A GREAT DEAL ABOUT HOW TO DO THIS WORK!'' - AMBIT does not come in to wreck things that already work (one of AMBIT's key [[principles|Core Features of AMBIT]] is [[Scaffolding existing relationships]])
* This is ''not'' just a training to ''"share a few special tricks”'' that will make things work with young people - we are not selling magic!
* This is a training ''to encourage a team (or teams) to collaborate with the trainers so they can develop their OWN locally-adapted and locally-applicable approaches.'' It is about helping teams //develop their own local culture// that will help a team do this hard work in ways that are more sustainable, fun, and above all, //effective//.
* Therefore, ''in order for this to work, it requires more than that trainees simply “turn up”''
* How do we create a culture in a local team to support continuous improvement?
** ''Senior managers must reassure staff'' (genuinely!) that this is NOT about reorganisation, special measures, etc, and nor is it about “tokenism” – throwing training at workers to solve a training budget underspend, etc.
** The message from the top down must be: //“We are invested in this.”// In order for that to happen, senior managers and commissioners must be able to grasp what AMBIT is, and is not.
** ''AMBIT-R PREP sessions:'' Consider how to ensure the attendance of the right senior managers before the training begins: they must be clear about what they are commissioning.
** ''Attendance of senior managers at the training?''
*** There may be circumstances in which senior managers would want to attend for episodes during the training. Could the team teach the “boss” what they need him/her to know about how they are trying to develop and work? This would need the boss to be pre-warned about the purpose of attending such sessions…
*** It may make sense for senior managers to come for the whole training, or in other instances to make space for them to come on day 4, when the team(s) could present their understandings of what they have covered, and what support they want from their manager to implement these things.
*** In some situations, a separate managerial stream for AMBIT-R trainings would make sense.
*** ''These decisions will rely on local expertise'', as there is no definitive evidence base that can determine the right way to engage and involve both workers and managers effectively in a particular setting.
** ''Managerial support for WHOLE TEAM ATTENDANCE:'' this is a TEAM approach that needs commitment… if only a small section of a team attends there is a risk that this creates two teams within a team. There are smart ways to approach rotas in order to facilitate this whole team attendance, but it is important to stress this.
** ''Pre-training reading or videos'' – some people like this.
*** See the AMBIT crash course in short videos: [[here|https://www.youtube.com/playlist?list=PLJK5O2B_tNfmo8FRObOGKZ0jr3dhaiM_D]].
** ''Broadcast intentions'' around the pre-training questionnaire ([[ASEQ|AMBIT Service Evaluation Questionnaire (ASEQ)]] etc)
*** These are most definitely NOT to spy on staff!
*** They are to help the trainers to get a reasonable idea of the team's //existing strengths and challenges//, and to offer the possibility of a pre- and post-training //measure// that could indicate outcomes for the team. //"Has this training made the differences we wanted it to?"//
!!!__Materials required for Trainings__
This is a non-exhaustive list of materials required for a training:
* Projector, screen, leads, and laptop
* Access to ~WiFi
* Access to the online manual at https://manuals.annafreud.org/ambit
* USB stick for videos/slides (if wifi not reliable)
* Access to the first 6 minutes of the [[Fishtank film clip]] - either on a DVD, online subscription, or you may find it on ~YouTube.
* ROOM with space for floor exercises! - if the space for training is too cramped it will seriously affect the outcomes.
* POSTERS of the wheel (change “Key worker” to “Trusted Worker”)
* HANDOUTS – lay the materials out IN THE ORDER THEY TRAIN IN IT! E.g. Days 1, 2, 3, 4…
* Post-it notes (lots)
* Cardboard Cutout people (blanks - a commercial example is [[here|https://www.cardboardcutoutstandees.com/?gclid=CjwKCAiAksvTBRBFEiwADSBZfIEh37j2uDiIaY71mULYVQgmzH7gJJ9uj8XDlgHrgR7ToADSQlgxdxoC8EIQAvD_BwE]])
* Flipcharts and Pens
* Powerpoint slides, Projector, Screen, Internet connection and laptop
* Extension lead
* A Brain (model!)
* Cones etc and Voice-changer for Epistemic Trust game
* Toy supermarket trolleys (2) - optional but wonderful if available
* AMBIT cards - (see list for Trolley dash on Day 4)
* AIM questionnaires
!!!__On the use of Videos__
Many of the videos were originally made for this project, as a way of "compressing" the theory elements of the curriculum. However, the general feedback from early versions of the AMBIT-R training that trialled these videos, was that despite being shortened and simplified they were still //too long or "school-like"// or they //took away from the authority/liveliness// of the face to face training that was important to staff.
We therefore recommend that the <<tag Videos>> are better used as:
* ''Preparatory work for [[AMBIT Local Facilitators]]'', so that they are clear what the key learning points are.
* ''Resources ([[Training exercises]]) for teams to use POST-Training'', in locally-run top-up sessions
** i.e. watch ONE video together at the beginning of a team meeting
** discuss this/do one of the [[Training exercises]] to practice this/monitor your team’s use of these ideas in the week ahead
* ''E.g. watch the [[Epistemic Trust]] video as a team''
** Ask each team member to talk with a partner about how they might try to use (or have in the past used) epistemic trust, or these ideas.
** Ask them to apply this in a more purposeful way in the week ahead, and report back to the team about how this went, and whether this makes a difference.
** Next week: feedback on this session, and on how this “tryout” went.
Repeat with next video!
----
See <<tag [[AMBIT-R training programme]]>> for a drop-down menu of each day's training curriculum.
For ''timetables for each day'' of AMBIT-R training, click here: <<tag [[AMBIT-R Training Schedule]]>>
!!Intro:
These are notes for [[AMBIT-R]] facilitators and trainers, to support them in working through a structured AMBIT training.
See the page [[AMBIT-R training programme]] for more introductory material.
See the pages tagged <<tag [[AMBIT-R Training Schedule]]>> for just the timetable (without the instructions)
The better you know these notes beforehand, the less you will need to refer to them during the training, but we think it would be helpful to have access to them during a training.
The point of these notes is to ensure that any AMBIT-R training is basically the same as the others. If that were not the case then how would we know if one AMBIT-R training was the same as the next, and whether this work is actually making any difference?!
You can use the associated (embedded) film clips to support the exercises and team discussions in the room (assuming you have internet access where you train) OR you can use these film clips to clarify the purpose of each exercise //before// you deliver the training.
----
!DAY 1
!!!See [[AMBIT-R Training Schedule - Day 1]] for the Day 1 timetable only.
!!__1. Activity: Before we start, where are you now?__
Before any discussion, collect baseline measures (unless this has already been done at an [[AMBIT Consultation Day]]). Below are some suggestions:
* [[AMBIT Service Evaluation Questionnaire (ASEQ)]] questionnaire
* [[GHQ-12]] Questionnaire
* Any other measures (as agreed in the PREPARATORY sessions (see notes in [[AMBIT-R training programme]], and [[AMBIT Consultation Day]])
** ''Why?'' - because we (us trainers, and you participants!) all need to know whether this makes any positive difference!
!!__2. Activity: Introductions__
This is to get people to warm up, to know a bit about each other, to have an experience that //''they are going to be invited to involve themselves!''//
!!!Speed dating
See __Trainer notes__ below if you have not run this exercise before!
* Everyone get up
* All walk around the room in random patterns without bumping into anyone
* Every minute or so, the trainers call STOP!
* At this, people partner up with the person nearest to them, and on each occasion they're told to find out from each other ONE of the following options, and take FEEDBACK in a very particular way (see below):
# Why are you here?
#What do you really want from this training? ditto
# What do you really NOT want? ditto
''Taking Feedback:''
# Invite feedback on ''what people understood of their __partner’s__ answer.''
# NB do NOT ask people to feedback their OWN answers!
# Invite people who heard their answers repeated to the group - what was that like if your partner represented you well? What was it like if they phrased your words slightly differently/got the wrong end of the stick?
* Ask for general feedback on what was interesting in what they heard.
* FLIP CHART OR RECORD THE THEMES that come up on post-it notes - these will be guides for the training ahead, and can be arranged to start illustrating the AMBIT model (see guidance notes below)
!!!Trainer guidance notes on "speed dating":
* ''Set the context before starting:'' this is an ordinary introductions warm up //BUT there is a twist to it that will help us to think about this thing called 'Mentalizing'//, so __pay attention!__
* ''Record the THEMES'' arising from the group on a big blank version of the AMBIT wheel - use post-it notes or a white board marker...
** Record points in one of the four quadrants (stick them there if the points are recorded on post-it notes), depending on whether they relate to:
*** CLIENT work
*** TEAM work
*** NETWORKS
*** LEARNING at work.
* ''Record as QUOTATIONS in the CENTRE of the wheel any MARKERS of Mentalizing'' that you notice in the reporter who introduces the other person, statements like:
** //“I’m not sure but…”//
** //“What I understood from X is...” //
** Are they using eye contact and verbally checking in with the person they are introducing (//“Did I get that OK?”//)
* Ask ''what it was LIKE to be the introducer of the other person?''
** Look for anxiety to get it right, do them justice, etc - //we all know how painful it is to be misrepresented!//
* Ask ''what it was like to BE INTRODUCED''
** What was it like if/when the introducer //did get something slightly wrong?// (there is something important at stake if we are mentalizing each other!)
Other (older) ways of doing intros exist: see the conventional AMBIT approach to [[Initial introductions at a Training event]].
!!__3. Discussion: Planning the day__
Here, you are [[Broadcasting Intentions]]... so allow for some comeback from trainees, but don't get too drawn into discussion! If there are critical questions/worries, NOTE THEM on flip chart so that you can revisit these through the day, don't try to answer every worry or complaint or you may never get started.
!!!Spend 5 - 10 minutes to briefly ''outline the shape of the training ahead'':
* It lasts for 4 days
* It does obviously has //some// "curriculum" (new stuff to learn)
* The reason for having some curriculum (//learning// - which not everyone loves to do!) is:
** ''to HELP workers'' who work in very challenging places by bringing the most up to date EVIDENCE for WHAT WORKS into the field
** ''to EMPOWER workers'' - especially groups of workers who are often ''NOT RECOGNISED/VALUED'' in the wider system for the detailed //knowledge// and //understanding// and the //trusting relationships// that they are able to build with very vulnerable young people.
** Giving workers access to some of the most cutting edge language and and approaches is just one way to help amplify their voices in the professional networks that they are part of.
* The training is designed //at least as much// to encourage ''TEAM LEARNING'' as it is for individuals to "cram" new skills.
** There are //no exams at the end!//
** Because of this, the //conversations between and within teams// that will take place through the training //are at least as important// as anything that comes from the front of the room!
** The bad news is that //this training relies on people getting involved and thinking and communicating with each other//, rather than being spoon fed "from above".
** We want this training to help people have some useful ''shared experiences'' over the coming days, that they can think about and learn from, as well as just supplying them with some new words and ideas.
* ''Expectation management:''
** ''Day 1 is IMPORTANT but is //nearly always the toughest!//'' - it is where most of the learning/curriculum is presented.
** Finding day 1 hard is a //normal// part of the journey, so ''don't worry if it doesn't all make sense after Day 1!''
** ''Days 2, 3 and 4'' are much more about //putting this theory into your own team's practice// in ways that - we hope - help your team to develop and improve.
---
!!!More about the background of this training
* ''__Who built it?__'' This is a training designed for you by other ''people who work with Looked After Children in Manchester'', alongside members of the AMBIT programme (from the [[Anna Freud National Centre for Children and Families]])
* ''__What's the point?__'' Defining goals for the training (reminder about the Pre-training preparation – this is not about topping you up with a few extra magical individual “Ninja-skills” in how to persuade young people to be calm/happy/obedient/etc!)
** We are assuming that you are probably ''already quite/very good at this work''
** ...so this training is more about:
*** how to ''work as an effective TEAM'' - supporting each other, sharing expertise, training the next generation of workers...
*** how your team can ''work more effectively in the wider NETWORK'' of professional and informal helpers around the young people you look after.
*** how the team might ''keep CHANGING how it works (Learning)'' in ways that make sense to its members and which fits the evidence of their eyes, ears, and research.
*** More generally, the training is about helping workers to recognise that //“it is OK to not be OK”// at times in this work… this work is ALWAYS going to raise emotions in us as well as in our clients. So in a practical way it is about “keeping our sense of direction”, especially in the middle of the storms that will always be likely to occur at times in this work.
----
!!__4. Exercise: What are your existing strengths?__
//Training is like treatment, and like treatments, there can be side effects!//
* So first, we trainers want to make sure we do no harm by accidentally undermining existing expertise (//"Don't do it like that! Do it like this!"//)
** ''AMBIT is all about the need to [[Respect local practice and expertise]].''
* This next exercise is to help us understand ''What of your existing practice must this training scaffold and strengthen'', and not undermine or break?
** ''AMBIT is "ADAPTIVE"'' mentalization-based integrative treatment - it is NOT about sweeping away existing practice and relationships, but providing an adaptable framework for services to improve themselves, based on current theory and evidence-based practice.
!!__''EXERCISE: the [[Elevator Pitch]]''__
This is a 60 second pitch "for an interested donor/commissioner with money in their pocket"
!!!Guidance for TRAINERS setting up the Elevator Pitch exercise
* PLEASE NOTE: - the //point// of this exercise is NOT for the teams to win the money! We want them to do two things:
** ''To clarify in their own minds what are their existing strengths'' and how and why they do things the way they do...
** ''To practice communicating this in a snappy way that they can all share'' and understand why being able to do that is important.
*** What do we do here?
*** Why do we do what we do? What is the point of all our labouring?
*** What do we do particularly well?
*** Why do we do it like //that//? Under what circumstances might we do it differently (a "Plan B")?
*** How would we all know when we would be shifting to "Plan B"?
{{Elevator Pitch}}
---
!!BREAK for COFFEE/TEA
---
!!__5. What makes this work hard?__
!!!5(a) Activity: Describe the challenges
* Invite group to develop as RICH a collection of different stresses and strains as they can (//"think as broadly as you can!"//)
* Write down each stressor on a post-it note.
* When ready, hand them in one at a time
* Trainers:
** Read them out one at a time - //''Note to trainers:'' clarify - have you really understood what they mean? - this is a helpful way of modelling the "mentalizing stance"//
** Place each note on floor in the middle of the circle (''Note to trainers:'' keep the suspense! //Without marking them out in advance//, agree as trainers where each quadrant on the AMBIT wheel is positioned on the floor, then as they are read out, place each post-it note in the relevant quadrant - ''CLIENT, TEAM, NETWORK'' and ''LEARNING'').
** ''If you are tech-savvy'' (!), take a photograph of the post-it notes, and use a photo-editing app on your phone to create a "double exposure", overlaying the picture of the post-it notes on this image of the AMBIT wheel.
<center>{{AMBIT Wheel_B+W_round.jpg}}</center>
<center> {{Wheel and probs.jpeg}} </center>
* ''LEARNING POINTS FOR THE TRAINERS:''
** Discuss with your training partner: //what is the balance or spread of the different problems and challenges this team describes?//
** If there are ''problems identified in ALL FOUR "Quadrants"'' of the AMBIT wheel, then this is generally a POSITIVE:
*** It suggests that this is a team that is intuitively thinking/mentalizing about their practice in a broad (AMBIT) way.
** If there are ''NO problems identified in a quadrant'', that is a helpful prompt for us as trainers to become curious about this:
*** Most commonly, teams identify the least number of "problems" in the [[LEARNING at work]] quadrant - which we think is worth us worrying about a bit!) Ask a few follow up questions to probe this:
**** Do you all feel that you are "on the same page" with the details of how you work, and why you do things in a certain way?
**** Do you ever get into confusion with "too many ideas" about what to do, or how to do it?
**** Do you ever set up formal opportunities talk about how to do this work?
*** Do you know how other people in the team do their work?
**** Would you all induct a new team member to the team in the same basic way, introducing the same basic practices and beliefs?
**** Does you team know how effective its work is (and if so, how)?
**** Does your team know which kinds of client or problems it most struggles to get positive outcomes for (and if so, how)?
** Which quadrant seems to hold the most "tension" or the strongest feelings? - Check back with the team to see if that is their experience.
*** Identifying this might influence the time allocated to exercises practicing mentalizing in that specific quadrant of the work for that specific team (//this is an example of ''adaptation'' in the AMBIT method/training!//)
* ''Most teams want some reassurance:''
** We are reassured by teams that can acknowledge the challenges in their work (teams that identify no challenges may be in a kind of [[Pretend mode]] non-mentalizing state of mind.)
** We see this work as //inherently// difficult and challenging, and would be most worried if a worker (or whole team) claimed not to recognise these kinds of dilemmas
** We have never met a team that doesn't face these kinds of dilemmas
* ''AMBIT is an approach that has been designed by and for workers facing these kinds of dilemmas''
** it starts from an attempt to recognise and record the difficulty
** rather than offering an "easy solution"
** in the AMBIT programme's experience (training hundreds of teams across the world) ''there is a great deal in common with the kinds of problems faced'', even though the details are very specific
* ''SHOW THE AMBIT WHEEL''
** We will cover this in more detail later, and thorughout the training, but for now, note that AMBIT has been developed for teams that identify challenges in all four quadrants:
*** [[Working with your CLIENT]]
*** [[Working with your NETWORKS]]
*** [[Working with your TEAM]]
*** [[LEARNING at work]]
!!!5(b) Activity: Create examples (Who are Our Clients?)
* Get into small groups
* Think of 1 - 3 typical (''ANONYMISED'') clients that your team works with
* Generate comments on Post-it notes that describe //their perspective//:
** how would they describe //feeling//?
** how would they explain their //beliefs// about the care system/carers/helpers?
** what would they want a helpful worker to know about their //past and present experiences?//
** how would they explain the kinds of external pressures (what the world demands/expects) they face?
* ''If you have cardboard cut-outs'' available then stick the post-it notes on these
** ''Keep them in the room'' during the training
** If AMBIT training doesn't help you to be more helpful to //them//, ''then AMBIT training is not helpful''
!!__6. Activity: Develop Training Goals for the team__
* Goals are ''aspirations, hopes, "best case scenarios"'' but can also be used to measure progress...
** Later on, today, we will create some ideas of how to measure our progress ([[Evaluating outcomes]])
** Just now, the exercise is about allowing the team to generate ''hopeful aims and aspirations that //make sense to them//'' in relation to the challenges that they all face.
** If these have already been drafted in a PREP day, remind the team what these were.
** Focus minds on areas of the [[AMBIT Wheel]] that were particularly challenging for their team in the earlier exercises
* ''Create a simple list, //or better still, an artistic poster// to record these''
** Later we will work on creating some more detailed measures that the team could use to know whether it was making progress.
** These goals will influence the [[Implementation Plan]] that we will develop towards the end of the training
''Trainer Notes''
* ''Here the trainers can do [[Broadcasting Intentions]]'' - //"What we are trying to do here with you..."//
** We want to help teams to do the work that they do, but in ways that they know to be //better//
** We take a position that no team on earth could ever find nothing about its work to improve upon!
* ''Stating the obvious'':
** //"You are in a helping relationship ''with us as your trainers/facilitators''"//
** You bring your team's practice and experience, in the hope that together we can help improve things.
* Emphasise ''Parallel processes:''
** Meeting you as a team, is very like when we meet a client - not surprising as we are all human!
** ''We'' cannot start helping ''you'' until you have some trust in us - this is just as it is for a young person arriving in your care.
** You are unlikely to trust us //until you feel we have a basic understanding of how things are for you...//
* ''Different intentions and expectations between team members:''
** Some teams (or individuals in those teams) will come a with clear idea about what they want help with to improve, others will not.
** It is important to acknowledge in a //team-based// training (not everyone has individually signed up for this!) it is likely that some people don't want to be here at all!
*** This is fine: "people are where people are"
*** We //do not// want to deny the different perspectives in the room
*** We //do ask// that attendees try to access positive intentions towards contributing to the team's practice, even if they also feel scepticism, or other frustrations
* In this training, the conversations and decisions that teams can have amongst themselves are as important as the "theory/learning" that comes from the front of the room.
!!__7. Discussion: What PROBLEMS is AMBIT designed to help with?__
* If you want, you can watch a video about the nature of the difficulties that AMBIT has been developed to address:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/g2bk7sSKD-c" frameborder="0" allowfullscreen></iframe></html>
* If not, just use a poster or projection of the [[AMBIT Wheel]] to give a "quick walk around":
** ''(a) Emphasise the need for BALANCE''
*** AMBIT does ''not just focus all attention'' on the relationship and work with the Client
*** AMBIT shows that to be SUSTAINABLE and EFFECTIVE, there needs to be equal emphasis on the workings of
**** ''Team''
**** ''Network''
**** and opportunities for ''Learning'' from evidence and local experience
** ''(b) Point out that in the middle is some of the science of communication''
*** [[Mentalization]] is the science of //“making sense of each other”//
* Group discussions and feedback
** Divide the large group into groups of c. 3-4
** 5 minutes of conversation
** Take feedback
!!__8. THE CORE IDEA: MENTALIZING__
* Ask the teams: //has anyone here already got some knowledge or experience of mentalizing in practice?//
** When people do have existing knowledge, try to acknowledge that the thing about mentalizing is that it is "simple but slippery" so hearing different accounts, can help to enrich our understanding.
** It's one thing to UNDERSTAND this stuff, but quite another to EXPLAIN it to someone else in ways that they can make sense of.
* The ''AMBIT training is not a THEORETICAL training, but above all a practical one'', //based on the best reading of evidence that we have at present//
** There is a huge amount of science - some of it very complicated - BENEATH the surface of mentalizing (Brain and [[Developmental Considerations]], [[Attachment theory]], [[Psychodynamic theory]], [[SocialCognitiveTheory]], [[SystemsTheory]] and the theory of [[Social Ecology]])
** This may or may not be of interest for practitioners in the field.
** What we are interested in is the //putting it into practice//.
** What follows, therefore is a //'boiled down concentrate'// of the most important parts of this idea - [[Mentalization]] - this is like the "load-bearing axle" in the middle of the [[AMBIT Wheel]].
* Watch video
** For most teams (short version - 10 mins):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/sq61A5wGC8o" frameborder="0" allowfullscreen></iframe></html>
** For teams who want more academic detail (longer version - 20 mins):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/mCqrgQSe2MY" frameborder="0" allowfullscreen></iframe></html>
*''Small group discussion''
** Which bits make sense to you, which do not?
*** How might you talk about these ideas with a colleague?
*** With a Client?
** If people respond with confusion, reassure - we will revisit this throughout the 4 days
** ''If people respond with "This is what we do anyway!"'' - then this is:
***''(a) a relief!'' - it would be odd to think that there was some magical new thing to replace what has worked for centuries
***''(b) an opportunity for gentle challenge!'' - do you //really use these ideas in systematic, regular ways?//
* How would you know that somebody's pre-frontal cortex is busy (that they are actively Mentalizing)?
** See the [[Features of Successful Mentalizing]] for more details on this.
---
! BREAK for LUNCH
---
!!8. (Continued) WATCH FISH TANK CLIP
Watch the [[Fishtank film clip]] and discuss:
* where did you see evidence of Mentalizing?
* see notes on this exercise on the page [[Fishtank film clip]]
{{Fishtank film clip}}
!!9. PRACTICE Mentalizing WITH TEAM-MATES.
!!!9(a) ''Reminder - it's not just our clients whose mentalizing wobbles!''
AMBIT suggests that it it is ''just as important'' to create strong (accurately-mentalized) relationships with your TEAM-MATES as it is to do the same with your clients.
* The analogy of the climber (the worker "out there alone with the client") and the partner holding their rope. Do we have the right communication to know when our partner needs us to "hold on" or to pay out rope?
!!!9(b) Exercise: The [[Passed-outwards Discussion]] or 'POD'
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/0hea7zaIZdw" frameborder="0" allowfullscreen></iframe></html>
* After the exercise:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/q1MNTgDLvYU" frameborder="0" allowfullscreen></iframe></html>
!!!9(c) Additional Trainer/facilitator notes on the POD:
Note: there may be some repetition from above material, and this is really more "background reading".
{{Passed-outwards Discussion}}
---
!!TEA BREAK
(Trainers set up an obstacle course during the break. ''Note:'' this will be moved around once the exercise gets started, so just free up the furniture you need. Use chairs, etc. Keep an eye on safety!)
---
!!10. Putting it together: What's the POINT of mentalizing?
...EPISTEMIC TRUST!
!!!10(a) Exercise: Obstacle Course - taking advice!
Requires Voice-synthesizer toys!
* Divide into teams of 3 - 4 people each
* Each team picks a runner from their members
* Each runner picks their own helper from their team
* The runner and their helper leave the room and can spend a few minutes working out their strategy (the helper will direct the runner by the spoken instructions "Stop!" "Go!" "Left!" "Right!" "Back!" - no other words are allowed, but they can use tone of voice, etc, to add more information if they wish.
* As they are preparing, move the course into its final position
* The runners are blindfolded and return to the room with their helpers
* There is a five second time penalty for each time a runner collides with a part of the course, or with another runner (do emphasise safety!) and the umpire's word is final.
* Race, and reflect briefly on what this was like for the runners.
* Send the runners back out - but without their helpers.
* Change the course around again so they cannot know the way (warn them that this will be the case)
* Come back for "Round 2:
* This time the same runners are paired with an ANONYMOUS helper from their team, //who can only speak through the voice synthesizer// so that their voice is (we hope!) unidentifiable and alien.
* Repeat the race
* Ask for the runners to give feedback on what this was like, especially in comparison to the first round.
!!!Discussion:
How easy is it to trust the person who is trying to help you? What helps you to trust their advice?
!!!10(b) Teaching on Epistemic Trust
Either watch the video together, or just discuss.
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZBeEOkwLToM" frameborder="0" allowfullscreen></iframe></html>
* ''Group discussion:'' Keep this discussion reasonably brief
** Emphasise that ''//effective work// - whether as a therapist, or a residential care worker, or a teacher, a social worker, a parent, etc, etc, //almost always requires that we create some epistemic trust.//''
** If we did NOT create Epistemic Trust, then our clients would never try anything new based on our work with them after they walk out of the door!
** //Mentalizing// that is accurate enough is what "wins" Epistemic Trust.
** //"If you can 'get' me like that, then I am interested in what __else__ you understand and know, because it just might work in my world, out there!"//
** Mentalizing probably explains WHY what we do works (when it does) and it helps us to focus our efforts on the really effective things that we can do.
** ''__NOTE!__ Epistemic Trust is NOT BASED ON SPECIAL TRAINING, OR SENIORITY OF ROLES, OR EXPERTISE'' - young people will decide who "gets" them, and who they trust... (even if sometimes those are not at all the people we would choose for them!)
** Helping systems have historically been very poor at recognising this:
*** They have //down-played// the importance of Epistemic Trust, while //emphasising// (hierarchical) specialist skills.
** ''We are NOT wanting to undermine the importance of specialist skills'', but we ARE wanting to //promote the importance of Epistemic Trust//, and the value in creating systems of help that look out for, and really value Epistemic Trust when they see it.
''If residential care workers have one skill above all others'', perhaps it is that they are often (not always!) uniquely good at establishing relationships of Epistemic Trust with young people who find it especially hard to trust anyone.
!!11. Putting it together: what is AMBIT?
* Watch video:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/HrEgDdsohNo" frameborder="0" allowfullscreen></iframe></html>
* Group discussion:
** What do they make of this?
** How do they see this as applying to their day to day work?
*** Where do they see their work as "in balance", and where does it get "out of balance"?
*** Which quadrant do they see as the most challenging for their team?
* Feedback
* Trainers' final 'confessions':
** //The day's training you have just completed was structured to try to help you trainees experience us, the trainers, as //coming to understand you, and your own struggles and challenges in the work you do (rather than just filling you full of facts/instructions).
** If this worked at all, we hope that we have developed a little bit of [[Epistemic Trust]] in you towards us!
** We may or may not have been successful, but that was our aim - to show you by doing, as much as by telling!
----
!!END OF DAY
---
Click <<tag [[AMBIT-R training programme]]>> for links to days 2, 3 and 4.
!DAY 2
!!See [[AMBIT-R Training Schedule - Day 2]] for the Day 2 timetable only.
!!1. Recap and feedback on DAY 1 (up to 30 minutes)
* Discuss in small groups
** //What has stayed in your mind that seems valuable?//
** //Any key things that you are left unclear/concerned about?//
* Each small group feeds back one or two points from their discussion to the wider group
** Take notes on flipchart of any points that might need further attention
''Notes for trainers''
* ''The aim of this discussion'' is to get an understanding of the range of current states of mind that the group is in.
** You won't win their [[Epistemic Trust]] if they don't feel that you have understood //their// position.
** This training programme is perhaps slightly different from other training programmes because it is NOT just about the trainers delivering a bunch of information and instructions to trainees; it very much more about the trainers bringing their material ([[AMBIT-R]]) into a //dialogue// with workers who are assumed (because we [[mentalize|Mentalization]] them!) to bring their own experiences, expertise, hopes and fears with them. It is also about the trainers helping to set up a context which allows trainees to explore each other's understandings and to collaborate to clarify what their //shared understandings// are about what works and what does not in the work they do in residential care.
** Remember that //a wide range of feedback is quite normal// at this stage: it may range from enthused to confused!
* ''Responding to the confused/stuck/unimpressed:''
** First, //avoid a glib answer that seeks to"quick fix" it// (this would be you falling into [[Teleological thinking]], rather than holding on to our own [[Mentalization]]). Instead, seek to ensure //that you have really understood// (accurately mentalized) __how__ this person is confused/stuck/unimpressed - //do they feel that you have 'got them' properly?//
** Next, //offer reassurance to people that this training is a __process__// (not really a "product") - the next three days will be spent getting more into the detail of what AMBIT is (putting some mentalizing into areas of work where it often gets left out.)
** Offering //Advice and instruction// to trainees:
*** Our experience of training many teams is that things usually become clearer over the course of the different days - //"try to live with this uncertainty."//
*** For those who do feel a bit unclear at this point some advice that is worth giving: //"You can still help by 'bringing your mind along' and contributing"//:
**** When there are opportunities for team dialogue, engage!
**** Try to play your part to ensure that your team is having the conversations that it needs to have
**** Try to help create the best conditions possible for this conversation to bear fruit - calmness, compassion, respect... all these old fashioned ideas have their place here.
* ''Trainers aim to hold a balance'' between:
** (a) //Being responsive to feedback// by making any necessary adjustments where appropriate (i.e. clarifying some content; giving more practical examples etc)
** (b) //Holding the boundaries of the training curriculum// - getting through the materials/exercises is all about creating a space for teams to embark on their own learning journeys
*** This //holding a balance// is tricky, and, because we are human, we will wobble! This is why AMBIT trainings //always use at least two trainers//. ''Use your training partner;'' when one of you is speaking, the other should be mentalizing their partner and the trainees. Ask each other for help in the room, so that you are //modelling// help-seeking and using each other's minds, in just the same way that a "well-connected team" uses each other to help its clients. If this is working it makes for a much more lively, in-the-room, authentic style of training than just a mechanical "going through the material and doing the exercises".
** ''If there are trainees who take a more "combative" position:''
*** Strong characters can sometimes dominate a quieter group; it is important to avoid allowing their position to get in the way of the whole team's learning opportunities.
*** Such situations are rare; very occasionally it is helpful to set aside some time in a break to discuss with an individual your perception that their behaviour might risk shutting down other team members from feeling able to engage with the learning.
*** Our experience in the AMBIT training team has been that "sharing our dilemma" with such individuals, and //inviting them to help us// to make the training as safe as possible for all team members to explore/learn is often effective.
*** Such individuals may be experiencing this external training as being //disrespectful// of their existing expertise and practices - which is, of course, exactly the opposite of our AMBIT stance, which includes the principle to [[Respect local practice and expertise]] - be ready to emphasise that if that is the impression they have got, we have failed to communicate this clearly enough.
** This is, of course, a good example of us trainers using [[Active Planning]] (which we cover in Day 3 under "Working with your Client": balancing ''Plans/Doing'' with ''Broadcasting'' ('why we are doing these things in this way?') and ''Sensitive Attunement'' to our audience. Because //we are all "imperfect mentalizers"// we will always be slightly off-balance, but holding this balance is our aim!
* ''If there are "technical" or "theoretical" questions:''
** These can be "parked" on a flipchart
** There are plenty of books and papers, and all these are listed and described in the online manual (search "[[Academic references]]" or use this direct link: https://manuals.annafreud.org/ambit/#%5B%5BAcademic%20references%5D%5D )
** ''If theory questions threaten to derail the task'' of getting into practice, then //gently// remind people about the [[Pretend mode]] (one of the three ways that people "fall out of" balanced mentalizing)!
** ''Remember: your role as a trainer/facilitator'' is //NOT to be the expert on the theory, but on creating and holding the context for teams to learn...//
*** ...about one another
*** ... and to experience each other (and other professionals) as separate minds //worth// making sense of (i.e. mentalizing)
* ''Trainers are not Experts on the local settings/organisational challenges for specific teams''.
** This may seem obvious, but it is common that trainees invite trainers to take up positions of commenting on/solving details of local implementation //that they cannot possibly actually know about.// i.e. Trainers/facilitators shouldn't feel under pressure to offer quick-fixes or immediate responses to all the local dilemmas or concerns that trainees raise. ''For example:''
*** ...there might be some concerns about the applicability of the [[Team around the Worker]] ideas to a particular team's service context
*** ...there may be questions about how a team should deal with a specific Service manager, or Commissioner whom they perceive as "difficult", or some other organisational issue that is really outside the scope of what a trainer could be expected to solve (a "get out" phrase might be: //"it is just not in my AMBIT to solve this!"//)
*** ...or a belief that attempts to improve network functioning in town X will inevitably be unsuccessful.
*** ...questions about how a particular ethnic group may or may not make sense of the mentalizing model of human interaction
** Trainers may wish just to ''validate or "roll with" these perspectives/challenges, rather than seeking to argue or change them at this stage:'' invite people to revisit these perspectives throughout the training as they learn/experience more of the content.
!!2. Preparing for today
''Project the AMBIT Wheel''
<a class="tc-float-right">[img width= 500 [AMBIT Wheel_B+W_round.jpg]]</a>
For the rest of the training days, we will be "walking around the wheel" practising ways to use [[Mentalization]] in each of the four quadrants:
* ''Day 1'' tends to be the hardest (most theory, least practice)
* ''Day 2, today'' will focus on:
** ''Morning:'' [[Working with your TEAM]] help-seeking conversations and the well-connected team
** ''Afternoon:'' [[Working with your NETWORKS]] - Dis-integration in networks, and systematic efforts mentalize between different professionals and informal helpers.
* ''Day 3'' will focus on [[Working with your CLIENT]] and on [[LEARNING at work]] - especially on helping to create and sustain a "well-connected team"
* ''Day 4'' will focus on practicing more about [[LEARNING at work]] and on //implementing change// in the year ahead.
** //"So from now on we are trying to put these things into practice!"//
!!3. EXERCISE: "a well-connected team"
!!!Scene-setting:
Watch this video by Peter Fuggle:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/Zs37DCK2-A4" frameborder="0" allowfullscreen></iframe></html>
* ''Trainers should feel able to cover the following ideas/points during this section:''
** (1) Creating and maintaining a [[well-connected team|Keyworker well-connected to wider team]] is one of the [[Core Features of AMBIT]]; one of the eight elements of our ''principled AMBIT stance'' (the outer ring of the [[AMBIT Wheel]]).
** (2) Remember that each quadrant of the [[AMBIT Wheel]] has two "principles" attached to it, which describe one of the main dilemmas in that quadrant of the work. If you get ONE of these principles going well, it can often make you lose sight of the other one.
** (3) In [[Working with your TEAM]] the principle of "[[Keyworker well-connected to wider team]]" counterbalances the pull of trying to ensure that there are strong ''Individual [[Key Worker]] relationships''. It is very easy for a worker who develops a very powerful relationship with their client to then get a bit isolated from the help that their team-mates could provide (//"I'm the only one in this team who __really __ understands and cares about X"//).
* ''A helpful image/metaphor:''
** In the work that we do, it is very easy to think that it is all about how technically good at "climbing" I am, and to lose sight of //"who is holding onto my rope"//:
<a class="tc-float-left">[img width= 1000 [LoneClimber.jpg]]</a>
!!3 (a) - Taking stock of our team
!!!''Discuss in small groups (max 10 minutes):''
//How does this team already provide support and help to its members?//
* Think of as many different //places, times, and ways// that help-giving and help-receiving between team-mates already happens
* Think of some of the ways that, sometimes, the team is //not as helpful// to its members as it might usually intend to be?
* Note these down on flipchart paper
!!!''Large group feedback:'' (points for trainers to ensure they cover)
* ''This team is //already a helping system//'' - otherwise people wouldn't stay in their posts!
** //AMBIT does not want to change what is already working//, but to "finesse" and make small adjustments to //maximise// the helpfulness that team members provide for each other...
** AMBIT seeks to make "helping my team-mates" (and accepting their help) into a core part of day-to-day practice, not a "luxury added extra" or an "extra mile" for workers to feel they have to walk.
*''What does a "well-connected team" actually mean?''
** A team in which ''asking for and receiving help'' from team-mates is:
*** ''Expected behaviour'', from all team members
*** ''Taken seriously'' - as a core part of our work (helping a colleague is //not// "going an extra mile" or "out of the kindness of my heart"!)
*** ''Performed effectively'' - we will cover some disciplined ways to support this next...
** A team in which all members know "who is holding their rope", and have good enough communication to tell them when to //"hold tight"// and when to //"let me have some slack"//
** A team in which those "holding the rope" for their colleagues //know how to alert them to risks that they might not yet have seen// without that being taken as criticism (we will cover this in Day 3).
* //''This work IS STRESSFUL''//
** It is ''normal and proper'' to feel anxious doing this work (sometimes, not all of the time, or so much that you can't function!)
** If you do NOT feel anxious sometimes, you are probably in the wrong job! You are denying the real risks involved, a good example of the [[Pretend mode]] of non-mentalizing.
** Because we get stressed occasionally (however that might 'look' in our particular case - different people react to stress differently) our own capacity to Mentalize will sometimes reduce (ie. we are human)
** Because of that, we need the perspectives, knowledge, practical and emotional support of our colleagues: //when a trusted person mentalizes us accurately, we tend to recover our own abiity to mentalize//.
* So, in summary: //''Beware the "Lone-ranger" worker''//, who never seems to require the support of team members.
!! 3(b) Help-giving for team-mates can be hard to do
* Play //one// of the two videos on ''Thinking Apart'' to the group:
Either this one (Laura and Charlie):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/dhVwRaNGmtk" frameborder="0" allowfullscreen></iframe></html>
Or this one (Dickon and Peter):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/GMKWnfMN6uo" frameborder="0" allowfullscreen></iframe></html>
* ''Divide into small groups: discuss the scenario''
** What went "right" and what went "wrong"?
** ''These videos are just "caricatures"'':
*** do they reflect some of the realities of trying to help/being helped in your team?
*** have they missed out any other ways that help-giving can be hard to get right?
---
!TEA/COFFEE BREAK
---
!!4. A disciplined approach to helping conversations: "Thinking Together"
AMBIT is about helping teams to //"take back control"// of their local culture; purposefully trying to create the best possible environment for being well-connected. This section of the morning is about practicing ways to allow more mentalizing helping conversations between team members.
!!!4(a) Play the video introducing [[Thinking Together]]:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/nYFxbzL76aI" frameborder="0" allowfullscreen></iframe></html>
* Small group discussions (brief discussion for 5 minutes): what made sense in that?
!!!4(b) Play one of the video demonstrations of "Thinking Together":
Either this one (Laura and Charlie):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/iUaWgJ2ibiE" frameborder="0" allowfullscreen></iframe></html>
Or this one (Dickon and Peter):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZeSW-uWFfE0" frameborder="0" allowfullscreen></iframe></html>
Here the ''"4-step dance"'' is illustrated: a conversation that has four distinct stages:
# Marking the Task
# Stating the Case
# Mentalizing the Moment
# Return to Purpose
!!!4(c) Practice this
* __''Get into THREES:''__
** PERSON A: ''A help-seeker''
** PERSON B: ''A helper''
** PERSON C: ''An observer''
* __''Help-seeker'':__ Someone happy to bring a real clinical dilemma (not a piece of tough work, that they are secretly quite proud of, but a piece of work that they are genuinely a bit worried about, or feel as though they might be "going wrong" with.
** //''NOTE TO TRAINERS:'' remind groups that (unless there were immediate safeguarding concerns!) the CONTENT of these discussions will remain confidential within these small groups of three; ''only the experiences of the PROCESS will be shared later.''//)
* __''Helper'':__ Use the 4 step Thinking Together process to help you help your colleague
** When you are first practising it is helpful to announce which "step" you are in, and when you are switching to the next one.
** When you switch to step 3, Mentalizing the Moment, //try to change your physical posture a bit, pause, and breathe (!)//; you are trying to create a sense of relaxation, of purposefully not being so focused on an end-point, but of creating space for both of you now to //use your imagination// (which is what Mentalizing is!)
** Some people describe Mentalizing the Moment as the "soft centre" - like those sweets that have a hard coating!
* __''Observer'':__ Remain silent, but watch with some specific questions in mind:
** //At any point in time, am I aware which of the four steps we are currently engaged in?//
** //Am I completely clear in my mind what TASK it is that the help-seeker is inviting the helper to join in with?//
** //How do I feel the Help-seeker and the Helper are experiencing this?//
** //How could I give feedback to each of them at the end in a way that is likely to be experienced as helpful?//
* ''__Trainers: Allow 12 minutes for the exercise__''
** Emphasise that this is a "realtime" exercise - designed for use in the rush of real working life.
** Emphasise that of course you CAN use the same format over a longer period (a supervision hour, a team case discussion, etc) but here we want people to get a sense of the STEPS and the FORM of these "disciplined" conversations
** ''Call out time at c.5 minutes:''
*** //"Are you all really clear what Task has been marked?"//
*** //"Have you set enough a bit of time for Mentalizing?"//
** ''Call out time at c.10 mins:''
*** //"Have you started to return to purpose yet?"//
!!!4 (d) Take feedback from groups: How was it for you?
* ''Common feedback''
** (and suggested responses)
* ''__(a) [[Marking the Task]] was hard to do, or "took too long"__''
** This is nearly always the case, in most teams
** We are rarely clear when we start talking to a colleague about what it is that we want from them (ie we start talking //before we have mentalized ourselves//). In these situations how much harder must it be for our helpful colleague to be helpful, or even to know what they should be listening out for?
** Sometimes "the task" may actually be to help work out what, in a complicated story filled with feelings and concerns, should actually be the top priorities. If that is the case, then //Mark it//! This alone will help the would-be-helper to be more helpful.
* ''__(b) //"Woodenness" in having to use such a structured format//__ for a conversation that "should be natural".''
** This is why we need to train together (we //don't do individual// AMBIT trainings - it is //only a team approach//.)
** It only really works if //both parties know// that this is a //disciplined// and highly purposeful kind of conversation... and know what to expect
** If I have shared some training with my colleague, I can "put up with this tough, boundaried beginning to our conversation" - even if it can feel wooden or blunt - because //I know that this will make it more possible for my helpful colleague to properly ''attend to __me__''// (how this affects me, what I am really concerned about, what - and why - I think I need to move forwards safely, effectively, etc) later in the conversation (when we get to to the 3rd step of [[Mentalizing the Moment|Mentalizing the Moment (in Thinking Together)]]).
** Once people get used to this, it gets much easier to "not be wooden"!
* ''__(c) //"Trying to keep to the rules" took my attention away//__ from what I wanted to be thinking and talking about.''
** This is common - especially when the steps are unfamiliar
** It is especially so in teams where there is already a clear culture of "how we talk to each other"... try to 'trust the process' and play with new ways of working.
** ''Practice'' will reduce this experience
** ''Clarity'' about //why doing it in this way makes sense// reduces this experience
* ''__(d) Helper feels //"forced into being rude"//__'' by having to create such clear boundaries (especially in [[Marking the Task]])
** Ditto the points given above, about why we only use this across teams that have //shared this training//.
** If you know the intention behind this "upside down" approach to conversation (defining what a successful end-point would be, before you actually have the conversation) it feels less "rude" or "wooden"
** You //can use this with people who are untrained//, but to do so, you need to invest additional time at the beginning (as a would-be helper) in //explaining how and why you want to conduct this conversation in this way// - if the help-seeker is very anxious, this might not be the right time for such a conversation!
* ''__(e) 'Mentalizing the Moment' can make would-be helpers feel anxious:__'' - //"have I done it properly?"// or //"I didn't know how to start mentalizing"//
** Remember the [[Passed-outwards Discussion]] exercise on Day 1: the effort of the listener is //__first to understand, not to solve__// - mentalizing the moment in the Thinking Together routine is just the same.
** Remember that the first rule of mentalizing the moment is ''First, mentalize the worker, not the client'' (the client is not present, but your colleague is!)
** One easy way to get started is to //ask the worker to help you be sure you have understood ''how this situation has made them __feel__''// (as opposed to what they believe has caused this, whose fault it is, or what they think should happen next, etc)
** Another tip is to mimic the [[Passed-outwards Discussion]] a bit; try to "tell their story back to them, as if 'from the edge of the pond'" - in ways that you hope will allow them to feel that you have heard them, and made sense of (ie mentalized) their dilemma/worry/predicament.
** Once the helper gives the help-seeker a sense that they are at least partially understood (and understandable) it is likely that the help-seeker will already have begun to feel less isolated/misunderstood/stressed and will start mentalizing themself.
** //Helping our colleagues get back into a mentalizing state of mind// is one of the main purposes of Thinking Together - in ways this is MORE important than having to "come up with an answer" - especially if the nature of the problems are that they are incredibly complex, and simple answers are likley to too simplistic. //A mentalizing worker is much more likely to be helpful to their client than a non-mentalizing one!//
!!!4(e) Practitioner reflections on using Thinking Together in the field
Watch the video:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/rrPNer2c5rs" frameborder="0" allowfullscreen></iframe></html>
!!Trainer tips: Discussion Points
* ''Thinking Together is not magic!''
** Climbers //still fall off mountains// even though they have developed and use very disciplined ways of communicating to each other about the rope that holds them together!
** Thinking Together is not a guarantee that help offered will always be helpful, but it is a serious attempt to reduce the likelihood of it being experienced as //unhelpful//.
* ''Feed back evidence that this is valued by teams''
** Many teams - across the UK, and internationally, describe significant benefits from adopting this approach:
>1. Shorter more focused meetings
>2. Adaptability of this approach - use it in one:one supervisions, "corridor chats", phone calls, and in front of clients so as to //model// what "help-seeking and help-receiving" looks like, and to allow us to work in more transparent ways (a version of [[Broadcasting Intentions]]).
>3. More of a culture of support for each other's thinking in teams
>4. More clarity in defining and very clearly marking "work conversations" leaves more room for intervals of "recreational chat"/humour, etc, which can help team morale.
* ''Further uses:'' Later in the training we will practice how to use Thinking Together in [[Team Meetings]], etc.
----
!BREAK - LUNCH
----
!!5. Team around the Worker
!! Intro for trainers/facilitators
This topic is purposefully slotted in between thinking about [[Working with your TEAM]] and [[Working with your NETWORKS]], //because it applies to both//.
'Team around the Worker' is easy to talk about, and much harder to do in practice. It is an ideal, rather than a mechanical recipe:
* ''__How do we create systems of care that can:__''
** ''Look'' at the system //through the eyes of the client//
** ''Value the Key''- (//trusted//) -''workers'' that our client recognises at any point in time
** ''Demonstrate'' this value by //mentalizing// this [[Key Worker]] and //creating supportive and helpful relationships// with them.
It may feel like an //extra investment//, but if we start to "get the same back" from a wider network, it will become obvious that it is also an //"invest-to-save" policy//...
!!!5(a) Exercise
* Watch this video and then discuss in small groups:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/xjYFu6VkiMs" frameborder="0" allowfullscreen></iframe></html>
* ''Discuss in small groups, then feedback'' into the large group:
** //How does our team already work as a "team around the worker"?//
*** //Within// the team?
*** //Beyond the team?// (i.e. with workers from the wider multiprofessional/multiagency network)
** //How might our team benefit// from a wider network that had a stronger "team around the Worker" culture?
!!!5(b) Think about the position of ''RESIDENTIAL CARE WORKERS''
The idea of the [[Team around the Worker]] may be PARTICULARLY relevant:
* Residential care workers are very often (obviously not //always//, but often!) the professionals that young people experience as "getting me", and who they come to trust - especially with [[Epistemic Trust]].
* Residential care workers are also often (obviously not //always//, but often!) relatively invisible/powerless in the big multiprofessional/multiagency networks that gather around the young people they look after.
** //This is unhelpful to the young people!//
* Could a [[Team around the Worker]] culture in a local area change this, by helping:
** ''Residential workers'' - whose relationship of [[Epistemic Trust]] is noticed and valued, and who get better supported/protected by others
** ''Other professionals'' - whose efforts to access and understand young people (who DON'T find it easy to trust doctors, social workers, teachers, police, etc,) could be helped by the Residential care worker who has //earned this trust//.
** ''MOST IMPORTANT OF ALL: Young People'' - whose helping network might start to become //more coherent, more understandable, more trustworthy, and more effective//.
!!6. Working with our NETWORKS
!!!6(a) Dis-integration: a painful truth in complex systems
Watch the video on Complexity and Dis-integration:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/lRoOYlPwzWo" frameborder="0" allowfullscreen></iframe></html>
!!!6(b) Group discussion: Wearing Different hats
!!!''Wearing Different hats: Part 1''
''What do OTHERS say about US?''
[img[Wearing different hats.jpg]]
!!!''Wearing Different hats: Part 2''
''What do WE say about OTHERS?''
[img[Wearing different hats2.jpg]]
!!!6(c) Facilitated brief Group Feedback
* ''TRAINER TIPS:''
** Quite often it is the case that trainees are very enthusiastic in talking about all the myths and unhelpful misunderstandings that //other agencies, or outside professionals hold about us//, but are rather taken aback when they are invited to think about how WE must hold similar myths and misunderstandings about THEM!
** ''Use their examples'' to help them think about how it was quite easy to become a bit "certain" about the wrong-headed ideas others have about us
** ''Remember that //certainty// is often a clue'' that there is non-mentalizing ([[Psychic equivalence]]) happening!
** ''It makes sense that we become a bit non-mentalizing about other professionals'' because it is //frustrating/upsetting/worrying to be misunderstood//.... and when we are frustrated/upset/worried it is harder for us to mentalize!
**Emphasise the importance of recognising that ''mentalizing each other across professional networks is ALWAYS GOING TO BE HARD''. Failing to do so (we call this [[Dis-integration]]) is not necessarily a mark of professional shame/failure; it is pretty much inevitable.
** ''The professional response to this'' is to //predict it//, and be ready to //correct it// when it happens.
** ''This is not rocket science!'' In fact it is much harder than rocket science (which is just sums that either add up or not)!
** Multiagency and multiprofessional working should be seen as a much higher level skill than rocket science!
----
!BREAK - TEA
----
!!!6(d) Addressing Dis-integration
''Watch video:'' This is a very short introduction to three techniques (explained in later videos) that help workers in the task of ''Addressing Dis-integration''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/QxCNC08TJo8" frameborder="0" allowfullscreen></iframe></html>
!!!6(e) Mapping a system of help: the AMBIT Pro-Gram
* Watch the Video: emphasise that the [[The AMBIT Pro-Gram]] is a "back of an envelope" tool -one that only really needs a piece of paper (although a big white board, or flipchart paper is better!)
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/yU3jiKYUJEE" frameborder="0" allowfullscreen></iframe></html>
''Example of a Pro-gram:''
[img[Pro-gram picture]]
''NOW PRACTICE this technique based on a real client known to you:''
* In pairs.
* Ideally work with a team-mate who also knows the same case
* One person plays the client, one plays the worker.
** As in all AMBIT role-plays, ''if you are playing the client, //be generous!//''
** This is NOT an exercise to test ability to manage confrontation/challenging behaviour, but to practice [[The AMBIT Pro-Gram]] technique
* Try to reach the point where you can discuss possible ways to enrich/improve relationships across the network:
**(a) //"Who would it be helpful to arrange a conversation between?"//
**(b) //"If we know who we would LIKE to get talking, then HOW might we go about helping that to happen?"// (''NOTE:'' very often in networks it is //not within our __ambit__// [ie not within our sphere of influence/direct authority] to order such conversations... so a degree of subtlety and "soft power"/influence might be required to encourage/facilitate this.
* Discuss feedback in large group
* Then watch Liz Cracknell and Laura Roberston discussing and reflecting on the use of [[The AMBIT Pro-Gram]] in face-to-face work with clients:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/rAqx0uB82ns" frameborder="0" allowfullscreen></iframe></html>
!!7. Concluding remarks and reflections
* We have now covered some ''theory'' (mainly Day 1)
* We have covered some ''practice'' (applying this theory) in:
** ''Working with your Team''
** and in ''Working with your Networks''
* ''On [[Day 3|AMBIT-R training programme DAY 3]]'' we will look at
** Applying this with our ''Clients'' in face-to-face work
** Learning at work - ways in which teams might work towards mentalizing (making sense of) their own shared practices ("our own local culture of working") and starting to make purposeful changes, so as to develop themselves as a ''Learning Organisation'' (see [[Developing learning organisations]] for more detail on this).
----
Click <<tag [[AMBIT-R training programme]]>> for links to days 1, 3 and 4.
!DAY 3
!!See [[AMBIT-R Training Schedule - Day 3]] for the Day 3 timetable only.
!!1. Feedback
(a) ''Divide into small groups'' (3-4 people)
(b) ''Discuss where you have got'' to in small groups (for 10 minutes max)
* What was of interest and made sense to you from Day 2?
* How could you see any of these ideas or practices influencing your own team's practice?
(c) ''Send an envoy'' (each small group picks and sends an 'envoy' to the neighbouring group)
* ''Group'' describes to the envoy the key themes from their discussion
* ''Envoy'' reflects on what they have heard, and describes the key points of his/her own group's discussion
(d) ''Large group reflections on where the group is today''
!!2. Plan for day:
!!Morning:
# [[Working with your CLIENT]] - Epistemic trust, Mz stance, Egg and Triangle
# [[Working with your NETWORKS]] - sculpt and Dis-integration grids
!!Afternoon
# [[LEARNING at work]]:
## Teams, differences, and change.
## Manualizing areas of practice (Starting with Thinking Together in [[Team Meetings]])
!!3. Why mentalizing matters in the work we do: Epistemic Trust
Watch the video:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZBeEOkwLToM" frameborder="0" allowfullscreen></iframe></html>
!!!Discussion in small groups:
* What makes sense about this idea, and what doesn't?
* Think of some real world examples where you or a colleague were able to create epistemic trust in a client, by first creating conditions for them to say "you've really understood me!" - which then allowed them to "listen" to advice/understanding and then (perhaps!) to follow this and try something different later on...
* Feedback
!!4. Putting mentalizing to work with clients: the Mentalizing Stance
Watch the video:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/QF93rO36NaQ" frameborder="0" allowfullscreen></iframe></html>
Brief group discussion
* Feedback
* Ask the group to recall ''"What are the four legs of the Mentalizing Stance?"'' - in the stress of face to face work, it can be hard to keep more than four things in mind!
* We will practice the mentalizing stance shortly
!!5. Active Planning: applying the mentalizing stance to Planning help for clients
* Watch this video
** ''from 5:00 mins'' to hear about ''Active Planning'' (the video will automatically start here, rather than at the beginning where the [[The Therapist's Mentalizing Stance]] is described.)
** Alternatively, ''if you just want a description of the Egg and Triangle, start at 20:20 mins''
<iframe width="560" height="315" src="https://www.youtube.com/embed/GQZ6EIt_aP0?start=300" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!!Practice (ROLE PLAY):
Use [[The Egg and Triangle]] - pictured below - to practice the Mentalizing stance:
[img[Ment_Table_Stance_pic]]
[img[Egg and Triangle]]
[img[Egg and triangle (marked)]]
* ''Divide into groups of three (or four)''
* ''One worker presents a case'' (known to him/her) to the others
* ''The listeners, then collaborate'' to fill in the Egg and Triangle, while the presenter just listens/observes
** Those recording their understandings try to use statements in the "egg" that the young person (if he or she were present) would experience as accurately "getting me".
** They consider their intentions and plans for this client, and record these in the triangle
** Remember to think hard about the //top section// of the triangle (the //"Why?"// question that tries to connect the workers best intentions to something that would have value for the client.)
* ''The original presenter now ROLE PLAYS'' as the young person
** ''The others take it in turns to role play a worker'' //broadcasting their understanding and intentions// to the young person - using the Mentalizing Stance, and the Egg and Triangle that they have just filled in to "shape" the conversation
** Can they offer these ideas //tentatively// without trying to "mind-read", but offering them as a "best first-effort to make sense", one that they are sure the client can help them improve upon?
* ''__Advice on ROLE PLAYING:__''
** Note the word "Playing"! Play is the primary way in which children learn
** If you are role-playing a client, ''BE KIND!'' This is for your colleagues to practice, not for proving that some clients you know can be very challenging!
** Use "Time Out" when the worker "runs out of mentalizing" - all role players can talk about what is happening, why the the worker might have "got lost", and how they might restart the role play
** THEN RESTART! It is important not to get lost in talking //about// the role play (the [[Pretend mode]] of non-mentalizing!), rather than practising it!
** Notice how, once the role-play is paused, //it is much easier for everyone (especially the worker) to mentalize again//; this is probably because the anxiety for the worker reduces when they are not 'on show'!
** Try to bring the (mentalizing) conversation that happens in these //pauses// back into the role play itself: the mentalizing stance has been described as "thinking thoughtfully and kindly, but //aloud//, hoping that feedback will improve the quality of these first thoughts" - it is a "non-expert" stance, but takes practice (perhaps expertise!) to hold onto it, especially if the situation is stressful.
----
!COFFEE BREAK
''Advice for trainers/facilitators:'' during the break try to identify a trainee who can help to create a sculpt around a client. Choose a client whose professional network is reasonably extensive (and ideally, one which is not seen as working as effectively as it might in an ideal situation!)
----
!!6. Working with Networks: Sculpting
See [[Sculpting a network]].
* The point of this technique is to encourage workers to "take different perspectives" across a complex network of different professionals, agencies, and informal 'helpers' around their client.
* Especially, the exercise seeks create "thinking space" to help workers //make sense of the different positions that other workers find themselves placed in// (with their explanations, interventions and responsibilities all defined by their training, organisational priorities, personality, etc)
{{Sculpting a network}}
!!7. Working with Networks: The Dis-integration Grid
* It may be possible to complete the [[Dis-integration grid]] simultaneously with the sculpting exercise
* Complete the grid for the same case example
* This makes it very clear the fact that //both exercises// are just "thinking tools" to help workers mentalize the different minds of the people who make the wider network
** ''LEARNING POINT 1: Systems, Organisations, and Networks are in themselves //mindless//'', but they are composed of many minds.
*** AMBIT seeks to enrich understanding (mentalizing) of the different minds that are at work in networks
*** Networks that have improved relationships and understanding are much more likely to be able to adapt to become more effective
** ''LEARNING POINT 2: Use the Dis-integration grid to help identify 1 or 2 "Connecting conversations"''
*** [[Connecting Conversations]] are ones that - if you can help facilitate them - might reduce the largest, most unhelpful 'holes' (dis-integrations) in the existing network.
[img[Dis-integrationGridPicture]]
* ''More practice:''
** Divide into twos or threes - ideally pair with a colleague who knows the same client
** Discuss the network
** Fill in the Dis-integration Grid
*** Keep asking yourselves //"what would this worker think if they saw the points we have recorded about their position? Would they feel we have accurately 'got' their perspective?"//
*** Identify 1 - 2 [[Connecting Conversations]] that would make the most positive impact on the functioning of the network
*** Discuss //how you would strategically go about setting up, and facilitating these conversations//
*** ''Note: it may not be within your ambit to 'order' different people to talk to each other!''... how might you extend your ambit, to influence things in a positive way?
*** Remember the material on [[Epistemic Trust]] - if you want to encourage someone (another professional, for instance) to try something different, then first they have to feel that you have shown interest and understanding in them, and their dilemma, here and now!
----
!LUNCH
----
!!8. Learning at work
Note that LEARNING is in the lowest quadrant of the wheel - which is //"where the rubber hits the road"//
* It is LEARNING by local teams that will create the traction to move things forwards (not the clever words of the trainers!)
* Having the right conversations between team members is at least as important as the "curriculum" that comes from the trainers/facilitators
[img[AMBIT Wheel_B+W_round.jpg]]
''8 (a) Line-up exercise''
* Make sure you have enough space for the team to do the line-up exercise
* Watch the film AT THE SAME TIME AS YOU CONDUCT EXERCISE - the video instructs you to PAUSE it on occasions as you go...
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/tTJ6E6F3H7c" frameborder="0" allowfullscreen></iframe></html>
* Allow some group discussion
Watch the reflections on the Line-up exercise video:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/gsoWvi41a6E" frameborder="0" allowfullscreen></iframe></html>
----
!BREAK FOR TEA
----
''8 (b) LEARNING at work conversation:''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/DrNxEfCuM-4" frameborder="0" allowfullscreen></iframe></html>
Discuss briefly, then watch the next video which introduces a manualizing exercise:
''8 (c) Manualizing exercise, and the Wiki Manual''
* This video requires PAUSING at points to allow teams to practice as directed in the video
* trainers might prefer to watch the video beforehand, and then run the exercise themselves, or use the video to help them in the group:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/J-dzA7n8ZTo" frameborder="0" allowfullscreen></iframe></html>
* We suggest that teams start by manualizing something that they are QUITE PLEASED ABOUT
** //...something that they would want to be able quickly to induct a new team member into 'following their lead'//
* ''Alternative suggestion'': If teams wish to practice and then manualize how they could use [[Thinking Together]] in their [[Team Meetings]] then they could watch the two videos below to give some context:
Team meeting: "Thinking //Apart//":
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/CPuTn9ExNuw" frameborder="0" allowfullscreen></iframe></html>
Team Meeting using Thinking Together:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/lKI3zeHrQX8" frameborder="0" allowfullscreen></iframe></html>
!Feedback and end
[[AMBIT-R training programme DAY 4]] will concentrate on helpng the team bring these ideas together and make plans about which parts they want to try to ''implement'' in the weeks ahead.
Training that results in no change of behaviour is probably a waste of everyone's time!
----
Click <<tag [[AMBIT-R training programme]]>> for links to days 1, 2 and 4.
!DAY 4
!!See [[AMBIT-R Training Schedule - Day 4]] for the Day 4 timetable only.
!!Trainers/Facilitators notes
The final day has a slightly less packed curriculum, specifically in order to allow flexibility for catching up (if material was missed out, or under-covered from previous days) and to allow for local teams to spend time on locally-relevant conversations/planning, etc. The aim for today is that the facilitators should perhaps say rather less, and the team members should say more to each other!
!!Feedback and orientation
Where are we, now and where do we need to get to?
* Small groups - discuss and then each group feeds back to the large group
* Are there any key areas that need to be covered (missed from earlier days, or new material brought up by teams?)
!!Plan for the day
Here, we trainers are doing some [[Broadcasting Intentions]]! (Remember this from our practice with [[Active Planning]] yesterday? It is often helpful to ''do something'' with the group, and ''then explain what it was you did, and why, using AMBIT terms'', so as to bring these things to life.)
!!1. General theme: fostering important conversations
* Conversations that need to take place between team members
* Today is definitely not just about information flowing from facilitators/trainers to the trainees, but if trainers discover that important conversations are required then we hope (expect?!) them to agree to hold them ''in an AMBIT framework:''
** ''Use [[Thinking Together]]'', trying to support everyone in the team to bring their mentalizing to the table (recognising that this is fragile, especially if there is emotion connected to what is being discussed. Hint: //and there nearly always is in this work!//)
* Having said this, as trainers, you may have to ''Limit conversations to what is relevant to this training'' (what might this team as a whole choose to do differently, drawing on what we have been covering?)
** ''Conversations that do NOT fit into this, might include...'' significant inter-personal conflicts within the team, or between the team and management (this training is not the same as team facilitation/conflict resolution, even though it offers tools that might be helpful in doing this work) or very complex casework (many of the cases AMBIT teams work with are extremely hard to "solve" and, again, this training is not designed to do this here and now, but to help workers learn tools that might be helpful in this process.)
* ''If conversations arise that are not appropriate'' to be worked right through from start to finish, but which are important anyway, then "mark" or "park" them on a piece of flipchart:
** agree quickly what is the proper work-based forum for them to happen in
** agree quickly who would need to be there
** facilitate the right people to agree how/when they will fix a time to arrange this, or book it in to diaries straight away
!! 2. Practice: Team Meetings
Nearly every team has some kind of meeting that allows time for them to discuss the work.
* ''Discuss existing team meetings:''
** Divide into small groups of three or four
** In groups, discuss:
***//What works well and is valued about our team meetings?//
***//What makes them challenging, or less helpful than they might be?//
**Large group feedback
* ''Using [[Thinking Together]] //as a whole team//:''
** Watch videos (or parts of videos):
(a) ''Thinking APART'' in team meeting (well-meaning but ultimately unhelpful practice):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/CPuTn9ExNuw" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></html>
(b) ''[[Thinking Together]] in a team meeting'' (fictionalised case: Jamil):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/lKI3zeHrQX8" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></html>
(c) ''Another example of Thinking Together'' in a team Meeting (fictionalised case: Paul):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/jyOQdu9QwAc" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></html>
(d) ''When a team member is resistant'' to using Thinking Together:
* We suggest that the team (or Chair) responds by:
** //Mirroring his/her upset// (not by apologising and being embarrassed, or by trying to look sympathetic!)
** Reflecting //with our own sense of urgency// that "we __get__ that there is some urgency/frustration/etc here; and //we want to help// (rather than just nodding and look //as if// we are being thoughtful...)"
** In order to maximise the chance of us being genuinely helpful, however, we need a clearer understanding in our own minds of the task for us (the team) to "chew on".
** Note how this boundary-setting is intended to help to kick-start the help-seeker's own mentalizing - //"Why am I bringing this case to the team?"//:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/G9myCdw6WrM" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></html>
(e) ''Prompts for AMBIT-influenced practice:'' There are some simple ways of prompting/reminding workers about their shared intention to develop a mentalizing focus (balance-holding) into whole team practice/culture, as well as between individuals:
* ''AMBIT's Principled Stance cards'' Below is a video example of a team meeting, using cards (see below, too) to appoint members as "monitors" for each of the 8 different elements of the AMBIT stance (it is hard for an individual to hold the whole stance in mind, but a whole team can do so collectively, and this is good way to rehearse and remind each other what the principles are.):
See [[AMBIT stance cards]]
[img[AMBIT stance cards]]
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/gFOlVBLCmwY" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></html>
(f) ''ROLE PLAY A TEAM MEETING''
* One member of the team brings a real case with a concern attached to it to the team. ''Allocate a Chair'' for the meeting, whose role is to:
** (i) Hold to the "4 steps" of [[Thinking Together]]:
*** Mark the Task
*** State the Case
*** Mentalize the Moment
*** Return to Purpose
** (ii) Ensure that the thinking of all team members has the opportunity to be heard
** (iii) ''MOST CRUCIALLY:'' Ensure //the help-seeker's mind is kept in mind// by the team, rather than letting the discussion become a "battle of ideas"!
!!!Trainers tip:
Do keep in mind the fact that ''this is TRAINING'', so you are mainly focused on ''practising the new TECHNIQUES'', rather than getting too deeply involved in trying to solve the details of day to day work. This is much harder than it sounds! Work is what everyone here knows how to do, and it is tempting to let go of the difficult task of //trying to do something differently// in favour of the (difficult, but well known) task of fixing family X, or young person Y, or network Z. As a trainer, you may have to keep pulling people out from very detailed case discussion, and back into the technique.
A useful reminder to groups getting too far into the "nitty gritty of work" might sound like this:
>//"We are just __borrowing__ this actual case to help us practice. IF we find we suddenly solve the real problem out there, that is great! BUT the point of this exercise today is to __practice the technique__, not necessarily to solve the problem! Remember, too, that many of our cases are extremely difficult, and there is no magic that will change that! Often when teams practice a new technique, it is tempting for them to throw the most insoluble problem at it to 'see if it is any good' - but insoluble problems are generally insoluble! Try to concentrate on learning and making sense of the steps, and thinking about whether a STRUCTURE like this would be helpful if we practised it. It __has helped__ a lot of other teams (similar to yours) to have better meetings, but hasn't solved all the problems they discuss!"//
----
!Coffee/Tea Break
----
(g) ''TEAM DISCUSSION on TEAM MEETINGS:''
* Might this [[Thinking Together]] approach to case discussion be relevant in trying to make OUR FUTURE team meetings more helpful to individual team members?
** Try some [[Manualization]] - manualize the outcomes of this discussion (use the online wiki if you have one, or posters if not.)
*** Record points that receive general agreement
*** Record where there are two (or more) different ideas about what to do ("Path A" and "Path B", etc)
*** Teams are allowed to have a menu of options!
*** Manualizing is about keeping a scrapbook of our current thinking, not producing a perfect finished product.
** Use the online manual, or flipchart paper, to record these ideas (take photos of any written record)...
** Make sure there is a CHAIR (as before) and a SCRIBE, whose job is to record the key points of the groups thinking - ideally in front of them, so that corrections and clarifications can be called out, and the notes become "shared real-time minutes" that summarise things in a way that the team feels its collective thinking has been reasonably represented
(g) ''ON TEAM LEARNING and REMEMBERING:''
* TEAM DISCUSSION:
However you recorded the discussion above, have another team discussion now to try to reach agreement about ''what happens going forwards after this training?'':
* ''(i) How could we make time for reflecting on elements of our team's practice?''
** Think of //existing meetings/training slots// that could be "tweaked"?
** Try to avoid creating new meetings if possible?
* ''(ii) If we did create this opportunity for the team, then what elements of our practice would we want to work on?''
** The task is to CREATE A TOPIC LIST
** You don't try to have all of these conversations now!
** If you make a good enough list full of stimulating topics that the team is KEEN to discuss, this will encourage the team to get into [[LEARNING at work]] after the training has finished.
** That is //real change//, not just doing things on a training course, and then going back to business as usual!
*** ''START'' by picking elements of practice that the team is generally PLEASED with (//what elements of our team practice would we want to introduce a NEW TEAM MEMBER to quickly?//)
*** ''THEN'' identify a few challenging elements of day-to-day working life for the team (//"Where are there areas in which we agree 'WE COULD DO BETTER'?"//)
* ''(iii) Discuss practical ways to store the team's collective thinking and agreements'' that might flow from these opportunities:
** A big book or file? (easily gets lost, only one copy, in one place, but simple!)
** Use the AMBIT wiki manual? (https://manuals.annafreud.org) - accessible anywhere, can't get lost, teams get their own local version that you can use to add new pages, or improve on existing pages, takes about 30 minutes to learn how to use it.)
** NOTE: there are instructions (and instructional videos) on [[Manualization]] in the AMBIT manual
----
!LUNCH
----
!! 3. Learning: Using measures/outcomes in the team
How else can we do [[LEARNING at work]] if we don't actually have any real-life measures to see if what we do changes anything?
* ''DISCUSS "MEASURING":''
**In small groups
*** (i) What measures do we already use?
*** (ii) Measuring what matters: Do we? Could we? What would we measure that matters, if we could measure it?
*** (iii) What are we //interested// to measure, to see if we could change it?
* ''Other measures, that may be of interest'' (try these out in role plays if there is time):
(a) ''The AMBIT Practice Audit Tool'' [[APrAT]] – an occasional individual practice audit. Try it out in pairs //with a case that (one or both of) you know://
[img[AMBIT Practice Audit Tool_v.2.pdf]]
(b) ''The AMBIT Relationship to Help Questionnaire'' - [[ARHQ]] - A reflective questionnaire that helps a client to describe their relationship to helping services, and to set goals on how (or what) to improve.
See [[ARHQ_20.06.17.pdf]]
[img[ARHQ_20.06.17.pdf]]
A worked example of the ARHQ:
See [[ARHQ_WorkedExample.pdf]]
[img[ARHQ_WorkedExample.pdf]]
(c) [[AMBIT Service Evaluation Questionnaire (ASEQ)]] – an occasional whole team check in: what’s it like to work here? - we will look at this at the end of the afternoon
(d) [[AIM]] and [[AIM Cards]] - a 43 item questionnaire which has a worker-rated version, and more recently a client-rated version usually presented as a set of playing cards (see [[AIM Cards]])
See [[AIM questionnaire - interactive version]] or [[AIM questionnaire - paper version]]
!!4. Implementing //what matters to the team//
!!4(a) Exercise: Trolley dash
''__Purpose of the exercise:__''
* Inject energy with some noise and fun
* Remind trainees of the range of things they have covered, and the resources that are available to them afterwards to remind, prompt and guide practice
* Help start the process of team reflection on //"What do we want to take away and USE from this training?"// rather than leaving the training as a remote external process, as if it was just something that was //"done to us"//.
''__Materials:__''
* A pre-prepared collection of pieces of paper, each with //one// of the following AMBIT-influenced practices or tools described on it:
** [[Thinking Together]] in Team Meetings (Mark the Task, State the Case, Mentalize the Moment, Return to Purpose.)
** Thinking together in informal 1:1 staff interactions
** [[Dis-integration grid]]s to identify why networks might not be working as well as they might.
** 'Egg and Triangles' (see [[The Egg and Triangle]]) for collaborative care planning
** [[The AMBIT Pro-Gram]] for mapping existing helping networks
** Using [[The Therapist's Mentalizing Stance]] in day to day interactions with young people
** Using CUSS or PACE '[[Graded Assertiveness|Graded assertiveness in challenging a team member]]' disciplines to alert colleagues to risks that they might not have seen( //without that alert being taken as criticism!//)
** [[Sculpting a network]] to help workers mentalize the people in complicated (and often dis-integrated) helping networks
** Regular '[[Manualization]] sessions' when the team meets to discuss and records their shared understanding of "how we do it" in relation to particular specific elements of the work we do.
** Using [[Active Planning]] (balancing ''Planning'', ''Broadcasting Intentions'' and ''Staying sensitively attuned'' in adapting what we do with young people)
** [[AIM Cards]] for helping young people to tell their story and prioritise what they want help with ("Key problems").
** [[AIM]] questionnaire: a way of assessing a young person that covers a wide range of functions, contexts and experiences, which also allows you to measure their progress (//"Are we improving the key problems?"//)
** [[AMBIT stance cards]] for Team Meetings, to ensure that collectively the team holds all eight elements of [[AMBIT's principled stance|Core Features of AMBIT]] in mind as a case is discussed
** [[AMBIT usual suspects cards]] to offer a table-based way of [[Sculpting a network]]
** [[AMBIT Marking the Task cards]] to help team members to Mark their task clearly when they bring a case for team discussion (//which in turn helps the team to offer them the help that is asked for, rather than the help they feel like giving!//)
* If there are two toy shopping trolleys these would be excellent extra props!
''__Preparation:__''
* Arrange the room like a supermarket with chairs scattered around the room, creating aisles.
* Aim to maximise the distance between each item, so that there is further for the "trolley-dasher" to have to travel.
* Lay out the pieces of paper on the chairs in the "supermarket aisles" - randomly, and spread around the room.
''__The Trolley dash challenge:__''
* ''STEP 1:'' divide into two teams
* ''STEP 2:'' All players spend 10 minutes, walking around as a team browsing the supermarket, and discussing //which items they would choose if they were only allowed 5 items to take back into their work.//
* ''STEP 3:'' Both teams record these 5 items on their own ''"shopping list"''
* ''STEP 4:'' Each team elects one member who will be their team's seeker/trolley dasher...
* ''STEP 5:'' The trainers/umpires now turn all the pieces of paper over (face down!) while leaving them in place in the supermarket (//N.B. ''do not warn players'' that this will be happening!//)
* ''STEP 6:'' explain the SCORING SYSTEM:
** ''2 points'' for every item they collect //that is on their shopping list//
** ''1 point'' for any item that is //not on their shopping list// but which //all members of the team can (independently, without conferring!) explain in a few sentences// roughly what it is and why it matters!
** ''Minus 1 point'' - any substituted item (i.e. //not on the shopping list//) that //cannot be roughly explained by all members of the team// as above
** ''Minus 2 points'' - any Missing item (i.e. less than 5 items selected)
* ''STEP 7:'' At the given signal, seekers enter the supermarket and have //2 minutes to find the five items on their shopping list.//
** //''Strategy hint:'' if they think there is a high likelihood that the other team will go for the same item, they had better go there first!// - once it has gone, it has gone!
** Team members can call out to direct their dasher if they remember the location of an item on their list
** Otherwise, the dasher will have to search by turning pieces of paper over - turn them back straight afterwards, if they are not what is sought
** If an item has already been taken, or cannot be found, the dasher and team-mates can call out to each other to decide //what substitute item to choose.// (//''Strategy hint:'' choose something that everyone in the team will have a rough idea what it is, rather than picking up any old item!//)
** ''STEP 8:'' After sixty seconds the whistle is blown, and the trolley dasher must stop where they are. SILENCE!
** ''STEP 9:'' If a team has any substitute items, these must be declared and all team members have 60 seconds (''with NO CONFERRING!'') to describe on paper roughly what it is and why it matters.
* ''STEP 10:'' Group discussion and collective scoring of a team's descriptions of any substitute items.
* Prizes are optional
!! 4(b) ''Changing behaviours in a team is very hard''
There is a whole science of "implementation" of evidence-based practices. Research shows that //just because things "work" or make things better it doesn't mean that teams immediately start doing/using them!//
__''(i) You need an implementation PLAN...''__
* ''You need people''... an "implementation team" who can help encourage, support, prod, cajole (and who will take some responsibility for, and be supported by the team, in doing this.) The best of intentions do not just happen!
* ''Team discussion:'' create your ''Implementation PLAN''
** Choose the right person to CHAIR you discussion
** Choose a SCRIBE to minute what you agree on
*** Make your plan //realistic, not idealistic//
*** Make it specific: provide timetables, names, etc, if possible
__''(ii) You need Implementation SUPPORT''__
Create and build up resources that could help to prompt, remind, and support the team to make changes:
* ''People are resources''
**Choose team members happy to be ''"AMBIT nudgers"'' who (by invitation) can encourage team members to try things, and keep doing things
*** Consider who could act as external supporters/reviewers who could check in some weeks ahead to see how you are doing. Ideally, invite colleagues from neighbouring teams (your [[Community of Practice]]) to VISIT or PHONE at an appointed date, and give them a copy of your Implementation Plan - do the same for them?
* ''The power of visitors'' to help teams change behaviours
** Think of having your in-laws round to tea! Everyone behaves!
** //Regularly having visitors to team meetings// encourages team members to //explain why we do things like this// and keeps them in a "showing off" frame of mind, which are both powerful ways of learning (//teaching//, and //role-playing//)
*** ''Discuss:'' who could your team invite to team meetings? Students? Other professionals from the wider network? Workers from other residential settings?
__''(iii) You need material Resources:''__
You can use MORE than the tools you selected in the trolley dash earlier.
What does the team want to use/have available from next week?
* ''Posters in strategic places:''
** The [[AMBIT Wheel]]
** The 4 steps of [[Thinking Together]]
** The four-legged table: [[The Therapist's Mentalizing Stance]]
** The [[Dis-integration grid]]
** The [[Egg and Triangle.pdf]]
* ''Playing Cards:''
** [[AMBIT stance playing cards]] (see video above) for use in Team meetings
** The [[AMBIT usual suspects cards]] for sculpting a network on a table (in your [[Team Meetings]]):
** The [[AMBIT Marking the Task cards]]
!! Final practice of [[Manualization]]:
Rather than writing - create a beautiful, funny, inspiring, etc, creative poster for the office wall.
Divide into two or more small groups and pick a subject (or make up a better one) - ''the main point of this exercise'' is not to produce a work of art (although you may) but //to practice sharing ideas and understandings and getting better at arriving at a written/illustrated account of ''"where we all stand together on this question today."''//
* Describe/ illustrate the team's ''Implementation plans''?
* Describe/illustrate '''Why'' we want to do these things?'
* Describe/illusrate 'What ''Resources'' we are gathering/using?'
* Describe/illustrate '''Top tips and reminders'' from the days we spent thinking about our work
----
!TEA BREAK
----
!! 5. Catch up time
* Use this time for catching up if there has been slippage against the timetable
* Take feedback on the experience of the training
* What would the trainees have had you do differently if you were starting over? How could you do (even) better in the next training that you deliver?
----
!END
----
Click <<tag [[AMBIT-R training programme]]>> for links to days 1, 2 and 3.
Increasingly we prefer not to talk about "AMBIT teams" but rather refer to "AMBIT-influenced" teams, emphasising the fact that AMBIT is not a monolithic culture, or a "unimodal" intervention: an essential principle in AMBIT is the need to [[Respect local practice and expertise]], balancing this with [[Respect for Evidence]].
The [[AMBIT programme]], based around the [[Anna Freud National Centre for Children and Families]] seeks to provide a platform upon which multiple adaptations and improvements can be built, and shared - creating a [[Community of Practice]] which blends evidence based techniques and components of practice with //practice-based evidence// from specific real-world teams. open access to the different manuals managed by Community members is via the [[signposting site|Other team's AMBIT manuals]].
Although ''anyone can access the core material, and can even freely create their own version of the AMBIT manual'' (see [[here|https://manuals.annafreud.org]] only teams with a formal [[AMBIT training|Information About AMBIT Training]] become members of the AMBIT [[Community of Practice]] by being included in the list [[here |Other team's AMBIT manuals]]. Members of the Community of Practice are able to use the comparing and sharing functions in the manual to keep abreast of (and benefit from) the learning other teams are documenting in their work.
<div style="background-color:lightgrey">
<h2>What is AMBIT?</h2>
</div>
<a class="tc-float-right">[img width= 300 [AMBIT wheel 22.jpg]]</a>
AMBIT is an approach for helping people who have multiple needs and who may have reasons to find it difficult to trust in helping services. It is a whole-team or whole-system approach.
<div style="background-color:lightgrey">
<h2>What is AMBIT for?</h2>
</div>
AMBIT has been developed to improve helping services by attending to four commonly experienced dilemmas:
!!!Not everyone wants or trusts help:
People, due to their experiences, may have reasons to find it difficult to trust in helping services, and consequently to benefit from the interventions they are offered. Such experiences may include relational trauma, marginalisation, exclusion and previous negative experiences of services.
!!!Systems of care can become complex and dis-integrated:
Where people have multiple needs it is common for multiple workers and/or multiple agencies to become involved. This can create complexity, dis-integration and - sometimes - conflict
!!!Helping has an emotional impact on workers:
High levels of risk, complexity and distress as an emotional impact on workers, rightly. The emotional impact on workers impacts on their ability to think, to relate and to provide effective help. In some cases it can lead to burnout with consequent impacts on the helping system.
!!!Learning about and improving help is hard:
The pressured - and often urgent - nature of work in helping services makes it difficult for individuals, teams and systems to collectively reflect, learn and adapt.
<div style="background-color:lightgrey">
<h2>Who uses AMBIT?</h2>
</div>
AMBIT has been applied in a range of health, social care, justice, education and community settings in the UK and internationally. Teams and systems implementing AMBIT work with a range of client groups and a range of age-groups.
!!!A brief description of the model
Watch Dickon Bevington, Medical Director at the Anna Freud, give a brief overview of AMBIT:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/HrEgDdsohNo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
<div style="background-color:lightgrey">
<h2>A mentalization based model</h2>
</div>
AMBIT is underpinned by the theory of [[Mentalizing]] and [[Epistemic Trust]], applied in four directions:
Mentalizing is the capacity for making sense of behaviour by considering the mind that is driving the behaviour. We can mentalize ourselves and mentalize others. Mentalizing capacity is fragile, however. Under conditions of stress or distress, all of us struggle to mentalize.
AMBIT assumes that working alongside people who are experiencing significant distress can (and should) at times cause powerful emotions in workers and therefore that it is inevitable that breakdowns in mentalizing will impact not only the people to whom we offer help and their friends and family, but also us as workers and our colleagues and multi-agency partners, impacting in turn on the effectiveness of the help we provide.
<div style="background-color:lightgrey">
<h2> Improving the effectiveness of helping services </h2> </div>
AMBIT is part of a family of evidence-based approaches that seek to promote mentalizing (see e.g. MBT, MBT-A, MBT-F) but AMBIT differs in that it applies mentalization theory and practice not only to [[direct work with clients|LEARNING at work]], but also to:
*[[How we function and support one another in teams|Working with your TEAM]];
*[[How we integrate and make sense of complex helping networks|Working with your NETWORKS]];
*[[How teams and systems can maintain a culture of learning and adaptation|LEARNING at work]].
Another acronym... for [[AMBIT Practice Audit Tool (APrAT)]]
!!The aim of this exercise is:
* to work with practitioners, or teams who are training together
** to reflect on the degree that each practitioner uses AMBIT methods already in their work
**to consider the use of other practitioners/teams/agencies in the helping process (the [[Community of Practice]]).
** to practice seeking advice from a colleague (even, or especially) from another team about a case/your practice.
!! Instructions for exercise
1. ''In pairs with another person from your own team'', //select a case that you both know// which is proving hard.
2. Using the [[AMBIT Practice Audit Tool (APrAT)]] form, complete this in your pairs.
3. Reflecting on your answers, try to make an intervention plan for next week.
4. These pairs //separate now// - one will continue to work with this case (they become the ''consultee''), the other will become a temporary ''consulting colleague'' to someone from a DIFFERENT pair/team: //try to work with somebody that you do NOT know well, or don't work with regularly.//
5. Consult with this new partner about the case, or offer consultation to them.
6. The Consultant may want to bear in mind ways of [[Thinking Together]], and may invite the Consultee to complete [[The AMBIT Pro-Gram]] for the case and/or to discuss who //outside of the caseholding team// might help in any way with the planned intervention. They may want to help the consultee fill in a [[Dis-integration grid]].
7. Reverse the consultation process to give feedback on the process - so that Consultant briefly becomes the consultee - //"how did I do as a consultant to your team?"//
8. Feedback on exercise in the large group
9. Identify any LEARNING NEEDS that arise, and look for [[Training exercises]] that might support this.
!!Time allocation
45 minutes
! The AMBIT Relationship to Help Questionnaire
This is an exploratory piece of work developed by Dickon Bevington and the AMBIT team in London in 2017 in which the AMBIT team tried to develop ways of helping teams engage in explicit consideration of a client or a workers relationship to help. The questionnaire was never used systematically. It is an example in the manual of a piece of exploratory work which is an on-going aspect of AMBIT work.
[img[ARHQ.jpg]]
This tool is designed less as a formal outcomes measure, and more as a //clinical aid// - to:
* help build alliance
* encourage collaborative care planning
* help "unstick" a therapeutic relationship when it has got stuck.
An overarching treatment goal for most AMBIT-influenced teams, however, is ''to improve the [[Relationship to help]]'' and some measure of whether there has been movement in this measure in keeping with the goals identified at its first use might contribute to the measurement of this complex change.
The Questionnaire builds on work to develop a "clients'-eye view" of the AMBIT Wheel (the [[Client's AMBIT Wheel]]).
! The Questionnaire:
|||>|>|>|>| !HOW OFTEN IS THIS STATEMENT TRUE? |
|||!ALWAYS|!MOSTLY|!REGULARLY|!OCCASIONALLY|!NEVER|
| 1. |I’m making/rebuilding relationships that really matter to me ||||||
| 2. |I’m looking after my basic safety (avoiding trouble, illness, or danger) ||||||
| 3. |The people offering help seem to understand me, so I can trust them ||||||
| 4. |I can understand the people offering me help and how they try to do this ||||||
| 5. |All the things I want to improve in my life are covered in a plan ||||||
| 6. |All the different kinds of help I’m getting are working well together ||||||
| 7. |I’m learning from experiences in my own life, so that I can make changes ||||||
| 8. |I’m learning from other people, so that I can make changes ||||||
After completing the questionnaire the client AND worker should have a conversation:
* For things to start looking better, how would your existing scores need to change? (''Use arrows to show where the X should move'')
* What might you do help them change in the right direction? (''Make notes, or ask your worker to'')
* What might workers do? (''Make a plan together'')
!Discussion
There is a worked example at the bottom of this page.
There is no "right" or "wrong" answer for these questions, as different situations will call for different responses, but in general answers that are only "occasionally" or "never" should raise a question as to whether in an ideal world, that statement would be true somewhat more often than that. Some questions are designed to be ambiguous - for instance Q's 1 and 2 - is it desirable to be //constantly// making and repairing relationships?... to be //constantly// looking after my basic safety? If these are marked as "Always" does this suggest anxiety or distress that, in an improved situation, would allow these activities to take place, perhaps, "regularly" or just "occasionally"?
The key point of discussion is to open up thinking about these areas of the helping process (that AMBIT seeks to strengthen), identifying areas in whcih there is a clear interest in a direction of travel (//mark arrows from each X on the questionnaire to the position that would be more desirable// - an example of [[Goals-based outcome measures]]) , and collaboratively developing plans to make such changes.
A subsequent (post-treatment) ARHQ might then indicate if there has been movement towards such goals.
[img[ARHQ_workedEg.jpg]]
----
The tag [[Who does what?]] gathers together material that relates to the wider context in which the young person and family are functioning. Many different agents/players/characters/officials in the (often large) networks of help that gather around complex clients will have different (sometimes //unhelpfully different//) ideas about whose responsibility it is to do certain tasks. in a world where resources are scarce, too, such differences can often be experienced as "passing the buck".
In particular <<tag [[Who does what?]]>> offers material relating to the attention that the [[Key Worker]] will being paying to two of the [[Core Features of AMBIT]], namely:
* the stance of trying to make sure that different methods of help by different agencies are explained and discussed with the young person: [[Taking Responsibility for integration]]
* the related task of working to ensure that agencies have a shared approach to the problem [[Addressing Dis-integration]].
Other helpful ideas and tools:
*[[Boundaries]] define the tasks, roles and responsibilities of the [[Key Worker]] in the midst of a complex set of relationships.
*[[Dis-integratedInterventions]] describes the ways in which the care network may unwittingly work against itself.
*[[KeepingYourBearings]] offers advice to the [[Key Worker]] on managing oneself amidst complex, competing priorities.
*[[ProfessionalNetworkMembers]] provides information on the key parts of a young person's 'care ecology'.
*[[SupervisoryStructures]] are one of the [[Core Features of AMBIT]] and assist the [[Key Worker]] in maintaining their own [[Mentalization]] and fidelity to the interventions.
*[[Working with other professionals]] offers information on how to reduce the effects of [[Dis-integratedInterventions]].
This page provides you with an information ''about the AMBIT manuals:'' //how they're built, who can use them, and details on authors, licensing, etc.// It's sub-pages (listed in the box top right of this page) cover more details.
!!USING the manual:
If you just want to get on with using the manual, go straight to content under one of these headings (the manual can be used in three main ways):
!!!1. Finding what you want to learn about
<<tag [[Using the manual as a REFERENCE tool (looking stuff up)]]>>
!!!2. Recording what you are learning (manualizing)
<<tag [[Using the manual to RECORD learning (manualization)]]>>
!!!3. Connecting with other AMBIT users and their learning
<<tag [[Using the manual to CONNECT with other AMBIT workers]]>>
[img width=100% [adam-solomon-WHUDOzd5IYU-unsplash.jpg]]
!Wiki manuals - what are they?
Each team who trains in AMBIT receives their own individual local version of the AMBIT manual, which is a special kind of wiki called a "[[TiddlyWiki]]".
>A ''Wiki'' is just a website that is easily editable by its users. Only people who are //logged in with permissions// can ''edit'' these wikis, but all AMBIT wiki manuals are openly //accessible for viewing// by anyone online. If you have a local version you will have permissions to edit, provided from the AFNCCF.
Find any manual via the AFNCCF Manuals signposting site:
''https://manuals.annafreud.org/''
Each team's local version of the manual contains all of the core AMBIT content, which is constantly being updated and added to by the [[AMBIT programme]], and there is (pretty much unlimited) //additional space for a team to manualize their own practice//, for example how they have adapted the AMBIT approach to suit their service.
Through providing each team with their own individual manual which can be added to and edited and using an [[open source |OpenSource]]approach, which allows teams to access (but not edit) [[each others manuals|Other team's AMBIT manuals]] via the manuals signposting site (see above), we are encouraging what we call a [[Community of Practice]] where teams can [[share|Comparing and Sharing functions]] ideas around best practice with each other.
! Disclaimers and Licensing of this content
See [[Disclaimers, Security and Authorization (Licensing)]]
!A short walk-through user guide
The [[User Guide]] is a walk-through collection of pages that covers (or links to) the same material gathered in the tag buttons at the top of this page:
* How to navigate around it easily
* How find content you seek
* How to edit your team's local version
* How to compare what is in this version, and those of other teams
!!Other information
* [[Authors]]
* [[Sponsors]]
* [[Feedback please!]]
* [[Error messages]]
This is a necessarily abbreviated list of references and influences - mainly including systemic rather than cognitive behavioural or psychodynamic references, although these are certainly also highly influential on the model.
The developers of Mentalization-based practices are at pains to repeat that in many important ways there is nothing //new// in theories of mentalizing, and its application in therapeutic work. Indeed, Prof Fonagy has written that
>//"mentalization-based therapy is the least novel approach imaginable..."//
There is a reasonable argument to be made that //most// therapeutic approaches, insofar as they are successful, are probably acting by stimulating, or repairing mentalizing function. The only difference in the MB approaches is the extent to which this function is explicitly focused on as the target for treatment, and to some extent the 'stance' and core features that support this.
!!''AMBIT - specific references''
!!!Applications in Practice (2023)
<center>[img[AMBITbook2_small.jpg]]</center>
* [[Fuggle, Talbot, Campbell, Fonagy, Bevington (2023) Adaptive Mentalization-Based Integrative Treatment (AMBIT) for People with Multiple needs: Applications in Practice. Book, OUP]]
!!!Theory and Practice (2017)
<center>[img[AMBIT_BookCover.jpg]]</center>
*[[Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]]
!!!Other AMBIT-focused papers
* [[Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach]]
* [[Fuggle et al (2021) Improving lives: Not just saying no to substances.]]
* [[Jensen, Bo & Vilmar (2021). What is behind the closed door? A case illustration of working with social isolation in adolescents]]
* [[Daubney et al (2020) - Outcomes of Assertive Community Treatment for Adolescents with Complex Mental Health Problems Who are Difficult to Engage]]
* [[Talbot, Fuggle, Foyston and Lawson (2020) - Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years]]
*[[Griffiths et al (2016) Evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 CAMHS]] Innovations in Practice: evaluating clinical outcome and service utilization in an AMBIT-trained Tier 4 CAMHS service.
*[[Bevington, Fuggle, Fonagy (2015) Applying attachment theory to effective practice with hard-to-reach youth: the AMBIT approach]]
*[[Fuggle et al (2014) The AMBIT approach to outcome evaluation and manualization: adopting a learning organization approach]]
*[[Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams...]]
*[[Bevington et al (2012) Adolescent Mentalization-Based Integrative Therapy (AMBIT)]]
*[[Asen, Bevington (2007) Barefoot practitioners]]
!!''References to AMBIT in other (independent) reviews, etc''
* [[Account of AMBIT presentation - ACAMH magazine (Autumn 2013)]]
* [[Krueger and Glass (2013) Integrative Psychotherapy for Children and Adolescents: A practice-oriented literature review]]
* [[Gilvarry et al (2012) Practice standards for young people with substance misuse problems]]
* [[CSJ (2012) Rules of Engagement: Changing the heart of youth justice]]
* [[Khan et al (2010) You just get on and do it: healthcare provision in Youth Offending Teams]]
* [[Siri (2012) Mentalization-based therapy for adolescents]]
* [[Straussner and Fewell (2011) Children of Substance-Abusing Parents: Dynamics and Treatment]]
!!''Selected other interventions with/studies on hard to reach/under-served families''
*[[Bachler (2014) Differential effects of the working alliance in family therapeutic home-based treatment of multi-problem families]]
*[[Ungar et al (2013) Service use, risk factors and resilience in adolescents using multiple services]]
!!''Deployment-Focused treatment development:''
*[[Bearman et al (2010) Adapting CBT to fit diverse youths and contexts: applying the deployment-focused model...]]
*[[Chorpita, Daleiden and Weisz (2005)]]
*[[Weisz, Simpson-Gray (2008) Evidence-Based Psychotherapy for Children and Adolescents]]
*[[Weisz, Jensen-Doss, Hawley (2006) Evidence-based youth psychotherapies versus Usual Care]]
!!''Mentalization References''
*Allen, J.G., and Fonagy P., (Eds.) Handbook of ~Mentalization-Based Treatment, 2006, Chichester, UK: John Wiley & Sons
*Bateman, A., & Fonagy, P. (2004). Mentalization based treatment of borderline personality disorder. Journal of Personality Disorder, 18, 36-51.
*[[Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application]] - good on the overlapping concepts of mindfulness, empathy, etc.
*Fonagy, P., Bateman, A., & Bateman, A. (2011) Commentary: The widening scope of mentalizing: A discussion. Psychology and Psychotherapy: Theory, Research and Practice, 84, 98-110.
*Fonagy, P., Gergely, G., Jurist,E., and Target, M. Affect Regulation, Mentalization, and the Development of the Self, pub. 2002 by Other Press
*Fonagy, P., Steele, H., Moran, G., Steele, M., & Higgitt, A. (1991). The capacity for understanding mental states: The reflective self in parent and child and its significance for security of attachment. Infant Mental Health Journal, 13, 200-217.
*Fonagy, P., & Target, M. (1996). Playing with reality I: Theory of mind and the normal development of psychic reality. International Journal of Psychoanalysis, 77, 217-233.
*[[Gergely, G (2004) The social construction of the subjective self]]
*Luyten, P., Mayes, L., Fonagy, P., & Van Houdenhove, B. (2009) The interpersonal regulation of stress. Unpublished manuscript.
* [[Sharp et al (2006) Imagining your child's mind]]
* [[Sharp, C. and Bevington, D. "Mentalizing in Psychotherapy: a guide for practitioners" Guilford, 2022]] - a new book (2022) with forward by Prof Peter Fonagy written to be an accessible primer that covers the evidence and the more subjective practice elements of a mentalizing stance.
* [[Tronick and Cohn: Infant-Mother Face-to-Face Interaction: Coordination and Miscoordination]]
!!''Learning Organisations, Communities of Practice, Wikis as learning aids''
*[[Cole, M (2009) Using Wiki technology to support student engagement: Lessons from the trenches]]
*[[Lave and Wenger (1991). Situated Learning: Legitimate Peripheral Participation]]
*[[Seddon, J. (2008) Systems Thinking in the Public Sector]]
*[[Senge (2006, 2nd edition) The Fifth Discipline: the Art and Practice of the Learning Organisation. Random House Business Books]]
*[[Kyratsis Y, Ahmad R, Holmes A (2012) Technology adoption and implementation in organisations - BMJ]]
*[[Jason Shaw (2013) Developing a Hypertext Educational Environment using TiddlySpace]]
*[[Wilson, G. T. (1998). Manual-based treatment and clinical practice]]
*Schein, E. (2009). //Helping//. Berrett-Koehler Publishers: USA.
!!''Systemic References''
*Byng-Hall, J. (1995). Rewriting Family Scripts. New York, London: Guilford Press. New York, London: Guilford Press.
*[[Cecchin, G. (1987). Hypothesising, circularity and neutrality revisited: an invitation to curiosity]]. Family Process, 26, 405-413.
*de Shazer, S. (1982). Patterns of Brief Therapy: An Ecosystemic Approach. New York: Guilford Press.
*Diamond, G. S., & Josephson, A. (2005). Family based treatment research: a 10 year update. Journal of American Academy of Child and Adolescent Psychiatry, 44(9), 872-887.
*Donovan, M. (2009). Reflecting processes and reflective functioning: shared concerns and challenges in systemic and psychoanalytic therapeutic practice. In C. Flaskas & D. Pocock (Eds.), Systems and Psychoanalysis. Contemporary Integrations in Family Therapy. London: Karnac.
*Larner, G. (2000). Towards a common ground in psychoanalysis and family therapy: on knowing not to know. Journal of Family Therapy, 22, 61-82.
*[[Mason, B (1993) Towards positions of Safe Uncertainty]]
*Minuchin, S. (1974). Families and Family Therapy. Cambridge, Mass: Harvard University Press.
*Pocock, D. (2009). Working with emotional systems: four new maps. In C. Flaskas & D. Pocock (Eds.), Systems and Psychoanalysis. Contemporary Integrations in Family Therapy. London: Karnac.
*Rober, P. (1999). The therapist's inner conversation in family therapy practice: some ideas about the self of the therapist, therapeutic impasse and the process of reflection. Family Process, 38, 209-228.
*Selvini Palazzoli, M., Boscolo, L., Cecchin, G., & Prata, G. (1980). Hypothesizing-circularity-neutrality; three guidelines for the conductor of the session. Family Process, 19, 3-12.
!!''MBT-Adolescents (~MBT-A) References''
See also MBT-A and [[Mentalization Based Work]]
*[[Rossouw, Fonagy (2012) Mentalization-based treatment for self-harm in adolescents: a randomized controlled trial]]
!!''MBT-F Specific References''
See also MBT-F and [[Family Work]]
*Fearon, P., Target, M., Sargent, J., Williams, L. L., McGregor, J., Bleiberg, E., et al. (2006). Short-Term Mentalization and Relational Therapy (SMART): An Integrative Family Therapy for Children and Adolescents. In J. G. Allen & P. Fonagy (Eds.), Handbook of Mentalization Based Treatment. Chichester: John Wiley and Sons Ltd.
*Asen, E., & Fonagy, P. (In press) Mentalization-based Therapeutic Interventions for families. Journal of Family Therapy, x, 1-24.
*Keaveny, E., Midgley, N., Asen, E., Bevington, D., Fearon, P., Fonagy, P., Jennings-Hobbs, J. & Wood, S. (2012) Minding the Family Mind: The development and evaluation of Mentalization Based Treatment for Families at the Anna Freud Centre in London. In N. Midgley & I. Vrouva (Eds.), Minding the Child: Mentalization-based Interventions with Children, Young People and their Families. London: Routledge.
!!''General Evidence-based practice references''
There are too many to reference here, but we refer readers (with apologies for blatant partiality) to the forthcoming title:
*[[Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom]]
* [[Wilson, Cornwell, Flanagan, Nielsen & Khan (2018). Good and Bad Help: How purpose and confidence transform lives. Nesta Report|https://media.nesta.org.uk/documents/good_and_bad_help_0.pdf]]
!!''Evaluation References''
*Attride-Stirling, J. (2002). Development of methods to capture users' views of child and adolescent mental health services in clinical governance reviews: Commission for Health Improvement.
*[[Goals-based outcome measures]] - Report, ed. Duncan Law, chair of the CO-OP group in Child IAPT (UK): A Practical Guide to Using Service User Feedback & Outcome Tools to Inform Clinical Practice in Child & Adolescent Mental Health (2012).
*Goodyer, I. M., Tsancheva, S., Byford, S., Dubicka, B., Hill, J., Kelvin, R., ... & Wilkinson, P. (2011). Improving mood with psychoanalytic and cognitive therapies (IMPACT): a pragmatic effectiveness superiority trial to investigate whether specialised psychological treatment reduces the risk for relapse in adolescents with moderate to severe unipolar depression: study protocol for a randomised controlled trial. Trials, 12(1), 175.
*Gowers, S. G., Harrington, R. C., Whitton, A., Lelliott, P., Beevor, A., Wing, J., et al. (1999). Brief Scale for measuring the outcomes of emotional and behavioural disorders in children: Health of the Nation Outcome Scales for Children and Adolescents (HoNOSCA). British Journal of Psychiatry, 174(5), 413-416.
*[[Larsinou, E. (2017).|The Development and Properties of the AIM]] The psychometric properties of the AIM;a multidimensional assessment for adolescents. Unpublished MSc
*Shaffer, D., Gould, M. S., Brasic, J., Ambrosini, P., Fisher, P., Bird, H. R., et al. (1983). A Children’s Global Assessment Scale (CGAS). Archives of General Psychiatry, 40, 1228-1231.
*Target, M. Fonagy, P. (1994). Efficacy of Psychoanalysis for Children with Disruptive Disorders: Journal of the American Academy of Child and Adolescent Psychiatry 33. 44-45.
*Target, M. Fonagy, P. (1994a). Efficacy of Psychoanalysis for Children with Enotional Disorders: Journal of the American Academy of Child and Adolescent Psychiatry 33 (3): 361-371.
*Target, M. Fonagy, P. (1994b). Efficacy of Psychoanalysis for Children: Prediction of Outcome in a Developmental Context. Journal of the American Academy of Child and Adolescent Psychiatry 33 (8): 1134-1144.
*Target M, Fonagy P. Raters’ Manual for the Hampstead Child Adaptation Measure (HCAM). 1992.
*Eilis Kennedy and Nick Midgley (Eds.) "Process and Outcome Research in Child, Adolescent and Parent-Infant Psychotherapy: A Thematic Review" Pub. North Central London Strategic Health Authority March 2007 - includes a review of HCAM (adapted into the AIM for AMBIT) - //"A comprehensive coding scheme, with a highly detailed rating manual, has been developed and preliminary investigations of the HCAM’s psychometric properties have been good. The HCAM rating scale was used as part of the Anna Freud Centre's Retrospective Study (Target and Fonagy, 1994; Fonagy and Target, 1994) and was shown to be a clinically-significant measure of overall functioning."//
*Schneider, T. (2000). Measuring adaptation in middle childhood: the development of the Hampstead Child Adaptation Measure. Unpublished ~PhD thesis, University College London
[[Link|https://docs.google.com/file/d/0B5h_CVBdhJPYbHR0aGR4b2FJM2M/edit?usp=sharing]]
<html><div align="center"><iframe src="https://docs.google.com/file/d/0B5h_CVBdhJPYbHR0aGR4b2FJM2M/edit" frameborder="0" width="100%" height="600"></iframe></div></html>
The phrase Acting Out comes from [[Psychodynamic theory]], which states that unbearable feelings may be "enacted" rather than articulated in mind (being thought about).
It is an example of a [[Teleological thinking]] process - solving an unbearable state of mind by DOING - which is one of the [[Pre-mentalistic stances]], which are "primitive" forms of mental functioning that occur when [[Mentalization]] fails.
!What to do:
#Consider how you are [[Managing Risk]], as Acting Out can imply significant risks to self or others.
#What is the young person's understanding of the problem? If this relates to their motivational state as regards thinking about //changing// this response to anxiety, then consider [[Motivational Work]].
#Apply [[Crisis Contingency Planning]] to generate alternative courses of action for the young person at times most likely to end in Acting Out, as well as planned responses from the Family/carers to maximise safety.
#[[Cognitive Behavioural]] approaches that develop Relaxation skills (see [[Progressive Muscle Relaxation]]) may offer a first line in.
#Deploy [[Mentalization Based Work]], as acting out is a failure of this (a [[Teleological thinking]] response.)
!Other relevant areas:
There are particular [[Neurodevelopment and adolescence]] vulnerabilities during adolescence that make this response more likely.
As the description suggests, this is the point at which the client is putting plans into action. A good set of plans, including [[Crisis Contingency Planning]] will help to support the changes.
Consider the establishment of establishing some positive [[Reinforcement]] for the new behaviours, by altering [[Contingencies]] - sometimes in simple ways such as putting aside all the money that would have been spent of drugs, and spending this on something positive each week, etc...
!!''What is Active Planning ? ''
<center>{{ap..PNG}}</center>
* Active Planning is a practice that underpins how we make plans together with clients
* It is a way of helping maintain an appropriate balance between having a purpose, being open about our intentions, and attuning to what's happening in the here and now
*It involves applying [[Mentalizing|Mentalization]] to the process of making and working to plans
This is a 10 minute teaching session on Active Planning by DickonBevington at a training for AMBIT Local Trainers:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/v8BeQeABRvM" frameborder="0" allowfullscreen></iframe></html>
!!Why focus on planning?
Evidence-based approaches tell us that having clear and jointly constructed goals and plans are essential to creating change.
However, there are a number of factors that can make planned work difficult in the contexts within which AMBIT influenced teams work.
''These can be related to both:''
''1.Worker barriers'',
for example:
*Challenging work in isolation or without strong connections to team members ([[Keyworker well-connected to wider team]]) to help think about where the work is headed and what might need to happen next
*Working within a team where members do not feel confident or supported adequately to raise and address difficult issues with their clients
*A stressed or overwhelmed worker (and/or team) meaning there is less capacity to ''mentalize'' the client and attune to what might be important or helpful for them in the 'here and now'.
''2. Client barriers'',
for example:
*For people who have complex and multiple problems and a fragile [[Relationship to help]], trusting that a plan is well intentioned or that it may be useful, can be a significant challenge
*Motivation can fluctuate and there may be important reasons for keeping things as they are
*States of mind may shift rapidly and the ability to focus on a plan changes
*Intentions or priorities shift
*Previously unknown problems or crises can arise which need attending to.
''In practice these barriers can look a bit like.....''
* Meetings overun and things that were agreed don't get thought about
*The focus seems to change constantly between or within meetings
*Lots of talking but not much action
*A worker imposing their own ideas about what would be helpful, or allowing the client to lead without any particular purpose or input in our mind.
!!How do you do it?
''Active planning is about holding a balance between 3 key points:''
*''PLANS'': In any intervention the worker having a //purpose// (i.e. [[Making plans for change]]) in mind about 'what we're trying to do here and why', is essential
* ''BROADCASTING'': Our purpose or intention should be made open and explicit. We call this [[Broadcasting Intentions]]
* ''ATTUNEMENT'': At the same time, we aim to attune to the clients situation and state of mind 'in the moment'. We call this [[Sensitive attunement]].
We can apply these principles to any planned work with a client, from making a brief phone call, to setting overarching intervention plans (which some teams use to guide their work towards goals).
Below is an example of how we might structure the start of a session or a meeting with a client, holding in mind the active planning triangle:
>// Last week you were talking about how cutting down the self-harm is the most important thing that you want to change in your life right now....I was thinking that it would be really helpful for us to understand more about the self-harm and why it happens ''(purpose/ plan)''. If we can understand better some of the things that lead to self-harm, we can start to think more about what might need to change ''(Broadcasting intentions)''. How do you think that would be for you to think about today?...are there other things we might need to talk about too? ''(sensitive attunement)''//
We suggest using the [[AIM cards|AIM Cards]] as a way of applying active planning in practice to develop collaborative plans with clients. The AIM cards give a structure to support clients think through and prioritise the most important areas for them, whilst the worker listens and attunes to the clients' perspective (sensitive attunement). The cards then allow workers to contribute their own ideas (Broadcasting intentions) in designing a joint plan ([[Making plans for change]]) about the way forward.
!!Holding the balance
The 3 points of active planning:
* [[Making plans for change]]
* [[Broadcasting Intentions]]
* [[Sensitive attunement]]
...do not follow any particular order. Rather, by the worker mentalizing themselves and their client, we attempt to hold an appropriate balance between them.
If we can maintain sensitive attunement to the clients' state of mind and situation it is more likely they will experience our offers of help as 'fitting' with where they are at (whether our offer of help is ''contingent'').
For example, rigidly sticking to a plan from last week, with a client who arrives overwhelmed by an argument at home, may well undermine the client-worker relationship. This would be an example of a worker in [[Teleological thinking|Teleological thinking]] or ''Quick fix'' one of the [[Features of UNsuccessful Mentalizing]].
At the same time, if we were only focusing on sensitive attunement, this would risk losing the worker (and teams') perspectives on other factors, such as risks, or situations that can't be ignored. This might take on a kind of [[Pretend mode|Pretend mode]] thinking where we are not addressing some important realities.
The above points are held in balance with , [[Broadcasting Intentions|Broadcasting Intentions]]. Here the worker is explicit and open about their purpose, in order to make their behaviour understandable. We assume that our intentions and behaviour are not clear to our client, (or, that they may expect that we have negative intentions). In this sense, we try to increase the chances that a client can clearly understand our intentions (i.e. mentalize us, the worker), and opt in or out of a plan, rather than it being experienced as something done //to them//. Again, the worker attempts to balance this appropriately, as over-reliance on broadcasting intentions would be another example of [[Pretend mode]] (or ''waffle'') and not connected with the experience of the client in the 'here and now'.
''A tool to support active planning with clients:''
The [[The Egg and Triangle]] is a tool that we would usually use after early contact with a client as a way of explicitly sharing our 'best efforts at understanding so far' (broadcasting our intentions and sensitve attunement). This places our best understanding (the "egg") right next to our 'broadcasting' of our intentions (the "triangle") and crucially allows worker and client the opportunity to 'correct' and further adapt this understanding //together// (sensitive attunement), based on the clients' perspective on our broadcasted understanding and intentions. This helps us begin shaping a collaborative plan about the work ahead.
[img[Egg and triangle (marked)]]
----
''The Active Planning Triangle is not only applied to face to face client work. We can equally hold this stance in any situation where we are working towards plans in relationship with others.''
For example;
*A meeting with professionals in the network around a client,
If these three points become un-balanced there is a risk that network meetings fall into lots of discussion or broadcasting of intentions, without any clear plans or actions taking place (''pretend mode''). On the other hand, losing balance could mean too much rigid setting of plans without sensitive attunement to the clients' immediate situation (or to the workers' current state of mind). We suggest that this can be a helpful stance when chairing or running meetings in this context.
*If you would like to do extended reading on Active Planning, and how this is applied further within the team culture, please see <<tag [[Extended learning]]>>
*Please see [[CLIENT exercises from AMBIT training]] for training exercises on Active Planning
!What is this?
This is the third stage in [[Active Planning through the phases of AMBIT work]]
Here we are trying to evoke the clients own understanding of "where I am" and where they currently want to get to. We are explicitly comparing the workers' understanding of the problems, and ideas about goal setting, with the clients persepctive on these.
''In doing this we are looking to find some shared intentions which form the basis of a plan.''
Note here that this links cloesly with elements of [[Motivational Work]] and the idea of a worker aiming to [[Develop Discrepancy]].
There is some useful material at [[Relationship to help]] that may help to identify reasons for widely divergent ideas between worker and client about problems and potential [[Aims and Goals]].
So, here we compare our, the workers' intentions (see [[Broadcasting Intentions]] with the clients'.
When doing this we attempt to model the capacity to accomodate difference, and the respectful curiosity and inquisitiveness that [[The Therapist's Mentalizing Stance]] promotes: e.g.
*//"I am really interested that although I had in __my mind__ that getting to X would be a good idea, that this is not at all what you had in __your mind__! How do you think I got it so wrong - or so different - from your point of view?"//
!A Useful Tool:
The [[The Egg and Triangle]] is a useful and very simple tool for helping a worker to address this in face-to-face work.
!!''Purpose''
This is to help clarify and practice the process of [[Active Planning]] and [[The Therapist's Mentalizing Stance]], especially to consider how the worker manages the situation when there are significant differences between //their// intentions (goals) and those of the young person.
!!''Exercise''
Role-play an early therapeutic encounter that involves the beginning of developing a care-plan. Similar to the video clip - there is some (not //catastrophic!//) divergence between young person and worker's goals.
* This is //not the first meeting// so assume that you have gathered the basic history and you have a basic idea of what the problems are.
* Note the [[Advice about Role Playing]]
* Make use of what you have learned about:
** [[The Therapist's Mentalizing Stance]]
** [[Broadcasting Intentions]]
** [[Active Planning - Comparing Destinations]]
** [[Active Planning - Agreeing Waymarks]]
!!What is this?
A culture of planning means that all members of the team share an understanding that //time is an extremely valuable resource// and should be spent as wisely as possible, and that //having a plan is usually better than having no plan!//
Given the risky nature of the environment and the predicaments that many clients in treatment with AMBIT-influenced teams are facing, Active Planning refers to the maintenance of a culture that, while sensitively attuned to the clients or family's needs, we hold on to proper [[Governance]] (doing things 'properly' - safely and effectively).
Team members support each other with the constant process of identifying [[Aims and Goals]] ( some services may refer to this as developing [[Formulation and Treatment Aims]]). These would then shape the plans that are made - balanced by the need to be sensitively attuned to the experiences of the clients.
So, a [[Keyworker well-connected to wider team]] is consistently helped by colleagues to:
* Make plans
* Broadcast the plans ( make them explicit in the team and with the client)
* Put them into action (attuning them with the client)
* Review the progress of plans
This can relate to the SHORT term, the MEDIUM term, or the LONG term:
!!SHORT term
Across minutes, as in [[Marking the Task]] during [[Thinking Together]], or planning your next session with a client…
!!MEDIUM term
Across days, as in planning goals and activities for the next week - for instance this is something that the [[Team Meetings]] can ensure they focus on (//so what is your plan for next week?//)
!!LONG term
Across weeks or months, developing, using, and adapting Plans.
These might be applied from the length of time it takes to conduct a phone-call, to the weeks or months of a whole therapeutic journey.
This is particularly something that the [[AMBIT Lead]] and the [[Implementation Team]] may want to consider -
''//How do we support the development of this in our team?//''
Click on <<tag [[Active Planning]]>> for subtopics of this area.
Here you can find [[The Egg and Triangle]] a tool for supporting active planning.
!! Final note....
''PLANNING, not PLANS ''
!!!!(Map-reading, not Maps...)
Active Planning seeks to emphasise the //activity of planning//, rather than the holding of plans-as-things. This is not to say that it isn't important to have the appropriate documentation, ''just that the documentation is only worth anything if it is a record of the //work of thinking//...''
[img[https://lh4.googleusercontent.com/-RMPKuN9Ce3U/URIYD_fGNJI/AAAAAAAAGqw/AmxUhoGys7s/s912/ActivePlanning-CoProduction.jpg]]
[[Active Planning]] is not something we only do at the start of our work with clients. Rather, it is a process that we apply throughout the entire journey together. It is a continuous way of checking where we are, reviewing where we're headed and what we need to do to get there.
Below is a description of how we apply active planning across the [[Phases of AMBIT work]]. It describes steps in how we go about making plans collaboratively, and how we work to and review these plans continuously.
These steps are unlikely to be much different in practice from effective planning in many teams and treatment models. What we intend is that these steps fit with the rest of the AMBIT model, and are //explicit// rather than being carried out //implicitly//.
[img[https://lh4.googleusercontent.com/-D9UT2mFATUk/UOh2qxjA2AI/AAAAAAAAGdY/ZFTT1FmanwQ/s720/ActivePlanning.jpg]]
It is important to emphasise that:
*1.The steps don't always follow in sequence
*2. The specific details of the plans will be different depending on the [[Phases of AMBIT work]] you are currently in
!!!Active Planning steps across the phases of work:
|OUR NAMES||CONVENTIONAL DESCRIPTIONS|
|[[Taking Aim]] | = |Collaboratively //noting// the way things are (Assessment) and learning [[What's the problem?]]|
|[[Broadcasting Intentions]] | = |Using [[Mentalizing]] skills to build engagement and collaboration |
|[[Comparing Destinations|Active Planning - Comparing Destinations]] | = |Collaboratively defining therapeutic direction ([[Aims and Goals]]); developing a [[Formulation and Treatment Aims]]|
|[[Agreeing Waymarks|Active Planning - Agreeing Waymarks]] | = |Collaboratively developing a [[Care Plan]] that sets out the route ahead|
|Setting out together | = |Getting started on this specific planned work is part of the [[Key Worker]] relationship|
|[[Taking Aim]] again| = |Reviewing, and sensitively/strategically //adapting// these plans|
Please see also [[How to draw up a Care Plan]] which describes the steps in forming and working to a careplan, applying active planning to this.
!!''3. Tools to help''
* Teams may use tools as a part of regular practice to create structure for this process in face to face working.
*''1. The Egg and Triangle''
** The [[The Egg and Triangle]] is a simple back-of-the-envelope tool to help structure the interactions between worker and client.
** Some teams may primarily use this tool just as a training exercise to emphasise the principle of //collaborative care planning//, //attunement//, and //adjustments// to create [[Contingencies]] in what is offered.
*''2. Formulations and Communications''
** Creating and communicating a clear ([[mentalized|Mentalization]]) narrative for how the difficulties arose, what maintains them, and what the aims in our work may be is a crucial step in collaborative working.
See [[Formulation and Treatment Aims]] for advice on how to present and communicate this (an example of [[Broadcasting Intentions]]).
----
Much of AMBIT is concerned with the way we try to present our offer of help in ways that "speak to the condition" that the person we are trying to help finds themselves in.
!In relation to Motivational Stage of Change:
A key part of the [[Motivational Work]], including the [[assessment for substance use disorder treatment|Assessment for SUD-Rx]] consists of identifying which of the [[Stages of Change]] best describes your client's state of mind or motivation.
A young person in [[Pre-contemplation]] will not be interested in [[Making plans for change]], or developing [[Relapse prevention]] strategies. There is a high risk of a loss of [[Engagement]] in such circumstances.
[img[StagesPicture]]
!In relation to the here-and-now Mentalizing state:
If a client is mentalizing well (able to reflect on their own and other people's behaviours in terms of wishes, fears, feelings and the context that has influenced these) then conversation can be more challenging than if there is evidence of [[Pre-mentalistic stances]] (failed mentalizing).
!In relation to Help and attaining outcomes:
See the [[Relationship to help]] for more on this, and [[Active Planning]] for the subtle balancing required between holding to ''Plans'' and ''sensitive responsivity'' that keeps [[Engagement]].
!!What sort of Adaptations are required for an 'AMBIT for THRIVE risk support' training?
*Risk support training ''must'' be multi-agency.
* ''Ensure that working (break-out) groups are MIXED'' across teams/agencies
* ''Details of Implementation Plans need to include''
** commissioning and senior management support
** How team around the worker will be achieved in practice
** What are you going ''to do'' to increase inter-agency relationships?
* ''Invite Different EXAMPLES of how things are being done in local settings''
** A different version of the Four Corners exercise
** Local teams sharing elements of what they are already doing that other teams/localities might want to look at/learn from?
* ''Manualizing topics relating to these kinds of interagency practices''
** What's going well, what makes it hard?
!Know where you are:
In Motivational work it is important to [[Adapt your Discourse]] to fit your assessment of the client, particularly where he or she stands according to the [[Stages of Change]]. This is a key skill, and may be seen as the response from a [[Mentalized|Mentalization]] understanding of a client's dilemma.
Assessment in general is covered at [[What's the problem?]], but there is a specific focus on the Stages of Change at [[Assess Stage of Change]].
Adaptation, in the field of biology, refers to the ''process of change'' by which an organism or species ''becomes better suited'' to its environment.
In psychological and social terms, this holds: AMBIT is not about changing the world, but changing one's collective (in a [[well-connected team|Keyworker well-connected to wider team]]) ''behaviours'' in order to provide more [[Sensitive attunement]] to the client (earning [[Epistemic Trust]]) and greater impact in [[Managing Risk]] that our clients (and occasionally we, too) face.
!!!How to tag tiddlers
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/_96GxO6Kk5Y" frameborder="0" allowfullscreen></iframe></html>
!!!How to add a new tiddler (page)
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/2jzfArg3RlY" frameborder="0" allowfullscreen></iframe></html>
<<tag [[Addressing Dis-integration]]>> brings together the practices and tools that AMBIT influenced teams may use when working with their networks, trying to work in integrated ways and reduce Dis-integration.
!Firstly.....
To address [[Dis-integration|Dis-integration]] effectively, we propose that first of all we need to re-shape our expectations...
!!//Anticipating// misunderstanding and conflict
A fundamental assumption is that network differences and conflicts should be ''//anticipated as inevitable//'' and not be seen as an indication that people in the network around the client are somehow //''getting it wrong''//.
AMBIT adopts a position that ''actively anticipates the likelihood of conflict and contradiction between agencies or professionals'', and promotes the explicit view that this is //understandable//, as an aspect of ''our best intentions and best efforts'' to provide services for the client.
<a class="tc-float-right">[img width= 600 [Dis-integration pic.jpg]]</a>
!!What to do?
With shared understanding of the problem, agreed intervention and collaborative relationships, effectiveness will improve
!!The Dis-integration Grid
The [[Dis-integration grid]] is a practical tool aimed at supporting Mentalizing of the network. It helps us to think about which parts of the system may be helping or hindering integration and where we may be able to bring a helpful influence towards integration.
!!Sculpting a network
Please see the [[Sculpting a network]] exercise which is a way of physically mapping and making sense of network dis-integration. This is an exercise that can be carried out with your team.
!!AMBIT Pro-Gram
[[The AMBIT Program|The AMBIT Pro-Gram]] is a tool for workers to use with clients to help them map out and make sense of their network. It is a way of thinking with clients about which relationships are most helpful for them, who members of the network are and what they do. It is also used for the worker to understand how the client see's these areas and to guide the worker in how they might support or scaffold the existing relationships.
!!Training Exercises
There are other [[Training exercises|NETWORK exercises from AMBIT training]] on working with your network here that explicitly encourage workers to practice mentalizing the network or each other in your team. These include [[wearing different hats|Wearing different hats]] exercise and the [[what's it like to be|The 'What's it like to be...' exercise]] exercise.
!!Why do we do this?
The purpose of paying close attention to the wider network is partly to improve the effectiveness of interventions, but it also consistent with the overall mentalizing stance of AMBIT. One of the core aims for the keyworker is to help the client //make sense of the professionals' behaviours// - by encouraging the client and family to mentalize.
In our view, [[Mentalization]] provides a crucial technique in trying to help professionals to make sense of each others' behaviour, and hence reduce mis-understandings in the same way. We believe this opens up opportunities for authentic collaboration between members of the network.
!!Addressing Disintegration Video
Liz Cracknell
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/QxCNC08TJo8" frameborder="0" allowfullscreen></iframe></html>
The ten original ACE's are:
#physical abuse
#sexual abuse
#psychological abuse
#physical neglect
#psychological neglect
#witnessing domestic abuse
#having a close family member who misused drugs and alcohol
#having a close family member with mental health problems
#having a close family member who served time in prison
#parental separation or divorce on account of a relationship breakdown.t
Research has suggested that risk of long term harm increase with the number of ACE's that a child has been subject to.
One commonly reported finding is that those with four or more ACE's are
*2 times increase risk of obesity
*3 times increase risk of smoking, cancer, heart disease and respiratory illness.
*4 times increase risk of mental health problems, problematic alcohol use and sexual risk taking.
*7 times increase risk of problematic drug use and other and self directed violence.
These powerful long term increases in risk have been highly influential on demonstrating the impact of early life experience on adult functioning and behaviour. However, the results are sometimes reported as predictions for individuals rather than risks for a group. For example, 96% of people who reported four or more ACEs did NOT use drugs intravenously.
Adverse Childhood Experiences have often been described as early trauma although clearly the precise nature of the child's experience may be very different depending on the type of ACE (e.g. physical abuse versus neglect) and also on the degree to which the child was involved such as in the experience of parental separation. All the ACE's are adverse experiences bringing distress and suffering but may not be traumatic in the more precise definition relating to PTSD. These distinctions may be less important than the way that ACEs research has enabled a wider recognition that the events of childhood have the potential to change fundamental aspects of life long functioning.
More recently, there has increasing interest in considering the role of communities in the type of negative outcomes associated with ACES. This approach is less focused on individual adverse experiences as experiences that might be common to groups of children and young people in particular community environments. These have become known as [[Adverse Community Environments]] and are seen as amplifying the vulnerabilities of children where these are present. Perhaps the most easily recognizable example of this would be racist environments for marginalized groups of young people. More details are provided on the highlighted page.
Three very useful introductions to the concept of Adverse Community Environments can be found via these links:
* "The Pair of ACEs" (adverse environments and experiences):
https://cblcc.acf.hhs.gov/wp-content/uploads/The-Pair-of-ACEs-K2A_4.2.2021.pdf
* The Role of Community in Trauma Resilience and Healing:
https://hmprg.org/wp-content/uploads/2019/02/Role-of-Community-in-Trauma-Resilience-and-Healing.pdf
* Adverse Community Environments:
https://gafcp.org/2020/09/09/adverse-community-environments/
Many people hate role playing.
We accept this, but would want to explain:
!!(a) WHY we think that role playing is very important and helpful.
* Role playing is in ways nothing like real therapeutic work... But... It is the closest we can get to practicing how to develop and use the [[Key Worker]] relationships that are so central to the effectiveness of any AMBIT-influenced practice.
* The point of most role playing is to practice the [[The Therapist's Mentalizing Stance]]
* And role play does have one thing in common with real therapeutic work - it is (or can be) stressful.
* So while the stress is different, it will have a similar effect on your capacity to work effectively (to mentalize) as it does when it occurs "in the field"; learning to work in stressful settings is part of what AMBIT is about.
* Having said this, we do NOT want any role play to have any shaming effect on any workers - as this is not a good context for learning.
!!(b) HOW to make role playing less painful
* It is tempting always to pick the WORST client we can imagine for a role play - particularly if we are learning a new way of working ("I'll test this out to destruction!") - DON'T! Pick a young person or family who have got some motivation to change - the point is to give each other scenarios to practice and play.
* Remember the clue is in the name - it is role PLAY, so keep it playful, and allow oneself and others the chance to make a time out sign and break out of role to discuss what is going on, how //"I have lost it!"//... but then be sure to talk about why, and what to do next, and then get back in and play some more.
* Do try to stay on task - it is easy to get drawn into very meaningful conversations about the work in the middle of a role play, which may be very effective defences against exposing oneself to the anxiety of role playing
* Do practice being a mentalizing presence for your colleagues in the role play - //"I wonder what does X maybe need to help her feel that she can get back into that role play and try again?"//
!!(c) WHAT to avoid doing in role plays
* Do not use role plays to humiliate or shame others!
* Accept it if a colleague opts out of active role playing - they can still play an active role as a "mentalizing presence" watching from a "meta-position".
* Don't assume that you "can't do it" - consider the possibility that you may be mistaken on that count!
!!Advice
Developing, improving and changing practice does not happen quickly. Training events on their own are unlikely to make much impact on routine practice unless such training is complemented by a range of on-going activities that encourage learning and development. Most teams have existing systems around this, e.g. supervision, mandatory training, appraisal and individual training plans. If AMBIT practice is to develop and grow, it is essential that it is connected to these systems.
This requires a plan!! The plan should include the following:
!!!Specific objectives
This refers to the [[Post-training outcome goals]] that we encourage teams to start to set at the very beginning (or before) any formal [[AMBIT Training]].
*Following AMBIT principles, these are best if they are [[SMART goals]] (objectives) which are //realistic// to the teams work and practice. Some examples are shown below.
**During the first six months, to establish thinking together as part of case discussion in teams.
**To use the AIM on a 10 cases and review its usefulness.
**To practice manualizing once a month as part of a team meeting.
!!! Agreed on-going training activities
*Most teams have some meeting structures and support time. It is useful to be clear whether any of this time can be used for on-going development of AMBIT practice. Again, modest plans likely to work best.
!!! Relationship of AMBIT to supervision
*It is helpful to consider how supervision links to AMBIT. If the team members are receiving supervision from supervisors unfamiliar with AMBIT this is likely to make progress more slow. One suggestion would be to have a meeting with all supervisors to consider their ideas about how to use AMBIT in supervision.
!!!Relationship of AMBIT to wider training activities
* There will be a range of existing on-going training activity including, for example, child protection training. It is useful to consider how AMBIT sits alongside this. It is not intended that AMBIT should replace all of this but there may be some creativity as to how different training tasks can become more linked up.
!!! Team Induction
* AMBIT needs to be part of the induction programme for new team members.
!!! Methods of reviewing progress
The Implementation Plan should be reviewed by the Implementation Team periodically. This should be explicit in the plan itself.
We provide a template for an [[Implementation Plan]] that should be edited by the team. It contains a range of headings that the [[Implementation Team]] may wish to consider.
Advocacy is defined thus by the advocacy provider charity [[VoiceAbility|https://www.voiceability.org/]] :
>Advocacy is free, independent support to involve you in decisions about your health, care and wellbeing.
>An advocate is an independent professional who is on your side. They can support you to have your say and know your rights.
>Advocates don’t work for the council, the NHS, or care providers. When you work with an advocate, they will keep things confidential. You don’t need to pay for an advocate.
There are many types of advocate, but ''always they are (or should be, explicitly, if they are to operate effectively!) INDEPENDENT'' of the other powers that might be 'at play' in the area they are involved with: advocates work explicitly for the client.
>This is important for other professionals to remember: an advocate cannot and will not work //under another professional's direction//; they must work explicitly for their client to help them articulate and assert their //own// views and wishes to other parts of their social ecology (this is especially, but not limited to, the professional networks - for instance Advocates also work with individuals in personal relationships where there is domestic violence or bullying) //that will often be perceived as holding more 'power' or control than the client//.
Some of the commonest areas in which an advocacy worker may add significant value are:
* ''Mental Health'' - helping clients to voice their opinions, wishes and concerns, especially when they attend formal meetings with their care team (ward rounds, or Care Programme Approach Meetings, or Mental Health Tribunals, etc).
* ''Domestic Violence'' - helping clients to consider the nature of the relationship that they are in, particularly in relation to their rights to live without abuse, coercion or control, and to learn about and consider their options as regards finding ways out of unhelpful or frankly risky relationships.
* ''Criminal or Sexual Exploitation'' - Advocates can be part of services working with clients who may not initially see themselves as victims, or who are so terrorised and silenced that talking to a more 'obvious' authority (the Police, for instance) might be seen as impossible because of fear of retribution.
* ''Bullying'' - Advocates can help a client who is the subject of bullying represent their needs to school or workplace authorities in order to start and help coordinate an appropriate protective response.
* ''Legal system''
* ''Social Care system''
* etc
Affect refers to the emotional state //right in the here-and-now//. The ups and downs of a person's //affect//, as they average out over a longer period of time (say weeks or months) are what we call their //Mood//.
A helpful analogy is that ''WEATHER is to CLIMATE as AFFECT is to MOOD.''
[[Affect storms]] are common and unhelpful for therapy, as they effectively stop, or invalidate, mentalizing.
[[Affect Regulation]] is a capacity that therapy is designed to increase.
[[Affect]] is much harder for adolescents to regulate than it is for adults, owing to the particular [[Neurodevelopment and adolescence]] changes that are in train during adolescence. Adolescents are much more easily overwhelmed by the emotional context of their social activities, and once overwhelmed, take longer to settle back to their 'baseline'. See [[Affect storms]].
Regulation of emotional responses occurs via structures in the frontal areas of the brain (see [[Neurodevelopment and adolescence]]), but when these are inadequate for the task, other methods may be recruited.
Included amongst these is [[Self Injurious Behaviour]], but less dramatic techniques are also used, such as tending to communicate through the mitigated medium of text messaging, or email, rather than face-to-face contact, the use of drugs and alcohol, or more 'healthy alternatives' such as vigorous exercise, etc.
One of the cardinal features of many, if not all of the personality disorders is a pervasive failure to regulate affect in adaptive, effective ways. [[Mentalization]], when working effectively, is a powerful tool in helping to regulate affect, but, equally, it is severely constrained when affect is uncontrolled; you cannot have effective [[Mentalizing]] when there is uncontrolled affect.
Aside from the neurodevelopmental aspects, Affect Regulation is developed within the context of a secure [[Attachment Relationship]] (see [[Secure Base]]).
!What is an Affect Storm?
When feelings ("[[Affect]]") run high in a particular situation, a person’s ability to mentalize is at risk of being impaired. If family members are present, this can be ‘infectious’, leading to ‘emotional knee jerk’ reflexes all round.
In family sessions one can then observe heated interactions, with the participants blaming each other:
''//“you never….”'' or ''“you always”//''
Here the therapist’s task is to reduce the heat, so as to help family members to recover some degree of successful mentalization.
!What to do in an affect storm
See [[Simmering Down]], [[Taking a break]] and [[Therapist's use of Self]].
Creating a more accurate narrative (see [[Explicit mentalization]]) is not the ultimate goal of [[Mentalization Based Work]].
The concept of ''affective mentalization'' is about the relationship between mentalizing and affect regulation. It is seen as the highest order of the [[Mentalizing Levels]].
It means ''simultaneously feeling a feeling //and// thinking-about the feeling''. For example, feeling angry or upset, and at the same time being able to explore why this might be happening, in the moment (i.e. mentalizing this experience).
An example of this in a helping interaction might be a client experiencing a strong feeling in the session, but rather then avoid or dismiss it, stays with the feeling whilst trying to make some sense of it, with the support of the worker.
In order to manage and regulate feelings we first need to be able to 'feel' and experience them. For this to happen, we need a relationship in which it is safe to explore our mind and feelings (in the mind of another). The development of mentalizing in the context of a secure attachment relationship is therefore closely connected to the development of [[Affect Regulation]].
Affective mentalization is a key part of affect regulation, both on an individual level and at the level of the family system.
If we can 'be with' a feeling and make some sense of it at the same time, it is much more likely that we can regulate or manage this experience, rather than it being overwhelming. In the same way, if feelings that are happening within a family-relational context can be mentalized by members in this way, as they are happening, it is more likely that people find ways to get on. The creation of a safe environment within the family for all its members is critical for this process to happen.
Feeling recognized as an individual helps to promote the experience of a secure base (see [[Attachment Relationship]]). This allows the activation of mental models, (internal representations of secure relationships, mostly held below the level of our awareness). When activated, these mental models relate to confidence in experiencing distress, knowing that it is manageable and will not be permanently overwhelming.
[[Mentalizing the Moment (in the Mentalizing Loop)]] is a key process that the [[Key Worker]] uses in [[Mentalization Based Work]], and fostering this capacity in the young person and family members is an aim in therapeutic work. In [[AMBIT]] this is additionally something that workers take responsibility for fostering in each other, using [[Rituals and Disciplines]] such as [[Thinking Together]].
This term is used in research and particularly in relationship to developmental theories about humans.
It refers to the understanding that the self acts as an ''"agent"'' in its relationship towards the world and other humans.
In other words, the self operates with an [[Intentional stance]], //purposefully//, to bring about changes in the order of things and people (however much those intentions may be hidden to others, and occasionally even to the self, which is described in [[Psychodynamic theory]].)
Think of the infant's first inklings that it has some control on the order of things: it screams in relation to a feeling (hunger, or cold, or bellyache) and a familiar face appears, and somehow appears to "mirror" ([[Marked mirroring]]) the feeling that the baby is possessed by at that moment, and then things seem to get better (food is offered, or warmth, etc). Each time this happens the baby's experience cannot help but register that it has operated in a way that "fixed things"... this is the birth of the sense of //Self-agency//.
In later years, this sense may be lost (or found to have been poorly developed) as a result of trauma or neglect, and the experience of expressing distress //and being mentalized//, and of //trying out different patterns of behaviour// are all examples of how the therapist/worker might seek to help their client to develop a sense of [[Self-efficacy]] - to (re)discover their agency.
There are many ways to translate Aims, Goals and Plans... and other words that could be used in their place. We define them below, in terms of the proximity/distance to the opportunities in the present. See the [[Formulation and Treatment Aims]] for consideration of how to develop these ''collaboratively'' and in ways that speak to the young person's own experience of life.
!Note, there is an //assumption of intention//:
* Even if the young person's //current// behaviour (their immediate 'plan') is difficult to make sense of, their goals and more distant aims may be rather more understandable, even though they may take a little more "teasing out". (See the examples below.)
* Aims (and perhaps Goals) may often be the place where the keyworker and young person can have a "meeting of minds." Plans are often where the workers intentions and the young person's intentions most obviously diverge.
* One of the shared treatment aims that most [[AMBIT-influenced]] teams would agree on, is to have a positive impact upon the young person's [[Relationship to help]].
!What to do FIRST:
| See [[Advice on setting Treatment Aims and Goals]].|
!!Definitions
Note that it may be much easier to find common ground about relatively distant, or more general ''Aims'' than it is about close-up ''Plans''!
!!!The "AIM"
|''...is the direction of travel towards the horizon.''|
Examples:
# Be happy, create happiness
# Be respected
# Being truly and publicly myself
!!!The "GOAL"
|''...is to get to “Town A” by nightfall.''|
Examples:
# Hook up with good friends, enjoy ourselves
# Feel good about myself with a cool phone
# Develop a gorgeously shocking body
!!!The "PLAN"
|''...is to start out on //this// road, here.''|
Examples:
# Score some good weed, and persuade X to come dancing…
# Hit the man with the iPhone
# Get my tongue/nipple/penis pierced
!!Differences of opinion
There is a much greater likelihood that a worker and client will find common ground in the more general/distant Aims, than there are in the more immediate Plans...!
See the [[The Egg and Triangle]] for a tool that can be used help draw these out and encourage collaboration.
!What are the Aims of Family Work?
The main aim of family work is [[Restoring family capacity]] - which relates to the [[Core Features of AMBIT]] as it is an example of [[Scaffolding existing relationships]].
The worker attempts to do this by working to //contextualize// the presenting symptom(s); that is, to develop an understanding of how these difficulties might fit in the context of the young person's current and past relationships with family members and/or significant others, as well as of social and cultural factors and discourses.
Systemic interventions aim to:
*help the young person and the various family members to get //new perspectives// or new understandings on the presenting problem(s)
*to attach different meanings to these
*to experiment with new ways of relating to one another
*to jointly find new and practical solutions to pressing problems and dilemmas. Interventions aim to
*block dysfunctional family interactions and communications
*activate new, more functional transactions.
Considering the [[Relationship to help]] that a young person engaged with a service demonstrates may be helped by thinking about the feelings stirred in the worker.
A sense that I am "pushing too hard" may be an indication that we are in the [[INTERVENTION PHASE]] and that this is a common perception that the young person has about "help" - (that it doesn't often feel like help, but more like a kind of persecution)... or it may indicate that the work is moving towards the [[ENDING PHASE]], and what I am wrestling with is my OWN attachment to my client, with the risk that I may inadvertently demonstrate a lack of confidence in the capacities of the young person (that may mirror the kinds of attitudes that he or she has faced for many years.)
Ambivalence literally "both sides": the notion of holding conflicting ideas or feelings about something //simultaneously//.
Everybody experiences states of mind where they feel ambivalent about something or someone. It is a part of the human condition, and not a pathological state in itself.
Ambivalence is a key concept in motivational work and this is covered in detail in a number of pages which can be found starting with [[Motivational Work]].
//"I want to stop drinking, and I don't want to stop drinking."//
This content was developed by Helen Fletcher and Susannah Gilmour from Hertfordshire Partnership University NHS Foundation Trust, who work in an adult learning disability team.
!!Aim
To help us in our work with complex or stuck situations to think from different perspectives. The aim is to prevent us from get stuck thinking from just one perspective.
The aim is not to get everyone to agree but to highlight different viewpoints to help us move forward together in our work.
!!What it is?
It is a tool to help people think from different perspectives, imaging what it is like to be in someone else’s shoes.
It involves thinking from each person’s point of view (as best as we can) about:
1) What the problem is
2) What should be done about the problem
3) Whose job it is to do what
!!What it isn’t
The information contained in the grid is not factual, it is based on people’s thoughts about what other people might be thinking. This would then need to be checked out with them to see if we have got anything right or wrong! For example …… “if I was in your situation I think I might feel …….. what do you think about that?”
!!How we use this
The tool can be used in therapy sessions, supervision, meetings with service users and / or professionals and reflective practice sessions. However,'' it is best to ensure you are only sharing the grid with those who were involved in creating the grid so that the content is not misinterpreted.''
See [[AMBIT Disintegration Grid template with instructions.pdf]] to download the adapted disintegration grid.
There is not much evidence for the effectiveness of traditional anger management techniques even though anger management is commonly cited as something that should be offered to young people.
Mentalization based approaches would not tend to see anger as requiring a fundamentally different approach to managing other mental states.
#The basic stance of [[Mentalization Based Work]] is aimed at increasing awareness and sensitivity to one's own and others mental states and to develop capacities to recognise such feelings, preferably at an early stage.
#Similar to [[Cognitive Behavioural]] approaches, Mentalization based approaches would take a neutral non-judgemental approach to angry FEELINGS but would sharply separate angry feelings from angry BEHAVIOUR. For many highly troubled young people, anger may be a highly appropriate almost adaptive state of mind in relation to their life experiences and the key worker would wish to adoptive a respectful curious stance towards such //feeling states//. This respectful stance is not adopted towards angry and violent //behaviour//.
#Being able to [[Notice and Name]] early warning signs that point towards an anger outburst is a key feature of most anger-management programmes.
##This fits the process of the [[Mentalizing Loop]].
##It is also an element of a cognitive behavioural approach
!!!When anger erupts
There is material on dealing with [[Affect storms]] and [[Manage Violence]] gives information on de-escalation, and Body Language, etc.
!!!Anger and Mentalizing
Anger rapidly reduces mentalising and also capacity to problem solve. Because of this, reasoning with people in angry states (these might be best described as [[Psychic equivalence]]) is often unproductive and the focus should be on de-escalation and reducing the effect of [[Affect storms]].
The Anna Freud National Centre for Children and Families is a charity dedicated to ''Innovation'' in the the treatment of mental health difficulties in Children and Young people, ''Evaluation'' of new treatments, and the ''Dissemination'' of effective techniques to the widest possible audience. Further information can be found at the Centre's [[website|http://www.annafreudcentre.org/]].
The AMBIT project is hosted and [[supported|Sponsors]] by the [[Centre|http://www.annafreud.org]].
<a class="tc-float-right">[img width= 300 [AF-logo-RGB-Green.png]]</a>
!!''Consider supporting us''
AMBIT relies entirely on charitable donations and the fees it raises through training, it works to keep its training prices as low as possible to enable maximum dissemination, and all of its training and theoretical materials are presented freely (OpenSource) on the web. ''Giving'' can be arranged via the [[Centre|http://www.annafreud.org]] website.
<a class="tc-float-right">[img width="150" [AOS.PNG]]</a>
!!!AMBIT Trainer
Anna is an AMBIT Trainer based in Barcelona as well as an AMBIT Study Group Lead. Project Officer for the [[AMBIT programme]].
<div style="clear:both;line-height:0px;"></div>
<a class="tc-float-right">[img width="150" [AS.PNG]]</a>
!!!AMBIT Trainer
Anthony, better known as Scotty, is an AMBIT Trainer based in London.
<div style="clear:both;line-height:0px;"></div>
!!Purpose
To give an overview of Anxiety as a common problem affecting young people and adults, with pointers towards how to treat this.
!!Information about anxiety problems
The Royal College of Psychiatrists have produced an excellent series of information guides on anxiety for children and young people you can open it in a separate browser window [[Here|http://www.rcpsych.ac.uk/mentalhealthinfo/problems/anxietyphobias/anxiety,panic,phobias.aspx]]
Underneath this, you will find links to material in this manual to direct treatment.
*http://www.rcpsych.ac.uk/mentalhealthinfo/problems/anxietyphobias/anxiety,panic,phobias.aspx
!!What to do
* The most powerfully-evidenced treatment for Anxiety is [[Cognitive Behavioural]] work.
*Some [[Family Work]] is advisable, especially in order to:
** Recruit the family to support treatment
** Provide some PsychoEducation so that family members share the same understanding of the child's problems.
** Reduce any criticism, or blaming, and reduce expressed emotion in the family.
* With permission from the young person/family it is helpful to liaise with the school or other agencies to ensure that there is a shared understanding of the problem and the solutions we are working towards (see [[Working in multiple domains]]).
No.
* [[AMBIT]] refers to ones "sphere of influence" - and as a method of practice encourages that the limits of this are brought into explicit awareness/acknowledgement, rather than this being //implicit//.
* There is a wide a range of material in the AMBIT manual, from general material that would be relevant to all practitioners, to more specific manualised [[Interventions|Specific interventions]] that may be of interest to many - by way of "making sense of" ([[Mentalizing]]!) the actions of workers more specifically focused on that aspect of work, but of //specific use// to a smaller range of workers.
* If there is doubt or anxiety for a worker about //"what should I do?"// in a specific case then this would seem to be a useful prompt for using the SupervisoryStructures in the team to help [[mentalize this|Mentalization]].
Asen, E. & Bevington, D. (2007): Barefoot practitioners: a proposal for a manualized, home-based Adolescent in Crisis Intervention Project. In: Baruch, G., Fonagy, P. & Robins, D. (eds): [[Reaching the Hard to Reach|http://www.amazon.co.uk/Reaching-Hard-Reach-Evidence-Based-Intervention/dp/0470019417]]. John Wiley, Chichester
//An early description of the model, with less emphasis on the __organisational elements__.//
The phrase originally comes from China - Chairman Mao in his 'Great Leap Forward' advocated the training of 'barefoot doctors'; practitioners trained in basic techniques of hygiene and simple treatments who provided the only possible way of beginning to address the needs of a hard-to-reach population.
In Mental Health the situation is very different, but in some ways analogous; there are undeniably large amounts of unmet need and shortages of highly specialised staff. It is perhaps not unreasonable to surmise that if service development pursues a path that insists upon only increasing super-specialisation of workers then this risks (albeit unwittingly) serving an agenda of //social exclusion//; it is difficult to envisage a time when there might really be enough highly trained specialists to fill vacant posts. However, more significant by far, the barefoot key worker can deploy therapeutic modalities in settings where there would otherwise be none, and the ''integrated'' and ''multimodal'' nature of these interventions, that are delivered ''flexibly'', largely ''contingent upon the needs of the here-and-now'', offers hope for effectiveness in these hard-to-reach settings that has currently not been realised.
So, while [[Key Worker]] described in this manual shares some of the features of the barefoot doctors of revolutionary China, the comparison is more a descriptive analogy than a fact.
!Inexact Science:
Remember that the stage of change is not a static thing, and like [[Mentalization]] it is in a constant state of flux - you are looking for a broad estimate of where the young person is //at this point in time...//
!!Ask the following questions:
To help clarify which of the [[Stages of Change]] your client is in...
!1. How important?
How important does it feel for you to change now?
* Scale 0 - 100
* Where 0 is completely unimportant and 100 is the Most Important thing.
!2. How confident?
How confident are you about making those changes?
* Scale 0 - 100
* Where 0 is no confidence and 100 is complete confidence.
!3. How far?
How far have you got in the journey towards making those changes?
* Scale 0 - 100
* Where 0 is "haven't started any planning yet" and 100 is "job done".
!Record your findings:
This should be recorded in your notes.
<html><div align="center"><iframe src="http://docs.google.com/present/view?id=d6h2gb4_206dvb4zzgc&revision=_latest&start=0&theme=blank&cwj=true" frameborder="0" width="100%" height="600"></iframe></div></html>
!What's here?
* A video from Harvard business school about what is a Learning Organisation, and how to help develop one.
* A questionnaire from Harvard Business School to assess where your team is in relation to this ideal
!What are you looking for?
This video from the Harvard Business School provides an introduction to a method of assessing how closely your own team complies with some of the core features of a learning organisation. ''@@color(blue):there is a particularly key part of the discussion from 4min 48sec, where they cover WHAT DO YOU HAVE TO DO to start to create a Learning Organisation...:@@''
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/lUP4WcfNyAA?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!Online survey to assess your team's proximity to a "Learning organisation"
The survey referred to in the video above is freely available online [[here|http://los.hbs.edu]] (note - the survey does not save your results, so cut and paste your scores onto a word document to save them) - or if you are online it will be displayed below:
!!'Learning Organisations' and AMBIT
AMBIT is designed to be an open system where the need for on-going learning, skill development and new knowledge is placed at the centre of the approach. This is partly because, at best, the desired outcomes of this area of work remain modest and the motivation is to find increasingly effective ways of offering help to troubled young people.
The intention is that AMBIT is designed so that it can be adapted and used in organisations with very different structures and organisational cultures. This includes both statutory and third sector organisations. However, we would advocate that, independently of formal structure, the organisation needs to attend to processes of learning.
See [[What's the problem?]] for a broad framework, and [[Taking Aim]] for more detail on what you can try to do when making your assessment.
The point of an assessment is to start the process of developing your [[Formulation and Treatment Aims]].
!Why?
''Some principles of Assessment for Drugs and Alcohol:'' Making a good assessment of a young person's drug and alcohol use is key because:
*The assessment is an important INTERVENTION in and of itself - especially if it is properly handled.
*A good assessment helps to set the scene for the most appropriate [[Care Plan]]
*Young people using drugs and alcohl are at greater RISK than those who are not
!What to do?
The UK's National Treatment Agency (NTA) has produced a good document that covers the essentials of assessing a young person's substance use in great detail. See [[NTA - Assessing Young People for Substance Use]].
For guidance contained within this manual, see below.
''__1. DRUG/ALCOHOL HISTORY__''
Taking a good [[Substance Use History]] is important.
''__2. ADDITIONAL KEY INFORMATION:__''
There are three key additional areas that should be enquired about in an assessment IN ADDITION to the drug and alcohol history:
(a) ''Risks:'' You can use the [[RiskAssessment]] at [[Make or View Client Notes]].
(b) ''Mental Health, other Comorbidities, and Resiliences:'' You can use the [[AIM]] and consultation with the team/Psychiatrist via SupervisoryStructures. Remember there are [[Multiple interacting aetiologies]] for adolescent Substance Use Disorder, and within resiliencies you will be looking at Family and other pro-social relationships within the young person's social ecology.
(c) ''Stage of Change:'' You can refer to [[Assess Stage of Change]], and record this under the [[Formulation and Treatment Aims]] via [[Make or View Client Notes]]. This is key to fulfilling one of the key [[SUD-Rx principles]], which is that, as practitioners you should [[Adapt your Discourse]] to fit //where the young person is// re. the [[Stages of Change]].
It is helpful to clarify what STAGE the young person is at: the following grid adapted from [[Mirza and Mirza (2008) Adolescent Substance Use]] offers helpful markers along the route to harmful and dependent use in youth, that are more relevant to the [[Developmental Considerations]] that "set the scene" in which this drama unfolds.
(There is a direct external link to this table [[here|https://lh4.googleusercontent.com/-utBsBfmyG7o/UHMdJBNY02I/AAAAAAAAFRU/p9T0iJwr2SI/s864/SUDClassification.jpg]]) and SEE BELOW FOR THE ~ALL-IMPORTANT ''//FEEDING BACK//'' of your findings to the young person:
[img[https://lh4.googleusercontent.com/-utBsBfmyG7o/UHMdJBNY02I/AAAAAAAAFRU/p9T0iJwr2SI/s864/SUDClassification.jpg]]
''__3. ASSESSMENT = INTERVENTION! - Giving FEEDBACK__''
You must GIVE ''FEEDBACK''. Giving clear, personalised feedback about the assessment is a key part of the assessment; where an Assessment actually becomes an Intervention. See [[Assessment for SUD-Rx - Giving Feedback]].
!Importance of feedback:
An important component of successful Brief Interventions is the delivery of //personalised// feedback on the young person's assessment, so as to //contextualise// his/her substance use in respect of his/her peer group.
!!It is important to:
#''Be honest'' - do not exaggerate the extremity of a young person's substance use.
#Conversely, ''avoid unwittingly "normalising"'' (and potentially reinforcing) the young person's reported drug use.
#Consider the fact that the young person's immediate peer group/social ecology may be either (or both):
##A ''resilience factor'' (non-drug-using, pro-social, supportive and challenging YP's substance use) or...
##A ''vulnerability factor'' (drug-using, normalising substance use, antisocial, collusive.)
!How to deliver feedback:
!!1. @@color(red):Invite curiosity@@:
>//''"I've been asking all these questions... I find myself wondering if YOU might be wondering what kind of things I have begun to understand from this assessment?"''//
!!2. @@color(red):Use understandable and memorable images@@:
>//"Imagine all the young people of your age within twenty miles of here were lined up in long line... Now imagine they are lined up in order of how heavily involved with substance use they are... the ''very heaviest involved'' are on that end, moving down to the ''lowest involved'' at this end.//
>//''where would you ''want'' to be on that scale?''//
>//''where do you think you ''actually'' are?''//
When they answer that question, do remember that it may be that they are moving in a group that use more, or less than ''most'' young people. Use web-based statistics to compare their use to that of the general population of their age-group.
!!3. @@color(red):Cover core details@@:
Assuming the young person can be engaged to show interest, try to cover your assessment of their habit in terms of:
#AMOUNT
#SEVERITY
#RISKS
!!4. @@color(red):Conclude with choices and treatment options@@:
>//''"Now that you have this knowledge, I am guessing that you may want to leave it at that, but you may also like to think about the kinds of choices you have about what to do next?"''//
This is one of many [[Tags]] in the manual. It links you to all aspects of Attachment and [[Attachment theory]] in the manual. Choose your subtopic from the list provided.
!!!Meaning of the word
''Attachment'' is a word in common usage, but when it is used in a mental health or child development studies it refers to a particular field of study that began in the 1950's, particularly with the work on John Bowlby and colleagues.
It describes what can be seen a ''fundamental human'' (though many other animals show it too) ''drive:'' which is to modulate the closeness or distance between them and others; avoiding being 'too close' or 'too distant' depending on factors such as the identity and qualities of the other person, and the context within which the relationship is occurring.
There is great ''variability'' in individual 'attachment styles' but some common themes are visible. The sub-topics under this tag <<tag Attachment>> will explain this in more detail, with an emphasis on how this can help us adapt our behaviours as helpers in systems.
These are triggered when an individual is stressed in any way.
At that point, the [[Attachment]] system is activated, and the person is driven by this to //modulate// how near or far he or she is from whatever is seen as the [[Attachment Object]].
The way that the individual goes about organising themself (and others around them) so that the distance between them and their [[Attachment Object]] starts to feel //"right"// is largely dictated by the style of their [[Attachment Relationship]] (Secure, ~Ambivalent-Enmeshed, ~Detached-Dismissive, Disorganised). Examples of Attachment Behaviours might therefore be:
*Crying, distress (draws my [[Attachment Object]] in to closer proximity to me...)
*Ignoring, walking off (increases the distance, but keeps me in their mind...)
*Angry verbal (or even physical) attacks (Keeps them close to me, but punishes them for making me feel so needy...)
!!Attachment Behaviours and Mentalizing
Crucially, when [[Attachment Behaviours]] are //activated// the neurological structures that allow [[Mentalization]] are //de-activated//. This //"see-saw"// between Attachment Behaviours and Mentalizing is a crucial understanding for practitioners to apply in their work.
Links to definitions of [[Attachment]] styles, behaviours and other concepts to go here:
!!Basic Attachment concepts:
[[Attachment Behaviours]]
[[Attachment Object]]
[[Secure Base]]
[[Internal Working Model]]
!!Attachment styles
See [[Attachment Relationship]]:
* Secure
* ~Anxious-Ambivalent-Enmeshed
* ~Detached-Dismissive
* Disorganised
This refers to whoever (or even whatever) a person in distress, whose [[Attachment Behaviours]] have been activated, sees as ''the reliable safe protective figure'' that is available to them.
*For most children, their most important Attachment object is their ''parent/carer''.
*Most children will have more than one Attachment objects available (''grandparent'', ''teacher'', etc), and may have different [[Attachment Relationship]]s or styles, towards each of these.
Depending on their [[Attachment style|Attachment Definitions]] (which in turn is dictated by their [[Internal Working Model]] of how an [[Attachment Relationship]] can be predicted to work) they may react in different ways towards this person (Secure, Ambivalent-Enmeshed, Detached-Dismissive, Disorganised).
''The tag <<tag [[Attachment]]>> gathers together other material relating to this topic. '' This is a particular and important aspect of human relationships described by Bowlby, and subsequently developed by a large body of researchers and theorists.
!!Definitions
When we speak of there being an Attachment Relationship between two people (for instance between a [[Key Worker]] and young person) ''this does not mean that they are 'attached' in a //sentimental// way''!
An attachment relationship refers to the fact that a ''specific person'' responds to ''another specific person'' in somewhat predictable ways, particularly at a time of stress. Note that one person might have quite //different// styles of attachment relationship towards the different key figures in their life - and it seems that during adolescence one of the things that happens is that multiple parallel (perhaps quite different) attachments start to merge (to "average out", if we were to put it crudely) - in this way humans start to form increasingly lasting "expectancies" about helping/caring/authority relationships that we call [[Internal Working Model]]s - maps of how certain kinds of relationships tend to work. This is absolutely crucial when we think about how AMBIT seeks to influence a young person's [[Relationship to help]]; what we are suggesting is that we want to introduce some differences and change in a young person's [[Internal Working Model]]s of helping relationships.
Driven by the different kinds of expectancies held within a young person's [[Internal Working Model]], a range of different (increasingly ingrained and automatic) responses to distress and towards caregiving/authority figures emerge in attachment relationships; these are what are described by the different styles of attachment...
!Attachment styles
''Do they seek proximity?''
*The //reassurance// of being close (using someone as your [[Secure Base]]), that allows them "space to think" ([[Mentalization]]) - this is typical of ''SECURE attachments''
''Do they push away/drift off?''
*As if avoiding the //stress// of intimacy/feeling the sense of need that denies them the "space to think" - this is typical of ''DETACHED/DISMISSING attachments''
''Do they anxiously cling and yet angrily reject at the same time?''
*As if torn between their neediness, and fury at being so needy, and mistrustful of what might be on offer - this is typical of ''ANXIOUS/AMBIVALENT/ ENMESHED attachments''
''Do they switch back and forth between these styles, in ways that seem disconnected, bizarre, unpredictable?''
*This is typical of ''DISORGANIZED attachments'' - this is the most worrisome presentation, the one most strongly associated with maltreatment or trauma, and most predictive of future psychopathologies.
//''IMPORTANT:'' //Please note that ''an attachment style is NOT a diagnosis, or a pathology in itself'' - it is just a //description of the style of relating to people and reacting to stress// - in some settings one or other attachment style may be more adaptive than others, and there are plenty of very successful people who exhibit ambivalent or detached attachment styles. While there are a range of advantages for people classified as Securely attached, and disorganised attachment is very often a marker for other significant adaptive difficulties, it is important not to make too a concrete link between attachment style and "pathologies".
!Development of Mentalizing within an attachment relationship.
[[Mentalization]] develops in children within their [[Attachment Relationship]]s.
If a mother is able to respond "contingently" (i.e. with enough sensitive attunement to the demands of the baby's condition; see [[Contingencies]] for how this is carried into [[Cognitive Behavioural]] approaches) and to apply [[Marked mirroring]] of her baby's mental state, then repeated experiences of this:
>//"Another mind that seems to understand and find ways to describe and respond to my experiences!"//
...helps to build a sense of ''//self//'', and of ''//self-agency//'':
>//"There is an "I"// ''[I can see this represented in her face]''//, and this "I" finds itself in different states// ''[happy, sad, frightened, hungry, hurting, surprised - which I can see her mimicking to me in ways that fit how I feel]''//, and this "I" can operate upon the world it somewhat predictable ways// ''[I find I can change things about the world, and me, by calling out, moving, and thinking differently]''...")
...and "thinking differently" here might refer to "thinking about thinking", or starting to "take a meta-perspective upon thoughts and feeling" - which is really the birth of [[Mentalization]].
From the 1950's and beyond John Bowlby and many other academic and clinical colleagues established that Attachment is an essential facet of human development (one could describe it as a key behavioural 'drive' no less important than sex, food, survival, etc).
Research identifies different //styles// of attachment (or "[[Attachment Relationship]]"): these are the different ways that individuals modulate their proximity to an [[Attachment Object]]... sometimes by //distancing// themself ('Detached' or 'Dismissing' attachment), sometimes by //reaching out for and/or clinging desperately// to that other person ('Anxious' or 'Ambivalent' attachment). The behaviours that an individual exhibits in order to either draw help in, or push it away are (not surprisingly) described as [[Attachment Behaviours]]
There are a wide range of attachment styles spread across the human population, and while extreme versions of these styles may correlate with additional difficulties, Secure or Insecure attachments //are not in themselves pathological//. Only c.40% of the human population have a 'Secure' Attachment pattern. We do also identify a 'Disorganised' Attachment pattern that has much less of a stable presentation and is the only attachment style that is more directly (though again, not 100%) associated with past trauma or abuse and with future psychological difficulties.
Children may have very different attachment relationships with the different people in their life (secure with one parent/carer, anxious-ambivalent with another, for instance) but over time and particularly through adolescence these 'parallel' attachment styles tend to settle down into a more predictable response to new people (especially those with authority or offering the possibility of help) which might be seen as a kind of 'averaging out' and response to the information provided through experience. This 'attachment style' is very much influenced by the '[[Internal Working Model]]' of helping relationships that every individual builds up through time - a kind of 'map of expectancies' through which all relationships in the future tend to be viewed; an internal working model based on repeated experiences of abuse and humiliation is likely to distort expectations of our help and trustworthiness as professional helpers of any kind.
A key function of the family or intimate care network is to provide a framework for the development of increasingly autonomous personality functioning, which requires underpinning by sufficient security in an individual's attachment system.
Families in which serious mental health crises arise in adolescence tend to demonstrate some distortions of their attachment system. This may be a result of chronic disturbance in one specific individual, or in the parental/carer relationship; additionally it may reflect the impacts of caregiver behaviours in the past, the intense pressures placed on the caregiver by the child earlier in development, or most commonly both of these. In other words, while there may be some '//equifinality//' (many paths leading to the same destination) in the various different styles of attachment that we observe in different people, //it is never possible to say from observations of attachment behaviours alone precisely what has caused these//.
In working with young people in crisis, it is reasonable to assume that in some key respects, the family has ceased to be a [[Secure Base]]; either the young person does not feel reassured by the presence of other family members, or those family members have ceased to be able to offer effective support and acceptance, thus the attachment system does not function to contain the disturbed emotional states or behaviour as one might 'ordinarily' expect it to do.
Within our framework, the capacity of the family to have a sufficiently coherent picture of each others' states of mind is a key facet of both enabling and enacting helpfully adaptive attachments (see [[Mentalization]]). One sign of disturbance in the attachment system is that there are often significant distortions in the perceptions of other people's attitudes and intentions. An aim of any intervention in such a situation is to reinforce attachment processes through enhancing shared understanding across family members.
The moment of crisis may be understood as a breakdown of the attachment system, in which the parents and/or the YP are willing to give up the bond that would normally make the troubled YP seek security and safety in the family. This may be a reaction to a long history of dismissing attachment style, or preoccupied entanglement, or the dramatic exaggeration of a developmentally appropriate move away from the family. Whatever the roots may be, the aim of the crisis intervention is to make the family a more secure base for the YP. What may be most important in that context is that the keyworker (KW), through his intensive and reassuring presence, begins this experience for the family members of a more secure base. The calm, sensitive, appropriate behaviour of the KW is intended to activate more secure [[Internal Working Model]]s of attachment relationships for all members of the family.
!!More content
* For definitions of attachment styles, behaviours and other concepts:
**[[Attachment Definitions]]
**[[Attachment Behaviours]]
!!Introduction
AMBIT has always placed a high value in the necessity of the AMBIT approach to be locally adapted to specific client groups, local service systems, the types of intervention that a team are offering and the outcomes they are seeking to achieve.
This emphasis on local adaptability and lack of universal uniformity of service provision has perhaps been at the expense of developing methods of how to audit whether //actual practice// is consistent with desired practice and outcomes. We have produced a comprehensive set of [[AMBIT Competencies]] that could be used, against which practitioner behaviour and knowledge could be measured.
Auditing AMBIT practice has always to date been presented in a very light touch way. Local adaptability has been given greater prominence than the need to insist on 'treatment fidelity'.
As with all aspects of AMBIT, there is a balance to be struck as it is clearly one method of learning about the work to audit the actual process of implementation of methods and techniques that the team has been trained to use. The overall frame here is to use audit methods to support [[LEARNING at work]].
!!Audit measures for AMBIT
Audits involve measuring practice against agreed standards and this can be done by devising local measurement tools to ensure that the key aspects of AMBIT practice in a particular service are properly focussed on.
AMBIT devised a basic measure for this purpose called the [[AMBIT Practice Audit Tool_v.2.pdf]] and guidance on using this measure can be found at [[Auditing AMBIT: using the APRAT]].
!!Linking audit to learning at work
A key principle of AMBIT is to support ways in which a team can learn collectively about the work that they do. Central to this would be processes by which practice is made explicit through a process called manualizing by which teams aim to come to explicit understandings about key aspects of practice.
!!Learning from AMBIT teams
The team in Holland at Utrecht has developed a comprehensive method of auditing practice in a large adult service for adults with BPD. This method of work has been generously shared by the Dutch team and the details of this can be found at [[Auditing AMBIT: learning from Altrecht]]
The intention is to accumulate other examples of audit practice as part of learning form current teams about their work.
!!Audit and outcomes
It is often the case that audit overlaps with measuring the client outcomes. Some team may wish to focus more on outcomes and use a measure for this such as the AMBIT Integrative Measure [[AIM]] to evaluate the impact of their work on the client population. In AMBIT both audit and outcome evaluation falls within [[LEARNING at work]] in that its function is to enable the team to gain a deeper understanding of the work that they do.
Page being drafted March 2021
This page is being written in collaboration with the team in Altrecht. We are extremely grateful to Marjolijn, Saskia and Rose for sharing with us their brilliant work around auditing their service.
!!The Altrecht Service
In 2017, Altrecht Mental Healthcare in Utrecht, the Netherlands, set up several (5 so far) AMBIT teams. Our target group consists of adults with a (severe) complex Personality Disorder, with extensive comorbidity and multiple problems in the social domain.
!!Why audit?
Implementing a (partly) new model brings a lot of challenges. In 2020, 3 years after setting up the teams, we wanted to look into the level of knowledge and support for AMBIT and assess model-fidelity. We thought it would be helpful to learn about a team’s struggles to be able to help them forward. Therefore we decided to create a comprehensive questionnaire that goes beyond just model fidelity and also includes, for example, questions about working environment and discipline mix etc.
!!Designing the Audit
When auditing teams in the past, we have learned it is useful to look at a situation from different perspectives. To achieve this we have assessed how the practitioners themselves think about the model and the phase of implementation, followed by a file audit to assess this more objectively.
The audit consists of 3 parts.
* First, a questionnaire was administered to all teams which was anonymously filled in by practitioners.
*Second, we examined 10 random patient files for critical information in all teams. The results of the questionnaire and the file audit were documented in a report per team according to the AMBIT domains (patient, team, network and learning at work).
*Thirdly, the results of the questionnaire and file audit were extensively discussed in all teams by an independent colleague from one of the other teams. Based on this meeting, the teams have all drawn up their own action plan with their team leader.
We used various sources for the preparation of the questionnaire and the file audit. The questions and critical information are a result of combining and shifting through these tools and then adding some questions we felt completed the picture:
* MBT Adherence Scale
* AMBIT Practice Audit Tool (APrAT)
*Quick scan GIT-PD model fidelity by Dr. E. Dek, clinical psychologist Altrecht GIT-PD.
To see a copy of this questionnaire, click
[[here|https://docs.google.com/document/d/1SqamH-QHEQx1YhdDFqFQmkx6mZ_kYtLS/edit?usp=sharing]]
To see a copy of the file audit tool, click [[here|https://docs.google.com/document/d/1CLx6tLiMZ8EDtLqWjlB7UR77WPo73kRt/edit#heading=h.gjdgxs/edit?usp=sharing]]
!!Presenting the audit results
The results of both audit components have been processed in a report by the policy and quality staff officer. Each team received its own report and a report was drawn up which shows the results of all AMBIT teams together.
For a glimpse into one of the final reports, click [[here|https://docs.google.com/document/d/18-AI9fWqPAsPY5eX9XNuysAUNk6hIAkB/edit?usp=sharing]]
In order to be able to draw up a report that appeals to recipients, it is important not to include too many open questions in the questionnaire, percentages say enough and it limits the amount of text that the reader has to take in. However, we chose to add three open questions, because we wanted to give auditees the space to give their opinion and we found some questions too important to convert them into closed questions. Three was a number that was still easy to process, but which would give the auditees room to say more than just the answers to the questions we had come up with.
We know from research that information is better remembered when it is presented in different ways. That is why we thought it important to visualize the results in one way or another. We wanted to do this in the AMBIT wheel, because this was already a familiar image for the practitioners and they would therefore pick up and remember the information even better.
Since the AMBIT wheel consists of 4 domains (8 slices) and a centre circle, we identified 9 defining questions, two per AMBIT category (patient, team, network, learning on the job) and one for the level of understanding of mentalizing.
The visualization is made in MS Powerpoint. We started with an empty wheel and then did a lot of fiddly work to get the boxes filled in nicely. To save your time, we will provide a link to an editable wheel if you want to use the visualization.
For an (editable) example of an AMBIT wheel audit visualization, click on [[here|https://docs.google.com/presentation/d/1BeF1YWc7o9O8S6cZRCjTDUolZm9SMH2Z/edit#slide=id.p1/edit?usp=sharing]]
!Content required - June 2021
how we are using the APrAT to audit the impact of [[AMBIT Training]]
See [[AMBIT Practice Audit Tool (APrAT)]] for the tool
!!''Content: a multiple author/collaborative effort''
This manual is a synthesis and development from the original work of a group of clinicians and academics based in London and Cambridge, UK, beginning at the turn of the century ''but is now the work of multiple authors''.
The work of the original authors (listed below) was of course built on the work of generations of other academics and clinicians, and there are [[Academic references]] for a small portion of these in the manual. The publication [[Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom]] was influential in shaping the approach to evidence-based practice that AMBIT takes.
Since 2010, the wiki has increasingly been contributed to by all members of the [[AMBIT programme]] working on feedback from multiple teams that have trained and worked under the influence of AMBIT. See also [[Criteria for inclusion/exclusion of CONTENT in AMBIT]]
!!!Original Authors:
*Dr DickonBevington
*Dr [[Peter Fuggle]]
*Dr Eia Asen
*Prof Peter Fonagy
*Dr Mary Target
*Neil Dawson
*Rabia Malik
!!!Current AMBIT Editorial Group
Ongoing changes, adaptations and additions to content are made by the [[AMBIT Editorial Group]] -
This consists of the current AMBIT Programme Team at the Anna Freud Centre
*[[Liz Cracknell]]
*[[Laura Talbot]]
*[[James Fairbairn]]
*[[Rebecca Smith]]
*[[Peter Fuggle]]
*[[DickonBevington]]
see relevant content management material here:
<<tag [[AMBIT Editorial Group]]>>
!Licensing
Note that all the content of the AMBIT manual is released under a [[Creative Commons Licence|Licensed]] - please check the terms of this if you or your team are using this material.
!!!''Tiddly Manuals''
Tiddly Manuals are an approach to the use of wikis as adaptable opensource treatment manuals is the copyright of Dr Dickon Bevington ([[link|http://www.tiddlymanuals.com]]) and is also released under Creative Commons License - see the tiddlymanuals website for details of this.
!!!''Software and Programming''
The Software that this manual is written in is called Tiddlywiki, and was originally invented by [[Jeremy Ruston|http://osmosoft.com/]]. It is licensed separately, and is an OpenSource product. With a bit of work a beginner can quickly learn to do a lot with it.
We acknowledge with gratitude the support of Jeremy, and his colleagues, originally at [[Osmosoft|http://osmosoft.com/]]. In particular Jonathan Lister and Joshua Bradley at [[withjandj|http://www.withjandj.com/]] supported the design and programming of themes and the AIM online interactive version.
We acknowledge the generous backing of numerous [[Sponsors]] whose help enabled AMBIT to survive in its earliest years.
Literally "~Self-Teaching" it means [[Self-directed learning]] - we envisage the resources being developed and shared openly in AMBIT's OpenSource approach to therapy innovation and development as being increasingly open for use by teams and individuals who are self-directed learners. Please do note our [[Disclaimer]] - clinicians remain responsible for their own practice.
!Reference:
Egon Bachler, Alexander Frühmann, Herbert Bachler, Benjamin Aas, Guido Strunke and Marius Nickel (2014) //"Differential effects of the working alliance in family therapeutic home-based treatment of multi-problem families"// Journal of Family Therapy (2014) doi: 10.1111/1467-6427.12063
!Abstract:
Families with a low socioeconomic status play an increasingly significant role in health services, research and social policy. The present outcome research study is a pre/post naturalistic study of home-based therapeutic work with multi-problem families (MPF), as conducted by Therapeutisch Ambulante Familenbetreung, an integrative family therapy with a structure-related, mentalization-based, psychoanalytic orientation. With a mean treatment duration of 75.7 weeks, 379 families showed significant psychological improvement on 10 scales concerning patient–therapist collaboration, treatment expectancy and psycho-social outcome measures with a medium to large effect size for all parameters (range: .35–1.49).
About two-thirds of the sample improved by two SD on individually set treatment goals, further supporting the clinical significance of the therapeutic effect of home-based family treatment. Improvements in goal-directed collaboration and treatment expectancy are shown to be related to clinical improvement. Structural family therapy interventions for families
with multiple problems thus benefit from individually setting goals and improving their self-efficacy and problem-solving by means of improved treatment expectancy.
!Practitioners' responsibility
It is the Worker who takes responsibility for maintaining a ''BALANCE''...
Between ''"Inside"'' change work, and ''"Outside"'' change work.
In keeping with the [[Multiple interacting aetiologies]] in adolescent Substance Use Disorder, interventions that focus on //either// internal (cognitive or motivational) factors, //or// external (family or social-ecological) factors are immediately at a disadvantage.
Recognising that individual practitioners will have "favourite practices" and blind spots (losses of [[Mentalization]]) they sustain this balance via regular use of the SupervisoryStructures within the team.
!'"Inside" change work
[[Motivational Work]]
[[CognitiveBehavioural for SUD-Rx]]
!"Outside" change work
[[FamilyWork for SUD-Rx]]
[[Social-Ecological Work]]
Consider the [[Stages of Change]] here, as well as the [[Maintaining factors for problems]].
The [[AIM]] questionnaire also contains information about the young person's response to care.
A wiki is a website that is easy and quick (Wiki comes from the Hawaiian word for "quick") to edit by its users. Understanding how it holds together is helpful if you want to find things - by following [[Links]] between pages, or looking through the list of pages that are all [[tagged|Tags]] with the same subject.
!!!Non-linear pages linked by relationships and meanings
The text in this wiki comes in pages (that are also sometimes called "Tiddlers" - sorry, but that's how it is in TiddlyWiki) but these pages are not all lined up in the way they would be in a [[book|Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]]. Instead, they are collected and connected much more flexibly; according to what is //meaningful// in terms of how different pieces of information or resources (pictures, video clips, documents) relate to each other.
Many pages have a direct relationship to material that is already described or explained in other pages, and these connections are formed by [[Links]] - a page on sparrows might refer to the fact that they have beaks, and a ''link'' would allow the reader to find out more about beaks if they wanted to, with a single click.
!!!Pages grouped in multiple ways
Many pages also cover different aspects of the same theme or [[Topic]] for instance the page on Sparrows would be a [[Sub-topic]] of //Birds//. Beaks, on the other hand are //not// birds, and are also found on Duck-billed Platypuses and some dinosaurs. [[Tags]] are what string together pages that are //thematically-connected//. All the pages tagged with the ''same Tag'' (say "Bodyparts", which would include Beaks, as well as Feet, Fingers, Wings, etc) make up what you might think of as a ''Chapter'', except in a wiki there can be multiple chapters and a single page might belong to more than one chapter (or be tagged by more than one topic, to make it a sub-topic of these): for instance Sparrows might be tagged as Birds, but also as Insect-eaters and Egg-laying Creatures.
!!!Using Tags in the Manual
Tags that are gathering a particular page as one of their Sub-topics (or [[Sub-pages]]) show up as coloured buttons ABOVE the title of that page. (They are above the page title, as in ways the tag is the 'Chapter heading' of that page. Click on that tag button, and all the Sub-topics (alongside this page) will list underneath it, ''as if you have just revealed the contents page for this 'chapter'.'' Look at the title and top of this page: you will see it is tagged with <<tag [[Navigating the manual (finding what you need)]]>>.
!!!A page can be BOTH a Sub-page AND Tag or Topic heading
This page is a sub-page of the 'chapter' (Tag) "Navigating the manual (finding what you need)", but it also has its //own// Subtopics. The Sub-topics (aka Sub-pages) of THIS page (tagged by it) are listed in the box, top right of this page - so this page's OWN title <<tag [[Basic Structure of the Wiki Manual]]>> is actually 'tagging' pages on Tags and Links, Integrative and TiddlyWiki (which is the specific OpenSource form of wiki that has been the place where AMBIT has grown up) to form the heading of a little 'chapter' of its own.
Looking at the drop-down lists of tags can help you 'home in' on the area you are searching for if you can't find it by just searching for a word or phrase.
!!Finally: more information about a specific page
Look at the top right of any page, and you will see a few icons, including a down-pointing arrow (more a V, really) and clicking that opens a drop-down menu that includes (at the top of the list) ''Info''... clicking that opens a panel at the top of the page which tells you more than probably need to know about the page, but including when it was first and last authored/edited, and by whom, and there are a variety of Tabs, one of which is called ''Backlinks'' - clicking on this shows ''all the other pages in the manual that provide direct links to this page'' which is sometimes a helpful way to track meaningful connections across all this information!
American Journal of Psychiatry 2009 166:1355-1364
This is a very important paper for mentalization based interventions which compares MBT with structured clinical management. The results suggest that both interventions are effective but MBT increases the effectiveness of structured clinical care. The main outcomes are reduction of hospital admissions, suicidal and self injurious episodes.
!!!Evaluation of MBT
The evaluation framework for MBT is a combination of service outcomes (less hospital admissions), less high risk behaviours (suicidal attempts) and psychological functioning measures (General Assessment of Functioning - GAF) or symptoms changes (e.g. Depression scores). Interestingly the evaluation does not report whether mentalizing improves in the patients who receive MBT.
!!!Relevance to AMBIT
Direct comparisons between MBT and AMBIT are not possible both because the intervention is so very different, the developmental stage of the clients is different and the measures used may be similar but have been standardised on different populations etc. However, they provide some useful contrasts to the effort to make sense of the impact of AMBIT on the young people that make up the larger part of the AMBIT target group.
!!!Some examples of MBT outcomes
* Number of hospital admissions. For MBT this reduced from an average number of admissions for the six months prior to start of treatment of 0.31 to an average of 0.03 for the period of six months after the completion of 18 months of treatment. This reduction happened with SCM but much less so, form 0.32 to 0.19. Average lengths of hospital admissions were also reported to have reduced. For MBT this average reduced from 5.41 days to 0.20 days
*Ratings of General Functioning. The average GAF scores for MBT increased from 41.0 (8.4) to 60.9 (15.8) , an improvement of 18.1 points. This has a large (uncontrolled) effect size of 1.5.
* Symptom scores. Beck Depression Inventory score reduced from 29.83 (10.09) to 14.80 (8.55). This has a large (uncontrolled) effect size of 1.6.
:
Reference. Oxford University Press
This book describes structured clinical management (SCM) for BPD. This approach is effective but not as effective as MBT but is used as a contrast to MBT in a number of studies. Essentially it describes what non-specialist clinicians should aim to do when treating an adult with BPD. Although it is much more psychiatric in its orientation than is the case with our work with younger people, it is an incredibly clear and useful description of sound practice for people with the range of problems who are often so difficult for services to help. As is described in the book, many of the adult BPD patients bring with them a history of previous helping experiences which they poignantly describe as 'maltreatment as usual'.
Chapter 4 and 5 describe the non-specific and specific interventions involved in this approach. These techniques focus on developing skills in five areas:
#tolerance of emotions
#mod regulation
#impulse control
#self harm
#sensitivtiy and interpersonal problems
The relevance of these for working with AMBIT populations seems high. The main interventions are:
#problem solving
#reflecting not reacting
#identifying and labelling
#chain analysis
#self monitoring
#safety planning
The parallels with AMBIT are that we are inviting non-mental health professionals to develop an approach to working with clients with multiple life problems and trying to work out what should be the common shared practice for workers from a very wide range of training and work backgrounds. Structured clinical management is still focusing on the psychiatric service whereas AMBIT is more multi-agency in its approach.
In some ways AMBIT has been trying to work out what would be the equivalent of SCM for a multi-agency workforce. working with young people with multiple life problems.
Journal of Personality Disorders; theory, research and treatment.
This paper demonstrates that the improvements reported at end of treatment (18 months) have been sustained over the 8 year follow up and that MBT continued to show improved outcomes compared to SCM over this time.
Bearman, S.K., Ugueto, A., Alleyne, A., & Weisz, J.R. (2010). Adapting CBT for depression to fit diverse youths and contexts: Applying the deployment-focused model of treatment development and testing. In J.R. Weisz & A.E. Kazdin, (Eds.), Evidence-based psychotherapies for children and adolescents, 2nd edition, (pp. 466-481). New York: Guilford.
The Becks Depression Inventory can be found [[here|https://www.ismanet.org/doctoryourspirit/pdfs/Beck-Depression-Inventory-BDI.pdf]].
Reference:
//Beck, A. T., Steer, R. A., & Brown, G. K. (1996). Manual for the Beck Depression
Inventory-II. San Antonio, TX: Psychological Corporation.//
!!!![[Source|https://www.pearsonclinical.co.uk/Psychology/ChildMentalHealth/ChildMentalHealth/BeckYouthInventories-SecondEditionForChildrenandAdolescents(BYI-II)/BeckYouthInventories-SecondEditionForChildrenandAdolescents(BYI-II).aspx]]
The Beck Youth Inventories for Children and Adolescents are designed for children and adolescents aged 7 to 18 years.
The are 5 self-report inventories can be used separately or in combination to assess symptoms of depression, anxiety, anger, disruptive behaviour and self-concept.
Each inventory contains 20 statements about thoughts, feelings and behaviours associated with emotional and social impairment in youth. Children and adolescents describe how frequently the statement has been true for them. The instruments measure emotional and social impairment in five specific areas:
''Beck Depression Inventory for Youth:''
In line with the depression criteria of the Diagnostic and Statistical Manual of Mental Health Disorders— Fourth Edition (DSM– IV), this inventory allows for early identification of symptoms of depression. It includes items related to a child's or adolescent's negative thoughts about self, life and the future, feelings of sadness and guilt and sleep disturbance.
''Beck Anxiety Inventory for Youth:''
Reflects children's and adolescents' specific worries about school performance, the future, negative reactions of others, fears including loss of control, and physiological symptoms associated with anxiety.
''Beck Anger Inventory for Youth: ''
Evaluates a child's or adolescent's thoughts of being treated unfairly by others, feelings of anger and hatred.
''Beck Disruptive Behavior Inventory for Youth:''
Identifies thoughts and behaviours associated with conduct disorder and oppositional-defiant behaviour.
''Beck Self-Concept Inventory for Youth: ''
Taps cognitions of competence, potency, and positive self-worth.
!(a) Opening your manual
Your local version of the AMBIT manual can be found online at ''manuals.annafreud.org/manuals'' (expand the the list under AMBIT manuals ("more") and find your version in the alphabetical list. It will be in the form of manuals.annfreud.org/''ambit-yourteamname''
!(b) Logging on:
You cannot edit any manual unless you are //member// of it (Contact the [[AMBIT programme]] at [[AFNCCF]]), and are able to [[Log in]] with a //username and password//. You will need to be logged in for some of the editing tools to appear on pages that are open.
!(c) Technical skills:
See [[How to edit your team's manual]] for all the technical guidance you will need, and the [[User Guide]] for a more general overview of wiki manuals
!(d) Materials
''In-person:'' computer and projector/large screen, space for the team to sit in a small circle so that they can all see the screen, access to the computer keyboard for one team member
''Online:'' Ability to 'share screens'. One member of the team ([[Scribe|Role of the Scribe]]) able to open and access the team's local manual
This is what an observer can //see// - things that are ''done'', rather than the thoughts, intentions, wishes, or feelings that we might use to explain //why// these particular behaviours have taken place (working out this //"why"// question is at the heart of [[Mentalization]].) For many clinicians, behavioural therapy is unattractive because it can appear to remove personal agency from the description of a person's behaviour. AMBIT prefers to describe behaviour more in terms of actions than behaviours. Action is really behaviour with the assumption of intentionality, and the assumption of intentionality is the basis of mentalisation. The trick is to maintain the discipline of functional analysis while including aspects of intentionality to develop understanding.
!
In this way, one of the basic behavioural techniques is doing [[ABC Diary-keeping]]. This simply takes a specific situation and examines the antecedents, behaviours and consequences of a particular interaction. The value of this method is that it invites clients to go beyond general, global attributions of others (//"You are always like this..."//) to describe what they //actually// did, when. It fits extremely easily to add descriptions of internal mental states either experienced in oneself or imagined in others.
The behavioural approach has developed methods of getting accurate descriptions of what actions have taken place in specific circumstances. The effort to get accurate and specific descriptions of who did what, who said what to whom and then what happened are paradoxically capable of being very stimulating of processes of mentalisation. What might appear to come from a very different theoretical model can be integrated into this model of practice without abandoning the useful methods which behavioural work has developed over many years.
Behavioural activation is something that every parent knows about and basically means gently encouraging a young person to increase physical and general activity. This technique is [[Cognitive Behavioural]] and is consistent with the idea that mood and feeling is influenced by both thinking and behaviours. In general, low activity levels are likely to maintain low mood states and the so increasing activity is generally beneficial for mood.
There is nothing complicated about this approach. It all depends on the usual things of timing and sensitivity.
''First step'' is to try to get ''a general idea about the young person's daily routine''. Its important to be completely non-judgemental about this and just convey interest in the young person's daily life. But it may require some gentle persistence to really get an idea about a young person's general routine such as when he/she goes to bed, gets up goes out, eats etc.
Having mapped things out, it may then be helpful to try to ''link weekly routines with mood''.. i.e. at what times in the week does the young person feel more depressed or low etc. The aim would be to try to link low activity with low mood.
Make a number of suggestions about ''very small changes in routine'' and see which of those would be more acceptable to the young person. Never go for big changes however enthusiastic the young person becomes and its best not to aim for 100% of days. For example, if the young person decides to try to get up before midday during the week, only encourage him/her to do this five days out of seven. Its always important to leave a space for old habits otherwise the old habits will fight back too hard.
Having agreed a plan for the following week, ''stay interested'' when you next meet even if nothing has changed. Rarely do things move straight away. The important thing is to try to keep a balance between not being too casual about the plan and not being at all critical at things not progressing quickly. This response is a key part of the approach. Assume that persistence is part of the approach.
Changing daily patterns is hard for young people to do on their own. ''Looking for others to help '' with such changes is also important. Parents or other carers can easily fall back into 'nagging' interactions that may not be helpful so this needs to be monitored. The important thing is for others to celebrate positive changes and not focus on negative behaviours. Others who may be helpful are youth and "Connexions" workers who are often very skilled in encouraging positive daytime activity. See [[Social-Ecological Work]]
Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams working with socially excluded youth: the AMBIT approach. In “[[Minding the Child|http://www.amazon.co.uk/Minding-Child-Mentalization-Based-Interventions-Children/dp/0415605253/ref=sr_1_1?s=books&ie=UTF8&qid=1336178888&sr=1-1]]: mentalization-based interventions with children, young people and their families.” Ed. Midgley N and Vrouva I, Routledge, 2012.
Bevington D, Fuggle P, Fonagy P, Asen E and Target M (2012) “Adolescent ~Mentalization-Based Integrative Therapy (AMBIT): A new integrated approach to working with the most hard to reach adolescents with severe complex mental health needs.”
*[[CAMH Journal|http://onlinelibrary.wiley.com/doi/10.1111/j.1475-3588.2012.00666.x/abstract]] (May 4th 2012 | DOI: 10.1111/j.1475-3588.2012.00666.x)
This is the "book of the wiki" so to speak.
Published by Oxford University Press, it is the most complete statement of AMBIT in a linear (as opposed to non-linear wiki) format.
The work of turning a non-linear developmental account (as this wiki is) into a coherent narrative was interesting and - we hope - fruitful. Some of the material in this will now be updated in keeping with learning from this process.
[img[AMBIT_BookCover.jpg]]
A link to the OUP website is here: https://global.oup.com/academic/product/adaptive-mentalization-based-integrative-treatment-9780198718673?cc=be&lang=en&
!Reference:
Bevington, Fuggle, Fonagy (2015) //"Applying attachment theory to effective practice with hard-to-reach youth: the AMBIT approach."// Attachment & Human Development DOI: 10.1080/14616734.2015.1006385 (link to it [[here|http://www.tandfonline.com/doi/abs/10.1080/14616734.2015.1006385#preview]])
!Abstract:
Adolescent Mentalization - Based Integrative Treatment (AMBIT) is a developing approach to working with “hard-to-reach” youth burdened with multiple co-occurring morbidities. This article reviews the core features of AMBIT, exploring applications of attachment theory to understand what makes young people “hard to reach,” and provide routes toward increased security in their attachment to a worker. Using the theory of the pedagogical stance and epistemic (“pertaining to knowledge”) trust, we show how it is the therapeutic worker’s accurate mentalizing of the adolescent that creates conditions for new learning, including the establishment of alternative (more secure) internal working models of helping relationships. This justifies an individual keyworker model focused on maintaining a mentalizing stance toward the adolescent, but simultaneously emphasizing the critical need for such keyworkers to remain well connected to their wider team, avoiding activation of their own attachment behaviors. We consider the role of AMBIT in developing a shared team culture (shared experiences, shared language, shared meanings), toward creating systemic contexts supportive of such relationships. We describe how team training may enhance the team’s ability to serve as a secure base for keyworkers, and describe an innovative approach to treatment manualization, using a wiki format as one way of supporting this process.
In this approach we do not distinguish between "biological" and "functional" disorders. As the brain is the organ of the mind, it is axiomatic that any mental disorder will be associated with biological dysfunction. There is a [[Neurodevelopment and adolescence]] context for work with children and adolescents, and a [[Key Worker]] cannot ignore [[Physical Health matters]]
Medication ([[Pharmacological]] interventions) may be extremely helpful in containing a crisis, whatever factors have precipitated the problem or may be exacerbating it.
This is an intervention in the [[domain|Working in multiple domains]] of biology, but it almost inevitably carries [[Systemic|SystemsTheory]] implications.
Accepted (NICE) treatment guidelines require that there should be rapid access to appropriate medication, and the general principles of the intervention are to make it as likely as possible that the recommendation of medication is taken seriously, while not excluding other modes of intervention which may be required to address the YP's problems.
Medication can also have secondary psychological effects of reducing anxiety and thus making the family environment more secure. In particular, medication is not used to move the focus of the intervention from the family system to the YP, or to encourage the idea that the YP has something wrong with his brain which explains all the problems, an idea which makes it less likely that the family will retain a feeling of responsibility for being part of the treatment.
Any young person who is sexually active or who is using substances, and ESPECIALLY any person who is using intravenous injection as a means of taking substances, should be offered the opportunity to be screened for certain blood borne viruses that are known to be transmitted via these routes. In particular the viruses tested for are:
*HIV
*Hepatitis B (inoculations are available for this, and should be offered)
*Hepatitis C
!Local Protocols
Screening and Inoculations will be available from specific sources in a neighbourhood - some G-U (Genitourinary) Clinics offer this; in other areas there may be arrangements with local GP practices or other specifics. It is important for local teams to make a note of this information and contact details in their own team manual.
*[[Patient-Worker Boundaries]] - Managing appropriate, professional, ethical, safe relationships with our patients.
*CheckLists - A list of tasks/paperwork etc that an [[AMBIT]] practitioner must have.
*[[AMBIT Practice Boundaries]] - Things like minimum supervisory contact, forms of supervision, etc
*[[Interprofessional Boundaries]] - Includes links to transitional and interagency protocols, and to a [[How to speak to a...]] (doctor/nurse/teacher/policeman) section.
* [[Manualization Boundaries]] - The rules governing the team's interaction with the Manual and how FEEDBACK is incorporated into shared practice - this includes DataSecurity.
This is a commonly used technique.
In order to shape a behavioural change it is important to minimise the likelihood of a young person experiencing failure.
Thus a target is broken down into small ''achievable'' steps... let the young person guide you about what they believe is or is not achievable. Use [[Rating Scales]] to help structure these conversations, aim to develop a ''graded hierarchy'' of difficulty. The key here is to find enough steps and to get into detailed discussion about which variant of a task is likley to be more or less anxiety provoking. Moving up this ladder of steps is the process known as [[Graded Exposure]]. This sort of work follows very well from the use of [[ABC Diary-keeping]], and goes alongside relaxation work such as [[Progressive Muscle Relaxation]].
!!In substance use:
Moving from smoking 12 joints a day to abstinence may be better achieved by concentrating on smaller steps:
>//"So you smoke with your mates usually, and we have agreed that amongst your mates you have the reputation as the greediest cannabis smoker around! What if you were to start by trying to take just one, max two, drags on the joint each time it comes around, rather than the four or five you say you take at present. That way your mates won't be upset by you, adn you'll get to cut back a bit... how would that be?"//
>//"What if you were to cut back from 12 joints a day to 10 joints? How difficult would you find that on a scale of 0 - 100 (0 = easy, no problem, and 100 = impossible). Do you want to try that for the next two or three days and then let's talk about whether it was harder than you thought or easier - or about how you guessed it would be."//
!!When should this occur?
Ideally before an AMBIT training is booked
!!Who should give the briefing?
Senior members of the team requesting the training - or AMBIT trainers
!!The Necessity for Senior Managerial Support
* There is ample evidence from [[Implementation Science]] that achieving organisational change of any form is challenging
* The adoption of evidence-based or evidence-oriented practices such as AMBIT is no different.
* This is backed up by the experience of the AMBIT project at the [[Anna Freud National Centre for Children and Families]], which has now trained over 150 separate teams in AMBIT.
* Those teams which have lacked significant senior management support to empower them to create new ways of working have struggled to implement much objectively new staff behaviour, regardless of how positively (individually or collectively) they have rated their impression of the [[AMBIT training|Information About AMBIT Training]].
!!Examples of low senior managerial support:
* Lack of engagement by senior managers in understanding the core features of AMBIT.
** Consider senior managers attending for part or all of the training
** See [[AMBIT: an overview]]
** Consider the ways in which AMBIT may or may not "fit" with existing service priorities and structures.
* Purchase of AMBIT training as a means of "avoiding underspend on the training budget" rather than for its perceived intrinsic value.
** Consider alternative ways to spend money
** AMBIT is not a one-size-fits-all approach but...
** It is also about empowering teams to develop clearer, more explicit ways of working, that are sensitive to the existing service eco-system, but which may also invite greater flexibility in working roles (following the //service user's needs//, rather than primarily the //institution's//.)
!!Clarity about the intentions for the training
* Senior managers should be part of the discussion that helps to define a set of [[Post-training outcome goals]]
* They should sign these off, as being in keeping with the goals of the wider organisation.
<center>{{broadcasting Pic.jpg}}</center>
Broadcasting Intentions is a key part of the active planning stance. This is when the [[Key Worker]] makes an effort to be EXPLICIT and clear about their intentions or ideas to their client. In other words, the worker is open about 'what my intention or purpose is, and why'.
The point of this is that we cannot assume that our clients will have the kind of [[Relationship to help]] in which they would experience our approaches as well-intentioned. It may be that our behaviour does not make sense, or represents something more threatening or troubling, in relation to their past experiences of others.
//In the anxiety of the client/worker interaction it is often hard for the client to [[Mentalize|Mentalization]] their worker accurately.//
So, we Broadcast our Intentions in order to;
*Prevent an intention from being misunderstood.
*Help an intention be understood
* Resolve a misunderstanding
*Build trust
This is also a key element in the process of Engagement:
<html><object width="480" height="360"><param name="movie" value="https://youtube.com/v/s5A41EGo--o?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/s5A41EGo--o?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!How to broadcast our intentions
The AMBIT [[Key Worker]] is encouraged to verbalise his/her intentions.
This might be in terms of their general aims of the intervention such as "being helpful" to the client, or the specifics, such as //"to register for a college course"//..
My invitation to consider registering for a college course might be well-intended, but might be read my client as a move to separate her from her boyfriend, or to humiliate her mother, etc... If those were my true intentions, then it would make sense for my client to resist them, and I am unlikely to have any influence in that sphere!
Intention can be expressed in moment to moment interactions, for instance:
>//"My intention here is just to try to understand more accurately what you are feeling, and why."//
or
>//"What I am trying to do here is to be helpful, or at least to think of some new ideas about this familiar problem, and definitely to to avoid being unhelpful!"//
Being clear about moment to moment interactions would be adopting an explicitly intentional stance.
>//"I may not have got things quite right yet, but these are the things that at the moment seem to me the most important ones for me to try to help you deal with... ...I would like to hear from you which bits you think I have got about right, and which bits I still need to work on so that you can recognise them more clearly..."//
!! A tool to help this:
The [[The Egg and Triangle]] is about helping the worker to share their "first effort" in
'"what I have understood from you", then inviting the client to help improve it. When you are sharing your first effort, ''that'' is Broadcasting Intentions!.
Go to [[this link|https://docs.google.com/file/d/0B5h_CVBdhJPYNkJNamFPVXhsYXM/edit?usp=sharing]] to download this in PDF format, or just use the back of an envelope!
[img[https://lh5.googleusercontent.com/-loMP5VnnI1Q/URG08pJR4OI/AAAAAAAAGpY/o21-QH6rBw0/s640/ActivePlanningSheet.jpg]]
[img[https://lh5.googleusercontent.com/-EXERk6bOad4/URG07sRVqzI/AAAAAAAAGpc/W6cVjCoCoHA/s640/ActivePlanningSheet_DEMO.jpg]]
.
Reference: Frontiers in Psychiatry 2020, 11:609120
This is a great descriptive study outlining baseline characteristics of young people being seen as part of the ACT programme in Holland. Thank you to Michael Daubeny for alerting us to this excellent paper
The target population is well described and is representative of target groups trained in AMBIT showing a combination of mental health, social care and educational difficulties.
They have divided the sample of 199 young people into four subgroups. I am not entirely sure if these sib groups are useful but the data on the total sample is extremely valuable. as it provides baseline measures on frequently used measures by AMBIT teams.
The range of measures is extensive but a number of highlights are:
#HONOSCA. Total HONOSCA score is 19.25 (7.29).
#Parent SDQ. Total score is 17.5 (6.23)
#Child SDQ. Total score is 16.3 (6.16)
The HONOSCA is reported in full so frequency on each item is also shown. On the HONOSCA, the three problems most commonly rated as very severe were :
#Poor school attendance (36.7%)
#Problems with family life (21.1%)
#Problems with emotion and related symptoms (17.6%)
#Problems with substance misuse (10.1%)
Combining the severe and very severe ratings, over 51% had problems with school attendance; 60% had problems with family life; 53% had problems with peer relationships; 63% had problems with emotional and related symptoms. More narrowly defined psychiatric problems (overactivity, self harm; antisocial behaviour had much lower frequencies.
All of this is entirely consistent with CASUS study findings.
There are a long list of other measures reported in the paper, many of them relating to domains highlighted in the AIM.
Video on the [[Community of Practice]] that AMBIT emphasises as part of [[LEARNING at work]].
Part 1
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/x5WI97Sv4EA?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/x5WI97Sv4EA?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Part 2
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/ecF2cUGl8d8?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/ecF2cUGl8d8?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Cambridgeshire Child and Adolescent Substance Use Service
CASUS is an AMBIT service commissioned to provide Substance Use services for youth in Cambridgeshire, with a website [[here|http://www.casus.cpft.NHS.uk]]
!!CASUS Current Research and Evaluation
The service has been collecting outcome data over a number of years measuring characteristics of their client group, client satisfaction, client functioning (near the start and at the end of contact with the service) as well as specific service goals (related to changes in substance use in clients). The team are currently analysing and working to publish an academic paper around their findings.
Study now completed.
See publication here: [[Fuggle et al (2021) Improving lives not just saying no to substances: evaluating outcomes for a young people’s substance use team trained in the AMBIT approach.]]
Cognitive Behavioural therapy (CBT) provides an explanatory model, based on SocialCognitiveTheory and [[Developmental Considerations]], and this model underpins a series of quite simple ''therapeutic techniques'' that are aimed at improving psychological functioning.
The model evolved from Behaviour Therapy and emphasises the triangular way in which an individual's [[Behaviour]] is influenced by patterns of [[Thinking]] (including your [[Implicit Core Beliefs]] about your self ([[Self-efficacy]]), the world, the future) and [[Feeling]].
<html><img src="https://docs.google.com/drawings/pub?id=15NSkmut8m3ML2TrGZQ-M4H3ySAYBsEPNvj38aIbOIjU&w=600&h=400"></html>
There are many different techniques under the tab ''CBT techniques'' ([[CBT techniques]]) in the manual; note that many of these have been derived from work with adults and some therefore require adaptation for use with young people. See [[Cognitive Behavioural work - CheckLists]] for a checklist to help structure your intervention.
!!CBT involves the use of a wide range or techniques
The key ones are listed below, in an approximate "running order", although this is something that must remain flexible and adaptive to the needs of the client:
*[[PsychoEducation]] - key early stage of CBT, orienting the client to the reasons behind the work they will be doing.
*[[Rating Scales]] - useful to include early on - changes in ratings are evidence for the client and therapist as "Co-experimenters"...
*[[Progressive Muscle Relaxation]] - a useful early engagement tool, allowing experimentation with [[Rating Scales]] and preparation for more challenging aspects of therapy.
*[[Re-breathing]] - a more physiologically-directed relaxation techniques for panics with hyperventilation.
*[[ABC Diary-keeping]] - useful in the assessment phase, helping to guide the keyworker in...
*[[Breaking down tasks into steps]] - useful at the planning stage in developing
*[[Graded Exposure]] programmes and other forms of...
*[[Behavioural activation]] - treatment by changing behaviours, that in themselves change mood and thinking...
* [[Thought Blocking]] addresses ways of taking more control of what thoughts to "run" and what thoughts to discard - useful if there are [[Obsessions|Obsessional compulsive disorder]] that are distressing or destabilising for the young person.
*[[Contingencies]] - refers to developing programmes that change the way in which a young person's surroundings may or may not offer [[Reinforcement]] to 'positive' (desired) behaviours and help to extinguish 'negative' ones.
*[[Problem solving]] - a structured and collaborative approach to solving problems.
*[[Weighing Pros and Cons]] - also known as a decisional balance - part of [[Problem solving]].
*[[Life practice]] - is the transporting of these techniques into real life situations
*[[Training Challenge]] - or "homework"...
!Clinical Global Assessment Scale
Use intermediary levels (e.g., 35, 58, 62). Rate actual functioning regardless of treatment or prognosis. The examples of behaviour provided are only illustrative and are not required for a particular rating.
!Record scores at...
[[Outcome measures (T1, initial)]] after inital assessment
[[Outcome measures (T2, 3 months)]]
[[Outcome measures (T3, treatment close)]] after end of treatment.
!100 - 91
Superior functioning in all areas (at home, at school, and with peers); involved in a wide range of activities and has many interests (e.g., hobbies or participates in extra-curricular activities or belongs to an organised group, such as scouts, etc.); likeable, confident; "everyday" worries never get out of hand; doing well in school; no symptoms.
!90 - 81
Good functioning in all areas, secure in family, school and with peers; there may be transient difficulties and everyday worries that occasionally get out of hand (e.g. mild anxiety associated with an important exam, occasional "blow-ups" with siblings, parents or peers).
!80 - 71
No more than slight impairment in functioning at home, at school, or with peers; some disturbance of behaviour or emotional distress may be present in response to life stresses (e.g. parental separations, deaths, birth of a sibling) but these are brief and interference with functioning is transient; such children are only minimally disturbing to others and are not considered deviant by those who know them.
!70 - 61
Some difficulty in single area but generally functioning pretty well (e.g. sporadic or isolated antisocial acts, such as occasionally playing hooky or petty theft: consistent minor difficulties with school work; mood changes of brief duration; fears and anxieties which do not lead to gross avoidance behaviour, self-doubts); has some meaningful interpersonal relationships; most people who do not know the child well would not consider him/her deviant but those who do not him/her well might express concern.
!60 - 51
Variable functioning with sporadic difficulties or symptoms in several but not all social areas; disturbance would be apparent to those who encounter the child in a dysfunctional setting or time but not to those who see the child in other settings.
!50 - 41
Moderate degree of interference in functioning in most social areas or severe impairment or functioning in one area, such as might result from, for example, suicidal preoccupations and ruminations, school refusal and other forms of anxiety, obsessive rituals, major conversion symptoms, frequent anxiety attacks, poor or inappropriate social skills, frequent episodes of aggressive or other anti-social behaviour with some preservation of meaningful social relations.
!40 - 31
Major impairment in functioning in several areas and unable to function in one of these areas, is, disturbed at home, at school, with peers, or in society at large, e.g. persistent aggression without clear instigation; markedly withdrawn and isolated behaviour due to either mood or thought disturbance, suicidal attempts with clear lethal intent; such children are likely to require special schooling and/or hospitalisation or withdrawal from school (but this is not a sufficient criterion for inclusion in this category).
!30 - 21
Unable to function in almost all areas e.g. stays at home, in ward, or in bed all day without taking part in social activities or severe impairment in reality testing or serious impairment in communication (e.g. sometimes incoherent or inappropriate).
!20 - 11
Needs considerable supervision to prevent hurting others and self (e.g. frequently violent, repeated suicide attempts) or to maintain personal hygiene or gross impairment in all forms of communication, e.g. severe abnormalities in verbal and gestural communication, marked social aloofness, stupor, etc.
!10 - 1
Needs constant supervision (24 hour care) due to severely aggressive or self-destructive behaviour or gross impairment in reality testing, communication, cognition, affect or personal hygiene.
!Record scores at...
[[Outcome measures (T1, initial)]] after inital assessment
[[Outcome measures (T2, 3 months)]]
[[Outcome measures (T3, treatment close)]].
*The IMPROVEMENT scale for the [[Clinical Global Impression (CGI)]]
*To be done at treatment close (part of the [[Outcome measures (T3, treatment close)]])
!~CGI-I
The ~CGI-I is a seven point scale of the amount of improvement during or at the end of treatment.
''@@color(red):1=Very much improved
2=Much improved
3=Mildly improved
4=No improvement
5=Mildly worse
6=Moderately worse
7=Very much worse@@''
*The SEVERITY scale for the [[Clinical Global Impression (CGI)]]:
*To be done at:
** ''TREATMENT START'' ([[Outcome measures (T1, initial)]])
** ''3 MONTHS'' ([[Outcome measures (T2, 3 months)]])
**''TREATMENT CLOSE'' ([[Outcome measures (T3, treatment close)]]
!~CGI-S
The ~CGI-S is a seven point scale of the severity of the clinical problem;
''@@color(red):1=Normal
2=Close to normal
3=Mild
4=Moderate
5=Quite severe
6=Severe
7=Very severe@@''
!!Recapping AMBIT training
This page gathers key exercises/learning you will have done in your [[AMBIT training|Information About AMBIT Training]] that relate to the quadrant of the [[AMBIT Wheel]] described as:
!!><<tag [[Working with your CLIENT]]>>
Note, there is plenty more to AMBIT than what is covered in your training, so feel free to browse further!
!!><<tag [[CLIENT exercises from AMBIT training]]>>
Centre for Social Justice, Youth Justice Working Group (2012) //Rules of Engagement: Changing the heart of youth justice// see page 101. (web-based pdf [[here|http://www.centreforsocialjustice.org.uk/UserStorage/pdf/Pdf%20reports/CSJ_Youth_Justice_Full_Report.pdf]])
!!!What do longitudinal studies tell us about the longer term outcomes of children and young people with multiple problems and multiple agencies.
What does research tell us about the likely natural history and life course for these children and young people. Perhaps the most relevant and useful studied population is young people with antisocial behaviour problems. We know that they will often have a range of comorbid difficulties around depression, poor self control, and a wide range of environment disadvantages so the profile of need for this group is very similar to the common target group for teams trained in AMBIT.
One of the most influential and important longitudinal studies is the Dunedin Study and the papers published by Terrie Moffitt and her team.
Moffit has proposed a distinction between young people who show antisocial behaviour during adolescence and young adulthood and those who show life long antisocial and offending behaviour. The you tube clip below provides a brief (10 minute) introduction to this research.
<iframe width="560" height="315" src="https://www.youtube.com/embed/__eZol2qwSI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
A similar brief summary of the two career pathways -adolescence limited and life course persistent patterns of offending is well described in a five minute video shown below.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/D9RwqR7FIjc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
What we can conclude from longitudinal studies is very succinctly described in the following 10 minute presentation by Terrie Moffit. This indicates how common mental health problems are (nearly everyone at some point in their life), over half start in adolescence and the large majority of people move between different disorders at different times in their lives.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/odSZFo92Cms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Moffit proposes that the large majority of societal costs (health, criminal justice, social care) are needed for approximately 20% of the population and this 20% share a general a generalised psychopathology.
Increased vulnerability to long term needs are related to child vulnerability factors that can be identified at 3 years of age namely
*early language skills
*motor skills
*Neurological health
*self control
Combined with environmental factors of
*poverty
*maltreatment
These indicate a four fold increase in risk of life long needs.
A fuller description of her research on self control is shown in the following video. The video below shows a one hour talk given by Terrie Moffit about this.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/PrwcI3CRG4I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
----
!!''Answer... Yes!''
There is a debate to be had about whether there is any such thing as "//doing AMBIT//".
AMBIT is designed to be:
''__A systematic way for local teams to develop their own "Treatment as Usual":__'' //Treating "Usual Care" with care//, as it were, that is integrated through a core theory, [[Mentalization]], (that has evidence in its support in a range of specialist settings), and which includes a range of already-evidence-based components of practice...The current applications of AMBIT are many, and varied, with local teams drawing on different elements of AMBIT and adapting them to suit their local needs.
Hence the AMBIT project authors prefer to speak of [[AMBIT-influenced]] teams, rather than "AMBIT teams". We suspect that, barring a few exceptions where very robust measures are in place to ensure very high fidelity to a very closely defined model of practice, most teams delivering care to hard to reach young people deliver a practice that is //influenced// by a wide range of practices, some of which is more or less evidenced. AMBIT seeks to move such practices from ''implicit'' to ''explicit'', and to stimulate [[Mentalization]] in teams to support thinking about and learning from questions such as
//"Why do we work in ''that'' way with ''those'' kinds of problems? Under what circumstances might we work in ''this'' way?"//
In other words, AMBIT places particular emphasis on supporting local teams to adopt the practices of a [[Learning organization|Developing learning organisations]] - in keeping with the AMBIT principle of [[Respect local practice and expertise]].
!!''Yes, but...''
#Evidence does exist to suggest that ''manualized'' practices get better results for their clients than ''eclectic'' approaches, that leave method and practices to chance.
# It is hard for teams to learn from their day to day experiences, and to hold on to, or develop, a strong sense of team identity if there is staff turnover and a high workload. Recording our learning as a team in a systematic way is worth doing.
# There is sense in terms of the theory of [[Mentalization]] in taking a stance of being boldly "open source" in one's approach to [[Broadcasting Intentions]].
# The AMBIT project is currently gathering evidence about whether teams that do actively engage in [[Manualization]] demonstrate better outcomes than those that don't (because not all the teams that we train do actively engage with their wiki manuals).
* We do not yet have robust evidence to answer this question.
* However, our //hypothesis// is that manualizing has a positive impact on team functioning and outcomes.
* Of course it may be that already well-functioning effective teams are the ones that have greater scope and motivation to manualize their work...
* In that case, though, it might benefit other teams to examine what practices it is that they are manualizing!
!In the UK Cannabis is a Class B drug
The government reclassified cannabis from Class C to Class B in January 2009. The decision was part of the drug strategy: //"Drugs: protecting families and communities"// This information is adapted from government information availabel onthe web.
!!Why Class B?
Classing cannabis in Class B reflects the fact that skunk, a much stronger version of the drug, now dominates in the UK. Skunk has swept many less potent forms of cannabis off the market, and now accounts for more than 80% of cannabis available on our streets, compared to just 30% in 2002.
!!The classification of cannabis means:
* the government will robustly enforce laws on cannabis supply and possession
* police and other agencies will work to shut down cannabis farms and arrest the organised criminals who run them
* the consideration of additional aggravating sentencing factors for those caught supplying cannabis near schools
!!Current penalties related to cannabis
!!!Penalties for supply, dealing, production and trafficking
The maximum penalty is 14 years imprisonment.
!!!Penalties for possession
The maximum penalty is five years imprisonment.
!!!Young people in possession of cannabis
A young person found to be in possession of cannabis will be arrested and taken to a police station where they can receive a reprimand, final warning or charge depending on the seriousness of the offence.
Following one reprimand, any further offence will lead to a final warning or charge. Any further offence following a warning will normally result in criminal charges. After a final warning, the young offender must be referred to a Youth Offending Team to arrange a rehabilitation programme.
!!!Adults in possession of cannabis
Anyone caught in possession of cannabis could be arrested.
Alternatively, police may:
* issue a warning (primarily for first-time offenders)
* issue a penalty notice for disorder, with an on-the-spot fine of £80
For the most appropriate of the [[Specific interventions]] in this manual, see the collection of material under: [[Substance use disorder - treatment]]
!Legal issues:
See [[Cannabis Legal issues]]
!PsychoEducation about Cannabis
See the great [[Cannabis Effects video by MAC-UK]] - a short video from the MAC-UK organisation (their AMBIT manual is at @ambit-mac) made by and for young people.
!Health concerns:
The most serious health concerns are:
*Increased risk of [[Psychosis]], especially in young people who have pre-existing vulnerability, i.e:
**A past history of a psychotic episode
**"Prodromal" symptoms
***Suspiciousness
***Paranoia, misinterpretations, occasional hallucinations
***Withdrawal, other 'odd' behaviours or experiences.
**A family history of psychosis
*[[Anxiety]], [[Panic Attacks]], and [[Depression]]
*Irritability, relating to paranoia, or poor Affect Regulation (when Cannabis is used as a means of avoiding the processing of emotions.)
*Dependency - for instance:
**Needing more cannabis to get the same effects
**Craving it when it is not available
**It becomes increasingly central in the young person's concerns/interests - other interests are dropped in its favour.
*Developmental and Educational failure
**Spending large proportions of ones youth intoxicated means there is less time or capacity to practice developing:
***Basic SocialSkills,
***[[Affect Regulation]]
***Scholastic skills and academic qualifications (which is itself linked to poorer long term health outcomes)
*Long term risks of Cancer
**From the Tobacco it is usually smoked with
**Direct from the oily cannabis resin
*Helath risks from ADDITIVES
**Cannabis is not uncommonly "cut" with other substances that add weight to it, or give it the appearance of being more resinous than it really is - one substance used for this is GROUND GLASS - which adds weight to the cannabis leaves, and gives them a faintly glittery appearance that can look like cannabis resin. When smoked the ground glass can be inhaled and lodge in the lung, with potential to cause inflammatory diseases rather similar to the ones that miners can develop (silicosis) or to be a focus for infection (pneumonia, etc).
*Addiction to OTHER drugs
**There is some evidence to suggest that Cannabis can act as a "gateway drug" - introducing the user to dealers and users who will in turn introduce them to harder drugs.
**Alcohol and Nicotine are at least as potent as "gateway drugs" in this respect, BUT there is a risk that cannabis may be "cut" with other drugs (ampthetamines, crack cocaine, mephedrone, etc) as "loss-leaders" - so that the user comes back for more and learns about the magic "ingredient X".
!What to do?
See [[Substance use disorder - treatment]]
This is the curious interrogative stance adopted by the [[Key Worker]] - part of [[The Therapist's Mentalizing Stance]], which refers to [[The Inquisitive Stance]], a state of not-knowing that stimulates questions.
One way of keeping hold of this state-of-being-with is to think of one's questions as being modulated by ([[Holding the Balance]] between) two conscious wishes:
* The wish to avoid causing harm or undue distress ('''Care''')
* The wish to facilitate positive change ('''Concern''').
!!Introduction
The techniques described below have been developed to improve the quality of Case Discussion in AMBIT. In many respects there is (in common with most of Mentalization-based practice) little that is startlingly //new// about this; rather, the theory of [[Mentalization]] offers a framework for understanding how or why such practices might be effective.
The common thread that attaches these is the fact that [[Mentalization]] is reduced/prevented in situations where there is very significant //affect// present - particularly if this emotional context triggers the [[Attachment]] system into action. This happens when a worker is "alone" with a case, or in a team meeting (the opposite of the [[Keyworker well-connected to wider team]].)
Both techniques given below are designed to create a well-demarcated "safe zone" around an stressful situation, to allow the kind of imaginative activity (which includes Mentalizing) required for thinking out a therapeutic course of action, whilst maintaining the structure to ensure that basic safety requirements are maintained.
!!Techniques/Skills in case Discussion
[[Thinking Together]] - points at how to set up a discussion that allows the right information to be shared and then thought about... This can structure a 1:1 conversation, but also a whole team cae discussion.
[[Passed-outwards Discussion]] or [[POD|Passed-outwards Discussion]] - the Keyworker arranges for information that s/he has passed down to a colleague to be 'passed down' again in his/her presence.
!Reference:
Cecchin, G. (1987). Hypothesising, circularity and neutrality revisited: an invitation to curiosity. Family Process, 26, 405-413.
!Abstract
This essay examines the systemic guiding principles of neutrality, hypothesizing, and circularity, historically developed by the Milan Team of Selvini-Palazzoli, Boscolo, Cecchin, and Prata (12, 13). With the reorganization of these team members (see 11 for a summary of the distinctions between the work of the Selvini-Palazzoli and Prata research team and the Cecchin and Boscolo training team), different reconstructions of the original systemic principles have evolved. New understanding of the concepts of circularity, hypothesizing, and neutrality are now possible, given the systemic epistemology on which the early Milan model was based. It should be emphasized, however, that the ideas presented in this essay are most associated with the systemic work of the Cecchin and Boscolo team
When working in therapeutic relationships with our clients, in particular, when managing risky clients', workers can at times feel out of balance.
There can be a tension between working to develop and strengthen relationships (attuning to the client and their network), with the need to challenge our clients, and at times adopt clear risk management procedures. This can be a complicated balance to negotiate in face to face work.
Closely related to this balance, is the notion that many teachers and therapists describe the difficulty of knowing when to challege and when to offer support in bringing about therapeutic changes with clients (Sanford, 1966).
In thinking about this balance, we suggest that it is helpful to see the process as finding a pathway balancing between:
* ''CONTAINMENT'' (nurturance, safety, responsivity, sensitive attunement)
and
* ''CHALLENGE'' (promotion of concrete changes, termination of non-mentalized [[Pretend mode]] patterns of behaviour, etc).
The important point is to avoid an overly rigid position, but to maintain a thoughtful ([[Mentalizing]]) journey towards change.
Please see below for a brief explanation of this balance adapted from Sanford (1996).
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/EjdE7W0M5Cs" frameborder="0" allowfullscreen></iframe></html></center>
Too much focus on containment and attunement to the client without any introduction of new perspectives, differences or challenge may be seen as falling within the 'fan club position'. Whilst overly adopting a position of challenge and introducing differences to the client might be experienced as being a 'persecutor'.
Rather than avoiding either of these (an 'abdicator role') we would want to find a balance between these two points. In the journey towards creating an effective therapeutic relationship there are likely to be times when the workers' estimations about the right level of challenge turn out to be wrong. At these times the client may experience being pushed too hard or being misunderstood. The worker acknowledging this and taking responsibility for these episodes, showing genuine motivation to understand better for next time is critical in the process of continuing towards change.
The above theory is adapted from N. Sanford, Self and Society: Social change and individual development, 1996.
For further material on this, see the dynamic balances involved in [[Active Planning]], and [[The Therapist's Mentalizing Stance]].
!Intro
A legitimate (but we argue wrong) question is [[Isn't mentalizing just being supportive?]] This page is about offering //Challenge// alongside the //Support// that good mentalizing delivers - all while [[Holding the Balance]] between them.
!Background
Over time, individuals, couples and families all develop their own way of seeing things, or of constructing their own "scripts".
In a sense, these are examples of a [[Pretend mode]] style of thinking - where the obvious ("Elephant in the room") is (perhaps temporarily, perhaps over years) overlooked... to allow a "make-believe" situation to continue. Now, whereas in childhood this often makes good sense (much good learning about social roles, etc, is achieved through playful exploration), in other situations (if unbalanced) the pretend mode can prevent any meaningful change from happening.
In therapeutic encounters, there are more than likely issues that, whilst it is understandable that they are avoided, really //need to be looked at, thought about, and acted upon// in order to change things for the better. Ultimately, the worker in these situations needs to find a way for material to be introduced //in a way that allows the possibility of change to arise.//
This gets to the heart of what we refer to as [[Holding the Balance]] in the [[The Therapist's Mentalizing Stance]] - here ''the balance is between CHALLENGE on the one hand, and SUPPORT on the other'':
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/EjdE7W0M5Cs?rel=0" frameborder="0" allowfullscreen></iframe></html>
!How to challenge:
Fixed belief systems and/or behaviours can (indeed must, ultimately) be challenged by the [[Key Worker]], so as to facilitate the emergence of new viewpoints or interactions. Generally the [[Key Worker]] will proceed in the following way (this is really a restatement of what we call the "[[Mentalizing Loop]]":
!!!Noticing
The KW punctuates a particular sequence of the family or individual's interaction/process in the session
>"I notice that X happens..."
This is a version of the [[Therapist's use of Self]] - deliberately referring MY experience, without assuming that my perspective is the "right" viewpoint, but nonetheless, highlighting it as something that is new and un-contestable (if this is //my// experience, then this is what it is! - whether or not it is 'accurate', or 'equivalent' to the experiences of others.)
!!!Checking
The [[Key Worker]] then questions his perception
>//"I am not sure that you would see it the same way...perhaps I am wrong to see it that way?..."//
!!!Correcting
The [[Key Worker]] takes the young person's or family's feedback into account and might then asks (each/that) person how //they// see that particular interaction
>//"What do you make of this...how do you see it?"//
!!!Naming
Once different family members have themselves identified a particular interactional sequence and given their own "frame" to it, the KW will use a variety of different challenging techniques:
!(a) Unbalancing
A technique used to deliberately disequilibrate the family organization, by temporarily joining and supporting one individual at the (apparent) "expense" of another, by enhancing her view, commiserating with her predicament etc.
//"I notice that every time you talk your husband stops you or says things that I think may put you down. Perhaps I'm wrong. Is that the way you see it? Is that the way you want it? So, if you don't - how is it that you allow your husband to put you down all the time? What would happen if you stopped him next time that happened?" //
//"How did you get your mother to answer that question?! Do you want your mother to answer for you? Your mother seems to know you inside out- is that a good thing? Who else does she know so well? How did you get your father to do this? If your father got it wrong - how would I know? Who trained/coached your father to be so careful/diplomatic/respectful? Is he always upset about upsetting the balance? What would be the dreadful thing that could happen if s/he was less careful?"//
!(b) Intensification
This is a technique, to be used carefully, and generally only after discussion with your SupervisoryStructures, which involves "turning the heat on" - //increasing the affective component of a transaction//, by increasing the time in which two or more people are involved in such a transaction (see enactment), or frequent repetition of the same message, or by physically or emotionally altering the distance between different family members.
//"I can see that you want to give up now...what would happen if you didn't, if you kept going, even if things become uncomfortable?"
"Do you think it might be useful to keep going -so if you think that, why don't you keep it going?"//
!(c) Testing boundaries
This is a way of challenging each individual's and the family's perceived lack or abundance of private space, their way of allowing differentness to emerge, their ability to be close, their mutual emotional responsiveness, their way of making decisions and use of hierarchies.
//"How is it that you allow his mother to dictate how you conduct your marriage? Is he married to his mother or to you?"//
!(d) Disrupting:
If a family member "specializes" in monologues or prolonged episodes of depressive venting, then the [[Key Worker]] may challenge this, initially by inviting the partner to join in:
//"How do you respond to this?" ”What is your view on this?"//
!...(e) and Apologising
See the video above. These challenging techniques are important, but the worker who holds [[The Therapist's Mentalizing Stance]] will be ready to acknowledge his or her //not-knowing// about quite what the correct balance between support and challenge is for this client, here, now... and to be transparent in acknowledging if they have got this wrong.
>//"It wasn't my intention to challenge you too hard, and I'm sorry I've upset you by doing this. What can we - __what should I?__ - learn from understanding how I came to believe that pushing you in that way was likely to be helpful?"//
<a class="tc-float-right">[img width="150" [cs.PNG]]</a>
!!!AMBIT Trainer
Charlie is an AMBIT Trainer based in Wandsworth, London.
<div style="clear:both;line-height:0px;"></div>
Checking is a key component of the [[Mentalizing Loop]] and one of a range of helpful [[Engagement techniques]]).
It is important to ''check'' whether the KW has understood what people are saying (e.g. "let me just check with you that I've got this right...") Thus repetition, in slightly changed language, offers confirmation of being understood, emphasises what has been said by repetition, and offers the opportunity to begin to frame the family's presentation somewhat differently (e.g. "he always deliberately tries to hurt me..." to "when it feels to you as if he is trying to hurt you deliberately ..."). Very often the change would be to add a mentalizing stance, i.e. to recognise that the behaviour of self and others is mediated by mental states.
!//Checking// is a powerful enactment
Checking is an enactment of the [[The Therapist's Mentalizing Stance]], modelling respectful curiosity, expressed tentatively, about mental states. It models the 'not-knowing' that comes with a belief that our mental states are interesting, useful to understand accurately, but also //opaque to// each other.
It is also a helpful example of one of many [[Engagement techniques]] described in this manual.
!//Checking// the Links
Accurate mentalizing increases the narrative coherence of an event, and reinforces the assumption that our understanding of behaviours is improved when they are perceived as being embedded within (and to some extent contingent upon) a wider context, including repetitive historical patterns. Linking an observed interaction, such as a momentary loss of mentalizing in a family, with previous accounts or reports of problems is an important beginning of the task to [[Generalize (and Consider Change)]].
!//Checking// as confirming the limits of our 'mind-reading'.
Checking understandings also powerfully affirms the mentalizing notion that //we do not have privileged access to the contents of each other's minds// (mentalizing is never the same as mind-reading). It is an enactment of the [[The Therapist's Mentalizing Stance]] which offers a //tentative// stance, that is inquisitive about other people's mental states.
!//Checking// as affirming of the value of mentalizing.
Implicit in our checking understandings and feelings is that //we affirm the importance of understanding other peoples' mental states.// This is an enactment of the [[The Therapist's Mentalizing Stance]] which constantly affirms the value and signficance of mentalizing.
!//Checking// at the end of the loop
By the end of a session it is important to conclude a therapeutic sequence by getting each family members to view what happened from a meta-perspective. This is, in effect [[Mentalizing the affect|Affective mentalization]].
This helps to evaluate what may have been a new and emotionally charged experience, giving them the opportunity to reflect together about what happened and the possible consequences:
>//“What did you make of what happened? Can you talk together about what this was like for each and all of you? Are there any conclusions you can draw from this?”//
''__Child Protection or more general SAFEGUARDING concerns "trump" all others__''. First, decide if you need to to take action (see "What to do if you are concerned" just below.) Then, underneath that you will see more guidance and information to help you think through and plan your responses in more detail.
!If you are concerned right now:
<html><div align="center"><iframe src="http://www.cscb.org.uk/downloads/policies_guidance/national/dfeschildabusesummary.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
If there are Child Protection Concerns then you must consider making a [[Child Protection Referral]], and you will want immediate contact with your SupervisoryStructures to discuss this.
!Background
See this external link to [[Working Together to Safeguard Children|https://www.education.gov.uk/publications/eOrderingDownload/00305-2010DOM-EN-v3.pdf]] - the UK government's guidance on this whole area, which particularly emphasises the need for good inter-agency practice (see [[Addressing Dis-integration]] which is one of the [[Core Features of AMBIT]]).
Child Protection relates to the notion of "[[Significant harm]]": if there is a risk of significant harm to any child (note, not just your own client/patient) then as a professional you are OBLIGATED to take action.
''__Child Protection concerns "trump" all others__''
!Before making a Child Protection Referral:
The [[Key Worker]] will make all reasonable attempts to discuss this with senior staff in the team, //''though not if the delay that this would cause could add to the immediate risk to the child''//.
!Local protocols
There will be Local Protocols about the mechanics of how to contact the local Child Protection Team, and these should be CUT and PASTED in here (see instructions on how to [[Edit]] if you are uncertain.)
Clearly this is an area that dominates one of the [[core AMBIT stance|Core Features of AMBIT]] elements, which is [[Managing Risk]] - often seen as the more active/interventionist/paternalistic "partner" of the other principle that [[Working with your CLIENT]] is guided by, [[Scaffolding existing relationships]]. Sometimes, in our enthusiasm to //engage// with the world and relationships that our clients live in - and to scaffold these in ways that are as ''strengths-focused'' as possible, we can find ourselves drawn unintentionally into ignoring, or decreasing the priority that should be given to the very real risks that exist. This, we argue, is at the heart of the many dilemmas that field working practitioners negotiate constantly in their work.
!For Local Adaptation:
See [[Child Protection]] for more info on this area (which will need adaptation by local teams to reflect local practices).
This page is for local teams to add details of local CP/Safeguarding services, including contact details.
!Supporting Other Models of Practice
If existing Safeguarding practices are already in place it is absolutely crucial that AMBIT is not seen, or used, as a "rival model" - this would be a serious mis-use of AMBIT, and seriously non-mentalizing. It would also directly contradict one of the [[Core Features of AMBIT]] which is the stance principle that workers must [[Respect local practice and expertise]].
!!!An example: Signs of Safety
For instance, an allied area of practice that is quite widely used in this area, and which we think AMBIT has a particularly good "fit" with, is the [[Signs of Safety]] program, which originated in Australia but has traveled internationally. Where this program is already implemented in an area it would be entirely in keeping with AMBIT that it should seek to [[scaffold the existing relationships|Scaffolding existing relationships]] that this prior training will have established ''AND NOT TO UNDERMINE THEM!'' In this case, the material under [[Managing Risk]] would be dominated by existing [[Signs of Safety]] practice and procedures and AMBIT would seek to enrich and augment the culture that this program helps to define.
!Online
http://www.ncbi.nlm.nih.gov/pubmed/18676591 - abstract
http://mentalizacion.com.ar/images/notas/Mentalization%20Ontogeny,%20Assessment,%20and%20Application%20.pdf
!Reference
Am J Psychiatry. 2008 Sep;165(9):1127-35. doi: 10.1176/appi.ajp.2008.07081360. Epub 2008 Aug 1.
Mentalization: ontogeny, assessment, and application in the treatment of borderline personality disorder.
Choi-Kain LW, Gunderson JG.
!Abstract
This article aims to review the development of the concept of mentalization, its applications in the understanding and treatment of borderline personality disorder, and the issue of its assessment. While conceptually derivative of theory of mind, Fonagy's concept of mentalization concerns more affectively and interpersonally complex understandings of oneself and others, reflecting abilities that enable an individual not only to navigate the social world effectively but also to develop an enriched, stable sense of self. The components of mentalization can be organized around self-/other-oriented, implicit/explicit, and cognitive/affective dimensions. Concepts of mindfulness, psychological mindedness, empathy, and affect consciousness are shown to partially overlap with mentalization within these three dimensions. Mentalization is assessed by the measure of reflective function, a scale to be used adjunctively on semistructured narrative interviews such as the Adult Attachment Interview. Its validity has not been fully tested, and its usage has been hampered by the time and expense it requires. Although the concept of mentalization is a useful heuristic that enables clinicians to adopt a coherent treatment approach, it may be too broad and multifaceted to be operationalized as a marker for specific forms of psychopathology such as borderline personality disorder. Research elucidating the relationship between reflective function, overlapping concepts, and features of borderline psychopathology is needed
{{what to measure pic (2).jpg}}
!!How do we figure out which aspects of our work to measure?
When we are finding out about the impact of our work, it can be tricky to decide on exactly what to measure...
What individual workers and services choose to measure will depend on a number of factors, including: their client group, the overall goals of the service, the time frames they work within, the approach or model that the service uses.
!!!Below are three different areas of our work that we can measure to help us learn about the impact of what we do.
!!1. The experience that people have of using the service
What was it like to use the service? What worked well ? What could be different or improved...?
The purpose is that [[Service User Feedback]] has a direct impact on the way the service works. Client feedback allows continual adjustments to be made over time, making the service more acceptable and helpful to those who use it.
The Experience of Service Questionnaire (CHI-ESQ) is one frequently used measure to evaluate feedback on using a service. There are different versions available for different age-groups and parents. Access this via the [[CORC website|http://www.corc.uk.net/]] or directly [[here|http://www.corc.uk.net/resources/measures/]]
!!!Session Rating Scales
These allow workers to take direct feedback on how a session or meeting has gone. They are usually used after a session, breaking it down into areas such as 'how much did we talk about the important things?', 'How well did I listen to you?' The aim is to promote work on the therapeutic relationship and create opportunities to adapt the work based on 'in the moment' feedback.
You can find further explanation and information on the CORC website [[here|https://www.corc.uk.net/outcome-experience-measures/session-rating-scale/]]
!!2. Measuring progress or change in our clients
These measures are ways of tracking whether things are improving in the lives of the clients that we see.....
''But what does 'improving' actually mean ???''
Of course, what this means depends a great deal on the person, how they experience things, and on the context...
Recent research and client feedback tells us that clients' own perspectives on what is important to change should take a central place when we are evaluating the impact of our work (for more on this please see the [[AIM cards|AIM Cards]] and [[Goal Based Outcomes below|Goals-based outcome measures]]).
The following outcome measures are used for tracking whether things are changing for our clients.
Some measures do this by looking at ''overall functioning'' across multiple areas of life , whilst others focus on more ''specific symptoms'' or problems.
Some measures have versions which gather perspectives of different people (e.g. client, family, teachers version).
!!!Measures of overall functioning across a clients' life
*The [[AIM]]- The AMBIT Integrative Measure
This is a questionnaire completed by workers. It gives a detailed picture of a clients' overall functioning (a multi- domain assessment) measuring a 'holistic' picture of their life. The worker gives a rating from 0-4 on a number of areas, including a clients' mental health, social relationships, family relationships, education and work. It allows strengths to be identified as well as a focus on specific key problems.
The 'key problems' allows workers and clients to identify specific goals together that can form the basis of interventions.
There is a protocol for using the AIM currently under development. Find this here at[[ AMBIT Client Impact Project|AMBIT Client Impact Project (ACIP)]], which is a collaboration of teams working to establish a framework for outcome measurement across AMBIT influenced services.
*The [[AIM Cards|AIM Cards]] - These are an AMBIT tool used directly with clients to help build a relationship and develop a shared understanding of the clients' strengths and difficulties across their life. They link directly to the [[AIM]]. They can be used as a measure of change with clients and can form joint goals to guide the intervention work
* [[CGAS]] - the Clinical Global Assessment Scale (a worker rated scale where a single score is used to describe the overall level of client function)
*[[Global Assessment of Function (GAF)|Global Assessment of Function (GAF)]] (a worker rated scale measuring the degree to which mental health symptoms effect a clients' life)
*[[HoNOSCA]] - Health of the Nation Outcome Scales for Children and Adolescents (a worker and parent questionnaire to measure aspects of client functioning across their life)
!!!Measures of Specific Symptoms
*[[Beck Youth Inventories (BYI) |Beck Youth Inventories (BYI)]](a questionnaire for young people measuring a range of mental health symptoms)
*[[Beck Depression Inventory (BDI)|Beck Depression Inventory (BDI)]](questionnaire for adults measuring symptoms of depression)
* [[SDQ|Strengths and Difficulties Questionnaire (SDQ)]] - the Strengths and Difficulties Questionnaire (Young person, teacher and parent versions measuring mental health symptoms)
* [[Clinical Global Impression (CGI)]] (a worker rated scale for adults and children measuring severity of symptoms and change in these)
* [[YPOR - Drug and Alcohol Outcomes]] - The Treatment Outcome Profile (a brief interview and rating scale for workers to use with their clients)
!!!Measures of attachment
*[[IPPA-R (The Inventory of Parent and Peer Attachment—Revised)|IPPA-R (The Inventory of Parent and Peer Attachment—Revised)]] (a questionnaire for clients measuring the quality of relationships with parents/carers)
!!!Measures of Family Function
*[[SCORE 15 Family Functioning|Score 15 - Family functioning]] (a questionnaire for family members to complete measuring aspects of family relationships)
''For further information the
CORC (Child Outcomes Research Consortium - website ''[[here|http://www.corc.uk.net/]] has a very good overview of different measures that can be used to track aspects of client function/problems and family function. It also includes explanation around how to use the measures and their [[psychometric properties|Psychometrics and Psychometric Tests]].
[[Goal-Based Outcomes|Goals-based outcome measures]] These cover the way in which we set specific goals together with clients based on our clients' perspective of what is most significant to them e.g. 'what is most important for you to work on in life right now?' We use a scale to measure these together. The goals then guide what we do, and we refer back to them to track how we are doing in our journey towards them. The key is that they are simple, practical and meaningful for our client. The CORC website has a great explanation of what they are and how to use them [[CORC Goal Based Outcomes|https://www.corc.uk.net/outcome-experience-measures/goal-based-outcomes/#:~:targetText=Goal%20Based%20Outcomes,the%20beginning%20of%20an%20intervention.]]
!!3. Overall Service Goals
*These will be the specific priorities of the service. They will usually include the reason or rationale for the service being developed and commissioned in the first place.
For example:
//A team commissioned to support young people who are placed in foster care may be particularly interested in the number of foster placements which break down or are maintained over a given period as one way of evaluating their impact. Measuring this would allow them to evaluate the impact of their service on this area, by exploring changes over time //
*Measuring these kinds of service goals is often crucial for evaluating the impact of the service and highlighting the value of a service in relation to an identified need
*It means finding simple ways to record the specific information related to the service goal over time
''This video shows Dr Sarah Harman from Bexley CAMHS talking at an AMBIT conference about the use of outcome measures to evaluate the impact of her service in relation to reducing in-patient admissions''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ALvv0yLC68k" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></html>
*Please see here to learn about [[Measuring the Impact of AMBIT Training]] on your service
*If you would like to explore other outcome measures which are under development by AMBIT influenced teams please see [[AMBIT Measures under development|AMBIT Measures Under Development]]
!Identifying and Selecting the Common Elements of Evidence Based Interventions: A Distillation and Matching Model
Bruce F. Chorpita, Eric L. Daleiden, and John R.Weisz
Mental Health Services Research, Vol. 7, No. 1, March 2005 ( C 2005) DOI: 10.1007/s11020-005-1962-6
A model is proposed whereby the intervention literature can be empirically factored or distilled
to derive profiles from evidence-based approaches. The profiles can then be matched
to individual clients based on consideration of their target problems, as well as demographic
and contextual factors. Application of the model is illustrated by an analysis of the youth
treatment literature. Benefits of the model include its potential to facilitate improved understanding
of similarities and differences among treatments, to guide treatment selection and
matching to clients, to address gaps in the literature, and to point to possibilities for new
interventions based on the current research base.
<html><div align="center"><iframe src="http://www.childsteps.org/documents/ChorpitaDaledienWeiszDMM2005.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
The theory on which this technique is based is one of circular causality: there is an assumption that human behaviour can best be understood from a point of view that regards actions as both responses to other actions and the triggers for further actions.
While it is possible to describe behaviour so as to show a ''linear connection'' between cause and effect:
>//"She is ‘mad’ because this is the only way she can show her anger towards her parents"//
...a ''circular construction'' is less likely to lead to ideas of blame, and more likely to enable families to alter their interactions and belief systems:
>//"Regardless of who ‘first’ had the problem, even if it were possible to establish that, the whole family can be seen as caught in a circular loop whereby symptomatic behaviours lead to carers’ responses, such as high levels of criticism, that in turn reinforce those same symptoms, which in turn lead to more critical responses on the carers’ part, and so on..."//
!!How to do circular interviewing:
The practice of interviewing follows a circular (or spiralling) pattern, where the feedback to the KW's question will influence and shape the KW's next question, and so on.
This is a purposive and responsive interviewing style: ''Purposive''... because the KW is central as the primary asker of questions. Yet ''responsive'' to feedback and openings offered by the various family members.
In this way both KW and family together can construct a new understanding of the situation. Circular interviewing involves a ''particular interest in questions of difference'', since it is through the perception of difference that we construct new information, and different perceptions of self and others become possible.
There are a variety of questioning techniques which make it possible for KW and family to explore issues of difference and the definition of relationships, such as:
!!Comparison questions
//"Were you closer before or after he became psychotic?"//
!!Ranking questions
//Who would be most surprised if she stopped being low and withdrawn?" "...Who the second-most?" etc//
!!Triadic questions
One person is asked to comment on the relationship between the two others, e.g. //"When her father got ill, did your mother become closer to her father or more distant?"// The answer to questions such as these will stimulate further exploration, e.g. by asking another family members to comment on the answer of the first one, and then exploring differences or similarities in their perceptions of relationships and events etc.
By participating in such an interview the family members perceive themselves through the eyes of the other; not only may they hear other people's views differently, but also their own views, expressed in this context, may look different to them. The links between this style of questioning and [[Mentalization]] are obvious.
Thus for the KW and the family, their interest and curiosity about one another remains stimulated, and changed perceptions of actions or relationships may lead to new and different behaviours and relationships, as well as a re-examination of belief systems which had to date been held with firm conviction.
!!Hypothetical questions
A special sub-category of this style of questioning is known as hypothetical questions. These are particularly useful when individuals or couples are locked in a rigid stance of blaming about who is "at fault" or "ill" and who is not. In the face of such a stuck interactional pattern the KW can proceed via an "as-if" stance, which makes it possible to consider change in fantasy, even if it does not - yet - seem possible in reality.
These are a particular form of hypothetical questions, where couples are invited to project current relationship patterns and problems into the future, and consider the effects of such lack of change on their future lives:
//"So if you continue to argue in this way about James coming home late for the next week, do you see anything changing? ...What about for the next couple of months? for the next 2 years?..."//
!Aim of circular questioning
The effect of circular questioning is to invite the family's curiosity about the history, context and pattern of their unsatisfactory interactions, which includes any psychiatric disorder and associated symptoms. Just as the KW gains an understanding of how these interactions fit together to result in a relationship pattern which is stressful to the family, so the aim is to help the family members themselves see their situation differently, make new connections, and see new opportunities for change and flexibility.
Another effect of circular interviewing is to disrupt and perturb set patterns of thinking and action, functioning as an intensive but contained challenge to the family's previously held views. Thus while overtly it may seem less challenging than some more directive techniques (see under Challenging techniques), it tends to have similar effects, namely of altering set balances in relationships by interrupting habitual patterns.
We gratefully acknowledge funding from the [[City Bridge Trust|http://www.citybridgetrust.org.uk/CBT/]], that has funded AMBIT training and evaluation in [[Kids Company|http://www.kidsco.org.uk/]], and some of the early development of this TiddlyManual.
!Keep a diary date booked for each young person's next review.
!Who are they for, and when should they happen?
We recommend that any young person who is seen regularly for more than one month should have a review, between one and three months after starting treatment.
!Who attends?
*The young person and family should be invited, but they may choose not to be there.
*The Keyworker must be there
*Ideally an AMBIT colleague will accompany the keyworker, specifically to help model [[Thinking Together]] in the meeting.
*Other key parts of the care network as appropriate
!Why do Reviews?
*Take a 'long distance' view of the progression of a piece of work - what is working, what is not?
*Remind the network, especially the informal/family/social network, that the work of the team is time-limited.
*Check that what we are doing is consistent with the AMBIT approach
*Consider how a successful intervention might look:
>//"How would we know when the work we are doing together had achieved enough?"//
There may be a requirement to reduce unrealistic expectations. Mindfulness of the //effect// that such conversation may have on a young person is absolutely key in these settings, to avoid stirring up anxiety or other reactions:
>//"They are going to abandon me..."//
>//"They want rid of me, like everyone else..."//
>//"What, you think I'll stay THAT long with you? Think again!"//
!!Tasks and Agenda
#Introductions - does everybdoy know each other?
#Use [[Thinking Together]] to frame the meeting (start with [[Marking the Task]])
With the Young person, and any available network (family, professionals, etc), check the RiskAssessment, the [[Formulation and Treatment Aims]], and the [[Care Plan]] are still up to date and relevant:
#Record who is present and record apologies for those prevented.
#Summarise situation and progress
##Use the [[AMBIT Practice Audit Tool (APrAT)]] to assess whether we are on track in offering AMBIT.
#Current key problems (review the [[AIM]])
#Review the [[Care Plan]] - and if required make a new one via [[Make or View Client Notes]]
#Set a new date for the next review and record it above.
#Any other business.
!!Recording
Use [[Make or View Client Notes]] to record this clinical contact.
!!Introduction
This is a way of looking at the AMBIT wheel from the perspective of the client. It has not been field-tested. Feedback is very welcome to the AMBIT project at the [[Anna Freud National Centre for Children and Families]].
!!The Client’s Wheel: parallel processes
!!!A matched (segment-for-segment) version of the AMBIT Wheel
The client's version of the wheel is designed as a "mirror image" - to be stuck on the back of the worker's standard version of the [[AMBIT Wheel]] in order to create a double-sided wheel, in which each segment relates to a parallel process on the other side.
[img[ClientWheelDoubleSided]]
[img[ClientWheelsingle]]
The client’s version of the wheel simply emphasises the parallel processes that worker and client must be engaged in if help is to become helpful and sustainable. The two wheels can be printed in ‘mirror image’ on opposite sides of a single card, so that the paired and equivalent sections form ‘two sides of the same coin’.
!!Working with Help
* Before anything useful can occur, the client first needs to engage in a helping relationship (the __''Working with Help''__ quadrant parallels [[Working with your TEAM]] for the worker)
* Where the //worker’s// stance is directed at the formation of an [[individual keyworker relationship|Key Worker]]...
* ...in reciprocation, the //client’s// first "task" is __''Trusting Help''__. This goes to the heart of the theory of [[Epistemic Trust]], which if established in that worker, allows [[Engagement]].
* While the //worker// counteracts the risks associated with forming such intense keyworking relationships by placing equal emphasis on the requirement for a [[Keyworker well-connected to wider team]] (who help them to keep their balance in this work)...
*...so in turn, the //client// may hope to increase the extent to which they are __''Understanding Help''__. Being able to witness the [[helping relationships|Relationship to help]] (with colleagues) that are modelled by their [[key worker]] offers opportunities to understand the nature of the help that is on offer: for instance, understanding that their worker is not an omnipotent lone ranger, that there are responsible layers of supervision, that receiving help - as their worker obviously and explicitly does from their team-mates - is less a sign of weakness or failure, and more one of professionalism, adulthood or mastery.
!!Making help work
* The client's __''Making help work''__ quadrant parallels [[Working with your NETWORKS]] for the worker
* The //worker’s// efforts to ensure that efforts towards helping are directed at [[Working in multiple domains]] (individual, family, education/employment, peers, etc) are echoed by an invitation...
*...for the //client// to collaborate to ensure that the work is __''Covering all my needs''__: there is an emphasis on the expertise of the client here, in the sense that appropriate [[Assessment]] requires their help so that any help offered is actually helping with the things that matter.
* As a rich multi-domain and multi-modal package of interventions is developed, almost inevitably involving other workers and other agencies, the client witnesses the efforts of their //worker// in [[Taking Responsibility for integration]] wherever they have influence in these workstreams.
* In turn, the //client// witnesses and is ultimately invited to shares or take responsibility for the work of __''Balancing and organising help''__; managing the various forms of help that they are receiving, which will include making sense of ([[Mentalizing]]) the actions of the different players, and if necessary - helped by their worker - helping the different players to make sense of and accommodate each other’s roles.
!!Working with myself
*With the foundations for ‘help that is likely to be helpful’ in place, the client may now be better placed to take more responsibility for __''Working with my Self''__ (and the key relationships that sustain or undermine this), which parallels the worker's quadrant [[Working with your CLIENT]].
*Here, the effort of the //worker// to identify and work on [[Scaffolding existing relationships]] to allow for repair (starting with the client’s relationship to their own self, extending to family or carers, key friends and other workers) invites...
*...the //client// to consider in parallel what are the __''Relationships that matter''__ for them, and the kinds of work that repair and strengthening these might require.
*As they engage in that work, the //worker’s// counterbalancing focus on [[Managing Risk]] - sometimes involving more active interventions, aside from simply averting disasters, evokes a similar focus in...
*...the //client// who is invited to reflect on what is required to assure __''Basic Safety''__ in their life, recognising perhaps that once basic safety is assured, more creative thinking an energy can be directed towards questions of improving quality.
!!Learning what works
*There is a more future-facing focus in the bottom quadrant for the client, whose __''Learning what Works''__ parallels [[LEARNING at work]] for the worker and their team. Here, the task is to begin to distil not just the lessons of what has helped and why, but also the //‘how’// of learning itself - that fine balance between learning from one's own experience and learning from other evidence.
*Where the //worker// must [[Respect local practice and expertise]]...
*...the //client// is invited to [[reflect on|Mentalization]] what it means to be __''Learning from my experience''__ (many clients may swing between over-reliance on their instincts and under-confidence in their ability to really learn at all.)
*Where the //worker// must counterbalance respect for local practice and expertise with [[Respect for Evidence]]...
*...so the //client// is invited to reflect on how they might be experiencing the benefits of __''Learning from Others''__. If worker and client have been successful in building sufficient [[trust|Epistemic Trust]] in their [[helping relationship|Relationship to help]] then the worker might become (helpfully) positioned as part of the “other evidence” that a client comes to incorporate in their thinking and decision-making and there may be grounds for hope that a more lasting shift in the client’s [[Relationship to help]] might begin to take effect.
Whether a version of this ‘client’s wheel’ on the back of the standard AMBIT wheel will provide a helpful PsychoEducation field tool for workers struggling to help their clients make sense of the work remains to be seen. //If any workers are using a double-sided version of the wheel in the field to help provide a means of explaining the overarching model or framework for what they are trying to achieve//, the [[AMBIT programme]] at the [[Anna Freud National Centre for Children and Families]] would be keen to hear feedback!
!What is the CGI?
The Clinical Global Impression (CGI) measure was initially devised in 1976 (Guy, 1976) and has been extensively used to assess the outcomes for both adults and children. It has been particularly well used in pharmacological studies.
The major advantage of this measure is its face[[ validity|Psychometrics and Psychometric Tests]] and extreme simplicity. The measure consists of two scales which are rated by the worker.
!CGI-S - Severity:
!!at //Treatment Start//, at //3 months//, and at //Treatment End//
The ~CGI-S is a seven point scale of the severity of the clinical problem;
''1=Normal
2=Close to normal
3=Mild
4=Moderate
5=Quite severe
6=Severe
7=Very severe''
!CGI-I - Improvement:
!!at //Treatment Close//
The ~CGI-I is a seven point scale of the amount of improvement during or at the end of treatment.
''1=Very much improved
2=Much improved
3=Mildly improved
4=No improvement
5=Mildly worse
6=Moderately worse
7=Very much worse''
![[Psychometric properties|Psychometrics and Psychometric Tests]] of the CGI
The CGI is used in a huge number of studies, mainly drug trials. However, it is also used in treatment evaluation in adult and child psychiatry. The validity of the CGI was recently evaluated by on an adult series of 786 psychiatric in-patient admissions (patients aged from 16-91 years) for which the CGI was compared with HONOS, the MHQ and ~DASS-21 (Berk et al., 2008). The MHQ and the DASS are patient rated measures. The CGI-I correlated 0.71 with measures of change from these other standardised instruments. However, the limitations of such a simple scale have also been recognised (Beneke & Rasmus, 1992).
The CGI has been used in recent child mental health outcome studies on OCD (Coskun & Zoroglu, 2009), Depression (March, Entusah, Rynn, Albano, & Tourian, 2007), Anxiety (March et al., 2007)and ADHD (Schachar et al., 2008). These studies range from pre-school children through to adolescents.
!Use of CGI in AMBIT
For AMBIT, it is suggested that the ~CGI-S could be rated by clinicians at the beginning of treatment, at three months and then at discharge. The ~CGI-I could be rated at discharge.
!References:
Beneke, M. & Rasmus, W. (1992). //"Clinical Global Impressions" (ECDEU): Some critical comments.// Pharmacopsychiatry, 171-176.
Berk, M., Ng, F., Dodd, S., Callaly, T., Campbell, S., Bernardo, M. et al. (2008). //The validity of the CGI severity and improvement scales as measures of clinical effectiveness suitable for routine clinical use.// Journal of Evaluation in Clinical Practice, 979-983.
Coskun, M. & Zoroglu, S. (2009). //Efficacy and safety of fluoxetine in preschool children with obsessive-compulsive disorder.// Journal of Child and Adolescent Psychopharmacology, 297-300.
Guy, W. (1976). //ECDEU Assessment Manual for Psychopharmocology - Revised.// U.S. Department of Health, Education and Welfare, Public Health Service, Alcohol, Drug Abuse and Mental Health Administration, NIMH.
March, J. S., Entusah, A. R., Rynn, M., Albano, A. M., & Tourian, K. A. (2007). //A randomized controlled trial of venlafaxine ER versus placebo in pediatric social anxiety disorder.// Biological Psychiatry, 1149-1154.
Schachar, R., Ickowicz, A., Crosbie, J., Donnelly, G. A. E., Reiz, J. L., Miceli, P. C. et al. (2008). //Cognitive and behavioral effects of multilayer-release methylphenidate in the treatment of children with attention-deficit/hyperactivity disorder.// Journal of Child and Adolescent Psychopharmacology, 11-24.
This is a useful comparison programme for AMBIT in that it provides a bench mark for a number of key outcome measures for a population of young people who are able to access mainstream services and who have lower levels of difficulty.
This national report included outcomes using SQQ, goals and RCADS.
The parent rated total SDQ scores showed a decrease of 2.74 with average pre-scores of 17.86 (6.39) to 15.12 (7.06) for a sample of 994 cases. This had an effect size of 0.4.
The other measure used was the number of cases which reached reliable improvement criteria. For parent SDQ total scores this was 15%. For goals measures it was 72%.
!Application:
This might relate to a situation where the child was not thought about properly, but could not elicit a response from the parents that would have focused them to see the child’s feelings and thoughts as these were at the time.
!Activity:
The therapist suggests some ways of responding that the child may not have thought of during the moment. For example, the therapist might say:
"When your mom was talking about your room being messy, I saw you start to get upset. I wonder what might have happened if instead you…"
!Purpose:
The purpose is not to correct the experience but to encourage flexibility in the child’s behaviour repertoire in relation to this type of experience. This activity can also be used with parents in the absence of the child.
This refers to thoughts or beliefs (as opposed to feelings, or "[[Affect]]", or Behaviours.
Click on the tabs to reveal the content you need:
<<tabs "[[CB-Principles]] [[Cognitive Behavioural work - CheckLists]] [[CBT techniques]] [[CBT-Special Circumstances]]" "SampleTabOne" "$:/state/tab1">>
[[Cognitive Behavioural]] work is one of the specific interventions that are included within the integrated AMBIT model.
!Flexibility and Clinical Judgement
The detailed structure and contents of sessions is offered here as a guide; recommendations contained here should never be allowed to replace clinical acumen. The basic tasks for specific sessions should be covered as directed, but the therapist must feel able to move flexibly between different techniques and interventions //according to clinical need// - so that the detailed suggestions and examples set an overall ethos and 'style' rather than offering a mechanical and step by step manualization, sacrificing the flexibility required to maintain [[Engagement]].
#[_] Before starting: read through [[Getting started with CBT]]
#[_] Session 1
##[_] Assessment - this may supplement the [[Multi-Domain Assessment]] and focusses on the triadic relationship between [[Thinking]], [[Feeling]] and [[Behaviour]] (see [[CB-Principles]]).
##[_] Setting specific goals for the CBT focussed sessions.
##[_] [[PsychoEducation]] around the specific need to be addressed
#[_] Session 2: Collaborative formulation (linking thoughts, feelings and behaviour) and Planning of the therapy
#[_] Session 3: [[Problem solving]]
#[_] Session 4 - Final (total number of sessions varies): [[Life practice]]
#[_] Session Final: [[Reviewing change]]
The main theoretical basis of these approaches is in SocialCognitiveTheory.
Strongly held beliefs about Cannabis (//"It is harmless"// or //"Without it I am much more aggressive"//, etc) may take the form of [[Implicit Core Beliefs]] and threaten a young person's motivation or the application of planned change behaviours.
The [[Cognitive Behavioural]] approach is similar to [[Motivational Work]] in that direct confrontation is avoided ([[Roll with Resistance]]), but there is slightly more room for gentle challenge.
In keeping with the Cognitive therapist stance (see [[CognitiveBehavioural for SUD-Rx]]) the approach towards a particular cognition is:
!!Identify the cognitions:
Via a joint exploration of the young person's [[Thinking]] the client and therapist seek to uncover the [[Implicit Core Beliefs]] that underpin a young person's thinking and influence [[Feeling]] and [[Behaviour]].
!!Externalise the problem:
Consider a specific cognition (for instance //"Without drugs I am totally unlovable."//) as ''separate from the thinker''. Note this is dirently related to the ideas about [[Psychic equivalence]] from [[Mentalization]]-based approaches:
*//"What would an observer from a distance see as the effect on you when this particular thought comes into your mind?"//
*//"Would it seem to make it more or less likely that you would use cannabis in the hours after it had been in your mind?"//
!!Design experiments to test these (dysfunctional) ideas:
*//"How could we design a test to see if this thought is true all of the time, only some of the time, or none of the time?"//
*//"'TOTALLY' is a strong word - I mean if just one person still found you lovable then that wouldn't be TOTALLY, would it?"//
*//"Who might we ask, or what do we think the people closest to you would say, if we did ask them whether you are 'totally unlovable'?"//
!![[Weighing Pros and Cons]]
This is another version of a Cognitive approach to the notion that //"I don't want to change my cannabis habit."//
This tag collects particular cognitive behavioural techniques that are specifically useful in working with SubstanceUseDisorder such as Cannabis. You might also want to read about [[Cognitive Behavioural therapy|Cognitive Behavioural]] in general.
!The Cognitive Behavioural Therapist's Stance: a SHARED exploration
Cognitive Behavioural therapists attempt to work alongside clients, fostering a sense that they and the client are ''co-workers'' approaching the problem, rather like scientists inquiring into an area of research together; each brings areas of special expertise.
!Keeping engagement
The Practitioner has expertise in techniques, and from her previous experience in work with other clients. The young person has expertise about him or herself - it is helpful to stress this (//"You are the world expert on being you - more than I could ever hope to be!"//) as one of a range of other [[Engagement techniques]]. (See also [[Experts By Experience]].)
This is an ''externalisation of the problem/challenge'' - which helps the young person to avoid feeling stigmatised ([[Engagement]]). The challenge is for both practitioner and client to develop an understanding of the ''mechanism'' by which the problem arises: (//"Which thoughts/beliefs, and which feelings, tend to drive the use of Cannabis/other harmful behaviours?"//) Then, their task is to develop rational approaches to //modifying// those causative factors that have been identified. Cognitive Behavioural approaches are, in the best sense of the phrase, codified common sense.
!What techiques are there
See the related (tagged) content for a list of CBT techniques
Computers & Education 52 (2009) 141–146
!!Abstract
This paper reports on a failed experiment to use Wiki technology to support student engagement with
the subject matter of a third year undergraduate module. Using qualitative data, the findings reveal that
in an educational context, social technologies such as Wiki’s, are perceived differently compared with
ordinary personal use and this discourages student adoption. A series of insights are then offered which
help HE teachers understand the pitfalls of integrating social technologies in educational contexts.
!!A brief summary of the paper, and its relevance to AMBIT
This was an interesting paper that looked at a failed attempt to use a wiki with a student group to support their learning - and has some lessons that the use of a wiki format (as in [[TiddlyManual]]s) has relevance to AMBIT.
!!!Reflection No. 1
This suggests that it is not enough to build a wiki and expect people to use it - you have to work hard to HELP them use this new technology. We hope that the [[User Guide]] addresses this!
!!!Reflection No. 2:
It is necessary that a "course" that uses wikis to support it is specifically designed "from the bottom up" with the Wiki in mind, rather than the wiki being a sort of "add on" to an existing course/curriculum. It should be immediately apparent to participants what the educational benefits are to them from using the wiki. AMBIT has had wiki-[[Manualization]] as one of the [[Core Features of AMBIT]] from the beginning!
!!!Reflection No. 3:
The idea that use of a wiki is "fun" and might thus encourage use (akin to how people take up using, say, Facebook) is not necessarily true.
!!!Reflection No. 4:
Assuming that people will "buy in" to the altruistic elements of wiki use is again not a "given". Some element of "assessment" of wiki-based contributions might be more likely to encourage engagement and use of this technology (the stick rather than the carrot!) We wonder if the thought of other teams examining "our" team's contributions is off-putting - as though a team might feel "bashful" or criticised by peers in other services?
!!!Reflection No. 5:
Being clear about the limitations of what a wiki can or should be expected to do is important. Accepting that wikis do not suit every student's tastes is a sensible stance to adopt. This may be more directly relevant for wikis in which ALL students are //expected// to engage and add material to, rather than AMBIT's use of the wiki as a place for a whole team to record its own expertise, and its adaptations and modifications of the AMBIT core content.
!Collaboration as a process and an outcome: Consumer experiences of collaborating with nurses in care planning in an acute inpatient mental health unit
International Journal of Mental Health Nursing, 2018
Link to open publication: https://onlinelibrary.wiley.com/doi/full/10.1111/inm.12463
Rebecca Reid RN, BN, Gr.dip. MH Ng Phil Escott BA Sophie Isobel RN, BN, Gr.Dip. CAFH, CAMH, Research methods
First published:14 April 2018 https://doi.org/10.1111/inm.12463
Mental states are opaque and being curious about them is a natural tendency for most people.
The stance of curiosity, as described by Cecchin (1989), implies the mentalization of relational issues. It aims to create continuously new perspectives of the family’s interactions, thereby widening and changing the field of vision.
This stance has much in common with the approach used by Lieutenant Colombo, as portrayed by the actor Peter Falk in the American TV series of the same name. ''Colombo style curiosity means investigating observed or reported interactions in a seemingly naïve if not ‘stupid’ and rather slow way''.
The Colombo-inspired therapist frequently mentalizes aloud, ''entering the arena of safe uncertainty, sharing his hunches and observations as he investigates''. He attempts to get clarification and elaboration (usually whilst scratching his head):
>//“This may sound stupid, but can I just check this? Do you mind if I look around? I think I may be on a wild goose chase, but do you mind if I….?//
>//...Oh, one thing I almost forgot…to you, does it sound like a reasonable explanation? I don’t you want to get offended what I am going to say, but is it possible that you may have got that wrong? There are a couple of loose ends I need to tie up….Whatever happened to ... It makes you kind of wonder …it could be that... or could it be something else?"//
>//"I know this sounds ridiculous….there is one other thing…"//
>//"It occurs to me that… There is something I wanted to talk to you about..."//
In the video example below (with a young actor), note the attempts by the therapist to share their own ideas //as ideas or hypotheses, that may well be quite inaccurate//, and the [[Marking|Marked mirroring]] of what is //"just my thinking about this"// by using hand gestures (tapping one's own head):
<html><object width="640" height="360"><param name="movie" value="//www.youtube.com/v/vQod7sDLz8w?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/vQod7sDLz8w?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Here is Columbo himself - watch out for the fact that (of course!) Columbo actually "always got his man" - i.e. you could argue that he was in [[Psychic equivalence]] and //knew// what was in the bad guy's mind... which as curious therapists we should always studiously //avoid// doing!
<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/pZiv8vkxMac?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/pZiv8vkxMac?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
[img[https://lh4.googleusercontent.com/-GXquW5WiKv4/Ubjka8DjoiI/AAAAAAAAIb0/12uB8pacBZ8/w96-h102-no/ComicReliefLogo.jpg]]
We are extremely grateful for the generosity of Comic Relief and its supporters.
Our grant from Comic Relief is funding:
* Development work on this manual, which is a freely accessible [[Licensed]] opensource resource
* The development of more trainings in AMBIT, especially (though not exclusively) for non-statutory services, and with a particular emphasis on developing this manual as a training resource that can reduce training costs.
You can [[Open the comic relief website here|http://www.comicrelief.com/]] or see it below if you are online:
<html><div align="center"><iframe src="http://www.comicrelief.com/" frameborder="0" width="100%" height="600"></iframe></div></html>
* The AMBIT programme is not at this stage applying any active moderation of content in comments or what local teams choose to upload in their local versions. See [[Disclaimers, Security and Authorization (Licensing)]]
** We will review this position in the light of uptake and content
** Commenters are completely responsible for the content of their comments (respecting the rights of others, decency, truthfulness, etc)
** We invite anyone who thinks a comment (or any AMBIT content) is inappropriate or unhelpful to please contact the AMBIT program at ambit@annafreud.org and we will look at it as soon as possible.
** We reserve the right to remove any comments if they appear harmfully non-mentalizing!
* By default, conversations in this commenting feature can only be added to //if you are part of a team using an AMBIT manual with editing rights, and are logged in.//
** Misuse of the commenting feature might result in editing privileges being removed
** ''Others'' who may not be active members of AMBIT-influenced teams, but who are interested to have access to commenting in order to help us develop and improve the content here (including young people/[[Experts By Experience]] with lived experience of using services that could help us improve) please do contact us at ambit@annafreud.org to talk about this.
We understand that as a Commissioner you will be working to national guidelines and objective. This page lays out important aspects of AMBIT that you might need to know prior to commissioning training for your service.
!!What is AMBIT?
AMBIT is a whole-team approach designed for services who work with clients presenting with multiple and complex problems. It is based around the core theory and practices of [[Mentalization]].
AMBIT supports teams to develop systems of care adapted to their own context, applying mentalization as the guiding framework across four areas of practice:
* face to face work with clients
* between team-members
* across networks
* in fostering a team culture of learning
AMBIT builds a [[Community of Practice]] which, above all, aims to continue to learn, develop and share more effective, acceptable and sustainable ways of working.
!! What types of problems does AMBIT address?
Below Dr Dickon Bevington provides a brief introduction to the types of difficulties that an AMBIT approach aims to address.
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/g2bk7sSKD-c" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html></center>
!!What is the evidence base?
This is a very key question as the need for evidenced based practice is a key principle of the AMBIT approach (see [[Respect for Evidence]]).
[[Is AMBIT evidence based?]] outlines a number of key questions for the AMBIT approach and provides some brief starting points as to how each question needs to be addressed.
Mentalization, one of the core feature of AMBIT, has a substantial theoretical and empirical base with extensive studies of the association of mentalization to attachment theory and to parent-child interaction studies. This may seem unremarkable but it is not always the case that key therapeutic concepts are grounded in developmental science. For example, the idea of a 'core belief' in CBT arises from adult theory of CBT in which the developmental basis of such types of cognition remains unknown.
The basic AMBIT training has been successfully delivered to over one hundred teams in the U.K., Ireland, Europe, North America and Australia. Feedback from the training experience is generally extremely positive with high ratings for relevance to work experience and usefulness of ideas to practice. This feedback has been summarised in [[Feedback on AMBIT Training]].
Some of the teams who have been trained in AMBIT clearly adopt a number of the components of the model in their work as a team.
In November 2014, AMBIT Leads were asked to respond to a three minute AMBIT Follow up survey. The survey aimed to find out which parts of the AMBIT wheel teams are finding helpful, and which AMBIT words and phrases have been adopted by each team (a simple 'proxy indicator' for culture shift across a team, we felt). According to the survey results 87% felt that an outside observer would have observed a small or significant positive change in their team since the training.
It is clear that the degree of adoption of the approach varies between teams. In our view, this is part of a need for local adaptation of the model to local client groups and local service ecologies.
It is important to say that NOT all of AMBIT (because there isn't a single "thing" called AMBIT, amongst other reasons) is "Evidence-based" but we encourage AMBIT-influenced teams always to be "Evidence-oriented".
* CASUS Data
* AIM project
* AMASS Data
!!How can we measure the impact of AMBIT on the service?
Through the initial engagement call and consultation day, we would encourage commissioners to be a present as possible, ensuring that any aspects of the work that the service is currently measuring is used as part of the training. We would ask commisionners to explicitly share with us their ideas about where they would like to see change in their service.
''Examples of changes:''
* Waiting times
* No. of YP being assessed
* Re referrals
* Where referrals are coming from
* (Review national criteria that services are working to)
* Transformation plans- child in mind
*''Staff retention''- Social care and NHS
What does the training do- anecdotally we know that it improves working environment, team functioning and contact with hard to reach individuals.
We have developed a number of key AMBIT [[measures|Outcomes measures]] which can be used to measure a teams fidelity to the model.
The documents below outline how AMBIT relates to key policy documents in the 3 main areas of:
<<link-doc "Healthcare" "https://drive.google.com/drive/folders/1iHZX_U9yDXgECjuo1lQHPpg6_Yl84rn6?usp=sharing">>
<<link-doc "Youth Justice" "https://drive.google.com/drive/folders/1iHZX_U9yDXgECjuo1lQHPpg6_Yl84rn6?usp=sharing">>
<<link-doc "Education" "https://drive.google.com/drive/folders/1iHZX_U9yDXgECjuo1lQHPpg6_Yl84rn6?usp=sharing">>
----
See [[AMBIT FAQS|AMBIT FAQs]]
----
AMBIT is powerfully influenced by ideas of community, informed by SystemsTheory, and by the fact that [[Mentalization]] is just as dependent upon the mentalizer's //access to trusted others// as it is upon any kind of "inner strength".
In one sense an AMBIT-influenced intervention is really about using the [[Community of Practice]] and the well-connected [[Team around the Worker]] to support the development of stronger, more supportive community relationships around the client; these are likely to be around much longer, and possibly to be much more influential upon our clients than we as workers are.
!!''The Community around the worker''
* See [[Keyworker well-connected to wider team]]
* See [[Community of Practice]]
* See [[AMBIT programme]]
!!''The Community around the client''
* See [[Working with the Social Ecology]]
* See [[Scaffolding existing relationships]]
One important principle in the Keyworker's integrative work is to link the client family with resources in the community, either building on what is already there, or creating new relationships. The community is multi-layered, but an important element of it is the group of [[Experts By Experience]] and their families, who are able to contribute in unique ways to supporting the young person and family during and after their time of acute crisis.
They, like the KW, have the experience of having to integrate the different aspects of the intervention, and are experts both in their own past difficulties and in how the intervention could be helpful in pulling together better support for the YP currently in severe difficulties. The past users and their families will be involved at both the level of practical mentoring and advising of the young person and the family, and at the level of participating in planning and managing the service.
<center>{{Community of practice pic.jpg}}</center>
!!Developing and sharing learning within a community of practice
The “evidence-base” (e.g. core content of this manual) tends to develop slowly over time. However, the innovation, development and learning within local practice-based evidence can move along at a much quicker pace (as the hares and tortoise picture above tries to highlight !)
This is a core idea underpinning the AMBIT community of practice- to learn, develop and share local expertise.
!!''What is a community of practice ?''
This is a way of describing how groups of practitioners (from many, even any, fields) can function in collaborative ways - to compare and share ways of working so as to sustain and grow knowledge about "what works, for which situations".
AMBIT and the [[TiddlyManual]]s that support it are significantly influenced by this simple idea, that ''practitioners like to get better at what they are doing, and, given the chance, they like to share their expertise with other practitioners''.
''This is why every team trained in AMBIT gets its own local version of the AMBIT manual which it is encouraged to use as a 'practice scrapbook' to document and share its present expertise and ongoing learning about "//what works for whom, __here__//."''
!!!Video
* See some video: [[Building a Community of Practice - Dickon Bevington]].
* See videos produced BY the AMBIT ~CoP at [[AMBIT Conference presentations]] as examples of sharing learning within the AMBIT community of Practice.
!!''Membership of the AMBIT ~CoP''
__ __The [[AMBIT community of practice - Teams]]____ lists all the teams who have received [[AMBIT training|Information About AMBIT Training]].
The [[TiddlyManual]]s that support AMBIT, function as “windows” upon the work of other teams, encouraging ''//curiosity//'' and the ''//sharing of emerging expertise//'' between services that, although geographically remote, frequently address similar clinical dilemmas.
This aspect of [[Manualization]] builds on themes opened by ''Lave and Wenger (1991)'' in their landmark study of ''apprenticeship'' that has led to the theory of ‘Communities of Practice’ - the establishment of which is an explicit goal for AMBIT.
If you would like to read more about Communities of Practice, theory and how they apply to AMBIT please see
<<tag [[Extended learning]]>>
!What's the AMBIT Community writing about?
!!!Seeing new content from the community
We have been developing a ''compare and share'' function within the wiki manuals. This will allow teams to browse the topics that other teams have been manualising about, and, if they find relevant practice for their context, copy these pages into their own manuals, allowing them to continue to adapt them further and leaving a mark on the originators page to say that it has been cloned (a badge of honour, we'd say.)
''For now:''
You can see titles of new pages listed under the ''Recent Changes'' tab on the right hand navigation/content bar:
{{RecentChangesPic.jpg}}
Toggle between ''All'' (changes and additions gathered from across the whole community of practice) and ''Local'' (changes to [[Your Manual]] made by your own team's editing efforts.)
You can also click the ''Recent changes'' button on the signposting site (https://manuals.annafreud.org) which lists out all the edits/changes made in all manuals from both the AMBIT program and other teams who use the manuals across the AFNCCF - which gives a flavour of the levels of activity that these wikis stimulate.
!!!Contact us for help connecting:
Feel free to email us and we can direct you to teams who are manualizing and who may be of a similar service. mailto:ambit@annafreud.org
!!What is a Community of Practice?
The phrase ''"Community of Practice"'' is most closely associated with the anthropologist, ''Jean Lave, and Etienne Wenger'' whose work began in the field of Artificial Intelligence. They described communities of practice following an examination of the learning processes that they observed from a close investigation of //''Apprenticeships''//.
See this [[external link|http://en.wikipedia.org/wiki/Community_of_practice]] to the wikipedia page about Communities of Practice for a good starting point for study if you are interested, though we have summarised the subject below.
!!''Features of a Community of Practice''
Quoting from Wenger:
* ''__Mutual Engagement:__''
Firstly, through participation in the community, members establish norms and build collaborative relationships; this is termed mutual engagement. These relationships are the ties that bind the members of the community together as a social entity.
* ''__Joint Enterprise:__''
Secondly, through their interactions, they create a shared understanding of what binds them together; this is termed the joint enterprise. The joint enterprise is (re)negotiated by its members and is sometimes referred to as the 'domain' of the community.
* ''__Shared Repertoire:__''
Finally, as part of its practice, the community produces a set of communal resources, which is termed their shared repertoire; this is used in the pursuit of their joint enterprise and can include both literal and symbolic meanings.
Other ways of describing a Community of Practice are that they ''share the following features'':
* ''__Domain:__''
A domain of knowledge creates common ground, inspires members to participate, guides their learning and gives meaning to their actions.
* ''__Community__''
The notion of a community that creates the social fabric for that learning. A strong community fosters interactions and encourages a willingness to share ideas.
* ''__Practice__''
While the domain provides the general area of interest for the community, the practice is the specific focus around which the community develops, shares and maintains its core of knowledge.
We believe that [[Mentalization]] theory supports, and to some extent explains, the phenomenon whereby ''much apprenticed learning does not come from “top down” expert authorities, but from //apprentice peers//'' who, we suggest, are more able than lofty experts [[implicitly|Implicit mentalization]] to mentalize the hopeful learner’s particular dilemma ("why it is hard to understand or cope with //this, right here, right now//").
Being mentalized accurately by another person triggers the [[Epistemic Trust]] that Csibra and Gergely (2006) have shown facilitates and frequently precedes effective social learning from that person.
In seeking to provide a structured environment to host such relationships, AMBIT aims to capitalise on the learning potential that Communities of Practice offer.
Recently the development of the //world wide web//, and the ease with which expertise can be shared through text, video, etc, via this medium, has pushed these ideas further forwards. The online Wiki is one way in which communities of practice may collaborate to share and build knowledge.
<<communityOfPractice manuals:core>>
The co-occurrence of more more than one clinical problem - for instance SubstanceUseDisorder alongside other mental health problems such as [[Post Traumatic Stress]], [[Depression]] or emerging [[Psychosis]].
This is often a key part of the [[Complexity]] of the [[Hard to reach]] cases AMBIT is designed to work with, and there are important [[Developmental Considerations]] that need to be taken into account which justify investing maximum effort in improving these young lives.
At present, this function does not work the way it used to! There are plans to include a 'community' tab under the 'Recent Changes' tab below the search engine.
For now, you can access [[other teams manuals |Other team's AMBIT manuals]]using the signposting site (click '>More' under AMBIT to see a drop down list of all the teams manuals).
Ratings of how important each AMBIT competency is, and how much each competency is used were collected by 41 attendees of the most recent AMBIT Conference, 23rd May 2014. The results were worked out by collating all of these ratings-it is these scores that are plotted on the scattergraph.
A strong positive association can be seen between the two variables plotted on the scattergraph i.e the importance of the competency to the worker, and the amount the competence is used. This is to be expected; the more important a competency is to a worker, the more it is used.
The competencies of most interest to us are the ones that are rated as important, but relatively un-used (these would be the ones that are plotted in the bottom right of the graph). The reason these are of the most interest is that these are the ones that workers feel they should use, but aren’t using-perhaps because they are lacking the training or tools to utilise this competency. Competency 7 and 17 are the closest to being in the bottom right quadrant: 7. Ability to scaffold existing relationships to provide help, 17. Ability to develop a shared care plan with the young person. Therefore these are the competencies that we will be focusing on developing tools for, to help workers use these competencies more.
<<image [[graph3]] width:842 height:596>>
<<image [[graph4]] width:842 height:596>>
These are just one category of the <<tag [[Features of UNsuccessful Mentalizing]]>>
These can manifest themselves in a general lack of attention to the thoughts, feelings and wishes others, or interpreting one’s own behaviour in terms of the influence of situational or physical constraints rather than feelings and thoughts in oneself or in others around one. This often happens when family conversations invariably focus on concrete concerns, such as who did what and explanations of behaviour in terms of physical circumstances and influences (e.g. we always argue when we travel long distances in the car).
The typical features of concrete understanding or simplistic mentalization are:
!!Difficulty in emotion recognition
Not understanding positive or negative emotions
!!Confusing a feeling with a thought
E.g. because I feel sad, the world is a miserable place (aim to be able to see that you can feel sad without drawing conclusions from it). This confusion may be because feelings are leading to automatic thoughts outside awareness, or because the child notices how he feels and decides that this is what it must mean
!!Understanding behaviour in ‘concrete’ terms
E.g. in terms of external circumstances or other behaviours rather than in terms of internal states; e had a fight because it was hot rather than being able to recognize that one was irritable and had difficulty in hearing the other person.
!!Difficulty in observing one’s own thoughts and feelings
...and in identifying changes in them
!!Not recognizing the impact of one’s thoughts, feelings and actions on others
Manifested as insensitivityy to each other's emotional needs.
!!Not being able to see how one thing has led to another
E.g. a thought led to a feeling which led to an action, and a reaction from someone else
!!Over-generalizing from mental states
E.g. feeling that because one upsetting thing happened, everything has gone wrong
!!Not being able to be flexible
E.g. difficulty in playing with different ways of thinking about situations
!!Feeling that somebody else’s thoughts are dangerous
E.g. that if someone disagrees that means that your own point of view is obliterated or that they hate you etc
!!Struggling to relate thoughts to reality
E.g. The individual in this condition tends to end up going round in unproductive circles and only becomes more anxious
!!Acting without thinking, or avoidance of thinking.
In this category a parent-child relationship may be described as simplistic or concrete if the parent reacts to behaviour without being aware of the child’s feelings or wishes, which are motivating the behaviour. There is an absence of mentalizing of the child. The parent may thus be angry, over-reactive, blaming, and prescriptive. The child’s mental states are obscured and treated as unimportant. This may also happen when there is an identified problem, e.g. ADHD or a physical condition, and either the condition is ignored or every behaviour is explained on the bases of it. The child may be treated as an object, a machine, an extension of the parent’s identity, without curiosity about or recognition of him/her as an individual. Another way this kind of situation can arise is when there is a passive resignation or withdrawal of awareness from the child and non-thinking over a period of time on the part of the parent. Thus as in the previous case, his/her approach has become unthinking, concrete and behavioural. The parent may be depressed or overwhelmed and too tired to focus on the child unless situations have escalated when the parent falls back on a stock response, without trying to understand the specifics. The child recognises that only amplified behaviour will get through the parent’s preoccupation or distraction, so that the situation begins already in an exaggerated and distorted way.
There is [[NICE Guidance on Parent training for conduct disorder]].
There is a helpful leaflet produced by the Royal College of Psychiatrists, which you can open in a separate browser window [[Here|http://www.rcpsych.ac.uk/mentalhealthinfo/youthinfo/underyourwing/disorders/behaviouralproblems.aspx]] or see below:
<html><div align="center"><iframe src="http://www.rcpsych.ac.uk/mentalhealthinfo/youthinfo/underyourwing/disorders/behaviouralproblems.aspx" frameborder="0" width="100%" height="600"></iframe></div></html>
!Material in the manual:
The following approaches to intervention are key:
* Family Work - with an emphasis on helping parents/carers to uphold BOUNDARIES in firm but benign, and crucially //predictable// ways.
* MultiFamilyWork
* [[Working with the Professional Network]]
It is important to be clear ''EARLY in your work'' with the young person about what can be kept confidential and what cannot.
Most workers in Child and Adolescent Mental Health will be used to explaining the limits of their confidentiality to clients early on in their therapeutic relationship. It is important for a therapist, at the earliest appropriate opportunity, to offer a prepared explanation of:
#The //meaning// of confidentiality in a therapeutic relationship
#The //limits// of confidentiality in this relationship.
!!!Child Protection
The therapist's duty of confidentiality is always "trumped" by [[Child Protection]] concerns if these imply that a //failure// to act upon this information would mean that significant harm is likely to occur.
!!!Serious crime
Other examples where confidentiality is limited would be hearing about a serious crime such as murder, etc. For example, simple theft would be unlikely to fulfil this criterion. The keyworker always reserves the right to consult with colleagues within the team (and should be explicit about this in discussing this with their patient) about whether //breaking// confidence is the most appropriate course of action or not.)
!Mentalization and Confidentiality
Mentalizing interventions often involve an explicit effort to reduce the "opacity" of one's own mind - "thinking out loud".
It is important to try to explain this process:
*The nature of one's CURIOSITY about the young person's experience
>//"It is important for me to try really hard to get an ACCURATE picture in my mind of what it is like to be in your shoes - the one thing I know is that I definitely CAN'T do mind-reading, so I have to use kind of nosey questions, but nosey in a good way, I hope!"//t
*Its PURPOSE of this curiosity
>//"...that way there is a better chance that I can help find ways of really being helpful to you - rather than just play-acting at being helpful..."//
*Explain EARLY ON the limits to what my curiosity can cover (i.e. this is not a PRURIENT process.)
>//"of course there are ''limits'' to what I am prepared to be curious about. It is really important that you feel that some things CAN be private for you; so if you feel I am ever asking about things you don't want to talk about, I would like to have a really clear way of finding that out ASAP - how could you let me know that?..."//
IN DRAFT comments via our twitter feed please! {{{@AFCambit}}}
!!Introduction
Connecting Conversations are what we use the [[Dis-integration grid]] to identify and prioritise, and are one of the key ways of [[Addressing Dis-integration]], one of the [[Core Features of AMBIT]].
Here we explain why they are worth pursuing, and how to go about that.
!!What's the Problem? (What's the point of connecting conversations?)
When two parts of a network are ''Dis-integrated'' they could be represented on [[The AMBIT Pro-Gram]] as being far apart, and poorly [[mentalizing|Mentalization]] of each other. Another way of explaining this refers back to the [[Dis-integration grid]], in that there is misalignment between:
* the EXPLANATIONS ("''What's the problem'' I am trying to help with?")
* the INTERVENTIONS ("''What to do'' about these problems that might help?")
* the SYSTEMIC RESPONSIBILITIES ("''Who should be doing what'' to support the changes that we think will help?")
The ''__impact on a client__'' of this is that:
* they may perceive these people as being unhelpfully in conflict
* they feel that in fulfilling the wishes of //one// of them, they will inevitably upset the //other//.
* the interventions are poorly coordinated, and ineffective, so that the honest intentions to be helpful in both of these individuals (this could apply to two workers, as much as it could apply to two parents) are undermined.
The point of a connecting conversation is to bring these two (or more) elements in a network into closer alignment, so that even though it may not be possible to "convert" either to each other's viewpoint, there is more accurate mentalization of each other. In this way the dilemma becomes ''explicit'' rather than hidden, and the network as a whole can be invited to rearrange itself in ways that - //mindful of the overall intention to help the client// - at least reduces the most negative impacts.
!!Principles
* ''Dis-integration'' is inevitable and normal in any multi-agency or multi-professional system: it is the "natural resting state" of our working environment, and should not be seen as requiring professional shame or blame as a response. Mentalizing each other is harder in conditions of stress.
* Managing connecting conversations is not a mechanical process, but ''diplomacy''. Manners, respect, authenticity, humour, creativity... Connecting (and maintaining connection) is a process rather than a single event
* Connecting conversations require [[Mentalization]] to be active in order for them to work - which requires that //affect// should be addressed.
* Connecting conversations might be required around differences (dis-integration) over ''Explanations'', ''Interventions'' or ''Responsibilities'' (see [[Dis-integration grid]]) and being clear about what the misalignment is, and how differently these might need to be addressed is important.
* ''Take responsibility'' for your own state of mind in preparing for any connecting conversation.
* ''Take responsibility'' for facilitating the meeting so as to give people an experience that they have been thought about:
** //I'll organise a room"..."I'll call X or Y to arrange this"...//
** Arranging HOSPITALITY is part of the work of creating conditions in which mentalizing is more likely.
** This doesn't necessarily man investing a lot of time or money into providing "luxuries" for the other worker, but in "homemade offerings" that speak of an //investment in our relationship//
* ''Holding the Balance'': Connecting conversations are often in the territory of balancing the two core AMBIT stance principles of [[Scaffolding existing relationships]] and [[Managing Risk]], as well, more generally as Reflection and Action.
* No change is possible if the other people involved do not experience their own position as properly understood.
** We may be misunderstanding this situation as much as anyone else
** It is NOT about convincing other people to change.
** "The hardest thing to change is your own mind"
** Influence (your ambit) is ''granted by others'', rather than "won" - through accurately mentalizing the other, rather than "pulling rank".
!!Practice
2 questions:
>//"What don't I know about this situation that is leading me to think about it differently from her/him?"//
>//"What information do I have, __that I may not have communicated clearly enough__ in order to make better sense to people holding these different points of view?"//
!!EXAMPLES
There may be an escalator of interventions - there is certainly not one way to go about this:
* (i) ''A letter'' broadcasting my understanding about the young person's dilemma, circulated to the relevant parties.
* (ii) ''Direct call'' to another worker: //"Can you give me a hand with X or Y? I'm worried that thing could get worse if we can't find a way forwards..."//
* (iii) ''Visiting'' a worker, or inviting them to visit - empathy, mentalizing, measures to provide emotional containment/humour/nourishment (cup of tea, etc!)
* (iii) ''Conducting a group exercise'' with the relevant parties by co-creating [[The AMBIT Pro-Gram]] for that particular client. //"There are lots of us who are worried about this young person, and I wonder if it would be helpful if we tried to map out who is relating to him, and how these different relationships are working? How do we use what we have already got as effectively as possible?"//
* (iv) ''Coaching a worker'' about perspectives and ways to address differences with a third worker.
Naming the worker's (who is trying to intervene to address disintegration) dilemma: "I can't tell these people what to do"
!!!Marking the task:
* Clarify in your own mind who are you working towards connecting with whom, and in relation to what? This should be a purposeful, planned piece of work.
* Ideally a connecting conversation would conclude with efforts on the part of both "positions" to understand ([[mentalize|Mentalization]]) the other, to understand the impact of the dis-integration upon the client, and to convey willingness to change one's own state of mind and position to better serve the needs of the client.
* Whether or not the dis-integrated perspectives or interventions are changed, the first effort is towards improving the way each one understands the other.
* Ideally we are inviting people in different positions to ask themselves:
>//"What don't I know about this situation that is leading me to think about it differently from her/him?"//
>//"What information do I have, __that I may not have communicated clearly enough__ in order to make better sense to people holding these different points of view?"//
Remember that to mentalize someone else does not mean the same thing as to agree with everything they say or do - see [[Individual Differences and Disagreements]] for a bit more detail on this.
-----
!!What to do? How to go about connecting other parts of a network?
!!!1. Define what is your ambit:
* ''Are you clear enough about the TASK'' you are trying to achieve in thinking about creating a specific connecting conversation?
* ''Remember your limits:'' you may be working on the basis of some quite tentative attempts to mentalize other workers, or agencies, and this is not the same as being right!
* ''Do you have the authority'' to "demand" a meeting between two parts of the network (//"See me in my office!"//)? - In many cases this is not the case, and a worker will be addressing other parts of the network that have no duty or obligation to listen to what they are saying. You can still look for opportunities to ''influence'', however.
* ''Other ways of exerting influence:'' Without a formal (managerial, supervisory) responsibility, there are usually still ways that you can helpfully influence other relationships.
!!!2. Be strategic:
* [[Think together|Thinking Together]] with other members of your team, or managers: this is vital to ensure that your proposed approach is not likely to disturb other negotiations, processes that you may be unaware of, and "makes sense" to others.
* ''Use your team:'' Consider the possibility that there may be another person in your team who would be better placed to take this on. However, your own "strength" is in the fact that you are engaged and close the the client that everyone is trying to help.
* ''Keep your eye on the overarching TASK:'' the purpose is not //"get worker A back into line"// but to help create a network that is experienced as helpful and effective by your client!
!!!3. Start by ''sharing your own perspective and dilemma''
* A helpful starting point is to address this with each of the people involved, //individually//, and ''try "asking for help", rather than telling them what's required''.
* This might be via a phone call or face to face meeting, but in some cases via email or letter (if there is a high likelihood of misunderstanding, then speaking about these issues tends to be more successful).
* A first strategy might be to try to explain to the key parties what is YOUR OWN dilemma as a worker trying to help. Invite them to help you make sense of what you have observed/experienced:
>//"Can you help me find the best way to support your work without undermining another worker in Team X, because I am keen to help address a whole range of different needs in our client, and at present it feels as though if I support you, I am actually at risk of undermining worker Z."//
* Remember that [[Features of Successful Mentalizing]] include tentativeness, acceptance of the limits of one's own knowing ("Minds are Opaque"), self-deprecating humour...
!!!4. Try to mentalize their dilemma
* You are trying to create [[Epistemic Trust]] through accurately mentalizing their predicament and response - without this there is limited scope for your own ideas to be perceived as interesting or worth trying out.
* Start from an assumption that they are behaving in the best way possible in an impossible situation, consider the different pressures and demands that they may be subject to (targets, managerial direction, client demands, exhaustion and overwhelm, etc).
!!!5. Use a mentalized account of ''the client's perspective''
* Keep to the primary task by talking about your perception of the impact of the ''Dis-integration'' upon the client.
!!!6. Apply the same principles of Active Planning
* See [[Active Planning]]
This is the stage where a client becomes able to consider the risks and benefits of a particular course of behaviour. In this stage [[Weighing Pros and Cons]] is a useful exercise from [[CognitiveBehavioural for SUD-Rx]].
Remember the principle of [[Adapt your Discourse]] so as to avoid discussions that do not address the client's present state of mind.
A contingency is a course of action that flows from, or is directed/influenced by, a particular set of events or circumstances.
!In [[Attachment theory]]
A sensitive and attuned mother will ideally respond //contingently// to her child - responding in accordance to the child's //state of mind// and //needs// at that particular time. Contingency in this sense refers to the //"fit"// between the child's needs and wishes and what the mother offers.
Even very young infants are seen to seek out and 'prefer' evidence of contingency in their environment, whereas [[Non-contingent]] responses to their behaviour are distressing or aversive.
!In [[Crisis Contingency Planning]]
Contingencies refer to the plans that are specifically drawn up to respond appropriately to different potential outcomes.
!In [[Cognitive Behavioural]] theory
In therapy, we may predict certain //contingencies// (i.e. predictable problems, or hoped-for target behaviours/skills) and we can agree the most helpful way to respond to these in advance:
>//"If you can demonstrate you are drug free next week, then you can..."//
''Positive'' contingencies act as rewards - helping in the Positive [[Reinforcement]] of desired behaviours.
''Negative'' contingencies might be outcomes that deliberately try to remove the Positive [[Reinforcement]] of undesired behaviours, and replace these with less pleasant experiences. (This is slightly confusing terminology, as "negative contingencies" are "not pleasant", whereas a ''Negative'' [[Reinforcement]] is actually the removal of something unpleasant - which is a positive relief!)
The evidence does not support //punishment// as an effective means of bringing about //lasting// change, but //removing the positive reinforcers of an undesired behaviour is an effective way of reducing it//. Negative contingencies (loss of privileges, reduced pocket money, etc, in direct relation to predetermined and negotiated boundaries) may help to shift behaviour in the early stages - though the counter-risk in this case is of provoking greater disharmony and conflict, and thus reducing the available support from [[Family Informal Network Members]].
Source: Peter Fuggle, AFNCCF
!!!''1. Materials produced by the AMBIT project team''
All pages in the manual should indicate the source of the material shown on that page.
The source of the majority of the pages are written by the AMBIT team.
This material has been uploaded on to the manual with permission from the staff member.
The authors name can be found by clicking the arrow down icon (top right hand corner of the tiddler) and then the 'i' icon (info).
This indicates that copyright for the use of this material has been granted.
!!!''2. Linking to materials freely available on the internet''
For materials freely available on the internet, linking them to the wiki, has few if any copyright implications and is very low risk.
We avoid linking to website content which is in itself obviously infringing (that is, it has obviously been uploaded without the permission of the copyright owner).
Where possible, we avoid “deep linking” which obscures the ownership/ branding of the site we are linking to. For example, rather than link straight into a PDF, we try to link to a preliminary page which makes the context clearer.
!!!''3. Reproducing material from the internet''
Reproducing the material itself either in full or substantial parts does pose a risk of breaching copyright.
If any of the material is already licensed by a Creative Commons licence or equivalent we are then able to reproduce this and comply to the terms of the specific licence. This is evident from the information on the website. Usually a Creative Commons licence has the following: "When reusing third party copyright material it is always important to credit the source and the author(s)".
In the absence of such licence terms, though, we try to obtain permission from the copyright owner unless we are able to rely upon one of the statutory exceptions to copyright.
When we seek permission, we request the copyright owner to let us know the wording they would prefer us to use in our acknowledgement. Typically that could be something like: “Copyright […...] All rights reserved. Reproduced here with permission”
!!!''4. Permission for others to use material in this guide''
This manual is freely available for use by others under a Creative Commons Licence
(see [[AMBIT Creative Commons licence|Licensed]])
This states that the material in this manual can be used by others as long as the source of this material is acknowledged and that it is not used on a commercial basis.
!!!''Useful contact for advice''
Chris Holland|Copyright Support Officer|UCL Library Services|Gower Street| London WC1E 6BT
T: 020354 95729|
!!''AMBIT Core Features ''
''These are:''
!!! The five key elements of ''AMBIT practice'' (inner ring and centre of the AMBIT wheel):
# [[Mentalization]]
# [[Working with your CLIENT]]
# [[Working with your TEAM]]
# [[Working with your NETWORKS]]
# [[LEARNING at work]]
!!!The eight elements (principles) of the ''AMBIT stance'' (outer ring of the AMBIT wheel)
# [[Individual Key Worker relationship|Theory behind the Individual key-worker relationship model]]- [[Key Worker]]
# [[Keyworker well-connected to wider team]]
# [[Working in multiple domains]]
# [[Taking Responsibility for integration]]
# [[Scaffolding existing relationships]]
# [[Managing Risk]]
# [[Respect local practice and expertise]]
# [[Respect for Evidence]]
The relationship between all these is illustrated by the [[AMBIT Wheel]]
!!''The AMBIT Wheel''
<center><<ambit-wheel size:490px>></center>
!!''Download as PDF''
You can download this diagram as a PDF [[here|AMBITWheel.pdf]] and can print it out.
''Please scroll down for videos explaining the Core features''
!!''AMBIT Basic Practice (inner 5 sections of wheel)''
These aspects are key areas of practice and service delivery for an AMBIT-influenced team: if they were missing or not held in some kind of balance, this would imply that what is being delivered is not AMBIT. The practice of [[Mentalization]] is at the centre of the model. This is like the '''load bearing axle''' or '''hub''' of the model, as it underpins practice in each of the 4 quadrants around it.
#[[Mentalization]]
#[[Working with your CLIENT]]
#[[Working with your TEAM]]
#[[Working with your NETWORKS]]
#[[LEARNING at work]]
In AMBIT we emphasise the importance of a balance of activity across these areas of basic practice. We stress that each are important. However, it is sometimes inevitable that workers, teams and services can lose sight of any of these areas, given the complexity and intensity within which AMBIT influenced teams often work. It is also difficult to keep all of these in mind at the same time! For this reason the AMBIT wheel acts as a way of supporting services to hold onto and develop these key areas of basic practice.
AMBIT is not a one-size-fits-all approach, it works to help teams adapt the model, ideas and tools within each area of basic practice, to fit their own contexts and client groups.
!!''AMBIT Basic Stance (outer ring of wheel)''
''8 elements of a basic stance:'' These define the core "stance" of an AMBIT practitioner in their work - the stance describes the "way of being-with", or approaching work within each area of basic practice.
The stance elements are arranged in pairs, with one pair fitting into an area of basic practice.
Each pair of stance elements highlights points that can easily be experienced by workers as contradictory. In other words, points whereby workers and teams can experience a kind of 'tension' or 'push-pull' which can need balancing.
These stance points can be seen as "grab-rails", a way of keeping or regaining balance. They aim to help keep an individual or team 'on track' - especially when the situation is stressful, risky, or simply uncertain.
At times of high anxiety or confusion it is easy to find that one element of the stance has come to dominate, sometimes at the cost of losing other principles that would help if re-activated. //At any time we can ask a colleague, or ourselves, ''"am I holding the basic stance?"''//
# [[Individual Key Worker relationship|Theory behind the Individual key-worker relationship model]]- [[Key Worker]]
# [[Keyworker well-connected to wider team]]
# [[Working in multiple domains]]
# [[Taking Responsibility for integration]]
# [[Scaffolding existing relationships]]
# [[Managing Risk]]
# [[Respect local practice and expertise]]
# [[Respect for Evidence]]
!!''Practise makes perfect''
As a way of checking whether we are holding onto the AMBIT stance points, there is a questionnaire [[AMBIT Practice Audit Tool (APrAT)]]. This is used to audit a specific case (perhaps with your supervisor) in relation to the AMBIT stance points.
Here also are a set of [[AMBIT Stance Exercises]] to help teams to practise the stance.
!!''A Very Brief Overviews of the Core Features''
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/VC-xzsR89s0?hl=en_US&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/VC-xzsR89s0?hl=en_US&version=3&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
|To create a heading, just place an EXCLAMATION MARK ''(!)'' right at the beginning of a new line. Whatever comes next will be in heading format. |
''Click on the pen icon as if you are about to edit this page and look at this elementary bit of code that is revealed below.'' See, also, that TWO exclamation marks make a sub-heading, three make a sub-sub-heading, etc...
!Title here
!!Sub-title here
!!!Sub-sub-title here
!!!!BONUS information: do exactly the same with an ASTERISK and you can create Bullet Points!
* Bullet point
** Sub-bullet
*** Sub-sub-bullet
* Bullet point two
!!What are these?
These two features are an immediate way to make a record of a page or a set of pages that you have opened and want to be able to share... It allows you to generate a link (a "URL") that you can email to anyone, which will open just those pages that you have got opened on your desktop at this time.
This is an easy way to share pages with your team or colleagues from other services.
!!What do I do?
!!!Link to my open pages
1. Get the page or pages that you are interested in opened up in your web browser.
2. Click on the triple hashtag above the search engine.
{{SNAPSHOT.PNG}}
3. The URL is automatically copied to your clipboard
4. Paste the address into the body of an email (or anywhere you want to save it) and share with your colleagues.
5. Next time you or the person who receives the email click that link, it will open the manual with exactly those same pages already opened up.
!!!Link to current page
1. On the 'More Actions' icon at the top right hand corner of any individual page
{{iCON.PNG}}
2. The URL is automatically copied to your clipboard
3. Paste the address into the body of an email (or anywhere you want to save it) and share with your colleagues.
4. Next time you or the person who receives the email click that link, it will open the manual on the page that you were on!
!!Why?
* This can be helpful for sharing manualizing sessions with the team once the scribe has refined the notes
*This can also be helpful in [[Team Meetings]] or in supervision sessions: case discussion may involve looking at content from the manual and this can be emailed directly to the worker.
!!What is a Contingency?
*Contingencies are things that happen ''in response'' to particular sets of circumstances: //"''If'' John becomes aggressive beyond simple verbal abuse, ''then'' the Police are to be called."// They are usefully manipulated in [[Cognitive Behavioural]] work (see [[Contingencies]]).
*Contingency plans are about //''what to do if, IN SPITE OF OUR RISK MANAGEMENT PLAN, an untoward incident occurs...''//
**''N.B.'' This is slightly different from intervention plans that we draw up in the Care Plan to ''AVOID'' predictable risks.
!!What needs doing?
*Go to your Care Plan to review/identify the plans that are in place to cover //the most likely crises to affect your client//.
*In particular look at your [[Formulation and Treatment Aims]] and your [[RiskAssessment]]
!!LIKELY (CRISIS) CONTINGENCIES:
Add content here....
!!PLANNED CARE/TREATMENTS:
Add content here....
." title:"YYYY-0MM-0DD 0hh:0mm:0ss - Current CARE PLAN" tag: Client Notes:Care Plan>>
*Ensuring that you have completed contingency plans for the //most likely crises// is included in [[Starting a NEW CASE - CheckLists]]
!!Co-construction:
* Plans are only likely to be effective if they are ''co-constructed with the young person, and the family/immediate carers''.
**Often some work on developing a robust network of support for the other family members is required: for instance negotiating to recruit nearby uncles, friends, or neighbours to be "on call" and to act as "referees" (NB - obviously it is important to clarify that we are NOT asking anyone to act as police or to involve themselves in any aggression to quell violence.)
**For instance, a plan may look like this:
>//__''Contingency:''__// Aggression or violence in the family home.
>//__''Response:''__// 1. Try to use the de-escalation techniques as discussed. 2. Ensure paper information sheets about managing violence, and recording these plans, are available at home. 3. See [[Manage Violence]]) 4. First, try to avoid violence erupting by doing (a), (b), (c). 5. If violence does erupt, then family members are to avoid getting drawn into any physical confrontations. 6. Family members are to remove themselves from the area, meanwhile orienting X to the situation with a statement such as: //"We are all at home, but we are feeling afraid right now, so we are following the plan we all made to help us all calm down and think straighter."// 7. If the situation is not rapidly calmer, then escalate to calling your neighbour John for help, and/or the Police.
* Share written copies of these plans with family, friends, and the young person, as required.
* The [[RiskAssessment]] and [[Formulation and Treatment Aims]] will help determine the most likely/serious risks to plan for.
!!Generic crises - Endings, and specific "suicide spots"
* Some crises, rather than being "specific" to a certain young person, may be will be "generic" for the local team
* ''The team's contingency plan may thus be edited into the local team-based template of the manual'' - see [[How to run a team manualizing session]]
** For instance if there are ''particularly well known "suicide spots"'' that a young person may head for (a railway line, a road bridge, etc.)
** ''__Planning Before Treatment Endings__'':
*** There are likely to be a number of predictable "stress points" in the weeks or months following discharge from your service.
*** As much as possible the [[Key Worker]] and young person should try to predict and "map" these, and then to devise ways to practice or rehearse solutions.
*** For instance, making the journey several times to a new clinic, so that the directions/bus routes/etc are clear, or arranging to attend initial appointments together.
** ''__Handovers to new workers/new teams__''
*** It is often powerful for a young person ''to see a trusted [[Key Worker]] standing beside a new worker'', and thus in a rather concrete way //showing// the connection and professional trust between them.
*** Sometimes a brief conversation with a new worker before such a meeting can help to prime them to make the most of the positive attachment that exists.
*** Positive/Secure attachments can in this sense be seen as "rubbing off" on other workers in close proximity.)
<div style="background-color:lightblue">
<h1>Welcome</h1>
</div>
Welcome to your AMBIT training, for those working in the CYP Crisis Pathway, funded by Health Education England.
This is a page in our freely availably open-source manual on the AMBIT approach. Below is the content you will use in the training, but feel free to explore the whole manual. The [[Home]] page is a good place to start.
<div style="background-color:lightblue">
<h2>Day 1</h2>
</div>
<<thumbnail link:"AMBIT training day 1" image:"screen.png" caption:"Day 1" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">>
<div style="background-color:lightblue">
<h2>Day 2</h2>
</div>
<<thumbnail link:"AMBIT training day 2 AM" image:"module 3.jpg" caption:"Day 2 AM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">><<thumbnail link:"AMBIT training day 2 PM" image:"mod4.jpg" caption:"Day 2 PM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">>
<div style="background-color:lightblue">
<h2>Day 3</h2>
</div>
<<thumbnail link:"AMBIT training day 3 AM" image:"module 5.jpg" caption:"Day 3 AM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">><<thumbnail link:"AMBIT training day 3 PM" image:"law1.jpg" caption:"Day 3 PM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">>
<div style="background-color:lightblue">
<h2>Day 4</h2>
</div>
<<thumbnail link:"AMBIT training day 4 AM" image:"law2.jpg" caption:"Day 4 AM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">><<thumbnail link:"AMBIT training day 4 PM" image:"module 8.jpg" caption:"Day 4 PM" icon:"{{$:/images/fa5/solid/chevron-circle-right}}" color:"pink">>
<div style="background-color:lightblue">
<h2>Keep in touch</h2>
</div>
!!Follow AMBIT
<a href="https://www.youtube.com/user/ambitafc" class="tc-btn-big-green" style="border-radius:4px;background-color:#e52d27;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/video}} ~YouTube
</a>
<a href="https://twitter.com/afcambit" class="tc-btn-big-green" style="border-radius:4px;background-color:#5E9FCA;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/twitter}} Twitter
</a>
!!Contact us
<a href="mailto:ambit@annafreud.org" class="tc-btn-big-green" style="border-radius:4px;background-color:#green;" target="_blank" rel="noopener noreferrer">
{{$:/images/fa5/solid/mail-bulk}} Email
</a>
!!Sign up for the [[AMBIT Newsletter]]
These will be arranged and delivered differently in different areas.
!!Edit this for your team's Manual
Protocols for how to access local Crisis services can and should be recorded here by teams setting up to use the TiddlyManual, so that [[Your Manual]] carries this local information. When you have edited your Local version of this, remember to delete the tag [[Local Manualizing Tasklist]].
Normally, Crisis services will consist of the basic emergency services (Police, Ambulance, Fire Services) as well as local arrangements for providing emergency psychiatric assessments, and emergency Social Services responses (for situations involving acute child protection concerns, etc).
The AMBIT manual is best thought of as being created in layers:
!!!1. Top Layer
At the top is ''__"Local material"__'': This is predominantly //Practice-based evidence// that is added by a local team (a member of the AMBIT [[Community of Practice]]) that is specific to their social, cultural, service and political ecology. This is where a team writes about itself - what we do, and why we do it this way. Manualizing itself, the team is in a sense encouraged to [[Mentalize|Mentalization]] itself.
!!!2. Middle layer
Local additions sit above the middle layer which is ''__"Core AMBIT content"__'': This core content is an attempt to offer an innovative way of presenting a rich array of //Evidence-based practices// and theory so that it can be integrated with the practice based evidence from real life deployments, in layer 1. above. This content is hosted ("curated") by the [[AMBIT Editorial Group]]. The content is constantly growing/adapting to changing evidence and feedback from scientific trials as well as from the many real-world deployments represented in layer 1., above.
!!!3. Machinery layer
At the bottom is the ''__"Machinery"__'': Here, and mostly out of sight as they are not of interest to most users, are a number of layers of technical material that enable the wiki to behave and present itself in the ways it does.
!!Criteria for inclusion are as follows:
!!!1. Local additions
*''These are the responsibility of the local team''- local team's edits are held in a wiki that is under the editorial control of that local team alone - which just happens to "inherit" all content from the lower layers, any part of which can be overwritten. Key advice about what to include:
** ''Nothing that would breach confidentiality'' of clients or others (this is a place to record learning about practice, not individual case studies, etc.)
** Material that relates to the HOW of this work: //how we are applying these ideas and techniques in this setting, with these people, in this local culture...//
** "Recycled" material generated in other parts of the AMBIT [[Community of Practice]] that has relevance to the work of this team.
* ''This is where emerging innovations in practice start the journey from Practice-based Evidence to Evidence-based Practice''
** Material describing/showcasing workers' behaviours/techniques/tools that have been found locally to be more useful, safer, more effective than alternatives.
** Outcomes or service user feedback (anonymised) that support the use of these practices in this setting
** Areas for future learning: how does this team understand its failures, challenges, prompts for better ways of working?
!!!''2. Core Content''
* The Core content is not an attempt to define a "once and for all" or a "one-size-fits-all" representation of truth/the state of evidence.
** It does strive to be ''Evidence-based where possible, and Evidence-oriented where necessary''.
** It is continually up-graded and adjusted in relation to feedback from:
*** Trials evidence (see [[What works for whom?|Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom]])
*** Feedback from the multiple field deployments of this material supplied by [[AMBIT-influenced]] teams who are part of the AMBIT [[Community of Practice]].
* New material that is added to the Core Content layer is subject to review:
** Changes are divided into:
*** [[(a) Work in Progress - Major change]] - these require greater levels of scrutiny from a wider panel of editors and scrutiny from an [[AMBIT Expert Reference Group]] that consists of non-aligned experts who can provide expert feedback and steerage on specific areas of practice/theory.
*** [[(b) Work in Progress - Minor change]] - these more minor changes, require oversight and review by a smaller [[Reflective Quorum]] drawn from the [[AMBIT Editorial Group]] whose responsibility is (a) to ensure that these changes are indeed minor rather than major, and assuming this is the case, (b) to decide whether the changes are sufficiently evidence-based, or evidence-oriented to be accepted.
!!!!Criteria for acceptance in core content:
* ''Does this new material add value in understanding:''
** About applying a mentalizing framework?
** About AMBIT?
* ''Does this new material respond to FEEDBACK'':
** from the [[Community of Practice]]
** from experiences of ''trainers'' delivering [[AMBIT Training]]
** from ''local teams'' receiving or using AMBIT training
** from ''service users'' who AMBIT-influenced teams are working with?
* ''Does the new material address the strategic priorities for AMBIT:''
** to develop...
** to disseminate...
*** the most effective ways of helping the most excluded clients with multiple intersectional needs and vulnerabilities, and to do this as cheaply as possible?
!!!3. Machinery
* The basic software architecture that supports these TiddlyManual is developed by an international open source community
** See http://www.tiddlywiki.com and the Google discussion group for TiddlyWiki - the simple, furiously ingenious, single HTML file that holds the whole wiki that you are reading now.
* The AFNCCF employs wiki engineers, including the founder of TiddlyWiki, Jeremy Ruston to continually adapt and improve the machinery: please use the [[Feedback please!]] page to give us help in prioritising technical improvements!
To fully understand the young person, the family and their social ecology, the cultural context needs to be taken into account, and ''this includes aspects of power in the relational framework wherein you meet''. Finding ways to name these differences in power, gender, race, culture, etc (what the systemic thinker John Burnham refers to as the 'Social Graces' - there is a link to this reference [[here|https://www.taylorfrancis.com/chapters/edit/10.4324/9780429473463-7/developments-social-grrraaacceeesss-visible%E2%80%93invisible-voiced%E2%80%93unvoiced-1-john-burnham]]) is essential if such differences are to allow - even stimulate - respectful curiosity and exploration/mentalizing.
!What is culture?
'Culture' can be broadly defined as a system of shared meaning. It patterns and constructs the relationships through which we come to know ourselves. Our very notions of personhood, our motivations, cognitions and emotions are given meaning through culture. We are, however, seldom consciously aware of this.
This is not to say that cultural patterns are given or fixed. It is only in the performing of these shared meanings that culture is constructed. Thus, on the one hand culture constructs us and on the other we construct it. Meanings are constantly open to reworking and renegotiating and so 'cultures' are always emerging and subject to change.
!!Cultures within Cultures
Within the context of multicultural societies, cultures exist within cultures and in a hierarchical power relationship. Institutions, such as the NHS and the models and theoretical frameworks they are based on, as well as the practitioners that operate within them are rooted in culturally constructed normative ideas about health and dysfunction. Minority cultural groups within this social context are often left to negotiate these differences and may at times experience the involvement of these institutions and practitioners as an imposition and as in conflict with their values and beliefs, even though, as various governmental reports and directives clearly suggest, the onus of this should not fall on 'users' but rather on institutions to guard against discriminatory practices.
!!The impact of culture
The potential strain of living 'in between' cultural spaces has in the past been referred to as 'culture conflict', and has been alluded to as one possible explanation for disproportionately higher rates of certain mental disorders and suicide and self-harm in ethnic minority adolescents. In practice, this viewpoint has often led to the construction of 'minority cultures' as being the source of the problem, as opposed to the relationship and difference between cultures.
Minoritized families and adolescents, who are navigating these differences, often become embroiled in this polarizing dynamic of cultures. Health or social care professionals working with culturally //minoritized// clients, must therefore keep in mind these multiple contexts and be prepared to hold in mind the multiple views of 'the problem' and 'solutions' that will inevitably exist. It is important to be aware that, whilst cultures may pattern people's lives, meanings are subject to reworking within the broadest cultural and social framework that we all, as potential helpers in relation to one another, share . The work of the health or social care or other professional may thus become more geared towards improving the ecological 'fit' between the cultural contexts in which the client moves.
!!Manualizing approaches to culture
AMBIT's stress on the need to [[Respect local practice and expertise]] extends to a reticence to dictate how teams should best work in different culturally-influenced settings, but local attempts to [[manualize|Manualization]] their work will be helpful to others. There may a wide range of specific ethno-spiritual theories at play in a local setting (we do not presume to define them here) that a local team could record, along with their experience of how best to work with these.
Like any therapeutic encounter, first impressions count.
This includes //every contact// that the Team makes with a young person and their family/network, so that within the Team there needs to be a strong sense of shared responsibility for any "Front of house" work, such as answering telephones.
The model this manual adopts suggests that it is the rapid provision of a "[[Secure Base]]" for the young person and their family/network which then allows for the restoration of [[Mentalization]], exploration of the true nature of their experiences, and learning from these experiences.
All Team members therefore need to adopt a culture of hospitality, which is a word that has been hijacked over the past decades by the marketing world, but which has its roots in the //welcome of strangers//.
!Examples of current research projects involving AMBIT:
Below we describe ongoing research involving the AMBIT approach
[[ 1. Understanding and Breaking the Intergenerational Cycle of Abuse in Families Enrolled in Routine Mental Health and Welfare Services by Investigating the Feasibility and Effectiveness of a Mentalization-Based Early Intervention Program (UBICA-II Study): Study Protocol for a Non-Randomized, Open-Label, Single-Arm Feasibility Study by Denise Dittmann, Astrid Dempfle, Anke Nießen, Ira Puchert, Kerstin Konrad and Beate Herpertz-Dahlmann (jan 23)|Understanding and Breaking the Intergenerational Cycle of Abuse in Families Enrolled in Routine Mental Health and Welfare Services by Investigating the Feasibility and Effectiveness of a Mentalization-Based Early Intervention Program (UBICA-II Study): Study Protocol for a Non-Randomized, Open-Label, Single-Arm Feasibility Study , Dittman et al 2023]]
!WE WELCOME UPDATES FROM YOUR SERVICE!!!!
Please contact us on james.fairbairn@annafreud.org or ambit@annafreud.org
>''Please provide us with a brief (up to 300 words) update of any work on outcomes or research happening within your AMBIT influenced team'' - we will create a page here to share it with the AMBIT Community
!Listings for all AMBIT Outcome Studies
<<tag [[AMBIT Outcome Studies]]>>
Some of these studies are now completed... ''we particularly want to highlight'' this summary paper:
[[Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach]]
![[The AMBIT International Study group]]
[[The AMBIT Study Group]] are a collaboration of AMBIT influenced teams from a number of countries who are all collecting client outcome data using a shared measure called the AIM.
The intention behind this project is to sustain a community of AMBIT influenced teams who are learning together about implementing this measurement tool and collecting outcome data using a shared approach.
The group will be sharing a sample of its outcomes and learning in a forthcoming publication
!!Introduction
Mapping the complexity of human interactions is helped by considering different Domains, and the different Levels within these at which dis-integrative processes tend to occur.
The Domains we highlight in this respect are analogous to the Domains and Levels of dysfunction that help us to map our patients' problems and plan interventions.
These simple ideas underpin the [[Dis-integration grid]] that offers a way to structure interventions to reduce the negative impact of dis-integration.
!!DOMAINS OF ~DIS-INTEGRATION
Any of the following domains may clash on a number of different levels:
|Young person|Family members|Peers/Social Ecology|Individual Clinician|Multidisciplinary team|Other ~Multi-Agency teams|
Within the ~Multi-Agency network for any particular young person, you might highlight particular agencies:
|Social Services|Education|Youth Offending|General Practitioner|CAMHS|Police|etc...|etc...|
The Dis-integration of treatments may occur in any of these domains (often simultaneously), and occurs at any one of three different Levels:
!!LEVELS OF ~DIS-INTEGRATION
|1.''CONCEPTUAL/EXPLANATION'' |What's the problem?|
|2.''PRAGMATIC/INTERVENTION SKILLS'' |What to do?|
|3.''SYSTEMIC/ NETWORKRESPONSIBILITIES'' |Who does what?|
A range of different Dis-integrativeProcesses can be identified as driving the unwanted outcome of dis-integration.
Dis-integrative processes are most easily mapped onto these different Domains, and Levels using the simple Grid, found at Dis-integratedInterventions (and repeated below). An important practical technique for keyworkerrs to master is the use of this grid as a tool in case discussions, sketching out the details of a particular case helps the Keyworker and Team to identify sources of dis-integration and to develop strategies to counter these.
#''Individual Clinician'' - see [[Dis-integrative processes in an Individual Clinician]]
#''Multi Disciplinary Team'' - see [[Dis-integrative processes in a Multi Disciplinary Team]]
#''~Multi-Agency context'' - see [[Dis-integrative processes in a Multi-Agency context]]
#''Family/Systemic context'' - see [[Dis-integrative processes in a Family/Systemic context]]
Mentalization theory tends to emphasise the opacity of other people's minds and the value of adopting a tentative stance with respect to what we know about the mind states of others. This is one of the cornerstones of the [[The Worker's Mentalizing Stance]].
Daniel Kahneman is a cognitive psychologist whose focus of work is on cognitive processes which underpin decision making. He is very influential, won a Nobel prize in 2002 for work relevant to economics. He recently wrote a popular summary of his work called 'Thinking, fast and slow'. (Penguim,2011). He is not particularly focused on therapeutic endeavour but his work emphasises themes that are very consistent with a mentalizing framework. A number of these are very striking. Readers interested in the details of this work are invited to look at the full text.
!!A dual process cognitive theory of intuition and decision making
Kahneman proposes that the mind operates to a large degree automatically. He calls this part of the mind System 1 and it makes up 80-90% of all mental activity. It works well enough for the majority of human needs. The system makes rapid, immediate judgements about aspects of the world and self which work sufficiently well for approximately adaptive functioning in the world. It is a good enough system. But there are situation when this basic system doesn't work so well and more deliberate, effortful mental processing is needed. He calls this System 2 and is characterised by being much slower than System 1. It also requires conscious effort.
This framework has the benefit of being easily accessible to the general reader as it is within everyone's experience of having both automatic mental processes in contrast to deliberate conscious effort. What Kahneman outlines is the way the two systems interact and how both need each other.
!!System 2 requires mental effort
Mental effort is not a metaphor in this framework. Kahneman shows that effort diminishes over time (people become tired) and that it consumes glucose. Glucose replacement improves performance. He cites an alarming study which showed that Israeli judges reviewing parole requests were more likely to grant parole if they had just had a meal or snack than if they had had a long time since a break.
Kahneman goes further and suggests that mental effort (System 2) is mildly unpleasant and aversive and that it is essentially a lazy system.
Kahneman's framework is attractive to a mentalization based approach because its general style is one of cautious humility. A number of examples of this are highlighted below.
!!Cognitive ease and the impact of affect
A separate page has been created for this in order to capture some key quotes. See [[Kahneman's dual process theory and the impact of affect]]
!!Cognitively, doubt is much more hard work than certainty.
For example, he suggests that the brain is a machine for jumping to conclusions even when the data is highly inadequate to such conclusions. Although this quick decision making is generally good from an evolutionary point of view, it is not so good at finding out how the world works. We like narratives much more than we like data. However many such 'narrative' conclusions are flawed. On Page 114, he states that 'Sustaining doubt is harder work than sliding into certainty'. Kahneman's assertions are supported by a lifelong cognitive research programme. In this way, cognitive theory can be seen to support the value of a 'tentative' position by the AMBIT worker. This
The poet Yeats had something similar to say in his famous poem "The Second Coming", albeit rather more pessimistically!:
>//The best lack all conviction, while the worst//
>//Are full of passionate intensity.//
!!The value of seeing things from the outside
Kahneman examined forecasting behaviour and found that people or teams looking at things from the inside were exposed to a range of decision making biases which were mitigated by inviting others to look at the same information from the outside. This would seem to be entirely consistent with the ripple analogy used in the Passed-out Discussion and [[Thinking Together]]
!!The pressure to be expert
The following is a quote from page 263 of 'Thinking Fast and slow' where Kahneman is discussing the nature of over-confidence which he considers a form of cognitive bias. Here is a marvellous quote form his book.
'''Experts who acknowledge the full extent of their ignorance may expect to be replaced by more confident competitors, who are better able to gain the trust of their clients. An unbiased appreciation of uncertainty is a cornerstone of rationality - but it is not what people and organisations want. Extreme uncertainty is paralysing under dangerous circumstances, and the admission that one is merely guessing is especially unacceptable when the stakes are high. Acting on pretended knowledge is often the preferred solution'''.
This quote raises a number of important issues for the AMBIT approach and may benefit from being the starting point for some team discussion.
!!Confidentiality
[[TiddlyManual]]s that are edited, stored and accessed online are never to be used for the collection or publication of patient-specific data, which always needs to be stored according to rigorous local protocols and procedures.
When a team is manualizing its own practice, it must limit descriptions of protocols to //general// rather than //specific// situations, and if referring to scenarios must always ensure that these are appropriately anonymised.
''Teams remain responsible for any content that they add to their online version of the AMBIT manual, and the AMBIT project accepts no responsibility for content that is authored by others, whether or not it is added to content included from the AMBIT core content site.''
Journal of Child and Family Studies (2021) 30:502–516 https://doi.org/10.1007/s10826-020-01882-3 ORIGINAL
!Outcomes of Assertive Community Treatment for Adolescents withComplex Mental Health Problems Who are Difficult to Engage
Michael F. X. Daubney1●Narelle Raeburn1,2●Kerry Blackman1●Holly Jeffries1●Karyn L. Healy1,3,4Accepted: 12 December 2020 /
Published online: 9 January 2021© The Author(s), under exclusive licence to Springer Science+Business Media, LLC part of Springer Nature 2021
!!Abstract
Assertive community treatment (ACT) is a well-established treatment for adults with mental illness and has an emerging evidence base for improving mental health outcomes for adolescents. Recent studies have utilized ACT with adolescents who are difficult to engage through traditional psychiatric services. The Assertive Mobile Youth Outreach Service(AMYOS) of Children’s Health Queensland in Australia provides ACT for families of adolescents with severe and persistent mental health problems, who have been unable to engage successfully through the standard mental health support services provided by community clinics. AMYOS clinicians work flexibly to engage adolescents in an individualized plan aimed at reducing risk of harm, supporting recovery, improving overall functioning, and engagement with education and vocational pathways. This study reports outcomes for adolescents involved in the first five years of the AMYOS program. Overall, there were significant improvements over time on questionnaires of global functioning, perceived suicidality, hostility and a wide range of mental health problems, as rated by clinicians and families. There were also significant reductions in average monthly duration and number of hospital admissions during AMYOS treatment compared with 12 months prior to referral. Increases in visits to Emergency Department during treatment did not translate into hospitalization, suggesting adolescents were better monitored when at-risk. There was also increased engagement in school and standard healthcare. This provides further evidence that provision of assertive community treatment is associated with improved mental health outcomes for at-risk adolescents. Future research could include comparison groups and investigate possible mechanisms for change.
!Introductory comments:
* ''There are lots of ways of getting started'' with a topic for your team to manualize, and once a team develops its own approach to manualizing as one of its [[Rituals and Disciplines]] these prompts will become less useful
* ''Manualizing is always a Team activity (not an individual one!)'' - this includes ensuring that there is some ''team agreement ''that this is a topic worth manualizing
* ''Creating time:'' Use some form of, or slot within, your [[Team Meetings]] to decide on a topic and ensure that you are [['quorate'|Reflective Quorum]] to make changes to your team's manual.
* ''Integrating the new with the existing'': Consider how to fit what you are manualizing into what is already there. (See [[Fitting what you ADD into what is ALREADY THERE in your manual]] for a bit more on this ''but the content below will help you...'')
----
|''CONTENTS''|
|(a) ''Review //existing// content''|
|(b) ''Pre-defined tasks: Check your tasklist''|
|(c) ''Brand new content''|
|(d) ''Improving/Tweaking existing content''|
|(e) ''Create sub-topics under existing content''|
|(f) ''Select from pre-defined topic lists''|
----
!! (a) Review //existing// (including locally-edited) content
* Avoid reinventing the wheel or creating duplicate material by [[searching|Search Bar]] for what your team (or the [[AMBIT programme]]) has //already manualized//.
* Look at the right hand Sidebar and click on the ''"Our Pages"'' tab to see all material that is local to your team's manual listed.
* In the ''Recent Changes'' tab ''all'' changes are listed (//including// ones to core content created by the [[AMBIT Programme]]) but your team's local edits are all labelled as such:
[img[MarkLocalEdits.jpg]]
----
!!(b) Start work on a pre-selected manualizing task
The AMBIT team have created some template pages for you to add content to and you can add to the tasklist these are collected under:
* Click on the tag <<tag [[Local Manualizing Tasklist]]>>
* See a dropdown list of previously agreed (or prepared) pages/templates that you can work on
* ''Create a new manualizing task'' (for future manualizing sessions) by selecting the option //"Create New Tiddler tagged ..."// in the drop-down list that appears when you click on this button
----
!!(c) Create brand new content
Instead of editing pages that are already in the manual you can create your own content and add your own topics.
* Click on the ''+'' icon just above the search engine on the right hand sidebar.
[img[Createnewpageicon.jpg]]
* Consider the Title you give your new page (title it with whatever key words someone looking might search for!)
* Consider which topic(s) this proposed new page might actually fit as a sub-topic of, or if it might have sub-topics of it's own - use [[Tags]] to organise this
* See [[How to edit your team's manual]]
----
!!(d) Improve/tweak //existing// content
If you and your team have identified an area of your work that is written about but not covered adequately in the manual, you may want to...
* Describe it in better terms
* Adapt it to fit your local culture, service ecology, etc.
Go to the page you've found that needs improving and [[Edit|How to edit your team's manual]] that page directly. You won't 'break' the core AMBIT version of that page, you will just make your own local version that will sit on top of AMBIT's version in your manual (if you delete your local version, the AMBIT original version will pop back in its place.)
----
!!(e) Start a new 'Sub-topic' under an existing page
This is halfway between starting a completely new topic, and editing existing content. [[Tags]] act as topic headings (or chapters, if you prefer) and by tagging your page with another page, you make it into a [[Sub-topic]]. For example, if you want to add a subtopic to the page 'Manualization' for example, you would tag your new page with Manualization.
You can automatically start a sub-topic of a page like this:
* On the page that you now want to create a sub-topic under, click the ''More Actions'' button (downward arrow at the top right corner of the page - see picture below)
* Select ''New Here'' to create a new page that is //already tagged// with the title of that page: that page will be ready for you to edit
[img[NewHere.png]]
----
!!(f) Pre-selected (suggested) topics to add new Sub-topics under:
Similar to above, if you come across a tag displayed as a drop-down list (example: <<tag Tags>>) and you want to ''create a new page as a Sub-topic under this'', you can choose the option //"Create New Tiddler tagged ..."// in the drop-down list that appears when you click it (assuming you are [[Logged in|Log in]].)
>See [[OUR LOCAL Resources and Practice]] for a wide (though not exhaustive!) selection of drop-down-lists that will give a team ideas for topics that they might want to manualize.
<<tag [[Supervision Notes]]>> - use this tag to create a new note for every a team supervision. Ask your AMBIT Supervisor to help you do this (remember not to post any confidential information discussed in supervision, just the shared learning points on practice!)
[[Home]]
[[TrainingCore]]
!!What is Motivational Work?
This approach derives from the work of W.R. Miller and S. Rollnick, and is widely used across a range of difficulties, and especially frequently in work with [[SubstanceUseDisorder]]. See [[Motivational Work - Checklists]] for a summary that will help order your delivery of this intervention.
Motivational work emphasises the //development of engagement//, and the importance of //sustaining the client relationship//. it may be delivered in a single session, or across a number of sessions, and it is acceptable for a practitioner to dip in and out of the techniques described under this heading as required. (In fact, to do so is in keeping with the advice contained within the core principle to [[Roll with Resistance]]!
!!Motivation and Mentalizing
There is a great deal of overlap between the theory underpinning motivational work and [[Mentalization]], which is, of course, particularly focused on //intentional states//. In particular it is worth understanding the [[Stages of Change]] - the 'first' of these, [[Pre-contemplation]], is an example of how non-mentalizing can present (see [[Pre-mentalistic stances]].)
[img width=500 [Stages of Change and Mz pic]]
!!What motivational work is NOT...
Crucially it is ''not'' about ''MAKING motivation'' in a person who does not wish to change, but about working with whatever motivation is present at that time (sometimes the skill is in helping a client to discover motivation to change that they had overlooked.) The moment it becomes a any kind of 'feat of strength' on the part of the [[Key Worker]], the work being done is not properly 'Motivational'.
These are beliefs that are firmly held, but false, and out of keeping with normally-accepted cultural norms (religious beliefs would not count as delusions as they are culturally 'congruent').
They are not uncommonly a symptom of [[Psychosis]], which will require a swift response.
If the Delusion involves another person, and particularly if it involves ideas of [[Violence]] or is particularly [[Paranoid]] in nature (even if it is a delusional belief that //"X loves me!"//), then it is a risk factor for aggression that should be taken seriously (see [[Managing Risk]]).
!What does it look like?
*persistent low mood for at least two weeks
*plus some of the following: lack of energy, being very irritable, loss of pleasure in life, difficulties with sleeping, day-night sleep reversal, loss of appetite, loss of interest in sex, feelings of hopelessness.
In general, young people are likely to be very poor at recognising their experience as being depression.
This may be because: -
# depression is a combination of feelings and experience
# others problems may be more obvious to others such as crime or not going to school
# being depressed is not cool and may be linked to feelings of shame and weakness.
!Need to check out
*Current or previous use of drugs and alcohol. Depression may be direct result of change in substance use.
*Any important recent life events such as family changes, death of grandparent, rejection by sexual partner
If these are also happening, depressed mood may be appropriate and temporary response to an important life situation.
!How long will it last?
*Depression has a tendency to be cyclical - that means that it comes and goes and people talk about having a period of feeling depressed. Its hard to predict how long this will last but average for severe depression may be around 6 months. The aim of 'treatment' is often to reduce the length of the depression.
!WHAT CAUSES IT?
These are often referred to as risk factors:
* Loss of a relationship. This could be with a parent/carer or a friendship, or gang or sexual partner.
* Being powerless in highly adverse circumstances such as violence between adults at home, exclusion from school.
* Changes in life circumstances such as being evicted from accommodation or having to leave school and go to college
* Absence of a future life plan. No direction in life and assumption that desired aims are not achievable
* Any recent changes in regular use of drugs or alcohol.
* Dislike of self particularly around body image and weight.
!HOW COMMON IS IT?
* Depression occurs in around 5% of young people at any one time. However, up to 40% of young people may experience depression at some point as part of their transition to adulthood.
* Young people attending AMBIT teams are likely to have much higher risk of depression as they will be exposed to many of the above risk factors. It would be reasonable to assume that rates of depression will be much higher than for general population.
!WHAT TO DO?
You can access the [[NICE Guidelines|NICE - Depression]] here.
!First things
* Adopt a non-judgemental approach to the young person's difficulties e.g. difficulties in slleeping and getting out of bed etc.
* Clarify whether depressed mood also tips into [[Self Injurious Behaviour]] or suicidal thinking or behaviour, and see whole section on [[Managing Risk]]. If these are present, discuss with other members of your team.
* Young person may need some time to get used to idea of thinking of themselves as depressed. This is common and important to give young person time to make sense of your understanding of his difficulties as being depressed (see [[Slow engagement]].)
!Developing help
*Depression is often maintained by a severe loss of routine and basic activity (like eating meals) and also by severely negative critical thinking directed towards the self. These two features of depression are the focus of CBT work with depression. As well as direct work, a CBT apporach would also include [[PsychoEducation]] so that the nature of depression and the rationale for the methods used would be explained to him/her. The basic approach is to try to re-establish increased activity (known as [[Behavioural activation]]) and secondly to try to illicit communication about negative thinking and to begin to gently challenge whether some of this thinking is accurate or helpful. See [[Cognitive Behavioural]]
* Another approach to depression is to focus on helping the young person to maintain and look at his friendship relationships and to work in restoring any exisitng ruptures in such relationships. This broad approach is known as IPT.
* For severe depression consideration need to be given to discuss with the young person the possibility of arranging to see his/her GP about the possibility of medical help ([[Pharmacological]]) for depression. This would need to be balanced against the young person's own wishes with respect to medical help and also the potential risk of misusing medication if this was prescribed.
Unlike 'pure' client-centred counselling, where the client uses the counsellor to help in exploring his or her concerns, [[Motivational Work]] is more ''directed'' - at helping the client to RESOLVE [[Ambivalence]].
!!Look for discrepancies between present behaviours and broader goals and values.
!!!1. Clarify wider goals and values:
//"Can you help me understand a bit more about YOU - what are the things that really make you tick, that you dream about, that are important to you...?"//
*Relationships
*Work or education
*Avoiding criminality
*Sporting goals
*Being straight with people I love
*Etc.
!!!2. Look at the impact of substance use/other behaviours on these.
//"So you have a lot of good times with your friends when you are using weed. Is that with all your friends, or some of them? Have there ever been times it hasn't worked out that positively? What about the way your family react towards it?"//
!!!3. Aim for the client to present the arguments for change, NOT YOU.
Motivational work is NOT about you instilling, inserting, encouraging motivation in the client, but in helping the client to think ([[Mentalize]], if you like) about what he or she //really wants//...
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/BtSHx2FDuOw?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!What is here?
This is an introduction to this important concept, that sits at the heart of the AMBIT approach to [[LEARNING at work]], which is part of the [[Core Features of AMBIT]].
!!AMBIT emphasises learning
Implementation science suggests that embedding research evidence in our day to day practice is a challenge.
There is also limited research evidence for what works with clients typically seen by AMBIT-influenced teams.
''Therefore we need to learn as much from our local experience as from the existing evidence.''
//''So how do we create organisations that genuinly learn together from their experiences, so they can adapt and work more effectively ?''//
AMBIT's ideas in this area are influenced by the work of Prof Peter Senge (Harvard Business School) - whose book "The Fifth Discipline" about learning organisations applies systemic thinking to the work environment.
Senge proposes that successful organisations are those which have the capacity for adaptation and learning. He emphasises that learning ''collectively'' as a group is at the core of this.
It advocates that teams:
*Fimd ways to promote the conditions that encourage team learning
*Develop shared mental models (ways of thinking about their practice) that underpin their work.
* In order to do that above, and for for learning and change, there needs to be a balance between 'enquiry' (about others' ideas) and 'advocacy' (being explicit about your own ideas). These need to be balanced NB this fits closely with [[Mentalization]]
*Learning needs to be given an explicit place in the everyday routine work of every team, with a focus on teams better understanding:
1.How they do things
2.Why they do things that they
3.How they could do things even better
''In AMBIT Manualizing is a vehicle to support this kind of team learning. Over time a team’s local version of the manual comes to represent the collective thinking and learning of the team.''
Please see here for a very brief overview by Peter Senge of some of the key themes of his work.
https://www.youtube.com/watch?v=OpiqnCAQ6S8
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/OpiqnCAQ6S8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
Please see here for a video of Peter Fuggle discussing: 'Is the concept of a Learning Organisation useful in AMBIT?' (AMBIT conference 2013)
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/bKBRDVVf5yc?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/bKBRDVVf5yc?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
In summary, the reasons for encouraging AMBIT teams to consider the ideas of Learning Organisations are:-
*To connect teams to some of the evidence base around organisational practice
*To emphasise that team functioning is a core aspect of AMBIT and will be affected by organisational factors
*To help teams consider their own values around learning
*To help teams think about conditions that promote openness to learning and barriers to learning in their contexts
*To highlight that many of these ideas over lap with [[Mentalization]] and that mentalization itself is an important part of a learning e.g. why do we do it like this and not this? What is it about our team that means we do things this way and not that way?
For extended reading and further videos around the theory of Learning organisations and their implications for AMBIT please see <<tag [[Extended learning]]>>.
* This relates directly to [[Relapse prevention]] work
* In addition, in keeping with the [[Recovery agenda|Maintenance and the Recovery Model]], there is a focus not just on the symptom-focused [[prevention of relapse|Relapse prevention]] but //also// on the fostering of positive experiences of thriving, enjoyment, and meaningful activity:
** Fitness routines
** Work
** Hobbies and Sports, etc
* Note that [[Monitoring mental health]] can be seen as a very important maintenance routine.
* Similarly, planned (put them in a diary!) test exercises to rehearse [[Crisis plans|Crisis Contingency Planning]] are important.
** //You would be disappointed if the Fire Brigade didn't check their hoses and ladders regularly!//
** Check that contact details are up to date
** That the right people know the right things to say or do
** That the plan still makes sense
!!!Background
Important to link discussions about measuring engagement with existing parts of the model and manual. Earlier discussions on this can be found [[ARHQ]] in work developing an AMBIT Relationship to Help Questionnaire.
!!!Barcelona approach to measuring engagement.
Two key criteria
* The young person or the family use the keyworker as someone to reach out to for help.
*Active planning map has been used in a collaborative way, although adapting the way we use it to the specific circumstances of the YP or the Family.
These criteria suggest flickering signs of agency rather than passivity, so the engagement is not just about cooperation or collaboration (often criteria people use) but around help seeking.
!!!Developing engagement scenarios
# A young person has progressed to responding to text messages. She is polite but never initiates any messages. She is considered to be at risk of sexual exploitation and is often not at the hostel at night. Her mother is very anxious about her and calls the worker frequently communicating very high levels of panic and anxiety. Sometimes she calms down during these calls.
#A young person readily agreed to meet her worker and likes going to the café for coffee. She talks openly about herself and is quite self disclosing and sexually active. She thinks adults are always too serious and seeing the bad side of things but she is sociable and likes the interest of her worker.
!!!Linking to measurement of epistemic trust
Be interesting to see how this links with work going on in Holland with Saskia and her team about developing a measure of epistemic trust and whether the two strands of work could be linked together in some way. I am not quite sure where the measurement work has reached.
!!Attachment and Mentalizing:
There is an important relationship between [[Attachment theory|Attachment theory]] and mentalization.
Mentalizing emerges from [[Attachment Relationships|Attachment Relationship]], which provide the ideal context for nurturing mentalizing. In secure attachment relationships the child feels safe to explore the mind of the attachment figure, and builds a way of understanding their own thoughts and feelings.
Infants learn to mentalize in attachment relationships, through the experience of //being mentalized //by others. Caregivers intuitively and automatically attempt to make sense of their baby's actions from the beginning of life, through attributing mental states to their childs' behaviour. For example, 'maybe she's crying because she's tired??...she seems a bit agitated...? may be she's...'
These representations (or guesses) about the baby's mental states are reflected back to the baby time and time again. Through the tone of voice, facial expression, posture, and the words that are used by the caregiver in response, the baby gradually learns ways of making sense of their own internal experience...(please see [[Marked mirroring|Marked mirroring]] for more on this important developmental process).
Feelings, which for the baby are probably very physical and overwhelming in nature are, over time, represented in terms of mental states. It is through this continual back and forth process of [[contingent|Non-contingent]] [[marked mirroring |Marked mirroring]]that the baby develops a sense of self...as a being that has it's own thoughts, intentions and feelings.
This process is intrinsically linked to the development of [[affect regulation|Affect Regulation]] and the corresponding areas of the brain.
!!!Mistakes in Mentalizing
It is important to understand that ''mothers/fathers/carers do not always "get it right" when they are communicating with their babies''. In fact a landmark study ([[Tronick and Cohn: Infant-Mother Face-to-Face Interaction: Coordination and Miscoordination]]) showed that mothers with ordinary attachment to their own infants only got their face to face interactions perfectly coordinated about 30% of the time! This paper set researchers to thinking that it is less important that there is always perfect mentalizing between child and parent (actually children of "super-mentalizers" turn out to be //less effective mentalizers in later years!// "Good enough" mentalizers are actually the best there are! [[Sharp et al (2006) Imagining your child's mind]]) and more important that there is a process of noticing the misunderstanding and then repair. Presumably, when a mother "misses the point" that her infant is trying to make, this stimulates the infant to work out how and why that happened... to mentalize their mother, in other words.
!!!When Attachment is Disrupted:
Early disruption of attachment relationships creates a vulnerability in developing the capacities for mentalization. There are many adversities which can potentially place burden upon this relational process, making it more difficult for caregivers to hold the mind of their child in mind. Parental mental health problems, living in contexts of trauma or high social adversity, difficulties in parents own attachment relationships and substance abuse problems are some factors which can interfere with this process.
The relationship between attachment and mentalization, however, works both ways.
Difficulties for children in reflecting on mental states of others, understanding their own mental states, and problems in self regulation, (such as attentional problems) can place added challenge on attachment relationships. This can in turn undermine the natural emergence of mentalizing capacities. In this way, in some families, the very process that could lead to the child overcoming problems arising out of interpersonal challenges is undermined by the difficulties in the child’s attachment system.
!!When Mentalizing fails:
When the Attachment system is activated by threat/stress/anxiety, etc, [[Attachment Behaviours|Attachment Behaviours]] are triggered. These behaviours function to adjust the individual's proximity to their [[Attachment Object|Attachment Object]] serving as an inbuilt safety mechanism. Whilst this process is active, mentalization is effectively de-activated. //''It is no use mentalizing an approaching tiger!''// Mentalizing is a slow, deliberative, reflective kind of thinking, and in crises humans need to think fast, not dither!
Another way of understanding this is that the prefrontal cortex (where mentalizing occurs) is a very sophisticated and recently-evolved part of the brain, that is easily 'drowned out' by the relatively much more primitive (and "louder") brain centres such as those dealing with Attachment and Stress-Arousal.
see here for descriptions of the three key concepts used to describe the states of mind ([[Pre-mentalistic stances]]) that are adopted when mentalizing becomes imbalanced. These are:
* [[Psychic equivalence]]
* [[Pretend mode]]
* [[Teleological thinking]]
Crucially, the rapid (minute-by-minute) switching on and off of the mentalizing capacity //occurs in both the client as well as the practitioner// ([[Key Worker]]) at times of high anxiety - we are all creatures with fragile mentalizing - this understanding is at the heart of AMBIT's stress on the requirement for the [[Keyworker well-connected to wider team]] - we recover our mentalizing in presence of a mentalizing colleague.
!!More material
Please see [[Affective mentalization]] for further explanation of the relationship between mentalizing, attachment and affect regulation.
Please see also [[Developmental considerations|Developmental Considerations]] for detail on brain development and mentalizing.
Although the various linked theoretical frameworks ( [[Attachment theory]], [[Mentalization]], [[Biology]], [[Psychodynamic theory]], [[SocialCognitiveTheory]], [[Social Ecology]] and SystemsTheory) are quite disparate, we see each of them as contributing an essential element of the basis of intervention.
They can be integrated within an understanding of adolescent psychiatric crisis as something that occurs in relation to two developmental processes specific to adolescence.
#[[Separation]] from the family of origin, and the concomitant adjustment to integration into new social systems.
#[[Neurodevelopment and adolescence]] - brain development in adolescence is only recently becoming clear, following the invention of new ways of imaging the brain.
!Brain changes in the adolescent - TED talk by Professor ~Sarah-Jayne Blakemore (UCL)
<html><iframe src="https://embed.ted.com/talks/sarah_jayne_blakemore_the_mysterious_workings_of_the_adolescent_brain.html" width="560" height="315" frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></html>
!Adolescence, the brain, culture, violence and the role of therapy including AMBIT
A great short talk by Martin Debanne (Geneva and UCL) from the ESCAP conference in Madrid, July 2015, that puts into context why we might be right to worry about the //context// in which young brains are developing, and what is the point of therapeutic approaches like AMBIT in intervening:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/o9t_BAZanQY?rel=0" frameborder="0" allowfullscreen></iframe></html>
!Adolescence: a mindfield
Video (requires Flash) of a public lecture about the developmental aspects of Adolescence given by Dickon Bevington at the Anna Freud Centre (November 2011) here:
<html><object id="media_player1321608581" width="400" height="280" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="https://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"><param name="FlashVars" value="config=https%3A%2F%2Fwww.ucl.ac.uk%2Fstream%2Fmediaplayer%2Fjwplayer%2Fconfig%2F2011%2F11%2Fconfig_mmsup_reavmau_20111117_the_adolescence_mindfield.xml&width=400&height=280&controlbar=bottom&stretching=uniform"><param name="movie" value="https://www.ucl.ac.uk/stream/mediaplayer/jwplayer/player.swf"><param name="allowScriptAccess" value="always"><param name="allowFullScreen" value="true"><param name="quality" value="high"><param name="bgcolor" value="#000000"><embed type="application/x-shockwave-flash" pluginspage="https://www.adobe.com/go/getflashplayer" name="media_player1321608581" width="400" height="280" flashvars="config=https%3A%2F%2Fwww.ucl.ac.uk%2Fstream%2Fmediaplayer%2Fjwplayer%2Fconfig%2F2011%2F11%2Fconfig_mmsup_reavmau_20111117_the_adolescence_mindfield.xml&width=400&height=280&controlbar=bottom&stretching=uniform" src="https://www.ucl.ac.uk/stream/mediaplayer/jwplayer/player.swf" allowScriptAccess="always" allowFullScreen="true" quality="high" bgcolor="#000000" ></embed></object></html>
!Multiple Burdens
Commonly, the developmental trajectory of adolescents (particularly those targeted by AMBIT) is weighed down by MULTIPLE burdens: for instance [[ADHD]], Learning Difficulties, Abuse, Neglect, Bullying, Conduct Disorder, [[Substance use]], etc...
These can be summarised by the two words [[Complexity]] and [[Comorbidities]] and the phrase [[Hard to reach]].
These different burdens collectively weigh down the adolescent's development trajectory. Imagine adolescence is the last 100m of the runway; there are real obstacles at the end of the runway - not houses, but skills and competencies (literacy, basic social skills, etc) that, if you haven't got them by the age of 18 - 21, are likely to leave you disadvantaged for the rest of life. Even though individually these separate burdens may not be dramatically severe, it is often the //cumulative burden// of all of them that pushes the trajectory dangerously off course:
<html><iframe src="https://docs.google.com/present/embed?id=d6h2gb4_779dx2vg5fp" frameborder="0" width="410" height="342"></iframe></html>
Document the Child Developmental history via [[Make or View Client Notes]].
Developmental history may give us clues about early brain development that might have had an impact on the development of later problems. Sometimes it gives important information about conditions that may have been missed, such as Autistic Spectrum disorders or neurodevelopmental disorders such as [[ADHD]]. There may be important information about cognitve abilities (intelligence), etc.
There is further information about [[Developmental Considerations]].
!Ask about:
*Physical problems during pregnancy, at or around birth
*Temperament as an infant and toddler
*Relationship to mother/other carers
**Separations - how did child react to going to childminders/play group/starting school?
**Reunions - how did the child react when the carer returned?
*Early milestones (walking, talking, smiling, etc) - parents may not remember precisely WHEN something happened but they generally remember if something was amiss...
*Early social interactions (sociable, invited to other children's birthday parties? or a loner, unable to share and take turns?), early play and habits...
*Play as a young child (did they use make-believe? Did they use toys to represent the things 'in real life' - a car as a car, or a doll as a person - or did they just line them up and use them as 'objects'?)
<a class="tc-float-right">[img width="150" [dickon manual.jpg]]</a>
!!!AMBIT Consultant
Dickon Bevington MA MBBS MRCPsych PGCert (Adolescent Addiction Studies) is a Consultant in Child and Adolescent Psychiatry in the NHS in Cambridgeshire, and is Medical Director at the [[Anna Freud National Centre for Children and Families]]. As one of the original [[Authors]] and (with [[Peter Fuggle]]) co-founders of AMBIT, Dickon now acts as a consultant to the [[AMBIT programme]] and delivers training, consultation and supervision widely. In his NHS work he specialises in the outreach treatment of complex, risky and hard to reach young people with substance use disorders and has previously worked in Adolescent inpatient hospitals. He led the development of online wikis as treatment manuals, and alongside the first [[book on AMBIT|Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]] his previous publications include co-authorship of ''"What Works for Whom? A critical review of treatments for children and adolescents"'' (Fonagy et al, Guilford, 2014) and various chapters and peer reviewed papers. With Prof Carla Sharp he is co-author of [["Mentalizing in Psychotherapy: a guide for practitioners"|Sharp, C. and Bevington, D. "Mentalizing in Psychotherapy: a guide for practitioners" Guilford, 2022]] (Guilford, 2022)
<div style="clear:both;line-height:0px;"></div>
!!MST & AMBIT
AMBIT acknowledges the influence of many existing therapies on its development. MST is one such influence.
In its assertive outreach focus, tailored multimodal interventions, and single keyworker practice, there are clear similarities with Multisystemic Therapy (MST), another manualized outreach intervention for complex youth.
The research evidence for MST is much more advanced (Ogden, T., & Hagen, K. A. (2006). Multisystemic treatment of serious behaviour problems in youth: sustainability of effectiveness two years after intake. Child and Adolescent Mental Health, 11, 142-149). However, the evidence for effectiveness for MST outside of the centres where it has been developed is somewhat less strong, and cost effectiveness studies are not unambiguous in supporting it Vs. usual care that is treated with care.
!!In our view AMBIT and MST differ in the following ways
* Firstly, AMBIT uses different methods of practice, in which mentalization is the primary organising principle, providing the integrative framework, as well as the therapeutic "stance" and one of the range of [[Specific interventions]] included
* AMBIT proposes a positive focus on the therapeutic relationship between child and keyworker. MST places very little emphasis on the quality of the therapeutic relationship between worker and child, and its main interventions are predominantly Cognitive and/or Behavioural.
* AMBIT has significantly fewer exclusion criteria, orienting itself pragmatically to whole service provision as much as to treatment integrity for a tightly defined caseload.
* From an organisational perspective, there is less prescription about organisational structure, and an explicit emphasis on assuming, building upon, and integrating with existing strengths within the local service ecology. MST places a high degree of emphasis on fidelity to their treatment model.
* AMBIT takes an [[OpenSource]] approach to the development and sharing of knowledge and learning. MST is a more conventional closed model with high levels of control over the content and dissemination of manuals and materials. AMBIT's wiki-based treatment manual is more than a reference text, but is a freely-available open-source web-based multimedia document that includes all our [[AMBIT Training]] materials as they are developed.
* MST stresses fidelity to a single model of practice, whereas AMBIT actively eschews the idea of "AMBIT teams" and instead invites local teams to consider themselves [[AMBIT-influenced]] - but focussed on developing local learning and expertise and locally-relevant improvement measures. Hence local teams are encouraged to adapt there own local version of the AMBIT manual, co-authoring their own locally-attuned versions of the manual, albeit within evidence-based parameters (www.tiddlymanuals.com).
* We expect that AMBIT can be provided with lower training and running costs.
Some commissioners and service providers may be looking for ways to adapt local services rather than purchase a self-contained team and support services. There may also be advantages in relation to implementation costs, although AMBIT does not have first order evidence of effectiveness or downstream cost effectiveness in the way that MST plainly does. In these circumstances, notwithstanding the strength of evaluations supporting the likely effectiveness of MST, we suggest that AMBIT may be a useful addition to the menu of service options.
!!Trials - need a control?
As a method that, in many ways, seeks in systematic ways to document and develop best practice in effective local teams, AMBIT welcomes the opportunity to act as "Treatment as Usual" in any Randomised Controlled Trials of other manualised treatments! We promise to learn from any shortcomings in our model revealed from such trials, and the model - designed as it is to grow and adapt - will do so.
! Video introduction
There is a [[Video introduction to disintegration]] as the idea of [[Dis-integration]] is used in AMBIT.
!What is Dis-integration?
Just as, for any //individual client//, there are different domains and levels of //dysfunction// ("from the molecular to the political") which help us to consider how and where to direct our therapy interventions, so there are different [[DOMAINS and LEVELS of dis-integration]] in the care-network, within which different Dis-integrativeProcesses are always active.
!They are inevitable!
Just as the theory of [[Mentalization]] suggests that misunderstandings are inevitable in human interactions, so some level of dis-integration will //always// occur in any multi-disciplinary or multi-agency network. We take it for granted that this is the case; rather than 'setting ourselves up' for disappointment or irritation with this feature of the work, which would cloud our capacity to work with this, we direct effort //proactively// (see [[Active Planning]]) towards diminishing the harmful effects of such dis-integration.
Unchecked, these processes prevent well-intentioned interventions from 'joining up' in a coherent way, and undermine their effectiveness.
One of the [[Core Features of AMBIT]] is therefore [[Addressing Dis-integration]] - which involves ''identifying'' and acting to ''minimise'' these dis-integrative processes.
!Interventions - the [[Dis-integration grid]]
Using the "~DIS-INTEGRATION GRID" is an important part of our [[Multi-Domain Assessment]], or can be used at any time that Dis-integration is identified as a barrier to progress.
The [[Dis-integration grid]] is designed to identify where different interventions that are being delivered to a young person or their carer are 'pulling in oppositie directions'.
Examples of the dis-integrative processes occurring at different LEVELS are described for each of the DOMAINS listed here:
#[[Dis-integrative processes in an Individual Clinician]]
#[[Dis-integrative processes in a Multi Disciplinary Team]]
#[[Dis-integrative processes in a Multi-Agency context]]
#[[Dis-integrative processes in a Family/Systemic context]]
This is the term that AMBIT uses to help make sense of the challenges in [[Working with your NETWORKS]], and describes the experience of people and systems that (usually despite their best intentions) fail to coordinate, or to collaborate, effectively around the shared intention of helping a client, their carers, or their helping network.
* ''AMBIT seeks to 'reframe' expectations'' of professional helping networks, so that rather than seeing dis-integration as a mark of failure (which may often be attributed to personal shortcomings of the personalities involved) we see it as completely inevitable - the //"natural resting state of complex, multi-professional and multi-agency networks"//.
* ''AMBIT recognises that Dis-integration is often experienced as highly frustrating'', worrying, hurtful or puzzling by workers - who bring personal commitment to their work, and who may experience this as somehow being undermined, undervalued, or overruled.
* ''This inevitably makes us feel upset, and this inevitably challenges our own capacity to mentalize'' the minds involved in this dis-integration; we become non-mentalizing about our professional peers just at those times when the network (and the clients we serve) could benefit from our mentalizing.
* ''A key principle of AMBIT'' is thus [[Taking Responsibility for integration]]
* ''The work'' of [[Addressing Dis-integration]] offers a number of approaches and mentalizing techniques that teams have found helpful.
''Other ways of exploring the same or overlapping territory'' that may be familiar to some workers include the terms: "Splitting" and the "Coordinated Management of Meaning"
* Divide into two's or three's - preferably with people whom you have worked with, or who know a particular case that has proven complicated.
** If you don't all now the same case, don't worry.
** Those who do not know the case can still act as inquisitive mentalizers.
* Pick a complicated case, or one that just feels "stuck".
** The exercise works best if the case is //genuinely// one that has got stuck, or complex.
** The exercise works best if it is a "live" case rather than a historic or fictionalised one.
* Spend 5 minutes presenting the bones of the case
**see [[Stating the Case]] in [[Thinking Together]] for advice on this.
* Next, on a large sheet of paper draw out the [[Dis-integration grid]].
** Fill it in together for the next 10 minutes:
** Note what you //know// about what other parts of the system believe to be "the problem", what "to do", and "who should do what".
** Note what you //don't really know//
* For the final 5 minutes, ''identify where some of the 'sticking points' seem to be in the network. Who might need to talk to whom and about what? do you have any influence over this? Identify 2 or 3'' "[[Connecting Conversations]]" that the keyworker can commit to trying to "broker" in the coming week.
<center>{{Grid Pic.jpg}}</center>
The Dis-integration Grid is a downloadable tool for exploring and planning how to go about [[Addressing Dis-integration]] in the wider network.
This tool supports the worker (and client or family member) to [[Mentalize|Mentalization]] the different parts of the wider network of support.
It supports two particular elements from the stance of the ''Core Features of AMBIT'':
[[Respect local practice and expertise]]
and
[[Taking Responsibility for integration]]
!!''Training''
You can find one of our [[Training exercises]] to practive this at [[Dis-integration Grid EXERCISE]].
!!''The Dis-integration grid:''
You can download this as a PDF file from [[here|https://docs.google.com/file/d/0B5h_CVBdhJPYOEpMRXZJd3E5V3M/edit?usp=sharing]]
{{Dgrid.PNG}}
!!''Using the grid''
The dis-integration grid is the basis of a simple brief exercise to
map out the understandings of everyone’s perspectives within a particular network around a client.
The worker does not require a proper form and might, for instance, draw up a grid on "the back of an envelope" during a meeting.
The grid invites the practitioner to map out and to ''[[Mentalize]]'' the network.
Firstly, we name the key people around the client (The network should include parent/carer). Secondly we use the grid to consider where are the areas of agreement and disagreement within the network?
We do this by asking ''three questions from the perspective of each person in the network''. This is the workers'//best guess//
of what //they think others think//.
The three questions are:
# ''What is the problem?'' (why is it happening?) - Looking for difference/dis-integration around the explanations/theories people hold
# ''What to do?'' (what could help this problem?) - Looking for dis-integration/difference around practice
# ''Who does what?'' (who should be helping with this problem or possible solution?) - Looking for disintegrations/differences in the wider system around understandings of people's responsibilities
NB Sometimes we realise we don’t actually know the
answer in some of these areas, which can be helpful to identify in itself.
!!''Finding the Connecting Conversations''
When filling in the grid, the keyworker will particularly be asking themselves...
*Where are the 'sticking points' in the network?
*Who may need to talk to whom and about what?
*Which parts of this picture can I influence, even if only a little?
So, the point of systematically mentalizing the different positions in a network is to spot the crucial few ''key conversations'' that need to occur between different parties within a care network in order to reduce dis-integration and increase integration where we can.
We call these ''Connecting Conversations''
So, having completed the grid, the keyworker considers:
#What ''Connecting Conversations'' (probably no more than two) might help the network to work better?
#What could I do to //facilitate// such conversations - so as to maximise the likelihood of improved understanding of roles and responsibilities?
!!''Additional information''
Please see [[Addressing Dis-integration]] for more explanation of the problem that this "back of an envelope" tool is designed to address.
This 2-part video gives a 40 min explanation on Addressing Dis-integration and using the Disintegration grid
<html><object width="640" height="480"><param name="movie" value="https://youtube.com/v/tOPf5IaNlvc?version=3&hl=en_US&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/tOPf5IaNlvc?version=3&hl=en_US&rel=0" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
<html><object width="640" height="480"><param name="movie" value="https://youtube.com/v/sS11nRVtf8Y?version=3&hl=en_US&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/sS11nRVtf8Y?version=3&hl=en_US&rel=0" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
if you would like to read more about ''dis-integration processes'' and ''Connecting Conversations'' you can find these topics in <<tag [[Extended learning]]>>
!!''Feedback from AMBIT-influenced teams (2014)''
>>"Disintegration grid has really helped in working with partner agencies and ensuring we identify when there are differing goals in the network. Also has helped greatly in understanding viewpoint of young person and family."
>>"Disintegration grid has been v useful. We are developing a network protocol to help us recognise familiar situations and to have a written aide memoir of things to do and consider."
!What the problem
@@color:red;[Enter text] @@
!What to do
@@color:red;[Enter text] @@
!Who should do it
@@color:red;[Enter text] @@
!!{{$:/images/fa5/solid/comments}} Dis-integration grid activity
<a class="tc-float-right">[img width= 350 [Grid Pic.jpg]]</a>
[[Click to download a blank dis-integration grid|https://drive.google.com/file/d/1n-0S354s4UvWTS-6jen9r1gijTyQKqXH/view?usp=sharing]]
''Step 1: Complete the dis-integration grid''
* In your pairs, complete a grid for a network that you are currently involved in where there might be a difference in perspectives that you want to understand better
* List the names of the client and relevant family members along the top, as well as the different key professionals involved (include yourself!)
* Start filling in the grid with your best guesses
* Sometimes we realise we don’t actually know the answer in some of these areas, which is also helpful to identify.
''Step 2: Identify connecting conversations''
* Now review your grid
* What have you learned from filling it in?
* What level of disintegration do you think needs addressing?
**Problem level - how people make sense of what the problem is
**Intervention - what people think needs to be done
**Responsibility - who people think should be doing each intervention
*What steps could you take towards addressing this?
**What might help to create more shared agreement or understanding?
**Who needs to talk to who about what?
!!{{$:/images/fa5/solid/clock}} 20 minutes
You have 20 minutes for this activity. Return to the group call when you are finished.
A wide range of different Dis-integrativeProcesses are encountered, operating in different [[DOMAINS and LEVELS of dis-integration]] - in this case the family and wider systemic context.
Some examples are given here, but this is in no way an exhaustive list: plotting the processes at work for a patient, using the grid below, is an important exercise for Keyworker and Team to practice.
At a ''Conceptual Level'' a family may locate the cause of the problem within their child, whilst onlookers would instead see parental [[Domestic violence]], or drug abuse, as the core problem (for which the child's behaviour could be interpreted as acting as 'cry for help'.)
At a ''Practical and Skills Level'' a family may manage differences and conflict with high Expressed Emotion, demonstrating a high frequency of denial, blame, and intrusiveness.
At the pragmatic ''Service Delivery Level'' a family may demonstrate ambivalent engagement in the project of seeking and accepting help, failing to support their child to engage with his or her Keyworker.
These are just a few examples and others can be found. See also Dis-integrativeProcesses.
See the [[Dis-integration grid]]
A wide range of different Dis-integrativeProcesses are encountered, operating in different [[DOMAINS and LEVELS of dis-integration]] - in this case the Multi-disciplinary Team (MDT.)
A few examples are given below, but this is in no way an exhaustive list: We emphasise that these are just a few examples and many others can be found. Any of these will be coloured by interpersonal relationship styles and [[Individual Differences and Disagreements]] between workers. Plotting these processes at work, coming to more accurate mentalizing of the different members of a team (using the [[Dis-integration grid]] is one way to help this) is an important exercise for any Team to practice. See also Dis-integrativeProcesses.
!!!What's the problem?
Amongst these, at a ''Conceptual Level'' the MDT may find there is a lack of agreement as to the core problem(s) and fail to support a coordinated treatment plan. For instance there may be a split between individuals holding a view that "this behaviour is driven by poor conduct" and others maintaining that a neuropsychiatric process is complicit.
!!!What to do?
At a ''Skills and Practice Level'' there may be inaccurate beliefs about the practices that different team members implement. If a Social Worker believes that a doctor could only intervene with //medication//, then he may be less inclined to refer an anxious suicidal adolescent.
!!!Who does what?
At a pragmatic ''Service Delivery Level'' authority and decision-making processes within the team may not be consistent with the clinician's [[Formulation and Treatment Aims]] - for instance if an emergency psychiatric admission can only be requested by the team doctor, then treatment recommendations following the keyworker's on-the-spot assessment may suffer delays until the team doctor can be available to repeat this assessment.
A wide range of different Dis-integrativeProcesses are encountered, operating in different [[DOMAINS and LEVELS of dis-integration]] - in this case the multi-agency context.
Some examples are given here, but this is in no way an exhaustive list: plotting the processes at work for a patient, using the grid below, is an important exercise for Keyworker and Team to practice.
At a ''Conceptual Level'' there may be subtly biased feedback mechanisms at play, influencing the way that a team collectively remembers what another agency does, or how it performs. For instance, a team may develop the habit of recalling to each other particular cases where things did not go right, but failing to make conscious note of the many 'silent successes' that may have followed this. Such a process leads to problems at the next Level...
At a ''Skills and Practice Level'' there may be a lack of knowledge about, or a failure of the team's capacity to 'take a perspective' on the work a different agency, which would lead to referrals not being made, or unhelpful rivalry and conflict between professionals.
At a ''Service Delivery Level'' there may be direct contradicitons at the level of Policy. For instance, a Youth Offending Service may see its principal role as keeping young people out of the criminal justice system, whilst a mental health practitioner working with a chaotic and extremely high risk heroin-injecting teenager may see the temporary incarceration of his patient in a young offenders unit as the only practical way to keep that young person alive and organise a detox. Another example of service-delivery level dis-integration is the potential for struggles between agencies over limited resource allocations.
These are just a few examples and others can be found. See also Dis-integrativeProcesses.
A wide range of different Dis-integrativeProcesses are encountered, operating in different [[DOMAINS and LEVELS of dis-integration]] - in this case the individual clinician.
Some examples are given here, but this is in no way an exhaustive list: plotting the processes at work for a patient, using the grid below, is an important exercise for Keyworker and Team to practice.
Amongst these, at a ''Conceptual Level'' the individual clinician may find that he or she has only a partial formulation (see [[Formulation and Treatment Aims]]) of the problem, that doesn't adequately fit the clinical problem (attributing it to psychotic symptoms, without including the major disruption caused by an alcoholic parent, for instance.)
At a ''Practice/Skills Level'' the clinician may find he or she uses //favourite// skills rather than skills that are best suited to addressing the problem (delivering CBT and working with medication, for instance, while omitting to work with the family to empower them to assist with mainaining treatment adherrence.)
At a ''Service Delivery Level'' it may be that the available therapeutic resources do not fit with the model of therapy; there may be unmet need as regards provision of the level/intensity of input required to support the young person to remain at home on account of the keyworker's caseload.
These are just a few examples and others can be found. See also Dis-integrativeProcesses and the [[Dis-integration grid]].
Integrated practice starts from a position which places a high value on //the relationships between different parts of a system// and attempts to either emphasise coherence between different parts of a system or to make explicit conflicts or contradictions which may exist in a system.
Integration does not make an assumption that all conflicts and contradictions within a system can be resolved and that an individual practitioner or a clinical team may need to tolerate high levels of contradiction in wider systems as part of efforts towards greater integration.
Integrated practice can often be presented as if this is assumed to be the 'normal position', and that it can readily be achieved in designing a service system. However, practitioner experience suggests that specific 'helping' systems around troubled families and young people routinely include complex conflicts and contradictions which nobody has intentionally set up. In our view, practitioners often experience systems around a young person as routinely appearing to be 'disintegrated' (see [[Addressing Dis-integration|Addressing Dis-integration]] ).
The aim of this section is to provide a framework which is accepting of this situation and tries to offer a way of making sense of dis-integrative processes around a family or young person.
In this framework, disintegrative processes are seen within the context of different Domains, and at different Levels. Common dis-integrative processes are:
#Conflict (implicit, unrecognised)
#Rivalry
## This may be more acute in times when contracts for work are placed out to tender, so that other agencies working with the same young person //may// be "in the running" for the tender for "your" agency's work.
#False beliefs:
##These are the kinds of "mythologies" about other agencies in a network that easily arise as a result of the kind of biased feedback that every worker/agency is subjected to.
##Young people don't arrive at "my" service unless other services have "failed"
##Young people often unconsciously provoke active engagement by their workers by criticising //other// workers who have failed to help them in the past
#Policy contradictions
#Financial constraints
We promote a //pro-active// stance towards [[Addressing Dis-integration]] - chiefly using the [[Dis-integration grid]] as a tool to support this.
This is the freely available ([[Licensed]] for free access and distribution within certain limitations) manual for [[AMBIT]], or Adaptive ~Mentalization-Based Integrative Therapy.
[[AMBIT Training]] is recommended for any users, ''who remain responsible for their own practice at all times'' - the AMBIT project and AFC cannot and do not accept any liability for individual or team practices carried out in clinical settings.
!By going further into this manual
You are agreeing that...
>//''"1. I have understood the rules about DataSecurity, and agree to abide by these. I am responsible for the security of any data about my client."''//
>//''"2. I understand and accept the restrictions on my use of the content in this manual, in keeping with its Creative Commons [[Licensed]] status."''//
!!Making Changes (editing content)?
The website is password protected, so you cannot alter the main template on the web without authorisation and a password. The content is all openly accessible. Any edits made to locally-owned versions are the responsibility of the local editor/team, and the [[AFNCCF]] or AMBIT programme team cannot be held responsible for content that is uploaded to a local version.
!![[Disclaimer]] regarding use of AMBIT content and resources in clinical settings
Users always remain responsible for their own clinical practice. Before using the content and resources in this manual and [[AMBIT]] in clinical settings, practitioners are advised to receive [[AMBIT Training]].
!!Learning Objectives
1. To be able to mentalize how other network players might see your service, and why
2. To understand the ways in which we sometimes hold non-mentalized positions in relation to other services and professionals in the network
3. To make plans as a team to introduce means of supporting one another to maintain positions of respect for the local practice and expertise of other agencies
!!AMBIT Competency/s covered ([[AMBIT Full Competency Framework]])
Competency 5: Ability to apply mentalization to work across agencies and see problems from multiple institutional standpoints
!!Required materials:
*flipchart paper
*pens
*hats displaying the names of different agencies, if available
!!Exercise
Discuss in small groups:
1. Small group discussion: What stories do other agencies hold about our service? e.g. CAMHS, GPs, social care, schools, youth service
(Note: this is our best guess - we can only mentalize. What do we //think// other services think about us?)
[img[Wearing different hats.jpg]]
Take feedback.
2. Small group discussion: What stories do we hold about other services? What are the things we frequently find ourselves saying about certain services/disciplines?
[img[Wearing different hats2.jpg]]
Take feedback.
3. Facilitate group discussion on the following questions:
*How are these stories born?
*Are they accurate?
*Or are there other ways to understand the behaviour of other services?
4. Small group discussion: Are there a couple of team and individual actions you could set yourself to protect against inaccurate/generalised ideas about other services? Are there are a couple of team and individual actions you could set to help other services and disciplines to better understand you?
Take feedback, manualizing the team's plan
Some ideas for supporting teams to maintain respect for local practice and expertise:
*Stance cards in meetings - having a "respect for local practice and expertise" monitor
*Giving one another permission to intervene if you notice a colleague getting in to non-mentalized positions about other professionals or services
*When you notice you are cross with another service, let this be a cue to remind you that it can be hard to make sense of (mentalize) other services when strong emotions are around - use a colleague to help you try to make sense of what might be going on.
*Local networking events.
*Broadcasting intentions - in meetings, conversations, written correspondence with other agencies
!!Variation: wearing different hats
1. Generate a list of 3 or 4 agencies commonly worked with by the team
2. Split the group into 3 or 4 smaller groups, allocating one of the commonly worked with agencies to each group. Participants are given hats to wear displaying the name of this agency
3. Each group thinks about stories their allocated agency holds about the team being trained.
Ask each group to present their thoughts back to the wider team.
4. Continue as per steps 3 and 4 in the exercise above
!!Trainer's notes
Points to emphasise in group discussion:
*This relates to one particular aspect of the AMBIT stance feature [[Respect local practice and expertise]] which relates to developing a deliberate team culture of avoiding polemic positions in relation to other agencies and disciplines
*It can be helpful to remind ourselves that ''Dis-integration'' is inevitable and to start from the assumption that other agencies are well-intentioned in their actions
*We often get biased feedback about other services (e.g. young people only talk to us about the police when they have been upset by them. Or clients may work to get us "on side" by telling us how rubbish their last social worker was)
*Efforts towards better mentalizing of network professionals should not be confused with excusing practice or behaviour that is not okay. Sometimes we are right to question the practice of others.
[img[https://lh4.googleusercontent.com/-WHgi7Bo5YOQ/US9d72FvokI/AAAAAAAAHEw/oqk3A0DWRac/s646/DiveBoatAnalogy.jpg]]
This is an analogy to explain the mentalizing principles of distance-supervision (including "real-time" peer-to-peer supervision) in [[AMBIT]].
We know that [[Mentalization]] is hard to sustain in high-affect //"pressurised"// environments. Imagine the [[Key Worker]] were a deep sea diver entering the pressurized and challenging world of the client; other team members (or a supervisor in a more formal sense) should see themselves acting (and we emphasise that these are often //pro-active// actions) as a //''support team''// on the dive boat above, pumping an "air supply" down to their colleague. In the case of [[AMBIT]], that "air" is the capacity to mentalize.
There is nothing new in the use of a person (or a flexible [[Reflective Quorum]], or a MetaTeam) //''that is, a person or people who are distant from the immediate pressure and affect''// to help with thinking in high pressure situations.
Ideally, such people are //well-known to the [[Key Worker]]// (we refer to one of the [[Core Features of AMBIT]], which is that we seek to produce a [[Keyworker well-connected to wider team]]); remember that [[Mentalization]] arises out of, and is most powerfully supported or recovered in the context of a relationship that provides a [[Secure Base]].
Using flexible mobile techniques - including technologies such as mobile phones, or mobile video-conferencing, and very clear, disciplined procedures (see [[Thinking Together]]) explicitly aims to support practitioners to regain or maintain this capacity.
A related analogy is the [[Ripples in a Pond]].
AMBIT set itself the task of aiming to reduce the number of high cost institutional interventions for children and young people. The aim was to avoid these where these were more a response to service conditions than family and young person needs. The aim was never to eliminate the use of such types of care altogether. It is clearly important that there are situations when a young person needs to come into care, go to hospital, receive a custodial sentence.
Is there any evidence that AMBIT has been helpful in achieving this outcome.
!!!In -patient care
Service reports from the borough of Bexley in London (see [[Using AMBIT to Reduce In Patient Admissions - Sarah Harmon]]) clearly demonstrate a reduction in the use of in-patient care following the setting up of an AMBIT training outreach team which was commissioned to achieve this service outcome. The reduction in hospital use was 50% measured over the previous four years and the subsequent four years of the service being established. (Reference: Bexley commissioner report)
[[Griffiths et al (2016) Evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 CAMHS]] reported that the likelihood of in-patient admission was higher for those who had lower levels of engagement in community based interventions. Those young people who attended less than 80% of their contacts were more likely to have longer treatments and had higher number of admissions although this difference did not reach statistical significance.
[[Daubney et al (2020) - Outcomes of Assertive Community Treatment for Adolescents with Complex Mental Health Problems Who are Difficult to Engage]] reported a reduction in both number and length of admission comparing the 12 month period to setting up the Assertive Community Treatment teams.. For example, average monthly number of nights of admission reduced from 1.36 (2.64) to 0.78 (2.29). This had a medium effect size comparing pre and post rates.
It may be assumed that the creation of outreach teams, independent of the model they follow, may routinely lead to reductions in hospital care. Anecdotally, this seems likely although the evidence for this is more unclear than may be expected.. There is some indication from a report of work on crisis teams in the UK that more established teams may lead to reductions in hospital use over time. But other local service reports have not always been able to show reductions in hospital use. Our current knowledge of the literature for young people does not suggest that reductions in hospital use can be assumed to take place with the creation of outreach provision.
!!!Children coming into care
The evaluation by Talbot et al (2019) ([[Talbot, Fuggle, Foyston and Lawson (2020) - Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years]]) reported an evaluation of a project to reduce placement breakdown and reported successful outcomes for over 80% of cases coming through this programme. The evaluation was not able to show whether rates of entry into care changed as a consequence of the work of this team but the team achieved the objectives set out by those who commissioned the service.
.
!! What Do We Mean by Domains?
Domains are areas in which things occur that can be changed. One of the [[Core Features of AMBIT]] is the requirement that we should always be [[Working in multiple domains]], rather than limiting our work to a single domain.
There is relevant content at [[Advice on setting Treatment Aims and Goals]] in relation to the different domains.
----
!!Sub Pages
Below are the pages that are tagged with 'Domains':
<<list-links "[tag[Domains]]">>
Witnessing violence between members of one's own family is known to exert a very significant impact upon children and young people. [[PTSD]], and [[Attachment]] difficulties, amongst others.
Domestic Violence, if unchecked by the parents, is likely to constitute a form of [[Emotional abuse]] or [[Neglect]] as by definition other peoples' needs (rather than the child's) are being prioritised.
This means that [[Child Protection/Safeguarding Services]] may need to be involved at an early stage. To "turn a blind eye" to these concerns may be seen as a subtle form of //collusion// by a worker.
There are a series of helpful reports, recommendations and research data about this [[here|http://www.ccrm.org.uk/index.php?option=com_content&view=article&id=69&Itemid=79]]
<html><div align="center"><iframe src="http://www.ccrm.org.uk/index.php?option=com_content&view=article&id=69&Itemid=79" frameborder="0" width="100%" height="600"></iframe></div></html>
[img width=100% [ian-dooley-3NCA3tbaE5I-unsplash.jpg]]
!!Visuals
*[[AMBIT Wheel|AMBIT Wheel.pdf]]
*[[AMBIT Wheel- Visual aids for colleagues]]
!!Tools
*[[Egg and Triangle|Egg and Triangle.pdf]] (Active Planning)
* [[Dis integration grid|Dis-integration grid]]
!!Cards
*[[AMBIT playing cards]]
** [[Marking the Task Cards|AMBIT Marking the Task cards]] (Thinking together)
** [[AMBIT Stance Cards|AMBIT stance cards]] (Thinking together)
** [[Usual Suspect Cards|AMBIT usual suspects cards]]
!!Measures
* [[AIM questionnaire - paper version]]
* [[ASEQ- AMBIT Service Evaluation Questionnaire|AMBIT SERVICE EVALUATION QUESTIONNAIRE.pdf]]
* [[APrAT- AMBIT Practice Audit Tool|AMBIT Practice Audit Tool_v.2.pdf]]
* [[AMBIT Knowledge & Skills Questionnaire|AMBIT knowledge and skills questionnaire.pdf]]
* [[AMBIT implementation questionnaire|AMBIT implementation questionnaire.pdf]]
!! Training Slides
<<link-doc "AMBIT Training Slides" "https://drive.google.com/drive/folders/1UvAgQ8G3NQAefWlERpBOzEYUxNgTEOnD">>
!!Videos
* See our ~YouTube channel [[AMBIT.tv|https://www.youtube.com/user/ambitafc/videos]] or look at pages in this menu that contain embedded <<tag Videos>>
----
!!''Copyright''
Remember that these slides remain the copyright of the [[Authors]], and like the rest of the original content of the manual, are released under a Creative commons [[Licence|Licensed]] - please respect the terms of this.
You can view these slides online, or click on the "download" button and download them to your computer as a PowerPoint slideshow. The slides are used as a 'backdrop' for the live training, and are certainly not a substitute for face to face teaching and practice, but may be a useful reminder, or of interest to browsers.
In the AMBIT manual you will also find material on defining Training Needs and a set of [[Training exercises]] that teams may use in Trainings (run from the [[Anna Freud National Centre for Children and Families]]) or in their own locally-arranged events.
!!Welcome to the online AMBIT manual
<a class="tc-float-right"><<ambit-wheel size:490px>></a>
AMBIT is an approach for helping people who have multiple needs and who may have reasons to find it difficult to trust in helping services. It is a whole-team or whole-system approach. It is based around the core theory and practices of [[Mentalization]].
AMBIT supports teams to develop systems of care adapted to their own context, and to what is experienced as helpful by their clients, applying mentalization as the guiding framework across four areas of practice:
* ''face to face work with clients''
* ''between team-members''
* ''across networks''
* ''in fostering a team culture of learning''
AMBIT builds a [[Community of Practice]] which, above all, aims to continue to learn, develop and share more //effective, acceptable and sustainable// ways of working.
AMBIT uses an OpenSource approach meaning that learning and best practice are freely shared. This manual is primarily for WORKERS, however, clients or other interested parties are very welcome to look, too - and some local teams encourage their clients to help them author new material, or improve existing pages.
!!What are you looking for?
<<image-link "User Guide" "download (1).jfif" "User Guide" "300">><<image-link "AMBIT programme" "jehyun-sung-6U5AEmQIajg-unsplash (1).jpg" "Meet the Team" "295">>
The page [[TrainingCore]] provides you with an index of pages which make up the core content of this manual. These pages cover the essential aspects of the AMBIT approach and link to the topics covered in AMBIT Training.
The following links provide you with some AMBIT Basics:
*[[AMBIT: an overview]]
*[[Mentalization]]
*[[AMBIT Training]]
*[[Training exercises]]
* [[Downloadable Resources from Training]]
!!!You may also be interested in...
<<image-link "AMBIT Newsletter" "news head.jpg" "AMBIT Newsletter" "305">>
!!!Current Developments
<<image-link "Evaluating outcomes" "siora-photography-cixohzDpNIo-unsplash (1).jpg" "Evaluating outcomes" "300">> <<image-link "AMBIT Local Facilitators" "neonbrand-zFSo6bnZJTw-unsplash (1).jpg" "AMBIT Local Facilitators" "320">>
!!What's the problem that calls for AMBIT?
Please see here for Dr Dickon Bevington giving a brief introduction to the types of difficulties that an AMBIT approach aims to address.
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/g2bk7sSKD-c" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html></center>
----
''We are working to develop and improve this manual to make it easier to use and as helpful as possible. Please give us [[Feedback|Feedback please!]] on any aspect of the manual.''
If you would like to read a more "linear" story of AMBIT you can find the recently published [[book|Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]] of AMBIT.
!!!''Important Legal stuff''
There are important issues relating to [[Disclaimers, Security and Authorization (Licensing)]] if use this manual. By going on into the manual you are agreeing to abide by the rules laid out.
!!!''Sponsors''
The AMBIT programme is grateful to numerous early [[Sponsors]], including Comic Relief, without whom this freely available resource would not be possible. We still need help to support this OPEN RESOURCE! If you would be happy to donate, visit https://www.annafreud.org or contact the AMBIT programme directly at ''ambit@annafreud.org''
!!Mentalizing Exercise
!!!Equipment
#Paper
#Pens/Pencils/Markers
!!!Steps
* A young person/family members/team members are asked to make a drawing of their current state of mind.
** Adults in particular may be concerned about being 'able to draw' and the therapist/trainer may need to gently encourage them to have a try.
** Similarly the therapist may instead invite everyone in the family to make a drawing of the state of mind of one member of the family.
* The purpose is to invite people //''to reflect on the differences''// between how family members //''perceive''// each others' experiences.
Thanks to Jon Allen
!!Purpose
To revise and emphasise the memorableness of the AMBIT wheel.
!!Ask the team(s) to ''Draw the AMBIT wheel from memory''
* Start with the blank shape
* Can members of the team fill in the blanks?
* Introduce playful competition if appropriate:
** Divide into two teams
** Take it in turns to fill in spaces
** Points for correct wording, points for correct placement
** Subtract points for errors?!
See [[AMBIT Wheel]] for the filled-in version!
>//We shall not cease from exploration, and the end of all our exploring will be to arrive where we started and know the place for the first time.// TS Eliot - the Four Quartets
!!Ending starts at the beginning
It is important that the ending of a young person's therapeutic journey with this team/worker (and planning for this) is made explicit from the very earliest phase of engagement.
!!What ending requires
!!!1. Forwards Planning
*As ending and discharge or transfer comes closer it is crucial to keep communicating this clearly and sensitively to the client, with an emphasis on drawing up plans that will cover the most likely....
!!!2. Pro-active networking and coordination
*[[Building networks and links]]
!!!3. Reporting and Communicating
*[[Report writing and Professional Communication]]
!!!4. Rehearsal and Practice
*Crisis Contingency Planning- Contingencies are things that happen in response to particular sets of circumstances: "If John becomes aggressive beyond simple verbal abuse, then the Police are to be called".
*Contingency plans are about what to do if, IN SPITE OF OUR RISK MANAGEMENT PLAN, an untoward incident occurs...N.B. This is slightly different from intervention plans that we draw up in the Care Plan to AVOID predictable risks.
!!!5. A "long tail" - boundaried ways of sustaining interest.
*Rather than a fixed and final discharge date, in ''some'' cases a more graded withdrawal is helpful. A "long tail" of closely-boundaried and gradually diminishing contact can also help to support new attachments - especially if such contact is via the "new" attachment that is being fostered and developed.
We think that locally developed and delivered training sessions are likely to be at least as effective as sessions delivered by "experts" whose experience may be far distant from the realities of face to face clinical work, from the cultural specificities of a particular team's setting, etc. This is in keeping with our understanding of [[Epistemic Trust]] and the [[Community of Practice]].
Refer to the many [[Training exercises]] documented here, but create trainings that are tailored to the the needs of YOUR workforce, speaking to //their// condition. Some teams will want more [[Theory]] but others will want more [[Practice]]...
The following is a suggested framework for training sessions with five steps. The degree to which each of these steps applies to particular training sessions will vary.
!!!1. Agreeing the task
This section should be brief but should ensure that the learning and training objective of the session is clear and agreed with the group. It is useful to draw out any worries about the task both as to whether it is relevant, already known about or other issues.
!!!2. Explaining or demonstrating the training task
This can be done in a range of ways, either through some didactic teaching (or use of video teaching in the manual) or by showing material in a creative way or through role play.
!!!3. Practice
All training sessions should provide the group to have a chance to work with the new material. For more knowledge based tasks, this may involve small group discussion etc. For skills, the group should be given a chance to practice the skill itself
!!!4. Reflect on what has been learnt
This may overlap with practice in some cases. But for skills based learning, it is often important to enable the group to consider their different experience of practicing the skill and to consider its relevance to their day to day work.
!!!5. Manualizing
The key principle in AMBIT is to consider how a particular skill or piece of knowledge is adapted to each local service. The process of manualizing is a process by which this is considered and local adaptations are made explicit with the possibility of further revision in the future.
There are notes from the Royal College of Psychiatrists to aid assessment, and some links to other material in this manual below the BMI calculator, as well as a link to the [[NICE Guideline - Eating Disorders]] to help shape interventions.
!Assessing the problem - Body Mass Index (BMI):
----
[[Here|http://www.nhs.uk/tools/pages/healthyweightcalculator.aspx?WT.mc_id=101007]] is a link to a calculator for BMI (Body Mass Index), or see it below:
<html><object width="564" height="522"><param name="movie" value="http://media.nhschoices.nhs.uk/Tools/Documents/bmi_v2.swf"></param><param name="allowFullScreen" value="true"><param name="flashvars" value="XMLpath=http://media.nhschoices.nhs.uk/Tools/Documents/"></param></param><param name="wmode" value="transparent"></param></param><param name="quality" value="high"></param><embed src="http://media.nhschoices.nhs.uk/Tools/Documents/bmi_v2.swf" type="application/x-shockwave-flash" flashvars="XMLpath=http://media.nhschoices.nhs.uk/Tools/Documents/" wmode="transparent" allowfullscreen="true" quality="high" width="564" height="522"></embed></object><p class="c1"><a style="font-size:0.8em; font-family:Arial" title="BMI healthy weight calculator" href="http://www.nhs.uk/tools/pages/healthyweightcalculator.aspx">BMI healthy weight calculator</a><br /><br /><a title="Go to NHS Choices homepage" href="http://www.nhs.uk"><img alt="Go to NHS Choices homepage" src="http://www.nhs.uk/NHSChoices/images/nhschoices-logo-syndicated.gif" width="210" height="44" border="0" styling="margin:0;padding:0" /></a></p></html>
!About the problem:
----
<html><div align="center"><iframe src="http://www.rcpsych.ac.uk/expertadvice/problemsdisorders/anorexiaandbulimia.aspx" frameborder="0" width="100%" height="600"></iframe></div></html>
!What to do:
----
!!!(a) Check for risks to physical health
* Eating disorders have a significant mortality, so proper assessment by an expert is necessary - access this via the General practitioner as a first "port of call" if a doctor is not available to your team.
* If there is significant purging (client is making their self sick multiple times per day) then they will need an urgent medical (physical) check-up as this can be very risky (heart conduction problems, even leading to sudden death due to the imbalance of salts in the bloodstream.)
* If the Body Mass Index is at a dangerous level (check it using the calculator above) then they will need an urgent medical check up, too. This too can cause sudden death, or collapse as blood pressure falls at low weights, and the heart muscle itself wastes.
!!!(b) Interventions
* There is a helpful [[NICE Guideline - Eating Disorders]].
* Below is a link to the NICE recommendations about Eating Disorders pathways:
<html><div align="center"><iframe src="http://pathways.nice.org.uk/pathways/eating-disorders" frameborder="0" width="100%" height="600"></iframe></div></html>
* Given ''appropriate specialist guidance'' (use [[Thinking Together]] to consult with a senior colleague if you are unsure of this) and monitoring, there are three interventions for Eating Disorders that are relevant and have a strong evidence base for use in Anorexia, general versions of which are included in this manual:
** [[Motivational Work]]
** [[Cognitive Behavioural]] therapy
** [[Family Work]].
* If the condition is serious, then work in this field MUST be carried out with proper expert supervision, given the known risks to these clients.
** In addition, [[MultiFamilyWork]] and a range of [[Social-Ecological Work]] interventions have been used and tested, with encouraging evidence, and are likely support this work (though generally as supportive "augmentation" to the more powerfully-evidenced interventions given above).
!!!(c) Expert support
We reiterate that although Eating disorders in their milder forms are very common, they are potentially very serious conditions, and having early recourse to expert advice is strongly recommended.
There have been some experiences of users losing pages due to poor internet connection. In the absence of internet connection the manual is unable to connect back to the server where everything is stored. There have been incidents where pages have //appeared// to save but have ''//not //''saved because the manual was unable to connect back to the server.
There has been a lot of work to correct this. There is now a cloud symbol (under the subtitle of the manual, right sidebar) that goes red with a circling arrow to show that "the manual is trying to save" - when it has done so successfully, the cloud turns grey with a small "tick" in it.
[img[SaveCloudicon.jpg]]
!!Don't lose your work!
To defend against losing any work, if ''ANY ''error messages appear we would advise users ''NOT to refresh the browser UNTIL'' they have first copied any new text they've added/changed and pasted this into a separate document (a Word document, or notepad, etc... anywhere from which you can later cut and paste it back into the manual once it is connected to the internet again). The [[error messages|Error messages]] usually look something similar to this:
[img[Error.png]]
or
{{Captureerror.PNG}}
If refreshing the browser does not seem to defer the error messages and they keep appearing, we would advise copy and pasting any edits that you have made in the session to a Word Document, where you should finish your editing and transfer your work to the manual after the session.
Although this is not ideal, we really do not want teams to lose pages as we know these sessions can be extremely valuable.
!!!How to edit & delete tiddlers
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/KxGKCOEu3hk" frameborder="0" allowfullscreen></iframe></html>
There is strong evidence that young people who are NEET (Not in Education, Employment or Training) are at significantly higher risk, and have poorer outcomes than those who have structured, gainful employment.
Document under this heading what school, or course(s) a young person is enrolled on, or what employment (part time? full time?) they have. Try to gain a sense of the extent to which they are //engaged// in these settings. If the young person is agreeable to this, it can be very helpful to make contact with a trusted member of staff (if there is one) - or, if not, to have a "virtual" conversation:
>//"So if Mr X was here, just imagine he was really calm, and really had his most helpful 'hat' on - what do you think he would want me to know about you at school, so that I could use that knowledge to help you better?"//
<html><div align="center"><iframe src="https://docs.google.com/Doc?id=d6h2gb4_533f69cntdc" frameborder="0" width="100%" height="600"></iframe></div></html>
<html><div align="center"><iframe src="https://docs.google.com/Doc?id=d6h2gb4_532fh2nwpf2" frameborder="0" width="100%" height="600"></iframe></div></html>
<<tabs MultiFamilyTabs
"Principles" Educational-VocationalPrinciples Educational-VocationalPrinciples
"What you need" Educational-VocationalComponents Educational-VocationalComponents
"What you do" Educational-VocationalStructure Educational-VocationalStructure>>
!Core Components of the ~Educational-Vocational programme
The following are the ideal components of the ~Educational-Vocational intervention within an AMBIT service:
*Teaching capable of meeting National Curriculum requirements or accessing vocational schemes.
*Teaching capable of carrying out educational assessments to establish areas of learning deficit or specific difficulties.
*Teaching capable of supporting young people through public exams.
*Teaching capable of carrying through educational recovery or remedial programmes of study.
*Vocational courses.
*Work experience opportunities.
*Careers advice service.
*Connection to Further Education colleges and access to GNVQ courses.
*Educational Psychological assessment
!Staffing requirements:
The Education/Vocational Centre would employ secondary and further-education trained teachers who have also participated in the AMBIT Training Programme.
The task of these teachers /therapists is to provide the educational component of the programme and also to promote, support and create opportunities for the young people to make best use of the therapeutic resources made available to them. Because of their extra mental health training the teachers are in an ideal position to create activities and contexts within the education programme that will, in themselves, have therapeutic objectives for the young people.
!Principles behind ~Educational-Vocational Training
*Many of the young people referred to the service are likely to have had problems with their education in addition to their current psychiatric crisis.
**Some of these education problems may be associated with social, emotional or psychological factors to do with their relationships and school attendance.
**Others may be connected with academic underperformance or learning difficulties particular to the individual.
*Therefore, to provide a more comprehensive and [[Integrative]] crisis intervention service the ideal is to create a specialist Education/Vocational Training Centre where both the psychiatric, educational or vocational problems of the young people can be attended to concurrently. Education recovery would complement psychiatric/mental health recovery and vice versa.
*The intention is not to create a typical adolescent unit with a teaching element attached, but to develop a much more integrated service designed to meet as wide a range of the young person's needs as possible in one setting.
*Having such a local base will also provide the [[Key Worker]] with a resource base from which to operate and to which they can bring young people in crisis.
*The Education/Vocational Centre will have a menu of psychological or psychiatric interventions and treatments available alongside a core teaching and learning recovery programme, in keeping with one of the [[Core Features of AMBIT]], namely [[Taking Responsibility for integration]].
*In addition, the Education/Vocational Centre is ideally positioned to help the young person with vocational courses, work experience opportunities or with careers advice.
*Each young person under the care of the team will participate in those elements of the education, vocational and psychiatric intervention programmes as appropriate to their specific needs.
!An example - the Marlborough Family Service
The [[Marlborough Family Service|http://www.cnwl.nhs.uk/marlboroughfamilyservice.html]]'s therapeutic classroom is an example of a model of teachers who have had extra systemic family therapy training, and who have created a context where multifamily therapy is carried out on a daily basis with children aged from 5 to 16 presenting with serious mental health difficulties and their families.
As well as participating in the [[MultiFamilyWork]] at the Marlborough, children can have individual, group and family therapy as necessary. The core multifamily programme based in a classroom context provides the initial therapeutic opportunities for positive engagement with the children and their families with the result that take-up of //other// therapeutic modalities is much easier and more reliably maintained.
!Advantages of creating an Education/Vocational Centre
*Using an education setting should reduce the level of stigma attached to mental health intervention, particularly for young persons.
*Assessing, designing and implementing learning and educational recovery programmes for the troubled young person should help to increase confidence and self-esteem. Education per se is known to be highly correlated with future mental health/stability.
*Increased self-esteem via the above should help to promote improved mental health as well as to support the possibility of the YP taking up additional therapeutic help as necessary
*Potential for creating multifamily groups may be more possible if based around an apparently educational context as opposed to a purely mental health defined setting
*Teaching context keeps the young person in touch with the normal expectations of their peer group, including further education and career guidance
*When mental health has been regained the young person will not have suffered irreparable education deficit through missing out on teaching or careers advice during their period of ill health.
*It is intrinsically holistic as it brings together significant areas of a troubled young person's life in one therapeutic context - education, futher education, vocational training, career advice and mental health intervention.
The education programme should be of three months duration. There are two main phases:
!!![[1. Educational-Vocational Engagement and Assessment]].
*Weeks one and two.
*Four afternoons per week attendance.
!!![[2. Educational-Vocational Intervention and Transition]].
*Weeks three to thirteen.
*Four, reducing to three afternoons per week attendance at some point during this phase.
!!![[3. Educational-Vocational Illustrative Case Vignette]]
An anonymised vignette walking you through the structured intervention described above.
Type the text for 'Educational/Vocational centre'
!The Egg & Triangle (Active planning map)
The [[The Egg and Triangle]] is the common name used for the diagram that assists [[Active Planning]]: it is a tool to help workers with the process of creating collaborative plans and goals.
Use this page to record your local teams thoughts and plans on how to use this.
!!Sharing your understanding with young person
@@color:red;[Enter text] @@
!!Developing shared intentions
@@color:red;[Enter text] @@
!!Learning Objectives for Elevator Pitch
Clarify a clear, simple "mission statement" about the team as a means of understanding about [[Broadcasting Intentions]] and the AMBIT stance of [[Respect local practice and expertise]].
!!Introducing the exercise
The Elevator pitch comes from the world of film production. As legend would have it, a hopeful director/writer ''has to be able to "sell" her pitch about a film script in the amount of time it takes to ride an elevator alongside a big-shot film producer''... (see the classic movie "The Player" by Robert Altman for more on this!) The point is that [[Broadcasting Intentions]] is easier if there is some [[planning|Active Planning]] and preparation! What //would// we say about ourselves?
!!The Exercise:
* Divide into your existing teams
** If there is one large team, divide this into two groups to introduce a bit of playful competition
* You have 10 minutes to decide on a 1 minute introduction of:
** ''who you are''
** ''what you do, and how you do it''
** ''why this works''
** ''why this matters''
** ''your hopes for the year ahead''
* ''Notation''
** As teams/groups describe their work, trainers notate particular skills and activities in the relevant quadrants of a blank [[AMBIT Wheel]]
** Any particularly [[mentalizing statements|Mentalization]] are recorded in the centre of the wheel (//"we're never certain, but we keep working out better ways..."// or //"This work can sometimes leave us confused or anxious, but..."//)
!!Countdown
If you want, use this silly countdown to add a bit of levity (don't let the volume be so loud that it interrupts presenters, though).
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/D8625x6qLLM" frameborder="0" allowfullscreen></iframe></html>
!!Example for trainers/facilitators:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/5UkQLO6-EYI" frameborder="0" allowfullscreen></iframe></html>
!!Discussion
* How hard is it to summarise //"Who are we, what do we do, and why?"// in a precise way?
* How much //variation// is there across the team in the ways that you define yourselves?
** How much is variation a //good thing//?
** How much variation would become //too much//?
* ''AMBIT is a platform for teams to start to create ways to talk about and reach agreement about these things''
[[Manage Violence]]
[[Child Protection]]
[[Suicide Attempt]] or [[Suicide Warnings]]
[[Use the Mental Health Act]]
!Timeframe:
Emergency response calls for contact to be made within 3 hours
In extreme crises the Police, and Ambulance services should be involved - see [[CrisisServices]]
!Criteria for emergency response
*This will not be common.
*It will be a crisis situation in which imminent risk is perceived and which the existing network (family, voluntary agencies and professional) is perceived as being unable to contain at present.
**For instance, an overdose may have already been taken, with the young person refusing medical treatment;
**There may be threats of suicide or violence that appear driven by psychotic beliefs or other mental health symptoms.
**Risks appear likely to be acted upon in the immediate future.
**The family may have ejected the young person from home.
There will be high levels of anxiety in the immediate family, and within the existing professional network.
It is likely that the existing network will be strongly in favour of immediate admission to hospital, and it is important to acknowledge the validity of this position (see [[We want a hospital bed, not a home visit!]]).
In all but exceptional circumstances it will be necessary for a preliminary medical assessment to have been made (e.g. by the GP) before triggering an Emergency response.
In order to understand a family's usual transactional patterns the KW can ask family members to enact a transaction within the session.
This can take the form of a discussion between two or three people, staging a familiar argument, making a decision, comforting one another or whatever.
!!!The purposes of enactments are:
#To enable the KW to see how the family members interact rather than hearing them describe how they believe it happens;
#To propel transactions beyond their usual thresholds in order to test the flexibility of the system;
#To enable the participants to try out different repertoires of transacting in a safe environment.
Initially the KW observes, looking for spontaneously repeating sequences. S/he then focuses on a specific issue:
#Raising the possibility of the family interacting around this (//"I notice that this is something that causes you both stress...would it be useful if you talk about this here now?.. So, if you think it might be useful why don't you both do that...ignore me just for a minute, pretend I'm not here.. just have the sort of argument about money that you have at home...I will sit back and see what happens."//)
#Prolonging the time sequence (//"what would happen if you kept this going until you have reached an agreement?...do it if you want to..."//)
#Blocking parts of the transaction (//"don't involve me...this is between the two (three) of you", "I notice that you now talk about someone who is not here...perhaps that is helpful, perhaps it is not? Do you both now want to discuss whether it is more useful for you to talk to each other about what's upsetting...or to play safe and talk about X? Both fine, from my point of view..."//)
#Exploring alternative transactions (//"I notice that somehow you, Mrs X, never finish your sentences...is that the way you want it?... No?...How would you like it to be...What would happen if you did it differently then...Do it, if you both want to...ignore me...What is it that gets your husband to interrupt you...is that the way you want it? No?...Well, why don't you find a way of blocking him...if that's what you want..."//)
These techniques are employed to help the family to find new resolutions in the "here and now" of the session.
If there is a risk of raising the level of affect in the room too much, which would reduce the [[Mentalization]] of all present, then use [[Simmering Down]] techniques, or [[Therapist's use of Self]]
This is all in keeping with one of the [[Core Features of AMBIT]], which is [[Scaffolding existing relationships]], though as a client moves towards moving on, there may be a requirement to build new relationships as well.
!Scaffolding the Informal network
A [[MAINTENANCE PHASE]] allows for increasing focus on [[Social-Ecological Work]] - this is focused on establishing ''meaningful activity'' and ''social bonds'' that add to the "[[Social Capital]]" that an individual can access.
In addition, continued work towards [[Scaffolding existing relationships]] (one of the [[Core Features of AMBIT]]), invites the client to continue the work of building their own equivalent of the [["team around the worker"|Key Worker]] - perhaps inviting them to consider this as a form of [[Self-efficacy]], as they increasingly take on the role of a [[Key Worker]] in relation to their own responsibilities for their self. In doing so, they may be encouraged to recognise the need to develop and maintain an active 'back-up' team that can offer accessible support for times when their own capacity for [[Mentalization]] is diminished. Although there may be a continuing role for professionals to play a part in that team, [[Family Work]] and [[Social-Ecological Work]] may help to widen the membership of such a network.
By this stage we would expect that their AMBIT [[Key Worker]] will have already demonstrated quite explicitly the kind of appropriate help-seeking behaviour that is promoted, modelling the principle of a [[Key worker well connected to wider team|Key worker well-connected to wider team]] in the way that they have used [[Thinking Together]] with other team members, etc.
Equally, by engaging a client in voluntary services, or local clubs and groups, this may help that same individual to add to the Social Capital of their neighbourhood - itself a "virtuous circle" in terms of the positive impact such giving has on the self esteem of the giver.
!Scaffolding the Professional network
Particularly as the client heads towards the [[ENDING PHASE]] and the worker is going to close the case, it is critical to:
* Define who will be in the client's network going forwards.
* Check for, and if necessary [[address Dis-integration|Addressing Dis-integration]] between parts of the network, using a [[Dis-integration grid]] if required.
* Use the appropriate paperwork (relevant organisational care plans, supervision/action plans, safety plans) to ensure that all agencies are aware of each other and who does what.
* Arrange a multi-agency meeting to bring key players together.
Write a summary of the work you have done - including:
* Your initial formulation/understanding of the client
* The salient past history
* What interventions have been applied
** Which have been helpful
** Which unhelpful (and why, if possible)
* Your understanding of ongoing needs (and wants)
** Your recommendations for future input by services.
!Style
This is a document that needs to be experienced as //useful// by future carers - so pay attention to the use of sub-headings to help the reader locate key material.
it does not need to be long (in fact shortness is often a strength.)
It should also, ideally, act as a form of //advocacy// for your client - bringing their story, and your accurate mentalization of what has lain behind the ways that they have acted and reacted, to the next generation of workers or non-professional carers that will support them. Reports and written notes are often the only concrete things that remain of the many workers in this field.
Finally (no pressure, here) of course a report also represents the work of your team, so do take pride in producing a piece of work that summarises what has been done, and ideally why, and with what results.
!Forms and Proformas
If you are referring to another team, do check to see if they have their own form or proforma for receiving information - this can save a lot of time and is likely to help you to [[mentalize|Mentalization]] the team
!Information sharing
In general it is good practice to share these accounts with the client before sending them out. This can be framed as your "best efforts to get it right", but in keeping with the not-knowing or "[[The Inquisitive Stance]]", you may want to emphasise your enthusiasm for the client to help you get the facts straight. Make it clear that if the two of you disagree, you will represent their different opinions, even if you can't come to a total agreement.
In some cases there may be sensitive information (for instance supplied by a third party who has not agreed to this information being shared with the young person) that, if shared, could damage future relationships in ways that could be to the detriment of the client. In general these are rare cases, but if there are questions about confidentiality this should be discussed with your SupervisoryStructures before a decision is made on how to proceed.
!!What is engagement?
Engagement is a process of making (and sustaining) a therapeutic [[Attachment Relationship]] with your client. One of the [[Core Features of AMBIT]] is its stress on the [[Individual Key worker Relationship|Key Worker]] as the means by which we help to restore, stimulate or sustain more accurate [[Mentalizing]] in the young person, and their family. It is therefore intimately about the client's [[Relationship to help]].
!!When do I do this?
Naturally enough, engagement tends to be the focus at the beginning of treatment, but it continues as a theme throughout the work. There are a lot of [[Engagement techniques]] described in this manual.
!! Some theory
* Engagement describes the process whereby a young person (or any patient) becomes invested in the //co-construction// of a //therapeutic relationship//, and in taking up shared work, with the therapist or team.
* We assume that such a move is made, inspired by a belief that these actions will help suggest a way forward out of mental anguish.
* However, we also know that many young people or families have different, and much less 'optimistic', [[Internal Working Model]]s of how relationships with 'authority-figures-who-offer-help' tend to work (see [[Relationship to help]]).
* So engagement relates to the extent to which the young person is able accurately to [[Mentalize]] my 'good intentions' as a therapist .
* We know from empirical research that //from very early in life// infants are preferentially drawn to pay attention (a very rudimentary form of engagement!) to activities that are perceived as being influenced by //intentions//. In later years, this same propensity to be 'drawn in' by perceived intentions (ones perceived as authentically //helpful//) can be built on by the worker's efforts to 'mentalize aloud' - and as much as possible to make explicit his or her thinking, beliefs, hypotheses, concerns and intentions. This accounts for the emphasis in AMBIT (especially in [[Active Planning]]) on the notion of [[Broadcasting Intentions]]:
<html><object width="480" height="360"><param name="movie" value="https://youtube.com/v/s5A41EGo--o?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/s5A41EGo--o?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!How do I do this?
Engagement (or Joining) is the process of "//accommodation//" between the [[Key Worker]], the young person and the family, the search for a "fit" that will be good enough to allow the //difference// (new ways of looking at things, new ways of doing things) that will be introduced by the [[key worker]] to be explored in a context of safety.
It can be described as the "formation of a therapeutic alliance", the "development of rapport" - it is the "//non-specific but essential ingredient of all therapy//".
While a [[Key Worker]] may be more conscious of using joining techniques initially, joining is an ongoing process which needs to be maintained throughout therapy and aims both at establishing engagement and facilitating change. Joining is established through the use of technique integrated with the KW's presentation of self. This is also explored one of the [[Core Features of AMBIT]], which is [[Active Planning]] - where the balancing-act of (a) //joining// and (b) //"going somewhere useful together"// is described.
From the point of view of the therapist, [[Engagement techniques]] seek to reduce the activation of certain [[Attachment]] behaviours (see [[Secure Base]]), and can do so only in the context of very clear [[Boundaries]], including those boundaries that dictate the nature and limits of the relationship between patient and [[key worker]] ([[Patient-Worker Boundaries]]).
See:
* [[Manage CLIENT RELATIONSHIP]]
* [[Engagement techniques]]
* [[Relationship to help]]
* [[Active Planning]]
!!Specific Engagement problems
A variety of factors can make engagement more difficult, and call for specific awareness and techniques to work around these problems. For instance:
*There may be a perception that intensive home-based care is not what is required - [[We want a hospital bed, not a home visit!]]
*Mental Health stigma - [[Stigma and Engagement]]
*Families may act to undermine engagement - [[Families and Engagement]]
*Lack of insight (eg Psychosis) - [[Insight and Engagement]]
*Other symptoms of psychosis may also undermine engagement - [[Other Symptoms of Psychosis and Engagement]]
----
!!Sub Pages
Below are the pages that are tagged with 'Engagement':
<<list-links "[tag[Engagement]]">>
See [[Initial engagement - notes for trainers]]
There are a great many techniques that can be deployed to foster [[Engagement]] with a client. This is one of the [[Tags]] in the manual, and it gathers these techniques together:
----
From the AMBIT conference 2013:
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/89qKY9fdlCo?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/89qKY9fdlCo?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
<center>{{Epistemic Trust image.jpg}}</center>
!!What is it?
''Epistemic'' (the greek word for //knowledge//, or //the roots of knowledge//) ''Trust'' refers to the specific kind of trust required by someone to allow learning to take place by one person from another person.
In other words, the kind of trust needed to learn //through// a relationship.
This concept is linked closely with the idea of the [[Relationship to help]],
which conceptualises how a client may experience and relate to those attempting to offer help.
Epistemic trust describes a state in which the person who is the //learner// holds a sense of trust that what is being offered by the //teacher// has social value to them// i.e. a sense of trust that this information is meaningful and relevant //''for me''.
Epistemic trust is triggered by the experience that the person who is in the //teacher// position (known as the 'pedagogical stance') has authentically connected and understood the crucial things about the //learner// - not about people in general, but about ''__me in particular__'': the sense that "you have noticed and understood what it is like to be me, here, now, in THIS predicament."
''What this refers to, then, is the experience that a //teacher// has accurately [[Mentalized|Mentalization]] the //learner//.''
*It is this experience of //being mentalized// and feeling understood, that opens up a state of epistemic trust necessary to receive and learn new social knowledge. This knowledge then has the potential to change our perception of ourselves or the social world
* This is thought to be an //evolved mechanism// for helping humans to take on complex social learning from safe sources...//"When I saw in your eyes that you had accepted me, ''understood me'', right here, right now, it was as if the door opened and I was interested in what you had to say..."//
It is possible to see how this kind of trust is important in the process of learning through many different types of relationships e.g. a student and teacher, a client and therapist, a parent/carer and child etc.
But, whilst the learning that goes on through one specific relationship can of course be very important, it is thought that there is a broader and more general benefit that may come from the creation of epistemic trust. ''This is the ability to generalize epistemic trust to other relationships and situations, which then open the capacity to continue learning about the social world in other contexts.'' e.g. outside of the therapy relationship.
!!What is the relevance to AMBIT?
Epistemic trust is a crucial concept in AMBIT ultimately because we want to support people to learn and move forward in life. However, many of the clients with whom AMBIT influenced teams work, can be in a state of being 'closed off to new learning' (known as epistemic hypervigilance) This means that adapting or changing based on new information is very hard. This may often be for good reason- that past experiences of relationships may not have been helpful or entirely trustworthy, hence it is adaptive //not// to trust what comes from relationships.
So, a key challenge for AMBIT influenced teams is the creation of epistemic trust between a client and a member (or members) of their helping network so that new learning can take place. Much of AMBIT focusses around how a [[Team around the Worker]] can //support// a Key worker to do this. However, in AMBIT we emphasise that 'workers' energy must be balanced between developing that crucial keyworker relationship, and, conversely, ensuring that there is a [[Keyworker well-connected to wider team]]'' - AMBIT is not individual therapeutic work, but using a team to support individual helping relationships.
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ZBeEOkwLToM" frameborder="0" allowfullscreen></iframe></html>
Below is a video clip of Prof Fonagy explaining this concept in 15 minutes.
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/X1TBqEJMe3k?rel=0" frameborder="0" allowfullscreen></iframe></html>
This theory derives from experimental work by Gyorgy Gergely, Gergely Csibra and colleagues. You can find a link to a key academic paper by the authors titled ''The social construction of the subjective self'' here; <<tag [[Extended learning]]>>
!!!!!Source: ''Kirkpatrick model of evaluating training''
Kirkpatrick proposed that training can be evaluated against four levels of outcome. This framework is used a way evaluating the impact of training on a team.
!!''Level 1: Reaction''
*''What:'' AMBIT session feedback form
*''When:'' after every day of training, after consultation, after supervision
<<link-pdf "Feedback form" "https://drive.google.com/drive/folders/1iFVgj9AAqt-7Mo5UoCAHTi89smQtvXql">>
!! ''Level 2: Learning''
*''What:'' AMBIT knowledge and skills questionnaire
*''When:'' at the end of Day 5 (paper version until POD)
<<link-pdf " Knowledge and Skills Questionnaire" "https://drive.google.com/drive/folders/1iFVgj9AAqt-7Mo5UoCAHTi89smQtvXql">>
!! ''Level 3: Behaviour''
*''What:'' AMBIT Implementation Questionnaire
*''When:'' 3 months, 6 months, 12 months post training
*''How:'' via email survey, telephone interview with Assistant Psychologist or in person with Assistant Psychologist at team meeting
<<link-pdf "Implementation Questionnaire" "https://drive.google.com/drive/folders/1iFVgj9AAqt-7Mo5UoCAHTi89smQtvXql">>
!! ''Level 4: Result''
# ASEQ - pre-training; 3, 6, 12 months post-training. A measure of mz across the quadrants
# Menu of what could be measured and how:
<<link-pdf "ASEQ" "https://drive.google.com/drive/folders/1iFVgj9AAqt-7Mo5UoCAHTi89smQtvXql">>
''Team:'' TCI, GHQ, RFQ8, team meeting measure, goal based outcomes (e.g. if an objective is to make team meetings less stressful, rate how stressful out of 10), staff turnover rate
''Client:'' AIM, drop-out rate, general help-seeking questionnaire, willingness to use help
''Network:'' integRATE
''Learning:''
There may also be specific outcomes that teams might wish to see - how to measure will vary according to specific outcomes (e.g. substance use scores; edge of care etc).
//The format of the framework is based on the ''Kirkpatrick model'', details of which can be found here://
https://www.mindtools.com/pages/article/kirkpatrick.htm
Please see [[Implementation of the Evaluation Framework- Things to consider |Implementation of the Evaluation Framework - Things to consider]]for key points on implementing the evaluation framework.
Here is a link to a video clip of Kirkpatrick giving a brief overview of his model.
https://www.youtube.com/watch?v=5WRkHYuzXQI
{{outcome pic.jpg}}
!!'' What do we mean by Evaluating outcomes?''
*In AMBIT we believe that it is very important for workers and their teams to find ways to continually [[learn about their work|LEARNING at work]]. This is particularly crucial in the kind of complex practice that AMBIT teams often carry out, where there may not be much of an evidence base, or clear guidelines about what works best
*So, we are interested in helping teams to have ways of understanding what impact their work is having. By this, we mean what difference is the work making to the clients that we see?
*If, as workers and as teams we can find ways to learn about what impact our work is having, we can then adapt and improve what we are doing on the basis of what we find
!!!This is where Outcome Measures come in...
!!Outcome Measures
!!! Outcome Measures are ways of tracking and measuring whether things are changing in the direction that we hope. They are ways of checking whether what we are doing is having an effect. If we can measure this then we are able to adjust or adapt what we are doing in order to be more helpful.
Below is a video from the Child Outcomes Research Consortium (CORC) website explaining what outcome measures are.
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/BMwkNN4Nuiw" frameborder="0" allowfullscreen></iframe></html>
''We believe strongly that measuring and finding out objectively how things are going, is better than just guessing or assuming we know !''
But....
*Measuring the impact of our work is not necessarily straightforward. For some teams, the kind of impact they are supposed to have can be easier to define. But for others, it can be trickier to identify......
Although we might hope to be helpful to our clients, how do we work out whether or not we are?
''Please see [[Choosing what to measure]] - this page explains different aspects of work that you may wish to evaluate and lists outcome measures that can be used within each area.''
!!Learning from outcomes
*We believe that a team who is [[mentalizing|Mentalization]] will be curious about the impact they are having on their clients. They will be open to learning about how they could adapt and develop in relation to their work.....
However, many teams tell us that their experience of collecting information around the impact of their work can be quite negative. People have talked about some of the following experiences..
*The information we collect just goes on a database somewhere and we never discuss it or hear about it again
*It doesn't feel like it's relevant to me or my work
*It feels like another job to do when we are already over-stretched
*The information we collect isn't what is most important
*The measure is too complicated or takes too long to do
*We worry that the information could be used to highlight shortcomings in our service or used in unhelpful ways
''We are interested in how teams can address the above issues and use outcome measures in ways that are simple, relevant, and stimulate genuine learning which has a positive impact on clients and workers.''
This connects closely with the theory of [[Developing Learning Organisations|Developing learning organisations]] which addresses some of the ways in which organisations develop a culture of ongoing learning.
Please see the following links:
*For discussion and ideas around how teams can[[ Learn through using outcome measures |Learning through outcome measures]].
*If you would like to learn more about [[Measuring the Impact of AMBIT Training]] on your service.
*To find out about the international [[AMBIT Study Group|The AMBIT Study Group]] see here. This is a group of workers from AMBIT influenced teams around the world. The group is interested in evaluating outcomes in collaborative ways, and exploring and researching aspects of AMBIT practice.
*See here to find out about some of the [[Current Research and Outcome Evaluation within the AMBIT Community|Current Research and Outcome Evaluations in the AMBIT Community]]
This page summarises a piece of AMBIT implementation and evaluation led by
*Aitor Martínez Pena
*Kristina Perez Arrieta
*Patxi Bereziartu Irastorza
A collaboration of workers from mental health services for children and young people in the North of Spain (Gipuzkoa region) began a project in 2019 to evaluate the impact of applying [[Thinking Together|Thinking Together]] to support the practice of workers from a range of services in the area.
!!!The specific aims of the project were to;
*Implement an aspect of the AMBIT model across the wider network of professionals within this region and evaluate the impact of this upon the professionals involved
The network carried out weekly Thinking Together meetings in which 10 workers from a range of different services within the area were invited. The purpose of these meetings was for workers to seek help for a dilemma or challenge within their work, using the group Thinking Together Structure. Meetings lasted for 60 minutes and were run as video calls between January and September 2021 (with the aim of continuing the Thinking Together after this project)
!!!3 types of feedback were gathered from workers
1. Workers bringing the case to a meeting were asked to fill out a brief measure before and after the meeting using a 5 point scale to enquire about (i) their feelings around their case/dilemma. This included enquiring about the worker's sense of worry or distress about their case, (ii) their sense of understanding of the case and (iii) their ideas about next steps and actions that may be helpful
2. Workers completed the [[ASEQ|AMBIT Service Evaluation Questionnaire (ASEQ)]] before and after their involvement in the project
3. A focus group was carried out after the project to evaluate the experience of using this method and the wider impact on day to day practice
!!! Key findings were
*Over the project, 100 % of responses stated that people felt that using Thinking Together had helped their work with the case either 'much or very much' ( scoring this a 4 or 5 out of 5)
*95% of the responses said that people felt they had a good or very good understanding of their case after Thinking Together (compared to 37% before the session)
*100%of responses reflected that the workers' capacity to reflect on the case was 'a 4 or 5 out of 5' after the sessions.
*In the focus group there was a shared theme that workers felt the framework helped them to focus on goals/objectives in their case, 'rather than feeling lost in discussion of many details/information about the case'
*There was very positive feedback that the group helped significantly in managing emotions around the case and a sense of feeling understood by the other workers in the meeting
*Results of the ASEQ showed a particular increase in positive network functioning as reported by the 9 workers attending throughout. At the second evaluation point after the project around 75% reported a sense of 'often' feeling that their jobs were understood by other workers in their professional network, that they would talk about their cases in a shared way with other colleagues across the network and that they would dedicate time to coordination with network colleagues (see ASEQ questions 9-12). The above scores had increased from about 25% reporting 'often' on the above questions prior to the start of the project.
*ASEQ results also showed very positive changes in the percentage of people who rated 'often' to questions focussing on applying mentalizing to clients and with their team.
*The focus group confirmed the above network progress and there was a theme of workers reporting that the group had helped them to work more effectively and closely with their wider network which was seen as being beneficial for clients
Overall the project highlighted the potential for 'thinking together' to be used as not only a structure for facilitating case discussion and effective help seeking, but also as a tool to support network connection and building network relationships. We hypothesize that using this structure to support shared case discussion helps place added focus on the experience and minds of network colleagues and allows an experience of being understood/mentalized by professionals from other agencies. We think this is critical in the network integration which was reported positively by the workers involved.
This project has been written up in a peer reviewed journal in Spain in:
''Revista de encuentros de educación y Psicoterapia
No 2 Diciembre 2021
adp-cets.org/revista/encuentros/''
''Estudio sobre la Adaptación de AMBIT al Sistema Público de Salud (Osakidetza)
Aitor Martínez, Kristina Pérez, Patxi Bereciartu''
We are very grateful to the Aitor, Kristina and Patxi for this work . Please contact ..... if you would like to find out more about this study and connect with this team
!!Introduction
* [[Respect for Evidence]] is one of the [[Core Features of AMBIT]].
* There are some thoughts about the nature and limitations of evidence in this field in a talk by Prof Peter Fonagy entitled "Interpreting the Dodo Bird" here:
<html><iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/193998652&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe></html>
!!Evidence and AMBIT
* See [[Is AMBIT evidence based?]]
* There are [[Academic references]] that underpin much of the theory and practice of AMBIT (though the references included are by no means exhaustive.)
!!!AMBIT: an //evidence-oriented// approach
AMBIT is as much about trying to disseminate existing evidence-based practices as it about trying to take a systematic approach to developing better evidence, and more localised evidence (''"[[What Works for Whom|Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom]], and what works HERE?"''
[[TiddlyManual]]s are easily editable in local versions by teams taking responsibility for the way they develop their own [[local practice and expertise|Respect local practice and expertise]]. This forms a //"bespoke"// adapted manual fit for their own local needs, and also represents a reflective (mentalized) approach to the representation of TAU (Treatment as Usual) - this is very close to what Weisz et al have referred to as a "~Deployment-Focused" approach to treatment development.
In addition, these open source manuals provide teams with the ability to share and explore practice with each other. Encouraging the development of a [[Community of Practice]].
The [[core feature|Core Features of AMBIT]] of [[Respect for Evidence]] also promotes the active //gathering// of evidence by teams using AMBIT, building on AMBIT and developing their own best practice, and of putting this information to use in a feedback loop to practitioners. See material on [[Evaluating outcomes]]
<<link-doc "Implementation" "https://drive.google.com/open?id=1YtWLG5DLiw237xcMVkB1JZGJoezRTKnB">>
https://drive.google.com/file/d//view?usp=sharing
Thank you to Enfield Gangs team for this contribution, which they made while training on how to use the manual. We have put this page in all manuals by including it in the ambit core content!
[img[http://upload.wikimedia.org/wikipedia/commons/b/b8/Mug_of_Tea.JPG]]
!Method
#Boil Kettle
#//Put// tea bag in cup
#Pour water in cup
#Leave for a period of time
#//Take// tea bag out of cup
#Pour milk into tea
#''Enjoy!''
<html><iframe width="420" height="315" src="https://www.youtube.com/embed/cY6fbQorBQk" frameborder="0" allowfullscreen></iframe></html>
<html><div align="center"><iframe src="https://docs.google.com/Doc?id=d6h2gb4_531c8ptwvsc" frameborder="0" width="100%" height="600"></iframe></div></html>
!!What is formulation?
See [[Formulation and Treatment Aims]]
The key purpose of a formulation is to share with a young person in a non-critical and non-threatening way how you have come to understand their experience and situation. Sharing formulations can seem a rather daunting process. In AMBIT, this is much more a process than a single event. It is part of the on-going process of making sense of another person as they make sense of you. Occasionally, it may be useful to really focus on this in a planned way.
Mentalizing theory provides a very crude formulation as to how individual mentalizing breaks down under conditions of stress, and how this in turn often leads to conflict with significant others, and the subsequent loss of their own mentalizing:
[img[Family System Mentalizing diagram 2]]
!!!Externalizing a formulation
A key part of the process is to create a context in which the therapist and the young person look at things together so that literally building a picture for both to observe and comment can be extremely useful. The more this can be co-constructed on a blank piece of paper together the better. Simple diagrams, images can be more effective than complex sentences or paragraphs of text.
!!!Not too much information at once
For many young people, these types of conversations can be a completely new experience and can easily be quite overwhelming. It is important to check back with the young person throughout the conversation and take responsibility for pacing the process as you go along. Sometimes there conversations may just be a few minutes and then it may be good to pull back and come back to it later.
!!!Monitoring affect
It is very easy for there to be significant shifts in affect during these conversations, as issues may evoke anger, anxiety which may be indicated by agitation, restlessness or withdrawal. when this occurs, the therapist should attend to the change of affect rather than pursue the content of what may have been spoken about.
!!!The MBT-A approach to formulation
In MBT-A there is more emphasis on presenting an overall formulation as part of the initial phase of treatment. The following part of this page is a summary of MBT-A ideas about formulation. We are grateful to Trudie Rossouw for sharing her manual with us.The formulation describes the young person’s problems in the context of mentalizing breakdowns. These breakdowns are explained in the context of interpersonal relationships and perceived threats to the continuity and safety of the self and attachment. Mentalizing failures often give rise to coercive patterns of behavior which can undermine effective use of treatment. The notion of coercive cycles, driven by emotional arousal and mentalizing breakdown, helps parents appreciate the interpersonal nature or the youngster’s, and their own, problems. Discussing the formulation with the family plays a crucial goal: it enlists the parents as partners and it helps to shift from discussing behaviors that need to be controlled or eliminated – the “dialogue of the deaf” between caregivers who bemoan their child’s “out of control” behavior while the young person bristle and reject their parents efforts to control them – to a mentalizing conversation that enables family members to grasp each other’s point of view and convey their own perspective.
Framing the goals of treatment along these lines focuses the therapeutic process on first assisting the parents in achieving or maintaining mentalizing in the face of the very pressures that have prompted their own retreat from mentalizing, so they can, in turn support their children’s mentalizing. Such an approach involves inviting parents to collaborate in identifying what experiences and interactions lead to their feeling buffeted by emotional turmoil and unable to adopt a mentalizing position in respect to themselves, the other parent and their children. A major focus of the work with the parents, therefore, is to identify stressors impinging on the parents that affect their mentalizing and parenting capacity and help them access support and/or treatment for themselves.
!!Example of a MBT-A formulation.
''Background Information.''
When you were referred to this service you reported a two year history of feeling depressed and harming yourself. At times you have felt so depressed that life did not feel worth living. You thought your parent’s divorce three years ago, your mother’s subsequent depression, your father's drinking and his recent violent relationship with his girlfriend all played a role to make you depressed. You spoke about feeling guilty as if it was all your fault. Before you came to us for help you entered into a relationship in which you allowed someone to treat you in a disrespectful manner, almost as if you were being punished. All of this made you feel terrible about yourself.
''Personality Style:''
From what you told us and based on the tests you completed, it seems as if you tend to be an introverted person and that you value time on your own as it helps you to feel calm. When you are with friends you can feel very worried that you will be hurt or that you will not be liked. When you feel like that, you hold yourself back but in doing so you do not give people a chance to like you which in turn reinforces for you that they do not like you. It also seems that at times you are able to form passionate attachments to others, but then you can become suspicious and anxious that you may be rejected. It seems that relationships can at times make you feel a rollercoaster of different feelings, from love to anger. Sometimes your mood can also swing from sad to happy. Sometimes you can feel so overwhelmed emotionally that your mind goes blank and then you can feel numb. The problem with this coping strategy is that it then makes you feel disconnected from what you or other people feel and then it is sometimes difficult to understand what is going on and then action feels the only thing available to you - it is at these times that you have a tendency to harm yourself. You often relate to others in a self sacrificing manner and at times even allow others to take advantage of you. You also at times tend to present yourself in a negative light to others. You can feel deep pain as your mind often dwells on past pain and misfortunes. This is very sad, because then you are not able to see your own good qualities.
''Treatment Plan.''
We propose to offer you a treatment in which we suggest a combination of individual therapy once a week and family therapy once or twice a month delivered by the community team.
''Crisis Plan.''
Trigger factors that you and I identified are times when you feel rejected, humiliated or bad about yourself. As we have discussed , these feelings do not just arrive out of the blue, they are likely to have been triggered in a close relationship. When you have those feelings you tend to rush into an action to take the feelings away. When you feel like that again, I would like you to try and stop the action by trying to delay it for 10 minutes. Then use the 10 minutes to try and reflect on what was happening a few moments before you had the bad feeling. That might help you to understand more clearly what it is that you feel as well as what might have happened in a close relationship which may have contributed to the feeling. Once you have this understanding more clearly it may be easier to think about a solution or to see things from a different perspective. Once that has happened you may not feel as if you need to rush into action anymore. If that fails and you still feel at risk to harm yourself, try to explore alternatives to self harm. Do something physical and strenuous like going for a run, try and distract yourself or talk to a friend or someone you trust or try and think about a person you know who loves you and imagine what that person would feel and say to you if you were to talk to them Sometimes you harm yourself when you numb yourself emotionally. When you get into such a state of mind, try to remember that it is not a good state of mind for you to be in and it is harmful to you. Try and bring yourself back to reality – do something to occupy you, like talking to someone, playing a game, writing a poem, painting or watching something that can hold your attention on TV. Don’t just sit and stare into space with your mind full of negative thoughts about yourself.
If all else fails, call the clinic and ask to speak to me and I will call you back when I can.
!!We don't create new systems of care, we join existing ones
It is tempting to believe that on the point of accepting a referral we professionals create a system of care around the client. This is almost never the case.
Of course in reality we join a pre-existing system of care; mostly informal, sometimes more or less effective (though we presume at the point of referral it is probably somewhat overwhelmed), and sometimes seen as more less risky (a drug dealer may be seen as a significant source of help to a young person who is desperate for any way to avoid feeling the way they are feeling; reliably available any time of the day or night, and always happy to "help".) This understanding underpins the tension that is captured in the two elements of AMBIT's principled stance (see [[Core Features of AMBIT]] for more on this) [[Scaffolding existing relationships]] and [[Managing Risk]] which can easily be experienced by workers as somewhat mutually contradictory.
!!The client and their network are the experts
One of the primary aims of AMBIT is //to avoid disempowering our clients, their families or other pre-existing informal systems of care//, so that they are not forced into having to abdicate responsibility for the young person/client to formal systems. Large formal systems of professionalised care/treatment have many great strengths, but they can also carry significant disadvantages.
In relation to learning, AMBIT's stance requires workers to practice [[Holding the Balance]] between the often contradictory principles of [[Respect local practice and expertise]] and [[Respect for Evidence]]. There is ample evidence that a [[Care Plan]] that has been developed collaboratively with the client, and wherever possible with their informal care network, is more likely to be followed and put into practice, and is more likely to demonstrate positive outcomes.
This means that incorporating and responding to service user feedback - both in the individual setting of a specific care/treatment episode, and more generally in the way that the team applies [[LEARNING at work]] - is a critical part of the work.
!!Manualizing with experts by experience
A team's attention to [[Manualization]], as one of the [[Core Features of AMBIT]] that supports [[LEARNING at work]], creates opportunities for [[Service User Feedback]] to feed into the process of a team's making sense of itself, and how it goes about it work. Novel features in the Wiki manual format facilitate this; further details about this can be found in [[Team Meetings]] .
This use of the invaluable 'knowledge and experience resource' that //clients// bring is also in line with government proposals for a //partnership approach// to health and social care. We believe that such a partnership will not only facilitate motivation in the family and build greater confidence in the client/keyworker relationship, but will enable more effective and lasting solutions. Thereby the family will not just be the recipient of intervention but will be active in the intervention process.
!!Employing service users
Users of a service, should be consulted and their feedback incorporated into the treatment program throughout the intervention. This should be clearly stated to families at the outset and monitored at regular intervals. It is especially important that a young person is consulted and is active in the decision making process. We invite teams to consider creating opportunities for ex-clients or family members to be invited to work or volunteer as 'expert patients' after their active engagement with the service draws to an end; either becoming involved in service delivery, or as advocates for others, or through contributing their skills and insights in helping the team to make further improvements to their approach.
!!What is Explicit Mentalization?
This is the 'second order' of mentalizing, in what could be seen as a hierarchy ([[Mentalizing Levels]]), each higher order relying on the presence of lower orders before it can be sustained:
#[[Implicit mentalization]]
#[[Explicit mentalization]]
#[[Affective mentalization]]
Explicit Mentalization refers to thinking reflectively about the actions of others and ourselves.
This occurs typically when something goes awry on the implicit level that challenges our usual interpretation of action. Whilst [[Implicit mentalization]] is //non-conscious, unreflective and procedural//, ''explicit mentalizing'' is relatively //conscious, reflective and deliberate//.
!!In therapy
The therapist of any orientation engages in the act of explicating states of mind and their meaning with most client groups. Such explicit mentalizing brings the advantages of reflective consciousness in encouraging self monitoring, adapting to novelty and engaging in flexible problem solving.
The medium is language, which enables us to represent and adopt multiple mental perspectives on the same reality. ''Developing a language of minds'' enables us to be systematic about mental states and to organise these into coherent narratives, creating stories of what happened to us and how. This is the organizational work which psychotherapy at its best can excel at.
The content of explicit mentalization may vary according to the theoretical focus of the therapist, from unconscious defences and transference reactions ([[Psychodynamic theory]]) to automatic negative thoughts ([[Cognitive Behavioural]]), to recurrent relationship patterns ([[SystemsTheory]]). Therapeutic explication serves as a highlighter drawing joint attention to one facet or another of the implicit process. Over time the patient is drawn into this process as an active collaborator in the explication. Conversing about an adolescent in crisis and the family's reaction to it forces the participants to integrate implicit and explicit mentalization and use language to draw attention to a range of perspectives that can exist in relation to individual action.
The creation of a coherent narrative, a systematic way of understanding the family's circumstances and the young person's predicament, deriving a causal, mentalistic account of how such a situation might have arisen, regenerates a sense of 'autobiographical agency'.
See also the government guidance document [[Safeguarding Children and Young People from Sexual Exploitation]] and [[Child Protection]].
Not uncommonly adults are involved in young peoples’ substance use; either in the supply or in sharing the usage, and there should be concerns about the risks of exploitation in any such relationships. This may include exploitation of the young person whilst they are intoxicated (inappropriate or abusive sexual contact, or encouragement to commit crimes or other high risk activities) or the exploitation of the young person in relation to the provision of substances (encouragement to commit crime in return for substances, sexual exploitation in return for substances, etc.)
Questioning about exploitation needs to be done sensitively, avoiding the risk of reinforcing stigmatising views. Early explanation (pre-warning) about patient confidentiality and its limits is helpful, as a young person can be reminded at this point about these realities. A helpful technique is to normalise the problems:
>//“Some of the young people I have worked with before have spoken about feeling that along with the things they have liked, they have also begun to get themselves into relationships or activities that leave them feeling uncomfortable. If I gave you some examples of the kinds of difficulties other young people have spoken about, do you think you could say if you recognise any of them in your own experience?...”//
If identified, then safeguarding protocols may be required to guide the most appropriate response.
Empathy is literally "Feeling into" or having an "insiders' view" of a state of mind. There are obvious overlaps between this idea and our understanding of [[Mentalization]] - it is not possible to have empathy without mentalizing, although mentalizing extends beyond just being "empathic".
The young person needs to have the experience of the [[Key Worker]] trying //in a properly authentic way// to understand their distress.
In Motivational Work, however, more than simply //trying to understand// (which in itself is a powerful and positive intervention, in keeping with [[Mentalization]]-based approaches), we aim to be accurate in our understanding; so that, //in our communications back to the young person (checking my understanding)//, the young person experiences this:
>//"Yes, it really seems as though this person has got it - what it feels like to be me, here, now."//
!Common pitfalls:
*This involves avoiding trying to "solve" the dilemmas a young person presents us with (which can be challenging for an adult with a young person, or for mental health professionals or other caring professions in general!) This is NOT a directive stance - catching oneself telling the young person what to do is a powerful indicator that one is "off-model".
*It requires a scrupulous avoidance of imposing any kind of moral //judgement// upon what the young person is describing or showing.
**Remember that young people are anyway vulnerable to being overwhelmed by the emotional context, and are sensitive to perceived criticisms because of the [[Neurodevelopment and adolescence]] changes occurring, as well as because of the great power-differences that they may perceive between them and an adult in a position of power and authority..
!Purpose
Define Expressed Emotion and direct to resources to help reduce this in families
!Information:
There has been a lot of research on "Expressed Emotion" (or EE) - which refers to the ''prevailing emotional climate in a family (or care-giving) setting.''
Certain features which can be found in some families are quite clearly related to an increased risk of relapse of mental health problems, so working with EE is a key part of [[Relapse prevention]].
In particular, high levels of HOSTILITY, CRITICISM, BLAMING or "ENMESHED" relationships (typically parents who take their child's behaviour very personally, or who struggle to disentangle what is happening to their child from what is happening to them, have been associated with increased relapses (particularly in conditions like [[Psychosis]], but this is probably relevant for a much wider range of conditions.)
!Risk
There is a risk that work on EE can be experienced by families as highly BLAMING - as though we are saying:
>//"the only reason your child is getting ill is YOUR bad parenting."//
As we know, the causes of most mental health problems are multifactorial, and we also know that many young people with mental health problems can be very stressful for other family members, or even provocative.
A [[Mentalization]] based approach to [[Family Work]] is helpful in reducing the negative effects of EE, but ''__re-framing__'' the [[Family Work]] in this context, so as to emphasise its postive intent, rather than any implied criticism of past parenting, is important:
>//"There are many things that we may NOT be able to change, in trying to keep your child well, but as you are the people nearest to X, and who know X as well as anyone, YOU are probably in the best position of anyone to make a real impact... some of the work we will be doing will be stuff that you may have already tried to do before, and just because X got ill before, doesn't mean you maybe weren't on the right track! We base what we suggest on a lot of research evidence that suggests that giving families skills to keep the emotional temperature as cool or calm as possible is really worth doing..."//
This is a tag to gather all of the pages in the AMBIT manual which are not core content but rather 'extended learning', relative and interesting but not essential aspects of AMBIT //per se//.
Below is a list of all pages tagged with extended learning:
<<list-links "[tag[Extended learning]tag[Extended learning]]">>
Families need to be engaged, just as surely as does the young person who is the 'identified patient'. Without the support of the family the practitioner is severely limited (note one of the [[Core Features of AMBIT]] which is [[Scaffolding existing relationships]]
Major problems in engaging families can occur because of issues of [[Keeping secrets/different levels of disclosure within the family]].
Alternatively, the family may already have a very strong idea/narrative about the nature of the problem and the required solution; "[[We want a hospital bed, not a home visit!]]" In this situation, any service offering something //different// from the family's agreed diagnosis and treatment will find itself struggling to engage them collaboratively.
!An exercise
Work with family members either separately or apart:
#Ask them to try to help you understand what different members of the family might hope for out of your intervention.
#Acknowledge that different people may want different things out of the work - normalise this understanding: //"because members of this family are clearly individuals!"//
#Once a family member has offered their own hopes, reflect this back - Check: have you understood this correctly?
#Then ask that member to do their best to try to guess or use their intuition to estimate what they think other members of the family may be wanting - what is similar, what is different? If they are being seen alone, then you can use a "virtual client" technique:
>//"So if we can imagine your mother sitting here, what do you think she would say if I asked her// [turning to the empty chair] //what do you really hope for out of the work we are considering?"//
The focus is on ''hopes for therapy'' - and it is important to steer family members quite actively away from the temptation of describing their //fears// about what will go wrong, who will fail to engage, etc.
See [[Family Work]] for theory and interventions
See [[Family History]]
Document the [[Family History]] via [[Make or View Client Notes]].
This element of the [[Narrative History]] relates directly to the [[Family Informal Network Members]], which in turn defines the whole of the informal care network relating to the young person.
!!!Specific things to ask about include:
*Psychological or psychiatric difficulties in other family members
**Is there a genetic vulnerability factor to take into account?
**Might early exposure to parental mental illness have impacted upon the young person's development?
*Substance use difficulties in parents or other family/network members?
*Who is living where?
*How do different family members spend their days?
**Employment, economic status
**A family culture of work, high achievement or unemployment, criminality, etc?
*Relationships between other key members of the family/network.
**//"Who gets on best in this family?... Who gets on the worst? Who is the peacemaker?"//
A key to the underlying philosophy of [[AMBIT]] is the attempt to reinforce any resiliencies in the existing social ecology, so as to develop solutions that are not dependent on external agencies, but build on sustainable local resources and intrinsic qualities in the young person.
Equally, the [[Key Worker]] must be realistic in respect of family or network members whose own burden of needs and vulnerability //adds// to that already stressing the young person (mental illness or substance use disorders in a family member, for instance), so that sometimes the highest impacts from any interventions will be those that act on these vulnerabilities rather than on individual features.
!!!When notating the network around a young person the [[Key Worker]] will clarify the following details:
Name: .....................................
Contact details (if relevant):....................................
Relationship to young person (father, sister, etc):.....................
Quality of relationship: .......................................
Other relevant details about family member (job, health, etc):.............................................
!Genograms (family trees)
The construction of a genogram (family tree) is a powerful way of contextualizing the symptom, the young person, and the family.
[img[Genogram picture]]
Here it is not the final result (namely an elaborately completed tree) that is important, but //the process of constructing it and the questions that guide the family to make new discoveries and connections.// Particular attention is paid to signs or symptoms of psychiatric disorders and associated presentations on the family tree and a detailed exploration of how different people and generations coped with those symptoms, the effect these symptoms and behaviours had on others and the coping mechanisms used. This is then connected with the young person's symptomatology and the family's current predicament. With the genogram 'in sight' relationship patterns, such as distance and closeness, coalitions, boundaries, will be examined and the family encouraged to discuss with one another what conclusions could be drawn from that.
There are other visual techniques which encourage patients to make diagrammatic representations of their past, present and/or future life, including [[The AMBIT Pro-Gram]] or the [[Dis-integration grid]].
In [[MultiFamilyWork]] these techniques usually engage clients with one another as they cannot help commenting on the partner's or parent's pictures, thus challenging each others' perceptions and discussing how to do things differently in the future.
!1. Aims
[[Aims of Family work]]
!2. Theory to Practice
[[Theoretical foundations of Family Work]]
!3. Manualised interventions:
The interventions presented here are mainly based on ~Mentalization-Based Treatment for Families ([[MBT-F]]), and MultiFamilyWork, all which draw on [[MBT]]
!Where?
In an ~AMBIT-influenced service, much of the family work may initially take place in the home, probably in the ‘living room’, kitchen or another communal space. Only if the young person refuses to come out of her / his room, would sessions be conducted there, or outside the young person's door.
If a setting outside the family home is available and acceptable (for instance once the young person is able to attend an Education / Vocation Centre) then family sessions could take place there. If it is avaialble, then on days the family attends the Education / Vocation centre there can also be a multi-family session (MultiFamilyWork), involving a number of families and young persons.
!How long?
Family sessions will typically last between 30 - 60 minutes - again, we accept that it is in the nature of outreach working that, particularly in the early sessions, it may be that family work occurs in a more piecemeal fashion than formal clinic-based work would be expected to be. The [[Key Worker]] will be responding to immediate [[Contingencies]] with the family (and the changing availability of family members in the home), whilst working towards (see [[Active Planning]]) more regular planned sessions that might beginto take the shape of family work that occurs in conventional clinic-based settings.
!How often?
At the beginning of work, Family sessions may take place up to daily if required to settle a chaotic crisis situation. During the second week they may be reduced, towards perhaps weekly or fortnightly sessions.
!Introducing Family Work
There is material and video on [[Introducing Family Work]]. Preparedness for this work and how to introduce it is an important skill.
!!Spotting Successful Mentalizing
>''"HOW DO YOU //KNOW// IF YOU (OR YOUR PARTNER) ARE MENTALIZING SUCCESSFULLY?"''
Successful mentalizing can be recognized through:<<list-links "[tag[Features of Successful Mentalizing]]">>
!!!!//Teaching note - The pages tagged with Features of Successful Mentalizing as listed above are useful resources for teaching clients about the nature of mentalizing//
!!Spotting it in individuals
[img[Rich internal life - pic]]
[img[Advanced explanatory and listening skills.jpg]]
[img[Narrative Continuity.jpg]]
!!Spotting it in their interactions with others
Re. the image below: In fact, having taught for some time that mentalizing is almost exclusively human, it becomes clear that whilst some animals (e.g. higher primates) show only rudimentary mentalizing, //dogs// (that have to an extent co-evolved with humans) do show relatively advanced mentalizing skills (see [[this reference|Kaminski J, Pitsch A, Tomasello M (2012) Dogs steal in the dark]] kindly supplied by Liz Cracknell!)
[img[Curiosity.jpg]]
[img[Awareness of impact.jpg]]
Accepting the //opacity// of other peoples' minds:
[img[Opacity of other minds.jpg]]
[img[Perspective-taking.jpg]]
[img[Capacity to Trust.jpg]]
!!Gently self-deprecating humour:
Here's a quote from Malala Yousafzai, the youngest ever Nobel Peace Prize winner that illustrates the flavour:
[img[MalalaQuote]]
Here we are speaking of humour that wryly acknowledges what Shakespeare referred to as the "Comedy of Errors" - the inevitability of our human flaws and failures; to make sense of each other, to behave as others might always expect us to, to live up to expectations...
!!Spotting //unsuccessful// mentalizing...
Conversely, there are also <<tag [[Features of UNsuccessful Mentalizing]]>>
!!When mentalizing fails... why it matters
In AMBIT mentalizing is part of the worker's general approach to work with clients, with colleagues and with wider agencies. This is described in [[The Worker's Mentalizing Stance]]
The aim is to try to notice when it is proving hard to stay tuned to the states of mind of oneself or others and to try to get back on track [[Terminating non-mentalizing interactions]].
It is also helpful to be [[Highlighting and reinforcing Positive Mentalizing]]! So do also look at descriptions of the <<tag [[Features of Successful Mentalizing]]>>
!!How does it happen?
There are several ways in which good mentalization gets interrupted, but in general they are triggered by stress/anxiety/anger/fear/etc... this leads to:
* The activation of the stress/fight-flight system
* The activation of the [[Attachment]] system.
When these ancient (''//"They go to volume 10!"//'') systems are activated, they overwhelm and suppress [[Mentalizing]] (''//"This brand new thinking-system that we have only just evolved, and which in adolescents won't even be fully developed, can only go to volume 1 or 2!"//'').
Instead, ''primitive'' [[Pre-mentalistic stances]], described as features of the 'disorganised mind', take over - (//"much as computers that have crashed may offer to "roll back" to using earlier less-sophisticated settings!"//)
You can read more about the following [[Pre-mentalistic stances]], and how to address them if you spot them (careful [[Mentalizing]] of your client's mental state allows you to [[Adapt your Discourse]] to fit their prevailing mental state.)
>1. [[Psychic equivalence]]
>2. [[Pretend mode]]
>3. [[Teleological thinking]]
!!Spotting ~UNsuccessful Mentalizing
These 'pre-mentalistic' states, in their turn, generate, maintain, reinforce or exacerbate a range of:
*Emotional difficulties
*Behavioural difficulties
*Interpersonal difficulties
----
!!Sub Pages
Below are the pages that are tagged with 'Features of UNsuccessful Mentalizing':
<<list-links "[tag[Features of UNsuccessful Mentalizing]]">>
<a class="tc-float-right">[img width= 300 [angrycat.jpg]]</a> ''Awareness of the impact of emotion:''
When we are mentalizing well, we are able to remember that feelings influence how people behave and think.
!!In ourselves ...
Consider this:
<<<
“Because that was a stressful home visit, at the moment I feel like I'm rubbish at my job."
<<<
vs this:
<<<
“I'm rubbish at my job!”
<<<
!!... and in others
Consider this:
<<<
“I am angry that he’s late home, but I’m not going to shout because then he’ll get upset and probably lie about where he’s been!”
<<<
vs this:
<<<
"Grr, late again! I'll give him a piece of mind when he gets home, that'll teach him!"
<<<
<a class="tc-float-right">[img width= 300 [dog.png]]</a> ''Curiosity:''
Because we know that minds are opaque, we approach other people's minds (including our own) with curiosity, not certainty.
When we aren’t being curious, we tend to have decided that we //already know// and can potentially get quite narrow, rigid or fixed in our thinking and subsequent behaviour.
!!!Curiosity about others' minds
Consider this:
<<<
"I'm wondering what goes on for you in your mind when the teacher tells you off in front of the class?"
<<<
vs this:
<<<
"You never listen when the teacher is telling you off. You just act the class clown."
<<<
!!!Curiosity about our own mind
Consider this:
<<<
"I relapsed because I'm an idiot"
<<<
vs this:
<<<
"I'm not sure why I started drinking again this time. Why is it I seem to relapse just when things seem to be going well?"
<<<
<a class="tc-float-right">[img width= 300 [Opaqueglass.jpg]]</a> ''Knowing that minds are opaque:''
When we are mentalizing well we can remember that we can't ''know'' what is in other people's minds, and so we talk tentatively about our guesses.
We also remember that other people can't magically see in to our minds, and so we take care to communicate what we are thinking and feeling.
We can be good at making guesses about people's minds and we do so accurately a lot of the time. But... because we are often accurate, we can be tricked into thinking that we ''knew'' but in fact we just made a ''good guess''.
!!!Knowing another's mind is opaque
Consider this:
<<<
“I don’t know what’s making it hard for her to get up in the morning”
<<<
vs this:
<<<
“She’s not getting up because she’s lazy!”
<<<
!!!Knowing our own mind is opaque
Consider this:
<<<
"I'm so sorry to hear you thought I was ignoring you. I really wanted to talk to you but I had a crisis at work and I didn't get a moment."
<<<
vs this:
<<<
"How dare you accuse me of ignoring you, that's just stupid!"
<<<
<a class="tc-float-right">[img width= 300 [puzzle.jpg]]</a> ''Narrative continuity:''
* When we are mentalizing well we can piece together bits of the puzzle to understand the //story// behind behaviour (our's or someone else's)
* We are able to make sense of behaviour based not only on a person's current mental state (e.g. thoughts and feelings) but also on other contextual factors: e.g. past experiences, beliefs, culture, family history and so on
Consider this:
<<<
“I don't know why I started drinking again. I just screwed up.”
<<<
vs. this:
<<<
“I started drinking again. It was the anniversary of losing my husband last week and I've always found this time of year hard. Things were really pressured at work as well. I knew I wasn't coping but I was brought up to do the stiff upper lip thing so I didn't tell anyone. In the end I couldn't bear it any more - I just wanted to feel better for a few hours. ”
<<<
<a class="tc-float-right">[img width= 300 [inshoes.jpg]]</a> ''Perspective taking:''
*We remember that the way we see things is just one perspective and that there are other other ways of thinking about things
*We can put ourselves in someone else's shoes, and imagine what things might be like from their perspective
*We can bear in mind some of the //reasons// why different people might take different perspectives on things
''Knowing yours is just one perspective''
Consider this:
<<<
"It was no big deal, why is everyone going on about it?"
<<<
vs this:
<<<
"From my point of view it wasn't too bad, but then I've been through this before, so I can see why others might feel differently."
<<<
''Putting yourself in someone else's shoes''
Consider this:
<<<
"Julie is a drama queen, she totally overreacted"
<<<
vs this:
<<<
"I've been trying to imagine what this would feel like for Julie. When I think about what she's has had to go through recently, I can see how hard this must have been for her"
<<<
!!!!Source: Marianne ~McGowan
!!Broadcasting
The purpose of this page is to provide potential commissioners, managers and/or trainees with an overview of the feedback that we have received from AMBIT trainings over the past two years (2018-2020) before the pandemic. We are currently examining the feedback of training that we have provided on zoom during the pandemic.
!!Types of training
There are two routes to training either as advertised (open) or commissioned (bespoke). So within those categories we have:
*Advertised trainings:
**Advertised Local Facilitator Training (LFT)
**Advertised multi-team training (MTT)
*Commissioned trainings:
**Commissioned LFT
**Commissioned team training
**Commissioned multi-team training
Commissioned trainings are often for people from a particular location but not always – sometimes we might be commissioned to do an LFT for an organisation who have locations across the country.
There are important differences between advertised and commissioned trainings, which you might expect to have an impact on outcome: there will always have been a consultation day for teams sending people on commissioned trainings and training will be tailored on the basis of that. Most people on advertised trainings have not had a consultation day and training won’t be tailored (though they will always have had an engagement call to try to understand their objectives).
The contents of this page also aims to provide [[Local Facilitators|AMBIT Local Facilitators]] with some guidance as to how [[Session Feedback Forms|Session Feedback Form.pdf]] completed at the end of a days training may be more fully understood by reference to other data and how this may support meaningful learning.
!! Session Feedback Forms
All types of training have used the same session feedback forms from 2018 - 2020 (up until the pandemic) and these have been collated. The end of day session feedback form asks four key questions which trainees are asked rate on a scale of 1-7 (with 1 being the least and 7 being the most).
* How engaged did you feel in the session?
* How did you find the quality of the facilitation?
* How helpful was the session in enabling you to learn knowledge, skills or ways of thinking?
* How much do you feel that you will be able to use the knowledge, skills or ways of thinking from this session in your work?
!!Summarising this feedback data
We have several methods of summarising this feedback data.
Firstly, we wanted to look at how the training was rated by the trainees. To do this, examined what proportion of ratings were rated very positively (either a 6 or a 7). We found this more informative than an average score which had no intuitive meaning of its own. We looked at this in relation to each of the four questions for a period of approximately two years before the Covid pandemic in 2020 to provide baseline data for each question in the questionnaire. 1092 feedback forms were completed.
!!!How well is the training rated by the trainees?
The table below presents the % of responses that were rated 6 or 7 on each of the four questions.
|!Question|!% of Responses Rated 6 or 7|
|How engaged did you feel in the session?| 83% |
|How did you find the quality of the facilitation?| 92% |
|How helpful was the session in enabling you to learn knowledge, skills or ways of thinking?| 87% |
|How much do you feel that you will be able to use the knowledge, skills or ways of thinking from this session in your work?| 83% |
Less that 0.3% of the ratings had a score of 1 or 2 for each of the questions.
''These ratings suggest that the training was very positively received by the trainees.'' Of particular note was that over 90% of the ratings of the quality of the facilitation were very high (either 6-7).
!!!Does feedback vary between individuals or by teams?.
Not all teams experience the training in the same way. To look at this variation, we have examined the average total score per trainee. This measure has a score of between 4-28 with higher scores being more positive. This provides an indication of general satisfaction with the training. The average score for a team can then be computed so that we can see that some teams have a generally more positive experience of training than others.
Secondly, we looked at the % of responses that were rated very highly (6 or 7) for each respondent and then for each team. We wanted to get a sense of how much the training was rated in a very positive way. We saw this as a marker of the degree to which a team positively endorsed and were enthusiastic about the AMBIT approach. We constructed a scale that so that , for example, teams where over 85% of responses had high ratings were considered to be an indication of a very high and positive experience by the team.
|!Experience of training|% high scores|
|Very high satisfaction |>86%|
|High satisfaction|71-85%|
|Moderate satisfaction|51-70%|
|Low satisfaction|<49%|
More detailed summaries of the feedback data using these two measures can be found separately for each year in the following pages
#[[Training Feedback for 2018]]
#[[Training Feedback for 2019]]
#[[Training Feedback for 2020-21]]
!!Qualitative Feedback
At the end of each day trainees are provided with the opportunity to give qualitative feedback on the training so far. A detailed analysis of qualitative feedback was carried out by one of the AMBIT team (Cheryl Hunter) in 2020 who looked at over 565 free text comments from trainings delivered between 2018-2020. A summary report of this can be found at [[Qualitative feedback from AMBIT training]]
Below are some examples of the qualitative feedback that trainees helpfully provide us with:
@@.bubbles-triangle-border
It is nice that you can do AMBIT in parts and in our pace. Thank you for being so inspiring.
@@
@@.bubbles-triangle-border.bubbles-top
I enjoyed the moments when our team could have frank conversations and learn together and even experience a bit of tension with the safety of having the facilitators there.
@@
@@.bubbles-triangle-border
I think that my work and the work of my team will change a great deal. Not only will we be mentalizing with our clients, but also the Network that we work with and thus bring these relationships closer and better. I am confident that I can enthuse the team to take on the skills that I shall deliver.
@@
@@.bubbles-triangle-border.bubbles-top
It provides an easy to use framework to support staff with their work with clients, learning and work with other agencies.
@@
@@.bubbles-triangle-border
The facilitators were amazing at creating and holding a safe and supportive space and I really appreciated that.
@@
@@.bubbles-triangle-border.bubbles-top
Love the calm approach from both facilitators and an acknowledgement of group needs. Meaningful approaches to tasks in order to help facilitate change positively. Thank you!
@@
@@.bubbles-triangle-border
The trainers were excellent, very approachable and knowledgeable.
@@
This manual is constantly being changed and developed. It is designed as a dynamic, adaptive Manualization rather than a finished text. The manuals are built to be constantly improved, and ''improvements rely on feedback''.
!!Types of feedback:
#''Glitches'' - links that don't work, text that doesn't make sense, stuff that annoys you rather than helps you.
#''Omissions'' - stuff you think should be there, that is not there.
#''Improvements'' - found a bit of text, etc, that you can write better? Send it in!
#''Praise'' - if you must... it is helpful to now if something is particularly helpful
!!How to send feedback
#''Email us''- Send emails to mailto:ambit@annafreud.org
#''AMBIT and Tiddlymanual discussion group-'' There is a (currently not much used, but the more the merrier) Google Group for discussion of tiddlymanuals and ambit. You will need to request an invitation to join this group when you first go there. Click on the link below, and you will be able to do this. [[Visit the ambit-tiddlymanuals Google Group|http://groups.google.com/group/ambit-tiddlymanuals]]
!!NOT a helpline!
The ambit project does not have the resources to run a technical helpline, although we will try to be helpful wherever we can - contact us at the [[Anna Freud National Centre for Children and Families]]. If you get stuck with a technical problem you can generally find the solution inside the manual in the [[User Guide]].
!!Technical help:
TiddlyWiki is driven by a large and extremely helpful community of programmers, who are generally very happy to share their expertise and via the [[TiddlyWiki Google group|http://groups.google.com/group/tiddlywiki]] they are usually quick to respond to even the simplest and least technically-adept questions! If you are not a "techie" don't worry, just say so; the tiddlyspace project is trying very hard to simplify things so that more non-technical users can use it with ease, so your experience is extremely valuable feedback for the community.
If you post to this group:
* ''Title'' your help request as clearly as you can (it's like [[Marking the Task]] for AMBIT!)
* Tell them ''who you are'' and that ''this relates to the AMBIT project'' (the AMBIT community is an important group of "end-users"for the Tiddlyspace community.)
* Remember that ''the Tiddly Space community is a voluntary group'', and will mostly be helping you fix things just because they are being helpful - so hold back if you are frustrated!
* Tell them briefly what you are stuck with, and give them the website URL (the address in your browser bar) so they can have a look.
* If you can, tell them what browser you are using (Internet Explorer, Firefox, Safari, etc) and better still which VERSION you are using (look under the Help in your browser, and select "About Windows Explorer" etc, to find this.
* Tell them whether you are on a Mac or a PC and if you can what operating system (eg windows XP, or Windows 7, etc) this will all be helpful.
* in general questions get answered amazingly quickly as the Tiddlyspace community is worldwide, and lots of the common glitches are well understood.
You can also go to the [[TiddlyWiki website|http://www.tiddlywiki.com]] which has lots of links to other sources of help, as an open source project.
This the //emotional state// (happy, sad, fearful, calm, etc).
Feelings in-the-here-and-now are referred to as the person's //"affect"//, while feelings "averaged out" over a period of time are also referred to as //"mood"//.
!Feeling influences [[Behaviour]]
For instance, if I am feeling depressed I am less likely to go out to meet my friends. If I am anxious I am more likely to 'snap' at friends, etc etc...
![[Behaviour]] influences Feelings
E.g. If I don't go out I am more likely to feel lonely... and more depressed. so far, so obvious...
![[Thinking]] influences Feeling
If I repeatedly think to myself "I am a failure" or "nobody wants me around" the very act of "running" such thoughts in my mind is likely to depress me.
An analogy that can be helpful in explaining this is [[MP3's are like thoughts]]
This is a playful way of helping an individual to use [[Explicit mentalization]]. It is probably best for younger children, but in the right, and playful, context, even adults or adolescents can enjoy this.
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/arQ16HDvCnQ?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/arQ16HDvCnQ?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
*A number of words describing emotional states are written out (or presented on a pre-formed piece of paper - see slides at [[Mentalizing Therapy Techniques]].
*A spinner/pointer is placed in the middle so that if it is spun, it will rest pointing at one or other word.
*The subject is asked to spin the pointer, and then to imitate another person (usually a family member) as they might appear if they were feeling that emotion.
*In a family session it is essential to maintain the humour and playfulness.
*Get feedback on the play-acting: //“How did he do?!”//
*The idea is to generate discussion and reflection ([[Explicit mentalization]]) in a safe playful way, not to expect players to get things ‘right’ or ‘wrong’...
!!Defintion:
Fillers are the "preferred non-mentalizing narratives" that tend to prevail in any family when misunderstandings arise.
>//E.g. Repeated (and often repetitious) attempts to declare, or draw conclusions, about who did what, when, what someone should or shouldn’t do, and crucially ''whose fault it is''.//
!!Response to Fillers:
The therapist uses [[Mentalizing Therapy Techniques]] to slow down interactions and focus the spotlight on ''how feelings were experienced, communicated (or mis-communicated) and reacted to, and how cycles of non-mentalizing interactions are thus perpetuated''.
* Each member of the family has to list six personality traits about themselves ''including one that is not true about him/herself''.
* The aim of the game is to try to choose something that the rest of the family //will find hard to discover//.
* The rest of the family have to have a conversation together about which one of the six traits is false and to give reason for their individual choices.
* After everyone has made their choice, the whole group have a conversation about the reasoning for their choices.
*This is a technique that might be used in working with families using mentalization based therapy for families [[MBT-F]]
Thanks to Jon Allen
The [[Core Features of AMBIT]] suggest that taking measures that support a [[Keyworker well-connected to wider team]] are important.
Teams or larger groups can often inhibit some people from expressing their thoughts views experiences, which means that the Team's understanding of itself is always at risk of being defined by those team members who are louder, more confident at speaking in larger groups, or [[writing things in the team's manual|Manualization]]!
!!The Exercise
*The large team (or group of teams) divides into a number of //smaller groups// in order to discuss a specific issue.
**The size of these groups will be determined by the overall numbers, etc, but ideally they will be intimate enough so that every member of those small groups will feel able to talk freely.
*In each of these small groups one person will be the nominated "consultant".
**Who gets to ''//be//'' the consultant will be determined by circumstances...
**Some situations will allow someone from a //separate team// to fulfil this role
**Alternatively, someone who does not work so directly with the other members of that small group would be appropriate.
**Alternatively, some team members may wish to volunteer or agree to being "volunteered".
*After discussion for an agreed period of time, the separate small groups return to the large group setting.
*At this point a single "fishbowl discussion" is set up, between just the consultants, who discuss their experiences and thoughts about what it was like to be in their separate small groups, whilst the rest of the large group listen, without interrupting
**After a set period of time, there may be scope for some reflection in the larger group about what they have heard.
!!Why?
The point of this is:
* To sift a wider variety of viewpoints that may not ordinarily get heard in the larger group
* To stimulate reflection ([[Mentalization]]) on the viewpoints of others
* To generate a clearer shared understanding of what the shades of opinion and beliefs are in this team - to which it is intended that individual will be [[well-connected|Keyworker well-connected to wider team]].
* More generally, this is a good exercise to help discussion about an issue that may raise strong feelings and differences.
!!What then?
* If some consensus or learning points are generated from this discussion, then this might well be an ideal opportunity to move to [[Manualization]] of these points.
!!Learning objectives from the Fishtank clip
* To practice monitoring sensitively the moment-by-moment shifting of states of mind
* from mentalizing to non-mentalizing, and back, in relation to the coming and going of stress...
!!Exercise:
* Watch the ''opening 7:04 minutes'' of this powerful film Fishtank and spot examples of [[Mentalization]], and [[Pre-mentalistic stances]]
* Have small group discussions about this
* Consider the contexts where bits of mentalizing are possible, and where it is lost.
* There are LOTS of examples in here!
!!Themes to draw out in group feedback
After small group discussion, invite feedback in whole group discussion.
''Mentalizing:''
*''”You know what I’m like”'' comment by Mia when she is leaving a voicemail. She seems to be acknowledging that she gets in to certain behaviours in certain states (hurt, anger, abandonment?) and that her friend is likely to recognise this too.
*''Mia makes a //joke// that relies on mentalizing:'' When her friend’s dad says “I’ll have you one of these days, Mia!” she responds “You should be so lucky...” This is only funny if we able to mentalize! We mentalize Mia as having understood (accurately mentalized) that what the dad really intended to communicate with his threat (I’ll beat you up!), but she is pretending she thought that he meant something else (to "have someone" can mean to have sex with them). Most humour requires multiple perspective taking.
*''Mia appears to mentalize the horse'' – perhaps it is distressed and wants to be free? However she does not seem to recognise the potential impact on the horse of banging on its chain. She looks back after having been chased off, and appears to notice the apparently //attuned// response of the boy - who //comforts// the horse by stroking it
*''Mia appears to mentalize the dog.'' She mentalizes that his behaviour suggests he is made anxious by someone coming through the door suddenly, and she seeks to reassure him by saying //“Don’t worry, it’s only me.”// whilst crouching down to his level and stroking him
''Non-mentalizing:''
*Evidence of [[teleology|Teleological thinking]] (head butt)
*Possible [[Psychic equivalence]]: “You're what’s wrong with me!”
*Multiple incidents of negative interpretations of one another’s intentions resulting in hostile responses
*Domino effect of the break-down of mentalizing in most of the human interactions
''Different perspectives:''
Trainees will often voice //different interpretations of events//, particularly in relation to ''the dance scene:''
* some think Mia wants to join in
* others think she is mocking the other girls
* Others might feel she is worried for the girls in relation to the male watchers
It can be helpful to draw these out and mark the differences. It may be that she is switching in and out of mentalizing and non-mentalizing states of mind very rapidly: //The different views on this part of the clip demonstrate that mentalizing can only ever be a best guess// rather than something that has concrete, 'right and wrong' answers.
* Sometimes I don't really know why I said or did something until a long time after the event
* A mentalizing stance in the person in front me will reassure me that they are authentic, compassionate, and want to understand properly - rather than to "put me in a box".
* Mentalizing is ''not mind reading'' it is the what is happening when I act as though there are minds involved, that are opaque (you can't read them, only estimate, imagine, make best guesses about them.)
Fixsen and his colleagues reviewed the literature on implementation science ([[Fixsen, et al (2005) Implementation Research: A Synthesis of the Literature]]) and suggested that implementation tends to follow four discrete stages. These stages have been estimated to take between 2-4 years and emphasise that program implementation is a process rather than an event. .
!Exploration and Adoption
Teams may engage in exploration for a wide range of reasons such as a wish to improve effectiveness or to ensure a better fit between community needs (the client group) and the skills and resources of the team or service. The process may be guided by feedback from staff around training needs and service managers exploring different training opportunities for their staff teams.
!Program Installation
This stage involves organisations ensuring that all the components of the program are properly installed and supported. This is likely to include staff training, organisational changes and basic systems such as IT.
!Initial Implementation
This has been described as 'the initial awkward stage' of implementation. The organisation will probably experience considerable anxieties about adopting new methods and leaders and supervsiors may lack confidence in sustaining new methods during this period. Many implementation projects end during this phase.
!Full Operation
The new method of working becomes firmly established and it becomes 'business as usual'. Staff have become more confident in the methods and experienced in handling common challenges to the adopted method of working.
[img[IS.JPG]]<<imageMap>>
!Abstract
Summarizes findings from the review of the research literature on implementation. The reivew process began by identifying literature reporting any efforts to collect data on attempts to implement practices or programs in any domain, including agriculture, business, child welfare, engineering, health, juvenile justice, manufacturing, medicine, mental health, nursing and social services.
Over the past decade, the science related to developing and identifying "evidence-based practices and programs" has improved- however the science related to implementing these programs with fidelity and good outcomes for consumers lag far behind. To this end, our intent is to describe the current state of the science of implementation, and identify what it will take to transmit innovative programs and practices to mental health, social services, juvenile justice, education, early childhood education, employment services, and substance abuse prevention and treatment. This monograph summarizes findings from the review of the research literature on implementation and proposes frameworks for understanding effective implementation processes. The results of this literature review and synthesis confirm that systematic implementation practices are essential to any national attempt to use the products of science - such as evidence-based programs - to improve the lives of its citizens.
!Citation
Fixsen, D. L., Naoom, S. F., Blase, K. A., Friedman, R. M., & Wallace, F. (2005). Implementation research: A synthesis of the literature. Tampa, FL: University of South Florida, Louis de la Parte Florida Mental Health Institute, The National Implementation Research Network.
http://cfs.cbcs.usf.edu/_docs/publications/NIRN_Monograph_Full.pdf
Each family has elements in their own culture which, if understood and utilized, can become levers to actualize and expand the family's behavioural and experiential repertoire. See also StrengthsResiliencies.
!!!Some of the techniques used are:
1. Identifying competence in each family member as well as in their various relationships with one another. This includes pinpointing behaviours that have positive effects on daily family interaction ("What is it that you can do to please your spouse / parent / child?")
2. Identifying past positive elements in their interaction (e.g. exploring how they have successfully supported each other during crises in the past; exploring what attracted them to each other originally)
3. Reframing. This is a technique that aims to give an alternative meaning to events, which fits the events as well as the explanation previously subscribed to by the family, but which contains some leverage for change.
4. Searching for fluctuations of or exceptions to some of the symptomatic behaviours ("I'm interested in the times when it happens less or when it does not happen at all. So when you are doing that...it doesn't happen") and framing these positively as potential solutions. Families can also be asked to monitor exceptions to negative patterns between sessions (see section 10 on inter-session tasks).
5. Focusing on positives. The KW will at times try to discourage conversation that is relentlessly problem-focused or complaining about each other, and will try to enhance talk that looks at positives, solutions or small changes. For example, when someone is exclusively focused on the gloomiest part of their lives, the KW could use subjective scales to turn the family's attention towards some positive aspects: ("If on a scale from 1 to 10, 10 being the way you feel when things are really bad, you had to say how you felt when things were a bit better... where would you place yourself/him or her? When was the last time that happened? What did you do to make that happen? When and how could you do more of that?")
The intention of the interview is to first hear about the work of the team and then to think whether AMBIT has contributed to that.
Ten question prompts.
#Tell me about the clients that your team works with? How would you describe this group?
#Tell me about the team that you have? Who is in it?
#How do you work as a team?
# What other teams do you work with closely?
#How does that work?
#How does your team develop its ideas about what works well in your work?
#What has been the biggest barriers or challenges to the work of your team?
#What has been your biggest achievements?
# What role has AMBIT played in this? Either around encouraging mentalizing? or around the more specific aspects of the AMBIT model?
#What role do you feel you have played in this and where would you like to take things going forward?
This is a training plan designed around a 2 day training for a team that has previously been trained, but which has new staff who have arrived AFTER the original training.
Follow up trainings are likely to be adapted to suit the needs of the team, and are arranged on an ad-hoc basis at present.
!!First day to be focused on training for staff who have not attended a previous training.
Below is a basic menu of what we could cover. It would be lively and concise if we did it this way and we could do this in five hours.
However, this could be modified by what emerges at the end of the first exercise around training objectives.
#''Respecting existing expertise''
*What are we good at now?
*What do we need to learn about (training objectives)
#''Mentalization''
*The basic theory (30 minutes)
*Practice (Passed out Discussion)
#''Supervisory structures''
*The basic theory (15 minutes)
*Practice (Thinking Together)
*Local application in [[OUR Team]]
#''Addressing the network''
*The basic theory (15 minutes)
*Practice (Disintegration Grid)
*Local application in [[OUR Team]] (existing [[AMBIT Lead]]s to lead)
#''Active Planning''
*The basic theory (15 minutes)
*Local application in [[OUR Team]] (existing [[AMBIT Lead]]s to lead)
#''Manualizing''
*The basic theory (15 minutes)
*Practice a current live issue (existing [[AMBIT Lead]]s to FACILITATE)
!!Second day to pick up on themes identified by staff who have done previous training.
Based on these ideas we suggest.
#''Reviewing where we have got to: what works, what doesn't''.Start in groups of the different services again with a couple of observers and share:
##examples of good AMBIT practice e.g. real life examples
##areas where it has been difficult to implement and what has got in the way
##consider training needs noted from previous training
#''Dis-integration - its still so hard to understand why people can be so unhelpful!''
##Take a couple of shared cases across different CAMHS teams that have worked okay.
##Sculpt a particularly challenging case.
##Mentalise the perspective of adult mental health to think about transitions to adult teams
#''[[Manualization]]''
##Practice now. Each team take a live issue and practice doing a manualisation process
##Review some local manual pages.
##Key issues: small group discussion.
###Do we manualise the things that matter?
###How do we manualise if we just disagree about things
###Doesn't manualising ignore the power hierarchy?
###Just saying what we should do doesn't help with how it feels.
#''Some new stuff! What do we know about client experience and outcomes?''
##Improving mentalising by asking the clients. How do we check out what it is like for young people?
##The role of outcomes in containing staff anxiety.
Reference: Fonagy et al (2018) Lancet Psychiatry. Published on line January 4th 2018.
This is a very important comparator study with very high standard methodology and large sample size.
Multi-systemic Therapy (MST) is a very well evaluated and highly developed intervention for young people at risk of delinquency and anti-social behaviour. Although the target population is more specific than for AMBIT, the outcomes form this intervention provide useful comparators for AMBIT.
In this particular paper, the results of a controlled trial of MST are described which showed that it was not superior to treatment as usual., although both arms of the trial showed improvements in the young people.
The outcomes for some familiar measures are useful benchmarks for AMBIT.
For example, in this trial total scores on Parent SDQ are reported for MST and treatment as usual. This reported a reduction in total scores at 12 months following the start of the intervention of 5 points (21.6 (SD 6.2) to 16.6 (SD 7.4). Scores for treatment as usual group were 21.6 (SD6.5) reduced to 18.0 (SD 7.3), a total score reduction of 3.6.
A comparison with parent SDQ scores for AMBIT studies show a reduction of 3.3 points for the AMASS evaluation and 3. 39 for the Brisbane study.
Published in 2014, by Guilford, this is a comprehensive update of the original edition of this book, reviewing all treatment trials across the field of child and adolescent mental health.
!!!Publisher's blurb:
The standard reference in the field, this acclaimed work synthesizes findings from hundreds of carefully selected studies of mental health treatments for children and adolescents. Chapters on frequently encountered clinical problems systematically review the available data, identify gaps in what is known, and spell out recommendations for evidence-based practice. The authors draw on extensive clinical experience as well as research expertise. Showcasing the most effective psychosocial and pharmacological interventions for young patients, they also address challenges in translating research into real-world clinical practice.New to This Edition
* Incorporates over a decade of research advances and evolving models of evidence-based care.
* New chapter topic: child maltreatment.
* Separate chapters on self-injurious behavior, eating disorders, and substance use disorders (previously covered in a single chapter on self-harming disorders).
* Expanded chapters on depression, anxiety, and conduct disorder.
* Includes reviews of the expanding range of manualized psychosocial "treatment packages" for children.
[[Amazon|http://www.amazon.co.uk/What-Works-Whom-Treatments-Adolescents/dp/1462516181/ref=sr_1_3?s=books&ie=UTF8&qid=1406314135&sr=1-3&keywords=what+works+for+whom]]
!No clashes intended
The AMBIT approach stresses the need for robust and clear SupervisoryStructures, but it does not prescribe a rigid and specific formal supervision process for AMBIT, in recognition of the many different kins of teams and settings in which it is being used. Importantly ''it does not seek to replace or alter existing supervision arrangements that may be dictated by professional bodies''.
The intention is to present a mentalization based approach which can be adapted to a wide range of organisational arrangements or settings for teams working in both the voluntary sector or statutory services. So without undermining the place of formal supervision sessions (which //may// potentially, however, be usefully conducted along the lines we present) the approach strongly emphasises the informal but explicit role that should be played by all team members in supporting colleagues to maintain a mentalizing stance (see [[The Therapist's Mentalizing Stance]]) in their work (see [[SupervisoryStructures]]).
!Mentalization in supervision
[[Mentalization]]-based supervision can be provided in a number of ways in formal settings - either by a named supervisor within the team, or by supervisors from outside the team, and in individual or group settings (see [[Team Meetings]]).
The exact service design is less significant than the question of whether or not the team as a whole recognises the central importance of this as //part of the clinical care being provided//, and shares an understanding of the outcome it is designed to achieve - which is primarily to ''sustain or restore accurate mentalizing in the [[Key Worker]]'' and via that to promote safer and more effective interventions for the young people. Note that it is NOT to offer access to an expert who can inform the worker //"what is really happening"// for the young person or family they are working with.
!OK, there is some prescription...!
* There is a page for [[Suggested structure for an (internal) AMBIT Supervision session]]
* There is a page for [[Team Meetings]] which are often the setting for group supervision.
Despite the AMBIT project's determination to avoid too prescriptive an approach to formal supervision, our experience over the last four years has suggested that it may be helpful for teams to consider a number of aspects of formal supervision within their service.
# We recognise that supervisors will come from a range of professional backgrounds and may well have well established methods of supervision.
# We believe that a mentalizing approach is consistent with most therapeutic modalities of work with young people.
#Evidence from [[Implementation Science]] indicates that ''new methods of working will not become established unless it is used as part of staff supervision''.
We suggest therefore that supervisors for an AMBIT informed team should:-
* have done some basic training in AMBIT
* be familiar with the AMBIT approach and understand its key features.
* explicitly explore the theme of mentalization as part case supervision.
* have some knowledge of the AMBIT manual and how to access it.
* encourage the use of the manual in problem solving around practice issues
Our experience is that, if these basic requirements are not in place, the development of a mentalizing approach within a team is unlikely to prosper and that staff will not be enabled to integrate new ideas of practice into their work.
It may be helpful to consider this as part of your team's [[Implementation Plan]]
This page provides editors with guidance on how to format pages in the wiki, keeping in mind the accessibility of our readers
!!''General format''
*All manuals to have a Top Menu bar
*All manuals to have the same size side bar
*All manuals to have the Anna Freud logo on the side bar
*All manuals to have the name of the manual on the side bar in same colour (black)
!!''Colours''
*Colour on brand for links, top bars, titles, text colors (ie make the standard ‘blue’ a AF blue?)
*Different colors (as long as on brand) for top bars for different manuals
* Avoid the following colour ''combinations ''as they are commonly unfriendly to those with colour vision deficiencies:
**green/red, blue/purple and light green/yellow
!!''Text''
*All text to be in ‘New verdana’
*The spacing should reflect the size of the font- i.e. headings should have larger spacing around them/ underneath them and main text should have smaller spacing (By a fixed amount that is consistent across manuals)
!!''Headings''
*Use headings correctly to give structure to pages and make content scannable. Do not use bold text //instead //of headings (choose H2, H3, etc.)
*All word in headings to begin with upper case except for joining words such as: a, and, of
* ! (H1): ''don’t use'' in page text as too big (same size as page title)
* !! (H2): used for all Headings, and to be in'' bold black ''
* !!! (H3): used for all subheading and to be in bold black
* !!!!! (H5): to be used for ‘Source:’ not bold (Should be at the top of the page)
* Headings should not include any symbols such as ':' or full stops
!!''Linking''
*Google doc buttons: need to be smaller, rounded edges – change colour when you hover over it?
* YouTube button- to be created small as well but different colour – link to style of youtube- to make it clear
* Website links- to be hidden by:
[[
word | website ]]
!!Videos & Images
*Use captions for video content & images
*Do ''not ''convey meaning via visual media alone – especially avoid text on images (this is not screen reader accessible and won’t respond well to resizing on different devices.)
!!Other
*''Never use'' ‘click here’, ‘read more’ or ‘here’ for your hyperlink titles. Use a short and descriptive title that describes the link destination e.g. 'Manual on Anxiety & Depression'
*Remember reading is more difficult online than in print
*Keep copy concise and meaningful
!!What is a formulation?
* A formulation is a [[mentalized|Mentalization]] summary of your [[Assessment]] that offers:
** a coherent story of [[What's the problem?]]
** rational avenues for therapeutic work, by making sense of your Treatment Aims.
* Formulations will change over time, reflecting learning on the part of the worker and young person, or changing circumstances.
* Formulations can only really be built in COLLABORATION with the client.
* Formulations are subtly, but importantly different from Diagnoses:
** They include mentalizing, the "making sense" function
** They attempt to address specific experiences
** ''Diagnosis'' categorises symptoms and signs in relation to populations, and from this offers predicted outcomes (prognosis) and evidence of what treatments might or might not be effective.
!!!An example
See [[Examples of Mentalizing Formulations]]
!!What do you do with it?
Critically, a formulation must be:
* ''(a) RECORDED'' - this is an important piece of work.
** The act of writing it down, or representing it as a diagram, etc, helps in the process of making sense of it.
** From the point of view of the young person, it also ensures that the worker "shows their cards" (we might describe this as [[Broadcasting Intentions]]).
* ''(b) SHARED'' tentatively but DIRECTLY with the young person.
** This is a //personal message// to the young person
** It might take the form of a written letter, a diagram, a piece of video, etc, ([[Examples of Mentalizing Formulations]]).
** This is a separate job from record taking; it is an //intervention// - the introduction of NEW INFORMATION to the system (i.e. //"How my difficulties are seen and understood"//).
* ''(c) Built up as a WORK IN PROGRESS''
** Formulations should always be labelled as //"our THOUGHTS about you"//, rather than //"This IS YOU!"//)
!!What does a formulation look like?
There are many ways to present a tentative formulation, but there are some common features.
There are some [[Examples of Mentalizing Formulations]].
!!!General pointers:
The formulation is like the map, helping client and worker come to agreement on //"where we are"//, //"how we got here"//, and //"where we should start heading"//.
* The process of arriving at this is [[Assessment]] (we often refer to it as [[Taking Aim]].)
* To aim accurately, I need to know //where I am// as well as //where I want to go.//
* A ''structured assessment'' supports this; in the AMBIT manual we provide the [[AIM]] assessment, which is 'built in and ready to go', but other local teams may have their own assessment schedule that they would want to replace it with.
!!!A good formulation will include the following:
* ''Accurate reporting of DETAILS'' that the young person has shared - quoting them //verbatim// in particularly key areas. This emphasises the continuity between what is in their mind, and what appears in yours, and helps to foster [[Epistemic Trust]].
* ''Careful attention to LANGUAGE'' - using phrases like //"I wonder if..."// or //"As I write this, it seems to me..."//.
* ''There is a BALANCE'' between ''rephrasing/quoting'' what you have heard from the young person, and ''your own response'' to their account.
** //Depending on how much [[Epistemic Trust]] there is//, you may need to err more towards accurate representation of the __young person's position__, rather than a full explanation of your own.
** This is because presenting a "story" that appears too different from the young person's own account of themselves risks giving them the experience of not being understood, or of being overlooked.
* ''Well-developed collaboratively-agreed formulations almost inevitably lead to'' [[Aims and Goals]] - if yours doesn't, it probably requires more work - see [[Advice on setting Treatment Aims and Goals]].
!!!Areas to cover
* [[Presenting Problems]]
* [[Upstream (Background) Factors]]
* [[Triggers for problems]]
* [[Maintaining factors for problems]]
* [[StrengthsResiliencies]]
* [[Barriers to treatment]]
* The development of [[Aims and Goals]]
* [[Advice on setting Treatment Aims and Goals]]
See [[Examples of Mentalizing Formulations]]
!!__''Four Corners - a training exercise''__
This exercise is part of the introductory exercises that take place during Day 1 of an AMBIT training. As with many of the training exercises, it fulfills a number of purposes for both the trainees and the trainers, which are listed below.
!!!__How to set up the exercise__
''Materials'': flipchart paper, blu-tak, post-it notes
Trainers make 4 flipchart posters, which are displayed in 4 corners of the training space. Each poster is divided in half horizontally, with one question in each section of the page, with space below each question for trainees to write responses on post-it notes.
<center>{{4corners.PNG}}</center>
''Instructions to trainees'': Divide into small groups and spend 5 minutes at each poster, discussing responses to the questions as a group and writing responses on post-it notes. The trainers prompt groups to move round every 5 minutes.
''Purpose'': for trainers to build an understanding of the needs of the workers/teams represented at the training, to enable the training to be adapted to these.
//How to define the small groups - considerations for trainers//
There are a number of possibilities for devising the small groups, but because part of the purpose of the exercise is to begin to increase connection between workers through being more aware of each other's minds, then trainers should give some thought to how best to do this, depending on the context of the training:
* If MTT where the teams are unknown to each other and will not have ongoing relationships (e.g. because they work in different areas), the small groups should be teams.
* If it's a bespoke single team training, encourage trainees to group with people in their team who they know the least well.
* If TTT and people have come in pairs, encourage them to pair up with another team.
* If the training is part of a "wider system training initiative" (i.e. involves trainees from a range of local teams who are known to each other, where part of the commissioned training goal is to increase integration between these teams or to develop shared working models across teams) then it is useful to split up into mixed groups rather than to stay in teams, so that trainees begin the process of developing trusting relationships with different parts of the network.
Trainers roles during the exercise: join group discussions as an interested observer; try not to influence/guide the discussion unless you feel that the questions have been misunderstood. Use the opportunity to notice how they group are when they are responding to the questions.
!!!__Reflections after the exercise__:
Trainers to ask everyone to return to the large group and to spend 5-10 minutes taking feedback. Trainers to ask the group to feedback on their experience of taking part in the exercise - with a greater emphasis on hearing about the process, rather than the content of what was discussed. Trainers can prompt for reflections about what it was like to think and talk about these issues together - what did people make of what they saw on the posters etc.
Trainers can comment on anything they noticed from observing the group - e.g. balance of responses to questions; how easy/difficult it seemed to be to generate responses to particular questions; how the group responded to the "emotion" questions.
Trainers to make any connections to upcoming content (as relevant) but also highlight and affirm examples of the group tuning into and expressing need.
Trainers explain that they will read the comments on the posters in more detail during the break.
!!!__Learning outcomes__
There are a number of ways in which this exercise can be useful. These are outlined below.
!!!__For trainees__:
* to stimulate reflection on their experience of their work in key domains related to AMBIT (client, network, team and the emotional impact of the work).
* to create opportunities for trainees to share their perspectives with colleagues and to learn what others in their team think (which lays some of the foundations for well-connected teams, via establishing a sense of shared dilemmas)
* to promote openness in expressing vulnerabilities/struggles to colleagues (which will be essential to benefit from some of the later training exercises, which require trainees to explicitly help-seek from each other)
* to raise trainees awareness of some of the dilemmas inherent in the work that AMBIT is designed to help with (to increase the extent to which they will feel that the materials/tools are relevant to them)
* to share with the trainers more about their specific context, to support the trainers to adapt the material to local context.
!!!__For trainers__:
* to support the development of [[epistemic trust|Epistemic Trust]] with the trainees, by being able to show understanding in relation to some of the core dilemmas/experiences of the training group
* to notice what the balance of reflection is across the AMBIT domains and to invite some discussion around this (e.g. if a team does not note any dilemmas in relation to networking, some of the tools may not make intuitive sense (in which case building in more time to reflect on their experience of the networks might be useful).
*Emotional impact poster - to gauge how open the group is to expressing their emotional responses to the work.
- Are there a range of positive and negative emotions listed? Is there a balance?
- If there are gaps in either section, can the group be invited to help the trainers make sense of this?
- Can the trainers share some reflections of what this might be about?
- What might the trainers need to share about their own experiences of the work and those of other teams who have been trained to promote openness of expression around this?
NB. Trainers should be mindful that the rest of the material makes more sense when teams can explicitly acknowledge that there are difficult elements to the work.
----
!!The Adolescent Mentalization-based Integrative Treatment (AMBIT) approach to outcome evaluation and manualization: adopting a learning organization approach (Clin Child Psychol Psychiatry March 3, 2014 1359104514521640)
!!''Authors:''
Peter Fuggle (1), Dickon Bevington (1), Liz Cracknell(2), James Hanley (3), Suzanne Hare (2), John Lincoln (1), Garry Richardson (3), Nina Stevens (3), Heather Tovey (3), Sally Zlotowitz (4)
(1) = Anna Freud Centre, London, UK
(2) = Cambridgeshire Adolescent Substance Use Service (CASUS), Cambridge, UK
(3) = Adolescent ~Multi-Agency Support Service (AMASS), Islington, UK
(4) = ~MAC-UK, London, UK
!!''Abstract''
//AMBIT (Adolescent ~Mentalization-Based Integrative Treatment) is a developing team approach to working with hard-to-reach adolescents. The approach applies the principle of mentalization to relationships with clients, team relationships and working across agencies. It places a high priority on the need for locally developed evidence-based practice, and proposes that outcome evaluation needs to be explicitly linked with processes of team learning using a learning organization framework. A number of innovative methods of team learning are incorporated into the AMBIT approach, particularly a system of web-based wiki-formatted AMBIT manuals individualized for each participating team. The paper describes early development work of the model and illustrates ways of establishing explicit links between outcome evaluation, team learning and manualization by describing these methods as applied to two AMBIT-trained teams; one team working with young people on the edge of care (AMASS — the Adolescent ~Multi-Agency Support Service) and another working with substance use (CASUS – Child and Adolescent Substance Use Service in Cambridgeshire). Measurement of the primary outcomes for each team (which were generally very positive) facilitated team learning and adaptations of methods of practice that were consolidated through manualization.//
*[[Clinical Child Psychology and Psychiatry|https://journals.sagepub.com/doi/abs/10.1177/1359104514521640]]
!!!Clinical Child Psychology and Psychiatry, 1–15, 2021
Peter Fuggle1 , Laura Talbot1, James Wheeler1,
Jessica Rees1, Emily Ventre1, Verity Beehan2,
Suzanne Hare2, Dickon Bevington1 and
Liz Cracknell1
1Anna Freud National Centre for Children and Families (AFNCCF), London, UK
2Cambridgeshire Adolescent Substance Use Service (CASUS), Cambridge, UK
!!Abstract
Adaptive Mentalization Based Integrative Therapy (AMBIT) is a systemic, mentalization based intervention designed for young people with multiple problems including mental health problems. The purpose of this paper is to examine the impact of this approach both on clinical and functional outcomes for young people seen by a specialist young people’s substance use service between 2015 and 2018.
About 499 cases were seen by the service during this period. Substance use
outcomes were obtained for 383 cases using the Treatment Outcome Profile (TOP). Cannabis and alcohol use were the key substance use problems for 81% and 63% respectively. Functional outcomes using the AMBIT Integrative Measure (AIM) were obtained for 100 cases covering domains of daily living, socio-economic context, peer relationships and mental health.
At treatment end, cannabis use reduced significantly (t = 10.78; df = 311; p = .00; Cohen’s d ES.61 as did alcohol use (t = 6.938; df = 242; p = .000; ES 0.44). Functional improvements were shown in five out of seven domains with highly significant total functional improvements on key problems selected by the client (t = 14.01; df = 99; p = .000; ES1.34). Measuring functional as well as clinical
outcomes appears to reflect more accurately the overall benefit of the service to clients.
!Citation:
Fuggle, P., Fairbairn, J., & Fonagy, P. (2023). ''Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach.'' Psychology and Psychotherapy: Theory, Research and Practice, 00, 1–14. https://doi.org/10.1111/papt.12496
!PDF version
[[Fuggle Fairbairn Fonagy PDF.pdf]]
External link: https://bpspsychub.onlinelibrary.wiley.com/doi/epdf/10.1111/papt.12496
{{Fuggle Fairbairn Fonagy PDF.pdf}}
Supplementary information referred to in this paper is provided at the bottom of this page.
!Abstract
!!Purpose
Adolescent mentalisation-based integrative therapy (AMBIT) is a whole-systems approach designed to enhance the effectiveness and coordination of care for clients experiencing severe and pervasive difficulties in social and health care settings, who have not responded to traditional clinical approaches. AMBIT is a team-based manualised method that primarily aims to bolster mental state understanding and discourse focused on the client within and between teams. Over 300 teams worldwide have been trained in and adhere to AMBIT principles.
!!Method
In this paper, we review and summarise the outcomes reported by eight AMBIT-informed teams that have published their findings with young people. Each report is discussed, and limitations of the data provided are identified.
!!Results
A synthesis of the findings across the studies suggests a generally positive impact of teams informed by AMBIT with moderate to large effect sizes on reducing symptoms and improving functionality.
!!Conclusions
This study suggests that AMBIT may be a promising approach for young people with multiple problems but further research is needed to identify the active mechanisms of change in complex helping systems.
!Practitioner points
* A mentalisation-based approach such as AMBIT may be helpful for teams to provide effective care for those with multiple and severe needs including mental health needs.
* Integrated/coordinated care involving several teams around a shared client may benefit from a mentalised approach to such care (i.e., that they consider each other's states of mind) as part of their work.
* Effective help may benefit from focusing on who the client sees as helpful and who they trust as much as who has the expertise that they need.
* Many agencies contribute to supporting clients with mental health needs and staff from a wide range of agencies can be trained in a shared, non-specialist mentalisation-based approach to their work with clients with severe needs.
!Supplementary Information
Online supplement to ‘Outcomes for Adaptive Mentalization based Integrative Treatment (AMBIT) informed care for adolescents using a deployment based approach.’
!!!Details of services who were involved in the study are provided below.
''The Specialist Lothian CAMHS Service'', consisting of three interconnected teams, was established in 2011. These teams include the Adolescent Intensive Support Service (ITSS), the Early Psychosis Support Service (EPSS), and the Adolescent Day Programme (ADP) for young people (aged 13-18) with severe mental health needs that could not be met by outpatient services and where non-engagement with services was common. The young people had multiple problems, and many had received previous treatments and had a history of non-engagement with prior treatments. All staff underwent AMBIT training in 2011 and subsequently provided AMBIT training to other teams. Nine of the fifteen AMBIT features were rated as occurring most of the time, including mentalizing of clients, teams, and networks, as well as using AMBIT methods of practice such as thinking together and active planning. Two published studies of outcomes were conducted: Griffiths, Noble, Duffy & Schwannauer (2016) and Thomson, Griffiths, Fisher, McCabe, Abbott-Smith & Schwannauer et al. (2018).
The ''Cambridgeshire Child and Adolescent Substance Use Service (CASUS)'' is a multi-disciplinary (psychiatry, nursing, youth work, counselling) community-based NHS service that provides treatment to individuals under 21 years old with substance use disorders. Between 2013 and 2017, 499 young people aged between 12 and 20 years were referred for substance use treatment, of whom 383 attended an assessment appointment. Within this group, 100 were a more severe group with multiple life problems; for example, 41% were not in school or college. All staff received AMBIT training, and the team provided AMBIT training to other teams. Fourteen of the fifteen AMBIT features were rated as occurring most of the time, including all mentalizing features, all five AMBIT methods, and four aspects of learning as a team. An evaluation study was carried out by Fuggle, Talbot, Wheeler, Rees, Ventre, Beehan, Hare & Bevington (2021).
The ''Adolescent Multi-Agency Support Service (AMASS)'' is a specialist multi-disciplinary and multi-agency team focused on preventing family breakdown for young people aged 10 to 16 years with a high level of social adversity and mental health difficulties. The team, jointly led by social work and clinical psychology, included social work, education, and youth work staff. The team only accepted referrals from social care teams that had already provided a service deemed ineffective. Between 2007 and 2017, 181 families (80%) agreed to enter the programme, and 85% completed it. All participants had multiple severe life problems, including mental health needs. The team had full AMBIT training and provided AMBIT training to other teams. Thirteen of the fifteen AMBIT features were rated as occurring most of the time, including all aspects of mentalizing, four aspects of AMBIT methods of practice, and four aspects of AMBIT methods of learning. Talbot, Fuggle, Foyston & Lawson (2020) published an evaluation study of this service.
The ''Darwin Centre for Young People'' is a multi-disciplinary psychiatric inpatient and day patient unit for young people aged 12-18, trained in the AMBIT approach. AMBIT training took place in 2013 and was used as an organising framework to increase integration across various evidence-based therapies (e.g., family therapy, CBT, MBT). Aggregated outcome data for 331 young people who completed in-patient treatment between 2013 and 2019 were calculated. The team received full AMBIT training in 2013 and provided AMBIT training to other teams. Seven of the fifteen AMBIT features were rated as occurring most of the time, including mentalizing applied to supervision, three out of five AMBIT methods of practice, and three aspects of AMBIT methods of learning. Data for this review were collated from Darwin Centre Annual Reports between 2012 and 2019 (Fairbairn, 2021; Darwin Centre for Young People: Annual Report 2013-2014 (2014).
''Assertive Mobile Youth Outreach Service (AMYOS)'' is a community outreach service using an Assertive Community Treatment (ACT) approach for adolescents (13-19 years of age) with complex mental health problems and poor engagement with standard outpatient mental health support services. Between October 2016 and October 2019, 243 young people received and completed treatment. The group had multiple life problems beyond mental health needs, and on average, young people referred to AMYOS had been receiving a service from the community clinic for 7.32 months. The team was trained in Mentalization-Based Treatment (MBT) and the AMBIT approach and provided training to other teams. Fourteen of the fifteen AMBIT features were rated as occurring most of the time, including all aspects of mentalizing, five aspects of AMBIT methods of practice, and four aspects of AMBIT methods of learning. Daubney, Raeburn, Blackman, Jeffries, & Healy (2021) published an outcome study for the service.
The ''Bexley Outreach Team'', established in 2010, is a multi-disciplinary group working with young people with severe mental health problems and high risk. The team provides rapid response services, in-reach into in-patient units, and intensive community-based work, including group, individual, and family therapy. The team utilised AMBIT as a framework to integrate practice across modalities. Between 2011 and 2015, the team treated 764 young people aged between 12 and 18 years. In 2010, the team received AMBIT training and provided training for other teams. Eleven of the fifteen AMBIT features were rated as occurring most of the time, including three aspects of mentalizing, four aspects of AMBIT methods of practice, and four aspects of AMBIT methods of learning. Data based on annual service reports was reported in the CAMHS Adolescent Intensive Treatment and Outreach Service: annual report (2012) and was summarised by Harmon (2013). This compared the outcomes of 184 young people seen during the first four years of the new outreach service with hospital admissions from the four years preceding the new service.
The ''Camden Transformation Team'' comprised social care, health, and education staff working with families with high levels of need, collaborating to create an integrated team called the Transformation Team. This team allocated one key worker for each family. Families eligible for this programme needed to have three of four key problem areas: (i) school exclusions; (ii) anti-social behaviour; (iii) offending; (iv) adults without regular work. Sixty-four families from diverse ethnic backgrounds were approached to work with this service, with a median number of nine services involved in these families at referral. The team received AMBIT training and delivered AMBIT training to other teams. Eight of the fifteen AMBIT features were rated as occurring most of the time, including three aspects of mentalizing, three aspects of AMBIT methods of practice, and two aspects of AMBIT methods of learning. An evaluation study was carried out by University College London (Pilling, Butler, O’Brien & Hardy, 2014), which followed all 64 families.
The ''U-start Team in Copenhagen'', established in 2018, supports school reintegration for long-term absent students, initially at four local public schools. The team delivers a coordinated, cross-disciplinary, and multi-domain service to re-engage the student in school activities. The U-start team's work explicitly prioritises the coordination and integration of the complex networks around the student. Forty-five consecutively treated children and their families (14 females and 31 males, aged 7–17 years) with school absenteeism ranging from 1–2 months to 4 years participated in this project. The team participated in full AMBIT training and trained other teams. Eleven of the fifteen AMBIT features were rated as occurring most of the time, including four aspects of mentalizing, four aspects of AMBIT methods of practice, and three aspects of AMBIT methods of learning. An evaluation study was carried out by Stokholm and colleagues (Stokholm, Andersen, Bertelsen, & Sørensen, 2019), who collected outcomes for 45 consecutively treated children and their families. Complete pre- and post-intervention data were available for 28 cases.
!!Details of measures used by services in the study.
Additional details about the measures used are provided in this online supplement.
For ''general mental health'', the young person and/or parent versions of the Strengths and Difficulties Questionnaire (SDQ) (Goodman, 1997) or the Health of the Nation Outcome Scale for Children and Adolescents (HONOSCA) (Gowers, Harrington, Whitton, Lelliott, Beevor, Wing & Jezzard, 1999) were employed.
For ''specific symptom change'', the Beck Youth Inventory (BYI) (Steer, Kumar, Beck, & Beck, 2005), the Beck Depression Inventory (BDI) (Beck, Steer, & Brown, 1996), the Revised Children's Anxiety and Depression Scale (RCADS) (Chorpita, Yim, Moffitt, Umemoto & Francis, 2000), the Treatment Outcomes Profile (TOP) (Marsden, Farrell, Bradbury, Dale-Perera, Eastwood, Roxburgh & Taylor, 2008); National Treatment Agency and Public Health England (2010), and the Positive and Negative Syndrome Scale (PANSS) (Kay, Fiszbein, & Opler, 1987) were utilised.
For ''general functioning'' measures, the Clinical Global Assessment Scale (CGAS) (Shaffer, Gould, Brasic, Ambrosini, Fisher, Bird & Aluwahlia, 1983) and the similarly scaled AMBIT Integrative Measure (AIM) based on the Hampstead Child Adaptation Measure (HCAM) (Target, Fonagy, Schneider, Ensink & Janes, 2000; Bevington, Cracknell, Talbot, Smith, Fairbairn & Fuggle, 2021) were applied.
For assessment of ''family functioning'', the McMaster Family Assessment Device General Functioning Subscale (FAD-GF) (Byles, Byrne, Boyle & Offord, 1988) and, for quality of life, the World Health Organisation Quality of Life–BREF questionnaire (WHOQOL-BREF) (Whoqol Group, 1998) were employed.
Two ''locally devised measures'' were also used by some evaluations: The AMASS Outcomes Scale (AOS) (Talbot, Fuggle, Foyston, & Lawson, 2020) and the Troubled Families Outcome Measure (TFOM) (Pilling, Butler, O’Brien, & Hardy, 2014) for the AMASS and Camden evaluations, respectively.
Studies of ''service outcomes'' also assessed the frequency and length of hospital admissions, the frequency of young people avoiding coming into state care, and the number of pupils attending school regularly. These measures are based on routinely reported data, which is often imperfect; however, errors are likely to be random rather than biased, favouring an intervention.
!!References
1. Beck, A. T, Steer, R. A, & Brown, G. K. (1996). Beck Depression Inventory manual (2nd ed.). New York, NY: Psychological Corporation.
2. Bevington, D., Cracknell, L., Talbot, L., Smith, R., Fairbairn, J., Fuggle. P. (2021) The AMBIT Integrative Measure (AIM). AMBIT Online Manual https://manuals.annfreud.org/ambit/index.html
3. Byles, J., Byrne, C., Boyle, M. H., & Offord, D. R. (1988). Ontario Child Health Study: reliability and validity of the general functioning subscale of the McMaster Family Assessment Device. Family Process, 27(1), 97-104. doi: 10.1111/j.1545-5300.1988.00097.x
4. CAMHS Adolescent Intensive Treatment and Outreach Service: annual report (2012) Internal report for Oxleas NHS Foundation Trust.
5. Chorpita, B. F., Yim, L. M., Moffitt, C. E., Umemoto L. A., & Francis, S. E. (2000). Assessment of symptoms of DSM-IV anxiety and depression in children: A Revised Child Anxiety and Depression Scale. Behaviour Research and Therapy, 38, 835-855
6. Darwin Centre for Young People: Annual Report 2013-2014. (2014) Cambridgeshire and Peterborough NHS Foundation Trust.
7. Daubney, M., Raeburn, N., Blackman, K., Jeffries, H., Healy, K.L. (2021) Three Year Outcomes of Assertive Community Treatment for Adolescents with Complex Mental Health Problems who are difficult to engage. Journal of Child and Family Studies, 30(2), 502-516. Springer, New York.
8. Fairbairn, J. (2021) Summary of young people outcomes at the Darwin Centre for Young People 2013-2018. (Personal Communication]
9. Fuggle, P., Talbot, L., Wheeler, J., Rees, J., Ventre, E., Beehan., Hare, S., Bevington, D., Cracknell, L. (2021) Improving lives not just saying no to substances: evaluating outcomes for a young people’s substance use team trained in the AMBIT approach. Clinical Child Psychology and Psychiatry, 1-15.
10. Goodman, R. (1997). The Strengths and Difficulties Questionnaire: a research note. Journal of Child Psychology and Psychiatry, 38(5), 581-586.
11. Gowers SG, Rowlands L. Inpatient services. Current Opinion in Psychiatry. 2005 Jul 1;18(4):445-8.
12. Gowers, S. G., Harrington, R. C., Whitton, A., Lelliott, P., Beevor, A., Wing, J., & Jezzard, R. (1999). Brief scale for measuring the outcomes of emotional and behavioural disorders in children. Health of the Nation Outcome Scales for children and Adolescents (HoNOSCA). British Journal of Psychiatry, 174, 413-416.
13. Griffiths, H., Noble, A., Duffy, F. & Schwannauer, M. (2016) Innovations in Practice: Evaluating clinical outcome and service utilisation in an AMBIT-trained Tier 4 child and adolescent mental health service. Child and Adolescent Mental Health, 22(7), 170-174.
14. Harmon, S. (Autumn 2013). Using AMBIT to Reduce Adolescent In-Patient Admissions. AMBIT Conference presentation, Anna Freud Centre, 12 Maresfield Gardens, London, NWU5S3. Anna Freud Centre NCCF. Uploaded 22.05.2014. Dr Sarah Harmon. Using AMBIT to Reduce Inpatient Admissions. AMBIT Conference 2013. https://youtu.be/ALvv0yLC68k
15. Kay, S. R., Fiszbein, A., Opler, L. A. (1987). The positive and negative syndrome scale (PANSS) for schizophrenia. Schizophrenia Bulletin, 13(2), 261-276. doi: 10.1093/schbul/13.2.261
16. Marsden, J., Farrell, M., Bradbury, C., Dale-Perera, A., Eastwood, B., Roxburgh, M., & Taylor, S. (2008). Development of the Treatment Outcomes Profile. Addiction, 103(9), 1450-1460. doi: 10.1111/j.1360-0443.2008.02284.x
17. Pilling, S., Butler, S. O’Brien, M., Hardy, R. (2014) Camden Transformation Team: Interim Report. University College London.
18. Public Health England (2017) Young people’s statistics from the National Drug Treatment Monitoring System (NDTMS)1 April 2015 to 31 March 2016
19. Shaffer, D., Gould, M. S., Brasic, J., Ambrosini, P., Fisher, P., Bird, H., & Aluwahlia, S. (1983). A children's global assessment scale (CGAS). Archives of General Psychiatry, 40(11), 1228-1231.
20. Steer, R.A., Kumar, G., Beck, A.T., & Beck, J.S. (2005). Dimensionality of the Beck Youth Inventories with child psychiatric outpatients. Journal of Psychopathology and Behavioral Assessment, 27, 123-131.
21. Stokholm, M., Andersen, M.J., Bertelsen, L. & Sørensen, S. (2019): U-start: Udviklingsstart til børn og unge med skolevægring i Hvidovre kommune. In: Skolens fraværende børn – årsager og indsatser. Dafolo
22. Talbot, L., Fuggle, P., Foyston, Z., and Lawson, K. (2020) Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years. British Journal of Social Work (2020) 0, 1–20 doi: 10.1093/bjsw/bcz148
23. Target, M., Fonagy, P., Schneider, T., Ensink, K., & Janes, K. (2000). Raters' Manual for the Hampstead Child Adaptation Measure (HCAM). Unpublished manuscript. University College London and the Anna Freud Centre. London, UK.
24. Thomson, A., Griffiths, H., Fisher, R., McCabe, R., Abbott-Smith S., and Schwannauer, M. (2019) Treatment outcomes and associations in an adolescent-specific early intervention for psychosis service: Early Intervention in the Real World. Early Intervention In Psychiatry, 1-8.
25. Whoqol Group. (1998). Development of the World Health Organisation WHOQOL-BREF quality of life assessment. The WHOQOL Group. Psychological Medicine, 28(3), 551-558. doi: 10.1017/s0033291798006667
<center>[img[AMBITbook2_small.jpg]]</center>
''Fuggle, P., Talbot, L., Campbell, C., Fonagy, P., Bevington, D. (2023)'' //"Adaptive Mentalization-Based Integrative Treatment (AMBIT) for People with Multiple needs: Applications in Practice"//. ''Book, OUP''
Meeting the complex needs of some of the most vulnerable populations in our society often involves the need for connected networks of care providing health, social care, educational and voluntary sector services. This presents major challenges for both clients and practitioners for this to work well. Adaptive mentalization based integrative treatment (AMBIT) has been developed over the last 15 years to address the needs of both clients and practitioners in trying to make this work well. The basic framework for AMBIT was set out by the authors in AMBIT: A Guide for Teams to Develop Systems of Care in 2017 but continues to evolve through collaboration with practitioners across the world who work with people (both young people and adults) for whom many current services are not experienced as helpful.
AMBIT for People with Multiple Needs: Applications in Practice describes the progress of this collaboration and shows how AMBIT has been applied in health, social care and education settings across the world. Contributors convey the detail of what it is like to apply AMBIT to their work by combining case illustrations with detailed descriptions of therapeutic practice and technique, along with inspiring and remarkable stories of therapeutic change. The chapters examine therapeutic casework in very different services providing community and residential based care with adults and young people across Europe and the UK.
With AMBIT constantly evolving, the book explores recent developments in the AMBIT model and provides rich new thinking about how "helping" services can be supported to provide meaningful help and change.
If you would like to do some further reading on Working with your Client, save these links for later:
<<list-links "[tag[Further Reading]tag[Mod5]]">>
[[Active Planning|https://manuals.annafreud.org/ambit/#Active%20Planning]]
[[Working with your client|https://manuals.annafreud.org/ambit/#Working%20with%20your%20CLIENT]]
You can read more about [[Working with your NETWORKS]] and [[Addressing Dis-integration]] here in the manual
You can do further reading here in the manual:
[[LEARNING at work]]
[[Respect local practice and expertise]]
[[Respect for Evidence]]
There is [[lots more information on mentalizing|Mentalization]] in this manual
!The General Health Questionnaire
This is a brief 12-question screening questionnaire that helps gather a "snapshot" of the wellbeing of workers in a team. It is one of the recommended "pre-" and "post-training" measures that AMBIT recommends. The other measure we recommend is the [[AMBIT Service Evaluation Questionnaire (ASEQ)]]
!!GHQ-12 questionnaire:
[img[GHQ12.pdf]]
''"~Genito-Urinary Medicine"'' - a clinical service focused on ~STIs, or sexual health. Many areas will have special GUM clinics for young people, but not all.
<a class="tc-float-right">[img width="150" [gm.PNG]]</a>
!!!Project Officer
Gemma is Project Officer for the [[AMBIT programme]]. Gemma should be your first port of call if you would like to make an enquiry about AMBIT training, consultation or supervision.
[[Email Gemma|mailto:ambit@annafreud.org]]
<div style="clear:both;line-height:0px;"></div>
!Generalised difficulties:
There may be generalized or trait deficits in mentalizing ability in one member of the family, for example in a child presenting with oppositional behaviour.
!!!!Oppositional behaviour
Typically represents a non-mentalistic, physical effort by the child to control his feelings and generate a response in others.
!!!!Angry or violent outbursts
These have the effect of forcing caregivers to experience what the child experiences thus offering the child a sense that their feelings can have an impact. However, in the medium term, this immediate impact fails to secure effective support reciprocity, control or self-coherence. Instead the child’s non-mentalistic, coercive behaviour evokes non-mentalistic efforts of behavioural control from the caretakers, with resulting self-reinforcing and self-perpetuating cycles of non-mentalizing, coercive interactions.
!Partial Mentalization
!!!Intermittent Mentalization:
The capacity of family members to mentalize may break down intermittently __when dealing with //particular// thoughts and feelings.__
For example, parents who suffered physical abuse may ‘lose’ the capacity to mentalize when faced with a reminder of their own states of helplessness, anger or shame. Their child’s distress may be such a reminder.
Intermittent mentalization of the child may arise because each parent reflects only one side of the child’s experience. Each parent may well accurately perceive different aspects of the child’s mental state, but fail to integrate these between them. In other instances the alternative view of the child’s mental state is not fully expressed and a partial understanding of the child and her state(s) of mind predominates.
!!!Episodic Mentalizing
An individual family member’s, or indeed the entire family’s, mentalizing capacity may become impaired in an episodic, state-dependent fashion. For example, a child who is depressed may experience her thoughts and feelings about herself as entirely real, and ‘lose’ the perspective that would allow her to think differently about herself or others or to realize that her feelings might change. A feeling of hopelessness is thus taken to be an objective reality by the child as soon as it is experienced and it cannot be treated as ‘just a thought’, which could be challenged. The parents of the depressed child or adolescent, may then resonate with their child’s vulnerability (e.g. they all may feel that having few friends is a hopeless situation) or because the child’s behaviour may be experienced by them as an expression of their own failure or incompetence.
!!!Context-specific Mentalizing
Problems in mentalizing may also be context specific. For example, a parent may keep a great deal of distance from some areas of his or her adolescent child’s life, for example sexuality. As a result they are unable to mentalize that aspect of his or her child’s life.
Context-specific loss of mentalization is usually associated with stress. When exposed to huge pressure, most people can lose their capacity to think about thoughts and feelings in others. For example, quite dramatic temporary failures of mentalization can arise in individuals and families during emotionally intense interchanges or in relation to particular thoughts and feelings. Under such circumstances grossly inaccurate and malevolent feelings can be attributed to the other person and feelings of resentment and mistrust grow.
The representation of the mind of the other is ‘obliterated’ and replaced by an empty or hostile image, for example when a parent becomes convinced that their child is deliberately provoking him or her. At times, seemingly ordinary stresses can trigger catastrophic anti-mentalizing reactions. There can be other reasons for ignoring of the child’s state of mind, with the parent being variable in attention and interest: the parent is able to be responsive and attuned to the child at some times but not others.
For example, the father may be preoccupied at certain times with work crises, the mother may be driven by jealousy and suspicion about her partner’s other relationships at certain times, and neither has space for the child’s feelings then. However, the child has had some experiences of being understood and is now confused and may feel displaced by the loss of interest. If this sense of displacement is not recognized, the problem is compounded.
A similar context-specific lack of understanding may occur when a parent does not actually know the child in particular contexts, or cannot understand what is going on for him/her, for circumstantial reasons or because the child obscures his/her own mental states. Common examples would be that of a step-parent, or parent who has been separated for a long time, and may have too little information to understand what the child is concerned with.
!Fillers
[[Fillers]] are what we call material that habitually and repetitively 'fills the airwaves' when unsuccessful mentalizing is active.
This tag page <<tag [[General Systemic Techniques]]>> gathers together techniques drawn from general <<tag SystemsTheory>>.
Whilst there are four practical "legs" that more formally define [[The Worker's Mentalizing Stance]], below we list a more general set of features that characterise the broad "flavour" of this //"way-of-being-with"//...
This applies to how we work with clients, how we work with colleagues and how we work with other services. It is not just about being a therapist with the client.
These have much in common with the [[Features of Successful Mentalizing]] - as the mentalizing therapist seeks to be a focus of consistent attempts to relate through accurate (and thus compassionate) mentalization.
!!Tentativeness
This refers to the lack of absolute certainty about what is right or wrong and it also implies a preference of for viewing things as being relative and complex.
!!Humility (moderation)
This refers to having a balanced attitude to most statements about mental states, based on the acceptance of not being in a privileged position to know the contents of another person's mind.
!!Playfulness and humour
These permit interacting and reflecting in a relaxed and creative manner.
!!Flexibility
This is an attitude which allows individuals not to get ‘stuck’ in one point of view or position, but permits to change their minds in response to feedback, considering alternatives.
!!‘Give and take’
This enables individuals to solve problems, by involving others and appreciating turn-taking, implying an overall appreciation of one’s own as well as the other person’s thoughts and views. Turn-taking manifests itself of allowing space for each person to describe their experience ( “Let me tell you what I think or feel when such and such happens”) rather than defining other people’s experience or intentions.
!!‘Responsibility and accountability’
This is an attitude which takes ownership for one’s own thoughts, feelings and actions, rather than conveying a sense that these ‘happen’ to the person, implying a victim stance rather than a sense of agency.
!Moving towards the consideration and planning of change
This third step represents an attempt to move away from discussing a //specific interaction// that occurred during the session and to //'widen the lens’// towards:
#GENERALISING: Capturing more generalised understandings relating to this specific observation.
#INVITING VISION: Generating possible applications of these understandings, by "inviting vision" of alternative strategies.
#PLANNING: Planning the implementation of these changes.
!N.B. It may take a few "loops" to reach the point of considering and planning for CHANGE
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/qFV9GUWpz3I?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/qFV9GUWpz3I?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
!!1. GENERALISING
Family members are encouraged to come up with some more general observations and reflections on:
#How similar interactional patterns tend to evolve spontaneously at home.
#What feeling states these elicit.
“So we saw that mum feels sad and Johnny feels bad about having triggered this sadness….. maybe this is the only time it ever happened, but maybe it is not…. Can you talk together about whether you recognize this as something that happens at home…or elsewhere”
The effect of this intervention is that what was observed in the ‘here and now’ of the session is ‘looped out’ into life outside the session, in an attempt to identify recurring patterns which are experienced as being ‘dysfunctional’ by family members.
!!!!Relating to overarching treatment goals
A major aim of MBFT is to engage in family discussions of problem-relevant situations, to elicit and highlight emerging feeling states and their importance, and to foster within the family experiences of (and confidence in) practicing the kind of "curious interogative stance" that this kind of activity involves.
The therapist may ask people to tentatively speculate about and label hidden feeling states of one of its family member, or may indeed do this at times him or herself. The therapist actively encourages family members to label their own feelings, to reflect on what that must be like for them. Metaphors or wordings like the following can help:
“you may want to find out how feeling leads to doing”
“how a few snowflakes can launch an avalanche”
“how a little feeling can get out of control”
!!2. INVITING VISION
The therapist requests each family member to identify different ways of overcoming stuck interactions and to think about alternative ways dealing with recurring problematic interactions:
//“Given that you think this is not working, how would you like things to be….. what would x need to do differently for you to feel y? What might you need to say or do for your mother not to have these sad feelings – or at least less of them”//
In an attempt to elicit solutions from within the family, each person is encouraged to talk about their specific alternative ‘vision’. Once this is achieved, the therapist may ask family members to discuss each other’s ideas:
//“Can you talk together about this….about how for example dad’s idea would help mum to feel less sad….”//
__''Note:''__
At each step it is possible that entrenched interaction patterns re-emerge.
For example, two or three people may talk at the same time. The therapist can loop back to step 1 [[Noticing and Naming]] and make an observational statement, asking family members whether they have //also// noticed //''this''// particular interaction, etc. etc...
!!3. PLANNING FOR ACTION
This phase is designed to ask family members to consider ''specific'' and ''concrete'' actions that they could apply in the light of their understandings.
This may require them, in the first instance, to negotiate which particular ‘vision’ should be translated into action.
//"So we have three ideas... which are you going to opt for...? Please discuss this..."//
...followed by:
//“you say you’d like things to be this way…what would be the first step you would need to take for you to be on the way to that goal…? Maybe you want to do it right here and now…”//
!!!It is important that the first action step is both specific and do-able.
It has to be a relatively a small step – definitely not a leap.
People have a tendency to ask for major changes in a minimum of time and, as this is generally highly unrealistic, the therapist’s task is to slow down individuals jumping into action (the technique of ‘pro and con’ is handy here).
It may be helpful to say:
//“What is it that is stopping you…what would you have to say or do to convince them that you mean business…. So, what is the first step you can make now to convince them…?”//
or:
//“You say you want to talk about all these things you never talked about and how this makes you feel now…and you have all agreed that you might take the risk… how about doing this now? Talk to each other in such a way that allows you not to shut down, but to open up about your feelings”.//
Gergely, G (2004) The social construction of the subjective self: The role of affect-mirroring, markedness, and ostensive communication in self development in: Mayes, L., Fonagy, P., & Target, M. (Eds.) (2004), Developmental Science and Psychoanalysis London: Karnac.
See online version [[here|http://cogsci.bme.hu/~egarab/BME_2006_Gergely_PhD_olvasmanyok/Gergely%202004%20Karnac.rtf]]
The detailed structure and contents of individual sessions offered in [[Cognitive Behavioural work - CheckLists]] functions only as a guide; recommendations contained there should never be allowed to replace //clinical acumen//.
The basic tasks for specific sessions should be covered as directed, but the therapist must feel able to move flexibly between different [[CBT techniques]], according to clinical need. So the detailed suggestions and examples set an overall ethos and 'style' rather than offering a mechanical and step by step manualization, that would risk sacrificing the flexibility required to maintain the [[Engagement]] of young people.
Within AMBIT it is unlikely that CBT will be the main or the sole intervention that is being offered. It is more likely to be complementing other levels of intervention, related to family relationships, medication, liaison with education and social-ecological activities. In this way, it is essential that that:
#The relationship of individual CBT is closely linked to the other interventions
#Specific goals and aims are set for each session so that it does not diffuse into a general counselling activity.
Royal College of Psychiatrists CCQI (College Centre for Quality Improvement), Alcohol Concern, Royal College of GP's. June 2012 [[Practice standards for young people with substance misuse problems|http://www.rcpsych.ac.uk/pdf/Practice%20standards%20for%20young%20people%20with%20substance%20misuse%20problems.pdf]] Publication number CCQI 127 Eds. Professor Eilish Gilvarry, Dr Paul McArdle, Anne O’Herlihy, Dr KAH Mirza, Dr Dickon Bevington and Dr Norman Malcolm.
//The CASUS (AMBIT) team's care plans and manual (@ambit-casus) are referenced and linked to, and AMBIT is described as an innovative multimodal approach amongst other recognised treatment models.//
<html><div align="center"><iframe src="http://www.rcpsych.ac.uk/pdf/Practice%20standards%20for%20young%20people%20with%20substance%20misuse%20problems.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
Sometimes young people or family members ask directly for advice.
*__''Advice-giving and PsychoEducation:''__
Giving advice has much overlap with, but is also subtly different from the kind of "curriculum-based" teaching about a particular area of difficulty (say for [[Psychosis]] or [[Depression]]) that we might choose to offer [[PsychoEducation]] for. The section on PsychoEducation has plenty of information on the more practical "how to do it" elements of imparting knowledge about an area.
* __''Not so fast! - What do you actually //want// advice about?''__
It is important to avoid moving straight into advice giving before you are completely sure about what the young person or family wants advice about, and whether you have accurate information about this area. Remember the curious, inquisitive, tentative [[The Therapist's Mentalizing Stance]].
* __''Modelling Mentalizing:''__
You can model [[Mentalization]] and the humility implied in acknowledging the //limits// of ones knowledge or understanding.
** Coupled to this, you can model the process of 'finding things out' with a young person, or family.
**Perhaps this would be something as simple as "phoning a friend"
**Perhaps using the Internet to search and sift your findings
**Perhaps a more intensive search strategy, such as attending a library, asking for advice, or contacting experts for specific advice.
* __''Specific Information:''__
If you need to give information or advice about issues to do with mental health, or Child Mental Health, you may find useful information in the two websites below:
!!!1. My CAMHS Choices
This is a website run by the Evidence Based Practice Unit (based at the [[Anna Freud National Centre for Children and Families]]), UCL, Young Minds charity and Off the Record Bristol:
(If the window below doesn't display follow [[this link|https://www.annafreud.org/on-my-mind/receiving-support/]])
<html><iframe src="https://www.annafreud.org/on-my-mind/receiving-support/" frameborder="0" width="100%" height="600"></iframe></div></html>
!!!2. Royal College of Psychiatrists
The website for the Royal College of Psychiatrists provides some good fact sheets. (If the window doesn't display properly you can use [[this link|http://www.rcpsych.ac.uk/expertadvice/youthinfo/youngpeople.aspx]]:
----
<html><iframe src="http://www.rcpsych.ac.uk/expertadvice/youthinfo/youngpeople.aspx" frameborder="0" width="100%" height="600"></iframe></div></html>
!!!!Source: https://www.webmd.com/mental-health/gaf-scale-facts
!!''What Is the Global Assessment of Functioning (GAF) Scale?''
The Global Assessment of Functioning, or GAF, scale is used to rate how serious a mental illness may be. It measures how much a person's symptoms affect his or her day-to-day life on a scale of 0 to 100.
It's designed to help mental health providers understand how well the person can do everyday activities. The score can help figure out what level of care someone may need and how well certain treatments might work.
The GAF is based on a scale that was first used in 1962. It's been updated over time. In 2013, the manual that psychiatrists in the U.S. use to define and classify mental disorders dropped it in favor of a scale designed by the World Health Organization. But government agencies and insurance companies, as well as others, still use it and aren't expected to replace it any time soon.
The Scale
A GAF rating can be based on many things, including:
*An interview or questionnaire
*Medical records
*Information from the person's doctor, care givers, or close relatives
*Police or court records about violent or illegal behavior
It's broken into 10 sections and responses are on a scale from 0-100, with the higher your score, the better you're able to handle daily activities.
-----
The rating of overall psychological functioning on a scale of 0-100 was operationalized by Luborsky in the
Health-Sickness Rating Scale //(Luborsky L 'Clinicians'Judgments of Mental Health." Archives of General
Psychiatry 7:4O7-417, 1902).//
From this the Health-sickness Rating
Scale was developed called the Global Assesment Scale (GAS) (//Endicott J, Spirzer RL, Fleiss JL, Cohen J: 'The Global Assessment Scale: A Procedure for Measuring Overall Severity of Psychiatric Disturbance." Archives of
General Psychiatry, 33: 766-771, 1976)//. A modified version of the GAS was included in DSM_III-R as the
Global Assessment of Functioning (GAF) Scale.
Here we give the meanings of jargon words used in this manual. Any page tagged with Glossary will show in the list below:
<<list-links "[tag[Glossary]tag[Glossary]]">>
Having explicit goals with a young person is entirely consistent with the AMBIT approach. It is linked to encouraging focus on both the client and the practitioner's intentionality. The most common goal based measure used in the UK is the Goals-based outcomes (GBO) developed by Duncan Law and colleagues and supported by the Child Outcomes research Consortium (CORC). Forms and guidance for the CORC goals-based measures can be easily downloaded from the CORC website [[here|http://www.corc.uk.net/resources/measures/child/]].
!!AMBIT and GBO's
This is also strongly in keeping with the AMBIT approach to developing and "attuning" plans about the work with clients. Developing a shared and attuned plan with the client is a large part of [[Active Planning]] and especially in relationship to the ideas about [[Taking Aim]].
!!The AMBIT Integrative Measure (AIM) and GBO's
The AIM (AMBIT Integrative Measure) is the 43 – item multi-domain assessment measure adapted from the validated Hampstead Child Adaptation Measure. This measure identifies [[Key Problems]], which can form key targets or treatment goals of a treatment Care Plan. For fuller details about the measure and how to use it in practice can be found in this manual. The organising page for a large number of pages about this can be found at [[AIM]].
!!Governance and Clinical Governance
Governance refers to the need for systems of help to vulnerable clients need to be delivered in ways that maximise safety and increase effectiveness. All statutory and voluntary agencies have governance systems to reduce risks for clients. This can range from simple procedures to reduce the likelihood that people slip over on wet floors that have recently been cleaned, to making sure that patients get the correct medication during a ward round to ensuring that staff have been trained to know what to do with serous mental health presentations such as self harm and suicidality.
These last two examples are forms of 'clinical governance' which is the health sector's version of having governance systems in place.
!!Governance: An analogy:
Governance is ''analogous to the control systems within an airport'': none of us would feel comfortable flying if there were not confidence that clear, robust systems are in place for [[Managing Risk]] and which also learn actively from "near misses", and search pro-actively the possibility of new risks. Given that the AMBIT team is [[Scaffolding existing relationships]], where these relationships may be known to be far from ideal (but where better alternatives do not exist), the requirement for a stress on this is clear.
[img[https://lh6.googleusercontent.com/-_T-rjCov0CA/URYYAYs29FI/AAAAAAAAGyY/8o-1XKPY65Q/s512/Stance-Governance.JPG]]
!!Why here?
AMBIT works with high risk young people and their families, where things can go very wrong, very quickly, with potentially catastrophic implications, so unsurprisingly the adoption of clear governance structures to support [[Managing Risk]] is one of the [[Core Features of AMBIT]].
<html><object width="425" height="344"><param name="movie" value="https://youtube.com/v/jlmDRbXttcw?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/jlmDRbXttcw?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
Rather than presuming to 'reinvent the wheel', AMBIT recommends the adoption of __Local Risk Management and Governance structures__ and it is essential that these are implemented to high standard. Where local Governance structures are poorly defined, or inadequate, this is a matter for the wider management structures around the AMBIT team to address. There are a range of recommended [[Boundaries]] recorded and manualized in this manual help to support this.
All subsequent aspects of AMBIT are underpinned by this basic principle. Governance includes:
* Clarity in line-management and clinical supervision arrangements
* Appropriate [[Risk Management protocols|Managing Risk]]
* Attention to processes such as Audit to ensure the 'institution' (or team) is [[LEARNING at work]].
There are a series of topics within this manual relating to the management of risk, which are gathered together under the Topic heading <<tag [[Managing Risk]]>>.
The assessment of risk (see RiskAssessment) is an aspect of the AMBIT Integrative Measure ([[AIM]]) as the AIM covers a range of risk behaviours e.g. violence to others, suicidality, exposure to abuse etc. The completion of the AIM will definitely inform a worker's understanding of areas of risk for the client and whether there is a need for a safety plan.
Having developed a [[Graded Hierarchy|Breaking down tasks into steps]], the keyworker prepares the young person for taking each step at a time. Use of [[ABC Diary-keeping]], [[Rating Scales]] and relaxation techniques such as [[Progressive Muscle Relaxation]] will help to frame this work.
The basic theory is that anxiety tends to encourage avoidance, and that avoidance side-steps any testing of the beliefs (a kind of [[Pretend mode]] coupled with [[Psychic equivalence]] (//"I'll just DIE if I start blushing in front of that shopkeeper!"//) - Graded Exposure works because anxiety natrually tends to REDUCE with time (your body cannot make adrenaline indefinitely.)
Key tasks are to avoid the temptation to skip steps (risking the young person being overwhelmed and subsequently discouraged) - try to maintain a steady course up the steps which should be basically achievable.
Each step up the hierarchy should be repeated enough times to allow the [[Rating Scales]] score at its peak to reduce, so that ultimately it is not substantially raised when the young person is exposed to the feared stimulus.
*Remember the PsychoEducation that precedes this work - you are emphasising that //some anxiety// is a natural phenomenon, and not something to be feared.
*Remember too that part of the exercise is about the deliberate provocation of small "doses" of anxiety, so as to allow the young person to test out his or her new found skills in managing anxiety ([[Progressive Muscle Relaxation]], etc) - this is ultimately designed to promote [[Self-efficacy]].
!Trauma (Narrative)-focussed Exposure:
In Trauma-focussed work Graded Exposure is used, but in a slightly different way, in that the 'feared stimulus' is a //memory// rather than a place or a thing (although there are often also places and things that a sufferer of PTSD will fear and avoid, too.)
The technique here is (again, following careful preparatory work - see [[Trauma-focussed CBT]]) to invite the young person to start to tell the story of the trauma, after first using [[Rating Scales]].
As the young person tells the story of the trauma, the worker may occasionally need to support them - particularly if they are distressed. At these points re-visiting the [[Rating Scales]] is helpful, and using an exercise like [[Progressive Muscle Relaxation]] or [[Re-breathing]] may be required - but the focus is on getting to the end of the story of the trauma.
During the telling, "hot-spots" may become apparent, where the young person tends to skip details, or becomes obviously flustered or panicky. Gentle, curious questioning may help to clarify details of these areas of experience, but this may only emerge after numerous tellings and retellings.
The Telling and //re-telling// of the story is a key part of the "Exposure" - this means that immediately they have finished the story, the worker literally asks the young person to
>//"Please go back to the beginning again and tell me the story again"//
The worker is relying on the fact that ''ANXIETY CANNOT REMAIN ELEVATED INDEFINITELY'' - adrenaline simply runs out! As the anxiety levels reduce the young person is more able to think, and in due course to re-construct a story that reduces the GUILT, ~SELF-BLAME, the SENSE OF POWERLESSNESS, and some of the NEGATIVE STATEMENTS about the self that may have arisen from these overwhelming experiences. [[Weighing Pros and Cons]] is a version of the kind of gently curious questioning of beliefs (this is the "Cognitive" part of CBT). In the narrative work, these questions may come up spontaneously, but although acknowledging these questions the worker will try to keep to task - which at this stage is just the telling and re-telling of the story.
Further elements of [[Trauma-focussed CBT]] are recorded there separately.
! Welcome to AMBIT Experiments
This manual is used for experimenting with new features for the manuals. Please feel free to explore but bear in mind that not everything is necessarily complete and fully functional.
!Reference:
Griffiths, H., Noble, A., Duffy, F. and Schwannauer, M. (2016), Innovations in Practice: evaluating clinical outcome and service utilization in an AMBIT trained Tier 4 child and adolescent mental health service. Child Adolesc Ment Health. doi:10.1111/camh.1218
!!Background
To present clinical outcome data of the Adolescent Mentalization-based Integrative Treatment (AMBIT)-trained NHS Lothian Tier 4 child and adolescent mental health service in the context of service utilization and engagement.
!!Method
Data were obtained for a 2-year period that included details of all face-to-face contacts between young people and clinicians along with routinely collected clinical outcomes data relating to anxiety, depression, symptoms of psychosis and quality of life.
!!Results
Improvements were observed in quality of life, symptoms and distress across the course of the intervention. Overall attendance rates were high (80%). Relative to those who were better engaged, the less well-engaged group received the same number of appointments but spent longer in the service (χ2(1) = 5.26, p = .022), had more professionals involved in their care (χ2(1) = 4.91, p = .027) and showed a nonsignificant trend to more inpatient admissions. Later engagement was not associated with distress or symptoms at entry into the service with the exception of negative symptoms in the Early Psychosis Support Service cohort. Age and two quality of life factors were associated with later engagement (p < .05).
!!Conclusions
Our AMBIT trained Tier 4 CAMH service demonstrates change over the course of intervention consistent with the service model's theoretical expectations. Engagement with the service may be associated more with factors related to social circumstance and functioning than with key symptoms and distress. Less well-engaged young people utilize increased service resource. AMBIT's mentalizing focus may improve service provision for young people who are poorly engaged with mental health services.
Group work is an intervention that might be suggested by the [[AIM questionnaire - interactive version]] based on AIM scores for an individual client
The following advice and guidance is drawn from [[Implementation Science]] and our experience of training over 50 teams to date. It is designed to maximise the likelihood that teams applying for training will translate a training experience (that the large majority of trainees report upon very positively) into sustainable and effective changes in practice.
*[[AMBIT Training]] is ''only available to whole teams and not individuals''. To some extent the training could be described as "experiential": by this we do not want to suggest that there are excruciating role plays or "encounter" exercises, but that it is important for the team to have a //shared experience//.
*Before we accept teams for face-to-face training we invite them to follow the [[AMBIT Training Application Process]]
**This is seen as a key ''Stage 1'' of the AMBIT training
**It is the equivalent of [[Marking the Task]] in terms of one of the key AMBIT practices, [[Thinking Together]]
**AMBIT is not just a set of theories and practices to be drilled into teams, but is rather an approach that works to develop teams that are actively involved in (co-producing) their own learning.
* We use the information from the "Application form", engagement call and consultation day to help us determine if and what type of training may be most appropriate for the team inquiring.
!!''Questions for consideration:''
!!!1. Is there a working TEAM to train?
* AMBIT addresses team-working practices, as well as providing access to manualized approaches to the face-to-face work itself, and approaches to the wider multi-agency network.
* It is not designed as an explicit and rigid approach to whole-organisational change or managerial restructuring, but as a method by which ‘working teams’ of practitioners can adopt and adapt evidence-oriented and sustainable methods of practice.
* It does require support from senior managers and organisational structures (see below).
* Experience suggests that the ideal size of such teams would be up to about 12 people (much larger, and it is likely that they would be subdivided either formally or informally into sub-teams) and that teams of less than 4 would struggle to make full use of the AMBIT approaches.
* AMBIT is being applied in a small number of In-Patient or Day-Hospital settings, where team sizes are larger than this, but the "entropy" effect of these larger teams may be counteracted by the geographical proximity of the workers in such settings.
!!!2. Is there a clearly identified client group?
* This is really to emphasise the fact that AMBIT is a training for teams that are collectively engaged in delivering face-to-face work, in which individual practitioners (albeit that they may have some differentiation in their roles) will have common ground with each other.
!!!3. Is there clarity about the desired [[Post-training outcome goals]] for this team?
* AMBIT explicitly acknowledges that in team trainings it is not a “given” that all team members are equally invested in the training.
* It is important, however, for there to be some shared notions of:
** The existing competencies and expertise within the team
** (Notwithstanding what the team is already doing well) a number of observable differences post-training that would indicate a successful outcome of the training (ie, a recognition that: //"There are specific areas of practice, our experience of the work, and our clinical outcomes that this team think could be improved upon"//).
* In other words, a training outcome that is defined as "understanding more about Mentalization and how to use it in practice" would be seen as insufficiently specific to the ACTUAL EXPERIENCE of THIS team - it does not answer the question "//Why do you feel that Mentalization might help you? And in what areas of your practice, experience and outcomes do you hope it might help you?//"
!!!4. Is there robust support from senior management for this training?
* Whilst AMBIT is not an explicit and rigidly defined approach to whole-organisational change, it does rely on being accommodated and supported by the wider systems and structures that manage the teams whose practice it seeks to influence.
* Evidence that senior management ''understands'' and ''supports'' the basic principles and practice of AMBIT is an important determinant of whether an AMBIT training is likely to be successful.
This page is under construction
Two main options:
* An application/ expression of interest process
* Leaders select preferred candidates
!!Application/ expression of interest process
!!Selecting preferred candidates
Where local facilitators are chosen by managers it is important that:
1. candidates understand well what they are being put forward for
2. Feel motivated to carry out the role
!!What makes a good local facilitator
* managerial support
* motivation
* interest
* previous experience of training
!!When you are creating a group of local facilitators across a system it can be helpful to balance:
* people in leadership roles with organisation authority and people in frontline roles with credibility (perhaps people who are "thought leaders" regardless of position within the organisational hierarchy)
* people from different disciplinary backgrounds, so that there is no perception that AMBIT is owned by any particular discipline
!!Videos showing you how to do the basics:
*[[How to edit - Videos]]
!! Here you will find instructions on how to do things such as:
* [[How to embed a video]]
* [[How to centre a title, phrase or image]]
* [[How to add a picture]]
* [[How to add a PDF link]]
!!Written Guide
*[[A Guide to Editing the Manual]]
H-CAMA stands for Hampstead Child Adaptation Measure - Adapted.
The H-CAMA is a multilevel/multidimensional assessment, taking in psychiatric symptoms, social ecology, relationship networks/qualities, and resiliencies, and was originally authored by Prof PeterFonagy and Dr [[Mary Target]]. A modified version of this is available for use in the this TiddlyManual for [[AMBIT]], called the [[AIM]] (adapted by DickonBevington and [[Peter Fuggle]]).
This refers to perceiving sensations that are not caused by 'real' external stimuli:
*Hearing noises or voices
*Smelling strange odours
*Tasting flavours without any obvious cause
*Feeling touch sensations when there is no external cause (this can be a trigger for [[Violence]] in a [[Paranoid]] client.)
*Seeing things that are not there.
One of the commonest causes of hallucinations is //acute intoxication// with [[Substances|Substance use]], but they may also be a result of serious illness such as [[Psychosis]], or other [[Physical Health matters]], or of very high levels of [[Anxiety]].
Some hallucinations are part of normal experience - although these may often be understood as "misinterpretations" of ordinary perceptions - such as thinking that you hear someone call your name in the street. At the point of falling asleep, or waking up, some people //without any psychiatric illness// have 'true hallucinations' (known as hypnogogic and hypnopompic hallucinations).
Any such symptoms may well require assessment by a psychiatrist, and should be discussed in your SupervisoryStructures.
An example of [[LEARNING at work]] - the team spent 20 minutes clarifying what constituted a good handover (see text below illustration):
[img[IMG_20170802_151345.jpg]]
!The HANDOVER
Ground rules for a good Handover:
* Be in on time
* Team Handovers to start and end On Time
* Be Clear
* Be Factual
* Limit yourself to only significant info
* Listening
* Check Diary
* Tick off as you go, sign off tasks that are completed.
* Works well when we share info clearly (verbally/in writing) using the TOOLS we have
* V helpful for people who have been off for a bit – DON’T LEAVE BLANKS!
* Info to go in the right place, so it can be found
!The Handover Book:
* This is the “super tool” (with Diary) so USE IT for:
* PLANNING the shift ahead
* Identifying WHO is leading?
* Signing off tasks
* Writing relevant significant info in the back of YP’s file and on bottom page
* Include reporting DAMAGE
* Record Rewards and Sanctions
* Record Incidents
* Record Medications
* Use it (redevelop/redesign it?) as a HANDBOOK for new staff?
* Any INCOMPLETE tasks must be HANDED OVER in the Handover Meeting
Hard to reach is rather an unhelpful term from the perspective of many young people who might be labelled in this way.
|bgcolor(pink): A better phrase to capture the same idea is ''~Under-Served'' |
They are not 'hard to reach' for local gangs, dealers or indeed for many positive figures such as youth workers who are prepared to go out to meet them.
They are often experienced as hard to reach by services offering clinic-based appointments, that might appear highly formal, and even intimidating, and which might also struggle with the stigma that is often attached to Mental Health or Youth Offending services. Without family support to attend appointments in such settings many young people opt for avoidance as a first response.
Key concepts that are often associated with the 'hard to reach' young person are [[Comorbidities]] and [[Complexity]] and there are important [[Developmental Considerations]] for this group of young people.
!!{{$:/images/fa5/solid/comments}} Small group discussion on help seeking
<a class="tc-float-right">[img width= 150 [leap.jpg]]</a>
''Discuss the following as a group:''
#What beliefs about help-seeking (positive and negative) might workers in a team hold?
#How does the help-seeking model (reminder below) relate to your own feelings about seeking help?
We encourage you to take a leap and be a bit brave in discussing honestly your personal feelings on help-seeking in the context of your work.
{{help seeking.png}}
!!!Reference. Helping by Edgar Schein (2009) Berrett-Koehler Publishers
!!Introduction
This is a very useful book. Schein is a management consultant based at MIT. He sets out in ordinary language a general approach to the helping process. There is no explicit reference to mentalizing but his approach shares much with a mz approach as it emphasises how easy it is for the process of giving and receiving help to go wrong.
'In the daily flow of life, helping is itself an important social currency that can cause disequilibrium when not handled properly. Knowing when and how to give help and when and how to receive it from others makes relationships both more productive and more pleasurable. Helping is therefore both a routine process of exchange that is the basis of all social behaviour and a special process that sometimes interrupts the normal flow and must be handled with particular sensitivity.' (Page 29)
He emphasises many things that are familiar to the AMBIT approach. The recognition that many 'helping' interactions do not succeed and can lead to offence or humiliation.
These notes just highlight some of the framework that he proposes around the helping process. This appears as a series of lists as a brief summary of what is included. He sets out [[Seven principles of helping]] which are set out in a separate page titled . The book is excellent in conveying the flawed and at times comic nature of the helping process. It is a highly recommended read.
!!Helping is a relational process.
The focus is on: -
*1. The relationship has to achieve a transaction which he frames in social economic terms. Helping is about making a deal.
*2. Cultural rules around roles and behaviour have a major role to play in navigating this process.
*3. Helping exposes high sensitivities about role and status. There is high potential to 'lose face' for the help seeker.
*4. Initial negotiation of the helping process needs to recognise imbalance of power and status. Helper holds power and this needs to be handled within social rules.
*5. Anxiety is universal. 'Anxiety is intrinsic to this situation, no matter what the initial relationship is between the client and would-be-helper.' (Page 36)
!!Helping Traps
!!!Traps for clients
*1. Initial mistrust
*2. Relief
*3.Looking for validation, reassurance, attention
*4.Resentment and defensiveness
*5.Unrealistic expectations
!!!Traps for helpers
*1. Dispensing wisdom prematurely
*2. Meeting defensiveness with more pressure
*3. Accepting the problem and over reacting to the dependence
*4. Giving support and reassurance
*5. Resisting taking on the helper role
*6. Stereotyping the client, counter transference and projections
!!Recognising what is not known.
!!!Five things the helper does not know at the beginning
*1. Will the client understand the information, questions being asked?
*2. Will the client have the skills, knowledge to follow recommendations?
*3. What is the clients real motivation?
*4. What is the clients contextual situation?
*5. How do clients experiences shape expectations, fears?
!!!Five things the client does not know about the helper?
*1. Does the helper have the knowledge, skill, motivation to help?
*2. What consequences will emerge form asking this person for help?
*3. Will the helper use information to gain control of the client?
*4. Will I be able to do what is recommended?
*5. What will it cost emotionally and socially to accept this help?
!!Helping roles
*1. The expert
*2. The process consultant.
The difficulties of the expert role are well recognised. The role of process consultant is highlighted in which the goal is defined as being 'to the status and to create a climate that will permit both client and helper to remove their ignorance'.
!!Humble enquiry
Different types of enquiry are described, essentially moving form pure focus on the mind of the client to increasing inclusion of the mind of the helper. The model emphasises that the helping process becomes more risky or fragile the degree to which the helping process includes the thinking of the helper.
The types of enquiry are categorised as: -
*1. Pure enquiry
*2. Diagnostic enquiry
*3. Confrontational enquiry
*4. Process orientated enquiry
This is knowledge __that we don't necessarily know we have__ (what might be referred to as //"unknown knowns"//) and it relates to the [[Implicit psychoanalytic model]] that clearly connects Mentalizing approaches - which in many ways are radically //different// - to more classical forms of psychoanalysis.
This knowledge base may be acquired ((brought into explicit awareness) by each person working psychoanalytically from personal analysis, clinical work under supervision, clinical experience in psychotherapy as well as other more informal contexts such as discussions, listening to case material and so on.
See [[Broadcasting Intentions]] for how this links to mentalizing theory about the progress of therapeutic work, and one of the [[Videos]] at [[Active Planning]] describes this journey that client and [[Key Worker]] make: from partially-shared implicit beliefs and intentions, towards larger areas of explicitly shared intentions.
This hidden, private or implicit knowledge base, if it becomes more explicit, can actually serve to guide clinical work; it contains unique information about both appropriate interventions and dynamic understandings ([[Mentalization]], in other words) of behaviour. For example, the way past relationships impact on current relationships is never fully explicated in psychoanalytic writing, yet it is the bread and butter of the daily work of psychoanalytic clinicians.
This is one of the four key elements - or “legs” - of the [[The Therapist's Mentalizing Stance]]
When mentalizing occurs in a session - even if it is mentalizing in only its most fleeting form (a young person who hesitates for a few seconds in the middle of a tirade, puts her head in her hands and mutters //"I dunno, its just so hard to make sense of things sometimes"//) it is important that the [[Key Worker]]:
(a) ''NOTICES'' this
(b) ''COMMENTS'' on it - describing what was seen
(c) ''ENQUIRES'' whether the young person noticed anything slightly different about how things felt, how they thought their mind was working at that point in time
(d) ''EXPLAINS'' why this simple moment seemed important, and how this different way of thinking about things //might// come up with different kinds of solutions...
[img[https://lh3.googleusercontent.com/-ExW0YhOr4WA/UOiZqd2p3wI/AAAAAAAAGeA/0VZk-HL1AGI/s307/HighlightingMentalizing.jpg]]
The therapist aims to deepen people’s ability to connect feelings, thoughts and intentions, and in order to do so:
*Searches actively for examples (or episodes) of good mentalization
*Positively connotes these
*Enlarges upon them
>//“When you did x, I was very impressed by how you each tried to get your heads around this…. Father, you did x; mother, you did y; Johnny you did….”//
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/iGk_KFqnBt0?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/iGk_KFqnBt0?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
!Add scores (0-4) under the headings below...
Then...
!Record scores at...
[[Outcome measures (T1, initial)]] after inital assessment
[[Outcome measures (T2, 3 months)]]
[[Outcome measures (T3, treatment close)]] after end of treatment.
!Scale
0 = no problem
1 = minor problem requiring no action
2 = mild problem but definitely present
3 = moderately severe problem
4 = severe to very severe problem
!Areas to score
!!1.Problems with disruptive, antisocial or aggressive behaviour
Include physical or verbal aggression, antisocial behaviours such as lying, cheating, thieving etc.
!!2.Problems with overactivity, attention or concentration
Include restlessness, fidgeting, inattention, problems with concentration due to any cause including depression, drugs.
!!3.Non-accidental self-injury
Include self-cutting, suicide attempts etc.
!!4.Problems with alcohol, substance/solvent misuse
Take into account current age and societal norms. Don't include aggressive/disruptive behaviour due to alcohol or drug use rate at item 1
!!5.Problems with scholastic or language skills
Include problems in reading, spelling, speech or language, including those due to specific disorders or problems.
!!6.Physical illness or disability problems
Include problems that limit or prevent movement, impair sight or hearing, side effects from medication/drug/alcohol use.
!!7.Problems associated with hallucinations, delusions or abnormal perceptions
Include odd and bizarre behaviour associated with hallucinations and delusions., suspicious/paranoid thoughts.
!!8.Problems with non organic somatic symptoms
Include problems with gastrointestinal symptoms, sleep problems, chronic fatigue.
!!9.Problems with emotional and related symptoms
Include depression, anxiety, worries, fears, phobias, obsessions, compulsions etc.
!!10.Problems with peer relationships
Include problems forming satisfying peer relationships, withdrawal from social relationships, social rejection as result of bullying/aggressive behaviour.
!!11.Problems with self care and independence
Rate problems with basic self-care such as dressing, washing, feeding, include poor levels of functioning due to lack of motivation etc.
!!12.Problems with family life and relationships
Include parent-child & sibling relationship problems, emotional abuse, poor communication, criticism, enmeshment, overprotection etc.,
!!13.Poor school attendance
Include truancy, school withdrawal
!Record scores at...
[[Outcome measures (T1, initial)]] after inital assessment
[[Outcome measures (T2, 3 months)]]
[[Outcome measures (T3, treatment close)]] after end of treatment.
This is one of the four key elements - or “legs” - of the [[The Therapist's Mentalizing Stance]]
A whole series of ''balances'' must be held:
[img[https://lh5.googleusercontent.com/-Gw7lmHClo5U/UOiYbl16S4I/AAAAAAAAGdo/mpVLume7TZU/s350/HoldingTheBalance.jpg]]
* Between observance of natural interactions and intervening to promote change
* Between the contributions of different individuals in a group or family
* Between mentalizing the Client, and mentalizing oneself as the worker.
* Between a focus upon [[Cognitions]] (thoughts and beliefs about a situation) and a focus on [[Affect]] (feelings about it in the here-and-now).
* Between ''keeping things calm enough'' to allow [[Implicit mentalization]] to take place, and offering gentle [[Challenging techniques]] to [[Pretend mode]] interactions; ''gently raising the emotional temperature'' enough to stimulate [[Explicit mentalization]].
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/EjdE7W0M5Cs?rel=0" frameborder="0" allowfullscreen></iframe></html>
Mostly the presence or absence of this "Balance" can only be evaluated across time (through a whole session, or across different sessions) - but the therapist will be looking for "//what is not being aired//" as much as the content of what //is being aired//.
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/4OJ5FVeYAtk?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/4OJ5FVeYAtk?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
It is the therapist’s task to help the family make sense of what feelings are experienced by each family member, as well as highlighting the ways in which miscommunication or misunderstanding (or lack of understanding) of these feelings leads to interactions that maintain family problems. In practice, this requires the therapist to strike a very careful balance between allowing the family to interact ‘naturally’, or indeed actively eliciting habitual and ‘natural’ family interactions around problematic issues, as well as being directive and intervening at critical moments too.
In individual work it is much the same. Here, Anthony Bateman is holding the balance between cognitions (which could become rather dry, and divorced from the real pain involved - a kind of [[Pretend mode]]) and the emotions (which could become overwhelming and lead to a //loss// of mentalizing) in a discussion about a court case relating to custody of a child:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/shUwG-DH82A?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!Welcome to the online AMBIT manual
<a class="tc-float-right"><<ambit-wheel size:490px>></a>
AMBIT is an approach for helping people who have multiple needs and who may have reasons to find it difficult to trust in helping services. It is a whole-team or whole-system approach. It is based around the core theory and practices of [[Mentalization]].
AMBIT supports teams to develop systems of care adapted to their own context, and to what is experienced as helpful by their clients, applying mentalization as the guiding framework across four areas of practice:
* ''face to face work with clients''
* ''between team-members''
* ''across networks''
* ''in fostering a team culture of learning''
AMBIT builds a [[Community of Practice]] which, above all, aims to continue to learn, develop and share more //effective, acceptable and sustainable// ways of working.
AMBIT uses an OpenSource approach meaning that learning and best practice are freely shared. This manual is primarily for WORKERS, however, clients or other interested parties are very welcome to look, too - and some local teams encourage their clients to help them author new material, or improve existing pages.
!!What are you looking for?
<<image-link "User Guide" "download (1).jfif" "User Guide" "300">><<image-link "AMBIT programme" "jehyun-sung-6U5AEmQIajg-unsplash (1).jpg" "Meet the Team" "295">>
The page [[TrainingCore]] provides you with an index of pages which make up the core content of this manual. These pages cover the essential aspects of the AMBIT approach and link to the topics covered in AMBIT Training.
The following links provide you with some AMBIT Basics:
*[[AMBIT: an overview]]
*[[Mentalization]]
*[[AMBIT Training]]
*[[Training exercises]]
* [[Downloadable Resources from Training]]
!!!You may also be interested in...
<<image-link "AMBIT Newsletter" "news head.jpg" "AMBIT Newsletter" "305">>
!!!Current Developments
<<image-link "Evaluating outcomes" "siora-photography-cixohzDpNIo-unsplash (1).jpg" "Evaluating outcomes" "300">> <<image-link "AMBIT Local Facilitators" "neonbrand-zFSo6bnZJTw-unsplash (1).jpg" "AMBIT Local Facilitators" "320">>
!!What's the problem that calls for AMBIT?
Please see here for Dr Dickon Bevington giving a brief introduction to the types of difficulties that an AMBIT approach aims to address.
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/g2bk7sSKD-c" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html></center>
----
''We are working to develop and improve this manual to make it easier to use and as helpful as possible. Please give us [[Feedback|Feedback please!]] on any aspect of the manual.''
If you would like to read a more "linear" story of AMBIT you can find the recently published [[book|Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]] of AMBIT.
!!!''Important Legal stuff''
There are important issues relating to [[Disclaimers, Security and Authorization (Licensing)]] if use this manual. By going on into the manual you are agreeing to abide by the rules laid out.
!!!''Sponsors''
The AMBIT programme is grateful to numerous early [[Sponsors]], including Comic Relief, without whom this freely available resource would not be possible. We still need help to support this OPEN RESOURCE! If you would be happy to donate, visit https://www.annafreud.org or contact the AMBIT programme directly at ''ambit@annafreud.org''
In relation to tasks set by the practitioner in the course of therapy, we avoid the name "homework" and use instead [[Training Challenge]].
* Liaise with each other via email discussion groups
* Email nominated "training buddy" with our plans
* Attend the monthly web-based telesupervisions
* Try to do //quid pro quo// swaps of local trainers so that we visit/attend/co-present/observe each other's local training sessions
* Use ambit@annafreud.org to help coordinate this if required
!!Learning Objectives:
*To enable teams to reflect upon and improve the help-seeking processes within their team, to promote the connectedness of "keyworkers" to the team.
!!AMBIT Competency/s covered:
This is a training exercise to invite participants to explore what help looks like in their team and what it might be needed for.
The purpose of teams helping each other with their work is part of the [[Keyworker well-connected to wider team]] stance, which is one of the [[Core Features of AMBIT]]. Keyworkers who have good connections to a team who is attuned to their state of mind and able to respond to this in helpful ways are more likely to be able to sustain their capacity to take a mentalizing stance in their work, which AMBIT believes will enable the keyworker to provide a more effective form of help to their client.
!Invite participants to divide into teams/smaller subgroups to think about
"What do we need help from each other with in this team?"
"What does helping each other look like in this team? In what ways do we already help each other? If someone came to sit with our team for a week, what would they notice about the ways in which we seek/use help from each other?"
"What difference does it make to our work with young people/families when we get help from each other?"
"In what other ways could we help each other in this team?"
!Pointers for exercise (notes for Trainers)
It may be helpful to highlight the following points before participants embark upon the exercise:
*A reminder that AMBIT would view anxiety/feeling stuck/not knowing what to do as normal thoughts/feelings to experience when carrying out stressful work. We would expect that workers would need help with their work, without this being a sign of weakness or incompetence
*Making help helpful is a process that is not always straightforward, so please approach the discussions with respect for others and the assumption that colleagues have intentions to be helpful, even if they are not always experienced as such. Establishing helping processes within teams is often something that teams have to work at, can take time and is the responsibility of the whole team.
*Talking about helpful forms of help is something we may be more used to thinking about with our clients, rather than with our colleagues. This may bring up a range of feelings for participants!
!Group Discussion
*Invite reflections from teams about what it was like to think about help seeking within the team. New/familiar process?
*Did teams reach any useful reflections/actions? Encourage teams to get specific about how they might translate any reflections into actions, in terms of coming up with something small that they might be able to easily try.
* The [[AMBIT Practice Audit Tool (APrAT)]] is a self audit tool to support reflective practice
* Is the Team doing regular [[Manualization]]?
* Look at the format of specific [[Team Meetings]]
* Look for the presence of examples of use of specific tools -
** [[Thinking Together]]
** [[Dis-integration grid]]
** [[The Egg and Triangle]]
** AMBIT [[AIM Cards]] or [[AIM questionnaire - interactive version]]
** etc
Children on the autistic spectrum have very particular difficulties in Mentalizing, relating to their problems with "theory of mind" (see [[Choi Kain et al|Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application]] for the links between this and [[Mentalization]]).
It is important to be clear that ''there is no evidence that Mentalization-based therapy is effective as a therapy for children with autism''. However, systemic work has a long history of effective use in families with Autism (again not as a treatment for the condition itself, however), and insofar as this includes //helping parents to make sense of their child's behaviours in ways that allow them better to predict problems, and respond to these in ways that soothe and decrease the distress that interactions may trigger// this is really another way of describing how family or parenting work will include support for parents to //Mentalize// their child. Like many other interventions with autistic children, addressing the supportive context around the child tends to be more important than attempting to change the core symptoms of the disorder.
Some children with very mild autistic spectrum difficulties //may// benefit from basic social skills training - this is mostly at a very concrete level (learning to recognise frowning in the people who are witnessing my behaviour, and learning to moderate/stop my behaviour quickly if that is the case) and there is an argument to suggest that what is being taught in such cases is the very crudest building blocks of mentalizing. Again, it is important to emphasise that Mentalization based therapies do not make any claims for being effective direct treatments for Autism.
!! ''Manualising may have a very useful role to play in supporting teams to achieve local priorities.''
All services and teams will have a number of service priorities, some of these may be values held by the organisation, others may be priorities set by commissioners who are paying for services delivered by the team. Some of these priorities may be explicit and written down (e.g. all referred young people to be seen within six weeks), some may be more implicit such as 'Putting the young person at the heart of the service'. Some of the explicit priorities may be monitored and performance managed i.e. the number of young people not seen within six weeks would be reported back to the commissioners.
All such priorities are a great opportunity for learning and manualisation. More implicit value focused priorities may benefit from team discussion as to what such values mean and how different members of the team may have different beliefs about such values. Such discussion may enhance the way team members understand each others points of view about this, i.e. may enhance a mentalized understanding of how the team functions.
More explicit priorities may benefit from manualizing practices and procedures relevant to meeting such priorities and being able to show the degree to which this is being achieved. It is likely that the AMBIT approach to supporting the collection of practice based evidence using a systematic approach agreed by the team will be welcomed by most commissioners. It has been our experience that AMBIT teams have been able to present their work effectively in the context of tendering processes or commissioning requirements.
* 3 sessions should be delivered (on [[Working with your TEAM]], [[Working with your NETWORKS]], [[Working with your CLIENT]])
* These sessions may be multiple short sessions (30 minutes) or single longer sessions - teams to tailor this to their requirements
There is an [[Intervention timeline]], but AMBIT does not specify how long a specific team should work on a specific case - these are elements of [[Local practice and expertise|Respect local practice and expertise]] that should be defined by a local team (consider [[Edit]]ing your local version of the [[Intervention timeline]] to reflect this.)
Even though you may have spent quite a lot of time with a client, if their [[motivational status|Assess Stage of Change]] is low then from a psychological perspective you may be closer to the [[INITIAL PHASE]] than you had hoped.
Non-progression into the [[INTERVENTION PHASE]] will need to be tackled explicitly with the young person, perhaps with a focus on the (re)-drawing of [[Goals-based outcome measures]] (see [[Advice on setting Treatment Aims and Goals]]).
In AMBIT, we are interested in the active efforts that team members make to help each other. In particular, we are interested in thinking with teams about how they help each other to sustain their capacity to mentalize. Team culture is an important, but intangible, part of what enables team members to seek and receive help from each other (see [[Barriers to help-seeking in teams - Unconference Conversation, 2016]] ) and relies upon the establishment of a shared sense of safety and trust within a team, which can take time to develop and requires attention to maintain. These kinds of interpersonal team contexts support mentalizing.
In this Unconference Conversation, we talked about how seeking out, offering and accepting help from colleagues might feel for team members. Given the stressful nature of the work, there was a recognition that team members might need help from each other due to feeling stressed, anxious, frustrated or overwhelmed, but a worry that sharing these experiences within the team might negatively effect the emotional state of other team members. Powerful language was used when sharing examples of how this might feel, with participants talking about a worry that they might feel "traumatised" by others' negative emotions and difficult experiences or that negative emotions might spread through teams like a "virus" or "contagion", leading to a whole team being overwhelmed by negative emotion and losing the capacity to think.
We discussed the balance that might need to be held between individual vs. team needs in this respect, reflecting on what made the difference as to whether a help-seeking conversation between colleagues was helpful or unhelpful.
!How to make conversations between colleagues helpful
Conversations were considered to be helpful when the overwhelmed colleague was helped by their team mate to feel less overwhelmed and to be able to think more clearly (about their dilemma), without their helpful team mate themselves becoming overwhelmed and unable to think clearly as a result of hearing their colleague's difficulty. To use the AMBIT analogy of [[Ripples in a Pond]], this would be the difference between a team mate being able to stay on the riverbank to offer calm and considered assistance to their colleague who is "drowning" in the turbulent waters of pond vs. the team mate jumping/falling straight into the pond with their colleague and joining them in their drowning!
*Teams found that using the [[Thinking Together]] framework could be useful, in helping workers to have a more manageable and structured conversation during a time of stress where thinking clearly has become difficult.
*Team members signing up to using Thinking Together and being willing to be available to each other for this purpose. This might be on an ad hoc basis, or agreed formally by a buddy/rota system
*There was discussion about the importance of the [[Marking the Task]] step of Thinking Together, as this was felt crucial in preventing story-telling and venting, which may be some of the processes via which other colleagues start to feel overwhelmed by their colleague's dilemma.
*Teams having a culture where forms of non-mentalizing, such as excessive story-telling, venting or becoming drawn into blaming narratives are not part of the team's way of talking to each other, either informally or formally, about work with families. There was an acknowledgement that whilst these kinds of dialogue might feel "cathartic" (although it was questioned whether this was always the case), they tended to mean that issues remained live and unresolved, rather than that useful reflections/actions were generated as a result.
*Therefore, in keeping with [[The Therapist's Mentalizing Stance]], teams may wish to make an agreement about [[Terminating non-mentalizing interactions]] if they notice them arising in any kind of team discussion (e.g. "We're getting into a bit of story-telling/venting/blaming here - let's pause/stop/try to get back on track. What do we want to get out of this conversation? Do we need to Think Together about this?")
!!(a) Search creatively for //existing content// that might relate to your new topic
* Writing in a wiki is partly about the specific content that you create (is it valid, helpful, relevant?) and partly about how you //integrate// this content with the existing body of work
* Before manualizing, do ''search for relevant existing content'' via the search box or by following tags and subtopics - to check that you are not just duplicating material or reinventing the wheel!
** Consider ''editing an existing page'' if you can improve it by adapting or adding content to suit it better for your Local team's work
** Don't panic! If you ''edit an existing page'' you will only create a new version of that page in your manual - you will not be editing it for the whole AMBIT [[Community of Practice]]!
* Alternatively, add your page as a [[Sub-topic]] of an existing page by using that page's title as a [[tag|Tags]] on your new page.
!!(b) Think about how you Title your offerings
* Do think about using a very clear title for the page you author, which is likely to be a phrase people would search for... this is like [[Marking the Task]] for that page.
* Alternatively, use a memorable title!
* Make sure that a page with the same title does not already exist:
** Your local page will cover up that version if it is part of the core content
** This may be just what you want, for instance if you are just editing and localising the content that is there, or if you have produced better content.
!!(c) Think about how you Tag your offerings
* [[Tags]] allow people to explore the wider topic areas that this page forms a part of.
* Aim to have enough, //but not too many// tags - a Tag is like a "chapter heading" - how many "chapters" does this page you are writing need to sit in?
* You can always create a new page as a [[Sub-topic]] of an existing page using the pre-selected/suggested tag list buttons that are listed out in [[How to run a team manualizing session]]
!!(d) Add appropriate Links
* Adding [[Links]] encourages rapid and direct connections from your content to explain in more depth some specific element that you are referring to.
!!! Changing [[Your Manual]]s icon
*Use the paperclip icon above the search bar to upload an image.
*Once you have selected the image from your desktop select import which will upload your image to the manual.
*Then simply rename the image 'SiteIcon' to make this your teams identifying icon! //''Note: Try to keep your SiteIcon 40px or less in height.''//
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/EHibkraCl_Q" frameborder="0" allowfullscreen></iframe></html></center>
!!! Changing the title of your manual
* Use the search bar to find the tiddler 'SiteTitle'
* Edit the body of text to be the new title of you manual.
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/lgwzDt927pg" frameborder="0" allowfullscreen></iframe></html></center>
!!!Change which Tiddlers automatically open as your homepage
*You can decide which tiddlers you want 'ready-opened' (if any) by going to [[DefaultTiddlers]]
*Whichever titles of other tiddlers are recorded in the text of that tiddler, those are the ones that will be automatically opened when you first open your manual.
A hyperlink is a link that you can click on which directs your browser to another web page outside the manual itself - most browsers nowadays open hyperlinks in a separate window, or a separate "tab" on your browser.
To create a hyperlink, use the following directions:
*The ''simplest way'' is just to copy the full URL (the "address" of the page you want to hyperlink to) directly from the address bar at the top of your browser, and paste it straight into your Tiddler
** for instance: https://tiddlywiki.com
*To do it in a ''slightly fancier way'' (good if the URL is very long or doesn't really describe what the page is that it refers to) you can:
** open double square brackets with the name or your own description of the page you are linking to, followed by a ''vertical line'' ( | ) and then paste in the URL, and close the double square brackets.
**See this example: [[The website of the Royal College of Psychiatrists|http://www.rcpsych.ac.uk/]]
Using google documents we can upload PDF's to the manual through the @@color:MediumSeaGreen ;''big green buttons'' @@.
*Upload any PDF to your google drive and this can be linked to the manual.
*Once you have uploaded a PDF to your google drive click on the 3 vertical dots //'More options'// and select //'share'//.
*If you select //'get shareable link'// in the top right hand corner the PDF's link will be copied to your clip board (this means to copy and paste you don't have to click copy it has done this automatically for you). This will be something like:
https://drive.google.com/file/d/16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6/view?usp=sharing
*Each PDF on google has its own unique number/letter identifier, which can be found between the d/ and /view in the url above.
*Use the code for the @@color:MediumSeaGreen ;''big green button'' @@ by copy and pasting it from this page (click on edit mode to view the code).
<<link-pdf "PDF Document Title" "https://drive.google.com/open?id=16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6">>
*Edit the title of the green button where it says 'PDF Document Title' and insert your documents unique identifier between the = and the ">>.
* Click save (tick)
We can add PDF's to the manual in two ways:
!!! 1. Using Google Documents
* Upload any document or PDF to your google drive and this can be linked to the manual.
*Once you have uploaded a document to your google drive click on the 3 vertical dots //'More options'// and select //'share'//.
*If you select //'get shareable link'// in the top right hand corner, the PDF's link will be copied to your clip board (this means to copy and paste you don't have to click copy it has done this automatically for you). This will be something like:
https://drive.google.com/file/d/16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6/view?usp=sharing
*Each PDF on google has its own unique number/letter identifier, which can be found between the d/ and /view in the url above.
*Use the code (Below) for the @@color:MediumSeaGreen ;''big green button'' @@ by copy and pasting it from this page (click on edit mode to view the code).
<<link-pdf "PDF Document Title" "https://drive.google.com/open?id=16k7xkIInqwTuBtlpo6iZJI3w5jJNFPZ6">>
*Edit the title of the green button where it says 'PDF Document Title' and insert your documents unique identifier between the = and the ">>.
* Click save (tick)
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/L_clqTP3GBg" frameborder="0" allowfullscreen></iframe></html></center>
!!! 2. Uploading a PDF similarly to [[an image|How to add a picture]]
* Use the the paper clip icon above the search engine to upload a PDF to the manual.
* Select PDF from your Documents
* Click >Import
* Rename the tiddler if you want by clicking the pen icon and editing as normal
* You can then create links to the PDF as you would a normal link with double square brackets around the tiddlers name- For example: [[AIM questionnaire - paper version]]
* Use the the paper clip icon above the search engine to upload an image to the manual.
* Select Picture from Documents
* Click >Import
* Rename the tiddler if you want by clicking the pen icon and editing as normal
* Add the picture by typing: //Open// double curly brackets { name of picture //Close// double curly brackets wherever you want it to include it.
* Example below (click on the edit/pencil button to view)
{{CWP- logo.PNG}}
NB: the words in between the brackets need to be EXACTLY the same as the tiddler containing the picture. Either copy and paste straight from the tiddler name at import or change to something really easy.
<center><html><iframe width="560" height="315" src="https://www.youtube.com/embed/pRhCdVbCdlk" frameborder="0" allowfullscreen></iframe></html></center>
Click the pen icon to view and then copy and re-use the code you'll see that is centering the word Title and the icon image... ''When you have finished click the X in a circle'' ("Discard Changes to this tiddler") to preserve this page for the next time!
! <center>Title</center>
When you are in edit mode (you'll have to be logged in and to have clicked the pen icon) do note the ''US spellings'' and the extra ''/ ''(which means 'stop' in coding terms!) see it again for this icon image:
<center> [img[AMBIT icon]] </center>
!!What is this?
Drawing up a Care Plan is really a "long range" extension of [[Active Planning]]
!!!Creating the document
What follow are steps to support the production of a //document// (the "Care Plan") but of course [[Active Planning]] emphasises the importance of the //process// of coming to (and re-working) these plans.
!!Steps
!!1. Assessment
This involves first addressing the question of [[What's the problem?]], to develop a mentalized understanding of the young person's predicament and relevant contextual factors across the various functional domains that interventions will be delivered (see [[Working in multiple domains]]). This requires talking with and listening to the young person, referred to in [[Active Planning through the phases of AMBIT work]] as [[Taking Aim]].
The pre-requisite for any of this is [[Engagement]]. A Care Plan that makes no sense to the young person is not really a Care Plan.
!!2. Review existing plans
There may already be plans in place. Do not reinvent the wheel, but by all means take it out of the box to have a good look at it, especially if things are not going well!
Remember that if you have a new case, there is a checklist at [[Starting a NEW CASE - CheckLists]] which will help you sequence the necessary tasks.
!!3. Broadcast intentions, Compare Destinations, Agree Waymarks
The Care plan, like any plan, must address the problem and the overarching [[Formulation and Treatment Aims]] that have arisen from assessment, including the young person's StrengthsResiliencies and vulnerabilities.
[[Active Planning through the phases of AMBIT work]] lays out a process for developing a collaborative (ideally co-constructed) understanding of "where we are, and where we want to head towards", especially in the steps [[Taking Aim]], [[Broadcasting Intentions]].
A ''Care Plan'' is a more ''practically-oriented'' account of ''which interventions are intended to be the core of the treatment''.
The Care Plan can include the fact that additional techniques and 'bursts' of other interventions, delivered [[Contingently|Contingencies]] according to need at the time, will play a part in maintaining momentum and engagement.
!!4. Using Supervisory Structures:
The keyworker makes use of the [SupervisoryStructures] available in the team to give him or her the support and scrutiny required to ensure that the foundations of this treatment plan are based on an accurate "[[Mentalizing]] ''stance''" towards the problems:
*Advice on working out the correct SEQUENCE of interventions (WhichInterventionWhen)
*The [[Reflective Quorum]], usually in the form of the weekly [[Team Meetings]] should support this, and should be used, especially with a new client.
*Peer-to-peer conversations are used constantly to foster [[Thinking Together]], and are part of how an [[AMBIT]] service is oriented to support workers in [[Working with your TEAM]].
*If issues are complex, an on-the-spot formal exercise like the [[Passed-outwards Discussion]] may be helpful.
!5. For each problem:
Include the following:
*Brief definition of the TARGET PROBLEM
*Brief description of the WHAT the planned intervention is.
*Define WHO is doing this.
*Define WHEN it is aimed to have been delivered by.
*Define what MEASURABLE outcome you hope to achieve by doing this.
**It is important to keep such goals realistic.
**i.e. a family intervention might be //"to reduce family rows to once a week, and stop all physical aggression."//
!5. Plan ahead (Reviews)
Ensure that you book and update the [[Client Case Review - Date and Agenda]] so that the current Care Plan is subject to regular review.
!6. Format of a Care Plan
The Care plan recording format is deliberately left somewhat open, rather than dictated by list form, to discourage form-filling by rote and to encourage creative engagement with the material available from the assessment.
Basic materials are available (see below) to help shape the relationship between problems, background (or "upstream") factors, specific triggers, and maintaining factors (see also material at StrengthsResiliencies).
The overarching aim is to reduce the tendency to shift immediately from [[RiskAssessment]] into Action (an example of [[Teleological thinking]]) but to //include the process of arriving at a broader more mentalized understading//, that then informs such planning.
!Sample Forms:
Download from : [[here|https://docs.google.com/presentation/d/1rWypGrTU_7EX7FleBqkg29N4CnHxE123jgYnfgZ45TQ/pub?start=true&loop=true&delayms=5000]]
<html><iframe src="https://docs.google.com/presentation/d/1rWypGrTU_7EX7FleBqkg29N4CnHxE123jgYnfgZ45TQ/embed?start=true&loop=true&delayms=5000" frameborder="0" width="1067" height="829" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe></html>
----
!!How to add a new tiddler (page)
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/2jzfArg3RlY" frameborder="0" allowfullscreen></iframe></html>
!!How to edit & delete tiddlers
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/KxGKCOEu3hk" frameborder="0" allowfullscreen></iframe></html>
!!How to tag tiddlers
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/_96GxO6Kk5Y" frameborder="0" allowfullscreen></iframe></html>
----
!![[|A Guide to Editing the Manual]]
{{Picture2.png}}
(a) check that you, the individual responsible for typing, are logged in (see [[Log in]])
(b) check that you are in your team's local manual (you will only have rights to edit this version!)
(c) Create a new page by clicking the plus sign just above the search engine- give your page a title, write some text and click the tick in the top right hand corner to save your edits.
(d) Alternatively, you can edit a local version of an existing page. //You won't delete the original version// (!), you are just creating your local version of the same page that will "cover over" the central version so that visitors to your manual will see your version. If you subsequently delete your local version, you will see the original version will pop back into view.
!!Videos/explanations showing you how to do the basics:
Pick from the drop-down list:
<<tag [[How to edit your team's manual]]>>
!!!1. Go to the video you wish to embed, e.g. https://www.youtube.com/watch?v=HrEgDdsohNo&t=4s
!!!1.1 If you are sharing a video that you have made you will need to upload this to ~YouTube first)
!!!2. In the youtube (or any other hosting site - they will all have similar ways of find the sharing options) click on 'Share'
{{Captureshare.PNG}}
!!!3. Select 'Embed' - (you are looking for some //code// that teh 'embed' function automatically provides, that your browser will then read to create a little window in the page for the video to play in.)
{{Captureembed.PNG}}
{{Capturenocookie.PNG}}
!!!4. Scroll down and ensure that 'Enable privacy-enhanced mode' is checked
{{Captureprivacy.PNG}}
!!!5. Click copy and then paste this code into the tiddler of your choice.
See below:
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/HrEgDdsohNo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!Introduction
There is increasing focus on [[Implementation Science]] in AMBIT - how do we best support real and [[sustainable|SUSTAIN best practice]] change in the way that teams and practitioners work?
One way is to offer web-based seminars for the [[AMBIT Lead]]s in a team. These will focus on different aspects of AMBIT, and will help to demonstrate different parts of the web-based manual, so that its resources can be more easily located and used by AMBIT Leads in their local teams.
Here we are building a "library of tips" on how to get the best out of web-based seminars/supervisions.
!!How to get the best out of web-based video conferencing
* Ten minutes of getting set up before the meeting is time well spent
** Check your microphone and speaker (headphones are better to avoid echo) connections.
** Access your local team's AMBIT manual so you can refer to it
** Clarify your tasks for the meeting - what do you want to get out of it?
* When online, and speaking, if you are on a video conference call (ie on camera yourself) try to ignore the people's faces while you speak, and instead look straight into your webcam lens - that way you ARE looking into their eyes! This feels counter-intuitive, but makes it much easier for your audience!
* Use the "Raise you hand" button (if there is one) to ask to speak and allow the facilitator to call you to speak, rather than speaking all at once.
* ''Try to keep your microphone MUTED until you come to speak'' - this reduces the amount of background noise and feedback.
This page and its sub-topics <<tag [[How to run a team manualizing session]]>> provides a guide for a team starting a [[Manualizing|Manualization]] session.
----
#[[Before you can start a Manualizing Session]]
##Opening your local manual
##Logging on
##Simple technical skills you will need
#[[Deciding what to Manualize]]
##Review existing content
##Pre-defined tasks: Check your <<tag [[Local Manualizing Tasklist]]>>
##Brand new content
##Improving/Tweaking existing content
##Create sub-topics under existing content
##Select from pre-defined topic lists
#Help with [[The group activity of manualizing]]
##Understand the 'why' of manualizing
##Allocate Roles
##Technique: Slice and Dice
##Dealing with Disagreements between team members
##Understand Boundaries
##Reminder: Technical skills required
##Give AMBIT feedback on this so we can improve these instructions
----
----
<center><<image-link "How to edit your team's manual" "luciano-de-sa-ObwMZBdEWdI-unsplash (1).jpg" "How to edit your team's manual" "250">><<image-link "Preconditions for Team Learning" "john-schnobrich-2FPjlAyMQTA-unsplash (1).jpg" "Preconditions for Team Learning" "250">>
</center>
<center><<image-link "Your Manual" "free-to-use-sounds-W_FHuUQKNP0-unsplash (1).jpg" "Your Manual" "310">></center>
!Who does that doctor think he/she is?
Doctors have spent many years training; following their (5 years) of basic training, in order to practice with a full registration by the General Medical Council in the UK, for instance, they must also have gathered 'pre-registration experience' working under close supervision in medical and surgical specialties for 18 months. After registration many (most) will go on to do further specialist training - for instance as General Practitioners, Surgeons, Psychiatrists, or Physicians. Becoming further registered in one of these specialties requires more exams and more years of training under supervision. So it is important to understand that most doctors will, in one way or another hold a belief that:
>//"I have earned the right for my opinion to be taken quite seriously"//...
At times this can result in doctors being perceived as rather arrogant or belittling of others - and at times this is undoubtedly the experience that patients and other professionals have. MOST doctors would be very unhappy with such an exchange, and would acknowledge and value the richness of of experience that others bring to any exchange. An old saying in medical school is //"Listen to the patient! They are usually telling you the diagnosis!"//. There is increasing emphasis on communication skills in the medical training.
!What do doctors actually DO?
The first thing a doctor will try to do is to make an accurate ''diagnosis'' of the problem the patient is presenting with. This means trying to get an accurate picture of the patient's concerns in their head, and then checking various possible explanations for this concern through examining the patient, or using specialist tests such as X-rays, or blood tests.
Once there is a diagnosis, a doctor will then turn to the scientific evidence and offer the most appropriate ''//treatment//'', or refer on to a specialist who can perform that work for the patient.
!What are their values?
Aside from the fact that doctors are humans and are subject to as many variations as other members of our race, they are trained in ''scientific methods'', and this is at the heart of their ''ethical stance''. This means that they will recommend only those treatments for which they understand that there is valid scientific evidence of ''safety'' and ''effectiveness'', and they will avoid offering treatments for which there is not yet evidence from trials, or at least from the wider expert community of specialists.
!Understanding what a doctor means by "evidence" is helpful.
For a new treatment to be accepted the "gold standard" of evidence is from what is known as a "Randomised Controlled Trial" (or "RCT"). This is when a group of people are gathered together who all have the same ''diagnosis''. They are then divided randomly (on the toss of a coin, although offten more sophisticated methods are used!) into two groups. The new "trial treatment" is given to one group, and a "placebo" (a substitute that has no active properties at all) is given to the to the other group. In the best trials neither the patients nor the doctors giving the treatment know which group they have been put into (this is known as a "double blind" trial) so that there is less chance of a bias creeping in. This way doctors can tell if when a patient gets betterr it is becuase of a treatment, or just because they would have got better anyway!
Now, in the field of adolescent mental health it is worth knowing that there is (compared to many specialties) a relative //lack// of hard evidence, as it is very difficult to set up properly conducted (i.e. not //biased//) trials to see if a particular treatment is effective or not.
Doctors can appear dismissive of "new" treatments, or complementary approaches on the grounds that these may not have been subjected to rigorous trials in the way that "their" treatments will have been. At its worst, this can again be perceived as arrogance, or narrow-mindedness. From a doctor's point of view their suspicion of an "alternative" or "unproven" approach may relate to the wish to avoid raising false expectations in a vulnerable person, or spending a lot of money on a treatment that may be no better than "placebo".
!Doctors may have different priorities
Doctors tend to have had experience of people dying, and of very serious illnesses. Their first priority is always to exclude life-threatening conditions. This can lead to them appearing rather harsh, or insensitive if they appear relieved that it is "only a fungal infection"... in their mind they may be relieved that "this isn't cancer", whereas the patient may be shocked to feel that her body is being "invaded" in this way.
!Doctors are often balancing competing priorities
Most doctors work long hours and have large lists of patients. A common fear for doctors is that in their busy-ness they will miss a crucial piece of information, and will make a mistake. In keeping with their "seniority in terms of training, doctors also often feel (and are treated as) responsible when things go wrong. This anxiety that //"the buck will stop with me"// may explain what might at times appear to be an overly cautious attitude.
!Doctors and [[Confidentiality]]
Doctors (and other healthcare professionals) can be reluctant to discuss a person’s diagnosis or treatment with the carer.There is a real duty of [[Confidentiality]] between the doctor and the patient. If the person is too ill to understand what is going on, doctors //will// usually involve the carer in discussions and decisions. From the doctor's point of view it is important to remember that a breach of confidentiality is potentially a very serious breach of the professional code of conduct, which could lead to problems with the General Medical Council and even being stopped from working as a doctor - understanding this dilemma will help a worker or family member to //mentalize// the doctor's position; a refusal to share information may not simply indicate that a doctor does not value another worker, or family member, etc.
!Doctors tend to be "solution-focussed"
Temperamentally, doctors often tend to prefer to DO things that FIX problems, rather than spend a lot of time in musing and imagining possible explanations or imaginative responses. They may tend to urge people "cut to the chase" in consultations - which can easily leave the people they are talking to feeling rushed, or not listened to. An understanding of the doctor's sense that there may be several other severely unwell patients on his or her books, and the need to allocate the limited time available fairly can help to mitigate this!
Text by Liz Cracknell
!A note on branches and training
There are four branches of nursing:
*Adult
*Mental Health
*Child
*Learning Disability
Registered nurses of all branches have undertaken 3 years of professional
training which crams in an educational qualification (dip or degree) with
several clinical practice placements. Nurses of all branches undertake a ...
!!!common foundation training in:
*Basic clinical skills
*Developing therapeutic relationships
*Pharmacology
*etc.
...and then specialise in their chosen branch.
''Do not expect your mental health nursing colleague to be an expert in wound management, or your adult nursing colleague to be skilled in managing psychosis!''
Many mental health nurses will have undertaken ''post-graduate training'' in an area of interest. Some undertake extensive training in a particular psychotherapeutic modality (e.g. CBT or family therapy) and practice this whilst maintaining their nursing identify and values.
!Mental health nursing and conceptual models of mental distress
Different nurses hold different values, but most nurses do not subscribe to individual conceptual models of mental distress //in isolation// (e.g. a "disease model", a "psychodynamnic model", or a "social model"). Rather, they prefer to operate within an //integrated understanding of human experience//, that draws from each of these models.
Nurses often hold the view that doctors rely too heavily on the "disease model" at the expense of an appreciation of the client as a “whole person”.
In fact, this does a great disservice to the many doctors who work to a biopsychosocial model.
Interestingly, nurses too are often viewed by other team members as being solely "medically" oriented. This is perhaps due to traditional understandings of the title
“nurse”.
!Jack of all trades, master of none?
Mental health nurses are trained in a variety of biological, psychological and sociological interventions. Consequently, the nurse may be viewed by other professionals as a //"jack of all trades and master of none"//! However, nursing theorists cite this ability to offer multi-modal interventions within the context of a therapeutic relationship as nursing's strength.
!Code of Professional Conduct and Ethics
Nurses are regulated by the Nursing and Midwifery Council (NMC) in order to safeguard the public. In order to maintain their registration with the NMC, nurses must act in accordance with the NMC's code of professional conduct and ethics. To fail to comply with this Code, is to risk being struck off the register. It is useful have in mind that the nurse has this Code (and the risk of being struck off!) in his/her mind and this will influence his/her behaviour. Of particular interest are those parts of the code
pertaining to confidentiality, record keeping, evidence-based practice and accountability.
!Confidentiality
Nurses, like other health professionals, are professionally and legally obligated to maintain the [[Confidentiality]] of patient information, except in very specific circumstances. Of courses, nurses will attempt to gain clients' consent to share information that may be useful to other teams/ services, but cannot do so without consent. This can frustrate workers in other teams who may view the nurse as a bad team player.
!Record Keeping
Nurses are obligated to maintain high standards of record keeping to ensure continuity of care and to support accountability (see below). It is in the nurse’s mind that many inquiries into deaths in mental health care highlight poor nursing record keeping as a contributory factor. The nurse’s insistence on high quality record keeping may at times frustrate other team members who may view him/her as being too rigid and uptight.
!Evidence-based practice
Nurses, like other health professionals (see [[How to speak to a DOCTOR]]), must ensure that their practice is evidence based. Nurses tend to be as interested in high quality //qualitative// data that is infused with //meaning// as they are in //quantitative //data on the effectiveness and efficacy of interventions. Positivists may, therefore, view nurses as unscientific.
!Accountability
Nurses are not only responsible for, but also professionally and legally accountable for, their acts and omissions. This accountability extends to care delegated to other team members, particularly non-regulated workers. Again, this may mean nurses are viewed as rigid and risk-averse (or too scared of litigation!).
!Who does that social worker think he/she is?
Social workers have undertaken a degree or masters level training that has led to their designation Registered Social Worker by the Health and Care Professions Council (HCPC). Ethical awareness is fundamental to the professional practice of social workers. Their ability and commitment to act ethically is an essential aspect of the quality of the service offered to those who engage with social workers. Respect for human rights and a commitment to promoting social justice are at the core of social work practice throughout the world. Social work grew out of humanitarian and democratic ideals, and its values are based on respect for the equality, worth, and dignity of all people. Since its beginnings over a century ago, social work practice has focused on meeting human needs and developing human potential. Human rights and social justice serve as the motivation and justification for social work action. In solidarity with those who are dis-advantaged, the profession strives to alleviate poverty and to work with vulnerable and oppressed people in order to promote social inclusion. Social work values are embodied in the profession’s national and international codes of ethics (BASW Code of ethics).
!What do social workers actually DO?
Social workers act within clear and precise statutory frameworks that structure their work, perspectives and priorities. Social workers undertake statutory initial and core assessments using the Common Assessment Framework, Child Protection assessments (Section 47 of the Children Act 1989) and other types of assessment regarding care, fostering and adoption and disability using the Assessment Framework. The Assessment Framework, otherwise known as the Triangle Assessment covers child development, parenting capacity and family and environmental factors.
The Children Act 1989 sets out two distinct categories of children; Children in Need or CiN (Sec.17) and children suffering Significant Harm (Sec. 31). Social workers use these categories to prioritise their work and the allocation of resources. Definitions of CiN and Significant Harm are set out below, though it is important to recognise that because of resource restrictions, social service departments set their own thresholds for these definitions;
Section 17 of the Children Act 1989 defines a child as being in need in law if:
• He or she is unlikely to achieve or maintain or to have the opportunity to achieve or maintain a reasonable standard of health or development without provision of services from the LA;
• His or her health or development is likely to be significantly impaired, or further impaired, without the provision of services from the LA;
• He or she has a disability.
Section 31 of the Children Act 1989 defines significant harm as;
• Harm means ill-treatment or the impairment of health or development including, for example, impairment suffered from seeing or hearing the ill-treatment of another
• Development means physical, intellectual, emotional, social or behavioural development
• Health means physical or mental health
• Ill-treatment includes sexual abuse and forms of ill treatment which are not physical
Following assessment, social workers coordinate the provision of direct services such as family support and provision of care. Such services may be provided by the Children's Social Care Department or by partner agencies such as Education and Health.
Historically children's social care departments were the focal point and lead agency where there were concerns regarding a child's health, development and well-being, but the Children Act 2004 made it clear that all agencies have responsibilities in these matters and a duty to cooperate. Today there needs to be a very clear social work task in order for children's social care departments to hold a case open and actively work on it. As thresholds have risen, children's social workers have increasingly become primarily interested in safeguarding children from significant harm.
!What are their values?
Much thought has gone into the development of social worker values, principles and ethics. Broadly social work values and principles fall into three categories; human rights, social justice and professional practice. Social workers value the promotion of independence, active citizenship, empowerment of individuals groups and communities, social inclusion, respect for diversity, care and protection for vulnerable people/children and young people and the community.
!Social workers are often balancing competing priorities
Social workers work under tremendous pressure in difficult circumstances. They often work with conflicting interests and competing rights. For example, they have a role to support, protect and empower people, as well as having statutory duties and other obligations that may be coercive and restrict people’s freedoms. They are frequently constrained by the availability of resources and institutional policies in society.
!Social workers and [[Confidentiality]]
There is an array of sometimes conflicting legislation and guidance regarding confidentiality, and the limits of confidentiality, within social work practice. In children's social work the clear principle is that confidentiality is limited when safeguarding and child protection matters are at hand. All agencies have a duty to share information in these circumstances.
!Social workers tend to be "solution-focused"
Temperamentally, social workers often tend to prefer to DO things that FIX problems, rather than spend a lot of time in musing and imagining possible explanations or imaginative responses. They may tend to urge people to "cut to the chase" in consultations - which can easily leave the people they are talking to feeling rushed, or not listened to. It is helpful to have an understanding of the pressure that social workers are under and of their need to allocate their limited time and resources.
This is a tag that gathers together brief advice on the kinds of aims, beliefs, and intentions that ProfessionalNetworkMembers may hold, as well as the common dilemmas that they might face in their day to day work. If the [[Key Worker]] is to act upon one of the [[Core Features of AMBIT]], which is [[Taking Responsibility for integration]], then the capacity for [[Mentalization]] must be applied to these other workers.
There is an interesting area of study called Human Centred Design which may be highly relevant to what we have been doing in the AMBIT programme (without knowing it) for the last ten years.
An introduction to human centred design can be found on youtube https://www.youtube.com/watch?v=KkUor_NTuDA
Traditionally, human centred design has focussed on improving the experience of the person receiving a service or buying a product by focussing on real life experiences of those in the contexts in which the service or product is being used. There is an obvious logic in starting here.
In AMBIT over time we have moved to a focus of the front line practitioner as being the focus of interest. Can we design a service that enable the front line worker to be able to do their job well and to enjoy their work. The application of mentalizing to the practitioner as much as the client has been a gradual but continuous realization in the progression of the development of AMBIT.
Human centred design may be, unknowingly, an aspect of what AMBIT has been doing for many years. It seems to be an strand of human enquiry that AMBIT needs to connect with in its evolving understanding of its value in systems.
Before seeing a family for the first time, and before, during and after subsequent sessions, the key workers formulate and test working hypotheses. These are preliminary attempts to explain the YP's presenting symptoms in terms of the contexts within which they occur. As more information emerges during the course of therapy, they develop to include all the significant participants and known events and relationships in an interactive pattern that offers both an explanation and possible solutions.
!!Reasons for making hypothesizing an overt and formal part of the key worker’s role.
#Firstly, it openly acknowledges the worker's assumptions, prejudices, values and ‘hunches’.
#Secondly, hypothesizing allows key workers to keep track of their organizing ideas, which can then be viewed and modified in the light of the feedback from the family.
#In this way the continuous formulation (and refutation) of hypotheses keeps the key workers alert to the active part //they are playing in the shaping of the therapeutic reality//. The key worker’s hypothesizing, resulting questions and other actions are part of what elicits the particular account the family will tell.
!!Working guidelines
Hypotheses are working guidelines for organizing the KW's work; thus two or three hypotheses are being entertained simultaneously to guard against the temptation to regard a hypothesis as a factual statement. In this way the KW's interest and curiosity will be kept alive, thereby warding off excessive certainty as well as reducing the risk of engaging in stereotyped and routine work. The following are generic hypotheses which have to be amplified in the light of unique data of the specific family. Many of these hypotheses are overlapping.
!!Hypotheses address:
#The social/cultural contexts (the social and gender factors that may precipitate and maintain the presenting problems).
#The family context (predictable life cycle issues, e.g. adolescence, birth of child, retirement; unexpected life cycle issues, e.g. sudden death, chronic illness; impact of external events, e.g. redundancy.
#The 'function' the presenting problem has: e.g.
##'glue' for family relationships
##'punishment for past sins'
##regulating distance between family members
##protecting family members
##controlling family members
##keeping family of origin involved
##giving a job to seemingly 'retired' parent(s)
!![[Mentalizing]] associations with hypothesizing
Hypothesising tends to be //tentative// in style (see [[The Therapist's Mentalizing Stance]]) so that it can invite alternative views or elaborations from family members. An example of hypothesising would be
>//‘We were wondering in what way A’s mother’s recent hospital admission had affected everyone in the family? Is it possible that it affected A differently from others?’//
Or:
>//‘we wondered who in the family tends to try to make things better if there has been a argument between Dad and the oldest son? Is this something that A tries to do?’//
!Agreed
* One of the [[Core Features of AMBIT]] is [[Managing Risk]] - doing things properly, robustly (with proper "[[Governance]]"), so that there is new learning from experience ([[Respect for Evidence]] requires a focus on [[Evaluating outcomes]]), but also so that known risks can be minimised by deploying evidence-based practices.If someone was not fulfilling their statutory responsibilities there would be a likely increase in risk for the young person and their family.
* However, it is also the case that AMBIT promotes the idea of supporting existing relationships that the young person has with practitioners and where possible it may be beneficial to REDUCE the number of professionals involved and to support a more keyworker approach. This may be particularly challenging for workers with statutory responsibilities such as YOS workers, social workers and housing officers who are required to have face to face meetings with their clients.
* We believe that these difficulties have to be addressed at a local service level and that it would be highly inappropriate to suggest that there is a formula about this dilemma that would work across all types of service. This emphasises the need for local manualising of practice. In our view, manualising relating to statutory responsibilities (and the degree to which it may be possible to delegate these to staff working in a key worker role) would require the manualising process to include managers from a number of key agencies. In this way, the manualising would be a network process and not just involving team members.
* We would be very interested to hear about teams who had been able to progress this issue and for them to share the practice and protocol issues that would need to be addressed.
* The AMBIT project prefers to speak of [[AMBIT-influenced]] teams, rather than "AMBIT teams" as AMBIT is purposefully not a one-size-fits-all model of practice; it is rather there to support existing teams to develop and share their own local expertise.
!!Have you got time NOT to do this?
The ideas in AMBIT are about working intelligently, and using existing structures more effectively, rather than replacing/adding tasks...
From the experience of training a large number of teams, a number of general themes have emerged. Firstly, in discussion about existing team processes, there is often a recognition that the current methods of working have gaps and difficulties. For example, one team the AMBIT training who provided a telephone support service to parents and they would have a debriefing session at the end of the day to discuss the calls that had come in. Some of the calls involved highly anxiety provoking situations and the staff were often left with residual feelings about the calls they had had to deal with. Before the training the debriefing sessions were long and the staff did not find them particularly helpful. After the training they decided to try using the 'thinking together' approach during the debriefing process. When they came back for a follow-up training day they reported that the length of time for the debriefing sessions has significantly reduced and staff were feeling that the meetings were more useful.
This is an example which stuck in our minds and we do not claim that this is always the outcome but it suggests that there may be gains in using these techniques which may not result in additional time being required to adopt the AMBIT approach.
Some very preliminary evaluations of the AMBIT approach have suggested that clinical outcomes have remained similar to before the training but that the amount of services needed to achieve similar outcomes has reduced i.e. there is greater efficiency in the delivery of equal outcomes.
See also [[I cannot relinquish my statutory responsibilities to do this AMBIT stuff...]].
This topic heading gathers together a whole series of related content that might be useful ''if the practitioner needs a prompt, or wants to plan out the next period of time/next interventions''.
Look at the content tagged with <<tag [[I'm stuck: what next?]]>> to see sub-topics that might help you.
IMP is an acronym for Integrative Multimodal (Mentalizing) Practice, and was an earlier name for [[M-BIO]], which is now known as [[AMBIT]]. The name changes demonstrate that this is an evolving model of practice, driven largely by feedback from deployments.
The worker in the field is sometimes referred to as an Integrative Multimodal Practitioner (IMP), which is synonymous with the term [[Key Worker]].
[[AMBIT: an overview]] is available.
!Purpose
So you have just started work with a new client. This page defines and lays out the main aspects of the INITIAL phase of work that is guided by the [[Core Features of AMBIT]].
!What is it?
There are four [[Phases of AMBIT work]], this is the first! The ''initial phase'' consists of the following processes:
#[[Processing a New Referral]] - this is likely to need adaptation by local teams.
#[[Setting up a first meeting]] - ditto, but suggestions are offered here.
#[[Engagement]] - without this you have almost nothing! But remember that [[In my beginning is my end]].
#[[Multi-Domain Assessment]] - this is the process of working out [[What's the problem?]] that you are being invited to help with, and what are the [[StrengthsResiliencies]] that may be built on to improve outcomes.
#[[Outcomes measures|Evaluating outcomes]] are one of the key ways your team maintains [[Respect for Evidence]], which is the same thing as respect for the young person and family, really: //"Is what we are doing helpful and safe?"//
#Next, you need to develop a [[Formulation and Treatment Aims]] that leads, via the process of [[Active Planning]], to the //collaborative// development of a care plan.
#[[Crisis Contingency Planning]] addresses the most likely barriers to progress, and risks.
#Moving to the [[INTERVENTION PHASE]], at the point at which more structured [[Specific interventions]] can be begin.
!Guidelines for structure
A suggested work schedule is laid out in more detail in [[Starting a NEW CASE - CheckLists]].
!How long is the INITIAL phase?
This varies, in keeping with the length of time that [[Engagement]] can take, but approximately 2 weeks would be a reasonable time span.
!!Purpose
So, you are already at work with a young person and/or family, and have finished the [[INITIAL PHASE]] of your work. (We are assuming you have already made an [[Assessment|What's the problem?]] of a young person, and their family, and any StrengthsResiliencies in the system... that you have done some [[Active Planning]]... but now where?
On this page we define the INTERVENTION PHASE of an AMBIT approach, and lay out the basic way that work is structured, and we suggest the time this phase should last.
!!What is it?
The intervention phase is the second of 4 [[Phases of AMBIT work]]; this phase begins once the worker has developed a reasonable understanding of [[What's the problem?]].
You are now more focused on [[What to do?]] and [[Who does what?]].
>It is important to be clear that this is a somewhat 'academic' distinction for many young people or families - for whom a careful //assessment// is in itself an extremely striking and often challenging and powerful //intervention//.
!!Who to work with?
For thinking about work within different [[Domains]] (the Individual, the Family, the wider social ecology, the Educational system, the wider multi-agency network...) you can go to [[Interventions (by target group)]] or [[Specific interventions]].
!!What to do?
For thinking about what to do, when to do it, and what to do if you get stuck go to: [[What to do?]]
Ideally a focus on attuned ('well-mentalized') and focused interventions (see [[Specific interventions]]) should begin as soon as possible - but SELECTING the right interventions and the right sequence is hard to get right.
!!Selecting and Sequencing interventions:
The [[AIM]] assessment from the [[Multi-Domain Assessment]] gives assistance in selecting and sequencing the most appropriate interventions for the problem set that a specific young person and family present with.
Occasionally material in [[I'm stuck: what next?]] is helpful to maintain forwards momentum.
It is important to ask oneself:
> //"Am I delivering those interventions that are most salient and appropriate for __this young person__, or my own personal 'favourites' (by virtue of my previous training, my personal temperament, or past experiences)?"//
There will be [[Active Planning]] required, in order to select WhichInterventionWhen and use of SupervisoryStructures to ensure that progress is maintained.
!!How to do it?
Learning about how to do [[Specific interventions]] - see manualized interventions, including a growing library of video clips to identify specific techniques (''//consider making video clips of role-plays of effective and excellent techniques within your local team's manual!//'')
[[Interventions|Interventions (by target group)]] are delivered, wherever possible, according to manualized procedures, as //there is evidence that structured and planned work is more effective than "benign eclecticism".//
!!Working with the system
When lots of different people are involved it is important to be clear about who [[Who does what?]], and to remember one of the [[Core Features of AMBIT]] which is [[Respect local practice and expertise]].
!!Keeping Respect for safety
[[Outcomes measures|Evaluating outcomes]] will need to be repeated at appropriate time intervals - this is how a team comes to know if what WE are doing HERE is safe and effective?
[[RiskAssessment]] is an ongoing feature of the work.
!!How long?
This is the hardest phase for which to estimate the time required. Some young people need much longer term support than others, and AMBIT does not take a simple position that the intervention must be time-limited //per se//, as it is designed to be delivered in a wide variety of settings and service-ecologies.
>//Local teams are strongly advised to clarify this (with commissioners and other services in the area) and to adjust their manual accordingly - especially the [[Intervention timeline]].//
!!!!Source: Gay Armsden, Ph.D. and Mark T. Greenberg, Ph.D
This scale measures various qualities of youth’s
relationships with parents (mother, father; or
guardians acting in these roles) and peers, such
as trust, quality of communication, and feelings
of anger and alienation.
The acronym for __I__nter__P__ersonal __T__herapy
* Review depressive symptoms
* Review activity in the last week
* Review progress during IPT – symptoms & goals
* Use charts and weekly ratings to illustrate
* Maintenance plan
* What and who will be important for staying well?
* Relapse plan
* What and who will be important if symptoms of depression return?
!!!Prompt:
!!Maintenance plan
* Plan what anti-depressant activities continue and who to ask for help
* Refer back to IPI for ideas and highlight support opportunities
* Reminders on what has been working during IPT
* Encourage planning now with the network
* Involve the network in making this plan
* Distinguish life stress and relapse
* Promote active problem solving and help seeking to maintain skills learnt in IPT
!!Relapse prevention plan
* Identify early warning signs of depression coming back
* Identify predictable triggers over coming months and plan how to engage support
* Plan how the network can help – with the network directly
* Plan how professionals can help – provide contact information
---
!!You may also be interested in:
* [[IPT Session 1 (45 mins)]]
* [[IPT Session 2 (30 mins)]]
* [[IPT Sessions 3-5 (Middle Phase - 30 mins)]]
!!Suggested script
"//Hello, I am ……..
This is the first of up to six sessions we will have together. Throughout this session we are going to create an overview of the symptoms that are currently troublesome for you, especially symptoms associate with depression, and the areas within your life that are impacted by this. During this discussion we will be considering the four IPC focal areas mentioned in the information sheet and thinking about which area is impacting most on your symptoms.//
''Prompt:'' [[IPT Worksheet 2.pdf]] and [[IPT Worksheet 3.pdf]] for visual prompts and sheets to collect examples over the assessment.
*Confidentiality & risk
!!Reviewing symptoms of depression
"//Could you tell me about your current experience of the symptoms described in the questionnaire?//"
*Refer back to questionnaires and evaluate presence and severity of symptoms
*Ask about interpersonal triggers and consequences of the symptoms and note possible links to the focal areas
*Ask about onset of current symptoms
''Prompt:'' [[IPT Worksheet 15.pdf]] - describing symptoms of depression
!!!What do you know about depression?
Compare symptoms of depression reported to table of symptoms of depression.
Explain symptoms used to diagnose depression and highlight links between the person’s symptoms and interpersonal situation that has been identified in the discussion.
The symptoms you describe (list person’s physical and emotional symptoms) may be associated with something’s going on in your life so the treatment we agree upon needs to take that into consideration. The way you feel affects your relationships and your relationships affects how you feel.
!!Timeline
Let’s go back to when you first started feeling depressed. It can be helpful to create a timeline together to establish how your depression has changed and how your symptoms have transformed since onset.
*What was happening around the time when you started to get these symptoms?
*Were there any events associated with your recent worsening of symptoms?
*What changed here for you?
*Have you ever had episodes of depression before? If so, were there any interpersonal events associated with those episodes?
''Prompt:'' [[IPT Worksheet 4.pdf]] for template timeline
Timeline focuses on the ''CURRENT'' episode of depression. Identify examples of the difficulties reflected in the focal areas – major role changes, significant dispute with an important person, bereavement, impact of isolation or fragile and unsatisfactory relationships that extends beyond the recent episode of depression.
Ask if the person has experienced any diagnosed or undiagnosed episodes of depression in the past. If yes, what were the interpersonal triggers (check relevance of the focal areas) and what treatment was offered, if any?
!!Psychoeducation
Provide psychoeducation on the medical model of depression: depression is treatable, offer hope & give sick role.
Sample script from training slides:
*“//We have agreed that you are having problems with symptoms of depression. What do you know about depression already?//"
*"//A lot of people, about 1 in 10, experience depression over their lifetime and it is even more common in women, about 1 in 4. Pregnancy is a particularly vulnerable time.//"
*"//A diagnosis is rarely good news but is important to know that depression is very treatable, and it is likely that you will get better. Some people get better on their own over time and, for those who don’t, there are lots of excellent treatments. There is lots of information available – would you like to have something to read or watch to tell you more about depression? (Suggest “[[I had a black dog|https://www.youtube.com/watch?v=XiCrniLQGYc]]”//)
*"//It is really important to know that depression is not your fault. It is not something you have chosen to get. Getting better is going to involve taking care of yourself. You may need a little extra help from your family, friends and perhaps colleagues at work to be able to manage right now//".
*"//We will try to understand when your depression started, what problems triggered it and have kept it going, and what will help you to feel better.//”
Supplementary information to cover, if not part of the discussion (from training slides):
''It is common''
*Depression affects 1 in 10 people and 1 in 4 women over their lifetime. Depression is often missed during pregnancy because symptoms are explained in terms of hormone changes or because women feel too guilty or scored to speak up.
Encourage the person and their team to watch videos of others’ stories of depression (I had a black dog; Tommy’s website)
''It is not your fault''
*There isn’t usually one cause for depression and all kinds of people experience it. There are usually interpersonal problems associate with depression and tackling them can help in treating depression. It can be the result of lots of things like coping with difficult or significant changes, losing people that are important to you, problems with other people, physical health problems or having no one to talk to about your worries. Wanted and unexpected pregnancies both involve significant physical, emotional and interpersonal changes. It is more likely if one of your close family members has also had depression. It is linked with changes in your brain chemistry that normally control your mood and feelings. That is why medication is sometimes suggested as treatment.
''It gets in the way of life''
*Depression gets in the way of living your life the way you want to. You aren’t imagining it. Depression is more than being sad. It changes your mood, making you low or irritable, but is also changes how you feel in your body, making you tired and slowing you down. It makes it harder to concentrate or feel interested and you might feel guilty or hopeless about your future and ever feeling better. It makes it harder at home, at work and with friends. It is especially difficult when you are a pregnant and trying to manage so many changes at the same time. Depression gets in the way of getting the hang of this, which is why it important to treat it as soon as possible to let you get on with your life and give you and your baby the best chance of a good start together.
''Most people recover. You will get better''
*Depression usually lasts for a few months and then gets better. Around half of people get better within a year, even without treatment, but it can last longer which is why treatment is important to help send depression on its way as quickly as possible. Treatment is also important to help you to learn to spot depression early if it starts to come back and to give you ideas about how to cope with it in the future.
''There are good treatments available''
*Talking therapy can help with your depression. Sometimes you will talk about your relationships (IPT) or how you think about things (CBT). It can be helpful to a partner or someone important to you to one of the sessions to help them to understand and learn how to help you in your recovery. If your depression is severe or has been going on a long time and it is difficult to talk you might be offered anti-depressant medication. This can help you to get started if you are feeling very stuck and might make it easier to use the ideas that come up in one of the talking therapies.
!!Interpersonal inventory
*Discuss the most important individuals in the person’s personal life (there will usually be more people on the diagram than you have time to talk about – aim to discuss 4-6)
*Identify key supportive relationships and key difficult relationships
*Frequency of contact/content of interactions
*Expectations of contact
*Satisfying/positives about relationship (what’s going well)
*Negatives/unsatisfying aspects about relationship (not so well)
*Has the depression affected the relationship-does that individual know about the depression
*Check for recent change of role, bereavement or conflict in relationships that may relate to the onset or exacerbate depression
Sample script from training slides:
*Who are the important people in your life? Let’s write their names down. I would like to find out the impact that each one of them has on your current difficulties and depression. Has this person been able to help you or have they made the problem worse? Do any of the IPT problem areas feature in these relationships? Who would you like to start with ….
*When asking about relationships, it is useful to keep in mind the three main functions a relationship can give:
*Emotional support (someone to talk to, someone who tries to understand)
*Social companionship (includes relaxing, common interests, enjoying yourself)
*Instrumental support (practical help, advice)
''Prompt:'' [[IPT Worksheet 7.pdf]] & [[IPT Worksheet 8.pdf]] for areas to cover suggested templates
Provide information on social supports that this person may be able to utilise, refer back to sick role
''Prompt:'' Slide 52 from training slides for examples of sick role activities
!!End each session with a positive suggestion for the week ahead
Invite the person to come up with ideas and be prepared to make suggestions e.g.
*Contact your (named) friend(s)
*Stay active e.g. swimming, yoga
*Make a smoothie with all your favourite fruits
*Meet someone on the way to/from work
*Watch your favourite film
*Listen to music that you enjoy/gets you moving – make a recovery playlist
*Get your nails/hair done
*Buy some flowers
------
!!You may also be interested in:
<<image-link "IPT Session 2 (30 mins)" "everton-vila-AsahNlC0VhQ-unsplash (1).jpg" "IPT Session 2" "200">> <<image-link "IPT Sessions 3-5 (Middle Phase - 30 mins)" "alexei-scutari-5Zg64OwXJg8-unsplash (1).jpg" "IPT Sessions 3-5" "200">>
!!Overview:
*Finish Inventory (IPI)
*Agree IPT Focal Area & IPT treatment contact (30 mins)
!!4 Focal Areas
Conflict with another person: No relationship is perfect, but sometimes a significant relationship at home or at work can become very stuck in disagreements or arguments, and is a source of tension and distress.
Life changes/transitions that affect how you feel about yourself and others: Life changes all the time. As it does it throws up new challenges, such as when we have a child or lose a job. These changes, whether wished for or not, can leave us feeling unable to cope with the demands of the new situation and what is expected of us.
Grief and loss: It is natural to feel sad following the loss of a significant person in our life. Sometimes, however, it can be very difficult to adjust to life without that person and we may then put our life on hold, unable to carry on with our normal activities and with our relationships.
Difficulty in starting or keeping relationships going: Sometimes relationships are difficult because of what is missing, for example not having enough people around us or not feeling as close to others as we would like. Not having someone to turn to for company or support can be very stressful and can leave us feeling alone and overwhelmed by the demands of life.
''Prompt:'' [[IPT Worksheet 5.pdf]] and [[IPT Worksheet 6.pdf]] for templates of what to cover in a formulation.
''Goals'' – agree 2-3 goals to work on over the remaining 4 weeks. These should be clearly related to the agreed focal area. Useful targets include:
*Improving social support
*Reducing the impact of the c focal area difficulty
*Enhancing social and communication skills
*Processing emotions related to the focal area problem
!!IPT Contract
*Date and time of future sessions
*Explain that the focal area will be the same for all future sessions
*Help the person to prepare for future sessions – monitor symptoms of depression, notice incidents related to the focal area, monitor progress towards goals. Future sessions will be organised around the examples the person brings
!!!End each session with a positive suggestion for the week ahead!
----
!!You may also be interested in:
<div class="tc-image-link-row"><<image-link "IPT Session 1 (45 mins)" "patrick-perkins-8VurHsVsls4-unsplash (1).jpg" "IPT Session 1 " "200">> <<image-link "IPT Sessions 3-5 (Middle Phase - 30 mins)" "alexei-scutari-5Zg64OwXJg8-unsplash (1).jpg" "IPT Sessions 3-5" "200">></div>
This is the tag used to gather together the session by session guide to IPT. The session by session guide provides you with a guide to all of the information, suggested scripts and prompts that will guide you when using IPT.
The pages below are tagged with 'IPT Session by Session Guide', and provide you with an overview of each session:
<div class="tc-image-link-row"><<image-link "IPT Session 1 (45 mins)" "patrick-perkins-8VurHsVsls4-unsplash (1).jpg" "IPT Session 1 " "200">> <<image-link "IPT Session 2 (30 mins)" "everton-vila-AsahNlC0VhQ-unsplash (1).jpg" "IPT Session 2" "200">> <<image-link "IPT Sessions 3-5 (Middle Phase - 30 mins)" "alexei-scutari-5Zg64OwXJg8-unsplash (1).jpg" "IPT Sessions 3-5" "200">></div>
Additionally, you can download PDF's of the worksheets from the manual:
* [[IPT Worksheet 1.pdf]]
* [[IPT Worksheet 2.pdf]]
* [[IPT Worksheet 3.pdf]]
* [[IPT Worksheet 4.pdf]]
* [[IPT Worksheet 5.pdf]]
* [[IPT Worksheet 6.pdf]]
* [[IPT Worksheet 7.pdf]]
* [[IPT Worksheet 8.pdf]]
* [[IPT Worksheet 15.pdf]]
!!!In every session:
*Review symptoms
*Review progress towards goals
*Review planned (and unplanned) activity from the week
*Discuss activity related to the agreed focal area
*Consider ways to engage the network
*Plan/roleplay activity for the week ahead
''Prompt:'' [[IPT Worksheet 1.pdf]]
!!!Role transition
*Explore the positives and negatives of the old role
*Can any of the positives be carried forward to the new role now?
*Explore the impact of how the change happened on making a successful transition
*Explore the positive and negative of the new role
*Explore ways to engage and develop relationships to support the person in the new role
!!!Role Disputes
*Review recent examples of the dispute to identify recurring patterns of problems in the communication
*Generate a list of communication skills to develop to counteract the recurring problems in communication
*Clarify the key issues in the disputes and how expectations differ in relation to these issues
*Encourage and support constructive communication on the key issues
*Explore ways to engage and develop relationship to reduce the impact of the dispute
!!!Grief
*Explore the positives and negatives of the relationship that has been lost
*Can any of the positives be carried shared with other people?
*Explore the impact of how the death happened and the use and availability of social support then and now
*Explore ways to engage and develop relationships to support the person in their life now
!!!Sensitivities
*Review 2-3 relationships in which characteristic difficulties have occurred
*Agree the details of recurring difficulties in making or sustaining relationships
*Target small changes to redirect the course of the recurring difficulties
*//Note// if the recurring difficulties become apparent in the therapeutic relationship and use this to generate ideas about how to manage this when it happens outside of therapy
End each session with a positive suggestion for the week ahead.
----
!!You may also be interested in:
<div class="tc-image-link-row"><<image-link "IPT Session 1 (45 mins)" "patrick-perkins-8VurHsVsls4-unsplash (1).jpg" "IPT Session 1 " "200">> <<image-link "IPT Session 2 (30 mins)" "everton-vila-AsahNlC0VhQ-unsplash (1).jpg" "IPT Session 2" "200">>
!!No but this is a big question.
There is a lot of material about the [[Key Worker]] in the manual which emphasises that the role is a balance between establishing a trusting relationship with the young person and working closely with the rest of the team and the network.
To be in the key worker role, it is crucial to be clear that this role is explicitly supported by a number of key people in the network. This is the idea of the team around the worker. In the AMBIT model it is not possible to be in a Key Worker role without these supporting relationships.
In our view the critical aspect of the team around the worker is that the [[Key Worker]] needs to be able to experience the team around him/her as being available when needed. This is not necessarily immediate 24/7 availability which is completely unrealistic (appropriate for infants only) but reliable availability which models an attachment relationship as experienced by adults. This availability may be supported by phone contact with team colleagues support and 'thinking together' on the phone.
The sense of sole responsibility would understandably convey a sense of isolation and consequent raised anxiety. This would be the opposite of what AMBIT would be trying to achieve. The aim should be for explicit responsibilities, some of which are shared with others within a framework of explicit agreed network support.
!WHAT TO DO HERE?
There is [[Advice about the Implementation Plan]].
!!HOW to keep improving and learning?
* Handovers (Extended when needed)
* Debriefs (daily/weekly)
* Regular Team Meetings (to include night staff whenever possible)
* Reflections (if time, every shift – eg when YP asleep)
* Outcomes from Reflection (ie “Thinking Together” practice): come up with suggested solutions, follow this through – with emails to whole team.
* Promoting the Training when required (especially Phil + Naz, nights; Mike K + Dave, days)
* Email
* Daily routine for the YP individually
* Bus fares/ support all staff with sanctions when these are required/routines
* Work around defining and sharing issues for the coming week/month
[img[IMG_20170802_151123.jpg]]
!!WHAT specific changes do we intend to implement?
!!!!''In 1 month:''
* Fresh clear out, “start again”: new layout for offices/spring clean/Notice boards/Pigeon holes
* Individual Plans for all YP
* Support all staff to understand key aspects of all YP (do not simply delegate all work to keyworkers – eg they need holidays/leave etc.)
* Whole reform for staff and YP – more “mindfulness of minds” in the way we talk
* Recording chats, mindful of YP (building relationships with YP using Mentalization in practice, YP thoughts and feelings recorded, etc
!!!!''In 3 months:''
* Noticeable improvement in worker consistency across the unit
* Reflected in case discussions/planning/unplanned discussions
* Improved rates of “follow through” on plans agreed.
* YP more involved in YP meeting/Activities (paid and unpaid)
* All YP pwill be consistently offered 1:1 (structured effort to reduce exclusion)
!!!!''In 9 months:''
* Team are all working in the same way (building on the Training, bringing more reflection and implementation.
* Aiming to move towards an Excellent Ofsted report by improving safeguarding protocols/issues
* Better experience of care by young people in Willow vue
* Improved YP reflections on Willow Vue as a children’s home?
* Note uncertainty about the long term viability of Willow Vue
!Contents of an ideal plan:
We suggest that an implementation plan should include the following (local teams to edit this framework): -
!WHO IS IN THE IMPLEMENTATION TEAM?
The [[Implementation Team]]
!SPECIFIC OBJECTIVES
The [[Post-training outcome goals]] - what kinds of measures of progress agaisnt these goals do we have?
!AMBIT CORE PRACTICE WITH CLIENTS
Consider the [[AMBIT Practice Audit Tool (APrAT)]]
Prompts and supports to AMBIT-influenced practice
!TEAM MEETINGS
How might [[Team Meetings]] be conducted?
!TEAM MANUALIZING
Strategies to embed the team's learning and build a //''locally attuned''// version of the AMBIT manual.
[[Local Manualization Homework Tasks]]
!SUPERVISION
[[SupervisoryStructures]] and [[Formal supervision]]
!ON GOING TRAINING
[[Planning a training event in your team]]
!TEAM INDUCTION
[[Inducting new team members]]
!SIX MONTH REVIEW
Set a date and an agenda!
Training teams in the AMBIT approach aims to follow the principles and findings of Implementation science.
Implementation science is a rapidly developing area of research which has been stimulated by the increasing realization that the dissemination of evidence based practice into health and welfare systems is far from straightforward. Long time delays between the development of practice in a specialist centre and wider use are common, even where new developments are welcomed and supported. There is some more info about this at [[Fixsen's Stages of Implementation]]
The core idea is that ''effective dissemination needs to focus on more than just staff training'' and should in fact include three areas of change, namely:
!!1. Staff training
See [[AMBIT Training]]
!!2. Addressing //organisational challenges//
See [[Implementation Team]]
!!3. Having clear, explicit //programme outcomes//.
See [[Implementation Plan]]
Further aspects of this research area that are considered to be relevant to AMBIT will be gradually included in the manual.
In order for sustainable change to take place within a team, it is essential to have a group of staff who have explicit responsibilities for implementing and sustaining such change.
AMBIT does not prescribe the organisational and leadership structures for teams using the AMBIT approach but, using implementation science, would suggest certain things need to be in place in order to achieve sustainable change. One such is that there needs to be an implementation team.
This needs to consist of:
* The AMBIT Lead(s)
* The manager of the team
* Some representation of senior practitioners (clinicians) in the team.
Our suggestion is that it is helpful to have a group of around 3-5 people who have an explicit role of supporting and developing AMBIT practice.
This team needs to develop an explicit [[Implementation Plan]], which includes the following:
* Objectives with agreed time scales
* Some system for meeting and reviewing progress against those objectives.
* Its function should be transparent of the rest of the team.
* Precise details of this will be appropriately determined by each team.
* There is an [[Advice about the Implementation Plan]] to provide some structure for developing this locally
UEsDBBQABgAIAAAAIQAvjUxmiQEAAK0HAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMlctOwzAQRfdI/EPkLUpcHkIINe2CxxIqUSS2xpm0Fn7JnkL790ySEiEUCNCCuonkzMy9x9Z4PBwvjU6eIUTlbM4OswFLwEpXKDvL2f30Oj1jSURhC6GdhZytILLxaH9vOF15iAlV25izOaI/5zzKORgRM+fBUqR0wQikZZhxL+STmAE/GgxOuXQWwWKKlQYbDS+hFAuNydWSfjckAXRkyUWTWHnlTHivlRRIcf5siw8u6doho8o6J86VjweUwHinQxX53GBdd0tHE1QByUQEvBGGsviLCwUvnFwYqsy+lungdGWpJLT1lZoPTkKMdOZGZ23ECGXf+Ls45CKiMw9Gc4VgJsH5eLgxTita6UFABe0ZfpPhaAcYjneA4eS/Geq+jLjSELfflY1uvz0gUsFfAKyVexFe4PHuzyjeifeClOQ7FY8ato/RSvdCIE1kaL6bD4da5itLyqx7nyZ8+MW230Z4VZ36bzV960jSG+8PqtehgOKn3s1F3dJ97zDn9WM7egUAAP//AwBQSwMEFAAGAAgAAAAhAJlVfgX+AAAA4QIAAAsACAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACskk1LAzEQhu+C/yHMvTvbKiLS3V5E6E1k/QFDMvuBmw+Sqbb/3iiKLtS1hx4zeefJM0PWm70d1SvHNHhXwbIoQbHT3gyuq+C5eVjcgkpCztDoHVdw4ASb+vJi/cQjSW5K/RCSyhSXKuhFwh1i0j1bSoUP7PJN66MlycfYYSD9Qh3jqixvMP5mQD1hqq2pIG7NFajmEPgUtm/bQfO91zvLTo48gbwXdobNIsTcH2XI06iGYsdSgfH6MZcTUghFRgMeN1qdbvT3tGhZyJAQah953ucjMSe0POeKpokfmzcfDZqv8pzN9Tlt9C6Jt/+s5zPzrYSTj1m/AwAA//8DAFBLAwQUAAYACAAAACEAVagc4hULAACmZgAAEQAAAHdvcmQvZG9jdW1lbnQueG1s7F3Ncts4Er5v1b4DSufxiP8/mrFT/NOMqzK12dgzc9yCKEhkmSS4IGTFOeUd9rL7evMk2wBJ2bLlSGZC2ZaVgymSQKPZaHR/3Q0yP7/7lGfomrAqpcXpQP1RGSBSxHSaFvPTwe+X4xNngCqOiynOaEFOBzekGrw7+/vffl6OpjRe5KTgCEgU1WhZxqeDhPNyNBxWcUJyXP2YpzGjFZ3xH2OaD+lslsZkuKRsOtQUVZG/SkZjUlUwXoCLa1wNGnLxp92oTRleQmdB0BjGCWacfLqloT6ZiDl0h85DQloHQvCEmvqQlP5kUtZQcPWAkNGJEHD1gJLZjdKGh7O6UdIeUrK7UdIfUnK6UXqgTvlDBaclKeDmjLIcczhl82GO2dWiPAHCJebpJM1SfgM0Faslg9PiqgNH0GtFIdenT6ZgD3M6JZk+banQ08GCFaOm/8mqv2B9VPdvDm0Ptsvz113CxjjIJx8ykoEsaFElabla4XlXanAzaYlcf+0hrvOsbbcs1R2Xy2PmKaxFeUtwF/Yb+edZzfnXKarKDjMiSKx67MLC+pgtJzlo4e3AnURzR7jqjgakJaA9IGDF6Y4q3dKopQnPAz3v0KnI08iYLZnqJr9d6sty/m3a8guji/KWWvpt1M5v1/5SeOEn0Gq07u5KqL6NmYsEl2AS8nh0Pi8ow5MMOAIdQqAGSM6A+AuzgsSiG5wBVJjQ6Y048knWHD6w5scFv8mgw+gaZ6eDS0HsFwYTOmxu/wm3QM1d2wb7CVduShhs+gmvGryn9KrtrhieIlrNUlbxjxT6qeI0w83Z7c2AZotcAJ72fntBNinorz5AntXZH/WZKgYdrrMvmBU/53AEGjW3umZaNYP3LlvKVy7XlFuCnMFdgGXTj8CGYoWaH9rAjWqMSszwObCjO6qhWqZZXwU/xcVVu/knOBfdL9md/pJwXP9tHiFuJCx5vi9hwVLTsFwbWzGVcCx92tfGXme9vhSSGV5k/OGdD+KSbSq+q0g+y3pc1hzGtOAVNMVVnMJq+oOwKS6w6Jx4RXXnihTwRP7NcDFvdYMUJ79fNM8kaQ5vh+h1HBDh2WWakyrGGZESre/VHDQy/urEWFINd5wYEGnoaVuU4jgxzcR8FMCETNG/FxhcNQCMkqVFnJYZGW6YqvvCNhzLsmxDTM8Thf1BrsqxrzaT+3ZnQASXMUEzgvmC9b8+VN/VI9f3D2N9rKuTbqi+OZY89DllAkeMqhLHIO6SkYqwazI4+zPBHOXpPOFobRL3oEObGbqhiwecPIu8zgpCpi9DJi9DIJt54/SFKA6Ok5RckxeiPDxJq3c7+CLVsD1rbI+Pvug7q0OACyRsSUU4wujiN+/jJeKYzQl/t64ia+5KHGqqK715DMfbYytQokiEInvH8bbpuY5qaV21RnXNwJPjvV0E43FEiimiM8QZTguIkB9Xi++EYhQtNB030g91sfchM9NUbVt1wjchs6eYH8d2xsDwc5gfa+zogec3HD19Tp4Folef27nQmnRO9TkQ3deudYPwdwT8bMw96gkvKUowAKN0SgqezlKIm/mSIsoQTxghKKMxzmojSBiMmVC0TDO4gq8IAiolBX7rggiaQa+YFtdE2Ev015f/vpedL+vOf335H8oJ4XCvQhiMK0SJN6IhdClILCJ2gIs8IcgbB1/xwt/JdGiRYgRh4L4qNU1fvrJ+NxbF/J/PUEVzgkpCy4zUmrpB6a4IKYUmCeWZiyT9rU79gATYboJYRqaLGKjRip+0fh1N0yotOJkzWc3q3827pm2B8h1d1rrLMp3QUTVji9vox2WZmhd6EGt1nZNXgJg3Mtzr4GId/aMgKAfCSe/LyvIc3wusDjnAt4ueFd/SLLN7oHiopsiy9LEVKVvMQU/Bu2FoqrNt7ENGzxNKr8R+mwuOGYf2qdBUMXKBcxDgv36hPo6vapL3zNoLQdpnEY6TdeQsoK1EL5wJiE0XHGGOMoIrXuPtmQQvnNKsQmkhTlKG6LJAJcMxTwG1CMgsSQBgiRdVBWQSuqzhzYxkIKqUJ9CKQl+2Pnrv1lezPFWzdeNVae0bA9Ob47/zHIC12IYl0S8CrkgRk6HQOVC1EohKkNy7Biljy/X9Lhq0H2X5BofTGrQIFnBrziTN7Z5IMR1jHARbpNKPJ9I8KzTHnvN2PdHr8y4QGV+RQpyueZeYZnAyXxDwFIzmjXfhBOcIT6QvKhCuSgiYhSPyfvPPL2t3A/4lbSvAM/gFgbJM0UDv1i/1bhkMwJmO53dGqUffsodEjc8onsagb8JZiHRKIbcGo7++/Af0kMvLMpOTk3wiEokt4BE6eFVIHAMqK2pytSKLthVfzGZCmasEM1LjG+iUr3RTNAf8U1zdamlCsrJ/ZxWKXYnGITqrHXySrtljxX+W6Mh0I9W1tc4F8Si0Az3a82xMnrTKex1n+WgZALyETNRU/UM9PbLV0A631MZf0+r5XoJRbFUPrA7VzAMwK/rYD4KxtyWB1xPUjQzP98POycNnmY16ub8FwFuXEVc1yBbszim/kyeRSIILrCsiWk7qSuJF9M/e7ZliqKaj2q8r+fHG0x7vCWYysQGgc0nZFTpBC/EezEprhCo1NfEbtExSCLnqCElC1zpEqhHnRJQ4KlFczMi12G4uIOhskf0gSRTitS2E0STl5KRKP4sqd1t57F0zDUfVoyh4sRuj+y0o2oDQTSV4DodiuLbtOk4HiPNqcOpGhnsd/NHFfCl3quwLviqBplmR2WHjyIHDV3U8VhS/y86GA7A2mmG54dh9lh13phu6oRpssXRHAPJSgKusqgAQEGmsKcnSa8IELJBQVr7JKpK2JwldsI2wgRab8rWrxGwLhn9oCoL3UsUyAdxWCUW7n0S/Qm7Nk5upMPB0MmEpmUkGc1wscAYc9G5YVcPULN14XVHYm9uRt7lemN3D070ri277dqSpHfZJHICzMXRX9cNtK6Wnt8QDX1eCbW+oH53Nvp3NI3HuZg8kvhExXWTgVWp/Uy1KaJ+KD0Yh6JCtai372Ytt+FEQ+ErncOlo+fdg+S/ub9cf1hgCNEdCEYAxVe+aYgJACHWlQwHoICpvQWR55rOYfcNVbS/cVvU7mv2XEmPkgOZXlfOS0Tm4hGo4wQyAPat+ktAe7q/QvTT2zes5va9iLbAVNzRflzIdtwtuyJsPxds4Ig4VkWMdaJJrkTeP771r34ca2bapGkb0Np2B5dum42/7Tk1P9VIl1MKwewwQKorniRed9zkbk29YmQ3DvQ7+6Jq7SD/tLbltGo4auNoBhdXfSTCqpoy1yO6wC/EggKc/DgNXFKT2bmtU2wrA3ByB5ysBnvcT2hWBgFG+VP54Rvv1564121ADNer8IYojon1DuWsNps+yu7x3eQi+JNJ9L7KfZVuGrdljIwyPr7S8oiSGdAREvPJSm31h12Oa52klstXQelhBP07maSzsPZ43BBjEoWQpm+MpLuVWQZSuWwBRiN2YChFfjNhTLkR1Qs8MzS3Y6ug5ntVzeOuvQ+7fZSiBHniu1cFyvXCXIQ71B8Tv+UjNUx3f2OVraJquKpGID+7qT6irfiAyQw+k0DT/xkfe/GygXiTmH1a6vCN7F9DpntKX8wuhuqAoqurKb3KPEvhtObpTS7yc/4bFOJyWpwPHFLWzERMbUkUP+R7taEI5p/nqbkZmd24mBE8J8GIrYifbaEYpv3M6X3B52iyQWLyWvmxTE7bS8DClsfi0uaANhvtDymPgUbdkp2ErC/mz/lj88PY/mDn7PwAAAP//AwBQSwMEFAAGAAgAAAAhAI6rW4ggAQAAaQUAABwACAF3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvJTNasMwEITvhb6D0b2W7aTpD5FzKYVcWxd6VeS1LWpJRtq09dtXpNRxaBA5GB93xM587Ipdb75VG32CddJoRtI4IRFoYUqpa0beiuebexI55LrkrdHASA+ObPLrq/ULtBx9k2tk5yLvoh0jDWL3SKkTDSjuYtOB9i+VsYqjL21NOy4+eA00S5IVtWMPkp94RtuSEbstfX7Rd3CJt6kqKeDJiL0CjWciaGU0FnzXgjfltgZkZJBi70boeYjFlBBi79Cod582QMTxUaUSQS1CNHdT0nzB7hUQ/b7dkWckhkCyuceShWjSuWnSEM1qShr3b0N/SgjhdlIE7FsYAxzqUPxy7n0sQzQPU9Kg7x3dkEP5Kw5/gp4cyPwHAAD//wMAUEsDBBQABgAIAAAAIQC29GeY0gYAAMkgAAAVAAAAd29yZC90aGVtZS90aGVtZTEueG1s7FlLixtHEL4H8h+Guct6zehhrDXSSPJr1zbetYOPvVJrpq2eadHd2rUwhmCfcgkEnJBDDLnlEEIMMcTkkh9jsEmcH5HqHkkzLfXEj12DCbuCVT++qv66qrq6NHPh4v2YOkeYC8KSjls9V3EdnIzYmCRhx719MCy1XEdIlIwRZQnuuAss3Is7n392AZ2XEY6xA/KJOI86biTl7Hy5LEYwjMQ5NsMJzE0Yj5GELg/LY46OQW9My7VKpVGOEUlcJ0ExqL0xmZARdg6USndnpXxA4V8ihRoYUb6vVGNDQmPH06r6EgsRUO4cIdpxYZ0xOz7A96XrUCQkTHTciv5zyzsXymshKgtkc3JD/beUWwqMpzUtx8PDtaDn+V6ju9avAVRu4wbNQWPQWOvTADQawU5TLqbOZi3wltgcKG1adPeb/XrVwOf017fwXV99DLwGpU1vCz8cBpkNc6C06W/h/V671zf1a1DabGzhm5Vu32saeA2KKEmmW+iK36gHq92uIRNGL1vhbd8bNmtLeIYq56IrlU9kUazF6B7jQwBo5yJJEkcuZniCRoALECWHnDi7JIwg8GYoYQKGK7XKsFKH/+rj6Zb2KDqPUU46HRqJrSHFxxEjTmay414FrW4O8urFi5ePnr989PvLx49fPvp1ufa23GWUhHm5Nz9988/TL52/f/vxzZNv7XiRx7/+5avXf/z5X+qlQeu7Z6+fP3v1/dd//fzEAu9ydJiHH5AYC+c6PnZusRg2aFkAH/L3kziIEMlLdJNQoAQpGQt6ICMDfX2BKLLgeti04x0O6cIGvDS/ZxDej/hcEgvwWhQbwD3GaI9x656uqbXyVpgnoX1xPs/jbiF0ZFs72PDyYD6DuCc2lUGEDZo3KbgchTjB0lFzbIqxRewuIYZd98iIM8Em0rlLnB4iVpMckEMjmjKhyyQGvyxsBMHfhm327jg9Rm3q+/jIRMLZQNSmElPDjJfQXKLYyhjFNI/cRTKykdxf8JFhcCHB0yGmzBmMsRA2mRt8YdC9BmnG7vY9uohNJJdkakPuIsbyyD6bBhGKZ1bOJIny2CtiCiGKnJtMWkkw84SoPvgBJYXuvkOw4e63n+3bkIbsAaJm5tx2JDAzz+OCThC2Ke/y2EixXU6s0dGbh0Zo72JM0TEaY+zcvmLDs5lh84z01QiyymVss81VZMaq6idYQK2kihuLY4kwQnYfh6yAz95iI/EsUBIjXqT5+tQMmQFcdbE1XuloaqRSwtWhtZO4IWJjf4Vab0bICCvVF/Z4XXDDf+9yxkDm3gfI4PeWgcT+zrY5QNRYIAuYAwRVhi3dgojh/kxEHSctNrfKTcxDm7mhvFH0xCR5awW0Ufv4H6/2gQrj1Q9PLdjTqXfswJNUOkXJZLO+KcJtVjUB42Py6Rc1fTRPbmK4RyzQs5rmrKb539c0Ref5rJI5q2TOKhm7yEeoZLLiRT8CWj3o0Vriwqc+E0LpvlxQvCt02SPg7I+HMKg7Wmj9kGkWQXO5nIELOdJthzP5BZHRfoRmsExVrxCKpepQODMmoHDSw1bdaoLO4z02Tker1dVzTRBAMhuHwms1DmWaTEcbzewB3lq97oX6QeuKgJJ9HxK5xUwSdQuJ5mrwLST0zk6FRdvCoqXUF7LQX0uvwOXkIPVI3PdSRhBuENJj5adUfuXdU/d0kTHNbdcs22srrqfjaYNELtxMErkwjODy2Bw+ZV+3M5ca9JQptmk0Wx/D1yqJbOQGmpg95xjOXN0HNSM067gT+MkEzXgG+oTKVIiGSccdyaWhPySzzLiQfSSiFKan0v3HRGLuUBJDrOfdQJOMW7XWVHv8RMm1K5+e5fRX3sl4MsEjWTCSdWEuVWKdPSFYddgcSO9H42PnkM75LQSG8ptVZcAxEXJtzTHhueDOrLiRrpZH0Xjfkh1RRGcRWt4o+WSewnV7TSe3D810c1dmf7mZw1A56cS37tuF1EQuaRZcIOrWtOePj3fJ51hled9glabuzVzXXuW6olvi5BdCjlq2mEFNMbZQy0ZNaqdYEOSWW4dm0R1x2rfBZtSqC2JVV+re1ottdngPIr8P1eqcSqGpwq8WjoLVK8k0E+jRVXa5L505Jx33QcXvekHND0qVlj8oeXWvUmr53Xqp6/v16sCvVvq92kMwioziqp+uPYQf+3SxfG+vx7fe3cerUvvciMVlpuvgshbW7+6rteJ39w4Byzxo1IbtervXKLXr3WHJ6/dapXbQ6JX6jaDZH/YDv9UePnSdIw32uvXAawxapUY1CEpeo6Lot9qlplerdb1mtzXwug+Xtoadr75X5tW8dv4FAAD//wMAUEsDBBQABgAIAAAAIQChzJCv/QMAAPsKAAARAAAAd29yZC9zZXR0aW5ncy54bWy0Vt9v2zYQfh+w/8HQ8xxLsuUkQp0ituImRbwWdYY9UyJlE+EvkJQdd9j/viMlRk7TFsmKvNjkfXffHY93R717/8DZYEe0oVLMouQkjgZEVBJTsZlFf90th2fRwFgkMGJSkFl0ICZ6f/H7b+/2uSHWgpoZAIUwOa9m0dZalY9GptoSjsyJVEQAWEvNkYWt3ow40veNGlaSK2RpSRm1h1Eax9Ooo5GzqNEi7yiGnFZaGllbZ5LLuqYV6f6ChX6J39akkFXDibDe40gTBjFIYbZUmcDG/y8bgNtAsvvZIXacBb19Er/guHup8aPFS8JzBkrLihgDF8RZCJCK3vHkGdGj7xPw3R3RU4F5EvvVceTZ6wjSZwTTiuLXcUw7jhFYHvEY8jqaLNCYAycPgciwl6S2hW5pqZFuC7fLK6/ym42QGpUMwoH8DiBFAx+d+3URX0DTfJWSD/a5IrqCyplFp5No5ORwXbJeW2RBOzeKMOY7sGIEAfk+32jEoXeCxNtgUqOG2TtUrq1UoLRDcIbTNG7haos0qizRa4UqYFtIYbVkQQ/LP6VdQB9qKJPOwndlv1q3HQ4WAnE41ZOuXUlMXGSNpi9PvzPw3pPs2OW3jiRMJE0xuXPZXNsDI0sIfk2/kkuBPzbGUmD0vfsLEfwsACKc509w/3cHRZYE2QbS9EbO/E0sGVUrqrXUNwJDabyZM1rXRIMDCrW2gvKhWu59nq8JwvAQvJHfxpC/QRnab3wHZXk/l9ZKfn1QW8j1r92kr/fRcfnCc4ZNWHyR0j6qxtMinRenbaQO7ZF0nMRXl99DfmxTjJP5Ytn577zy3D0Fn3VYudId8NZigXipKRqs3GMxchqlvp9TEfCSwLAhx8i6KQM4HLaA4YixJSQxAD4BPMfUqILUfs1WSG963k5Df1cKc+TjI5cbS0R/0LJRLbrXSLUlGVSSyaSzpMLeUh7kpinXwUrAeDyCGoE/7bTPU5+efW7hin1r3yJfKl6XiOGHeVdKTK9dGZAVUqqtpnKTzCJGN1ubuAKwsMPwTeE35SbtsNRjaYv5DarcyUC7W/SyNMiO9MZBNu5lkyCb9LIsyLJeNg2yqZNtYX5oGOb3UNhh6eS1ZEzuCb7u8WeiNglmixQp2lkP5SVbQTf8zWCXkwd4SAimFj7VFMUcPcAdxenUmXfaDB1kY5/oOswpq6cMGFnUtfLoibEv8W9icW9QRaEc1wde9k/LSRs4owbGgIJXyEodsD88lkxyLKsb6CRYefnk/PzyPL1atHDmXy/rJwXc+xdSz5EhuMOCadaa/lPMz66ys/PxMM4W0+HktIiHZ8XleFgsJtl0nKXF6VXyb9ek4av14j8AAAD//wMAUEsDBBQABgAIAAAAIQBAtbe+1AYAAL4mAAATACgAY3VzdG9tWG1sL2l0ZW0xLnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsWltzmzgUft+Z/Q8M+2wDBqe2p04niZPZzjRtZ5O9vHWEELG23CqJXP79HnEHg8GQ7MPOtg8NcL5PR+cuNe8/PPue8kgYp2GwVY25riokwKFDg4etGgt3tlI/nL/HYoPDQJBA3L9E5A7viY8UePltq6qKj4p/K0KfkU+26i7EsQ9vml8/7raq/qwb8Fdf3Fwvr2/0i8tL/UK/sXYrS99dWMbuxrg0jcvrmyb2j1zbZfPLjnDMaCSSr1eMIEEUpATkSXEyPeZNyB0OI5Jpn5lB6rY0CdLd1cq2HBcZhmOvTYTXFsIrQ3eXtqEqYLeAb7DYqnshoo2m8cQqfO5TzEIeumKOQ18LXZdioi10/UzziUAOEkirrJ8T+WgMUcRAeyYo4cm7CyEYtWNBuHr+80/vn7mzSckUgdgDEdInPEKYTFsrMRYLQ9i7YDFJHl1KPIdL02FkLc3lemm8W6/BjPbKXrkre71E7sJam/Y7VQm4mUZMwK30h9QGoG+h2NPT0/zJnIfsQaphaH/dfkrDrhQeLhtN3W9KA3pvVbIk2Fg6zsx0TXdmOevVDFkLa4bPdOxaC+w4uFgX9rdV7TNsWPrZYmaQM3Nm2S4A1gjPTOIa5spemGdnZuEu6kchE0pQOmrQelo3ftDyBZ54RKZJQrBVKybIBcBckUeeZegWIUZ+xFAziuc6R555tyhAD8mHY1zI85o0jLhbVYbMLXEouiPsEXx1m3kJYo8GXzCOGYSDfriPVvAN4uJEAmtzt0eMOH9Ssf+dQ50YgdvBktQ7DQll+FcaiF8R37fhtIrNkp8bJk3eZcTFc9Vfw0FJ4vRVlWHJkXHfhMzfERfFHhSSHzHyKBQR582LgeOXwv3l4DB8NQF2KmpChIeR0cANIyT2kvWd9hUxERB2BX2AhV6ZXYfpO13RI7VhuuIdhaMjVdGGBg553qorqP3U85DtkUoPcSiPPPSSTg6dFHvqOCSowCA/CAuQ14ODccD5EngvGbIIZSqDv1qDGOHQRrGcIhQbcVnDfL75HApSSbo6rJkyxy3SqD+FVdanWeWA5gTLHGD/TeucUFAGda//C8p/vqAcdt8iawy9P21SuCLxLYnRRt6RDy0jS/ZK7qCa/c/wJE8TlSSR7LcQnLRMr6Ojk5T/CNZqdH5Q7zl/igM7jMEOzvgBbVcaSlWkh7dqAhJy+OgbVlKKC4xBC/HRyQny3co3dd0bnjpOmB6Qhug0YbBpggrPNWkqHh7CfiyIy1GwDGPjpDBW6hTt4VyVeY0Cn4tAAH4iwQNo8Yi8GCQWy2XFDxWGgR2h3Vb14be01GKYpQCuSLxSEPQ0yLY1J5rtHqLpLfpio9DCMS2A9uFCA0SCJ70K5L5D3T64eWBkVj3Z9rROlN8o1ATioCJieyH+Xnz6BU4jWSt7RS1HdXDaLzyjARcIsr/o5WX3jWLmJRAHa5mVuGbMDa2UheCp9P4qIPlSSIbQS3uaYx6JWmiXtbyzwR7RLaX/FGKUXoNlCCe2PRpIwya4TAkN9OPaD2ABu5iabmn6AjjnsPiANt+24ddYPuGq61AvDpLnayU80g5xdf+t8aGAV0p1RnEonMt2XUE4eIPllWLIjvRjo+M8n20qZZBZM4JhQ6F4CZl1J2qQG61y6XgE3tZvi9qbCNdLbdYWlYS4U3dBhdezbrmKdbjKfYLvpOex/TfB8pp5hF2d8tp4jGG/k5enkDnNi50+q3aq46HgIYaiOMrJEF0PIXuZqkvKll2Ivw4ZI490BFuRlkEQiqSo5G/yA0r+Uun4c7+nPB1UFIgvKk3EFbGHShD7NmFK6CocPcK7kCm5knwOMKKgKPIkQDZ1IIEeH8E3CoOHAl1MiSNoV3LMEOUSyIVMVwjC+4Js3q5b2u+bu8ju9Gq77R+XPHmeD52kJV9O9n6tZPkZ7YSacwdbiUflx6ALzurINOk/PI4fTV9hVnrNI/4pNxWZberO+QrZDemYfTs4NzaOjfXgiPCmdm6sefZcuqUerwfoypFxLLalkx2g5WPjhNcSQh3rHTkfF9WpF35wNh4Brp+Dh8Mvd1cXnIeYypnjGmYH8TLa3cCVMQy6jehzBDwW+VKskS5QJG3GUsgNwA2G3L1wQfyP2fh/EjQ3KRTnLtygMCuZU281d9/h8G4FmzRjGVpsM5KpaaqBNAdRPDF2U/i0gpVy5Eb5jbiEyRXHMzly5B2LXUzAmhOwcjIfi5W/rvHWxbrF06eXzU5Xj6aSvh4PXkwBm1PA1hTwcgz4Xs6coxNdooffmL9B/BUKTNnByAqVrN07T73SJsfmVq5kLzLRsxjstbbfQDv/BwAA//8DAFBLAwQUAAYACAAAACEA0dCxg7UBAAB9BAAAGAAoAGN1c3RvbVhtbC9pdGVtUHJvcHMxLnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0lE1v3CAQhu+V+h8s7hh/LfFG8UbdbCxFaqSoTaVcMQy7qAYswN1WVf97sbOXNB+bqO0JDfY878zwwtn5d90n38B5ZU2D8jRDCRhuhTLbBn25bXGNEh+YEay3BhpkLDpfvX93JvypYIH5YB1cBdBJ3FBxvdo06GdxuWjXJ22N87pc4opeUryu2xJXF5tqsc5aWtH6F0qitIkY36BdCMMpIZ7vQDOf2gFM/Cit0yzE0G2JlVJx2Fg+ajCBFFlGCR+jvL7TPVpN9dxnfwLpH4ZTaaNTj1S04s56K0PKrT4I3IM1BDZ1R7g1Icrd/hgAkX9GHVxs0AUFft77EIJT3RjAH9PY7/fpvpznEYk5ubv++Hn+978U9ywUFsDzhRC4lKXElVjWmFVFhTnNuKwKLgR/vqKO8rzKaIFzoNERnYzJS8ZxCTIv664oKS3/vh1xMMo1M2wLs2VCPMSjE36RrIy0Awu7SeKE3DAXDLiLaBFn+1eTn/D2wPjXWOUj7znArziNA38YXT/TBCfQzy17kqc5eUtiAKf90Yynh6TiVXGG9cR2YiKQP67kFD94Mla/AQAA//8DAFBLAwQUAAYACAAAACEAvYRiI5AAAADbAAAAEwAoAGN1c3RvbVhtbC9pdGVtMi54bWwgoiQAKKAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbM49DsIwDIbhq6Du1AMbMulSmBBTLxBCqkaq4yg2P7k9KYIBqfNjvZ+xI+Gt46g+6lCS7wyeONPgKc1WvWxeNEc5NJNq2gOImzxZaSm4zMKjto4JZLLZJw5R4bGDb01rDcbaksZgH6T2iunZ3aniOVyzzWWZQvghHm9B108+ghf/XOcFEP4eN28AAAD//wMAUEsDBBQABgAIAAAAIQC7+mxC8gAAAE8BAAAYACgAY3VzdG9tWG1sL2l0ZW1Qcm9wczIueG1sIKIkACigIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSQQWuEMBCF74X+B5m7xtW6pou6LFphr6WFvYY4rgGTkSQuLaX/vZGetr3M8GaY9z2mOn7oObqhdYpMDbskhQiNpEGZaw3vb33MIXJemEHMZLAGQ3BsHh+qwR0G4YXzZPHsUUdhoEI/dzV8Pbd535d5Hj9lRSht9xKfylMR8yIr+a7lPEv33xAFtAk2robJ++XAmJMTauESWtCE5UhWCx+kvTIaRyWxI7lqNJ5labpncg14fdEzNFue3+tXHN293KKtVv2jaCUtORp9IkkzNwmLC6lgfsuZJOMDx38uyLYYDlhTsT+QTd89ofkBAAD//wMAUEsDBBQABgAIAAAAIQCAjN/yxQAAACYBAAATACgAY3VzdG9tWG1sL2l0ZW0zLnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMzz9rwzAQh+G90O9gtEfnJNAWYztD1gQCXboe8skWRHdCusT5+IlL/43dbnmf49fubvFcXSmXINyZta1NRexkCDx25qJ+9WZ2/fNTm5qUJVHWQKV6NFya1JlJNTUAxU0UsdgYXJYiXq2TCOJ9cASbun6BSIoDKsKvYr6YWwk/0DzPdt5ayeOSreHjeHj/tFeBiyI7+q6S+9/3wF4S6rR4r3DCrEx5L6xZzsX07SDuEon1iIwjLRf0Lfxd+1h/BwAA//8DAFBLAwQUAAYACAAAACEA401q9J8BAAC6AwAAGAAoAGN1c3RvbVhtbC9pdGVtUHJvcHMzLnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkk21rHCEQx98X+h0W37uu6553G7IXLrkEAg2UkkLeejreSVdd1MullH73undpyZU8tAREGXX+83NmPD17sH1xDyEa7zpEywoV4KRXxq079PX2Cs9QEZNwSvTeQYecR2fzjx9OVTxRIomYfIDrBLbIGyav18sO/eD8asrYcoqrSZ4aWk1wy3mLl82CLc7bxeLyvP6JihzaZZnYoU1KwwkhUW7Ailj6AVw+1D5YkbIZ1sRrbSQsvdxacInUVcWJ3Obw9s72aD7yHLy/gI7H5oi2DeZPlGEb+r2mknlYk74PQBB53ek3mjUy+Oh1KqW3j1QHGvXIdiOcWMOeclSO71I2TvtBpM0YYko+i5AchAvvUvD9y8orLmlT8RpT4Aw3Kz3DohUSM9CUzVY145y9hfU0S9Dv3xMJLembmdrtduWO7V3vbj4R2rYz4oSFOAgJLzrDBCSdKIWZZho3qs3ITd1gySupm1oqJcX/ICcINv5zVZ9puEz7LdfxUFsLSYztTmRudzyEfD8k887aHisfi5K/+nm0j/7b/BcAAAD//wMAUEsDBBQABgAIAAAAIQC6+D9SmwAAAPEAAAATACgAY3VzdG9tWG1sL2l0ZW00LnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACszEEKgzAQheGrSA5gpAsXUgtCu62FQFfdJHE0A0lGkhH09k3bK3Q5zPf+s+kUbclCrvbgY+5MLxzz2kmZrYOgc00rxPKbKQXN5UyLpHlGC1eyW4DI8tQ0rTRoPNKS9OoO8Yv9J6XAg2WYFB8eevEaHoPCnd1tQkaK4zcwRo8R6j37MvjAuw4FFyuqJ6RcYC9aIS9vAAAA//8DAFBLAwQUAAYACAAAACEArht2BOEAAABVAQAAGAAoAGN1c3RvbVhtbC9pdGVtUHJvcHM0LnhtbCCiJAAooCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACckEFrwzAMhe+D/geje2onzUJW4pS0TaHXscGuruMkhtgKtjM2xv77HHbqjrtIvCek76Hq8GEm8q6c12g5pFsGRFmJnbYDh9eXS1IC8UHYTkxoFQeLcKg3D1Xn950Iwgd06hqUIdHQsV/PHL6OaXYqyqJI8mZXxtKwpGFtluRPbX58vGRpW+6+gUS0jWc8hzGEeU+pl6Mywm9xVjYOe3RGhCjdQLHvtVRnlItRNtCMsYLKJeLNm5mgXvP8bj+r3t/LNdri9H8pN32bNA5OzOMn0Lqif1CrvntF/QMAAP//AwBQSwMEFAAGAAgAAAAhAIWWDNhKDAAAnXcAAA8AAAB3b3JkL3N0eWxlcy54bWzMnUtz2zgSx+9btd+BpdPuIZGfcpIaZ8qPZOyaOPFE9uQMkZCFNUloSSq259MvAFIUqCYoNtjj2ktiUeofQHT/G2g+f/n1OYmDnzzLhUxPR/tv90YBT0MZifThdHR/9/nNu1GQFyyNWCxTfjp64fno14///McvTx/y4iXmeaAAaf4hCU9Hi6JYfhiP83DBE5a/lUueqi/nMktYoT5mD+OEZY+r5ZtQJktWiJmIRfEyPtjbm4wqTNaHIudzEfJLGa4SnhbGfpzxWBFlmi/EMl/TnvrQnmQWLTMZ8jxXO53EJS9hIq0x+0cAlIgwk7mcF2/VzlQ9Mihlvr9n/kriDeAYBzgAgEkoIhxjUjHGytLi5ByHOV5j8peEP4+CJPxw/ZDKjM1iRVJDE6i9CwxY/6sb+6iCI5LhJZ+zVVzk+mN2m1Ufq0/mv88yLfLg6QPLQyHuVGcUMREKfnWW5mKkvuEsL85ywVq/XOg/Wr8J88LafC4iMRrrFvO/1Jc/WXw6OjhYb7nQPWhsi1n6sN7G0ze/nds9MZvup3rTTHFPRyx7Mz3ThuNqx8r/rd1dbn8yDS9ZKEw7bF5wFff7kz0NjYWW2cHx+/WH7ys90GxVyKoRAyj/r7FjMOJKDkoc01Kj6ls+/yLDRx5NC/XF6ci0pTbeX99mQmZKh6ej96ZNtXHKE3Elooin1g/ThYj4jwVP73Mebbb/8dloqdoQylWq/j48OTZREOfRp+eQL7Uy1bcp0z75qg1i/euV2DRuzP+7hu1XnmizX3Cm01Owv40w3UchDrRFbu1tO3O1te/mV6iGDl+roaPXauj4tRqavFZDJ6/V0LvXashg/s6GRBrx51KIsBlA3cVxqBHNcYgNzXFoCc1xSAXNcSgBzXEEOprjiGM0xxGmCE4hQ1cUWsF+6Ij2bu7uOcKPu3tK8OPungH8uLsTvh93d3734+5O537c3dnbj7s7WeO55VIruFYyS4vBKptLWaSy4EHBn4fTWKpYpmaj4elJj2ckO0mAKTNbNREPpoXMfN4dIUak/vN5oau6QM6DuXhYZarUH9pxnv7ksSq6AxZFikcIzHixyhwj4hPTGZ/zjKchpwxsOqiuBIN0lcwIYnPJHshYPI2Ih29NJEkKdUCr+nmhRSIIgjphYSaHd00ysvzwReTDx0pDgvNVHHMi1leaEDOs4bWBwQwvDQxmeGVgMMMLA8tnVENU0YhGqqIRDVhFIxq3Mj6pxq2iEY1bRSMat4o2fNzuRBGbFG+vOvb7H7u7iKU+yj64H1PxkDK1ABg+3VTHTINblrGHjC0XgT4q3Y619xnbzrmMXoI7ijmtJlGt602IXKi9Fulq+IA2aFTiqnlE8qp5RAKrecMldqOWyXqBdkVTz0xXs6JVtIbUS7RTFq/KBe1wtbFieIRtBPBZZDmZDNqxBBH8VS9ntTspMt+ml8M7tmENl9V2ViLtXoUk6GUsw0eaNHz1suSZKsseB5M+yziWTzyiI06LTJaxZkv+wLikl+Q/JcsFy4WplRqI/lP9+vx8cMOWg3foNmYipfHbpzcJE3FAt4K4urv5EtzJpS4z9cDQAM9lUciEjFkdCfzXDz77N00Hz1QRnL4Q7e0Z0eEhA7sQBJNMSZIREUktM0UqSOZQw/udv8wkyyIa2m3Gy0tiCk5EnLJkWS46CLSl8uKTyj8EqyHD+5NlQh8XohLVHQnMOmyYr2b/4eHwVPdVBiRHhr6tCnP80Sx1jTUdbvgyoYEbvkQw3lTTg45fgp1t4IbvbANHtbMXMctz4TyF6s2j2t01j3p/hxd/FU/GMpuvYroBXAPJRnANJBtCGa+SNKfcY8Mj3GHDo95fwpAxPIJDcob3WyYiMmcYGJUnDIzKDQZG5QMDI3XA8Ct0LNjwy3Qs2PBrdUoY0RLAglHFGen0T3SWx4JRxZmBUcWZgVHFmYFRxdnhZcDnc7UIpptiLCRVzFlIuokmLXiylBnLXoiQn2L+wAgOkJa020zO9b0SMi0v4iZA6mPUMeFiu8RROfkHn5F1TbMo+0VwRJTFsZREx9Y2E46xbF67tsvM3MkxuAu3MQv5QsYRzxz75LZV9fK0vC1ju/umG70Oe34RD4simC7qo/02ZrK303JdsDfMdjfYNuaT9f0sbWY3PBKrZN1ReDPF5LC/sYnohvHRbuPNSqJhedzTErY52W25WSU3LE96WsI23/W0NDptWHbp4ZJlj62BcNIVP3WN5wi+k64oqo1bm+0KpNqyLQRPuqKoIZXgLAz12QLonX6acdv3E4/bHqMiNwUjJzelt67ciC6Bfec/hZ7ZMUnTtFdfPQHyvllE98qcf6xkedy+ccKp/01d12rhlOY8aOUc9j9x1cgy7nHsnW7ciN55x43onYDciF6ZyGmOSkluSu/c5Eb0TlJuBDpbwRkBl62gPS5bQXufbAUpPtlqwCrAjei9HHAj0EKFCLRQB6wU3AiUUIG5l1AhBS1UiEALFSLQQoULMJxQoT1OqNDeR6iQ4iNUSEELFSLQQoUItFAhAi1UiEAL1XNt7zT3EiqkoIUKEWihQgRaqGa9OECo0B4nVGjvI1RI8REqpKCFChFooUIEWqgQgRYqRKCFChEooQJzL6FCClqoEIEWKkSghVreaugvVGiPEyq09xEqpPgIFVLQQoUItFAhAi1UiEALFSLQQoUIlFCBuZdQIQUtVIhACxUi0EI1JwsHCBXa44QK7X2ECik+QoUUtFAhAi1UiEALFSLQQoUItFAhAiVUYO4lVEhBCxUi0EKFiK74rE5Rui6z38cf9XResd//1FXVqe/2rdw26rA/at0rN6v/vQjnUj4GrTceHpp6ox9EzGIhzSFqx2l1m2suiUCd+Px20X2Hj00f+NCl6l4Ic84UwI/6WoJjKkddIW9bgiLvqCvSbUuw6jzqyr62JZgGj7qSrtHl+qIUNR0B4640YxnvO8y7srVlDoe4K0dbhnCEuzKzZQgHuCsfW4bHgU7O29bHPcdpUl9fCghd4WgRTtyErrCEvlqnYyiMvk5zE/p6z03o60Y3AeVPJwbvWDcK7WE3ys/VUGZYV/sL1U3AuhoSvFwNMP6uhihvV0OUn6thYsS6GhKwrvZPzm6Cl6sBxt/VEOXtaojyczWcyrCuhgSsqyEB6+qBE7IT4+9qiPJ2NUT5uRou7rCuhgSsqyEB62pI8HI1wPi7GqK8XQ1Rfq4GVTLa1ZCAdTUkYF0NCV6uBhh/V0OUt6shqsvV5ihKw9UoD1vmuEWYZYibkC1DXHK2DD2qJcvas1qyCJ7VEvTV2ue4asl2mpvQ13tuQl83ugkofzoxeMe6UWgPu1F+rsZVS22u9heqm4B1Na5acroaVy11uhpXLXW6GlctuV2Nq5baXI2rltpc7Z+c3QQvV+OqpU5X46qlTlfjqiW3q3HVUpurcdVSm6tx1VKbqwdOyE6Mv6tx1VKnq3HVktvVuGqpzdW4aqnN1bhqqc3VuGrJ6WpctdTpaly11OlqXLXkdjWuWmpzNa5aanM1rlpqczWuWnK6GlctdboaVy11uhpXLd0oE0HwCKhpwrIioHte3BXLFwUb/nDC+zTjuYx/8ihA7+r4qfHOKt2GecOc+n2hdlQ/tty6xygqH9taAc0Pr6P63VLaWPcoqN7iVW02Ha/OsZq/s1wVwtVv9vYmlwfnl0Yf4woJOxEuVC/C6lFUjk5Uj5St74kyD5Td7pLjubOmW5t4Wv+6GvTNSJa/a4xjZ78LHb8dfTbx3Tl6pQRcHXxfaXpXD1V/ZnH5BjT1x3Wqh/+pevtX2dPomZUo9f0Fj+MbVv5aLt0/jfm8KL/d3zNPINj6flY+TM9pn5ms6wSMm50pP1ZvYXOMd/l4/epyAGew6tTSMtzm2pShI+3uW0NIdW+qG8HNPdPbXWrcJF6OKFOtfNPKBwLTGWnLUNtdKOUMjx6XYt3v1bPfqndUf2h/q57j1YQq4fIHyYP7a21uXjvY3BTm1udyT+o3De5X86X9psFym/XCwD7ZJlzlKohNdtyOpO1h7vJfsHHElhNb81aXS5HudPvu/2vU61zZzI76qCkY2XJdYL5qG1I7rToGa/1khL87su28ey6ziGdmji3zqmlVP5m92vG/1CrN/KHa5PW7HdXSZ0Ous66XbZ2RvazX+drLWKhAivjVMPM//czLqaMe/raZZP1X/vF/AAAA//8DAFBLAwQUAAYACAAAACEAvdSNvycBAACPAgAAFAAAAHdvcmQvd2ViU2V0dGluZ3MueG1slNLNagIxEADge6HvEHLXrFKlLK5CKZZeSqHtA8TsrIZmMiETu9qnb9xqf/DiXkImyXzJhJktdujEB0S25Cs5GhZSgDdUW7+u5NvrcnArBSfta+3IQyX3wHIxv76atWULqxdIKZ9kkRXPJZpKblIKpVJsNoCahxTA582GIuqUw7hWqOP7NgwMYdDJrqyzaa/GRTGVRyZeolDTWAP3ZLYIPnX5KoLLInne2MAnrb1EaynWIZIB5lwPum8PtfU/zOjmDEJrIjE1aZiLOb6oo3L6qOhm6H6BST9gfAZMja37GdOjoXLmH4ehHzM5MbxH2EmBpnxce4p65bKUv0bk6kQHH8bDZfPcIRSSRfsJS4p3kVqGqA7L2jlqn58ecqD+tdH8CwAA//8DAFBLAwQUAAYACAAAACEA3V9K1B4CAACgBwAAEgAAAHdvcmQvZm9udFRhYmxlLnhtbLyUUW/aMBCA3yftP1h+L3FCCC1qqCgDqdK0h67duzFOYi22I18g5d/PdgKbiJgadQyEFe58n+1PF98/vMkS7bkBoVWKwxHBiCumt0LlKX59Wd/cYgQ1VVtaasVTfOCAH+afP903s0yrGpCtVzCTLMVFXVezIABWcElhpCuubDLTRtLa/jV5IKn5uatumJYVrcVGlKI+BBEhCe4w5j0UnWWC8S+a7SRXta8PDC8tUSsoRAVHWvMeWqPNtjKacQB7Zlm2PEmFOmHCuAeSghkNOqtH9jDdjjzKlofEP8nyN2AyDBD1AAkT22GMpGMEtvIPDvBhmMkRAwfJ3zCSbPaUK23oprQkqwbZ0yEPdqNbbN71Bmpmiko7a0lLsTHCJyqqNPDQ5va0TDGJyJpM7Oi+MRm7EQduIiuoAe4g7UTShjMqRXk4RqERAG2iEjUrjvE9NcLtsE2ByG1iBxuS4hUhJFqs17iNhCmObWSxPEUit5b/hF1kfIoQF2Ge085oq5jnnObYNYPWQM/Ei5Ac0DfeoGctqbpgJCKJNTGxPpyZ8SAjxnM/ZmRpI9PbeNwzcvfvjXznuebo9emCikevIO5+VsZ1m8P2QrQ6V7GKp/3muIKKH9xsqaIXTST+BXFt4X1c1cTCbTY5f00iMnk8NxH6c//dxN1AE92Fgb6KvKgvXhvusvhf14bzES1WPR/Tno/29B/sjO4B5r8AAAD//wMAUEsDBBQABgAIAAAAIQCaLioPfgEAACYDAAARAAgBZG9jUHJvcHMvY29yZS54bWwgogQBKKAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMklFPwjAQgN9N/A9L30c3ZgguYyRqeJKECEbjW2kPqGxd0x4M/r3dxoYgD771et99be+ajA955u3BWFmoEQl7AfFA8UJItR6R98XEHxLPIlOCZYWCETmCJeP0/i7hOuaFgZkpNBiUYD1nUjbmekQ2iDqm1PIN5Mz2HKFcclWYnKELzZpqxrdsDbQfBAOaAzLBkNFK6OvOSE5KwTul3pmsFghOIYMcFFoa9kJ6ZhFMbm8W1JlfZC7xqOEm2iY7+mBlB5Zl2SujGnX3D+nn9HVeP9WXquoVB5ImgscoMYM0oeelW9nd8hs4Nttd4NbcAMPCpG+wBM6ZN3c32NRUm6l6voVjWRhhXf1F5DABlhup0U2ysV9sODpjFqdutCsJ4ul4fdBfoKoxsJfV30jDmujC1jczUiGItB+Ej34Y+EG0CAdxFMVB8NU5Wyg5Tad5EQjPdTVuZtBmPqLnl8WEXPn6w8Z3VX8W5qdb/9sYPVwaW0HT18ufnf4AAAD//wMAUEsDBBQABgAIAAAAIQDNPCUI2wEAANoDAAAQAAgBZG9jUHJvcHMvYXBwLnhtbCCiBAEooAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJxTTW/UMBC9I/EfIt+7zn5QYOV1hbZCPQBdadP2bJxJYuHYlu1GXX4946QbvMCJnN48T57ffJjdvPS6GMAHZc2OLBclKcBIWyvT7shD9fnqAylCFKYW2hrYkRMEcsPfvmEHbx34qCAUKGHCjnQxui2lQXbQi7DAY4MnjfW9iBj6ltqmURJurXzuwUS6KstrCi8RTA31lZsFyaS4HeL/itZWJn/hsTo51OOsgt5pEYF/S39qRmeCVTYKXake+Duk54AdRAuBLxmdAHuyvg58Xa4ZnSDbd8ILGbF5fPl+XTKaEeyTc1pJEbGv/KuS3gbbxOJ+NFskAUbzFIYFHEE+exVPHKXykH1RJlnZMDoh9OZF64XrAt8kg3PEjlJo2GPtvBE6AKO/CXYHIs31IFQyOMTtADJaXwT1Eye7IsV3ESB1bEcG4ZUwkUxpUzBi7UL0vFJRo/YcjzBPy7HapC5O4DJxDEYPiC/djTeE+wZri/8wu8zNjh4mq5md3Nn5jj9U97Z3wmCD6YywwT/Cg6vsbVqO1x5ektncn1Tsjk5InMmqXH3MNyA7YkdkocaRzkOZCXaHJXidLsB/TQv1Oefvg7RTj9NT5cvrRYnfuERnDjdhfkP8FwAAAP//AwBQSwMEFAAGAAgAAAAhAD9iiMcNAQAAkgEAABMACAFkb2NQcm9wcy9jdXN0b20ueG1sIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnNDNboMwDADg+6S9Q5Q7jaGwAQIqIETabYdudxRCi0QSRFJWNO3dF7Sf3nuz5fiznexwlSNaxGwGrXLs7wAjobjuBnXK8duReTFGxraqa0etRI5XYfCheHzIXmc9idkOwiBHKJPjs7VTSojhZyFbs3Nl5Sq9nmVrXTqfiO77gQuq+UUKZUkA8ET4xVgtvemfwz9euth7yU7zbTvzflwn5xXZL76iXtqhy/EnjWpKI4i8oElqzwe/8pJ98uxBDBBUQc2SsvnCaNoeBxipVrrTa62sm7GhL51TF5uO04excwFXcIZrZU3UMCirCkpgIY1DoGXoU+ZXe79qWEZuPRn528qFt88svgEAAP//AwBQSwMEFAAGAAgAAAAhAHQ/OXrCAAAAKAEAAB4ACAFjdXN0b21YbWwvX3JlbHMvaXRlbTEueG1sLnJlbHMgogQBKKAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMz7GKwzAMBuD94N7BaG+c3FDKEadLKXQ7Sg66GkdJTGPLWGpp377mpit06CiJ//tRu72FRV0xs6dooKlqUBgdDT5OBn77/WoDisXGwS4U0cAdGbbd50d7xMVKCfHsE6uiRDYwi6RvrdnNGCxXlDCWy0g5WCljnnSy7mwn1F91vdb5vwHdk6kOg4F8GBpQ/T3hOzaNo3e4I3cJGOVFhXYXFgqnsPxkKo2qt3lCMeAFw9+qqYoJumv103/dAwAA//8DAFBLAwQUAAYACAAAACEAXJYnIsIAAAAoAQAAHgAIAWN1c3RvbVhtbC9fcmVscy9pdGVtMi54bWwucmVscyCiBAEooAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIzPwYrCMBAG4PuC7xDmblM9iCxNvSyCN5EueA3ptA3bZEJmFH17g6cVPHicGf7vZ5rdLczqipk9RQOrqgaF0VHv42jgt9svt6BYbOztTBEN3JFh1y6+mhPOVkqIJ59YFSWygUkkfWvNbsJguaKEsVwGysFKGfOok3V/dkS9ruuNzv8NaF9MdegN5EO/AtXdE35i0zB4hz/kLgGjvKnQ7sJC4RzmY6bSqDqbRxQDXjA8V+uqmKDbRr/81z4AAAD//wMAUEsDBBQABgAIAAAAIQB78wKjwwAAACgBAAAeAAgBY3VzdG9tWG1sL19yZWxzL2l0ZW0zLnhtbC5yZWxzIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjM/BisIwEAbg+4LvEOZuUxUWWZp6WQRvIl3wGtJpG7bJhMwo+vaGPa3gwePM8H8/0+xuYVZXzOwpGlhVNSiMjnofRwM/3X65BcViY29nimjgjgy7dvHRnHC2UkI8+cSqKJENTCLpS2t2EwbLFSWM5TJQDlbKmEedrPu1I+p1XX/q/N+A9slUh95APvQrUN094Ts2DYN3+E3uEjDKiwrtLiwUzmE+ZiqNqrN5RDHgBcPfalMVE3Tb6Kf/2gcAAAD//wMAUEsDBBQABgAIAAAAIQAMxBqSwwAAACgBAAAeAAgBY3VzdG9tWG1sL19yZWxzL2l0ZW00LnhtbC5yZWxzIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjM/BisIwEAbg+4LvEOZuU0UWWZp6WQRvIl3wGtJpG7bJhMwo+vaGPa3gwePM8H8/0+xuYVZXzOwpGlhVNSiMjnofRwM/3X65BcViY29nimjgjgy7dvHRnHC2UkI8+cSqKJENTCLpS2t2EwbLFSWM5TJQDlbKmEedrPu1I+p1XX/q/N+A9slUh95APvQrUN094Ts2DYN3+E3uEjDKiwrtLiwUzmE+ZiqNqrN5RDHgBcPfalMVE3Tb6Kf/2gcAAAD//wMAUEsBAi0AFAAGAAgAAAAhAC+NTGaJAQAArQcAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAmVV+Bf4AAADhAgAACwAAAAAAAAAAAAAAAADCAwAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAVagc4hULAACmZgAAEQAAAAAAAAAAAAAAAADxBgAAd29yZC9kb2N1bWVudC54bWxQSwECLQAUAAYACAAAACEAjqtbiCABAABpBQAAHAAAAAAAAAAAAAAAAAA1EgAAd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVsc1BLAQItABQABgAIAAAAIQC29GeY0gYAAMkgAAAVAAAAAAAAAAAAAAAAAJcUAAB3b3JkL3RoZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEAocyQr/0DAAD7CgAAEQAAAAAAAAAAAAAAAACcGwAAd29yZC9zZXR0aW5ncy54bWxQSwECLQAUAAYACAAAACEAQLW3vtQGAAC+JgAAEwAAAAAAAAAAAAAAAADIHwAAY3VzdG9tWG1sL2l0ZW0xLnhtbFBLAQItABQABgAIAAAAIQDR0LGDtQEAAH0EAAAYAAAAAAAAAAAAAAAAAPUmAABjdXN0b21YbWwvaXRlbVByb3BzMS54bWxQSwECLQAUAAYACAAAACEAvYRiI5AAAADbAAAAEwAAAAAAAAAAAAAAAAAIKQAAY3VzdG9tWG1sL2l0ZW0yLnhtbFBLAQItABQABgAIAAAAIQC7+mxC8gAAAE8BAAAYAAAAAAAAAAAAAAAAAPEpAABjdXN0b21YbWwvaXRlbVByb3BzMi54bWxQSwECLQAUAAYACAAAACEAgIzf8sUAAAAmAQAAEwAAAAAAAAAAAAAAAABBKwAAY3VzdG9tWG1sL2l0ZW0zLnhtbFBLAQItABQABgAIAAAAIQDjTWr0nwEAALoDAAAYAAAAAAAAAAAAAAAAAF8sAABjdXN0b21YbWwvaXRlbVByb3BzMy54bWxQSwECLQAUAAYACAAAACEAuvg/UpsAAADxAAAAEwAAAAAAAAAAAAAAAABcLgAAY3VzdG9tWG1sL2l0ZW00LnhtbFBLAQItABQABgAIAAAAIQCuG3YE4QAAAFUBAAAYAAAAAAAAAAAAAAAAAFAvAABjdXN0b21YbWwvaXRlbVByb3BzNC54bWxQSwECLQAUAAYACAAAACEAhZYM2EoMAACddwAADwAAAAAAAAAAAAAAAACPMAAAd29yZC9zdHlsZXMueG1sUEsBAi0AFAAGAAgAAAAhAL3Ujb8nAQAAjwIAABQAAAAAAAAAAAAAAAAABj0AAHdvcmQvd2ViU2V0dGluZ3MueG1sUEsBAi0AFAAGAAgAAAAhAN1fStQeAgAAoAcAABIAAAAAAAAAAAAAAAAAXz4AAHdvcmQvZm9udFRhYmxlLnhtbFBLAQItABQABgAIAAAAIQCaLioPfgEAACYDAAARAAAAAAAAAAAAAAAAAK1AAABkb2NQcm9wcy9jb3JlLnhtbFBLAQItABQABgAIAAAAIQDNPCUI2wEAANoDAAAQAAAAAAAAAAAAAAAAAGJDAABkb2NQcm9wcy9hcHAueG1sUEsBAi0AFAAGAAgAAAAhAD9iiMcNAQAAkgEAABMAAAAAAAAAAAAAAAAAc0YAAGRvY1Byb3BzL2N1c3RvbS54bWxQSwECLQAUAAYACAAAACEAdD85esIAAAAoAQAAHgAAAAAAAAAAAAAAAAC5SAAAY3VzdG9tWG1sL19yZWxzL2l0ZW0xLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAFyWJyLCAAAAKAEAAB4AAAAAAAAAAAAAAAAAv0oAAGN1c3RvbVhtbC9fcmVscy9pdGVtMi54bWwucmVsc1BLAQItABQABgAIAAAAIQB78wKjwwAAACgBAAAeAAAAAAAAAAAAAAAAAMVMAABjdXN0b21YbWwvX3JlbHMvaXRlbTMueG1sLnJlbHNQSwECLQAUAAYACAAAACEADMQaksMAAAAoAQAAHgAAAAAAAAAAAAAAAADMTgAAY3VzdG9tWG1sL19yZWxzL2l0ZW00LnhtbC5yZWxzUEsFBgAAAAAYABgATgYAANNQAAAAAA==
Source; Liz Cracknell and Peter Fuggle
Recent (2021) brief report (see link below) from the Head of Ofsted about the need to attend to the basics in implementing change. Also of interest was that she did not advocate that there was a best model but that the bigger challenge was, whatever model was adopted, the key task was to implement well. An interestingly different focus to evidence based practice which tries to identify best help for specific problems,
https://www.gov.uk/government/speeches/social-care-commentary-using-models-of-practice-successfully
''This is the fourth stage of the [[Social-Ecological Work]] that AMBIT recomends.''
!1.Encourage realistic expectations.
* Engaging the young person in normative activities using the above scheme is clearly core to the target of stabilising their mental health.
* At the same time it needs to be acknowledged that some of the tasks required of the young person may be highly stressful, and that some of the plans may not work out the way it was hoped.
* Preparing the family and the young person for the (almost inevitable) occasional setbacks, and even failures, is important; not least because it reduces the opportunity for self-criticism by the young person, or external criticism from the family.
!2.Plan small achievable steps.
* Having said that some set backs are inevitable, it is important to grade the demands placed upon the young person (and also the family) so that if at all possible progress is made in small, achievable (and self-reinforcing) steps, and major retreats are not required.
* The KW will have to judge the (possibly widely divergent) expectations upon the young person and their surrounding family network, and encourage the compromise that offers the best chance of sustainable progress.
!3.Timing
* Monitoring of the mental state of the young person should inform the planned timetable for their introduction to more normative social interactions.
* In keeping with the encouraging of realistic expectations (see above) the worker needs to emphasise the need to titrate exposure to potentially socially stressful situations to the mental state of the young person.
* Timetables of 'what should happen when' are necessarily fluid, therefore.
!4. Preparation
* Before (re)-introducing the young person to new social situations ensure that, if required, pre-emptive planning and rehearsal has taken place. (see Mapping needs).
!5. Monitor progress
* Using the identified needs/goals, and the allocated tasks and suggested timings, monitor the progress, and feed this back to the family.
* If the process is moving more slowly than the initial plan had suggested, reframe this as evidence that the family and network are responding to the needs of the young person rather than slavishly adhering to the initial sketch for the timeframe.
* If necessary remind people of the likelihood of slips and delays that you discussed earlier.
* Keep in mind the brief overall timeframe of the intervention.
* It may be that certain parts of the rehabilitation plan will not be achieved during contact with the outreach team, and that these uncompleted tasks will have to form part of the handover when the current intervention comes to an end.
These are beliefs that are present in the 'background' that influence [[Feeling]]s and [[Behaviour]]. An example would be "I am unlovable" or might relate to beliefs about [[Self-efficacy]]; ("I could never do that alone").
These beliefs are often referred to as ''Negative Attributional Thoughts'' or ''~NATs''.
One feature of these thoughts is that they often share aspects of the //absolute certainty// that we see in the [[Pre-mentalistic stances]] - especially [[Psychic equivalence]].
Understanding this can help the worker to position herself in relation to these "~NATs" to maximise the possibility of engaging and being able to influence the thinking of the young person. For instance, try using techniques from [[Mentalization]]-based work, such as the use of [[Marked mirroring]] to convey the idea that
>"...//this// predicament, //your// state of mind, is understandable...
This accurately [[Mentalized|Mentalizing]] understanding of such Implicit Core Beliefs avoids the kind of [[Non-contingent]] experience (of my therapist "disagreeing" with me, etc) and instead evokes [[Epistemic Trust]] - which opens the mind for potential learning to take place.
This is the 'first order' of mentalizing, in what could be seen as a hierachy, of [[Mentalizing Levels]] each higher order relying on the presence of lower orders before it can be sustained:
#[[Implicit mentalization]]
#[[Explicit mentalization]]
#[[Affective mentalization]]
By implicit mentalization we mean intuitive and unreflective interactions between people, which nevertheless imply (for their efficient and effective pursuit) considering the mental state of the other, or that of the self in relation to the other.
In one sense all social interaction 'exercises' implicit mentalization.
In //pathological// social environments, modes of interactions may be dramatically limited or distorted precisely in order to avoid the implicit mentalizing activity that such interactions might imply. (In some - particularly abusive - situations, the last thing a child may want to know about is the mental intentions and beliefs of the person who is behaving cruelly towards them, especially if that person is a family member whom they love, or are dependent upon.)
Therapeutically, mentalizing may be enhanced by changing modes of interaction between members of a family, or in the therapeutic space between therapist and client.
Most obviously, implicit mentalization is fostered ''by creating a safer, more secure family environment''. This is one where members of the family feel confident in exploring each others' thoughts and feelings, and cease to impose stereotyped prototypical ideas on others in creating mental models of their states of mind.
>//"You ALWAYS think..."//
>//"You NEVER want to..."//
From a therapist's point of view then, if we are to sustain and promote implicit mentalization, we need to work towards making and maintaining a calm, safe space, and dealing with any [[Affect storms]] quickly and effectively.
Our implicit psychoanalytical model includes assumptions about
*An unconsciously functioning mind
**Which attributes meanings to behaviour
**Which is 'intentional'.
Our model assumes that
*beliefs
*wishes
*desires
*feelings
*expectations
are held //outside// as well as //inside// of conscious awareness.
We refer to this as the [[Hidden, private or implicit theory]] that each person has, and which influences their behaviour.
* ''//Imputing//'' these (i.e. working on the //assumption// that they ''"do exist"'' - which you could see as a good definition of [[Mentalization]]) may make behaviour understandable, whether this entails the person's consciousness or not.
* We further assume that //non-conscious mental states are in some respects more influential than conscious ones//.
In many individuals, conscious critical scrutiny of these states would lead them to experience such states of mind as unacceptable. In other individuals, however, very similar feelings and beliefs may be consciously experienced and give little apparent cause for concern for that individual.
''It is not part of our model to assume a non conscious mind populated by //specific// mental contents'' but rather to endorse the psychoanalytic view that ''lack of awareness of dispositional or emotional states about oneself or others //does not preclude these from being influential determinants of behaviour//''.
See the [[video|Videos]] in [[Active Planning]] and material on [[Broadcasting Intentions]] for more practial applications of this theoretical model.
The title is a quote from [[TS Eliot - "East Coker" from the "Four Quartets"]]. The purpose of this page is to discuss the ways of, and reasons for discussing the [[ENDING PHASE]] right from the beginning of work.
There are two main reasons for doing this:
!1. Avoiding "stickiness"
In considering the dilemmas about engaging with a worker or a team, there are many ways to mentalize a young person's experience and behaviour.
Just as there may be a fear that a worker or a team may prove not to be //really// interested or caring //enough// (a very good reason to avoid engagement), another potentially off-putting experience for a young person is the counter-fear: that this relationship might prove to be //''too adhesive''//, that a team or a worker might try to "take over"; even that engaging with them might have more in common with joining a cult, than getting real help... though these ideas may seem outlandish to the well-intentioned worker, they would constitute good reasons for avoiding constructive engagement.
This is one reason to bring the ENDING of the relationship into conversation very early on in the process of engagement.
!2. It is a helpful context for [[Broadcasting Intentions]].
Equally, consideration of the Ending (and the intended outcomes of the therapeutic tasks) is in ways an example of a //healthy// form of [[Teleological thinking]] - it supports the worker in their effort to [[broadcast their intentions|Broadcasting Intentions]]...
In a more formal way, this is an opportunity to use discussion of //user-defined treatment outcomes// to help clarify and develop shared plans (this is part of the process of [[Active Planning]], which is one of the [[Core Features of AMBIT]].) What is required is discussion about
>//"Of course, we won't be working together for ever, in fact the average length of time young people work with our team is X months... If I can share what's in my head it is this: I would like to know ''the kinds of things that we would have to see as different, changed'', when our paths part, so that you would think 'Yep, meeting up with them wasn't always easy or fun (but bits were!), but it definitely helped me get to HERE which is better than how things were when I was THERE...' "//
The AMBIT approach adopts a position of showing [[Respect for Evidence]]. The assumption is that increasing effectiveness of a team will be promoted by using evidence based methods of intervention.
Evidence based practice not only applies to interventions with young people but also applies to how services function and develop.
*''For individual clients, the aim is to achieve a positive outcome''.
*''For teams or services, the aim is to achieve positive 'value' for the population of people that the service serves.''
There are many ideas and beliefs about how to increase the 'value' of public services and this is a core theme of many government initiatives. However, the achievement of increased quality of services is often illusive and that many initiatives are either poorly implemented or abandoned before they have been properly evaluated.
The basic stance of the AMBIT approach is important in relation to a number of key themes in the 'value' literature. For example, AMBIT adopts an explicit position of respect for local expertise as a starting point for service development and change (see [[Respect local practice and expertise]]). This is a 'value' position which may contrast with some government initiatives which may suggest a different starting point for a process of change.
The work of [[Michael Porter|Increasing 'value': the work of Michael Porter]], [[John Seddon|Increasing service value: the work of John Seddon]] and others will be acknowledged in the pages linked to this theme.
! ''What is 'value'''?
Michael Porter (2010) has defined value as health ''@@color(blue):outcomes@@'' measured against ''@@color(blue):overall costs@@''. (New England Journal of Medicine 363;26 pages 2477-2481)
!!!@@color(blue):Outcomes@@
Central to this theory is that outcomes must be defined from the perspective of the customer and not the organisation. Focusing on medical services, Porter proposes client defined outcomes as having three tiers.
#''Tier 1: Health status achieved''
## Survival
##Degree of recovery
#''Tier 2: Process of recovery''
##Length of time to recovery
##Amount of discomfort in recovery process
#''Tier 3: Sustainability of on-going health''
##Likelihood of relapse
##Negative effects of treatment on functioning
Organisational outcomes such as how many people have been seen and how long they waited to be seen are not as important as client defined outcomes. Such outcomes such as recovery from a chronic disease or an adverse set of circumstances (e.g. involvement with a gang) may involve a wide range of interventions and organisations over a long period of time and may need to be measured across a variety of teams and services. .
!!!@@color(blue):Overall costs@@
Costs need to be considered with respect to all aspects of services contributing to achieving the desired population outcomes over time. So, for example, recovery from depression should include costs of psychological and medical treatment, costs of loss of earnings and additional costs (e.g. child care) not just narrowly defined therapy costs.
According to Porter's theory, one of the key stages of being able to increase value provided by a service is the necessity of being able to reliably measure client defined outcomes.
!Implications for AMBIT
#Outcomes should be developed in collaboration with the clients who use the service. For example, client defined outcomes might be '''getting money legally''' or '''reducing stress,''' '''feeling safe on the street''' or '''staying out of trouble with the police.''' This has been similarly highlighted by systems approaches to organisations such as in the work of John Seddon (see [[Increasing service value: the work of John Seddon]]).
#Theories of ''value'' emphasise the importance for AMBIT teams of trying to establish routine ways of measuring outcomes of their work in order to be able to evaluate the degree to which client defined outcomes are being achieved by the service.
#With routine measurement of outcome, ''adding value'' may become more easy to define and achieve. For example, if over a period of one year 30% of service users '''stay out of trouble with the police''', the challenge for the service would be whether this could be increased by developing improved ways of working, a process of team reflection and creativity that may be enhanced by [[Manualization]].
John Seddon's book, [[Seddon, J. (2008) Systems Thinking in the Public Sector]] offers an interesting challenge to many current ideas about public service provision. The purpose of this page is to indicate the key ideas of his work. For those interested in this area, it is not intended to be a substitute for reading the book itself.
!! Key themes
# Government initiatives to improve public sector provision have been unsuccessful.
#Too much emphasis on command and control initiatives.
#Specific targets can lead to unintended negative effects on service provision. One negative consequence is that services become organised around compliance with targets rather than innovation.
#Removal of capacity for discretion in front line workers leads to 'waste' in the service.
#Managerially lead programmes often convey implicit negative beliefs about the public sector workforce i.e. that they are not intrinsically motivated to provide a good service.
!!Key proposals
#It is important to design services in order to respond to public demand. '' The key requirement for method are to understand demand, measure achievement in customer terms, design to fulfil that demand and in doing so remove all the causes of waste''.
#Services need to be designed around 'value demand'. Many services spend a lot of time dealing with 'failure demand' - the behaviour of clients making demands on the organisation because their expectations of the services have not been met.
#Waste within the organisation is defined by the proportion of time spent in failure demand.
#Services many benefit from having senior leadership roles positioned to be very aware and close to actual service demands that come to a service.
#There may be an important difference between actual service demands and what the service sees itself as delivering.
#Service demands may not tally with service targets.
#The improvement in public experience of help increases value.
#Increasing value reduces real costs. (see [[Increasing 'value': the work of Michael Porter]])
!!Implications for AMBIT
*The central idea of 'value demand' is very consistent with a mentalizing stance. Finding out what a young person would actually find helpful to their life situation is a significant challenge but is a part of clarifying 'value demand'.
*It may be very useful to think about the amount of service time is spent on dealing with 'failure demand'. Failure demand (such as dealing with complaints) is an important part of all services and cannot be completely eliminated. However, there may be parts of the service in which a significant amount of staff resources become focussed on managing 'faliure demand' rather than addressing value. For example, management of a waiting list is an example of managing a form of failure demand. It is necessary but is not contributing to the core purpose of the service to provide responsive and timely help to a young person.
*Seddon's work emphasises the unintended consequences that occur in complex systems. This is entirely consistent with the AMBIT approach to [[Addressing Dis-integration|Addressing Dis-integration]] and the lack of value in assigning blame around complex processes.
!!Inevitability and importance of this
There are always individual differences:
* ''Between team members''
* ''Between worker and client''
It is important to avoid a [[Pretend mode]] response to the awkwardness of ''disagreement'' by ''acting __as if__ [[Mentalizing]] is just a short cut to agreement'' - it is not!
[img[https://lh3.googleusercontent.com/-14hGQ3OesLA/UfKIKgJSHfI/AAAAAAAAJAM/JwU-qSDSHtE/s640/AgreeToDiffer.jpg]]
!!Disagreement and Differences in teams
The act of manualizing our work not infrequently makes ''explicit'' what has previously been ''implicit'', and this marks growth within the team rather than any kind of failure, although differences can be uncomfortable.
Similarly, AMBIT is a team approach which involves whole teams taking part in basic training, and we are very aware that individual workers will have different views and experiences about taking part in AMBIT training (see [[Individual differences and AMBIT training]]).
Often, differences between team-mates are experienced as //requiring an intervention//, especially if those differences are seen as representing ''risks'' (to our clients, or to the team's general coherence and 'well-connectedness', to network relationships, to our capacity to learn... etc.)
* Remember that ''all thinking requires difference'' - whether these differences arise in one's own mind or between minds: ''effective thinking'' can be understood as differences (in perspectives, explanations, beliefs, intentions, emotions, etc) that are:
** ''positioned'' (hierarchically, personally, culturally, socially, teleologically, emotionally, temporally, etc) and then
** ''marked'' as such, and then
** ''understood'' (mentalized) and then
** ''withstood'' (tolerated) or ''adapted'' (until there is a tolerable fit)
* ''Where there are matters of risk involved'' (to clients, to the team's overall functioning, to network relationships, to learning) there may be a requirement ''to offer help (in thinking) to a team-mate who is not themself actually asking for this at the time'':
**See [[Offering unasked-for help to a team-mate (Graded Assertiveness)]]
!!Manualizing Differences
In the event of significant differences arising in relation to proposed material for the Team's [[Manualization]], the first questions for the protagonists of each view to consider are:
*//Under what specific circumstances would I consider the alternative view to be applicable?//
*//To what extent is my view influenced by recent (or distant) events in my own history of work, or other events?//
If a resolution (for instance //"in circumstance 'a', then approach 'x' is most appropriate, in circumstance 'b', then approach 'y' should apply"//) cannot be achieved, then the SupervisoryStructures should be invoked and outside (MetaTeam) consultation applied to to help resolve this.
!!Finding resolutions, or mentalizing across differences: an exercise
Among the many [[Training exercises]] that this manual contains, try setting up a brief training event to do [[Line-ups - exploring individual differences]].
!!Differences and Disagreements between Client and Worker in Care Planning
See the following resources to explore this, and ways to identify and address differences and disagreements:
* [[Active Planning]] offers a framework for understanding this
* [[Active Planning through the phases of AMBIT work]] offers a framework for addressing this
* [[The Egg and Triangle]] is a specific tool which can help the worker in:
** [[Broadcasting Intentions]]
** [[Agreeing Waymarks]]
** Setting [[Aims and Goals]]
<<image [[Managing Differences (Egg and Triangle)]] width:400 height:250>>
!!Mentalizing and Disagreement
[img[https://lh4.googleusercontent.com/-KbzAfmD-6i0/UfKIP3WWw8I/AAAAAAAAJAc/sWCECsaQkTg/s640/MZ-Management-DisAgreement.jpg]]
This diagram demonstrates the difference between mentalizing and agreement or disagreement; how you can ''agree'' and ''accurately mentalize'' each other, or you may agree, but do so only based on an ''inaccurate mentalization'' of what the other person is promising/intending (this is highly likely to end in disappointment or conflict!)
Alternatively, you may ''disagree'', but to some extent "agree to disagree" on the grounds that you are both ''mentalizing each other accurately'' enough to have respect for where each one comes from (this can still be awkward, but interpersonally it does not need to be experienced as an //attack// or //betrayal//, etc).
Alternatively, your disagreement may in fact be based on erroneous understandings (''inaccurate mentalization'') of where you each are "coming from", or what you are actually proposing or intending. In other words, your disagreement may actually be// less dramatic// than it appears, but neither of you may realise this, or worse, you may become increasingly unable to come to shared understandings because of the passionate feelings ([[Psychic equivalence]]) that your mutual misunderstanding provokes.
!!Does Mentalizing imply a new ORTHODOXY?
It is reasonable to ask if mentalization-based approaches are another way of insisting upon a new orthodoxy - having everyone in the team //"see things the same way"//. [[Mentalization]] doesn't work like that - it is precisely about acknowledging the facts that:
* We (humans) see things from different perspectives
* We act upon our own perceptions
* We are not always very good at making sense of each others' different respective perspectives.
''We do not presume that a mentalizing team will all agree!''
''We do presume'' that just as one way of making sense of the __evolutionary advantage__ that Mentalizing offers is that //it makes violence towards those to whom we are [[attached|Attachment]] less likely//, so a mentalizing team will be better at coming to an understanding of the different perspectives among its members!
AMBIT is not an individual therapy but is designed to be delivered by teams who develop a shared approach to their work. Taking part in a team approach may evoke different reactions for individual workers. From our training work we have come to characterise some of the different positions that people may adopt in response to the training. Some of these are listed below.
*''The enthusiasts'' -those that like mentalization as a theory and an approach
*''The non-conformists'' -'I hate people telling me what to do' (we include ourselves in this group!)
*''The pragmatists'' -'I do this already, why do they have to have so much theory!'
*''The simplifiers'' - 'I cant understand all this complicated language - I cant use this with young people'
*''The experimenters'' -makes sense and might be useful - might be helpful but we will only find out in practice
These examples of [[Individual Differences and Disagreements]] are obviously a simplification, and there are obviously lots of other thoughts and reactions to AMBIT training. A genuinely mentalizing approach must be inclusive of all these different reactions to the AMBIT model.
''One of the key challenges for a team using an AMBIT approach is to ensure that all these different states of mind are enabled to have a voice'' while simultaneously recognising that one of the [[Post-training outcome goals]] must be to ensure that appropriate [[Governance]] structures are in place for [[Managing Risk]], and that the team is "on task" in respect of its //primary// [[Evaluating outcomes]] - those of the young people and families it is working with.
An important idea from training is to try to ensure that there is an inclusiveness insofar as all types of positions are recognised as //real// to those who are occupying them, and to avoid one position becoming dominant in ways that could be seen as [[Psychic equivalence]] (//"I __know__ that you are in the wrong, and you are damaging this team's work!"//) or examples of [[Teleological thinking]] (//"You MUST think like me!"//) .
In this way, a [[Mentalization]]-based approach is explicitly non-conformist, without descending into "formless relativism"!
!!Exercises
* [[Manualization]] may be seen as a way to make Differences EXPLICIT rather than IMPLICIT
* [[Line-ups - exploring individual differences]] offers a way to explore and clarify these
Every team will have its own induction programme, to ensure that team members are brought up to speed about the wider organisation's and the local team's approach and key protocols. Inducting new team members into AMBIT is a great opportunity to make practices in the team explicit - ie to explain thinking together or disintegration grids.
Also , time on the AMBIT Manual could be a way of enabling new members to learn some basic knowledge about AMBIT. This works better if a team member provides some guide as to key pages to look at.
!!Checklist of things to cover in an Engagement call/meeting (with Team Manager)
* Mark the task/set the agenda: state what we want out of the meeting (i.e. to get a sense of what the team does, and whether AMBIT will be the right training for them.) Ask if this is what they were expecting, and if there is anything else they want to cover.
* Ask Team Manager to give us a brief overview of what team does and their Client Group
* Give an outline of AMBIT using the [[AMBIT Wheel]] poster and possibly a laptop to show the manual
* Ask if AMBIT seems applicable to the team and what difficulties the team encounters that AMBIT may be able to help with - our fundamental question is... //"You are probably quite good at what you are doing already, so wy would you want or need any training?!"//
* Explain the need for senior management support for this training - see [[Briefing session for senior managers/commissioners]]
* Explain that the whole team must attend the AMBIT training (unless they are interested in the Train the Trainer approach).
*If it is a whole service being trained, explain that a Senior Manager must attend each training day, and try to gain an impression about how different teams in the service interface with each other.
* Explain the different training options (see the table of options at [[AMBIT Training]]) i.e. bespoke training (for over 16 staff), multi team training (for small teams), Train the Trainer course (for local or International teams).
* Look at date options for trainings (i.e. show tem dates for planned upcoming trainings) and get an idea about their ideal timeframe.
* Explain the role of [[AMBIT Lead]] -and the ½ day of "DIY" training that the Lead should organise between Day 3 (Lead day) and Day 5 (Start up day).
* Explain the next stages of [[AMBIT Training]]:
** that the Team Manager ''must set up a team discussion about the AMBIT training, during which the video introducing the audit would be watched by the team and the team Audit form questions would be discussed''
** At this point show the [[Pre-training team audit]] form to the team manager.
** Explain that ''the views of all members of the team must be recorded on the form'' - including some attempt to summarise //the range of different opinions// (we do not assume that teams are necessarily "of one mind" when it comes to external training - some will be excited and optimistic, others perhaps less or, or anxious about being "told to do things differently", etc).
** This form should be sent electronically back to the AMBIT Coordinator, and ''only after the team’s audit form has been reviewed and accepted by the AMBIT Trainers will the team be formally booked onto a training''.
* Explain the different ways that the team can be involved with AMBIT after the training ends:
** Annual Conference
** Advanced Lead trainings
** Community of practice online
** Buddying system
** Monthly supervision either from AFC, or another AMBIT trained team.
!!Time allocation
Approx 20 minutes
!!Objectives
# "Icebreaking"
# Stimulate interactions //between trainees//, and set expectations that this is not going to be just "lecturing teaching by experts from the front"
# Give a "first hand" experience of [[Mentalization]] and emphasise that we (the AMBIT team) will always try to [[Respect local practice and expertise]].
An example for trainers/facilitators - to give a flavour of this:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/Gy-Oik0LrdU" frameborder="0" allowfullscreen></iframe></html>
!!Exercise
# Warn participants that this is a "quickfire" exercise (speed-dating, rather than deep analysis!) so they need to move fast!
# Look around you for //someone you know least well// in the room, and partner up.
# Spend 2-3 minutes each, saying:
## ''Who you are''
## ''What you do''
## ''Why you think you are here today''
# While one person is speaking the listener's job is to understand this (they can ask simple questions to clarify, etc) and think about how they would explain why this person is here to the larger group.
# When both have spoken, return to the large group.
## Trainers introduce each other to the group in the same way (trainers/facilitators: use this as a way of [[Broadcasting Intentions]] that you have for the training!).
## ''In a small training'', ask partners to introduce each //other// (NOT themselves) and particularly to try to explain //why// this other person has come today (their hopes and fears about the training; this could be any one of thousands of possible reasons/motivations - from //"because my boss told me to"// to //"because I live and breathe mentalization-based practice..."//)
## ''In a large training'' ask individuals to call out //themes// that they picked up //from their partners// (NOT from themselves)
# Invite reflection about what it is like to have one's thoughts and intentions "reflected back" or "relayed on" - when the other person got it "spot on", and "when they didn't quite get it"
# ''Emphasise that what they have all been doing is [[Mentalizing]] (of course!)''...
!!LEARNING/DISCUSSION POINTS
* ''Mentalizing is something that everyone already does'' - we are just giving it a name, but...
** Are we just teaching people what they already now then?
** No, as we are going to be asking people to DO this, purposefully, in places where they might ordinarily find themselves doing something else (like being very certain, or just engaging in action!)
* ''Look for (and point out) the degree of tentativeness/hesitation/curiosity'' in the person introducing their partner - //do they check in with their partner as they are introducing them?//...
** Often you can see very clearly how the "introducer" is monitoring the reaction of their partner as they introduce
** as though they are //looking for signals// to gauge how accurate their introduction is... (''people who are looking for these signals are //not certain//; (hint: they are mentalizing!)''
* ''What signals told you that someone is //not certain// about what they are saying about you?''
** Statements like //"What I took from them was..."//, or //"I think maybe...", "I was wondering if..."//
** Checking in with eye contact
** Explicitly asking: //"Is that what you meant?"//
* ''Talk about what it was LIKE for you to have to introduce somebody else''
** generally this is slightly stressful as we know that there is the possibility of upsetting them if we get it wrong.
* ''Talk about what it was LIKE to have someone introduce you''
** generally, if that person gets it right enough, this is not an unpleasant experience.
** If they get it wrong it is quite uncomfortable!
* ''Note how minor and "impersonal" this task is'' ("What's your job, why are you here?") - what if it was about somethng much more personal?!
** Generally in the group attendees will be happy to admit that they didn't really know why their partner had made the effort to attend... this made them curious, and keen to monitor their partner's reactions to what they were saying...
* ''How much MORE is this the case when we see clients in our work''
** how much do we remember how LITTLE we really understand about their motives for being here, and vice for them thinking about us!
{{$:/images/fa5/solid/tasks}}''Watch this scene from the movie Inside Out''
Look out for
*mentalizing
*non-mentalizing
Come back to the group call when you've finished watching
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/_MC3XuMvsDI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
One of the cardinal features of psychosis is the lack of insight into the condition, though a relative lack of insight into the nature and efects of a set of behaviours or thoughts may be present in other conditions. For instance, a young person's developmental stage will often leave him or her more likely to deny the significance of any symptoms (even if technically the lack of insight associated with a //psychosis// is not the problem.) This means achieving engagement with the adolescent patient and their network is often far more challenging, as the worker is trying to set up the context for a therapeutic encounter when the patient is denying that he or she has any problems, or at least is resistant to admitting this is a possibility.
[[Cognitive Behavioural]] approaches can help to begin the process of gently challenging a densely insightless response to the challenge of mental illness.
Consider a focus on QuickWins, to avoid an over-focus on conflict (see also [[Roll with Resistance]] in [[Motivational Work]]).
AMBIT has always been concerned about the problem of the coordination and cooperation of agencies around the needs of clients with multiple needs and multiple services.
AMBIT has tended to adopt a neutral position with respect to structural (e.g. service reorganisations) as a way of improving integrated care.
Don Berwick is an American health care expert (advisor to Obama over Obamacare) who has also provided expertise to the NHS. In the video below in 2018, he comments on the potential of the NHS and local authorities in the UK to increase integrated care.
Don Berwick summarises his view on a brief Youtube video. https://www.youtube.com/watch?v=Qc7FmfO0Bfg
He places cooperation as crucial and the need for investment n relationship building as being at the centre of integrated care.
His four priorities are emphasised by interesting is the inclusion of the fourth as being key to the success of the heath care system.
1. Better care
3. Better health
3. Reduced cost
4. Joy at work.
On-going thinking about integrated care systems is another academic strand of study that contributes to the development of the AMBIT model.
!!What do we mean by this word?
To state the obvious it is about integrating - bringing and holding things together, the opposite of ''Dis-integration''.
It is not the same as assimilating - making things similar; integrative practice recognises the difference between separate techniques and explanatory frameworks.
We describe [[Taking Responsibility for integration]] as one of the [[Core Features of AMBIT]] in this manual, but common sense dictates that no clinician actively opts to deliver Dis-integrated Interventions.
!!For the client
The primary concern is the quality of the relationship with the [[Key Worker]]. Within the relative security of that relationship, decisions about which explanatory frameworks offer the best levers for change at the current time can be communicated in ways that are more likely to be heard, because of the [[Epistemic Trust]] that is stimulated.
In integrative practice this happens without others being dismissed (implicitly or explicitly, in the imagination or in reality) and without the authority of the [[Key Worker]] being challenged by apparent contradictions between representatives of separate disciplines. The [[Key Worker]] is able to hold on to the likelihood that alternative theoretical frameworks or techniques may yet offer significant benefits at later stages in the trajectory of the young person and their family.
The [[Key Worker]] is equipped through [[AMBIT Training]] and their access to SupervisoryStructures within the team to make choices about WhichInterventionWhen.
The overarching focus on developing [[Attachment]] security in the relationship between patient and [[Key Worker]] facilitates activation of secure internal working models of relatedness in the patient, who can thus begin to explore creative responses to his or her dilemma, using this relationship as a [[Secure Base]].
!!!Afterthought: WIki structure is intrinsically integrative
Consider the rich interlinking and meaningful connections that a wiki using tags and hyperlinks provides; this [[Basic Structure of the Wiki Manual]] in which AMBIT has been 'incubated' from its earliest beginnings has influenced the integrative nature of this approach.
This is the manual describing [[AMBIT]], a method of working formerly known as Integrative Multimodal Practice, or [[IMP]], and also as as M-BIO
The [[Introduction]] offers access to [[AMBIT: an overview]].
In keeping with the focus on the [[Social Ecology]] of the young person and family, the aim of interventions is to develop an ecology around the young person that is both supportive and safe in terms of basic needs, but also [[Integrative]] - insofar as it not only helps a young person to experience different interventions and 'work-streams' as being collaborative rather than conflictual, but also because it allows the young person the psychological space and freedom to start to explore new understandings of what conspired to bring about the present difficuties and what might be the most effective ways forwards. This bears much in relation to the notion (from [[Attachment theory]]) of the [[Secure Base]].
[[Taking Responsibility for integration]] is one of the [[Core Features of AMBIT]], this develops further the rationale for delivering different modalities of intervention from a single point/person and if necessary simultaneously.
!!Intention Broadcasting: A Model for Computer -Mediated Intention Sharing and Coordination
Von Kaufman, Richard (2009)
Proceedings of I- KNOW ’09 and I- SEMANTICS ’09'
(Media Lab Helsinki, University of Art and Design Helsinki)
!Abstract:
Social media innovations, together with rapidly improving data sharingmethodologies, are enabling individuals and groups to instantly disseminate, or “broadcast”,messages across many diverse networks. This phenomenon, combined with the growing use of social media services for sharing and coordinating intentions, led me to develop the concept of “intention broadcasting”. In this paper I present a model for computer-mediated intentionsharing and coordination. It was created to help guide web practitioners in the development of intention-broadcasting related systems.
<html><p style=" margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block;"> <a title="View Intention Broadcasting on Scribd" href="http://www.scribd.com/doc/23922223/Intention-Broadcasting" style="text-decoration: underline;" >Intention Broadcasting</a> by <a title="View Zipipop's profile on Scribd" href="http://www.scribd.com/Zipipop" style="text-decoration: underline;" >Zipipop</a> </p><iframe class="scribd_iframe_embed" src="http://www.scribd.com/embeds/23922223/content?start_page=1&view_mode=scroll&access_key=key-1arlwo14fsa714iqhif6" data-auto-height="false" data-aspect-ratio="0.667393675027263" scrolling="no" id="doc_6887" width="100%" height="600" frameborder="0"></iframe></html>
The field of [[Mentalization]] has a particular connection to ''Intentions'', which every human, as an [[Agentive self]], with a mind (''"mental"'') is assumed to have. An intentional stance simply implies this - that our behaviours occur in relation to some set of calculations in the mind that 'add up' in a particular time and place to an intention - to some kind of goal-direction in our behaviours (physical or verbal utterances). Of course, often our "true" intentions are //hidden// even to our selves ([[Psychodynamic theory]] has plenty to say about this) and it is hard enough to work out our own intentional stance, sometimes, let alone that of another human being. This is the work of mentalizing...
Multilevel Confirmatory Factor Analysis of a Scale Measuring Interagency Collaboration of Children’s Mental Health Agencies
Robert F. Dedrick1 and Paul E. Greenbaum1
2011 Journal of Emotional and Behavioral Disorders
19(1) 27–40
This is a 12 item self report measure for staff to rate the level of interagency collaboration perceived to be adopted by their organisation. The measure is reported to take about 20 minutes to complete. The measure was not available from this paper which assessed its pychmetric properties.
The scale loads onto three factors. namely
1. Degree of shared funding and use of physical resources
2. Degree of service developments that are done in collaboration with other agencies
3. The presence or absence of policies which support collaborative practice
The three factors were shown to be reasonably independent when individual scores were examined but were less independent when multiple reports from one organisation were collected. For multiple reports, a single factor of collaboration was more evident. This would provide a way of providing a bench mark for an organisation and a potential to measure change over time on this construct.
This is a specific and particular example of the [[Implicit Core Beliefs]] that every person carries around.
It functions as a "map" or "template" of //"how a relationship with a 'caring authority' will tend to look and feel"// and is developed in early life through the child's experiences of the relationship with his or her main carers.
In early life children can have different types of relationships with different caregivers/authority figures in their lives. They may have a secure relationship ([[Secure Base]]) with their mother, but an ~Ambivalent-Enmeshed [[Attachment Relationship]] with their father, or vice versa - grandparents, teachers, etc may also function as "attachment objects".
!Why this matters
Over time (and this is particularly happening during the adolescent years) these different "models" or relatedness tend to coalesce into a single Internal Working Model (IWM) - which migh tbe thought of as an "averaged out" version of the different individual experiences in that child's earlier life. These IWM's tend to be quite persistent through life, although there is evidence that change can occur over time. During adolescence there appears to be more 'plasticity' left than in adulthood.
What is critical about this is that a novel, more adaptive, helpful attachment - even as late as adolescence, and with, say, a [[Key Worker]] - can have a profound effect on shaping these IWM's. Changing these maps is at the heart of AMBIT's approach to trying to improve a young person's [[Relationship to help]]
!!''Proposed model''
Designed specifically for overseas teams, the training comprises 5 days of training for a new role - [[AMBIT Local Facilitators]] ([[ALF]]s) who, after the 5 day training (5 days consecutively over the course of a week), will go back and train their local team - the intention is to support better implementation by developing more local ownership of the model and training, and leaving teams with more local expertise, supported by [[Training exercises]] in the web-based manual.
!!''Pre-training phase''
* Teams wanting to embark on this MUST first complete a Pre-training team audit
* Managers from the teams MUST attend an Engagement meeting in order to:
** Ensure full managerial support
** Clarify the team's [[Post-training outcome goals]]
** Clarify dates, etc
* [[AMBIT Local Facilitators]] are selected. Teams put them forward, AFC team oversees selection based on combination of ''criteria'' and ''local recommendations'':
** Have some authority in the team
** Enthusiasm for the model and role
** Have some experience of delivering training
** Moderate confidence in using a web-based app
* Teams receive and complete set reading list before the first training day:
** [[Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams...]]
** [[Bevington et al (2012) Adolescent Mentalization-Based Integrative Therapy (AMBIT)]]
!!''Training Schedule''
''__Day 1:__''
*''Main objectives:'' to learn about each other as a group; to explore methods of learning including the use of the AMBIT Manual; to explore methods of training; to learn about mentalization.
*''Sections in the manual.''
** The AMBIT Manual - [[About this Manual]]
** [[Mentalization]]
''__Day 2:__''
*''Main objectives:'' to learn about the AMBIT framework; to learn about working with your team and the technique of 'thinking together'.
*''Sections in the manual.''
**[[AMBIT: an overview]] and the [[Core Features of AMBIT]]
**[[Working with your TEAM]]
''__Day 3:__''
*''Main objectives:'' to learn knowledge and skills about applying mentalization to working with young people; to learn knowledge and skills about applying mentalizing to working with networks.
*''Sections of the manual.''
**[[Working with your CLIENT]]
** [[Working with your NETWORKS]]
''__Day 4:__''
*''Main objectives:'' to learn about methods of learning in AMBIT and the use of manualizing; to plan and practice a training session with your own team.
*''Sections in the manual.''
**[[LEARNING at work]]
''__Day 5:__''
*''Main objectives:'' to produce a short film about your training experience; to apply ideas of implementation to local contexts; to explore ways of using the community of practice; to make an training and implementation plan.
*''Sections in the manual.''
**[[Respect local practice and expertise]]
**[[Implementation Science]]
**[[Community of Practice]]
!!''Post-training local trainings sessions''
* Ongoing local training sessions, supported by buddy [[ALF]]s
** 1. [[Local Session 01: What is AMBIT?]]
** 2. [[Local Session 02: What is AMBIT training for?]]
** 3. [[Local Session 03: Mentalization]]
** 4. [[Local Session 04: Working with your Team]]
** 5. [[Local Session 05: Working with your Networks]]
** 6. [[Local Session 06: Working with your Client pt. 1 (Mentalizing stance)]]
** 7.[ [[Local Session 08: Review (1) and Auditing Team Practices]]
** 9. [[Local Session 09: Working with your Client pt.3 (Outcomes)]]
** 10. [[Local Session 10: Review (2) and Top-up plans]]
** 11. [[Local Session 11: Making a real difference - Implementation Science]]
* ''Monthly Remote Supervision''
** a. Remote supervision with a named AMBIT trainer to support training, implementation, and practice
** b. Monthly 30 minute telephone supervision sessions using our teleconferencing system
** c. Once a quarter the monthly telephone supervision will be replaced by an hour-long webinar using our web-conferencing system. You can dial in to this on the telephone if you are not able to access the web conferencing platform.
!!''Assessment and accreditation''
* TTT-Post Training Assessment
** Assessment of team competence in AMBIT knowledge and skills is carried out by the team:
*** i. Creating a film of AMBIT practice.
*** ii. Having a one year [[Implementation Plan]] which should include [[planned in-house trainings|Planning a training event in your team]]
*** iii. The team is able to demonstrate adaptation of AMBIT to local practice:
**** creating a series of pages in the manual.
**** presenting a series of APrAT audits
**** self assessing AMBIT competencies using the [[AMBIT Full Competency Framework]].
!!''One year Review and Consultation''
* TTT-One Year Review and Consultation Meeting - this will be developed as the first training progresses so as to adapt to the needs of the pilot group
** At the AFC?
** Locally?
** Who to attend? Whole teams? Implementation teams? Needs clarification over the course of the pilot project.
The [[AMBIT Lead peer-to-peer system]] is intended to support this model; whereby [[AMBIT Local Facilitators]] from different local teams are paired together - so that they can attend each others’ ‘in house’ trainings (preferably on a //quid pro quo// basis to reduce costs to local teams), helping to train neighbouring/other teams as well as their own, and in so doing offering a supportive outside perspective.
IPT works primarily by considering the interplay between interpersonal difficulties and psychological problems, especially depression.
Depression often causes disruptions or difficulties in a person’s relationships, for example someone may stop seeing friends or withdraw from family relationships because they feel low. Occasionally, difficulties in a person’s relationships can both cause and maintain depression. IPT addresses both the depressive symptoms and the specific issues in the person’s relationships which are impacting on their mood.
IPT is carried out over 6 sessions. The initial phase of 2 sessions will focus on assessing the depression and interpersonal context, considering social support and looking at general management of depressive symptoms. The middle phase focuses on the focal area chosen; transition after a change (loss)/complicated bereavement/conflict with someone/struggles in relationships (generalised) and/or isolation. This middle phase may include unpicking relationship difficulties and finding a way forward or processing a transition and being able to find a way past this. At the end of therapy, time will be spent on experiencing a positive end to the therapeutic relationship, reinforcing change made and planning how to maintain this progress independently.
<center>{{AssessmentPhaseOverview.PNG}}</center>
We have included in this manual an IPT Session by Session Guide:
* [[IPT Session 1 (45 mins)]]
* [[IPT Session 2 (30 mins)]]
* [[IPT Sessions 3-5 (Middle Phase - 30 mins)]]
* [[IPT Ending Session 6 (30 mins)]]
!!!Improving lives not just saying no to substances: Evaluating outcomes for a young people’s substance use team trained in the AMBIT approach
Peter Fuggle1 , Laura Talbot1, James Wheeler1,
Jessica Rees1, Emily Ventre1, Verity Beehan2,
Suzanne Hare2, Dickon Bevington1 and
Liz Cracknell1
Clinical Child Psychology and Psychiatry 1–15 2021
DOI: 10.1177/1359104521994875
This paper provides detailed information about AIM scores. The full article cant be included in the manual for copyright reasons but the abstract is shown below.
!!Abstract
Adaptive Mentalization Based Integrative Therapy (AMBIT) is a systemic, mentalization based intervention designed for young people with multiple problems including mental health problems. The purpose of this paper is to examine the impact of this approach both on clinical and functional outcomes for young people seen by a specialist young people’s substance use service between 2015 and 2018. About 499 cases were seen by the service during this period.
Substance use outcomes were obtained for 383 cases using the Treatment Outcome Profile (TOP). Cannabis and alcohol use were the key substance use problems for 81% and 63% respectively. Functional outcomes using the AMBIT Integrative Measure (AIM) were obtained for 100 cases covering domains of daily living, socio-economic context, peer relationships and mental health. At
treatment end, cannabis use reduced significantly (t = 10.78; df = 311; p = .00; Cohen’s d ES.61 as did alcohol use (t = 6.938; df = 242; p = .000; ES 0.44).
Functional improvements were shown in five out of seven domains with highly significant total functional improvements on key problems selected by the client (t = 14.01; df = 99; p = .000; ES1.34). Measuring functional as well as clinical
outcomes appears to reflect more accurately the overall benefit of the service to clients.
Total domain scores at baseline are found in a separate page [[AIM baseline scores from CASUS study]]
In keeping with one of the [[Core Features of AMBIT]] (specifically, [[Respect local practice and expertise]]), the [[AMBIT]] worker always avoids making assumptions - especially negative assumptions - about the motivations, capacities, and intentions of other agencies and professionals.
It is easy to be drawn into very negative positions as regards these institutions and individuals, either in casual conversation with colleagues, or, worse, with the young person or family:
>//"Social Workers are always doing this...!"//
>//"Typical doctor...!"//
It is important to remember that many of the young people that an [[AMBIT]] service works with will have experience of relationship breakdown, hostility or domestic violence between the people that would ideally be working together in support of them.
It is easy for the professionals arrayed around a young person to be drawn into replicating this experience, through some of the Dis-integrativeProcesses that in turn fuel Dis-integratedInterventions.
!Biased feedback
There are ''powerful biases'' at work, insofar as we tend to remember the one //bad// outcome, rather than the many interactions that went smoothly. Also, one of the ways that young people or family members may seek to "join" with a new professional, or team, is to //criticise// the team that has referred them - so that workers in one team will often receive negative appraisals of other teams, but may overlook the possibility that similarly negative things are said about them, too!
!Using each other
In keeping with our [[SupervisoryStructures]], team members should be ready to use address with each other, in order to question, and help each other towards a more [[Integrative]] understanding of the ProfessionalNetworkMembers.
Rather than be surprised or disappointed by discovering such Dis-integrativeProcesses at work, the [[AMBIT]] worker assumes that these processes ALWAYS occur in a complex care network, and in keeping with one of the [[Core Features of AMBIT]] ([[Taking Responsibility for integration]]) s/he makes the development of a proper understanding of the different roles and responsibilities shared by the ProfessionalNetworkMembers part of everyday practice.
Using the [[How to speak to a...]] advice, and SupervisoryStructures, together with tools such as the [[Dis-integration grid]], the [[Key Worker]] will develop a [[Mentalization]]-based understanding of the positions of individual components of the care network.
!!!Working on working together. A systematic review on how healthcare professionals contribute to interprofessional collaboration
Evert Schot, Lars Tummers & Mirko Noordegraaf
Journal of Interprofessional Care, Pages 332-342
Received 02 Apr 2018, Accepted 21 Jun 2019, Published online: 22 Jul 2019
''Summary''
Literature review of interprofessional collaboration based on 64 studies. Identified three areas of activity that emerged from the review.
# ''Bridging gaps''.
##Professional perspective gaps
##Social (interpersonal?) gaps - people just don’t know each other sufficiently
##Communication gaps – caused by geographical fragmentation
##Task gaps – professionals needing to do things outside their role
#''Negotiating overlaps''
##Roles and responsibilities – general
##Overlaps in individual case work -
#''Creating spaces''
##With external managers – network spaces
##Creating organisational arrangements for collaboration – team spaces
In the section on looking at differences between professions and team, they rather helpfully divide things up between teams and networks. Of note was that negotiating overlaps was a particular issue in primary and community care.
''Comment ''
It represents a useful perspective for us. We could use this framework quite helpfully. The themes they identify seem to come up frequently in AMBIT training. It doesn’t say anything about what we do with these gaps. It doesn’t include key concepts of power, diversity and trust.
!Purpose
Map out a very rough sketch of what work should happen, and when, for typical cases in your OWN local service. This is an important part of a team's own efforts at [[Manualization]].
!What is it?
*There are [[Phases of AMBIT work]], but ''we understand that progress through stages is neither predictable nor necessarily sequential'' (see [[Where are we in the therapeutic journey?]]).
*Nonetheless, in order for teams to be able to [[broadcast their intentions|Broadcasting Intentions]] and offer [[Active Planning]] to structure their work for clients (and to explain it to commissioners!) we would expect local teams to define the times they //expect// to spend on these phases.
*In general workers should start to plan for [[ENDING PHASE]] or a longer term [[MAINTENANCE PHASE]] ''__from the beginning of assessment...__'' - this is in keeping with [[Scaffolding existing relationships]], one of the [[Core Features of AMBIT]].
!Timings:
*[[Engagement]], and the [[Multi-Domain Assessment]] are expected to take:
>''@@color(blue):|RECORD TIMINGS HERE|@@''
*[[Crisis Contingency Planning]] should take place and be recorded within:
>''@@color(blue):|RECORD TIMINGS HERE|@@''
*The [[INTERVENTION PHASE]] should last for:
>''@@color(blue):|RECORD TIMINGS HERE|@@''
*[[Relapse prevention]] interventions (if appropriate) should be sustained for:
>''@@color(blue):|RECORD TIMINGS HERE|@@''
*Decisions and [[Active Planning]] for the [[ENDING PHASE]] or a [[MAINTENANCE PHASE]] must be made by:
>''@@color(blue):|RECORD TIMINGS HERE|@@''
*The [[ENDING PHASE]] should take place over a period of:
>''@@color(blue):|RECORD TIMINGS (in weeks) HERE|@@''
and should be completed within:
>''@@color(blue):|RECORD TIMINGS (in weeks/months) HERE|@@'' from the beginning of treatment.
!Useful Links:
WhichInterventionWhen
[[Phases of AMBIT work]]
[[Level of intensity]]
!Interventions (by target group)
* Are listed here: <<tag [[Interventions (by target group)]]>>
!Specific Interventions
* <<tag [[Specific interventions]]>> - this topic heading gathers all the separate interventions that are in this manual (from mentalization-based approaches to individual and family work, through cognitive-behavioural interventions, to work in the social ecology and simple advice-giving... and more.)
*Remember that one of the [[Core Features of AMBIT]] is that we focus on [[Working in multiple domains]], rather than working in one domain alone.
!Interventions, by domain
Here we gather the interventions according to which of the different [[Domains]] they can be applied in:
*[[Working with Crises, Planning and Prevention]]
*[[Working with the Family/Carers]]
*[[Working with the Individual]]
*[[Working with other professionals]]
*[[Working with the Social Ecology]]
*[[Giving Advice]]
The way the worker introduces [[Family Work]] will depend very much on the family's individual needs and style.
There are many ways in which to explain the MBT-F approach, and the therapist will need to use her judgement to determine where to "pitch" this. Some families appreciate a brief explanation of the theory, and for some explicit PsychoEducation about [[Mentalization]] is helpful. For others something more general ist the enough, and explanation of the method is better given alongside "real-time" examples:
>//"Did you notice that I interrupted you just then? I am sorry, I didn't mean to be rude, and in fact this is one of the things you will notice about how I work... If I don't understand something clearly I am afraid I will tend to ask people to stop and help me get things clearer in my mind - because it is hard to ''really'' understand people, especially when feelings are running high..."//
Some will respond best to a simple explanation based on the fact that:
>//"...making sense of each others' thoughts and feelings helps us to be more useful to each other, and reduces the likelihood that we will upset each other. When we are upset we generally find it much harder to 'tune in' to each other and make sense of why we are behaving in the ways we are..."//
Others may want a more detailed explanation of what we are trying to do in this work.
>//“The family work we do here is there to help you with the problems and issues that have brought you here. We have found that when families come here, they have often been living with quite a bit of stress. When you are under stress, it can be hard to think clearly about what one should or should not do. We find that when there is a lot of pressure that some families shut down their thoughts and feelings and that they get involved in mindless or automatic routines..."//
>//"...Sometimes the feelings are so overwhelming that there is no place for thinking. This work aims to get thoughts and feelings back on-line. Sometimes we will all need to pause to see whether we have got the right perspective on things, to understand where people are coming from or what is going on in other people. This is what we try to help families with.”//
This may extend into PsychoEducation (this link gathers material that illustrates more explicitly the psychoeducational aspects of our work) - On occasions it is helpful to be very explicit about the goal of //increasing and strengthening mentalizing// in the family (see material on [[Broadcasting Intentions]] under the topic of [[Active Planning]]), and the checklists under [[Features of Successful Mentalizing]] can be helpful in explaining this.
Some families might choose to pin "family-friendly" versions of these lists on their fridge, so as to increase their awareness of, and ability to spot positive mentalizing.
The therapist should promote the notion of the [[Therapeutic Bargain]], recognising that in some senses the family is having risk giving things up in the hope of other gains.
!Some examples:
<html><object width="425" height="344"><param name="movie" value="https://youtube.com/v/UPcUNSevPm0&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/UPcUNSevPm0&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
With some young people the idea of individual meetings with the keyworker may be welcome at the first meeting. In many families the degree of disorganisation, family entanglement, suspicion or other factors may mean that the idea needs to be introduced carefully when the treatment plan is formed. In some families a period of family work may be needed before there is enough sense of separation between family members for individual work with the YP to be seen as permissible. In some families the YP may be too incapacitated to be able to take responsibility for attending individual meetings. In these cases a plan may be made with the family for a family member or other resource person to bring the YP to the KW's office or to travel with him in order to help him attend.
In exploring the idea of individual work with the YP and the family, the KW needs to set out clearly the suggested aims and parameters and then to explore the meaning of these for family members. It may be that further aims will be set for a given YP if this emerges from discussion with him. Even when the KW feels he has a mandate for individual therapy from both the YP and the family, the feelings of both (family and YP) about the YP having separate and mainly confidential space to explore his concerns will in many cases need continued attention.
Although the KW, in this as in all other aspects of the intervention, will take as collaborative a stance as possible with the YP and the family, there may be some families and some YP's where an attitude of low key but confident authority may be very reassuring and helpful in setting up individual work. For example, it may be more helpful for the KW to say to a highly anxious YP (having previously negotiated with the family) something along the lines of: ' I know you're very worried about coming here but I'd like you to come and see me for 20 minutes on Tuesday and your mum had agreed to help you with the journey' than to offer something more vague and optional. The stance to be taken will need careful judgment from the KW in consultation with the team. It may be necessary to set up appointments one at a time initially before a weekly routine can be established. As a principle the YP will be given choice where possible, even if only whether he would prefer Tuesday or Thursday.
!!!When the idea of therapy is aversive:
Individual therapy sessions may evoke significant and immediate negative cognitions for a young person. Part of this may be related to unrealistic or irrational beliefs about what the therapy sessions may involve. Although, for many adults, the idea of ‘talking things over’ may seem a normal way of dealing with stress and difficulties, these meanings may be less frequent with young people. Talking with a therapist may evoke feelings of exposure and lack of safety and/or beliefs about the process being boring and irrelevant.
Some of these beliefs and feelings may be directly related to the wider problems that the young person is experiencing and cannot be avoided. However, providing the young person with clearly stated expectations and ‘rules’ about the therapy from the beginning and modeling negotiation about these can be helpful in enabling the young person to feel a greater sense of control and safety during the initial phase of therapy.
A number of specific techniques may be helpful here. The first of these may be setting up and negotiating some specific rules within the session.
!!!!!1. Giving permission to say no to questions.
In giving some explanation to the young person about what therapy involves it can be helpful to put this in very concrete terms. For example, because the therapist is interested in how the young person is feeling, this will often involve asking questions. Questioning is what therapists do, however sensitively and subtly. However, inevitably, sometimes the therapist may ask questions that the young person doesn’t like. Often, in the company of authoritative adults, young people have poor skills in dealing with this situation. It is therefore often very helpful to be explicit that if the young person doesn’t like a question or doesn’t want to answer what the therapist is asking, then it would be very helpful if he/she could tell the therapist and that the rule is that the young person does not have to answer questions that they don’t like. Providing explicit control in this way is clearly not without its costs, and in some instances the KW may judge that the YP is likely to abuse the rule to block any contact, in which case it would be best not to set this up. Generally though, in the early stages of therapy, this rule can contribute to establishing respect and safety within the session. Crucially, the first time the young person uses this rule, the therapist must positively support it and use it as an example of the young person conveying what they genuinely think etc.
!!!!!2. Talking and not talking.
For some young people, self referenced ‘talking’ with adults may be associated with humiliating previous experiences of ‘being told off’ or feeling stupid in social situations in which adults have invalidated their capacity to communicate etc. It can be very helpful at an early stage to recognize that talking does not always make people feel better and to start from a position of not knowing what helps a young person to feel better. The purpose of this is to see how this could be adapted and respected within a session.
For example, for some young people, silence is highly aversive, persecutory and ‘weird’. Again, it is helpful if this is discussed explicitly as silences, shifts in rapport, changes in focus, breaks and interruptions in the flow of discourse are inevitable and necessary. Therapists may need time to think etc. However, perhaps in contrast to pure theory, therapists may need to be willing to more actively chat, self disclose and even entertain as part of a explicit strategy of titrating the degree to which sessions are self referenced around the young person. The intention is to enable the young person to tolerate increasing focus on their own mental state but this may need to be developed following some preliminary groundwork. Examples would be an explicit behavioural framework around exposure to avoided anxiety provoking situations, or acknowledgement of the way it feels to be expected to talk. The way it feels may be quite conscious in the YP’s mind (‘Maybe you feel it’s a waste of time talking when nothing that’s upsetting you can be changed/I could not possibly understand what things are like for you’), or may be less conscious but still helpful to suggest as part of clearing the way for sharing what is on the YP’s mind (‘maybe you think if you start trusting me with some of what is going on, it would be hard not to be able to talk together whenever you feel like it – so it would be best not to start’).
!!!!!3. Agenda setting
In mainstream CBT, each session begins with making a plan for the session. This agenda setting is partly a mechanism by which the therapist may negotiate dividing the time between tasks which the therapist sees as linked to the formulation of the young person’s difficulties and those activities preferred by the young person. This structure does not preclude the option of taking a very non-directive stance if this is felt to be appropriate to the needs of the young person but it would make this non-directive stance explicit. For example, the therapist might indicate at the beginning of the session that the best use of the session is mainly going to be around listening to things that the young person wants to talk/ communicate about. Alternatively, agenda setting may be highly directive on the part of the therapist and consist of allocating specific amounts of time to different tasks/activities. Although such agenda setting should be responsive to the wishes, ideas of the young person it is important to avoid becoming simply reactive to the immediate wishes of the young person if this is inconsistent with the wider aims of the therapy.
In a more psychodynamic style of individual work, the agenda is set in advance rather than in every session, although the KW may find it helpful to discuss that agenda more often than would be usual in working with adults, or than would be usual in longer-term, less acute situation. Thus for example the therapist might say early on in a series of meetings ‘what I hope we can do with the time for the next few sessions is give you some private space to talk about what has been making you feel you should kill yourself. I know that might be quite hard and you might not be sure if you can trust me, my part of the deal will be to listen and try to understand things with you as we go along. I might sometimes ask you things to help you explain, but mostly I will let you take your time. I hope you will find that I am on your side and all I am trying to do with these sessions is get to know you better so we can see the best way to help you with what has been going on. I would not do anything about what we talk about unless I have talked to you about that first, for example if you told me that one of your brothers or sisters was in danger I might talk to you about getting one of our team to try to help him/her. But we are here to think about you. You might think some of what you could say would be too weird to talk about with someone you don’t know yet. I have talked with lots of young people about very private and difficult stuff, but everyone is different so I hope you will just find out as we go that it can help. If you feel it is not helping, I hope you can tell me that and we will see how we can make it work better for you. I am not going to be annoyed by you saying things like that. For example, some girls find it hard to talk to a man about what they are feeling and what has happened to them, if you feel that we should be able to talk about it. You might find I can understand more than you think, and that helps.’
!!!!!4. Linking sessions/Remembering
As part of agenda setting, the therapist may wish to recall the content and tasks from the previous session. Over time, the task of linking the aims of the current session with previous sessions and providing a conceptual, psychological and pragmatic thread may become increasingly a collaborative task with both the therapist and young person contributing to this. However, in the initial stages of therapy this task may be carried more by the therapist.
!!!The purpose of this page is to provide a guide for setting up and implementing the AIM measure in a service or team.
This page has been created by the [[AMBIT Study group-|The AMBIT Study Group]] an international collaboration of workers from AMBIT influenced teams
The intention is to set out the steps required in implementing the AIM measure, and to share learning in relation to 'what helps' in addressing these steps (and barriers) in implementation of AIM.
This will form part of the AMBIT CORE content
!!Steps in setting up use of the AIM
!!! (a) Connecting with the management and leadership structures to introduce the AIM and discuss implementation
//Note there is a difference between the team trying out the measure themselves vs the management hierarchy deciding this is something 'we will adopt more widely//
*It is important to begin by mentalizing the relevant management staff....
''//
What would be a helpful way to introduce/explain the AIM? and in relation to this point....//''
//''How could the AIM help with the managers concerns, priorities? What would they (the managers) see as important from this in relation to the AIM?''//
Key points that we may want to emphasise in explaining the AIM
*Sharing with senior management how the AIM identifies different parts/aspects of a young persons' life that other outcome measures do not show. That this is about functional change (not just change in symptoms) and could provide valuable evidence of the work of the service
*Related to the above point we may want to explain how the AIM can pick up changes in a young persons' life that we have not been aware of before or are not easily captured
* We may need to highlight to managers how this measure is not specific to one professional group
*It would be helpful for managers to 'have contact' with the AIM, to see it 'in action'...visually, rather than just being told about it e.g. demonstrating the use of the [[AIM Questionnaire -interactive version|AIM questionnaire - interactive version]]. This may include showing results output using graphs (see [[Scoring AIM data]]) and explaining the areas that we can learn about from gathering client data via the measure
*We may need to emphasise the difference with the AIM and the outcomes measures that we already use
*We may also want to show managers how the AIM has been used in previous studies and that it has formed part of building an evidence base for AMBIT and other studies (e.g. IMPACT depression study UK) please see [[Development and properties of the AIM|The Development and Properties of the AIM]]
*Consider how we explain what might be benefits for clients, workers and what those in management positions may find most useful about evaluating client outcomes(e.g. how could this contribute to evaluation of service objectives and commissioning?)
*Consider what managers would see as possible downsides or barriers
*Consider barriers/concerns about what will happen with data collection including the importance of storing data in a secure way and legal issues around data storage
!!! (b) Introducing the AIM to team members
*Consider how do we introduce AIM to the team in a way that is helpful, collaborative and engages people i.e. first mentalizing the team (how will they experience it?)- These may be leadership decisions/thinking that should happen before we introduce it to the team
*When introducing the AIM, consider how this could support the needs of the service? What could the AIM capture that would be helpful for the workers in the team? What would workers want to learn ? what are our team objectives and will the AIM help us with these?
*Consider who are the people within our team who would actually do the AIM? What might they feel about this?
*It has been helpful to have allocated people within the teams who hold overall responsibility for the AIM implementation. This includes checking that they have been completed and scores entered into the database - Some consideration of who best/how to choose this role is important at this stage
*Training of the team in the AIM- the training the AIM may also need to include the 'what is the relevance of measuring functioning of our clients?' as well as how we use the AIM and how we score it. Therefore training should focus on the 'why' rather than just on 'what we do'. It may be important to recognise that measuring outcomes can have many negative associations e.g. 'it's not my role', 'we might be evaluated negatively' , 'the data will not be used anyway', 'what will it be used for...?'
*Training should use the protocol for [[how to use the AIM|The AIM Questionnaire: What it is and how to use it]], with an emphasis on keeping the administration as simple as possible and completed by the worker at start and end of the work
!!!(c) Integrating the AIM into routine team practice
*Planning when the AIM would be administered at what time gaps should happen before it is started. The end of treatment can be hard to define for some teams who may see young people for long time periods (e.g. over 1 year). Some teams have decided to measure 'time 2' at 6 months or 1 year after start of the work, although wherever possible we recommend that 'Time 2' is measured as the end of contact with the client.
*Planning where the data will be stored, considering security of data storage and how best to manage the data (please see [[Scoring AIM data]]
*It is important for the team to be clear about the purpose that they want to use the AIM for before starting. For example, clarify if the AIM will be used as an outcome measure or as a tool to inform our care plans, or used directly in conversations with young people. Our experience is that it can be very difficult to use the AIM consistently for multiple purposes at the same time. Please see[[ What purpose do you want to use the AIM for|What purpose am I using the AIM for?]]? for more on this
*Teams tell us that staying well connected to the AMBIT team at the Anna Freud Centre to gain support around outcome measurement and use of AIM has been helpful in engaging colleagues and in generating curiosity about outcomes and using the AIM (there are opportunities to connect with the AMBIT team around the AIM use, please contact us to find out more)
*Once the AIM has been started in a service, teams have used shared rating sessions together to practice using the AIM and check we are 'on the same page' and completing it in a similar way
*Teams may need time to plan (and manualize) [[the difference/similarities between the AIM measure and the AIM cards- |What is the difference between the AIM measure and AIM cards]] for example how do they overlap? do we use one or both? if we use both then how do they relate?
!!! (d) Longer term implementation
*This has to involve the team, how do we continue to involve our colleagues and discuss the development of this work in the team? how do we embed it in wider teams? develop curiosity of others around AIM?
*Consider how we use the AIM in relation to the client- do we use this directly in our work with them? if so how? and what is helpful?
*Thinking about how we generate curiosity in the team about results/learning/what can the results tell us about our work and how we might improve/do things differently...?how do we present the results in a way that is engaging? do we get new data? what does this tell us that is different? how does it compare to other measures we have? (is the value more in the direct work/clinical for us? or more in learning about results ?)
*How do we share it with other stakeholders to evaluate outcomes? who do we share with and why?
*How does AIM link to wider evaluation of AMBIT
!!What is here?
Click on this button to list the subtopics under the heading: <<tag Introduction>>
After going through this material, new users should have become familiar with the basic knowledge about AMBIT and how to find their way around this online manual. Click on ''"Using the Manual"'' on the top bar (or select directly from <<tag [[UsingTheManualContents]]>>) to learn about this wiki manual.
*[[Home]] is where to start, it offers a series of different routes into the manual, according to what you want to do, and the AMBIT diagram.
!!About AMBIT
*[[AMBIT: an overview]] is a brief introduction to the approach, what it is and what it is not, and should be read alongside the..
*[[Core Features of AMBIT]] - this gets to more practical details than the [[overview|AMBIT: an overview]], and practitioners will want to refer to this (or the summary [[AMBIT Wheel]]) regularly, as a reminder.
*[[Phases of AMBIT work]] offers some idea of the kind of timeline that a case might follow.
*[[Glossary]] - does what it says
*the [[AMBIT Manual Library of Pages]] - lists out all the tiddlers/pages in the manual
!!About the manual
*[[User Guide]]- explains how to interact with the manual, to get the best out of it, and has links to technical help.
* [[Disclaimers, Security and Authorization (Licensing)]] - addresses the necessary disclaimers regarding use of the information and resources in this wiki, as well as the licensing arrangements that allow for the free sharing of the content of this manual, and the important security considerations if you use your own local versions of this manual as 'workbooks' for the [[Manualization]] of practice learning and development
*[[Sponsors]] acknowledges the people and organisations that we have been helped by.
*[[Authors]] acknowledges the authors of the core content of the manual (NOTE, local teams can (and should) add their own material to their versions.)
*[[Videos]] lists the various topics that include streaming video clips - these will continue to be added to.
*[[Feedback please!]] - asks for feedback, without which this manual cannot improve. Please spare some time to do this.
<a class="tc-float-right">[img width= 300 [whyamihere.gif]]</a>This introductory exercise is an opportunity to practice going in and out of a breakout room. We have paired you up randomly with a colleague.
If you have any problems just send the trainers a message using the chat function in zoom and they will help you out.
!!{{$:/images/fa5/solid/comments}} Who are you and why are you here
Spend 2-3 minutes each, saying:
#Who you are and what you do - even if you know each other quite well already
#Why you think you are here on this training today - be honest, there's no wrong answer
!!Listening
When you are listening to your colleague your job is to understand as much as you can and think about how you would explain to the wider group why this person is here.
<html><style>
.noborder{
border: none;
}
.noborder tr td{
border: none;
}
</style></html>
|noborder|k
|[img [hello.jpg]]|^{{$:/images/fa5/solid/comments}} Introduce your partner to the wider group - particularly try to explain why they are here today (this could be one of thousands of reasons from "because my boss told me to" to "because I live and breathe mentalization-based practice...“) |
----
The AMBIT Project needs to develop a group of young people who have been recipients of AMBIT trained teams in order to contribute to the establishment of a shared outcomes approach for AMBIT teams.
!!''No, thinking together is not a replacement for supervision''
Teams trained in the AMBIT approach will have existing supervision arrangements. Usually, supervision refers to planned meetings at agreed frequencies between a team member and their supervisor. For some teams this may be included in meetings with their manager. Some teams will have frequent supervision and some less so.
AMBIT does not have a set formula for how supervision is provided. As a general principle, it is supportive of supervision in that this is likely to reduce a worker's sense of isolation and should contribute to enabling mentalizing as part of routine practice. ''So, firstly, the practice of 'thinking together' is not a replacement for existing supervision.''
!!''But, yes, maybe a method that could be used in supervision''.
However, we would like to think that the practice of 'thinking together' may enhance the process of supervision by making it more productive process between the supervisee and the supervisor. Some supervisors have adopted it as part of their practice and have reported benefits as to how they work together. Also for us we would want to encourage using mentalizing as part of the supervisory process and 'thinking together' is a useful tool for ''explicit mentalizing'' but is not the only way that this can be nurtured.
Also, AMBIT recognises that the need for supervision may not occur when supervision sessions take place and that a more responsive and immediate method of connecting with colleagues about clinical dilemmas may be needed and this is the purpose of 'thinking together' - to provide a way of making best use of informal interactions with colleagues in order to meet the challenges of the work with young people.
.
This is a model of practice around the area of working with safeguarding and child protection, developed by Andrew Turnell and Steve Edwards in Western Australia, and many other practitioners including Prof Eileen Munro from the UK, since the 1990's. It is quite widely applied in many areas. We believe that AMBIT can augment and complement this approach very well. You can visit Signs of Safety's helpful website [[here|http://www.signsofsafety.net/signs-of-safety/]]
For a locality that adopts it, a lot of investment is required to make sure that 'Signs of Safety' becomes embedded and that local services become "enculturated" in its language and procedures; this is rather similar to the adoption of AMBIT.
!!Mix and match?
An appropriate question, therefore, is whether the adoption of AMBIT in a context where Signs of Safety //is already running// risks introducing something that could be diluting, or contradicting, of this approach? We do not think this is the case. In fact, at the heart of AMBIT is an explicit sensitivity to avoid such harms - we do take seriously the potential for trainings (like treatments) to have negative side effects so that, the introduction of new ideas or practices may leave a front line worker less confident about how to deal with a particular issue than was the case before the training, or that the training has created an additional confusion about how the new way of working links to wider existing systems. These are clearly unintentional effects of training and hopefully not the main experience but the AMBIT approach takes these possible effects seriously.
In the relationship between Signs of Safety and AMBIT we think this can be avoided for two main reasons.
#Firstly, AMBIT explicitly sets out to address the Tower of Babel effect described in the first paragraph of the Signs of Safety manual. This states that '''//one of the biggest problems that bedevils child protection work, identified in many child death inquiries, is the Tower of Babel problem, where everyone is speaking a different language (Munro, 2002, Reder, Duncan and Gray 1993)//'''. It is noteworthy that the Tower of Babel effect is highlighted in the first session of all basic AMBIT training and that this problem is addressed through the core AMBIT stance ([[Core Features of AMBIT]]) which clearly advocates workers (and AMBIT itself) should [[Respect local practice and expertise]].
#Secondly, we believe that the relationship between Signs of Safety and AMBIT is likely to be productive and positive as there are a number of core ideas shared by both models, particularly that both approaches emphasise the importance of relationships, the value of team relationships to support learning and the need for network coherence. The following paragraphs illustrate these two themes more fully.
In relation to the case of ''Signs of Safety'', AMBIT addresses a rather wider scope (see [[Core Features of AMBIT]]) which extends beyond the focus on safeguarding, and is designed so as to allow and actively // encourage and support// the local use of an existing model such as this; if Signs of Safety is running successfully in an area, then AMBIT should work at [[Scaffolding existing relationships]] and emphasise that in all areas relating to the principle of [[Managing Risk]] the existing Signs of Safety protocols are the ones to follow. In such a case, a local service might choose to [[manualize|Manualization]] it's local understandings of practice in this area, replacing or adding to the relevant sections on [[Managing Risk]] that you will find in the core content of AMBIT that all teams start with.
If it ain't broke, don't fix it.
The text below is taken from the [[Signs of Safety Child Protection Practice Framework (2011)]] and we have added some [[Links]] to key elements of material in AMBIT that directly speaks to the same concerns. If you hover your cursor over the links we have added, you will see the title of the page that we have linked (without necessarily having to click on it!) It is reassuring that two models of practice that both emphasise the need to build models from the practice of real teams doing the actual work, actually end up suggesting very similar approaches.
!!Three core principles of Signs of Safety
Child protection practice and culture tends toward paternalism. This occurs whenever the professional [[adopts the position that they know what is wrong|Psychic equivalence]] in the lives of client families and [[they know what the solutions are to those problems|Teleological thinking]].
A culture of paternalism can be seen as the ‘default’ setting of child protection practice. This is a culture that both further disenfranchises the families that child protection organisations work with and exhausts the front-line professionals that staff them.
Signs of Safety seeks to create a more constructive culture of [[Addressing Dis-integration|Addressing Dis-integration]] around child protection organisation and practice. Central to this is the use of specific practice tools and processes where professionals and family members can engage with each other in partnership to address situations of child abuse and maltreatment. Three principles underpin Signs of Safety:
!!!3.1 Working relationships
Constructive [[working relationships between professionals and family members|Working with your CLIENT]], and [[between professionals themselves|Working with your NETWORKS]], are the heart and soul of effective practice in situations where children suffer abuse.
A significant body of thinking and research suggests that best outcomes for vulnerable children arise when constructive relationships exist in both these arenas (Cashmore 2002; Department of Health 1995; ~MacKinnon 1998; Reder et al. 1993; Trotter 2002 and 2006; Walsh 1998). Research with parents and children who have been through the child protection system assert the same finding (Butler & Williamson 1994; Cashmore 2002; Gilligan 2000; Farmer & Owen 1995; Farmer and Pollock 1998; ~McCullum 1995; ~MacKinnon 1998; Teoh et al. 2004; Thoburn, Lewis & Shemmings 1995; Westcott 1995; Westcott & Davies 1996). It only takes a few moments reflection to grasp the truth of the assertion that [[relationships are the bedrock of human change and growth|Mentalization]] but this reality [[makes many very nervous|SupervisoryStructures]] in the fraught domain of child protection.
The concern is that when a professional [[builds a positive relationship with abusive parents|Scaffolding existing relationships]] that professional will then begin to [[overlook or minimise the seriousness of the abuse|Managing Risk]].
The literature describes such relationships as ‘naive’ (Dingwall, 1983) or ‘dangerous’ (Dale et. al. 1986; Calder 2008). While concerns about a relationship-focus in child protection practice usually centre on working with parents, [[relationships between professionals themselves can be equally, if not more problematic|Addressing Dis-integration]]. Child death inquiries consistently describe scenarios where professional relationships and communication are dysfunctional. Meta-analyses of child death inquiries such as Department of Health (2002); Munro (1996 and 1998); Hill (1990); Reder, Duncan & Grey (1993) would suggest that poorly functioning professional relationships of this sort are as concerning as any situation in which a worker overlooks or minimises abusive behaviour in an endeavour to maintain a relationship with a parent.
Any approach to child protection practice that seeks to locate working relationships at the heart of the business needs to do so through a critical examination of what constructive child protection relationships actually look like. Too often, proponents of relationship-grounded, child protection practice have articulated visions of partnership with families and collaboration amongst professionals that are overly simplistic. To be meaningful, it is crucial that descriptions of child protection working relationships closely [[reflect the typically messy lived experience|AMBIT Wheel]] of the workers, parents, children and other professionals who are [[doing the difficult business of relating to each other|Addressing Dis-integration]] in contested child protection contexts.
!!!3.2 Munro’s maxim: thinking critically, fostering a stance of inquiry
In the contested and anxious environment of child protection casework the paternalistic impulse to establish the truth of any given situation is a constant. As Baistow and colleagues suggest:
//Whether or not we think there are [[absolute|Psychic equivalence]] perpetrators and absolute victims in child abuse cases, and whether or not we believe in a single uncontaminated ‘truth’ about ‘what happened’, powerful forces pull us towards enacting a script, which offers us these parts and these endings// (Baistow et.al. 1995: vi).
The difficulty is that as soon as professionals decide they know the truth about a given situation this begins to fracture working relationships with other professionals and family members, [[all of whom very likely hold different positions|Dis-integration grid]]. More than this the professional [[ceases to think critically|Pre-mentalistic stances]] and tends to exclude or reinterpret any additional information that doesn’t conform to their original position (English 1996).
Eileen Munro, who is internationally recognized for her work in researching typical errors of practice and reasoning in child protection (Munro 1996: 1998), states:
//The single most important factor in minimizing error (in child protection practice) is [[to admit that you may be wrong|Mentalization]]// (Munro 2002: 141).
Restraining an individual’s natural urge to be definitive and to colonise one particular view of the truth is the constant challenge of the practice leader in the child protection field. Enacting Munro’s maxim requires that all processes that support and inform practice, [[foster a questioning approach or a spirit of inquiry|The Inquisitive Stance]] as the core professional stance of the child protection practitioner.
!!!3.3 Landing grand aspirations in everyday practice
Just about everybody, from taxi drivers to parliamentarians want to tell the child protection worker how to do their job. The problem is most of these people have never knocked on a door to deliver a child abuse allegation to a parent and most of the advice comes off like //‘voices from twenty seven thousand feet’//
In an exact parallel to the all-knowing way a paternalistic frontline practitioner approaches a family, supervisors, academics and head office managers have a tendency to try and impose their views on the front-line practice practitioner. At all levels this is ‘command and control social work’ and it rarely delivers a constructive outcome. [[This command and control approach alienates those at the front-line|Respect local practice and expertise]] and erases the notion and expression of their wisdom and knowledge.
Seeking to antidote this problem, Signs of Safety has been developed hand-in-hand with practitioners, first in Western Australia and then in USA, Canada, United Kingdom, Sweden, Denmark, The Netherlands, New Zealand, Finland and Japan. [[In every location the approach has developed more rigour, more skillfulness and greater depth of thinking by finding and documenting practitioner and client descriptions of what on-the-ground good practice with complex and challenging cases looks like|Community of Practice]] is a key to [[learning|LEARNING at work]].
So, for both models, there is a strong commitment that improvements in practice and outcomes will occur if we can systematically capture the learning that arises from the lived experience of front line workers and families. In AMBIT, this is embraced in the process of web based manualizing of good practice based on team reflection and experience. We see this as entirely consistent with the Signs of Safety programme of supporting on-going development of thinking through clear descriptions of local practice. At the core, both approaches advocate for continuing improvement rather that model compliance as the basis for supporting good practice.
Many services and agencies work to provide [[Trauma informed care]]. The exact specification of the standards and values that this may involve will differ across different agencies although they will share the aim of improving care by reducing the risk of [[Re-traumatization]].
Services often provide training for staff on the nature of trauma and on the necessity of providing care which avoids unplanned triggering of past traumas. For example, the NHS-E for Scotland has developed guidance called ''Trauma Informed Justice: A Knowledge and Skills Framework for working with victims and witnesses. (2023)''.
Trauma informed care involves paying sensitive attention to the process of help seeking and help receiving for clients with histories of trauma. These principles and processes are entirely in line with AMBIT for the following reasons.
#Trauma Informed care recognizes that the often adverse experiences of children and young people shapes the way that they relate to parents, carer's, teachers and other adults. This is fundamentally a developmental rather than diagnostic approach to trauma which is entirely consistent with AMBIT's transdiagnostic approach.
#Trauma informed care recognises that traumatic experiences take place in the context of attachment relationships. It is likely that problems in emotional regulation associated with trauma are also related to the quality of the attachment relationships. Put more simply, adverse childhood experiences impacted on key relational processes relating to seeking and giving help. AMBIT emphasizes that there is a need to attend to the helping process at least as much as to the identified problem itself (e.g. not going to school)
#As with Trauma Informed Care, AMBIT places a high priority to the creation of safety in the helping process. This is done by recognizing that the offer of help made by services may represent a threat to the client and may stimulate feelings of hostility and distrust in them. AMBIT uses a mentalizing approach as a way of developing trusting relationships with workers and parents/carers.
#AMBIT gives high priority to supporting the mentalizing capacity of staff in recognising their own state of mind and those of their clients. In AMBIT this is achieved by emphasising the importance of team relationships in supporting the mentalizing in individual team members. Most trauma informed services aim to apply values around emotional support to both clients and workers. In this way, team related aspects of AMBIT are completely in line with Trauma informed care.
#Using a mentalization based approach AMBIT suggests that individual clients need to engage in working out what type of help that they feel they need (if any) rather than applying a standard approach to trauma for all clients. This approach is entirely consistent with principles of collaboration, choice and empowerment advocated in the Trauma Informed services.
!!Examples of integrating AMBIT and TIC
AMBIT encourages local adaption of its model to the local context, including the context of existing local commitments to types of care including TIC.
For example, in Humber, UK, an explicit integration of AMBIT with the ARC framework was developed as described below.
External training in The Attachment Self-Regulatory Competency (ARC) Approach (Kinniburgh and Blaustein, 2005) has been delivered to the whole staff team over two days. ARC provides a framework to guide and inform treatment choices while recognising the need for individually tailored intervention (as described above). The staff team have received additional training in Adaptive Mentalization Based Integrative Therapy (AMBIT) and Compassion Focussed Staff Support (CFSS) which fit with a neurobiological understanding of distress as per the ARC framework. AMBIT is a whole-team approach designed for services who work with clients presenting with multiple and complex problems, including mental health difficulties. It is based around the core theory and practices of Mentalization and supports teams to apply mentalisation in face-to-face work with clients, between team members, and
across networks. A fuller description of the integration of these approaches to support Trauma Informed Care can be found using this link.
https://implementingthrive.org/wp-content/uploads/2019/10/Surviving-to-Thriving-Developing-a-Clinical-Model-at-Humber-Inspire-CAMHS-Inpatient-Service.pdf
!!Conclusion
AMBIT is not separate or a different approach to trauma informed care. It is entirely consistent with this framework and can easily support staff in finding practical effective ways of applying trauma informed principles of practice into direct case work and multi-disciplinary ways of supporting clients and their families.
!!Introduction
The aim is to link this page directly to the [[Academic references]] that are also provided, so as to chart the areas where AMBIT is, and is not, evidence based.
!!What does "evidence-based" mean?
* [[Evidence]] can mean different things to different people.
* A ''Court'', or member of the ''Police'' will understand "Evidence" to mean either a person's testimony (//"she gave evidence that..."//) or, in the case of "forensic evidence", something more scientifically validated and (implicitly) more likely to trusted than a mere opinion or assertion.
* A //scientist's// understanding of evidence would be that it is a model of reality that has not yet been disproved, and which has a high statistical probability of being true.
* However, evidence that something is true in one setting, with one population, is no guarantee that the same will be true in a different setting, with a different population.
* In the world of mental health research, there has been much written about the nature, and the strength of the "evidence" for various assertions (see [[here|Fonagy, Cottrell, Phillips, Bevington, Glaser and Allison (2014) What Works for Whom]]) and we are not repeating this - however, it is important that the phrase "evidence-based" does not become a means of shutting down debate. There is a helpful lecture by Peter Fonagy that you can listen to about this [[here|Evidence]].
!!Is AMBIT evidenced based?
This is a very key question as the need for evidenced based practice is a key principle of the AMBIT approach (see [[Respect for Evidence]]).
the most recent summary of the evidence base for AMBIT is [[Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach]]
This page of the manual outlines a number of key questions for the AMBIT approach and provide some brief starting points as to how each question needs to be addressed. Each question will then have a separate page in the manual building a range of theory and evidence with links to other parts of the manual. We would welcome contributions to this part of the manual from local teams.
Not all of AMBIT (because there isn't a single "thing" called AMBIT, amongst other reasons) is "Evidence-based" but we encourage all AMBIT-influenced teams always to be at least ''"Evidence-oriented"''.
!!!''Is the basic mechanism of the AMBIT approach, namely mentalization, supported by developmental science?''
Yes. Mentalization has a substantial theoretical and empirical base with extensive studies of the association of mentalization to attachment theory and to parent-child interaction studies. This may seem unremarkable but it is not always the case that key therapeutic concepts are grounded in developmental science. For example, the idea of a 'core belief' in CBT arises from adult theory of CBT in which the developmental basis of such types of cognition remains unknown.
!!!''Can a mentalization based intervention be appropriately applied to working with hard to reach youth?''
Yes. Mentalization based interventions have been shown to be effective for adults with borderline personality disorder and there are similarities between the types of presenting problems (impulsivity, self harm, poor affect regulation) of this group with adolescents seen by teams using the AMBIT approach. More significantly, a recent RCT trial of ~Mentalization-Based Treatment for Adolescents (MBT-A) showed that this approach was more effective than treatment as usual.
!!!''Can AMBIT training be effectively delivered to front line teams?''
Yes. The basic AMBIT training has been successfully delivered to over one hundred in the U.K., Ireland, Europe, North America and Australia. Feedback from the training experience is generally extremely positive with high ratings for relevance to work experience and usefulness of ideas to practice. This feedback has been summarised in Feedback on AMBIT Training.
!!!''Are the basic processes of how AMBIT teams work together and how they work with other agencies supported by research on organisational factors associated with effective mental health interventions?''
Yes and No. Many of the principles of good practice advocated by AMBIT are shared with other models. For example, the need to have clear treatment objectives, well measured outcomes and a shared joined up approach with other agencies are not controversial. The difference for AMBIT is that it proposes that these factors have a major impact of overall clinical outcomes. The degree to which such assertions are supported by evidence is equivocal and will be elaborated in further pages in this manual. For example, the evidence that more integrated intervention leads to better outcomes was not supported by the Fort Bragg study in the USA. In this important study, integrated interventions proved to be more expensive but not superior to treatment as usual.
!!!''Is there evidence that training in AMBIT results in changes in practice for a team?''
Yes. Some of the teams who have been trained in AMBIT clearly adopt a number of the components of the model in their work as a team. This is demonstrated by their on-going feedback to the AMBIT Project and to the types of local evaluations that they carry out.
''__FOLLOW UP SURVEY NOVEMBER 2014__''
In November 2014 [[AMBIT Lead]]s were asked to respond to a three minute AMBIT Follow up survey. The survey aimed to find out which parts of the AMBIT wheel teams are finding helpful, and which AMBIT words and phrases have been adopted by each team (a simple 'proxy indicator' for culture shift across a team, we felt). According to the survey results 87% felt that an outside observer would have observed a small or significant positive change in their team since the training. If your organisation allows you access to Google Drive, then ''you can access results'' [[here|https://drive.google.com/file/d/0B5r13uPE-Ft0eFhRNFI4dnN4NGc/view]].
It is clear that the degree of adoption of the approach varies between teams. In our view, this is part of a need for local adaptation of the model to local client groups and local service ecologies.
!!!''Is there evidence for improved outcomes following the introduction of the AMBIT approach?''
See [[Fuggle, Fairbairn, Fonagy (2023): Outcomes for Adaptive Mentalization Based Integrative Treatment informed care for adolescents using a deployment-based approach]] for the latest summary of evidence, and the page [[Academic references]] lists other studies that report on outcomes.
!!!''Is there evidence that AMBIT trained teams were effective, for example, in meeting commissioning targets etc?''
A number of local evaluations have taken place, nearly always in recently established teams which were set up with clearly specified outcomes targets set by commissioners. Perhaps the first of these was the team in Islington known as AMASS (Adolescent Multi-Agency Support Service) which was set up to work with adolescents in birth families at risk of family breakdown. The explicit objective of t setting up this service was to reduce the number of young people coming into the care system in adolescence. On-going evaluation indicated that 85% of referrals remained with the birth family after the AMASS intervention. A number of other examples of local evaluations by CASUS, Edinburgh, Bexley have shown similar positive results against commissioning intentions, particularly around reducing length and number of hospital admissions.
!!!''Is there any RCT trial data to support the AMBIT model?''
No. One of the problems for AMBIT is that (as we repeat often in [[AMBIT Training]]s) //"There is no such thing as an AMBIT team"// - AMBIT is heterogeneous-by-design as it fosters local adaptation and is built on a model of constant improvement. Because of this it is difficult to establish usefully a definition of "what" is being tested, although there is work on defining measures of AMBIT fidelity (see the APrAT, for instance).
A great deal of work went into preparing a trial in Cambridgeshire Social Services but this was cancelled during the initial assessment phase due to changes in the social care structure and priorities. Although this would be a very useful addition to our understanding of the benefit (or otherwise) of the AMBIT approach, we would also want to emphasize that AMBIT embraces the use of evidence based [[Specific interventions]] within its overall framework. For example, we would advocate that AMBIT teams would adopt CBT approaches to social anxiety, motivational approaches to substance misuse and family approaches to eating disorders. AMBIT could be seen as a platform from which evidence based interventions can be delivered once some of the difficulties around the young people's anxieties about help seeking have been recognised and worked with.
!No... but that's a part of it...
This question is covered well in the following paper [[Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application]].
* Empathy is primarily focussed on the ''other'', rather than the ''self'' (it would be unusual to speak of "my empathy for myself"), and is also more focussed on the [[Affect]] than the [[Cognitions]].
* This is //part// of what is entailed (required for) good mentalizing, but it is not all of it...
* [[Mentalization]] is a purposefully broader concept; it can involve making sense of the behaviours BOTH ''self'' AND of ''others'', in terms of the imagined intentional mental states that are attributed to the 'actor'.
This is an adapted version of a diagram in ~Choi-Kain and Gunderson's paper:
[img[https://lh4.googleusercontent.com/-vosImAYayM0/Ul3ar7GMpOI/AAAAAAAAKYs/2hRciOxW19o/w891-h668-no/Choi-Kain+diagram.jpg]]
Mentalizing has some similarities to reflective thinking in that both are processes in which a person is engaged in trying to make sense of things. However, mentalizing refers to a wider range of internal processes than reflective thinking.
Explicit mentalizing in which a person makes a conscious effort to make sense of his/her state of mind or the state of mind of another person may be the closest to reflective thinking but a great deal of mentalizing goes on implicitly, partly in awareness and partly outside of conscious awareness.
Secondly, mentalizing is the awareness of states of mind and should not be restricted to more narrowly defined cognitive functioning or 'thinking'. For example, to be mentalizing another person is not restricted to being curious about what he/she may be thinking in a conscious way at a particular time point (although it may include this) but is trying to make sense of a person's overall state of mind which is likely to include less conscious aspects of the person's experience. In this way, explicit mentalizing may be considered a process of extending awareness as well as a process of reflective thinking.
Thirdly, the theory of mentalizing gives greater emphasis that mentalizing takes place in the context of relationships i.e. that the capacity to mentalize can be enhanced or diminished by quality of the relationships with others. in adults, these relationships are both real (take place in the external world) and internalized so that a person may imagine how a third person may view one's own or another's state of mind.
The AMBIT approach encourages curiosity about the states of mind of both the worker and the client and aims to adopt a team culture of acceptance and trust in sharing states of mind within a contained team process.
!!No, mentalization based interventions take a different approach to transference than traditional psychoanalytic treatments.
Peter Fonagy has written extensively about this. Mentalization based approaches have arisen out of psychoanalytic and attachment literature and recognise transference as a phenomena that takes place between people in relationships and particularly powerfully in therapeutic relationships. The difference in mentalizing approaches is that, as part of helping a client to understand and make sense of their own mental states, transference would be discussed with the client as part of making sense of mental states. So instead of working in the transference through interpretation mentalization based approaches would tend to try to explore and help the client to recognise unconscious processes such as projection, transference etc as part of understanding their own state of mind as a route to regulating feeling and other likely treatment goals. .
A crisis may be seen as evidence of non-progression in treatment, but if it also involves the young person calling the worker, or the team, or otherwise //signalling// their distress, then this may indicate a shift towards the development of an [[Attachment]] relationship with the worker or team that has more in common with the [[Secure Base]], suggesting the presence of some [[Engagement]]... if this is the case you may be moving out of the [[INITIAL PHASE]] and towards one of the later [[Phases of AMBIT work]].
!Yes - there are differences
A useful paper that covers this is [[Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application]].
Another area of "conceptual overlap" is covered in the question [[Is Mentalizing just Empathy?]] and the same paper covers this.
''Mindfulness'' describes an awareness of one's //own// mind, a "//meta-position//", in which a person both notices and experiences their physical and mental , as both participant and observer. Mindfulness comes from the eastern (mainly Buddhist or Daoist) traditions, although there are western (Christian) counterparts too, and it is practised in many meditation traditions. Among others, Jon ~Kabat-Zinn (wikipedia link [[here|http://en.wikipedia.org/wiki/Jon_Kabat-Zinn]]) is credited with raising awareness of ~Mindfulness-based Stress Reduction as an approach to stress that has also influenced ~Mindfulness-Based Cognitive Behavioural Therapy.
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/3nwwKbM_vJc?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/3nwwKbM_vJc?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!Mentalizing emphasises the //relational//
* Mindfulness stresses the relationship of a person to their ''own mind'', and how this mediates their experience of the world
* [[Mentalization]] is purposefully a more expansive concept - encompassing the "mindfuness of minds [''plural'']" - ie interpreting behaviours by attributing an "intentional mentality" in the actor, be it ''self or other''.
Because of this explicit stress on spanning the minds/intentions of //both self __and__ others//, Mentalization is therefore more explicitly //''relational''// in the ways it is applied in the external world.
!Mentalizing is explicitly linked to (and derived from) neuroscience findings
Mentalizing draws on multiple theoretical "models" - psychodynamics, systems theory, cognitive and social learning theory, etc, but also - and explicitly so - data from functional neuroimaging studies. [[Mentalizing]] involves activation of ''the same neurophysiological (prefrontal) structures'' whether it is applied to self or other, and in that sense makes explicit attempts to accommodate evidence from ~fMRI studies.
[img[https://lh4.googleusercontent.com/-vosImAYayM0/Ul3ar7GMpOI/AAAAAAAAKYs/2hRciOxW19o/w891-h668-no/Choi-Kain+diagram.jpg]]
!Range of trainees
The AMBIT project's experience is of training over 300 teams, with a wide skill and experience mix: approaching several thousand workers, ranging from highly specialised health or social care professionals, through to youthworkers or untrained young people.
!Framework for "Treating Usual Care with Care"
AMBIT is designed as a framework upon which local services of many shapes and sizes, and with many different local therapeutic "flavours", can develop and articulate their own local expertise. It picks up on what the researchers [[Weisz et al|Weisz, Simpson-Gray (2008) Evidence-Based Psychotherapy for Children and Adolescents]] point out is the surprising level of //success// of "usual care" that is often used as a "control condition" ("Treatment as Usual" or TAU) in many randomised controlled trials of manualized treatments...
AMBIT tries to document the most effective components of TAU, to embed these within a single coherent psychological/developmental theory, and to encourage local teams to build upon this and to adopt an evidence-gathering stance to their own outcomes:
>//"Is what we are doing as effective as it could be?"//
>// "How might we improve our outcomes with specific kinds of problem/people/settings/interventions?"//
It is not uncommon for people doing the AMBIT training to comment that they //do 'mentalizing' already//. Our experience of this is that this is often both true and not true.
It is true in the sense that '[[Mentalization]]' is not something that we have invented and is a fundamental aspect of human interaction. So we are sure that people do this already. In that sense we are training fraudsters, training people in what they do already! We plead guilty to this charge.
However, sometimes, people indicate that they consider mentalizing to be the same as 'being supportive' or 'being interested' in someone. Although we believe that mentalizing may be experienced as supportive it is quite easy to be supportive //without// [[Explicit mentalization]]. Rather than go into a lot of theory as to the difference between the two, here are some examples of being supportive without much mentalizing.
*''Offering to make a cup of tea.'' - perhaps the most common act of kindness in English culture! The offer to make a cup of tea conveys concern about the position of another person but may or may not lead to an invitation to explicitly //mentalize// how the other person is feeling. Of course there is a degree of implicit mentalizing of the other person but there may be a delicate interactive dance around whether the person would welcome the opportunity to explicitly mentalise how they are feeling etc. Acting in a supportive way may be all that is required at that moment.
*''The problem is other people.'' Ordinary interactions between people may result in feelings of frustration, anger, annoyance, resentment etc about the behaviour of others. These may be just the usual 'ups and downs' of human interaction that will take place in any team or family. However, these interactions may indicate patterns linked to states of mind. For example, whenever there is a conflict in a team, John always tries to patch up the conflict by some action. Afterwards he feels resentful about always having to be the one who sorts things out. He complains to Sally who is sympathetic to him and listens to him and is 'supportive'. Sally wonders why John always acts the peacemaker but does not invite John to explore this with her. In this interaction, Sally has been supportive, has implicitly mentalized John's state of mind but has not engaged in explicitly mentalizing with John about it. This may be due to a highly tuned sensitivity that this would not be welcome by John (because John believes the problem is other people's behaviour) or because of other constraints (sense of intrusion, time, lack of privacy etc). From this example, we do not wish to convey that explicit mentalizing is preferable or desirable in all contexts (for a family or a team this would be a route to madness!!!) but only that being supportive and explicit mentalizing are different and all teams and families function with both.
!Mentalizing offers CHALLENGE as well as SUPPORT
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/EjdE7W0M5Cs?rel=0" frameborder="0" allowfullscreen></iframe></html>
See also the page on [[Challenging techniques]]
!A bit of theory
There is a good paper [[Choi-Kain, Gunderson (2008) Mentalization: ontogeny, assessment, and application]] that explores the overlapping of concepts like mindfulness, empathy, thought-awareness, affect-awareness, etc, that make up the broader idea of [[Mentalization]].
!Purpose
Local trainers have the task of training their own team in AMBIT following the ‘Train the Trainer’ training they receive in AMBIT, this can be a daunting task and below are some issues that may arise.
!Resources
These Local trainers do receive monthly web-based tele-supervisions from AMBIT Trainers at the [[Anna Freud National Centre for Children and Families]] and so these issues can be discussed in that space. If you are thinking of applying, please look at these possible issues before applying for the Train the Trainer course.
!Common issues
*The obvious one - self consciousness with public speaking in front of your colleagues - especially if you feel you don't know the model that well or you think you should 'know it all'
*Not having, or not believing that you have, the power and credibility within your team to implement changes or new forms of practice (eg Thinking Together)
*Not feeling confident to train senior staff who have more experience than you and who may be cynical of new ideas
*It may feel difficult to create a culture of a learning organisation which really requires 'buy in' from senior management
*Becoming the 'go to' person about AMBIT can put strain on one's time and priorities and prevent others from taking responsibility for implementing AMBIT
*Thinking with your own team about the team's dynamics and current culture can be extremely hard if there are particularly difficult 'personalities' or negative experiences already in the team - these can be the 'elephant in the room'. Local trainers are in the ‘middle of the pond’ so it can also be hard to stand back and get the big picture.
*It can be hard to gather genuine feedback about a training if it's people you work with day to day
*Leading the way in asking for help from colleagues might feel exposing or worrying - especially asking for help from senior staff members
*During training often people can be defensive and can say things like 'we do that already' but it is only with a more critical eye that the limits of the current approach may become clear (eg network integration work). People may be even more defensive with their own colleagues compared to outsiders
*Sometimes the team has to go through a process that starts with uncertainty before the model begins to make sense over the course of the training. This is something that Local Trainers need to be aware of-in order to not be disheartened if trainees are puzzled by the first session, as this is not an indication that the training went wrong
*It may be difficult to suggest changes to practice whilst not making people feel criticised or wary
!Working on solutions
See [[AMBIT Local Trainer: overcoming barriers to effective implementation]]
''__Iterations __''- repetitions that are similar, but inevitably slightly different. In a developmental context, these lead to step-by-step improvements, or growth, or re-modelling.
The synaptic re-organisation of the brain as it matures (particularly through adolescence) is largely driven by the iterations and reiterations of neurological actions (signals repeatedly being sent down the same pathways). Likewise, the development of AMBIT's Dynamic, adaptive [[Manualization]], and of a team's knowledge about //"how to work best, here, with these young people, in this setting..."// is something that develops slowly out of repeated experiences.
<a class="tc-float-right">[img width="150" [JF.PNG]]</a>
!!!AMBIT Lead Trainer
James is an AMBIT Trainer at the AFNCCF and a Clinical Psychologist.
<div style="clear:both;line-height:0px;"></div>
The [[James Wentworth Stanley Memorial Fund|http://www.jwsmf.org/]] is a generous supporter of the AMBIT project, in particular with a view to extending the reach of mental health provision to vulnerable youth, who may struggle to engage with mainstream or statutory services.
<a class="tc-float-right">[img width="150" [JW.PNG]]</a>
!!!AMBIT Lead Trainer and Specialist Project Worker
James is an AMBIT Trainer and Specialist Project Worker at the AFNCCF.
<div style="clear:both;line-height:0px;"></div>
Post graduate Thesis, supervised by Prof Steven M. Schneider, SUNY Institute of Technology (http://www.sunyit.edu), Professor and Chair, Department of Communication & Humanities
An interesting study of the use of wikis (specifically an adapted Tiddly Space, like the one this manual is built in) as a student learning environment.
[[Link to Thesis here|http://thesis.tiddlyspace.com/]]
!!Reference:
Jensen, S. L., Bo, S., & Vilmar, J. W. (2021). What is behind the closed door? A case illustration of working with social isolation in adolescents using Adaptive Mentalization‐Based Integrative Treatment (AMBIT). Journal of Clinical Psychology, 1–16. https://doi.org/10.1002/jclp.23145
!!Abstract
!!!Background:
In this paper, we outline our approach to dealing with complex social isolation by presenting a network treatment approach named Adaptive Mentalization‐Based Integrative Treatment (AMBIT).
!!!Method:
We describe the AMBIT approach, what elements it consists of, and we explain how we employed this method in the case of a 17‐year‐old boy referred to our child and adolescent psychiatric clinic, who isolated himself from the world.
!!!Results:
We emphasize in which ways the specific network approach pertinent to the AMBIT approach was helpful in this complex case. Furthermore, we describe and reveal
our insecurities and doubts related to our interventions and the general treatment process and point to why the AMBIT network approach and the interventions were
crucial in this case.
!!!Discussion:
We argue that the boy could not have been helped out of his social isolation within the conventional child and adolescent psychiatric system without engaging and establishing an integrated professional network from many sectors.
!!!KEYWORDS
AMBIT, case illustration, child and adolescent psychiatry, clinical
practice, social isolation, wraparound
Jeremy wrote the original TiddlyWiki software and released its source code under a license that is owned by a charity [[UnaMesa|http://www.unamesa.org/]]. TiddlyWiki has continued to be developed by a worldwide collaboration of programmers as an "OpenSource" project, and we acknowledge the help of the [[TiddlyWiki Community|http://groups.google.com/group/TiddlyWiki]].
<a class="tc-float-right">[img width="150" [jl.bw.PNG]]</a>
!!!AMBIT Trainer
John is a psychoanalytic psychotherapist working in the NHS and in private practice, and has previously worked at the Anna Freud Centre in the Clinical Programme.
!The emergence of the social brain network: Evidence from typical and atypical development
MARK H. JOHNSON, RICHARD GRIFFIN, GERGELY CSIBRA, HANIFE HALIT, TERESA FARRONI, MICHELLE DE HAAN, LESLIE A. TUCKER, SIMON BARON–COHEN and JOHN RICHARDS
Development and Psychopathology, Volume 17, Issue 03, September 2005, pp 599-619
[img[https://lh6.googleusercontent.com/-hGmtu_R-VYg/UO1uYa23b5I/AAAAAAAAGgg/_RqP8MtWmMc/s640/Model%2520of%2520the%2520social%2520brain_Baron-Cohen%2520.jpg]]
!Abstract
Several research groups have identified a network of regions of the adult cortex that are activated during social perception and cognition tasks. In this paper we focus on the development of components of this social brain network during early childhood and test aspects of a particular viewpoint on human functional brain development: “interactive specialization.” Specifically, we apply new data analysis techniques to a previously published data set of event-related potential (ERP) studies involving 3-, 4-, and 12-month-old infants viewing faces of different orientation and direction of eye gaze. Using source separation and localization methods, several likely generators of scalp recorded ERP are identified, and we describe how they are modulated by stimulus characteristics. We then review the results of a series of experiments concerned with perceiving and acting on eye gaze, before reporting on a new experiment involving young children with autism. Finally, we discuss predictions based on the atypical emergence of the social brain network.
* Family members are invited to think of a situation ''which happened outside the family'' and ''which evoked strong emotions in a family member''.
* The family member is then asked to describe the event ''without any reference to internal mental states''.
** For example, a young person describes meeting up with a group of friends, overhearing two of them talking about her, getting into an argument and then coming home on her own.
* Other family members are asked to have a conversation about //what they may have been going on in her mind at that time//.
Thanks to Jon Allen
In Thinking, fast and slow (page 69) Kahneman discusses the impact of affect on cognitive intuition. The results have immediate importance for AMBIT.
The experimental paradigm is asking people to identify the link between three words, whether there is a link or not. The subjects are not given sufficient time to work it out (slow thinking), they have to make an intuitive guess as to whether the words are linked.
Subjects are far better than would be predicted by chance. So system 1 is quite good at this, more accurate than chance and these levels of accuracy can be further improved by priming etc.
There is also a powerful effect of mood on the performance of this task. If participants are in a good mood, there intuitive accuracy more than doubles.
If they are in a unhappy mood, their results are no better than random. In a key paragraph, Kahneman says the following.
''"Good mood, intuition, creativity, gullibility and increased reliance on System 1 form a cluster. At another pole, sadness, vigilance, suspicion , an analytic approach and increased effort go together." ''
My reading of this is that trust and mistrust are System 1 processes and that changing mistrust to trust is a process that will require System 2 to influence System 1. Kahneman emphasises that the capacity of System 2 to influence System 1 is very limited.
Kahneman also goes on to show the causal reciprocal nature of the expression of positive affect (i.e. smiling) and cognitive ease. Because this is tricky stuff, i have included a couple of specific quotes.
''"The brief emotional response that follows a triad of words (pleasant if the triad is coherent, unpleasant otherwise) is actually the basis of judgements of coherence"''.
''"Emotional response to the cognitive ease of a triad of words mediates impressions of coherence"''
I am not sure that I completely understand this but it seems to me that if System 1 can see the way things link together, this leads to pleasant feeling which results in a sense of coherence. If that pleasant feeling is attributed to something else (a jam doughnut just arriving) then the intuition of coherence is not experienced.
There is another page about Kahneman's work [[Mentalization, the work of Daniel Kahneman and the value of doubt]]
!Reference:
Kaminski J, Pitsch A, Tomasello M (2012) Dogs steal in the dark. Animal cognition (electronic publication 2012)
!Abstract
All current evidence of visual perspective taking in dogs can possibly be explained by dogs reacting to certain stimuli rather than understanding what others see. In the current study, we set up a situation in which contextual information and social cues are in conflict. A human always forbade the dog from taking a piece of food. The part of the room being illuminated was then varied, for example, either the area where the human was seated or the area where the food was located was lit. Results show that dogs steal significantly more food when it is dark compared to when it is light. While stealing forbidden food the dog’s behaviour also depends on the type of illumination in the room.
Illumination around the food, but not the human, affected the dogs’ behaviour. This indicates that dogs do not take the sight of the human as a signal to avoid the food. It also cannot be explained by a low-level associative rule of avoiding illuminated food which dogs actually approach faster when they are in private. The current finding therefore raises the possibility that dogs take into account the human’s visual access to the food while making their decision to steal it.
This is one of a series of thoughts tagged as [[Boundaries]].
This thought specifically relates to the notion that in working with multiple possible interventions, any of which could be deployed at any time, the task of maintaining clarity and a [[Mentalizing]] stance upon the question '''what is the task at hand?''' is essential.
Having a clear answer to this question at any time, whatever we are engaged in, will help the [[Key Worker]] maintain a sense of orientation to the overarching goal, and to the sequence of subtasks required to achieve this. The notion of a set of different boundaries that need to be constantly redefined can be helpful, and these can be summarised by the acronym TARTS:
!T.A.R.T.S.
...These are the boundaries of:
!!!Task
#What is my task here and now?
#Is what I am doing relevant to the task in hand, or am I getting sidetracked?
!!!Authority
#Do I/we have the authority to carry out this task? (Are we [[Quorate|Reflective Quorum]] to make this decision...?) If not, who is?
#Should I be consulting with the Supervisory team or summoning other qualified help at this time?
!!!Responsibility
#What of this is my responsibility?
#What of this is the responsibility of the young person, his or her parents, of other clinicians, or other services?
!!!Time
#How long have I allocated for this task?
#Have I communicated this to the young person or family?
#Am I on schedule?
!!!Space
#Where is the task in hand to be carried out?
#Who are the appropriate people to be present? (Do I need to guard privacy at this time by keeping parents or others out?)
The [[Key Worker]] will practice maintaining a regular internal dialogue ([[Work on the Self]]) to check the answers to these questions, and will refer to the team's SupervisoryStructures to maintain this reflective stance.
Most commonly, families describe a catalogue of failed attempts before they can engage Mental Health Services in helping with their own concerns about a child. Thus the Mental Health Practitioner may often meet a family which is already exasperated and angry at the amount of time it has taken to get Mental Health Services involved.
However, this is not always so; it is not uncommon to experience the opposite situation, where the family subtly minimises or undermines the seriousness of a diagnosis. One such potential difficulty, specific more often to [[Psychosis]] than other conditions (though certainly not exclusive to psychosis), is the situation in which the symptoms are effectively hidden by the young person, whose presentation may be guarded, and //particularly// so towards the family.
It is not uncommon in the context of an individual meeting with a //mental health professional//, who may have more confidence in approaching and enquiring about bizarre mental phenomena, that the young person reveals more explicit symptoms than the family has been exposed to. This sets up a dilemma for the mental health professional, who has access to information which has not been granted to the family, and whose own assessment of the problem is significantly divergent (and often less urgent) from the professional's.
In such a situation the family (particularly those without experience of mental health problems in others) finds it difficult to accept the idea of their child/sibling being as ill as professionals say she is.
In such a situation, powerful defences of //denial// combine with a //'fight-flight' basic assumption// (Bion) within the family group to cast the mental health professional as the threat, rather than the mental illness within their ranks. The risk is that the family thus retreats from the encroachment of professionals. In such a situation the workers will need to move slowly, perhaps emphasising the //functional disability// (not being able to go out of the house, shouting out for no apparent reason, etc.) rather than the aetiology (early onset schizophrenia, etc.). By seeking for common ground - identifying concerns about the young person that they and the family can share - the worker may be able to join with the family to allow them to facilitate the beginnings of treatment. //"We know from experience that many people who are finding it difficult to go out, or become stressed and shout out unexpectedly, benefit from..."//
Further work on introducing notions of diagnosis, management, and prognosis is discussed under [[Family Work]] in the section on [[Specific interventions]].
The issue of [[Confidentiality]] is important in the context of a young person who has withheld the extent and nature of their symptoms from the family. In this instance (depending somewhat upon the exact age and the perceived risks), it may be appropriate to keep the //particular content// of a young person's delusions or hallucinations confidential, whilst one's duty of care does require some discussion of the fact that the young person is unwell with their parents.
This is one of the [[Tags]] in the tiddlymanual that the [[AIM]] questionnaire uses to label Key Problems identified in your assessment.
<center>[img[https://lh4.googleusercontent.com/-LsLA8EGpIJ0/URYYBCsRgJI/AAAAAAAAGyY/D4GSq5YI-M4/s512/Stance-Relationship.JPG]]</center>
A central idea underpinning the AMBIT approach is that therapeutic change is achieved through engagement of the client in an ''individual therapeutic relationship''.
!!!Clarification of terms:
Many services use the phrase 'Keyworker' and it is important to be clear that in some instances this word can be used in very different ways. It might define a ''formal role'', with a set of duties/responsibilities and defined powers, or it might (//as AMBIT tends to use the term//) refer to the worker //who is ''"key"'' in the mind of a client// at a particular time:
>//Of all the people around you who seem to be trying to help, or work with you, who do you feel "really gets you" at this time?//
!!!Why this stress on individual ("dyadic") relationships with a 'key' worker?
* In order for a client to be open to new learning, they will need an experience of feeling understood ([[Mentalized|Mentalization]]) within this relationship.
* Theory and research tells us that this experience can generate [[Epistemic Trust]] i.e. the kind of trust that is key to "//opening the doors to learning//" from another human being.
We know that mentalizing happens in relationships, and that mentalizing is most likely to happen in contexts where people feel contained, calmer and not overly anxious.
''So, therapeutic change, if it is to occur, is most likely to spring from a trusting, and safe relationship.''
For this reason much of AMBIT is devoted to how a key-worker can be supported by their colleagues to create and sustain the conditions for that kind of relationship to develop.
Crucially, while the AMBIT-influenced practitioner might hope (and actively plan) for this to occur //between them and their client//, what is actually more important is that it is allowed to develop //somewhere// in the inter-professional and informal networks that surrounds our clients, and that where trust (specifically [[Epistemic Trust]]) has emerged, this is recognised, respected, prioritised and supported (see [[Scaffolding existing relationships]]). This is a //client-centred approach// to developing help in a networked setting (and in truth, all settings are of course networked!)
In order to support this aim, there are some principles that we apply to individual key-worker relationships. These are adapted in different ways across different AMBIT influenced services, but in general terms they include:
*The team works to reduce the burden on the client of multiple therapeutic relationships all happening at the same time, and all potentially insisting on levels of disclosure and intimacy that may be overwhelming for a client whose previous [[Attachment]] history may not have been crowned with sucesses.
*We actively search out and prioritise pre-existing relationships which offer the potential to be supportive or helpful ([[Scaffolding existing relationships]]).
* There is an explicit focus on supporting those workers who are in 'the key-relationship'. How this support happens, and what the key-worker will require to do the face to face client work will vary depending on the context. This principle is known as the [[Team around the Worker]].
<html><object width="425" height="344"><param name="movie" value="https://youtube.com/v/r4jDfttxClk?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/r4jDfttxClk?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
!!Supporting the 'individual key-worker' relationship
''AMBIT is not individual therapeutic work, but about using a team to support individual helping relationships.''
So for the worker who is in the position of being 'key' to the client, the workers' energy must be balanced between developing that crucial relationship, and at the same time, ensuring that they are a [[Keyworker well-connected to wider team]].
This balance is highlighted by the pair of AMBIT stance points in the outer-ring of 'Working With Your Team'. The stance points highlight the balance between both needing close and trusting individual relationships with a client, for change to happen. But, at the same time it is critical that the worker is ''well connected to their team'' (in order that they can work in this client relationship safely and effectively).
!!How does this relate to the 'Team around the Worker' idea?
The team around the worker model describes how key-workers are very actively supported by a team of colleagues, who can provide ongoing supervision and consultation (as well as other forms of support) to do face to face work. The team of colleagues may have different roles and expertise in different areas. The idea is that they use their skills to support the key-worker to do the work that is needed through the relationship in which epistemic trust is present.
We use the idea of a [[Team around the Worker]] as much as the the more conventional idea of the "Team around a child".
So //from the perspective of the client and others involved, the work is carried out by one main person, but they will also be aware that their key-worker is supported by a team that is experienced as being active and present in the background.//
[img[https://lh6.googleusercontent.com/-Q--oDenShgU/UcD32HjdpVI/AAAAAAAAIlk/tGuG_Ps4QbE/s512/AMBITSpokes_B%252BW.JPG]]
This models to the client the way that we can all use our relationships to support the work that we do - AMBIT works very hard to avoid the dangerous illusion that any one person, //unsupported//, has the resources to sustain this work successfully.
!!So who is the 'key worker'?
Here we use the term 'key worker ', however many services do not use a specific 'key worker' system.
The Key-worker, as we use the term, is less about defining a specific organisational role, but it is more about focusing on //"Who, in the mind of the client, is currently key to finding help that is genuinely helpful?"// i.e. who in the network has the potential or a pre-existing relationship where there is some epistemic trust, and the capacity for learning __ , __from the perspective__ ''OF THE CLIENT''__
We think explicitly about who is in this position currently i.e. which relationship is 'key' in the clients' mind to getting help ( this may change and may be different to the relationship defined by the organisation as the 'primary' one)
!!We always join a pre-existing network of help
When we begin a new piece of client work, it can be tempting to believe that we have something 'more helpful' to offer the client, and to 'jump in' offering our particular skills. (this is not to say that we don't have something helpful to offer !)
However, in AMBIT we stress that there will already be a pre-existing network of help around the client when we join. There may of course be difficulties or factors that have prompted our involvement with the network. But, in joining there is always the potential to disrupt or undermine pre-existing help further, (hence increasing the burden on a client).
We believe it is therefore essential to recognise this risk and to place emphasis on considering:
* Where in the network are there pre-existing relationships that may offer support and learning?
* Who in the clients mind is most helpful within the network ?
*How might I as the new person position myself to scaffold and develop relationships that have the potential to be helpful?
*How might I position myself so as not to further overwhelm the clients' capacity to mentalize?
''We use some specific tools to help us with these questions. ''
The AMBIT [[Pro-gram|The AMBIT Pro-Gram]] can be used to map out relationships //with// the client and think about these questions directly with them.
We can also use the
[[ Dis-integration grid|Dis-integration grid]] and the [[Sculpt|Sculpting a network]] as tools to address these question in our teams.
In this manual there are [[Training Exercises for the Keyworker Relationship]] to help workers practice some the ideas we use in AMBIT-influenced practice.
If you would like to read a bit more around some of the theory behind the Key worker approach in AMBIT or about what it means to be a 'key-worker' in an AMBIT influenced team please see <<tag [[Extended learning]]>>
<a class="tc-float-right">[img width= 400 [Who has your rope pic.jpg]]</a>
!!What is it and what are the problems it aims to address?
AMBIT emphasises that for change and learning to happen, a helping-relationship is needed in which a client has the experience of being understood i.e. accurately [[mentalized|Mentalize]].
However when we are working therapeutically with clients, particularly those who are distressed or risky, this work can (//and should// at times) leave us feeling worried or anxious. So, it is inevitable that as a worker we will sometimes experience high stress and high emotion.
Theory and research on [[Mentalization]] tells us that
these experiences and feelings will constantly challenge the mentalizing capacity of the worker. However, in order for the worker to accurately mentalize their client, themselves, and encourage the clients' own mentalizing, the worker must be in a state in which they themselves can mentalize.
AMBIT stresses that the worker cannot regain their balance and mentalizing capacity alone. This is because mentalizing is a ''relational'' ability. It is something that we know develops in relationships, it is lost in relationships, and crucially, it is ''re-gained in relationships''.
So, AMBIT stresses that when working in therapeutic relationships, it is critical that this relationship is balanced with connections to trusted others, in order to restore or sustain the mentalizing of the worker. This is the theory that underpins the ''key worker well-connected to the wider team''.
!!Isolated workers
Within this area of complex practice, there is always a risk that we might un-intentionally become isolated in our work with clients. This brings with it a number of potentially serious problems, including:
*Burn-out
*Losing valuable perspectives and not seeing 'the whole picture'
*Becoming less able to plan in helpful ways
*Losing the capacity to think creatively about our practice
*Not seeing the clients' perspective
*Not spotting or evaluating risks
With this in mind we use a number of analogies to highlight the necessity of strong connections to team members (in mentalizing terms).
<a class="tc-float-right">[img width= 500 [https://lh4.googleusercontent.com/-WHgi7Bo5YOQ/US9d72FvokI/AAAAAAAAHEw/oqk3A0DWRac/s646/DiveBoatAnalogy.jpg]]</a>
Here the dive boat is an analogy to explain that [[Mentalization]] is hard to sustain in high-affect //"pressurised"// environments. Imagine the [[Key Worker]] were a deep sea diver entering the pressurized and challenging world of the client; other team members (or a supervisor in a more formal sense) should see themselves acting (and we emphasise that these are often //pro-active// actions) as a //''support team''// on the dive boat above, pumping an "air supply" down to their colleague. In the case of [[AMBIT]], that "air" is the capacity to mentalize.
Another metaphor, the mountaineer, is also frequently used - the worker needs to know some skills about what to do when she is out there, alone, but she also needs to know //who is holding her rope// and to feel confident that communications between her team member are reliable, trustworthy and secure.
!!! What does a '''Key worker well-connected to the wider team''' mean in practice?
We think it will look different in different contexts. However, in an AMBIT influenced team the intention is to make the process of seeking and offering help explicit and part of the 'every day routine' of work. i.e. for the team to become 'practiced' in holding an awarenesss of each others' minds (i.e. mentalizing colleagues). That this is recognised as an essential part of 'what we need to do this work'.
In order to do this we apply [[Mentalizing|Mentalization]] skills - but directed EXPLICITLY, towards one's colleagues within the team.
NB: this doesn't necessarily mean 'having lots of colleagues around'. It is possible to work in a busy environment and not experience strong helping connections. It is also possible to work without frequent close proximity to colleagues, but still have strong helpful connections to them.
We are also not talking about the nature of friendships or social relationships in the team (although of course this can be important in many other ways).
!![[Thinking Together]]
In AMBIT we have a tool that is designed specifically to support key-workers connections to their team. It is an explicit routine used to support help-seeking and help-offering between colleagues. It directly applies mentalization and focusses on actively helping the worker to regain their mentalizing capacity through connections with colleagues.
It is called [[Thinking Together]]. It is a set of structured "steps" that offer a deliberately ritualised way to talk about casework, so as to [[Mark|Marked mirroring]] the fact that we are attending to mental states at that time - especially that of the worker asking for advice, support, or help.
Our experience is that this tool can be adapted and applied across different contexts to increase the chances that help is well attuned and experienced as 'helpful' for a worker when needed.
!!!How else can we work on our connectedness?
We encourage teams and services to talk and think together around the process of help seeking within their context.
For example:
*What kind of help do people need to do their work well?
*What kind of factors influence help seeking in the team?
*How do people already help each other, and what works well in our team?
We believe that this kind of dialogue is useful in encouraging teams to make more explicit what they do that works well, and continue to develop and practice new ideas in this area.
We encourage teams to [[Manualize|Manualization]] what they do well (and what they intend to do more of), in relation to this important area.
Please see here for AMBIT training exercises for teams around this. [[Training Exercises for Key worker well-connected to wider team]].
Video of [[Liz Cracknell]] teaching on this for a group of [[AMBIT Local Facilitators]] - this video goes on to describe the core activity that we use to help supported the "connectedness" that we are promoting, [[Thinking Together]]:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/0e_kGvCtOEw" frameborder="0" allowfullscreen></iframe></html>
!!!Intervening when colleagues are not asking for help
We believe that another aspect of being 'well connected' is the capacity of team members to offer help or, at times, intervene when when people are not explicitly asking for help or have not recognised a problem. The ability to do this in helpful ways is a central part of team working and managing risk. For example, at times, a worker may notice something concerning in the practice or behaviour of a colleague in the team, which does not appear to have been recognised or acknowledged by them.
Please see here for theory and a framework around ''how workers of all levels can introduce challenge and inquiry to each other'' - regardless of relative seniority, etc.
* [[Offering unasked-for help to a team-mate (Graded Assertiveness)]]
The idea that we learn from experience is intuitively reasonable and not new:
<<<
"I hear, I forget. I see, I remember. I do, I understand."
Attributed to Confucius
<<<
<<<
"For the things we have to learn before we can do them, we
learn by doing them."
Aristotle
<<<
Kolb’s Experiential Learning Model, however, attempts to explicate the process by which we learn from experience. His work builds on the earlier work of theorists such as John Dewey who recognised that learning does not automatically result from learning (this too is intuitively reasonable – why else would be make the same mistakes twice?). Dewey suggested that learning results from the:
<<<
“reconstruction or reorganization of
experience that adds to the meaning of that experience and which increases ability
to direct the course of subsequent experience”.
<<<
Kolb proposed an Experiential Learning Cycle that describes the process by which experience is transformed into learning:
[IMG[https://lh4.googleusercontent.com/-cad2pVFZ8-g/UdXODdnBJGI/AAAAAAAAAHA/kO8WYwQgOZE/s640/KOLB%2520EXPERIENTIAL%2520LEARNING%2520CYCLE.jpg]]
Kolb suggests that learning from experience is enhanced by developing deliberate, or intentional, practices for transforming experiencing into learning. In AMBIT we would see team manualising activity as a deliberate experiential learning practice:
<<<
“To learn from their experience, teams must create a conversational space where
members can reflect on and talk about their experience together”
Kolb
<<<
Senge’s work on learning organisations includes a model for team learning that parallels Kolb’s experiential learning cycle:
[IMG[https://lh5.googleusercontent.com/-L5na4ISZGSI/UdXOD20wX9I/AAAAAAAAAHM/2lxwaM4hIxg/s640/SENGE%2520AND%2520KOLB%2520LEARNING%2520CYCLES.jpg]]
Kolko and Perrin (2014) The Integration of Behavioral Health Interventions in Children’s Health Care: Services, Science, and Suggestions
J Clin Child Adolesc Psychol. 2014 ; 43(2): 216–228. doi:10.1080/15374416.2013.862804
This is a useful review paper giving an overview of integrated approaches in behavioural paediatrics particularly focussing on common mental health presentations - anxiety, depression and behaviour and how interventions can be delivered by non-specialists working alongside specialists in community settings.
The review looks at a series of models.
#Consultation between specialist and community provider.
#Training community providers in mental health interventions.
#Community staff delivering interventions in community settings
#On-site collaborative care - whereby two agencies work together to deliver an intervention in a community setting.
AMBIT teams may have aspects of all of these but the latter is probably closest to what we mean by working across networks. The review suggests some evidence of the effectiveness of this approach.
Also of interest is that in the conclusions the authors comment on implementation models for integrated interventions or systems. They comment that 'few strategies to promote implementation of integrated care in paediatric settings have been reported',
Krueger, SJ, and Glass, CR (2013) "Integrative Psychotherapy for Children and Adolescents: A practice-oriented literature review" ''Journal of Psychotherapy Integration, 2013, no.4, 331-344''
>//''"Recently developed, Adolescent ~Mentalization-Based Integrative Therapy (AMBIT; Bevington & Fuggle, 2012) uses mentalization, a traditionally psychodynamic or "relational" conceptual framework, to integrate techniques from different evidence based interventions for the treatment of adolescents with complex severe mental health needs. Theoretically, AMBIT also emphasises how mentalization underlies change across all therapeutic orientations (Bevington, Fuggle, Fonagy, Target and Asen, 2013). AMBIT appear to have much promise and is quite innovative, particularly due to its embrace of new technologies, compatibility with an interdisciplinary treatment team approach, and endorsement of adaptation by local treatment providers. An open source online treatment manual is freely available to practitioners."''//
This is an interesting paper, addressing the difficulties in implementing the adoption of technology and information sources from a comparative case study of 12 organisations across the UK. Key findings for the purposes of AMBIT are the preferences for people to seek information from locally-generated network resources...
!!Main finding
Those involved in the process variably accessed three types of innovation knowledge:
*‘awareness’ (information that an innovation exists)
*‘principles’ (information about an innovation's functioning principles)
* ‘how-to’ (information required to use an innovation properly at individual and organisational levels).
Centralised (national, government-led) and local sources were used to obtain this knowledge. __''Localised professional networks were preferred sources for all three types of knowledge.'' __Professional backgrounds influenced an asymmetric attention to different types of innovation knowledge. When less attention was given to ‘how-to’ compared with ‘principles’ knowledge at the early stages of the process, this contributed to 12 cases of incomplete implementation or discontinuance after initial adoption.
!!Conclusions
Potential adopters and change agents often overlooked or undervalued ‘how-to’ knowledge. Balancing ‘principles’ and ‘how-to’ knowledge early in the innovation process enhanced successful technology adoption and implementation by considering efficacy as well as strategic, structural and cultural fit with the organisation's context. This learning is critical given the policy emphasis for health organisations to be innovation-ready.
!!Link
http://bmjopen.bmj.com/content/2/2/e000872.full
<center> [img width=100% [books.PNG]] </center>
!!Introduction
Learning at Work is the principle of teams and workers becoming actively engaged in learning from their experiences at work. It is one of the [[Core Features of AMBIT]] practice. [[Manualization]] is the process designed to help capture and support ongoing learning within teams.
AMBIT aims to support teams to learn in more ''explicit ways'' about their practice. We believe strongly that explicit learning in teams fosters crucial evaluation of ''what we do'', and ongoing development of ''how we do things''. [[Mentalization]] is closely associated with learning, and the development of new understandings. It emphasises //not-knowing//, and a consequent //openness towards new learning//.
We believe that a mentalizing team is one which is able to ask itself questions such as...why do we do this in this way? are there other ways we could do this better? how? is this effective ? why or why not?...
It is this kind of explicit and ongoing evaluation of our experiences, through our practice, that we believe encourages genuine improvement.
!!A respectful balancing act
Learning at work requires a balancing between two elements of the [[AMBIT stance|Core Features of AMBIT]] - Respect for EVIDENCE, and Respect for LOCAL PRACTICE & EXPERTISE:
|! |![[Respect for Evidence]]|![[Respect local practice and expertise]]|
|''What is it?'' |[[Published trials or meta-analyses|Studies relevant to AMBIT]], local teams' own work in [[Evaluating outcomes]], [[Service User Feedback]], testimonies, etc |Respect for //existing// competencies & knowledge within team & across other agencies in the network that are attuned to local culture & service ecology |
|''Risk of Overemphasis'' |Teams that practice "by numbers", rather than with attunement, limited adaptability to serve local culture and local service ecology |Team/worker that "makes it up as we go along", over-reliance on charisma, vulnerability to harmful practices |
!!Aspects of Learning at Work
Click on the tags below to see a drop down list of the pages under each of the associated aspects of Learning at Work.
<<tag [[Manualization]]>>
*Team manualizing is analogous to team mentalizing. Manualization is the specific approach to ''writing about what we are learning as a team, working in //this setting//, with //these clients//''.
<<tag [[User Guide]]>>
* A "syllabus" to help you get the best out of this manual
<<tag [[Developing learning organisations]]>>
* How do we create and sustain openness to learning in our teams and services?
!!!The AMBIT Study Group
<div class="tc-image-link-row"><<image-link "The AMBIT Study Group" "working together image.jpg" "The AMBIT Study Group" "400">> </div>
This aims to enhance learning, and build relationships and international collaboration across the AMBIT community.
* For any team working with clients with multiple needs, there will be variability of outcomes with some clients showing important improvements in their lives and some less so. Learning about the overall effectiveness of the team and the variability of outcomes in individual cases is a core component of learning at work. This work is linked together in the manual under a tag [[Evaluating outcomes]]. Go to this page for a listing of pages relating to this.
<<tag [[Community of Practice]]>>
* Supporting and encouraging links between workers, teams and experts by experience. The [[Community of Practice]] promotes collaborative and collective learning between workers in many different settings.
<<tag [[LEARNING exercises from AMBIT training]]>>
*There are a range of activities and exercises in the manual to promote two aspects of the AMBIT stance, namely [[Training Exercises for Respect local practice and expertise]] and [[Training Exercises for Respect for Evidence]] including the use of [[Logic Models]].
!!AMBIT and Learning
AMBIT itself aspires to be a learning and developing body of work that learns in an ongoing way from multiple field deployments (see [[Weisz, Simpson-Gray (2008) Evidence-Based Psychotherapy for Children and Adolescents]] and the "Deployment focused" approach.
AMBIT is strongly influenced by the work of Peter Senge, and his emphasis on the value of the Learning Organisation ([[Developing learning organisations]]). It is also influenced by Etienne Wenger and Jean Lave's work on [[Community of Practice]].
----
!!You may also be interested in:
<div class="tc-image-link-row"><<image-link "Working with your CLIENT" "togimg.PNG" "Working with your CLIENT" "300">> <<image-link "Working with your TEAM" "josh-calabrese-Ev1XqeVL2wI-unsplash.jpg" "Working with your TEAM" "300">><<image-link "Working with your NETWORKS" "nn.PNG" "Working with your NETWORKS" "300">>
!Recapping AMBIT training
This page gathers key exercises/learning you will have done in your [[AMBIT training|Information About AMBIT Training]] that relate to the quadrant of the [[AMBIT Wheel]] described as:
!!><<tag [[LEARNING at work]]>>
Note, there is plenty more to AMBIT than what is covered in your training, so feel free to browse further!
!!><<tag [[LEARNING exercises from AMBIT training]]>>
This refers to the extent to which a client is able to understand and accept the nature of their difficulties, and in that sense it involves understanding the reasoning behind the opinions of others. This has many links to the concept of [[Mentalization]], and it would be true to to say that a loss of insight into one's situation would represent a dramatic failure to mentalize one's current condition.
A young person lacking insight into their difficulties will find it much harder (in that it makes much less //sense//) to engage with help and treatment, and being able to work with problematic [[Insight and Engagement]] is a key challenge for the [[Key Worker]].
Lack of insight is one of the cardinal features of [[Psychosis]], and with a severe illness like this, which is known to have a worse outlook for those who are affected earlier in life, as well as for those who do not get appropriate treatment quickly, this may lead to concerns such as whether it may be right to [[Use the Mental Health Act]].
<a class="tc-float-right">[img width="150" [laura manual.jpg]]</a>
!!!Joint Programme Lead
Laura Talbot is a Clinical Psychologist who has specialised in working with adolescents and young adults in community outreach services across the health, social care and voluntary sectors since qualifying in 2010. Laura has held clinical lead roles in multi-agency projects working with young people who are at risk of entering care or custody and/or affected by gang involvement (MAC-UK; adolescent edge of care team in Islington Children’s Services) and those at risk of school exclusion (Brent Inclusion Service). Laura has been a trainer with the AMBIT Programme since 2015 and is now the AMBIT Joint Programme Lead. This role involves delivering training, supervision and consultation for teams nationally and internationally who work in a range of health, social care and voluntary sector contexts who wish to improve their capacity to work with clients with multiple needs who find it hard to make use of the help offered by mainstream services.
<div style="clear:both;line-height:0px;"></div>
Lave, Jean; Wenger, Etienne (1991). Situated Learning: Legitimate Peripheral Participation. Cambridge: Cambridge University Press. ISBN 0-521-42374-0
See also a good [[Wikipedia entry|http://en.wikipedia.org/wiki/Community_of_practice]] about [[Community of Practice]]
A lively conversation, sharing knowledge of AMBIT-influenced ways to engage with young people:
*Sharing a bit of ''me''. Purposeful self-disclosure. Balancing risk.
*Engaging young people "where they're at"
**physically - meeting in a place that is right for the young person - cafe and parks vs clinics and offices. Perhaps with a plan to gradually transition to a more conventional clinical or helping space.
**Psychologically - "Getting it"
*Finding ways to "step out of chaos", to reduce affect:
**activity (e.g. talking whilst playing pool)
**speaking in the car (reduced expectation of eye contact)
*Language that encourages mentalizing, e.g. "I'm interested to hear..."
*Language to share - tentatively - our own thoughts (see [[Broadcasting Intentions]]) e.g. "I guess my perspective is.... what's yours?"
*Importance of worker being "thick skinned"
**After further discussion it was considered that what was being referred to here was a maintenance of mentalizing capacity in the worker - in the sense of the worker being able to remain curious about the mental states underlying what might feel like difficult behaviours in a young person, not taking this behaviour "personally".
Unconferencers concluded that there were several strategies here which are rather different to traditional therapy or helping, and coined the term "Untherapy" to describe this!
!!Unconference 2016
This was the least popular discussion in the [[LEARNING at work]] room for the conference.
Reflections:
* [[Manualization]] (not unlike [[Mentalization]]) is //work// and there are barriers to doing this:
** Time constraints
** "Higher" (mainly 'clinical') priorities
** Technological clunkiness
* The Manual is developed and improved by responding to feedback.
** Creating a website that others find easy to use requires mentalizing of an imagined user, and it is easy for an author/developer who is familiar with where buttons live, and "easy" shortcuts, to overlook the experience of a user who may have very specific needs.
** We rely on Feedback from users about their experiences (good and more importantly bad) of the web-based manual - but all web-developers know that getting such feedback is very hard (same reasons as above). There is a [[Feedback please!]] page, and a link to it from the slide-out log-on panel, top right.
* Updates on tech and user interface developments
** After a long period of minimal tech development (just adding content) we are due to move the manuals from their current position in servers managed by British Telecom, into servers managed by the AFC. This will happen by the end of this year, and the intention is that from the users' point of view transition will be seamless.
** After this we intend to have another (much larger) phase of technical and design development which will address some of the most commonly reported bugbears, and build a lot more interactivity and [[Community of Practice]] focus into the manual, so that:
*** It will be easy for users to join "chat" about specific pages, suggest improvements, "meet" other people interested in the same micro-level area of practice or theory.
*** It will also get much easier for teams to clone and customise each others' pages.
*** The general look and feel of the site, and navigability, will be improved.
** This latter part of the work requires FUNDS:
*** we are actively starting to look for a donor to support such work
*** if you know anyone, or are interested in helping, contact us at the [[Anna Freud National Centre for Children and Families]]
** In addition, as we train more trainers, we envisage a greater proportion of AMBIT leadership time being spent in interacting with local teams and discussing manualized material - at present there is insufficient "feedback" to a team that adds content from other parts of the [[Community of Practice]].
* Finally, we emphasised the fact that, in fact, the manuals are quite easy to use, but they do take a (small, in fact!) amount of PRACTICE!
** Setting regular team manualizing sessions (effectively "reflective practice" sessions, in which the learning points are recorded and shared in the local wiki manual) is the way most tams successfully manualizing have got started.
** Our observation is that once teams have got into this, they tend to find it valuable, and continue
** Our observation (unscientific, and potentially biased) is that teams who do regularly manualize their work appear particularly energised and purposeful over time (though the direction of effect is unclear: do the manualize more because they are high-energy teams, or does their energy increase in part because of this explicit team learning?
!!Unconference 2016
This was a busy discussion group.
!!Key reflections:
* ''Workability''
** Importance of "measuring what matters" - to clients, to staff
** Questions about the bias if you do session-by-session measures
* ''Integrating measures into practice''
** Sharing outcomes measures (and feeding results back) with clients
** Explicitly modelling the "not-knowing stance" (See [[The Worker's Mentalizing Stance]])
* ''Unanswered questions:''
** how should/could we measure the value of [[Working with your NETWORKS]]?
* ''Example tools/measures discussed''
** The CORC "Bullseye" session-by-session measure (being trialled by CASUS)
** The [[AIM questionnaire|AIM questionnaire - paper version]]
** The [[AIM Cards]] - a young-person rated version that can be used as a measure, but also as a flexible card-sort that allows discussion of intervention priorities, etc.
* Other, more pragmatic measures:
** Specific case management tasks, and time limits (e.g. "Set up and support an initial engagement meeting with this young person's local Gangs and Violence Team //within one week//" - the measure is ''met/unmet'')
!!Working with young people who offend (Unconference conversation 2016)
A conversation about AMBIT-influenced approaches to working with young people who offend. Some keys thoughts emerging from this conversation:
*Remembering to "peel the banana" - What you see (the offending behaviour) is just the skin but what's underneath?
**how did young person get into this situation? What created the context where this behaviour made sense?
***remembering importance of trauma
**offender as victim
**grooming
**repeating experiences of being "let down" - a cycle: feeling let down -> offending -> response to offending -> feeling let down
*Encouraging young people to mz the victim? But, //first//, self
*mentalizing and gangs
**gangs as anxiety-infused systems
**risk of "us and them" thinking leading to dis-integration
**identifying the key figures in the system with whom to hold [[Connecting Conversations]]
**systemic interventions, helping gangs to make sense of - and navigate - helping services
**good ability to develop epistemic trust
!!This page provides links to further detail around the theory of 'Learning Organisations', proposed by Prof Peter Senge.
Senge states that there are 5 particular characteristics needed within organisations to support learning and adaption. These are:-
*Systems thinking (see [[Senge: Discipline 1 - Systems Thinking]])
*Personal Mastery (see [[Senge: Discipline 2 - Personal Mastery]])
*Mental Models (see [[Senge: Discipline 3 - Mental Models]])
*Building shared vision (see [[Senge: Discipline 4 - Shared Vision]]).
*Team learning (see [[Senge: Discipline 5 - Team Learning]]).
Senge also described the characteristics of organisations which were in his phrase 'learning disabled' (see [[Senge: the characteristics of 'Learning Disabled' Organisations]]).
If you would like to assess the degree to which your team fits with Senge's notion of a 'Learning Organisation' please see here
[[Assessing a learning organisation]]
//"The real difficulty in changing the course of any enterprise lies not in developing new ideas but in escaping old ones."// John Maynard Keynes
!!Introduction
Obviously this manual has a huge amount of material about AMBIT! (see [[Core Features of AMBIT]] as starting point). This page will simply describe the learning about AMBIT during the first day of training.
!!Learning Outcomes
(a) To learn about the AMBIT wheel diagram and to recognise the main parts of the framework
(b) To learn about the eight parts of the basic stance
(c) To learn about the four key practices and the rationale for their prominence
!!Teaching
The first two learning outcomes will be covered by a 30 minute didactic presentation (either live or by video) followed by questions and discussion.
<iframe width="560" height="315" src="https://www.youtube.com/embed/HrEgDdsohNo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!Training Exercise after didactic content
* Whole team exercise.
* Begin by working in pairs and give each pair one part of the basic stance to consider. (If there are not eight pairs then just select as many parts of the stance as you can).
* Each pair discusses what they currently do now in relation to the 'stance'.
* After ten minutes, there is a general discussion with the whole team as to how this basic stance fits with their existing practice.
* At the end of the exercise the team is asked to consider which part of the basic stance they would like to work on to develop their work.
* Note any conclusions from this discussion as a future manualising task.
!!Time allocation
90 minutes
!Introduction
Dis-integration is a key concept in AMBIT, and [[Addressing Dis-integration]] is one of the [[Core Features of AMBIT]] - which is to say that we see Dis-integration as a natural "given" in complex systems. Thus becoming "upset" or "disappointed" at instances of Dis-integration is counter-productive and liable only to produce stress and burnout in staff.
Having an understanding of what leads to dis-integrated care networks, particularly an explanation that avoids unhelpful //blame//, or the perpetuation of the common //myths// that exist about other agencies or workers in such networks, is helpful, as are simple tools that help workers to address these difficulties proactively.
!Learning Outcomes
(a) To understand the nature of [[Complexity]] in hard-to-reach young people, the multiple aetiologies that influence their lifecourses, and the necessity for multi-modal interventions to address their difficulties. Following this, to understand the inevitability of complex networks of care.
(b) To understand the nature of ''Dis-integration'' in complex networks; how it arises, and how it can affect the care delivered to young people and families.
(b) To learn and practice the use of the [[Dis-integration grid]] as a tool for addressing dis-integration in the working environment.
!Didactic Teaching
A brief recap on [[Complexity]] and [[Multiple interacting aetiologies]] in [[Hard to reach]] youth, including [[Developmental Considerations]] that mean that Adolescence is a period of unique vulnerability. This complexity leads to the inevitable involvement of multiple agencies, and in this context the nature of ''Dis-integration'' is described, including the different [[DOMAINS and LEVELS of dis-integration]] across which it occurs. The [[Dis-integration grid]] is then described.
There is a video lecture here:
<iframe width="560" height="315" src="https://www.youtube.com/embed/QxCNC08TJo8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!Training exercises
Practice using the [[Dis-integration grid]] - see the [[Dis-integration Grid EXERCISE]].
!Time allocation
45 minutes
!Introduction
The [[SupervisoryStructures]] in AMBIT are designed to counterbalance the potentially destabilising effects of privileging an [[Individual keyworker relationship|Key Worker]] with clients who are potentially disturbed and/or disturbing. Hence AMBIT stresses as //equally important// the need for a [[Keyworker well-connected to wider team]]. The principle way of developing coherence in a team is to develop a strong culture of disciplined communication about the work, which we call [[Thinking Together]].
!Learning Outcomes
(a) To understand the impact of affect on workers, and their own capacity to [[mentalize|Mentalization]].
(b) To understand the value to a worker of being accurately mentalized by a colleague in relation to a specific clinical problem.
(c) To know (and have practised) the four steps of [[Thinking Together]]
!Training Exercise 1:
* Discussion in small groups or pairs about the impact of clients upon workers, and the inevitability of anxiety on the work (10 minutes)
* The [[Passed-outwards Discussion]] - FOLLOWED by discussion of the [[Ripples in a Pond]] and the [[Dive Boat - An Analogy]] to illustrate the effect of proximity to affect on mentalizing capacity, and the function of the team in this respect.
!Didactic Teaching
A 20 minute didactic presentation to explain anxiety in the workplace, and the unhelpfulness of shame as a response to this. Then we describe the 4 steps of [[Thinking Together]] and show the two videos of 'Thinking Apart' and 'Thinking Together', followed by questions and discussion. Emphasise the "Airline Safety Talk" analogy (put your own mask on before attending to your child) - see [[Mentalizing the Moment (in Thinking Together)]].
!Training Exercise 2:
Practise [[Thinking Together]]
!Time allocation
90 minutes
!!Purpose of exercise
To foster openness to learning //as a team// and reflection upon our team's success in this field, as well as the challenges we face
!!Context
Best for Multiple teams, rather than for a single team as we want to encourage reflection upon team processes.
!!What to do
!!!Step 1:
* Break teams up into small mixed groups of 3-4 workers (drawn from separate teams)
** __Discuss:__ ''What are the markers that would show learning is happening in a team?''
!!!Step 2:
* Reconstitute as whole teams:
** __Discuss:__ ''Where is the evidence for these things happening in your team, and where would you wish to strengthen things in this respect?''
!!!Step 3:
* Plenary discussion
** From [[Pretend mode]] (//"We know it all!"//) to [[Mentalization]]
** Creating dialogue about real issues (Discussion/Percussion/Concussion Vs. Dialogue - see [[Senge: Discipline 5 - Team Learning]])
** Creating shared mental models (see [[Senge: Discipline 3 - Mental Models]])
** Avoiding "Organisational amnesia" - the need for a log of learning ([[Manualization]])
!!Introduction
This manual has a huge amount of material about the theory and practice of mentalizing. (see [[Mentalization]] as starting point). This page will simply describe the learning about mentalizing during the first day of training.
<iframe width="560" height="315" src="https://www.youtube.com/embed/sq61A5wGC8o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!Learning Outcomes
(a) To know the basic idea of [[Mentalization]] and its developmental roots.
(b) To know about ''non-mentalizing'' (or the "[[Pre-mentalistic stances]]") and some of the factors that are associated with these states of mind and how to address people who are in them.
(c) To explore the basic idea by carrying out an exercise in mentalizing
!!Teaching
The first two learning outcomes will be covered by a 30-45 minute didactic presentation (either live or by video) followed by questions and discussion.
!!Training Exercise
There are a number of exercises that could be used to illustrate aspects of mentalizing and trainers may want to shape this depending on the group that is being trained (see <<tag [[Training Exercises for Mentalization]]>>). In general, the [[Passed-outwards Discussion]] has proved a useful starting exercise for practitioners.
!!Time allocation
90 minutes
!!The AMBIT Practice Audit Tool (~APrAT)
!!!What is the ~APrAT?
The AMBIT Practice Audit Tool (~APrAT) is a simple questionnaire and exercise to give teams a basic reflective measure of how closely they have followed AMBIT principles in a particular case, and to help them sustain practice.
!!!How to do it?
* Try to do at least one ~APrAT every three months with your team.
* Set aside an hour to do this - see the ~APrAT exercise in, or across, teams.
* Pick one case - preferably one that has given particular cause for concern in the recent past.
* Using the questions, audit the 8 AMBIT stance indicators around this case.
* Look at the results, identify which stance indicator is the most relevant for the team to improve its practice, and look at the AMBIT Stance Exercises to locate a relevant exercise to practice this.
[[AMBIT Practice Audit Tool (APrAT)]]
----
!!AIM Questionnaire
AMBIT AIM stands for AMBIT Adolescent Integrative Measure.
* This is a questionnaire that has been adapted by Dickon Bevington and Peter Fuggle from the Hampstead Child Adaptation Measure (H-CAM), which is an assessment interview originally authored by Peter Fonagy and Mary Target.
* The AIM is a multilevel/multidimensional assessment, which attempts to gather a 'holistic picture' of a clients' level of functioning. The areas that it measures are: Daily life-function, socio-economic factors, family relationships, social relationships, mental state, clients' response to their situation, and, the complexity of the difficulties. See AIM items for a list of the 40 items and which domain they are in.
* It can be used as a measure at the beginning and end of work with clients to track how the work has gone, whether the goals set have been met, and whether things have changed in a clients' life. At a service or team level it can provide a rich source of information about the clients that have been seen, and act as a resource for teams to learn about the work they do.
* It is available for download and use within this manual here AIM questionnaire.
* The AIM is recommended by the AMBIT team as a Multi-Domain Assessment. But it does not have to be used by teams who have AMBIT training
* It has been used within a large research trial called the 'IMPACT study of adolescent depression' in the UK. During this research the properties of the AIM were studied further.
[[Read more about the AIM|AIM]]
!!!!Source: Marianne ~McGowan and Peter Fuggle
!!Introduction
The [[AMBIT Service Evaluation Questionnaire (ASEQ)]] has been used as part of the consultation process with teams who are considering doing the AMBIT training since 2018. Using this measure, members of teams have been asked to rate their current practice against several key components of AMBIT practice so that each aspect of the AMBIT wheel is covered.
This measure has been used for some time and we have now accumulated considerable data on how teams tend to rate themselves prior to the training. This page summarises some of these ratings.
The ASEQ has 16 items, four questions for each part of the wheel. The practitioner is asked to rate how much this item is a part of their current practice. As many of these constructs overlap with common elements of good practice, it is expected that practitioners will rate themselves as doing most of these at least some of the time. As is emphasised in much of the AMBIT training, AMBIT comprises of skills that many practitioners see themselves as already having. The purpose of the training is often to give these implicit skills more prominence than previously.
!!ASEQ baseline data
Teams coming for AMBIT training are invited to encourage their teams to complete the ASEQ as part of evaluating their training needs. Some teams do this and some choose not to. Over the period of 2018-2020 we have obtained baseline data on 441 completed ASEQs by practitioners coming on the training. We estimate that this is approximately 40-50% of all those who were trained during this period.
The full table is on an Excel spreadsheet and this can be located using the button below.
https://annafreud.sharepoint.com/:x:/r/sites/AMBITprogramme/_layouts/15/Doc.aspx?sourcedoc=%7BE22F1DD8-2967-480D-AD63-D9E72751FD8A%7D&file=ASEQ%20Data%20-%20ALL%20TEAMS.xlsx&action=default&mobileredirect=true
This data suggests that in general practitioners rate themselves about 50-70% of the time as having core AMBIT knowledge, skills and behaviours. The percentage of items rated 'always' or 'often' for each domain is shown below. There is some variation between the four aspects of AMBIT so that network items are generally rated lower than the other three domains.
*Client 65%
*Team 70%
*Network 55%
*Learning 65%
The lowest rated item in each domain ('always and often') in each domain is shown below:-
*''Client: I share with my clients things i am finding hard to understand about them. (48%)''
*''Team: Members of my team know how I am affected by (and tend to react to) common situations in the work that I do. (51%)''
*''Network: Workers in other teams (in the wider network) understand what it is like to do my job. (15%)''
*''Learning: My team systematically records what we collectively learn and agree about improving practice. (47%)''
For these later items the percentage of practitioners who rate these items as occurring 'rarely' or 'never' is as follows:-
*Client: I share with my clients things i am finding hard to understand about them. (15%)
*Team: Members of my team know how I am affected by (and tend to react to) common situations in the work that I do. (18%)
*Network: Workers in other teams (in the wider network) understand what it is like to do my job. (36%)
*Learning: My team systematically records what we collectively learn and agree about improving practice. (27%)
!!What are we learning from this?
#AMBIT is building on skills and knowledge that are already perceived to be part of the practitioners skillset. This is consistent with the AMBIT approach to training. We are not training something entirely new.
#Despite this overlap with existing knowledge and expertise, most teams experience the training in a very positive way. (see [[Feedback on AMBIT Training]] where over 80% of ratings by practitioners of training sessions are rated very positively). Why aren't they bored or uninterested?
#One conjecture is that the impact of AMBIT training is a combination of validation of existing expertise (practitioners feel understood) and this leads to some recognition of vulnerabilities in practice.
#The items on the ASEQ which are rated less strongly at baseline relate to two possible themes: practitioners not feeling well understood by the team and the network and not feeling able to share a lack of understanding with clients.
#A second theme is around the difficulty of supporting collective learning in a team.
#The impact of AMBIT training may not be easily identified if all items of the ASEQ are expected to show improvement as many of these are high as baseline. Sensitivity to change may best be explored by considering targeted follow-up of core items that shown less strength at baseline.
#It is of interest that these items noted above could be considered to have a common thread of the importance of mentalizing both self and other alongside creating effective conditions for learning.
These are the Learning at Work questions from the [[AMBIT Service Evaluation Questionnaire (ASEQ)]]
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/ResponsePage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUMVdaQlBON1RLMlpOUzdSVE5XOUMwTkJRNSQlQCN0PWcu&embed=true" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/AnalysisPage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUMVdaQlBON1RLMlpOUzdSVE5XOUMwTkJRNSQlQCN0PWcu&AnalyzerToken=AT46NEtA4mFRSrPo6a8TGMc6S1flN9PB" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
!!!The purpose of this page is to give some ideas around how teams can use the information they gather from outcome measures to impact positively on their practice and work with clients
*A key aim of the AMBIT approach is to support learning within teams. The idea being that a team who is interested in learning about its work is likely to be able to improve, adapt and develop more helpful and effective approaches with their client group
*Collecting information about how our clients are doing and whether changes are happening through an intervention is a key part of this process
* However, we know that aside from actually collecting the information, it is often far harder to use it in ways that stimulate learning and develop practice
'''We are collecting information about our clients' and whether there are any changes...but what now???'''
At a team level the aim is that members can receive feedback about this information and feel safe enough to explore ''what this information means'' about the practice of the team....
!!!Creating a culture whereby team members feel open and curious about the meaning of results from outcome measures can take some steps to be in place first;
<center>[img width= 500 [Picture1.png]]</center>
Please see [[Preconditions for Team Learning]] for more on developing a team context that promotes learning together.
!!!There are also some practical steps to consider to support learning from the results of outcome measures. These include;
*Deciding on the best team forum to share results and to openly discuss them together ?
*Finding a clear, simple and engaging way of presenting the information to the team
*People within the team who will lead on this process of gathering, sharing and facilitating the learning around the results
!!!What kind of questions have teams asked about the information they are collecting?
*Are our clients improving in the way we hope? If so can we explore what it is that is helping? are there ways we can do more of these things ?
* If our clients are not improving, what might this be about? how could we find out more about this and what could we try to do differently?
* What can we learn about the characteristics of the client group we see? What does this tell us about how we should approach the work? are there areas we need to adapt based on new information about our clients' characteristics?
*Are there characteristics we can identify in clients who do better and in clients' who don't do so well in our service? are there things we can do differently if we can identify these signs early on in the work together?
*Are there things that the team does particularly well that they didn't realise they were doing?
*What do service users say they find most and least helpful about our service? What does this mean about what we should do?
*Do service users meet their own personal goals? What helps? What makes it hard?
!!!What kind of things have teams learned about from their outcome measures?
This video shows Liz Cracknell and Carol Evans at the AMBIT conference 2013 talking about how they have used outcome measures in their service and learning that's happened as a result of these.
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/89qKY9fdlCo?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/89qKY9fdlCo?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!!Some AMBIT influenced teams have written a paper about the process of learning through outcome measures.
This paper describes how [[ CASUS, Cambridge|CASUS]] and ''AMASS (Adolescent Multi-Agency Support Service) in Islington'' used the findings from their outcome measures. [[See here for the full reference|Fuggle et al (2014) The AMBIT approach to outcome evaluation and manualization: adopting a learning organization approach]]
Below we have summarised some of the key points from the learning that the CASUS team present in this paper;
!!! CASUS
*Collected data on their clients before and after treatment using the [[AIM|AIM]] measure, the [[CGAS|CGAS]], TOP (revised to the [[YPOR - Drug and Alcohol Outcomes]]) and [[CGI|Clinical Global Impression (CGI)]]. These results were presented to the team visually to make the information easily accessible.
!!!Themes included;
*Improved understanding of the client group- Of the clients assessed with the AIM at the start of treatment only one client was rated as having a single problem . This highlighted for the team the complexity and multi- problem nature of the client group they see.
*There was also a different pattern of problems between male and female clients, which led to further reflection around why this was the case...was it that the team was better at engaging young people with these types of problems? or a reflection of gender differences in the population more generally? Were there differences in how well the service helped male and female clients and these different presenting issues ? Should the team adapt their approach towards these different sets of difficulties and if so how?
*These findings led to a process of reflection, with results, conclusions, and topics for further investigation being manualized in the team’s wiki manual.
The team discussions focused on what the outcomes ''meant'' to the team members rather than just being data for managers and commissioners, so it became less a task 'to be done' and more about exploring and learning together.
''Learning through outcomes'' is a key aim of
[[The AMBIT Study Group|The AMBIT Study Group]]. This is a collaboration between practitioners from teams in different countries working under the influence of AMBIT. The group aims to learn from outcomes collected across services and jointly explore and research aspects of AMBIT practice.
There are a number of current
outcome evaluations happening in AMBIT influenced teams. Some of these are about to be published in academic journals. Follow here for more details of this ongoing work.
[[Current Research and Outcome Evaluations in the AMBIT community|Current Research and Outcome Evaluations in the AMBIT Community]]
!!The mentalizing stance (Unconference conversation 2016)
An unconferencer posed the challenging question //"Do you mentalize at home?"//
This led to a conversation about the extent to which is it possible to sign up to ideas about the importance and helpfulness of efforts to maintain a mentalizing stance in one's work but not carry forward this philosophy in to one's personal life.
This thinking about personal self opened up conversations about mentalizing that were rather different to those we often have. Participants shared their experiences of failures of mentalizing in conflict with loved ones, and of how the emotions involved in intimate relationships make inevitable such failures. The idea was put forward that a couple that does not ever argue might be in [[Pretend mode]], in failing to acknowledge and address differences and difficulties. There was acknowledgement of how much more //comfortable// non-mentalizing positions can be at times, leading us to avoid mentalized positions even when we have become aware that is likely that we are in a non-mentalizing frame of mind:
*Sometimes we just want to be RIGHT, so certainty, or [[Psychic equivalence]] is the ideal position
*Sometimes we don't want to acknowledge things: [[Pretend mode]] works nicely
*Sometimes [[Teleological thinking]] is easiest and quickest (at least in the short term!)
!!Adolescent states of mind (Unconference conversation 2016)
The group thought about biological, neurodevelopmental and social factors impacting states of mind in adolescents:
*Neurodevelopment - mentalizing capacity is fragile, fight or flight is strong
*Importance of transition: am I an adult yet? does this society view me as an adult? Loss of childhood? Mismatch between expectations and responsibilities and level of freedom/agency - mixed messages given
*Tendency to view young people as //bad// not //sad//
*Development of sexuality and implicit message that this is bad
*Uncertainty around multiple changes occurring, changing expectations
*Importance of understanding individual differences
*Difficulties and differences in help seeking and response to offers of "help"
*Do all adult workers understand these issues?
*Exams, decisions, stress!
!!Barriers to help seeking in teams
In this Unconference workshop, we explored the barriers to seeking help in teams. Participants felt that establishing a culture of honesty and openness in teams, whereby team members felt able to share thoughts or feelings about their work without having to “dress them up” was a fundamental part of being able to practice effectively, but could be difficult to achieve.
We brainstormed some barriers to asking for help in teams, as follows:
*A worry about appearing incompetent
*Low trust in colleagues – may be the case in newly formed teams, where building trust might be part of the developmental journey of the team, but equally could occur in well-established teams if there are difficulties between team members
*Worrying about one’s work and professional identity being negatively judged
*Not knowing who to ask for help
*Not knowing how to ask for help
*Not knowing what it might be ok to ask for help with
*Being physically separated from colleagues, by location (e.g. hot-desking or different localities)
*No time with colleagues, due to everyone being busy
*Worrying that the kind of help offered won’t be what was needed (e.g. “They’ll just give me even more to do!”)
*Competitiveness between team members
*Not trusting/valuing the opinions and ideas of colleagues
*Previous negative experiences of seeking help from colleagues (either in current or previous roles)
*Experiences of seeing other help-seeking colleagues being helped in “unhelpful” ways
*Team members beliefs about their competence and help-seeking (e.g. “I should be able to do this work on my own”; “I should know what I’m doing by now”; “I can manage this on my own”; “I don’t need help from anyone”; “Asking for help from others is weak”)
!!How to develop a culture of help-seeking within a team
We talked about the importance of a team having a culture that explicitly supports and encourages help-seeking between team members. Members of the team should have a sense that “This is how we do things round here; we ask for and offer each other help with our work”.
In terms of how this might be established, we spoke of the importance of team members having conversations with each other about how they will establish help-seeking as part of their culture, in terms of how this might look within their team.
Part of the rationale for having an explicit culture of help seeking and help giving came from us reflecting that although teams usually have formal structures via which team members could seek/receive help with their work (e.g. team meetings, case discussion meetings, supervision, reflective practice groups), these tend to occur at set frequencies, rather than being available to team members when they might need them. In this sense, the help that these meetings provide (setting aside whether or not these meetings are experienced as helpful by team members) is not necessarily contingent on when a team member might be in need of help. We reflected that the kinds of dilemmas and challenges that workers face when working with hard-to-reach young people and their families are usually ones that require a fairly quick response (whether that be helping a worker to talk through difficult feelings after a stressful visit; a family calling up because they are experiencing a crisis etc), where waiting for the next scheduled meeting would not be effective or practical.
!!Beliefs that support help seeking within teams
We brainstormed some of the helpful messages/beliefs that might support team members to feel ok about help-seeking and help-giving
*It's ok to talk about being stuck
*It's ok to say that you don't know something or aren't sure what to do
*It's ok to ask for help
*It's ok to accept help
*It's ok to offer help
*It's ok to say if you're not managing
*It's ok to talk about your feelings about your work
*It's ok to ask someone about their feelings about their work
*It's ok to say if you feel you've made a mistake
!!Working out ways to get help
*Teams may wish to make an agreement about how and when to use the [[Thinking Together]] framework to get help with their work
*Teams may wish to come up with a system so that someone is always available to offer help if needed (e.g. a rota or on-call system)
*Teams may wish to come up with informal systems for checking in with each other (e.g. team members enquiring how visits/meetings have been when team members return to the office)
*Teams may think about how they might use phone calls to get help from other team members (e.g. calling another team member from a session if stuck; having a conversation with a colleague on speaker phone so that the family can be part of the conversation too; calling a colleague after a stressful visit to debrief or discuss dilemmas)
*Having a designated area of the office/team base where team members can sit with a colleague if they want to discuss a dilemma (to prevent stress spreading through the team)
!!Maintaining a help-seeking culture
We reflected on the importance of new team members having a “cultural induction” as part of their introduction to the team, so that they had a good understanding of the values that underpinned how the team behaved towards each other and examples of the behaviours that arose from these values (e.g. “We value help-seeking here, so you’ll notice us asking each other for help with our work, people offering to help others with their work and team members being open to accepting help from others with their work”), enabling new team members to become part of the help-seeking culture and support its continuation.
Teams may also wish to review how they are doing with regards to maintaining a culture of help-seeking by discussing this at team meetings. Teams may wish to reflect upon times they are doing help-seeking well, as well as missed opportunities for help-seeking within the team and ways in which they might improve this.
!!Unconference conversation 2016)
A full and lively discussion.
* ''Difficult to give a Yes/No answer!''
** See [[Is AMBIT evidence based?]]
** There is "No such thing as an AMBIT team" - only [[AMBIT-influenced]] teams
** AMBIT is not a "therapy" as much as a //service improvement intervention//, although there is much manualised practice available.
* ''What "level" of AMBIT's actions are you asking about?''
** Aggregated individual treatment outcomes?
** Systemic changes?
** AMBIT as an influence on socio-political change?
* ''Evidence-based COMPONENTS of the model''
**MBT
**MBT-A
**MBT-F
* ''Discussion of recent/future PUBLICATIONS''
** See [[Academic references]].
!!Unconference 2016
A busy and lively discussion:
''Recognising the benefits and challenges (risks) of training'' (in any team-based approach, including AMBIT):
* ''Benefits:''
** Developing a shared team approach
** Joining a [[Community of Practice]]
** Evidence of Effectiveness and acceptability by other teams
** etc
* ''Risks:''
** Implicit challenge to current/previous investments (personal and organisational) in training/expertise/protocols/regimes
** Eg in Wandsworth there had already been serious investment in developing [[Signs of Safety]] as their approach to safeguarding practice, and there was concern that AMBIT //must not in any way undermine or confuse these well-functioning methods and approaches//. This principle was "built in" to the trainings conducted there from the very first sessions.
** Eg individual practitioners who have spent years (and often made personal financial investment) in training in specific models of therapy, and who have a high level of competence in these practices.
*** AMBIT as a "container" to create conditions for (almost any?) evidence based treatment to bring about sustainable therapeutic change, rather than being a "uni-modal" treatment-in-itself.
* ''Thinking about "professional boundarizing"''
** Is this about Quality Assurance? Sometimes, yes.
** Is this about the holding of power and "protectionism"? Sometimes, yes.
* ''Mentalizing other forms of experience''
** Examining constructs (ours, and others') is //hard work// ([[Mentalization]] is a form of work = brain activity!)
** Expertise from "other" professions/training may act as a vital life-vest for individuals in the face of an "austerity storm".
** Understandable sensitivity if one's role/specialist skills are seen as being threatened.
* Importance of marking the existing experience of a team at any training outset
** See the [[Elevator Pitch]] exercise
** ''Consider parallel process''
*** In working with a family or young person
*** Strengths focus
!!What is mentalizing, really? (Unconference conversation 2016)
Participants offered some favourite definitions of mentalizing:
*Seeing situations from another person's perspective
*understanding BEHAVIOUR - and the function of it - that of others and of ourselves
*seeing life through someone else's eyes - in order to understand behaviour
Then, participants shared some language they use to promote mentalizing in others:
*"What might it be like for your mum seeing you like this?"
*"If you were a fly on the wall/an alien/an outsider what you think/say about this?"
*Mirroring
*Modelling mentalizing - sharing our thoughts, sharing the experiences of others, pair work (modelling mentalizing conversations in the room), canine work
Thoughts on how to create the conditions for a young person to get their mentalizing going:
*change environment
*Wait until affect lowered before attempting. Time out. Choose your moments - you might want to have the conversation now, but it is going to be better in the long run to wait until a time when the young person is in a mental state
*Change subject - to lower affect (have a contract in advance about managing this. Agreement about use of humour)
*sensitive attunement - giving the experience of being mentalized -> epistemic trust
!Purpose of training session
* To facilitate team discussion on evidence-based practice
* To explore how we do this already
* To foster [[Respect for Evidence]]
!Suggestions
* ''Break into small groups for initial discussion''
** Discuss how you use [[Evidence]] in your work already
** Consider how evidence shapes your work
** Consider how your work contributes to evidence (Outcomes)
* Use the [[Fishbowl discussion]] technique
** To share the thinking of these small groups
* ''Listen to a lecture''
** ''EITHER'' - Prof Peter Fonagy "Interpreting the Dodo Bird", found on the page titled [[Evidence]] (''N.B.'' This lecture lasts for an hour and you may wish to skip the early section where Peter describes Mentalizing)
** ''OR'' - Brief discussion about Evidence by Peter Fuggle and Dickon Bevington (see [[Respect for Evidence]])
* Break into small groups again to discuss this material:
** Use [[Fishbowl discussion]] to share thoughts
!Manualize
Can the team boil down a few short "bullet points" of learning from these discussions?
''For instance:''
* How do we go about balancing learning from our local [[Outcomes Vs. learning from developing research evidence?
* How are we use [[Outcomes measures|Evaluating outcomes]] to currently gather local evidence
** How do we //review// what we are measuring?
** How would we arrive at new measures of "what matters" to the work of this team?
The initial [[Engagement]] tends inevitably to be the period of greatest intensity of staff input - perhaps even requiring two [[Key Worker]]s to be present, especially if there is a risk of violence (see [[Violence]]) and before basic trust has been established. Remember that a core task is to try to establish some form of [[Secure Base]] phenomenon in the relationship between young person and [[Key Worker]]. Frequency of contact and [[Reliability]] are two powerful aides to this.
!!What frequency of contact hours are expected, when?
This is dictated by feedback from the young person and the [[Key Worker]]'s own assessment of risk, etc.
!!When would you move from two [[Key Worker]]s to just one?
As soon as the situation is sufficiently predictable the [[Key Worker]]s should move towards providing lower level supportive contact - and ''this aim should be made clear from the very start'', in order to:
#Reduce the likelihood of claustrophobic [[Anxiety]] and the paradoxically //increased// aggression that this can trigger.
#Set the scene for building [[Self-efficacy]] within the young person and their existing network (one of the [[Core Features of AMBIT]] is a focus on [[Scaffolding existing relationships]].)
!!''Restrictions''
All written material contained herein remains the copyright of the [[Authors]], and all rights are reserved.
!!''Released under license:''
<html><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">AMBIT</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://ambit.tiddlyspace.com/" property="cc:attributionName" rel="cc:attributionURL">Dickon Bevington, Peter Fuggle, Peter Fonagy, Mary Target, Eia Asen, Neil Dawson, Rabia Malik.</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>.<br />Permissions beyond the scope of this license may be available at <a xmlns:cc="http://creativecommons.org/ns#" href="http://annafreud.org" rel="cc:morePermissions">http://annafreud.org</a>.</html>
!!''Summary of terms:''
''You are free:''
* to Share — to copy, distribute and transmit the work
* to Remix — to adapt the work
''Under the following conditions:''
* ''Attribution'' — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
* ''Noncommercial'' — You may not use this work for commercial purposes.
* ''Share Alike'' — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
''With the understanding that:''
* ''Waiver'' — Any of the above conditions can be waived if you get permission from the copyright holder.
* ''Public Domain'' — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license.
* ''Other Rights'' — In no way are any of the following rights affected by the license:
** Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations;
** The author's moral rights;
** Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights.
''Notice'' — For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to the Creative Commons webpage defining this licence, [[here|http://creativecommons.org/licenses/by-nc-sa/3.0/]].
!!''Software licensed separately''
The software in which the manualization is recorded ([[TiddlyWiki]]) is a freely available 'Open Source' development, licensed separately under slightly different (more open) terms. We gratefully acknowledge that its modification for this manual has been kindly supported in a non-commercial open-source collaboration by its inventor Jeremy Ruston and his colleagues (particularly Jonathon Lister, Nick Webb) at [[BT Osmosoft|http://www.osmosoft.com/]].
!!''Your privacy''
You can see the AFNCCF privacy policy [[here|https://www.annafreud.org/your-privacy/]].
As the title suggests, this is something that is easier to do in an outreach setting than an institutional one. It requires the use of a range of techniques drawn from a range of [[Specific interventions]], but the focus is powerfully on day-to-day //functioning//, and in particular functioning in respect of experiences that have intrinsic value and salience for the young person or family.
Focus on day-to-day tasks that the young person has identified as being relevant, and which their symptoms are interrupting. Apply [[Breaking down tasks into steps]] and you might also want to see [[Graded Exposure]], [[Progressive Muscle Relaxation]], [[Re-breathing]].
!!What is this for?
* Any team will hold a range of [[differences|Individual Differences and Disagreements]] (of opinion, of style, of training, of competencies, of personal histories, race, culture, sexuality, etc) - and these can be destructive, or enriching.
* It is an old and rather glib management consultancy motto that //"there's no such thing as a perfect worker, but there could be a perfect team"// - but it is reasonable to aim for:
** minimising the destructive potential in differences
** maximising the adaptability, range of responses and multiple perspectives that differences add to a team
!What to do
!!1. As an icebreaker
To elicit a sense of playfulness, reduce anxiety, and engage people in the activity of exploration and mentalizing.
* Start with some ''bland differences''
**e.g. Who has travelled the furthest/shortest distance to get here today? Last time you ate peas - most recent, longest
* ''Draw and imaginary line down the room'':
** Designate one extreme of the range for each end of the line.
** ''Ask people to line up'' in the correct order.
** ''They will need to debate and inquire'' of each other to find out where they should be standing.
* Now choose a slightly ''more personal'' feature:
** such as HEIGHT, or HAIR COLOUR (lightest to darkest) or HOURS OF PHYSICAL EXERCISE CONDUCTED IN LAST MONTH or HOW MUCH PRIVILEGE you experienced growing up...
** you will need to judge which feature could work best with the group from your knowledge of that group and the contexts, and //avoid selecting characteristics that could obviously cause hurt or offence// - nonetheless, you are inviting the participants into something more intimate and participatory
* ''Invite the group to reflect''
** on how there may have been more of an urge to position oneself towards the //centre// - rather than at the extremes - on this occasion
*** ''Teaching point:'' This might be analogous to the ADOLESCENT experience of social anxiety - we tend to want to avoid being outliers.
** on how one's expectations about where a colleague positioned themself might have been very different from the reality
*** ''Teaching point:'' The importance of humility (mentalizing is 'understanding misunderstandings') and the unknowability of human minds.
!!2. As a reflection on differences in the team
This is an exercise that //needs a whole room//, rather than just a single line
This exercise helps teams to explore their differences, and the value in their mix
!!''STEP 1:''
* ''Ask team members to line up'' against a back wall in the room along a dimension that defines an individual's stance in the work.
**Examples include:
*** (a) From ''"What really matters in this work is instinct that you're born with"'' to ''"What matters in this work is the capacity to learn evidence based practices"''
*** (b) From ''"I work with the head"'' to ''"I work from the heart"''
* ''Playfully... the extra rule!'':
** NOBODY IS ALLOWED TO STAND AT THE SAME POINT OF THE LINE AS ANOTHER - so participants have to debate and persuade and cajole each other as best they can to stand as near to the position they would ideally have liked to be in.
** Emphasise (to reduce anxiety in participants) that //"This is just where you are TODAY, under these particular conditions, and if we did this exercise again tomorrow, you might be standing somewhere different in the line!"//
!! ''STEP 2: Invite people to notice and reflect'':
* (1) How they may have ''found themselves [[Positioned|Positioning Theory]]'' in a place that was not exactly where they wanted - or would choose - to be
** Reflect on how teams work like this - we may find ourselves occupying a role for the team that is not exactly as our 'natural self' would be.
* (2) How some people in the team may be ''standing in places far from where we expected them'' to place themself
** Reflect (privately!) on why that may be so - have they been 'positioned' there by the dynamics of the team, or have you misunderstood them, or might they have misunderstood themself? DO NOT CHALLENGE your colleagues, or hold onto this in an unhelpful way!
!!''STEP 3:''
* 'Invite people to ''hold their position in the line-up they have just made but now to walk forward from there'' (or stay still) a//long another imaginary scale //that defines their position as regards //how they see change occurring in a team's practices//:
** From:
*** '' Where they already stand = TOP-DOWN change:'' "people only change ultimately because the senior management order them to ('you will be sacked if you don't!')"
** To:
*** ''Opposite end of the room = BOTTOM UP change'' "people only change when they are part of a common shared culture of 'we do things like this nowadays, not like that'"
This will result in a room that has the whole team relatively spread out across the whole floor space.
!!STEP 4: invite more reflection:
* Are there surprises in where people are standing?
* If you were to be curious about another position, what would you want to understand?
* What do you think they see as the pros and cons of being where they are?
* ''Now - Imagine'' that you could have this same team but have every single member //standing exactly on the same spot where you are standing//
** What would be better about such a team?
** What would be worse? (the idea of the 'footprint' of a team as represented by its spread across the floor of the room - a LARGE footprint is less likely to 'sink in the soft sand' of this work, and may create more steadiness/adaptability for the team - //but only so long as all the team members remain [[well connected|Keyworker well-connected to wider team]]//!
''Reflect on the benefits of diversity in a team'' - how people in more 'extreme' positions might enable effective work that more 'conventional' positions might not extend to, but might also only be able to hold these positions because of the stability and support that others provide from their positions.
!!STEP 5: (optional extra):
* Ask one or two representatives at the furthest extremes of the positions to 'make a sales pitch' to help others understand 2 things:
** 1. //''why'' I am where I am?//
** 2. //''what it is like'' being here?//
!!STEP 6: OPTIONAL FURTHER REFLECTION - on using this exercise to help with splitting in a team:
* Invite the team to //imagine// (a training event is probably not the right time to do this 'live'!) repeating this exercise but with a more contentious issue as one of the 'dimensions' that people are asked to line up around:
* Could this be a technique (even conducted as a 'thought experiment' rather than in 3 dimensional space!) that would help the team to mentalize each other's positions?
** If the split in the team is around a "yes or no" issue, ask people to line up in terms of ''how firmly they hold one or other position'', emphasising the sense that mostly our certainty about these questions is somewhere on a continuum; there are few stark, easy choices.
** ''Consistently emphasise the intention in the exercise'' which is to// help keep people mentalizing each other's positions//
** This means ''keeping affect under control'' and moderating our language, etc!
** Remind (literally //"Re-mind"//) people that [[mentalizing doesn't necessarily mean agreeing!|Individual Differences and Disagreements]]!
A Link is what you clicked to open this new Tiddler from within the last one; Links take the form of ''Highlighted Words'', and anyone familiar with the internet will know what they are. A single click on the word opens the linked Tiddler ( think of it as a 'page' or 'note').
In general a ''Link denotes an immediate and specific association'' between material in one page and material in the linked one, whereas ''[[Tags]] denote thematic connections under which a whole range of sub-topics may sit''
>Think of Tags as chapter-headings, and Links as footnotes, if you like.
You can check which other Tiddlers have Links to the one you are reading by clicking on the INFO section (accessed via the downwards arrow of the individual page menu.
!!Creating links when editing content
When you are editing content, use double square brackets around a word or phrase to create a link, like so:
{{{[[double square brackets]]}}}
This format in the wiki gets 'read' by your browser to create a link to a page (called in this case 'double square brackets'.
!!A Handbook for interprofessional practice in the human services : learning to work together. Edited by Brian Littlechild and Roger Smith. Routledge 2013
This is a really comprehensive review of what AMBIT calls network working by two professors of Social Work. It provides many examples of the themes we have tried to articulate in AMBIT and is highly recommended.
The first chapter reviews many of the familiar challenges of this area. Fr example on Page 19 the authors state
"the important skills to develop are the ability to recognise when each other's contribution is appropriate, and to hand over work as and when it makes professional sense to do so. @@color:red; Underlying this, in personal terms, it is also necessary to build up mutual trust and confidence in the other's abilities." @@
"the centrality of the service user helps to underpin common commitments and focus practice accordingly." (Page 20).
"the starting point must be a genuine and active commitment to from participating agencies. This provides the basis of support which practitioners will require in order to feel comfortable about @@color:red; sharing ideas, taking professional risks and, sometimes admitting uncertainty and asking for help."@@ (Page 21)
Chapter 2 takes a more historical focus on multiagency working highlighting the role of serious case reviews in highlighting difficulties but offering repeatedly similar solutions.
Recognition for the limited evidence for the effectiveness of interagency working.
The role of complexity. Complexity has two features. Complexity created by specialist forms of help and complexity created by the interconnection of life problems for clients.
Overall the book lays out the many difficulties of interprofessional working, both across agencies and across professions. It does not propose simplistic solutions and includes the role of relationships in effective practice. This is a useful reference book to exploring familiar difficulties in network working.
!Purpose
To explain what is Living Skills training, and why we do it, outline the process of delivering living skills training, and lay out access to RESOURCES.
!What, and why?
Living skills is a broad topic - being //that set of skills that a young person needs to negotiate successfullly through his or her social ecology// - prtactically-speaking it is about being able to keep oneself safe, healthy, and economically secure, as well as to negotiate the social world of relationships and work successfully.
Obviously, there are some very general skills that relate to //most// young people, but equally there are some skills that are very specific to particular cultures, or local areas.
Local teams may wish to adapt this content to suit local needs.
There is a lack of robust evidence that ONE program is defiitively more effective than OTHERS, but some evidence that methodical approaches to cover core material is helpful. There are many resources that can support this work, and many different programs that lay out how to deliver the material.
!!!Why intervene?
Here Prof David Fowler talks about early social disability. In thinking about early PSYCHOTIC symptoms, Prof Fowler's research shows very clearly that it is ''early social disability'', often a "mess of symptoms and social problems", that is the key warning sign and the poorest prognostic sign... what's required is a fully integrated service...
This is a talk from the [[MAP conference in Norwich, november 2012|http://www.map.uk.net/pages/2013/01/04/map-conference-working-with-young-people-neglect-and-abuse-watch-the-film-of-the-speakers/]] about ''Working with young people, neglect and abuse''. See in particular the section around 5mins 48 seconds for the significance of //social disability//.
<html> <object width="640" height="360"><param name="movie" value="https://youtube.com/v/pgagb132hEs?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/pgagb132hEs?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!Setting a curriculum
In keeping with a [[Mentalization]]-based approach, the first step is to engage the young person in helping to determine the appropriate skills to focus on. There are of course unlimited skills that //could// be taught.
Often, living skills training that arises from lived experience (or things that have 'gone wrong') is more effective:
>//"I can see you've run out of money again, and that is a real drag for you. Would it make sensed for us to set aside some time to think about budgeting?"//
>//"You are telling me about how easily you get into relationships where you are pushed around, or even bullied. Would it make sense for us to spend some time practicing what some people call 'assertiveness'?"//
!Proactive prevention
Of course there are key living skills that should be 'in place' immediately, to avoid serious risks in the future. Workers will want to have a curriculum of key areas that they may be able to 'dip into' (perhaps an example of the [[QuickWins]] that can help to maintain momentum in the work).
!Suggested 'core curriculum'
*Sexual health and safe attitudes to sex
*PsychoEducation about Drugs and Alcohol, Mental Health and General Physical Health (diet, hygiene, etc).
*Using Health Services (registering with and making appointments with a local doctor, etc)
*Basic budgeting, and access to appropriate benefits.
!Resources
For ''Safe Sexual Health'' interventions see: [[NICE - Sexual Health Guidelines for Youth]]
For advice on reducing sexual exploitation see: [[Safeguarding Children and Young People from Sexual Exploitation]]
Resources include a large and useful collection of worksheets at the Dept for Education and skills website (UK government) - you will have to register to download these materials for use, but they are free.
An external link to the list of topics is [[Here|http://rwp.qia.oxi.net/embeddedlearning/skilled_health/contents_list.cfm]], and the Homepage of the ~DfES 'Embedded Learning Portal' is [[Here|http://rwp.qia.oxi.net/embeddedlearning/index.cfm]]. We embed the topics list directly below:
<html><div align="center"><iframe src="http://rwp.qia.oxi.net/embeddedlearning/skilled_health/contents_list.cfm" frameborder="0" width="100%" height="600"></iframe></div></html>
<a class="tc-float-right">[img width="150" [Liz manual.jpg]]</a>
!!!Joint Programme Lead
Liz Cracknell is Joint Programme Lead for the [[AMBIT programme]] at the [[Anna Freud National Centre for Children and Families]]. Liz is a Registered Mental Health Nurse and Systemic Practitioner. In her clinical work, Liz has specialised in work with young people with complex, risky problems, utilising the AMBIT approach. She currently also works as AMBIT Consultant at [[Redthread|http://www.redthread.org.uk/]]. She has contributed to a number of key publications and the development of AMBIT and has trained and consulted with hundreds of workers in AMBIT in the UK and internationally.
<div style="clear:both;line-height:0px;"></div>
!This is an experimental page - ignore for the time being!
<html>
<head>
<style>
.button {
background-color: dodgerblue;
border: none;
color: white;
padding: 15px 25px;
text-align: center;
font-size: 16px;
cursor: pointer;
width: 100%;
}
.button:hover {
background-color: grey;
}
</style>
</head>
<body>
<$reveal type="nomatch" state="$:/state/SampleReveal4" text="show">
<$button class=button set="$:/state/SampleReveal4" setTo="show">AMBIT Engagement Call</$button>
</$reveal>
<$reveal type="match" state="$:/state/SampleReveal4" text="show">
<$button class=button set="$:/state/SampleReveal4" setTo="hide">Hide</$button>
In order to assist with the process of establishing whether the AMBIT Programme can be of help to a team or service, we follow up initial enquiries by scheduling an engagement call. This is a 30 minute telephone conference call between you (it can be more than one person as relevant) and either the AMBIT Programme Lead or Deputy Lead.
More information on engagement calls can be found [[here|Engagement call]].
</$reveal>
<$reveal type="nomatch" state="$:/state/SampleReveal1" text="show">
<$button class=button set="$:/state/SampleReveal1" setTo="show">AMBIT Consultation Day</$button>
</$reveal>
<$reveal type="match" state="$:/state/SampleReveal1" text="show">
<$button class=button set="$:/state/SampleReveal1" setTo="hide">Hide</$button>
An AMBIT consultation is offered as standard to all teams enquiring about undertaking AMBIT training, after the initial engagement call. The broad purpose of the consultation day is to reach a shared understanding with a team (or organisation) about whether embarking on AMBIT training will be useful to them and if so, what the training objectives might be. The meetings can involve senior managers, clinicians and all staff due to attend a training. The day will be facilitated by two trainers from the AMBIT Programme, one of whom will be the AMBIT Programme Lead or Deputy Lead.
</$reveal>
<$reveal type="nomatch" state="$:/state/SampleReveal2" text="show">
<$button class=button set="$:/state/SampleReveal2" setTo="show">AMBIT Training</$button>
</$reveal>
<$reveal type="match" state="$:/state/SampleReveal2" text="show">
<$button class=button set="$:/state/SampleReveal2" setTo="hide">Hide</$button>
stuff about different training routes here
</$reveal>
<$reveal type="nomatch" state="$:/state/SampleReveal3" text="show">
<$button class=button set="$:/state/SampleReveal3" setTo="show">AMBIT Supervision</$button>
</$reveal>
<$reveal type="match" state="$:/state/SampleReveal3" text="show">
<$button class=button set="$:/state/SampleReveal3" setTo="hide">Hide</$button>
Train the Trainer Supervision
Team members who have attended the Train the Trainer course receive six hours of supervision from a Lead AMBIT trainer to support the implementation of their local AMBIT training plan. The supervision can be split as the team sees most helpful i.e. 6 x one-hour conference calls, 12 x 30-minute calls, 2 x 3-hour face-to-face meetings at the Centre
Individual and Group Supervision
AMBIT-trained individuals/teams can request bespoke individual or group supervision packages from the AMBIT programme, to assist with their implementation of AMBIT. These are usually 60 minute sessions, either face-to-face at the Anna Freud Centre or by telephone, set at a mutually agreed frequency and duration.
More information on AMBIT supervision packages can be found here.
</$reveal>
</body>
</html>
!!!!//Note: Local Facilitator Training was previously known as AMBIT Train the Trainer.//
This page lays out the training schedule for one of the <<tag [[Modified training plans]]>> which is an alternative to the well established AMBIT Basic Five Day Training.
There is also an [[International Train the Trainer (TTT) Model]] that compresses the dispersed training days from this model into a single week, with web-based supervision to support [[AMBIT Local Facilitators]] once they have returned to their local teams.
Below is a dropdown list which includes ideas for local training sessions, [[Local TTT Videos]] and all the things you need to know about LFT.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Local Facilitator Training (LFT)- training model'>>
</div>
!!''The Model and Rationale''
LFT involves 5 days of training for a new role - [[AMBIT Local Facilitators]]. There are some FAQ's specifically for this role: <<tag [[LOCAL trainers FAQs]]>>.
Training is divided into two blocks in the standard LFT, but compressed into a single week in the [[International Train the Trainer (TTT) Model]]. Between the blocks of training, [[AMBIT Local Facilitators]] will be training their local teams (see [[Local Training Sessions: some core ideas and structure]]) - ''the intention is to support better implementation'' by developing ''more local ownership'' of the model and training, and ''leaving teams with more local expertise'', supported by extensive [[training materials|Training exercises]] in this manual, post training supervision with an AMBIT trainer and by other local facilitators via the [[Community of Practice]].
supported by and other materials in this web-based manual.
!!!Basic training stance for the AFC's training for trainers
2 trainers are present at any time:
* One in the role of ''"Training"''
* The other in the role of ''"Training to train"''
!!!''Pre-training phase''
* Teams wanting to embark on this must follow the [[AMBIT Training Application Process]]
* Managers from the teams MUST attend an Engagement meeting in order to:
** Ensure full managerial support
** Clarify the team's [[Post-training outcome goals]]
** Clarify dates, etc
* [[AMBIT Local Facilitators]] are selected. Teams put them forward, AFC team oversees selection based on combination of ''criteria'' and ''local recommendations'':
** Have some authority in the team
** Enthusiasm for the model and role
** Have some experience of delivering training
** Moderate confidence in using a web-based app
* Teams receive and complete set reading list before the first training day:
** [[Bevington D, Fuggle P (2012) Supporting and enhancing mentalization in community outreach teams...]]
** [[Bevington et al (2012) Adolescent Mentalization-Based Integrative Therapy (AMBIT)]]
** AMBIT book (when published!)
!!!''Training Schedule''
*Training Block One (days 1-3 at AFC)
*Training Block Two (days 4-5 at AFC, 6-8 weeks after Block One).
!!!Suggested Local Sessions Run by Local Facilitators Between Blocks
Between blocks 1 & 2.
* [[Local Session 01: What is AMBIT?]]
*[[Local Session 02: What is AMBIT training for?]]
*[[Local Session 03: Mentalization]]
Post-training sessions
*[[Local Session 04: Working with your Team]]
*[[Local Session 05: Working with your Networks]]
*[[Local Session 06: Working with your Client pt. 1 (Mentalizing stance)]]
* [[Local Session 07: Working with your Client pt.2 (Hard to reach)]]
* [[Local Session 08: Review (1) and Auditing Team Practices]]
* [[Local Session 09: Working with your Client pt.3 (Outcomes)]]
* [[Local Session 10: Review (2) and Top-up plans]]
* [[Local Session 11: Making a real difference - Implementation Science]]
!!!Supervision
* Remote supervision with a named AMBIT trainer to support training, implementation, and practice
* Monthly 30 minute telephone supervision sessions using our teleconferencing system
* Once a quarter the monthly telephone supervision will be replaced by an hour-long webinar using our web-conferencing system. You can dial in to this on the telephone if you are not able to access the web conferencing platform.
!!!'' One year Review and Consultation''
* LFT-One Year Review and Consultation Meeting - this will be developed as the first training progresses so as to adapt to the needs of the pilot group
** At the AFC?
** Locally?
** Who to attend? Whole teams? [[Implementation Team]]s? Needs clarification over the course of the pilot project.
!!!''Additional issues and considerations ''
A [[International Train the Trainer (TTT) Model]] exists, similar to this model, but the 5 AFC training days are completed consecutively over the course of a week, with the in-house training occurring afterwards with online supervision to support this.
The [[AMBIT Lead peer-to-peer system]] is intended to support this model; whereby [[AMBIT Lead]]s and [[AMBIT Local Facilitators]] from different local teams are paired together - so that they can attend each others’ ‘in house’ trainings (preferably on a //quid pro quo// basis to reduce costs to local teams), helping to train neighbouring/other teams as well as their own, and in so doing offering a supportive outside perspective.
The following ideas were generated by the first Train the trainer group when asked to consider the type of difficulties that may emerge in trying to train up their respective teams in some of the AMBIT approach.
There was discussion as to whether the word 'training' itself is quite unhelpful and creates a defensiveness among some staff. Alternatives around calling it staff development etc were considered.
!!! A summary of possible barriers to AMBIT implementation from this discussion are listed below
*Insufficient meeting times with the team
*Uncertainty about core outcomes of the work
*The work is emotionally exhausting and peole dont have time/motivation to consider change of practice.
*The staff group have too different a range of training and experience
*The problem of balancing individual autonomy with need for shared approach
*An understandable cynicism about new initiatives
*A reluctance of staff to follow new ideas that may not immediately fit their context.
*The work is dominated by the problem of really engaging young people and their families
*Other organisational challenges dominate the agenda e.g. security of employment.
*Organisational objectives may be inconsistent with the AMBIT method such as short term interventions.
*Staff team dynamics sometimes dominate more than methods of working
*Consistency of practice across a team is very hard to achieve
*Families and staff may not like the mentalizing approach.
The following tiddlers were imported:
# [[Implementation plan template .docx]]
This is a tag collecting a tasklist of pages that a Local team that wants to [[manualize|Manualization]] its work can use and add to.
!!Existing tasklist for manualizing:
Here's the list of sub-topics that require local editing by team:
<<tag [[Local Manualizing Tasklist]]>>
*Use this as a running to-do list for the team's [[Manualization]] sessions
*There are some pages already tagged that teams might find helpful to get them started
!!How to log a NEW local manualizing task
* First, make sure you are [[logged in|Log in]] with editing rights for your manual
* Next, click here: <<tag [[Local Manualizing Tasklist]]>>
* Select and click the item in the drop-down menu: ''"Create new tiddler as a sub-topic"''
* This will generate a new page (sorry, the wiki calls pages "Tiddlers"!)) that is pre-tagged as local manualizing task.
* Give this new page a title, and put a few notes in the content section to say what is required (when the team has time to do some [[Manualization]] as a group activity.
* Click done (the tick) - you have a new task!
!!''Getting on with manualizing''
Go to [[Manualization]] to get started with Manualizing. If you are unsure about the process of editing content see [[How to edit your team's manual]]. REMEMBER THAT EDITING [[Your Manual]] is A WHOLE TEAM'S RESPONSIBILITY, so ensure that you have authority to make any changes.
!!Local Teams - manualizing is a TEAM task...
Local protocols should be edited or added by local teams as they create their own [[locally-adapted Manual|Your Manual]]. Be bold! You can edit existing content, overwrite material, add brand new material. Local teams remain clinically responsible for their actions.
!!Tips for team editing:
1. Click on the tag <<tag [[Local Protocols]]>>here, and select "Create new Tiddler" you will generate a new tiddler ready to edit that is already tagged with 'Local Protocols'.
2. [[Tag|Tags]] any new material that you author with:
{{{[[Local Protocols]]}}}
to gather them all together as sub-topics of this heading, and consider other tags you might want to add, to link your protocol in to other content in the manual.
3. ''Examples'' of useful local protocols particularly include ''real problems that have recently come up for the team, or that are likely to come up again''. E.g.:
*Child Protection Referral pathways
*Local agreements on how to [[Use the Mental Health Act]].
*Local Prescribing guidelines
*Transitional care protocols
!!!1. Agreeing the task.
The broad task in this session is to introduce the team to the overall AMBIT approach, namely the core process of mentalization and the four segments of the AMBIT wheel. ''The learning objective of this session is to enable all members of the team to know the basic framework of the approach, and to have an experience of this that //'speaks to our condition'// rather than being seen as an imposition from a detached place claiming expertise.''
!!!2. Explaining the issue.
The basic framework for AMBIT needs to presented in a didactic way. This can be done either by using video presentations which are located in [[AMBIT: an overview]] or [[Core Features of AMBIT]]. Trainers may want to prepare their own presentation using pages from the manual and these two pages will provide a lot of linked pages to produce such material. There is always a risk of information overload with this part of the training and trainers need to balance how quickly this material can be presented on the basis of what is already known about the model.
!!!3. Practicing.
The suggestion here is to be playful and provide the team with opportunities to actively engage with the material. A number of suggestions are made as to how to do this.
#Invite the team to work as pairs and have a conversation to identify the part of AMBIT that they found least easy to understand. Invite feedback to whole group to get an overall sesne from the team.
#Invite the team to work as fours. Remove the wheel from view and ask them to draw it as well as they can remember.
#Invite team members to consider what things they do already which link to the four quadrants of the wheel.
#For this session, it may be helpful to consider that the manual is an aid to remembering the AMBIT model. The group may benefit from looking at the [[User Guide]] and begin to have some ideas about how they would want to use the manual themselves as a resource for learning and development.
!!!4. Reflect
For this session, there is likely to be a lot of overlap between practicing and reflecting on the session. The key intention is to give the team a map of the model that is reasonably simple and can orientate learning for the future. It is helpful to explore how much the AMBIT wheel provides a useful visual diagram of the model and whether this is experienced as helpful or confusing for the team.
!!!5. Manualize
Write a sub-page of the [[Your Manual]] about some first thoughts as to how the team would like to start becoming familiar with the manual.
!!1. Agreeing the task.
The broad task in this session is to develop an understanding of the expectations of the team about training //that is embedded in their own experience of the work they do//; to explore the team's current experience of learning i.e. what is helpful and what is not helpful in enabling people to develop ideas and skills about their work. ''The learning objective of this session'' is to map out the existing working experience of the team and to identify both opportunities and barriers for the team for on-going development and learning. To identify and mark //shared intentions// across the team about //"how we want to move forward in what we do together"//.
!!!2. Explaining the issue.
The basic framework of AMBIT needs to be presented to the group in a somewhat didactic way, but the key message is that ''AMBIT is not a monolithic, rigid, command and control approach to "how to do it"'' - but is more //a framework to support teams to develop and learn from their own position of local expertise//. So it is critical that teams have some of their own thoughts and shared understandings of (a) what they feel they need to ''preserve'' in the ways that they work, and (b) what areas they feel they might benefit from introducing ''change'', or simply clarifying agreements across the team about. AMBIT does have a "curriculum" (see [[Core Features of AMBIT]] and the [[AMBIT Competencies]]), and provides a clear framework and coherent theories and practice that are based in evidence and which have been roadtested by many different teams working in a wide variety of settings, but it is at least as much about providing local teams with a platform for ''developing their own local expertise'' as it is about "telling people what to do".
Depending on the group this section needs to be allocated something between 30-60 minutes. In the page [[Core Features of AMBIT]] and [[AMBIT: an overview]] there are two talks by Dickon Bevington providing an overview of AMBIT. For teams with staff less familiar with the material, it is important to avoid a //theory bombardment// which can be quite aversive.
!!!3. Practicing.
Doing something active is essential in order to ensure that ''all'' members of the team have a voice. Not everyone will be equally enthusiastic about different parts of the work and the way the team operates etc, and this needs to be acknowledged. A number of activities are suggested and will depend on time availability.
''1. Recognising and respecting this individual variability'' is a key element of team training.
** Try using [[Line-ups - exploring individual differences]] to explore these.
** Simply acknowledging the likely reality, that in no group of people are there likely to be identical thoughts and feelings about new material.
** Simply stating the intentions for this exercise (here you are [[Broadcasting Intentions]]) - as helping identify shared //intentions// within the team about //"how we get better at what we are (already not bad at) doing"//.
''2. Learning takes place in the context of the overall experience of the job''
** See [[Developing learning organisations]] - the work of Peter Senge.
**Acknowledging the EXISTING EXPERTISE in the team - use the [[Team training session: what interventions do we do?]] to map the many existing interventions that the team already uses.
**Working in pairs, use [[AMBIT Pleasure and Pain at Work Questionnaire]] to explore current experience of work and then feedback to whole team.
** Creating a dialogue in the team about ''how we learn together'': [[Learning about Team Learning - a discussion exercise]]
** Documenting what team members want to learn, and what to preserve: [[What I would to like to learn and what should be preserved?]]
''3. Embedding learning in experience''
Depending on the time available, it may be enrich the way a team reflects on its working context by ([[Sculpting a network]])
** Consider typical stress responses in:
*** service users
*** practitioners
*** teams
*** systems
Look for cues in the material arising to help clarify where special emphasis might be required in the training to follow. In doing this, have regard to some of the [[Core Features of AMBIT]]:
* [[AMBIT: an overview]] - emphasising that AMBIT must help with:
** Stress in Workers (which is proper and normal, not shameful) = [[Working with your TEAM]]
** Hard to Reach Clients = [[Working with your CLIENT]]
** Complex networks (that easily, if unintentionally, deliver an //aversive// experience of care = [[Working with your NETWORKS]]
!!!4. Reflect
* Reflect on what emerged from the training practice that has the group has done.
* Review the existing team audit form ([[Pre-training team audit]]]) that was completed before the training.
* Are there ways to change from existing patterns of [[LEARNING at work]]. What feelings might this evoke in the team members?
* Review learning objectives of the session
!!!5. Manualize
Based on the team discussion, make a sub-page (see [[How to run a team manualizing session]]) documenting your team's discussion about either [[What helps a team to learn?]] or [[Train the trainer: potential barriers to achieving training objectives]] or [[Pre-training team audit]].
This page provides a brief outline of the third session to be run by [[AMBIT Local Facilitators]] or [[AMBIT Lead]]s with their own team. Materials needed for the session will be linked to this page for easy access. At the bottom of the page is a session plan for a three hour training session which is offered in a format which aims to make explicit the links between session activities and session objectives. Some trainers may find this way of planning sessions particularly helpful.
!!!1. Agreeing the task.
The broad task in this session is //to develop an understanding of the mentalization and the developmental basis of mentalizing.// It may be helpful to have a brief discussion about what people know about mentalizing already and about what people feel about the word 'mentalizing' which often causes difficulty. ''The learning objective of this session is to establish basic knowledge of mentalizing, the developmental aspects of mentalizing, the importance of mentalizing in human communication and its relationship to epistemic trust.''
!!!2. Explaining the issue.
The basic ideas of mentalization needs to be presented to the group in a somewhat didactic way. Depending on the group this needs to be allocated something between 30-60 minutes. In the page [[Mentalization]] there are two talks on video by Dickon Bevington and one conversation with Jon Allen from the Menninger Clinic. There are also slides that can be found from a link on that page that can be used to make your own presentation. For different groups, this material will be more or less familiar. For teams with staff less familiar with the material, it is important to avoid a //theory bombardment// which can be quite aversive.
!!!3. Practicing.
#Show the team the clip from the film Fishtank. [[Fishtank film clip]]. Invite the group to identify when characters in the film were mentalizing and when they were not. Have a team discussion about it.
#Do a role play involving the two trainers. Plan this beforehand and make it simple. One person play a young person who is being cooperative and the other plays a worker. See [[Advice about Role Playing]] in the manual.
#Watch film clip from [[The Therapist's Mentalizing Stance]] and identify times when client adopts a more mentalizing position and when she moves away from this.
!!!4. Reflect
* Reflect on what emerged from the observational practice that the group has done.
* Identify things that you do already which support mentalizing of both your self and others.
* Review learning objectives of the session
!!!5. Manualize
Based on the team discussion, make a sub-page (see [[How to run a team manualizing session]]) for either [[Mentalization]] or for [[The Therapist's Mentalizing Stance]] as to how mentalizing can be applied to your team and your work. .
!!More resources
*[[Training Exercises for Mentalization]]
*[[Session Plan for three hour training session on Mentalization]]
!!Agreeing the task
Map out existing ways that the team supports each other. Include both formal and informal aspects of the team culture. Supervision, team meetings etc. Not all of these will be particularly focusing on supporting mentalizing (about 10 minutes).
Introduce some AMBIT starting points taken from previous sessions. Mentalizing as something that is supported by relationships. Talking with person who one trusts is likely to help be able to make sense of a situation with a young person and reduce professional anxiety. Avoiding professional isolation with a case as isolation is likely to increase anxiety. Anxiety is an expected part of the work. In AMBIT asking for help is seen as a very positive part of team culture. Invite any comments about these starting points. Explain that ''the learning objective for this session is for the team to learn the skill of [[Thinking Together]], a technique which uses a mentalizing approach to shape conversations between colleagues about their work, that we suggest teams might want to adopt as part of their //local culture//.''
!!Explaining the issue
Use the exercise [[Passed-outwards Discussion]] to model the effects of anxiety on the transfer and reflection of important clinical information.
Provide a didactic explanation of ''Thinking together''. See the page [[Thinking Together]] as a key starting point in the manual. There are two brief (less than 10 minutes) video presentations on thinking together in [[Video introduction to Thinking Together]]
Then show the video of thinking together, thinking apart which is in the [[Thinking Together]] page.
!!Practice
See also [[Thinking Together - Training exercise]] - Practice thinking together in pairs or threes. Ensure that all people have a chance to practice. Working in threes allows for an observer who can monitor the four stages of the conversation and provide feedback. After each practice (usually about 5-10 minutes), take feedback. Practice again the other way round. Again, take feedback.
!!Reflect
#Whole team discussion. Enable full range of voices to be heard around this. Some people really like it but important that those who are less comfortable are heard. The aim here is to mentalize the actual experience of practicing this and not encouraging compliance.
#Identify specific situations when this technique may be applied as part of the actual practice of the team.
!!Manualize
Make a sub page (see [[How to run a team manualizing session]]) of [[Thinking Together]] for your team. This should capture some of the team's ideas and feelings around this practice, and then agree a plan about how the team will experiment with using this. The idea of experimentation may be useful here. The staff are not being required to sign up to something ''for ever!!'' but are invited to try something for a period of time and evaluate its value. If it does not add value, then it should not be used in the longer term. But such a judgement needs to be made on the basis of practice not prior belief!
!Agreeing the task
This session focuses on the right hand quadrant of the [[AMBIT Wheel]] - [[Working with your NETWORKS]] - and its corresponding stance features: [[Working in multiple domains]] and [[Taking Responsibility for integration]]. The overarching learning objective for this session is to understand the importance and challenges of working in multiple domains and to develop skills in addressing dis-integration.
Encourage the team to think about “what do we do here?”. What are the different ways of working with young people and families that we use in this team? You can use the activity described in [[Team training session: what interventions do we do?]]
!Explaining the issue
__1) Provide didactic teaching on the importance of working in multiple domains.__
See the following material:
*[[Why intervene simultaneously in multiple domains?]]
*[[Working in multiple domains]] (contains video material)
__2) Emphasise the tension between [[Working in multiple domains]] and [[Taking Responsibility for integration]].__
* Working in multiple domains often requires the involvement of multiple workers and agencies, which increases the risk of ''Dis-integration''. Provide didactic teaching on:
**[[Taking Responsibility for integration]]
**[[Addressing Dis-integration]] (contains video material)
!Practice
Help the team to think about network dis-integration in their practice by completing the [[Sculpting a network]] exercise. Follow this up with the [[Dis-integration Grid EXERCISE]] to introduce the [[Dis-integration grid]] as a tool to help workers to explore and address dis-integration. Introduce [[The AMBIT Pro-Gram]]. Workers could practice using this in pairs or threes.
See the tag [[Training Exercises for Taking Responsibility for integration]] for a selection of other exercises.
!Reflect
Facilitate a whole-team discussion in which workers are invited to share their thoughts about working in multiple domains and addressing integration. Make efforts to capture the variety of views.
Some not uncommon themes that arise from this session are addressed in the following [[AMBIT FAQs]] pages:
*[[I haven't got time to do this!]]
*[[If I am the KeyWorker, do I hold sole responsibility for everything?]]
*[[Are you asking people to work outside their competency/paygrade?]]
!Manualize
Click on [[How to run a team manualizing session]] to help you make a new page to record the team's reflections and to make a plan detailing how the ideas and tools discussed in this session will be used. Remember, the team doesn't have to commit to anything forever here. Your team may simply plan to practice using the dis-integration grid. It does help to formulate [[SMART goals]], however, that include when the plan will be reviewed.
<<image [[session 5 page 1]] width:600 height:480>>
<<image [[session 5 page 2]] width:600 height:480>>
<<image [[session 5 page 3]] width:600 height:480>>
<<image [[session 5 page 4]] width:600 height:480>>
<<image [[session 5 page 5]] width:600 height:480>>
<<image [[session 5 page 6]] width:600 height:480>>
!Agreeing the Task
This session concentrates on the top quadrant of the [[AMBIT Wheel]] which is [[Working with your CLIENT]]. The goal is to provide an opportunity for the team to share, learn and practice how [[Mentalization]], and particularly the [[The Therapist's Mentalizing Stance]] can support the work that team members do face-to-face with young people and their families.
In addition, it seeks to make clear the basic tension between two particular elements of AMBIT's principled stance (see [[Core Features of AMBIT]]) - which are [[Scaffolding existing relationships]] and [[Managing Risk]].
!Explaining the issue
(1) ''Talk about'' [[Scaffolding existing relationships]] - having an approach that focuses on identifying existing StrengthsResiliencies that might be built upon - elements of a young person's existing relationship to their self (pride in some skill, an existing capacity to be reflective, etc), to family members, friends, other professionals //that it would be important that we do not damage in our well-intentioned work.//
* It is important that a worker does not seek to replace these relationships with a "perfect alternative"
* Remember that as a worker, I will be leaving, and many of these other relationships will remain.
* Avoid making myself indispensible, and help develop [[Self-efficacy]] in the young person.
(2) ''Talk about the risks'' that prioritising and scaffolding these relationships entails. Many existing relationships will be far from "therapeutic", and the need for [[Managing Risk]] can sometimes get lost in a kind of "therapeutic omnipotence".
* Workers can become over-identified with their clients
* They can "up-regulate" their risk thresholds:
** convincing themselves that they shouldn't be a "worrier", or that they need to "keep up with the times" and accept that "this is how the world is..."
** convincing themselves that preserving their therapeutic relationship is more important than "calling time" on a risky situation.
(3) ''Talk about how AMBIT assumes that workers will ALWAYS be slightly out of balance'' in one direction, or the other, when they are treading this tightrope between [[Scaffolding existing relationships]] and [[Managing Risk]]. The point of attention to the [[SupervisoryStructures]] in [[Working with your TEAM]] is to get help in constantly correcting these inevitable imbalances, before they get dangerously large.
(4) ''Watch the video'' at [[The Therapist's Mentalizing Stance]] together.
* ''The point of the "four-legged stance"'' is for it to be SIMPLE, so practitioners can "hold onto it" in the hurly-burly of the face-to-face encounter, when our own mentalizing is likely to be challenged.
* ''The assumption of a worker'' should be that //"I WILL lose my own mentalizing at points in this work... I just don't know when... I don't WANT to do this, I just know that it happens..."// and the ''skill'' is then to be able to notice my own misunderstanding, and become curious (with the client) about how I came to get it so wrong. This is where we are modelling the fragility of our own mentalizing, to teach the client about theirs. ''It requires a sort of "confident humility" in the worker to do this.''
* Go through the four elements ("legs") and ''watch video examples of the techniques used'' to uphold these (remind people the video is NOT a "masterclass" but just a talking point, and an approach that they will need to find their own way of doing (more) authentically - mentalizing work is not about [[pretending|Pretend mode]] to be a mentalizing therapist!)
|bgcolor(pink): ''STANCE'' |bgcolor(lightblue): ''STRUCTURE & TECHNIQUES'' |
|bgcolor(pink):''1.'' [[The Inquisitive Stance]]<br>''2.'' [[Holding the Balance]]<br>''3.'' [[Terminating non-mentalizing interactions]]<br>''4.'' [[Highlighting and reinforcing Positive Mentalizing]]<br>|bgcolor(lightblue):Holding this stance, helped by the structure of the [[Mentalizing Loop]] <br>workers use a wide range of <<tag [[Mentalizing manoeuvres]]>><br> to create conditions in which the client can begin to think about <br>their own (or other people's) thinking/intentions, rather than<br> remaining caught "inside" their own (non-mentalizing) thoughts |
* Emphasise that it is a STANCE because the worker is always trying to "keep all four legs on the ground" - noticing what I am NOT doing, is as important as knowing what I AM doing.
!Practice
See [[Advice about Role Playing]] before going into this.
See [[Training Exercises for Mentalization]] to select an exercise, or try these role-playing options below:
''PREPARATION:''
Break into groups of THREE (or 4 with the 4th person as an observer, or "tag worker" ready to step in if the first worker "dries up".
''EITHER (A):''
* Get one person in the three to talk about a recent conflict they found themselves in (from clinical work, or their personal life if they are happy to discuss this).
* The second person acts as "therapist" and tries to apply [[The Therapist's Mentalizing Stance]] as they draw out the story, and work with their "client".
* The third person acts as an "anti-therapist" and (without being too obviously blunt!) deliberately intervenes on a few occasions trying to talk about it //without applying any elements of the stance//
** talking with //certainty// about the "client's" feelings and intentions
** ignoring any reflective/mentalizing that they do
** emphasising ONLY the feelings, without any of the beliefs/cognitions
** allowing the "client" to continue in "non-mentalizing" ways of thinking without interrupting/pausing/inviting them into a more mentalizing approach to the issue.
''OR (B):''
* Use the structure above but agree on a specific client in a particular scenario to role play
* Remember that once the role play starts, the client is the person in the room, not the "real person" they are modelled on "out there" - it is not helpful to practicing if one of the trainees keeps interrupting to say //"no, X would never say that!"//
!Reflect
Allow time for the team to reflect on:
* The extent to which they may already use a mentalizing stance - or may adopt it at times. Remember that all effective therapeutic approaches appear to have found different ways to help clients mentalize - the difference (if there is any) in mentalizing approaches is the explicit focus on this, and the fact that (with or without using the word "mentalizing" there is an effort explicitly to teach the client to recognise that they think in different ways at different times, and to "home in" on mentalizing in the here-and-now of the session.
* Where mentalizing may not be helpful (when the priority is [[Managing Risk]] is the most obvious - it is no use mentalizing a tiger as it walks towards you, its jaws dripping with saliva...)
* How might this approach augment the skilled work that they are already doing?
!Manualize
Go to [[How to run a team manualizing session]] for help creating a page of reflections from the team on:
* Key learning points that make sense in OUR local context
* Plans for how we are going to try out this material in practice
* A review date for when we will check back with each other
* (For the gold star:) [[Evaluating outcomes]] by which we could tell if this is having a positive effect on our practice. This might be very simple - a clinician-rated scale of 0 - 5 for "how much I applied (or tried to apply) a mentlaizing stance in this case" and another 0 - 5 for "how helpful was applying the mentalizing stance in this case?"
!A more formal training plan for a 3 hour session:
<<image [[session 6 page 1]] width:600 height:480>>
<<image [[session 6 page 2]] width:600 height:480>>
<<image [[session 6 page 3]] width:600 height:480>>
<<image [[session 6 page 4]] width:600 height:480>>
<<image [[session 6 page 5]] width:600 height:480>>
<<image [[session 6 page 6]] width:600 height:480>>
!!Agreeing the Task
This is the second training session on [[Working with your CLIENT]]. The previous session on this subject ([[Local Session 06: Working with your Client pt. 1 (Mentalizing stance)]]) focused on a stance, a structure, and techniques, which aim to support a young person (and their family) to mentalize about themselves and others. This second session focuses mainly on working with a young person ''who does not necessarily want to work with you'' and may be described as "[[Hard to reach]]". The aim of the session is to provide workers with a wide range of ideas to help them with this difficult problem which is often at the heart of the work.
!!Explaining the issue
As a starting point, we would want to emphasise that being [[Hard to reach]] and not seeking help for severe and major difficulties is not an indication that the young person is doing something wrong. ''"Under-served"'' is a less judgmental way of describing this population. The key challenge is for the worker to develop an authentic understanding in which it makes some sense that the young person in front of them would not have sufficient trust and confidence in others to come asking for help. In our experience it is often quite understandable.
* Creating an experience in a young person that their predicament here-and-now is accepted as real, and is somewhat understood (//"That's it! You've finally got it!"//) is at the heart of the theory of how [[Epistemic Trust]] is formed - which opens the door to learning.
* Acknowledging the fact that our intentions in our work are broadly positive (to help) may be far from clear to our clients whose ability to mentalize us may be limited. Our [[AMBIT]] (sphere of influence) in this work only extends to the areas where there is an explicit overlap between //our// intentions, and //those of our clients// (hence the importance of [[Broadcasting Intentions]]).
* The benefits of a team culture of [[Active Planning]]:
** It is better to have a plan and shared goals than to "wing it" - all outcomes studies support this.
** But mentalizing theory also stresses how important it is to maintain attunement and engagement
** Active Planning implies sensitivity and adaptation of what is offered in keeping with "where we are" (see [[Active Planning]]).
** The difference between a plan (like a map) and your observation of the actual landscape you are traversing
** Collaborative goal setting - see [[Active Planning]]] and the [[The Egg and Triangle]] as a tool to help broadcast the worker's intentions, to foster a non-expert [[mentalizing stance|The Therapist's Mentalizing Stance]], and arrive at a shared plan.
!!Practice
''(A) Thinking about the dilemma of the hard to reach''
* Break into pairs and on flip chart paper list out all the reasons why it might make good sense in a young person's mind NOT to want to trust the worker/team that is offering help.
* Discuss in the large group - consider the [[Therapeutic Bargain]].
''(B) Thinking about what to do with our clients''
* ''If you have time'', discuss in small groups/pairs //"How do we decide what to do at present?"// - then have a large group discussion (perhaps use the [[Fishbowl discussion]] technique).
** Above all, we would emphasise that local teams generally have a lot of skills in assessment already, but are these shared explicitly between all team members? Are there some team members who are known to have special abilities in engaging and learning about specific problem areas? how do these get shared among other team members?
** Look at the material in [[What's the problem?]]
** Look at the [[AIM]] (AMBIT Adolescent Integrative Measure), which can help by suggesting and ranking possible interventions. Offering //the interventions that the situation calls for//, rather than //"the ones I like doing"//.
* See [[Active Planning]] and [[Team training session: deciding on the intervention]], to practice using the [[The Egg and Triangle]].
* Discuss how [[Managing Risk]] will influence your planning and choice of interventions.
!!Reflect
* Facilitate team discussion about the content of the session
** How might any of this material augment or improve existing practice?
** What elements are worth trying, and how would this take place (try to be specific about the //how// and the //when// in any shared intentions revealed).
** What elements of //existing team practice// should be preserved, or shared, and how can this be done?
!!Manualize
Go to [[How to run a team manualizing session]] for help in creating a page of reflections from the team on:
* Key learning points that we agree make sense in OUR local context
* Plans for how we are going to try out this material in practice
* A review date for when we will check back with each other
* (For the gold star:) [[Evaluating outcomes]] by which we could tell if this is having a positive effect on our practice. This might be very simple - a clinician-rated scale of 0 - 5 for "how much I applied (or tried to apply) [[Active Planning]] and [[The Therapist's Mentalizing Stance]] in this case" and another 0 - 5 for "how helpful was applying these tings were in this case?"
<<image [[session 8 page 1]] width:600 height:480>>
<<image [[session 8 page 2]] width:600 height:480>>
<<image [[session 8 page 3]] width:600 height:480>>
<<image [[session 9]] width:600 height:480>>
<<image [[session 9 page 2]] width:600 height:480>>
<<image [[session 9 page 3]] width:600 height:480>>
<<image [[session 11 page 1]] width:600 height:480>>
<<image [[session 11 page 2]] width:600 height:480>>
<<image [[session 11 page 3]] width:600 height:480>>
<<image [[session 11 page 4]] width:600 height:480>>
<<image [[session 11 page 5]] width:600 height:480>>
<<image [[session 2 page 1]] width:600 height:480>>
<<image [[session 2 page 2]] width:600 height:480>>
<<image [[session 2 page 3]] width:600 height:480>>
<<image [[session 2 page 4]] width:600 height:480>>
<<image [[session 2 page 5]] width:600 height:480>>
!!Background and context
This page is a sub-page of [[Local Facilitator Training (LFT)- training model]] and provides a number of core ideas about the training process.
See also [[Train the trainer: potential barriers to achieving training objectives]] for other general ideas about the training process.
Training is a part of learning within a team. The manual contains a number of pages about [[Developing learning organisations]]; many of these ideas are based on the work of Peter Senge.
!!Core ideas around training
!!!Train in pairs
Wherever possible, do a training session in pairs. Adjusting to your natural style, it is often helpful for one person to lead the session and the second to be in a more reflective position to think about the process of learning as much as the content of the session. Modelling 'mentalizing' between trainers around the process of training is likely to be very helpful.
!!!The process of training is potentially very non-mentalizing.
The challenge of training is for the process and content of training to connect with people's real experience of working with young people. It needs to connect with areas of work that people find difficult but this can raise anxiety and if this happens too much it can create a context for all three forms of non-mentalizing: Psychic equivalence ('I know these kids and how to work with them'), Pretend Mode (e.g. I think AMBIT doesn't take enough account of the cultural narratives of exclusion and we need to understand these more fully') and Teleological thinking (e.g. 'just tell me how to do AMBIT') disconnected with the experienced feeling in the session. The trainers need to monitor the session in similar ways that one might monitor an interaction with a young person. 'How are we doing? Is this making sense? I have a feeling this feels a bit remote etc? How are things feeling right now?
!!!The learning cycle: Agree, Explain, Practice, Reflect, Manualize.
#''Agree.'' Begin by trying to be as explicit as possible as to what the learning task of the session might be. Within the team, some will be more knowledgeable or confident about the task than others. Rarely is anything completely new so everyone will have some starting knowledge of the content to be covered. For some teams it may be useful to invite team members to rate on a scale of 1-10 how familiar they are with the content of the session and to make explicit the variability of this within the team.
#''Explain.'' Present the core ideas to the group or use video from the manual or do it through role play or other creative methods. The length of time for this will vary depending on the session. But the tendency can be for this part of the session to take up too much time time so that other parts are squeezed out.
#''Practice.'' This can be practicing a skill or practicing explaining an idea to someone else. Moving form passive to active modes of learning is pretty crucial to the effective learning.
#''Reflect.'' Talk over what has been practiced. This can include explicit mentalizing about the process of learning i.e. feeling a bit anxious; thinking the content was a bit simple; feeling embarrassed etc
#''Manualize.'' Draw together what has been learnt. Add to the team manual by working together to create a sub-page in the AMBIT core content in which the core content was adapted to the local context.
!!!Length of training sessions.
Training sessions may vary from a whole day to 15-30 minutes depending on the opportunities and team practices in the team. Some teams use regular team meetings to have training sessions while others prefer to allocate specific times (awaydays; half days etc). This again is something that can be manuaised and made explicit. It is not a matter of not doing it properly. It is a matter of doing it in a way that fits with local practice.
1. You only need to log in if you are wanting to EDIT your local version of the manual. Anyone can access the materials that are presented, without needing to log in as a registered user.
2. Get a username and password from the Anna Freud Centre (getting your own local team's version of the AMBIT manual is ONLY available to teams that have been trained by the AMBIT team at [[AFNCCF]])
3. click ''Log in'' (on the top bar menu) and enter your username and password.
4. When you are logged in, you will see the link ''"Log in"'' on the top bar menu is replaced by a "cloud" icon, which gives a picklist of options if you click it (including Log out)
The Logic model for child mental health evaluation was developed by Professor Wolpert's team at the Evidence Based Practice Unit (EBPU) at the Anna Freud National Centre for Children and Families. (AFNCCF).
Guidance about Logic Models can be found in this introductory booklet that can be found here (Tia to add link to booklet)
A logic model has five components.
#Target
#Intervention
#Change mechanisms
#Outcomes
#Moderating factors
A diagram showing the key components of a logic model looks like this.
{{Logic model.JPG}}
{{logic-model-310517.pdf}}
!!!!''Source: Dickon Bevington, Laura Talbot and Peter Fuggle''
This page has been drafted on the 23rd February 2019. It is anticipated that core components of this logic model will be continuously discussed and revised.
The expectation is that each service would develop its own logic model for its unique service. The content listed here is provided as a possible example of the sort of items that may be included in a logic model working with clients who are struggling to make use of help.
!!!@@color:red;''Target''@@
*For clients of the service
!!!@@color:orange;''Intervention''@@
*To help young people make sense of their experience and find help for themselves.
*To develop shared and adaptive goals with clients
!!!@@color:blue;''Change mechanisms''@@
*Improving the sense of feeling understood by helpers, and of understanding helpers
*Increased awareness of the impact of mentalizing/non-mentalizing in helped and helpers
*Increasing helping processes between team members (improved team cohesion)
*Increase understanding and effective collaboration (shared aims) between workers across agencies in the helping system
*increasing use of methods to learn and improve as a team,
!!!@@color:green;''Outcomes''@@
*Reported improvement on symptom measures and client-defined goals
*Improved engagement of clients with existing mainstream services
*Improved service outcomes with respect to service targets (e.g. rate of admissions, frequency of restraints, numbers coming into care, severity of substance use disorder, etc.)
!!!!''Source: AMBIT program team''
This page has been updated in October 23 with the most recent logic model for AMBIT training as an intervention.
See also [[Logic Models]] and [[Logic model for AMBIT services]]
We are currently developing our evaluation strategy and range of measures to learn about the impact of AMBIT training. The measures will be directly connected to the predicted outcomes identified in the logic model.
We have divided post AMBIT training outcomes into;
Short term (up to 6 months after training)
Long term (between 6 months and 18 months after training)
Indirect outcomes (outcomes that relate to but are not directly the cause of AMBIT training i.e. there will be a number of variables which influence these outcomes aside from AMBIT training)
''Please see here for AMBIT Training as an intervention logic model October 23''
<<link-pdf "AMBIT Training as an intervention logic model October 23" "https://docs.google.com/presentation/d/1kA9gvnL3qccGh-2j281b9Uz0-1yPFqSo/edit?usp=drive_link&ouid=108983181073089183472&rtpof=true&sd=true">>
This page describes a training exercise using Logic models which aims to invite teams to construct their own logic models for their team.
''Time needed:'' 1.5 hours
[img[AMBIT - Logic Model blank.jpg]]
!!Suggestion:
Consider [[Working with your TEAM]], [[Working with your NETWORKS]] and [[LEARNING at work]] as possible ''MODERATORS'' on the work with clients.
!!Exercise:
#Trainers need to explain the logic model to the group, particularly what the four concepts of ''Target'', ''Intervention,'' ''Change mechanisms'', ''Outcomes'' and ''Moderators'' mean.
##''__In a multi-team training:__'' Divide the group into pairs of teams, Team 1 makes the logic model; Team 2 helps Team 1 with this process. Each team does the exercise in turn. Allow about 20 minutes per team for this part.
##''__In a single team training:__'' Divide into four groups (1, 2, 3 and 4). Groups 1 and 2 are paired, groups 3 and 4 are paired. Group 1 creates a logic model for how the team does "Working with your Client", and group 2 helps (see below). Then Group 2 creates a logic model for how this team does "Working with your Team", and Group 1 helps. Ditto for Group 3 (= Working with your Networks) and Group 4 (Learning at Work).
#The 'helping group/team' has to encourage the working group/team to build a //concise// model by //being curious about their thinking//. They need to avoid imposing their ideas on Team 1. It is a mentalizing stance.
#Each Team/Group presents their logic model to the wider group and invites reflections on what teams have come up with.
#Teams put their working draft of their logic model(s) in their own manual, and come up with two actions from this exercise. (15 minutes)
!!Purpose
The purpose of this page is to define the key components of a maintenance phase.
!!Optional
This is the 4th (optional) phase of the 5 [[Phases of AMBIT work]].
For some young people, and in some settings, a longer term 'Maintenance Arm' may be indicated (and //commissioned//), rather than AMBIT just being a short to medium term intensive intervention. Operation of a "Maintenance Phase" will be negotiated and commissioned locally, and will thus carry its own criteria for admission to Maintenance Phase (local teams might want to edit this for themselves).
This will depend on the specific service protocol and may not be possible, or desirable for some services.
!!//Recovery// and Maintenance
The ideas of [[Maintenance and the Recovery Model]] do not always sit well together, and this is discussed.
!!Risks - how do we part?
A risk for any team that develops capacity for such an intervention is that it may unintentionally "create" hard-to-discharge clients.
!!What to do
!!1. Building networks and links
See [[Scaffolding existing relationships]]
!!2. Monitoring (mental) health
See [[Monitoring mental health]] and in particular [[Relapse prevention]]
!!3. Developing maintenance routines
See [[Developing maintenance routines]]
MBT is an evidenced approach to psychotherapy for adults with Borderline Personality Disorder, first developed by Profs Anthony Bateman and Peter Fonagy.
It has produced some impressive results in a number of Randomised Controlled Trials, with long follow ups, and is one of a small number of NICE approved treatments for Borderline Personality Disorder. This approach has been adapted for use with Adolescents in MBT-A and a simple version is given here at [[Mentalization Based Work]] - one of a wide range of [[Specific interventions]] in this manual.
MBT is the starting place for an expanding number of treatment approaches because the core principles of MBT are relevant beyond just the predicament of people with Borderline Personality Disorders, there are versions of MBT for a widening range of other disorders in adulthood, and latterly with children such as mentalization based treatment for children and for families (MBT-F) as well as adolescents (MBT-A) as well as [[AMBIT]] itself).
!Mentalization-based treatment for Adolescents
This is a manualized treatment for adolescents with [[Self Injurious Behaviour]] that has been subjected to a Randomised Controlled Trial by Dr Trudie Rossouw and Prof Peter Fonagy (see [[Rossouw, Fonagy (2012) Mentalization-based treatment for self-harm in adolescents: a randomized controlled trial]]).
It performed very well in this RCT and long term follow up figures are awaited, though it is right to add that it is a relatively small study and was conducted by the program developers, so replications are awaited.
!!What is it?
It is an ''adaptation'' of the strongly evidence-based approach for adults, ''MBT'' (for adults with Borderline Personality Disorder).
** ''MBT (for ADULTS) combines:''
*** INDIVIDUAL SESSIONS (weekly)
*** with regular GROUP SESSIONS,
** ''~MBT-A combines:''
*** INDIVIDUAL SESSIONS (weekly)
*** Instead of the group work deployed for adults, ''~MBT-A'' swaps regular (monthly) FAMILY SESSIONS
**** See [[Family Work]] recorded here in the AMBIT manual, which is the core content of ~MBT-F
**** ~MBT-F has its own separate web-based treatment manual.
Mentalization based treatment for children (MBT-C) has been developed in a range of different centres across the world including at the Anna Freud Centre in London under the leadership of Professor Nick Midgley.
It has its own separate wiki manual which can be found in the link shown here.
https://manuals.annafreud.org/mbt-c/index.html#Welcome%20to%20the%20MBT-C%20Online%20Workbook:%5B%5BWelcome%20to%20the%20MBT-C%20Online%20Workbook%5D%5D
In this Manual, when we describe [[Family Work]], we mainly refer to work that is carried out in line with the principles and practice of ~Mentalization-Based Treatment for Families, although in AMBIT the structure and settings for sessions may necessarily be more flexible than the structure laid out in the treatment manual for formal MBT-F.
MBT-F is described here under Family Work, and primarily consists of three elements:
#[[The Worker's Mentalizing Stance]]
#The [[Mentalizing Loop]] (also known as the MBT-F loop).
#A wide range of [[Mentalizing Therapy Techniques]] - which the creative therapist can add to once the basic stance and aims of the therapy are clear.
There is a [[separate manual for MBT-F|http://www.tiddlymanuals.com]] but most of the material held there is already included within this AMBIT manual.
!An analogy that may be helpful in explaining the relationship between thoughts and feelings:
Many young people have 'playlists' on their ~MP3 players/ipods. Certain songs affect the listener's mood. This can be helpful (even sad songs can certainly sometimes make a listener feel better by making them feel that what they feel is //understandable//), but some songs DO make us feel low, and if we played these ones repeatedly throughout a day, we would probably feel worse than if we hadn't. The thoughts in our heads are something like ~MP3's - we can 'run' unhelpful ones, or uplifting ones.
This analogy is helpful in that it emphasises the individual's "self-agency" (being able to influence things //myself// rather than being dependent on outside things or people.) What 'thinking-~MP3' would you //choose// to run?
!Using a Playlist as a [[Thought Blocking]] technique
Practically speaking, help a young person to deliberately prepare a "chill-out playlist" of songs to keep on their phone or MP3 player.
They need to select songs that are well known to them, and that are selected not because they are great music, or because they have any merit at all //except// that the young person knows that hearing //these particular songs// (they may be from heir past, etc) tends to relax/distract/soothe them in ways that other music (music they may more ordinarily listen to) may not.
Develop a drill (see [[Thought Blocking]]) so that listening to this playlist is part of the response to noticing specific (unwanted) forms of thinking.
This is associated with the four aspects of [[The Therapist's Mentalizing Stance]], and really expands on the first aspect of the Mentalizing stance - known as the "Inquisitive stance"
!Maintaining a focus on mental states
In sessions practitioners will maintain a focus on trying to understand mental states //in the here-and-now//, a capacity known as [[Mentalization]], also referred to as "Mind-mindedness", and will use their interactions with the young person and family to try to //increase mentalizing//: see [[Mentalizing Therapy Techniques]].
In particular, the [[Key Worker]] is attentive to the //here-and-now// - sensitive to the coming and going of [[mentalizing|Mentalization]], and (in keeping with another of the [[principles of the substance use treatment|SUD-Rx principles]]) prepared to [[Adapt your Discourse]], by addressing [[Pre-mentalistic stances]] such as [[Pretend mode]] thinking.
!Holding a //~Not-Knowing// and //Curious// stance:
Avoiding any assumption that I have knowledge of the contents of state of my client's mental state, and modelling constant curiosity about this. //"I find I'm really curious about what happens when you are telling me about your mother's reaction to you smoking weed. I wonder what you think I might think about it; I wonder whether you worry I'll react like her, or very differently..."//
Implicit in this assumption is that we learn by making well-meaning mistakes ("an expert is someone who has made all the avialable mistakes in an area") and then learning from these.
!Suggestions and questions are presented //tentatively//:
In keeping with the not-knowing stance, the practitioner avoids presenting suggestions or questions as though the answer is already known: //"This may not make any sense, but I have this idea that perhaps the weed is very useful as a way of not-thinking too much about some of these painful things you have been telling me about. does that make any sense at all to you?"//
!Taking responsibility for one's own mentalizing
In working with young people and families who are in crisis of one sort or another, the mentalizing capacity of the //practitioner// is regularly threatened. Practitioners in the team have //as a core task// the use of their team's SupervisoryStructures to foster and sustain [[Mentalizing]] in each other's functioning.
In the therapeutic relationship, when things go wrong (the client withdraws, becomes irritable, etc) the practitioner will always tend to take personal responsibility for this, rather than allowing blaming to creep in to the discourse:
>//"Something has happened just now, and I think I must have got something wrong here - I must have misread things in some way. Can you help me figure out what I did that has upset you like this, because that is no help to you at all..."//
Consider in particular the SocialEcology, but also ongoing stress from other aspects of the assessment (see above under predisposing and precipitating factors.)
This refers to the state of having made the desired change, and maintaining this new way of being.
This manual includes a [[MAINTENANCE PHASE]] for those teams that have a remit to work over much longer time frames to support young people (not all AMBIT-influenced teams will be able to deliver this).
There is more detail about the tasks for supportive work recorded under the [[MAINTENANCE PHASE]], but a few key pointers include the requirement for:
* Identification of ''Risk Factors'' that may act on the young person, making [[Relapse]] more likely...
* Vigilance towards these risks, and a clear [[Relapse prevention]] plan will help minimise the likelihood of relapse.
* Maintaining hope: In the case of SubstanceUseDisorder it is important for the practitioner to bear in mind the statistics that suggest that a very significant proportion of clients end up going around the [[Stages of Change]] 'loop' more than once before settling into sustained 'maintenance' of sobriety. This information needs to be //shared with care//, as it is important not to collude with, or even unwittingly to encourage, the more resistant (pro-using) aspects of the client's mind.
A [[MAINTENANCE PHASE]] phase suggests that teams offer longer term follow-up of cases to encourage the young person to maintain whatever gains have been achieved and is consistent with an attachment model of intervention by maintaining interest in the young person after active intervention is completed.
Such a phase will continue to work towards [[Scaffolding existing relationships]], inviting the young person to continue the work of building their own equivalent [["team around the worker"|Key Worker]] as though they are increasingly taking on the role of a [[Key Worker]] with responsibilities for their self - and recognising (just as their AMBIT [[Key Worker]] will have demonstrated) the need for an active 'back-up' team that can offer accessible support for times when their own capacity for [[Mentalization]] is diminished. Although there may be a continuing role for professionals to play a part in that team, [[Family Work]] and [[Social-Ecological Work]] may help to widen the membership of such a network.
Equally, a maintenance phase might be seen as fitting a //"chronic illness model"// of difficulties - i.e. addressing the reality of the fact that ''some conditions are unlikely to be fixed (as in "clinical recovery") in the short or medium term'', but that ''with the right longer-term support it is still right to aim for the "recovery of a life worth living"'' - as this is defined by the clients themselves.
This is related to the "Recovery-focused" approach to care, which AMBIT fully supports:
<html><div align="center"><iframe src="http://www.mentalhealthcare.org.uk/recovery" frameborder="0" width="100%" height="600"></iframe></div></html>
!
Without a ''plan'' to organise ''action'', no sustainable change is likely to occur. On its own, the action of planning and working to that plan is a powerful example of [[Teleological thinking]] - not very [[mentalizing|Mentalization]]!
Ideally, a plan is arrived at in ''collaboration'' between worker and client. There is ample [[evidence|Collaboration as a process and an outcome]] to suggest that collaboratively generated plans are far more likely to be adhered to than ones that are imposed from outside. Sometimes, when a worker is [[Managing Risk]], the level of collaboration involved may feel (or be) reduced.
In [[Active Planning]], ''Making plans for change'' is just one of three positions that the worker tries to hold in balance. The other two are [[Broadcasting Intentions]] and [[Sensitive attunement]].
This is the procedure for managing recordings of interviews on zoom which are stored on the zoom website in your account.
In your account you will see a list of your recordings by clicking the tab in them opening menu called recordings.
You will see a list of cloud recordings that you started.
#Adjust the date range and status, then search by host, meeting ID, topic, or keyword. Note: There is no limit on the date you can specify.
#Complete the settings for sharing
* Share to display the recording link information and sharing settings, such as disabling downloads from viewers and requiring a password to view.
*Share this recording: Allows the recording to be shared publicly or internally. Switch the toggle off if you want the recording to be private. If you share the recording, Zoom will create a web page where visitors can view the cloud recording.
*Add expiry date to the link: Allows you to set number of days or specific date when the link will expire for viewers.
*Viewers can download: Allows viewers to download the video in addition to viewing it online.
*Viewers can see transcript: Allows viewers to see the auto transcript if Zoom was able to process one.
*On-demand(Registration Required): Requires users to enter their name and email address before viewing or downloading the recording. The host will be able to download a report with this information.
*Password protection: Requires users to enter a password before viewing or downloading the recording. After toggling this to on, enter a custom password and click Save.
*Copy sharing information to clipboard: Copies the link and password (if enabled) to your cloud recording. Share this information to allow others to view the cloud recording.
This page links (by tagging) content that relates to the broad team and [[Key Worker]]'s task of managing their relationship with the client. In many textbooks this is referred to as the "[[Therapeutic relationship]]". Click on the button below to list aspects of the relationship that might require support:
----
<<tag [[Manage CLIENT RELATIONSHIP]]>>
----
AMBIT takes this very seriously: a core task is to develop an [[Attachment Relationship]] with the young person (NB this doesn't just mean the young person should 'become attached to' his or her key worker, or vice versa. You can read more about the theory behind this idea in [[Attachment theory]], and how it relates to the way a young person might use his or her [[Key Worker]] as a [[Secure Base]] from which to explore. Crucially, [[Mentalization]] depends on the activation of this [[Secure Base]] experience. This is why we emphasise [[Engagement]] with the young person, including the [[Boundaries]], such as [[Confidentiality]] that make this relationship safe.
Under the Related Information for this topic you will find a long list of sub-topics that represent a range of clinical problems that the team meets and manages.
"Clinical problems" always //directly involve the young person, or his or her family//.
For clarity in the manual this is separated from issues that arise requiring us to [[Working with your NETWORKS]] - i.e problems with the //services, agencies, and other professionals// also trying to work with and for this family.
!Immediate safety
If violence is occurring that is not safely and quickly containable by staff, then you must call the Emergency Services, or alert colleagues so that they can do this.
Many teams like to have a simple codeword that signals to all that a significant incident is unfolding which needs support, such as:
>//"I am going to need the ''pink file'' that is somewhere on my desk, fairly soon, please."//
[[Key Worker]]s should have access to skills training in basic ''Breakaway' techniques'', but this is not presented here in the manual - LOCAL TEAMS might wish to add details about local trainings here - keeping this up to date would fall under [[Managing Risk]] (one of the [[Core Features of AMBIT]], and supported by good [[Governance]] in the team).
!Prevention
The key skill is to //avoid// violence occurring, rather than to manage it once it has erupted. There are notes on [[Crisis Contingency Planning]] - which describe how to make plans for foreseeable problems.
!De-escalation techniques
When a young person is becoming violent they are clearly not [[Mentalizing]] - and are likely to be in rather 'primitive' states of mind; either [[Psychic equivalence]] or [[Teleological thinking]]. It is important not to talk to them in ways that do not take this into account - if they are convinced that the thoughts in their head are accurate:
>//"This person wants to hurt me and I must protect myself by hurting them first"//
...then trying to //reason// with them at that point is likely to be pointless - and could further aggravate them. Instead, try to come alongside their mental state by ACKNOWLEDGING how awful it must be to be in this predicament (thinking someone else is trying to hurt me, etc,) and reassure them that you are there to help if you can.
!How to speak
Speak softly, and calmly, with lots of reassurance and reminders of where we are, what we are about here, etc. (However, bear in mind that sometimes if the worker becomes CALMER it just enrages the young person more - particularly if they are in [[Psychic equivalence]] - in these cases [[Marked mirroring]] is an effective technique to use.
!Use of Self
This is described more at [[Therapist's use of Self]]. Explain the effect of their behaviour on you - as much as possible in a way that models a [[Mentalizing]] stance - ie. allowing transparency to your thoughts, not assuming any knowledge about the young person's state of mind, and not denying or 'correcting' any statements that they do make about their experience in that moment. ''What is in their mind at this time //is what is there// - you should never deny or criticise the contents of a young person's mental state'' although you will wish to demonstrate interest in better understanding their mental state.
>//"I thinking to myself here that I am nervous, a bit scared that I could get hurt, and I know I don't think so well when I am scared; can we find a way to calm things down so everyone feels safe enough to think, and so I can try to be more helpful - or less unhelpful - for you?"//
>//"I want to be helpful, and to keep things safe here, can we go and sit down and work out a plan to deal with this situation?"//
!Take responsibility
Take responsibility for any misunderstandings of your own that may have contributed to the young person's anger:
>//"I think I may well have got something very wrong just now, and I am very sorry if I did - I am wanting to be helpful but I may have been unhelpful by mistake; I want you to know that I do make mistakes sometimes but I do try to learn from these. Can you help me understand where I went wrong - was it when...?"//
!Consider Shame
Do remember the links between SHAME and violence and scrupulously avoid saying or doing anything that might increase the young person's sense of shame.
!Body language
*Avoid direct eye-to-eye contact which may be provocative - look downwards instead, holding the person in your 'peripheral' vision.
*Stand sideways on to reduce the 'target' area, and avoid any sense of "squaring up" to the young person.
*Hold your hands out, in an open posture, at the level of your stomach, with palms down, fingers slightly spread, to show that you are not threatening them in any way.
*As far as is possible, try consciously to relax the muscles in your upper arms, and face, and to keep your facial expression benign and relaxed.
!Video example
There are no hard and fast rules for dealing with eruptions of aggression or violence, but this role-played video is an attempt to show some techniques. Here the worker is rather trapped in the chair, but aspects of his management worth highlighting include:
* Manages to give enough eye contact to signal respect, without so much as to offer a threat.
* The head is bowed at times to signal respect (with the head bowed it is possible to watch for movements in the aggressor's lower body that might signal further escalation and attack.)
* The hands are held out in front of the body (offering the hope of defence if things were to escalate, but also showing the aggressor clearly that there is no hidden weapon/punch).
* The worker ''takes responsibility'' for "getting us into this"
* The worker uses facial expressions and tone of voice to offer a [[Marked mirroring]] of the aggressor's intense feelings - attempting to give a strong message that the intensity and //reality// of the aggressor's mental state is accepted, not denied, but emphasising the wish to understand better as well.
* There is regular effort at [[Broadcasting Intentions]] - stating (the obvious but crucial facts) about the wish to be helpful, not to upset...
<html><iframe width="560" height="315" src="//www.youtube.com/embed/NjUU8uK6Sbw?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!''Managing Differences of Opinion ''
[img[Managing Differences (Egg and Triangle)]]
There are frequently [[Individual Differences and Disagreements]] that separate the ''worker's'' intentions and plans and those of the ''client''. Workers come with some pre-ordained priorities, and they are inevitably (and quite properly) part of a system that is larger than them, and to which they are answerable.
!!''1. Foundations''
The ''foundation'' of any work from the professional's point of view is ''safety'' - without which any further, more elaborate building work would be liable to crumble. In [[Broadcasting Intentions]] about our work and our ideas about [[Aims and Goals]] for the work ahead, it is helpful for our clients to hear this stated in simple terms:
>//"Above all, it's worth saying that everything I do is __first of all about helping things to be safer__... that is my job, and its worth understanding that this is absolutely at the centre of how I //must// work. I guess the reason is that if we can get things safe enough then you and/or the people around you don't need to spend so much time worrying, and can start to spend more time being imaginative, and planning, and experimenting with new ways to work things out..."//
From the client's point of view Safety //may// be a shared foundation priority, but they may have //other// ''"Needs"'' aside from this that they would feel need to be the starting point (that if their worker did not show them they had //recognised// would leave them feeling misunderstood, or ignored.
>//"It's also important for you to know that I DON'T KNOW exactly what YOU see as the things that you really need right away - but I really want to get these things straight in my own head, as I am pretty sure that if you think I haven't got a clue about what YOU feel you really need right now, then I'm not going to seem very helpful to you!"//
!!''2. Directed activity''
Thereafter (once basic safety is assured with the implementation of a reasonable/defensible safety plan) the worker may be focused on developing shared ideas about what ''"Recovery"'' would look like for the client(s), and devising the means by which to get there. Likewise, the client may have particular ''"Wants"'' that may or may not overlap with the intentions of the worker.
!!''3. Rationale''
Finally (at the top of the triangles in the "hierarchy") the''"Why?"'' marks //"the __point__ of all this effort"//. Now, this kind of ''discovery-focused'' work (as opposed to ''recovery-focused'' work) may be seen as the "icing on the cake" for a worker, but in developing and working towards agreeing 'waymarks' with a young person, it may be much easier to find common ground in the more distant ''wondering'' about longer term [[Aims|Aims and Goals]] than it is to agree on more specific Goals, or detailed plans.
!!What do we mean by Risk?
#Risks for the client e.g. self injury, abuse, health problems...etc
#Risk for other people e.g. criminal acts, harm to pregnancy, violence...etc
#Risks for the worker e.g. burn-out, trauma, complaints, allegations etc
Managing Risk is one of the [[CORE features of AMBIT|Core Features of AMBIT]] and part of ''Working with your Client''.
!!Managing Risk, not Abolishing it
It is important to acknowledge that in this field we can never get rid of all risk. Working with impulsive clients, who have limited ability to plan, predict risk, and consider the consequences of actions, will always hold risks.
!!Risk and Mentalizing - an Assumption:
AMBIT takes the position that working with risk is (and should be at times) anxiety provoking and worrying (for all involved). We know that high levels of emotion impact on [[Mentalization]]. Therefore a key part of managing risk involves finding ways to regain and sustain mentalizing in these contexts.
Risk is highest at those times when [[Mentalization]] fails in:
#The client/family
#The worker
#The people (networks) around the client or worker
When any of these people lose the capacity to mentalize, it becomes harder to evaluate and respond to risk in thoughtful and effective ways.
At these times it is more likely that non-mentalizing interactions happen between people. For example [[Teleological thinking]] (i.e. 'quick fix'), often arises. Examples of this might be a violent act or using an intervention which has not been well planned or thought through. These kind of 'un-mentalized actions' can often lead to further unwanted effects - such as more relationship problems, increased vulnerability, side effects from medical interventions, increased dis-integration in a network etc
''With this in mind, we see managing risk as a process which relies heavily on the connections between colleagues and capacity of workers to support each other to think (or to mentalize) in conditions where risk (and hence, worry) is present.''
__Situations in which workers are attempting to manage risk without strong connections to colleagues would be highly concerning and, we believe, un-sustainable.__
The way in which the keyworker and team work to re-gain their balance and the ability to mentalize, through their ''connections with colleagues'', is therefore essential in order to carry out this work effectively.
Please see here for more explanation of this, particularly the notion of a [[key worker-well connected to the wider team |Keyworker well-connected to wider team]]
!!Managing Risk and the AMBIT stance features
Managing Risk is one half of two 'AMBIT stance points' (shown in the outer rim of the wheel in the [[Working with your Client|Stance Features: Working with your CLIENT]] quadrant of AMBIT). The other half, is called [[Scaffolding existing relationships|Scaffolding existing relationships]]. We see the worker (and teams') role as attempting to hold a balance between these 2 points below.
{{Wheel with client highlighted.jpg}}
''Scaffolding relationships'' involves the essential work with clients in which we aim to help them build , strengthen and make use of relationships which are ''already present'' and which may serve an important (longer- term) role in their lives (long after we have gone!). This includes work with the clients' relationship with themselves (i.e. the capacity to mentalize themselves), as well as relationships with family, friends, the social world, employment and others with whom there is potential for ongoing support. Here the worker uses engagement, attunement, and builds understanding of the client and their network.
On the other side of this balance (sometimes in opposition, and pulling in the other direction) is ''Managing Risk''. At times within the work with clients and their networks risks will be present. When a risk is identified there is often a need for some kind of concrete action in order to better understand and reduce risk.
In many ways managing risk can be seen as a helpful use of ''teleological thinking''. There are actions, procedures and protocols that will be required in order to sufficiently reduce the risk (for example, with the disclosure of active abuse, the appropriate response will be clear, timely and decisive action in order to safeguard somebody). However, although clear actions are often essential, when these happen without mentalizing, there is a high risk that the relationships that the worker has been carefully scaffolding can be damaged (which in the longer-term, if the client or others dis-engage, can lead to greater risks).
This is the nature of the balance between these 2 stance features- both sides are critical and the worker attempts to balance between the stance points.
''Mentalizing supports the worker to hold this balance''
!!An example:
A worker has built a strong relationship with a parent and has begun to help the parent learn to manage some of their difficult experiences and strengthen some potentially supportive relationships in their life ''(scaffolding relationships)''. The worker then learns that a member of the network close to the parent and their child has a history of posing serious risks towards young people. At this point the worker is required to take clear steps to make sure that the well-being of the young person (and others) is appropriately safeguarded ''(managing risk)''.
Applying mentalizing to this situation might look something like the worker (suppprted by colleagues) to think through and plan points such as...
> //What might be the safest way to carry out these safeguarding steps? Who should we talk to first and how should we do it? who best to have these coversations? how might different people in the network experience this and respond? what does this tell us about how we should position ourselves to be most helpful and work safely? What steps can we take to try to limit any harm to protective relationships that have been built ? etc//
If we move in to action without this kind of thinking (mentalizing those involved) it is much more likely that relationships will be ruptured and it may become more difficult to manage these risks in the fuuture.
!!Assessing and Managing Risk
It is critical that teams have clear ways of assessing risks and have shared explicit protocols for making plans to manage risks e.g. crisis contingency plans. These should be discussed regularly in the team.
AMBIT does not claim any originiality in promoting this. However AMBIT does emphasise the need to develop and adapt these protocols and procedures in relation to new learning within teams' local contexts. We believe that teams making explicit, regularly rehearsing and adapting their approach to risks, in light of new experience, is essential here. We encourage teams to use [[Manualization]] as a tool for learning, recording and sharing their own protocols around risk.
Please see here for [[Training Exercises for Managing Risk]] that you can use with your team.
!!Extended learning - <<tag [[Extended learning]]>>
Different teams will have different protocols and procedures around risk. below we have included some more general guidleines. Within the extended learning tag you can also find further reading around the process of challenge and support in managing risk.
Please see here if you would like to read guidlines around [[RiskAssessment]]
Please see here if you would like to read more about [[Governance]] - This means the broader approach to having clear agreements and protocols for "//doing things safely and properly//" that protects workers as well as the teams they work for.
!!''What is Manualization?''
'Manualization' is ''the process of a team recording //'what we do'//'' (in text or through video recordings) in ways that would help others to do the same thing (and get the same results.)
It is really another way of addressing the idea of ''team learning'' - and in this way it relates directly as a key ''technique'' to support AMBIT's ideas and approach, which places [[LEARNING at work]] at the heart of the [[AMBIT Wheel]] (and connects AMBIT to the broader field of [[Developing learning organisations]].)
Manualization is one of the techniques that is included in the [[Core Features of AMBIT]] - connecting to the principle [[Respect local practice and expertise]]. AMBIT workers don't just read their treatment manual, they are expected to //co-author// it.
Above all, Manualization is about promoting [[LEARNING at work]] - particularly ''learning from mistakes'', or ''recognising a piece of local expertise''. Recording it (especially so in a public facing website) creates a kind of ''"ratchet effect"'' so that learning in a team is less likely to slip backwards and get lost (//because workers forget those team discussions when 'all came clear', or they leave the team to take up other posts, taking all their expertise with them... //).
[img width=100% [patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg]]
!!! Using Wiki-Manualization in an AMBIT Team
<center><iframe width="640" height="360" src="//www.youtube.com/embed/tcE8k8REnzY" frameborder="0" allowfullscreen></iframe></center>
!!! Building a [[Community of Practice]] using the Wiki-Manuals
<center><html><object width="480" height="360"><param name="movie" value="https://youtube.com/v/wT-3b227ZXE?hl=en_GB&version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/wT-3b227ZXE?hl=en_GB&version=3" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html></center>
See [[Other team's AMBIT manuals]] to access of a list of teams who are currently using manualizing in their practice.
!!Balancing Act
What you are reading now is a TiddlyManual, which is a different kind of manual from books or conventional websites. In keeping with two other [[Core Features of AMBIT]] ([[Respect for Evidence]] and to [[Respect local practice and expertise]]) it is concerned with the difficult (but as we see it, crucial) task of balancing two potentially contradictory principles:
* ''Systematic Evidence-based Practice''
*''Locally-derived Practitioner-based Expertise''
...The approach to "manualizing" practice in a TiddlyManual allows for a marriage of 'top-down' evidence-based information and instruction, alongside 'bottom up' local expertise in ''//how we apply these techniques and methods here, with these particular young people...//'' or ''//what we learned from a recent near miss/mess/serious incident that would minimise the likelihood of this happening again//''.
!!''How to do it? ''
You will experience manualizing as part of your AMBIT training, one person will act as the 'scribe' recording the discussion and another person will act as the 'chair', making sure the team stays on topic. Below are some guidelines to getting started:
#Allocate some time in a team meeting for manualizing (some teams do this once a week, others once a month)
#Allocate two key roles: a chair & a scribe
#Make sure you are logged into [[Your Manual]]
#Start by creating a list of topics that you as a team could manualize- a good place to start might be things that you as a team do well or topics which are live issues for you as a team
#Choose a topic to manualize first
#Break the topic down into smaller sections using the [[Slice and Dice Method]] - ordering the sub headings before you begin
#You might discuss how individuals in the team have experienced this topic or why it has been chosen- you should then use an [[Active Planning]] approach whereby you make a plan about where you, as a team, want to get to, whilst recognising that things may change in the course of trying the agreed approach.
#You might revisit a topic if you do not complete it in one session - this is fine!!
#You might also revisit a topic if something hasn't worked or the situation has changed.
!!!!See [[Manualizing a live issue - Garry Richardson and Heather Tovey]] for a presentation on a team experience of manualizing.
----
!!''Benefits of Manualization?''
There are a number of key benefits to having teams engage in manualizing their own practice:
!!!(a) Promoting Service Development
#Engaging in continual, small, iterative and incremental "tweaks" and changes to ensure that there is [[LEARNING at work]] (see [[Manualization Boundaries]] where we emphasise the fact that manualizing is a //team//-based activity)...
!!!(b) Fostering a distinct LOCAL team culture
#A local team develops "our own unique manual" that is:
##//"Bespoke"// to our own local needs - attuned to the local population and geographical constraints (transport, culture, common clinical problems, etc)
##A record of the ongoing [[Mentalization]] efforts (the [[LEARNING at work]]) of our team, //about our team// as a whole (why we behave in the ways we do)
##A powerful tool for [[Inducting new team members]]
#We sustain a practice that is both //integrative// and //multimodal//, according to our [[Core Features of AMBIT]].
#It is hoped that the implicit sense that this method of working constantly tries to [[Respect local practice and expertise]] will also support positive team morale.
!!!(c) Comparing and sharing our work with other teams
In AMBIT there are already multiple teams beginning to adapt their own local versions, which you can see from the dropdown list on the [[signposting page|Other team's AMBIT manuals]].
* An explanation of how the manual supports the development of AMBIT as a [[Community of Practice]]
* The ability to see what other teams have been writing about is a function that is still in development. You can, however, openly look in other teams manuals- an easy way to see what they have written is to click on the 'Recent Changes' tab (below the search engine) and then click 'Local'. Additionally, you can ask one of the ambit project team to point you towards other teams who manualize!
!!!(d) Research
There is as yet little research into the use of wikis in learning organisations, but a helpful paper exists for those who are interested: [[Cole, M (2009) Using Wiki technology to support student engagement: Lessons from the trenches]]
----
<center><<image-link "How to edit your team's manual" "luciano-de-sa-ObwMZBdEWdI-unsplash (1).jpg" "How to edit your team's manual" "250">><<image-link "Other team's AMBIT manuals" "lysander-yuen-wk833OrQLJE-unsplash (1).jpg" "Other team's AMBIT manuals" "250">>
</center>
<center><<image-link "Your Manual" "free-to-use-sounds-W_FHuUQKNP0-unsplash (1).jpg" "Your Manual" "310">></center>
If the team is to collaborate together to achieve the aims of [[Manualization]] (which is really an aspect of version of service development), then clear boundaries and rules about how they interact with the manualized material are required:
!!Licensing
See information about the OpenSource and [[Licensed]] nature of the material already in this manual. Any new material created by local teams is uploaded and shared ''under the same agreements''
!!Disclaimers
We expect local teams to share their materials under the same [[Disclaimer]] that applies to the rest of this content: individual practitioners and their local management structures are always responsible for their own clinical practice, and never the multiple collaborative authors of this wiki who share ideas about best practice.
!!Sharing own thoughts
#It is important for ''each'' team member to explore and share their own thoughts ([[Mentalization]]) about what they are doing with their local team during a Manualizing session - team members are expected/encouraged to be active participants in refining [[Your Manual]] - this must be a representation of ''how we are trying to do this work''
#Differences are fine (expected!) and can be addressed in this process: [[Managing Differences of Opinion]]
#Each member of the team should be prepared to offer material to contribute towards manualization at team meetings. See [[Team Meetings]] and [[Manualization]] for instructions on how to do it.
!!Sharing a Team's thoughts.
Teams may (we hope and expect) develop better ways of addressing specific circumstances/new therapeutic modalities/clearer explanations/etc that become part of [[Your Manual]].
#Making changes to [[Your Manual]] is always a TEAM-based decision, and should always be authorised by the team manager (not the work of a lone maverick!).
#In general team manualization occurs after some form of team-based discussion (see [[Team Meetings]] and [[How to run a team manualizing session]]) and agreement amongst a group that is accepted as //quorate// (see [[Reflective Quorum]]) and thus //authorised// to make such changes.
#It is never appropriate for a single team member to make edits to [[Your Manual]] without such consultation and debate amongst the wider team. This means that the process of manualization forces teams to debate and reflect between each other upon //"what we do, and why?"//
#If outcomes data has been collected (see [[Evaluating outcomes]]), a team may well agree practice changes flowing from these findings warrant inclusion in their manual. If this is so, ideally include a brief description of:
##"What is different",
##Evidence from outcome evaluations/trials,
##Details of the specific target population and local ecology/geography/cultural factors for which this version has been adapted.
!!Sharing our clients' thoughts/experiences
#Critically important is DataSecurity - NO CONFIDENTIAL CLINICAL MATERIAL IS EVER UPLOADED - teams are responsible for the content that they upload.
#A [[Key Worker]] is expected to seek [[Service User Feedback]] from their clients, and may reflect on clinical experiences, but ''this material should NEVER be shared online'' unless the client is (a) a direct part of the process of content creation (b) has capacity to make informed consent (c) understands that any such personal material can be taken down immediately at their request
#The client can offer experience directly/anonymously in various ways, some of which are suggested in [[Service User Feedback]] but it is important to ''completely avoid uploading any identifiable features'' (names, addresses, or references to neighbourhoods, or schools, etc) - manuals are always and only for //generalisable learning// not accounts of specific events/people.
The intention behind these processes is to allow //other// teams seeking to work in this way ''to learn from experiences of other teams'' who may be working with similar client groups, or in similar cultural, geographic or economic settings to them.
From the AMBIT conference 2013:
<center> <html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/nzRTayaXXfg?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/nzRTayaXXfg?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></Centre>
----
!!''Starting to write about your own team''
This page <<tag [[Manualizing exercise]]>>acts as a topic heading (tag) for a number of blank pages that teams can use to start practising how they apply [[Manualization]] as a means of supporting their [[LEARNING at work]].
!!''Why to do this''
See [[Manualization]] for more detail. To ensure that ambit material actually speaks to your team, we encourage local teams to 'translate' core material into their own 'local dialect'.
''Manualizing is always a group process''. Its purpose is to help a team to share explicitly how the range of individuals within its membership understand some of the core ideas.
!!''What to do''
Step 1: Divide into groups
Step 2: Allocate to each group one the pages listed here: <<tag [[Manualizing exercise]]>>
(Alternatively, take the four different stages of the [[Thinking Together]] process and invite them to write their own versions of these)
Step 3: Identify scribe to write each groups feedback in the manual
Step 4: Reflect on this process.
!DRAFT content - currently under construction. Offer feedback using Comments button below.
!Slice and Dice of topics around "Suggested Interventions"
!!!1. Page layout points
* on the page [[AIM questionnaire - interactive version]] see ''Results'' tab:
** reorder/re-word the sub-tabs that are revealed there:
*** currently: ''[Suggested Interventions] - [Scores] - [Download]''
*** preferred layout/wording: ''[Scores] - [Download] - [Possible (EB) interventions]''
** Adjust the text under the 'Suggested Interventions' tab (re-named 'Possible (EB) Interventions):
* ''FROM current wording:''
>"These interventions are suggestions according to the AIM results and are based on available evidence. They are a guide and can be useful as a way of checking that these options have been considered, rather than directing a worker to what they must do."
* ''TO this wording (approximately):''
>The 'Evidence-Based' (EB) interventions listed here //relate directly to the actual scores entered into the interactive AIM//, and highlight possible interventions that at least //deserve respectful consideration//. They can be ranked in various different ways - e.g. [FOCAL] - targeting immediate crisis intervention, or [GLOBAL] targeting longer term changes to avoid chronicity.
>All the interventions listed //have some support in the evidence base for their effectiveness in highlighted problems//, but we emphasise that they are suggested as //'possible (Evidence-Based) interventions' ''not'' as requirements that are categorically necessary or sufficient// in a specific case: this is because there will be many contextual considerations to take into account, not least the client's choice, and local skills availabilities, etc. ''Clinical responsibility lies with the worker/local team, not the AIM's listed suggestions!''
>Note that these possible intervention lists are not exhaustive: there may be other evidence-based interventions that exist but which are not currently represented in this manual. On the other hand, //a worker who is not offering any interventions from the list(s) generated here// should reflect on whether they are providing/arranging for interventions that //fit the observed problems//, or only ones that they personally favour, regardless of the evidence! Consider the AIM results as one would any other professional character in the professional network - worthy of respect but not infallible!
!!!2. More description and explanation on the ''"Suggested Interventions"'' aspect of the interactive AIM
* We need a clearer statement of what workers need to understand about HOW these suggested interventions are generated in order for this to be helpful:
** Suggested interventions are (very broadly) linked to the existing //evidence base//
** Suggested interventions are possibly better described as ''"Possible (EB) interventions"''
*** There is NO suggestion that any of these interventions is automatically a //necessary// or //sufficient// response, but there is a suggestion that //'consideration of its potential relevance is advisable'//. We agreed that having a pop up in the manual page to state this wold be important
!!!3. What's the relationship between 'suggested interventions' and the CLIENT's choice?
* Balancing ''client-led working'' (that on its own risks being unhelpful, ineffective, carrying an 'opportunity cost' insofar as EBP's are potentially left out) with the risk of very 'top-down' ''evidence-led working'' (that risks being very teleological and non-contingent with client choice/needs)
* Potentially a worker could use the Young Person's (via [[AIM Cards]]) indications of KEY PROBLEMS and then LIMIT the listings to these?
!!!4. How do the Suggested interventions connect with ''ACTIVE PLANNING'' and other AMBIT ideas on planning?
* The 'Suggested Interventions' help with the process of [[Broadcasting Intentions]]
* They offer a more or less 'objective' alternative perspective from the point of view of
**(a) the AIM assessment framework and the worker's (or client's) answers/ratings
**(b) a synthesis of evidence based practices associated with each of the AIM items
!!!5. How does this help/connect with the Networks Quadrant (Integrating the help) ?
* The 'AIM/Suggested Interventions' might be characterised or treated as an extra column in the [[Dis-integration grid]]
**The AIM could in that context be characterised as a 'geeky expert' in the field:
***one that can describe //'what's the problem?'// in a set of 40 item scores
*** and //'what to do?'// in a list of 'Suggested interventions'
*** this might not be (or certainly isn't!) 'gospel truth' and suggestions will occasionally not in any way be appropriate/acceptable in the given context, ''but'' suggestions are at least based on some kind of objective engagement with reality (item scores) and evidence (links between items and evidence base)
* Treating the AIM results //as another element of the network// creates a tool to:
** ''justify engaging elements of the network'' (to do the things that the AIM suggests)
** ''consider the connections across the network'' (to allow for the relational aspects in the young person's network-context that will facilitate or prevent different kinds of work from occurring.
* ''A new tool - Concentric circles/Venn diagrams'': sketch out
** Who are the trusted workers?
** What are the key risks?
** What key problems (from the AIM) does the Worker(s) highlight?
** What key problems (from the AIM) does the Client highlight?
** What does the Evidence say might work (suggested interventions?)
** What does my Team say might work //here// (given our knowledge of local services and relationships)?
** What does the Young Person say might work?
!Planning from here
*We discussed (9.12.21) that we would like to remove the suggested interventions at the moment so that we can carry out an in depth piece of work around how best to make them understandable and helpful for workers. This work would include working out which suggested interventions come up in relation to particular profiles of AIM scores (for example we have found that child protection as a suggested intervention comes up when we have inputted a case without any need for child protection or relation to safeguarding
* Laura to produce version of the boxes/venn diagram tool
* add AIM Key problems and Suggested interventions to Dis-integration grid and TRY THIS OUT WTH A NUMBER OF CASES
* Consider carefully the nuancing of how we present this: treating the AIM with 'respect', but avoiding implications of a demand for (teleological) total 'obedience'
* Consider developing an additional day's training:
** '''Integrating evidence and experience: Active Planning and use of the AIM in AMBIT-influenced working.'''
!!Why map social-ecological needs and goals?
The primary task is to produce a reference document for the Team and the family network. This can act as a route map for the reintegration of the young person into social functioning. Equally, it provides both an opportunity to test hypotheses about the nature of the family's expectations as they are involved in its production, and, over time, functions as a measure of progress.
''The client or family should be involved in this''. In the early stages of assessment and treatment it may be difficult for the client to concentrate or contribute, and this highlights the fact that document produced is only ever a working draft and can, and should, be consistently updated. The process of involving the family is a useful tool for engaging them, encouraging a sense of agency and reinforcing their expertise in knowing what is needed, and what is available.
Part of the aim of this area of work is to broaden the perspective of the worker to aspects of the client's life that they may not be immediately aware of. Socio-ecological needs covers a very wide range of life experience including health, educational, vocational, employment, religious, recreational needs. This can feel a bit overwhelming for workers so the aim is not to try to address all of these but to find specific areas of life in which one can develop individual goals for the client. For example, the client may have strong religious beliefs but is anxious about making contact with a church or mosque. So a goal could be to support them in making such a contact.
This page will need map out the range of socio-ecological needs that could be considered.
!Immediate Care needs
* These needs have also been covered in the [[Multi-Domain Assessment]].
* The young person needs to be cared for, perhaps initially with constant attention, by responsible adults at home.
* Make a timetable (see the 'Contingency Planning' proforma).
* Look for gaps in availability of personnel that might need filling, perhaps by extended family, friends, or other community-based resources, or by the Team.
!Therapy needs
* This should be specified as part of the overall care plan produced as a result of the [[Multi-Domain Assessment]].
!Health needs
* The client needs access to a GP and other primary care services, and to emergency services based at the local A&E.
* Some families - especially recent arrivals from minority ethnic groups, may find it hard to identify and enlist such services, and they may need help in negotiating the task of registering with a GP, etc.
* There may be local agencies specifically set up to provide such services, to which the family need directions for making contact.
* In addition, the client may need dietary advice, or have special dietary needs (for instance if there is comorbid diabetes.)
* Access to health pursuits such as exercise may be an issue:
**if this is identified, does the young person or the family know where to find local sports centres, parks, etc.?
**Are there any impediments to accessing these services that need to be negotiated?
!Family needs
This refers to:
* The young person's needs of the family, and
* The family's needs
** The young person may need the family to put aside intra-family or inter-family conflicts during the period of acute management of the situation (a systemic understanding of the illness behaviour may be helpful in such a context: is the disturbed behaviour a way of signalling for and enlisting outside support, of resolving some impasse?)
**There may be issues of separation, autonomy, etc that need to be worked through.
* From the family's point of view there may be a need for respite from the struggle and anxiety.
**Are there ways in which individual family members can get this (staying with relatives or friends for a night or so?)
*There may be needs not directly connected to the young person's mental health (Housing, finance (or Benefits advice), Employment, parental mental health, whether they tell other people in their community or how they explain the difficulties to them...etc.)
** It is important not to allow the process of mapping these needs to be hijacked into conflict resolution or family therapy work, but simply to record these needs as the young person, family and keyworkers see them.
* List the goals.
!Social activity needs
* This gives a chance to explore what the young person's and the family's ideas about normative social activities might be. Culture is likely to play a significant part in these expectations (See section on sensitivity to the [[Cultural Context]]).
* In exploring these needs, ask what other young people in the family, or known to the family, would //ordinarily be expected to be doing// socially, at this stage in their lives.
** What would the young person have to be doing for him/her and their family to think they are "back to normal again."
** What sort of contact with friends would be appropriate?
* The issue of the ''__young person's safety__'' may be raised.
** This is often a source of conflict in families, highlighting inter-generational differences. Again, it is important to list the different needs but avoid being drawn into family therapy at this stage.
**Reframing conflicts as "both/and" statements rather than "either/or" may be helpful; for instance noting that the young person needs contact to maintain links with his or her peer group and the family needs to feel that their concerns for safety are being addressed.
*//''"Is one of the goals to arrive at an appropriate compromise between different members of the family?"''//
* Likewise, there may be significant differences of opinion in the family regarding the ''__cultural acceptability__'' of certain social activities (e.g. dating).
** A similar approach to that outlined for safety needs to be adopted, holding in mind the primary task at this stage which is to document, rather than to solve, these dilemmas.
* Re-integrating a young person who has had a serious mental health problem into a social milieu is very challenging. The young person and the family might identify a need to do some pre-emptive planning in respect of likely difficulties. Examples of particular difficulties that can be addressed in this way include:
** Answering questions: A common concern is how the young person should respond to questions from peers about where he/she has been, what are the scars on his/her arm, etc? A need to rehearse a range of appropriate answers to such questions may be identified. Talking through strategies, making lists of possible responses, or role-playing can be useful in planning for such eventualities.
** (Re)-Entering a group: The thought of actually walking into a social group after an absence caused by mental health problems is highly anxiety provoking, and may lead to avoidance strategies. Is there a need to rehearse this, or is there a need for an appropriate chaperone (a sibling, a cousin, a close friend who can be made a confidant ahead of other friends and acquaintances?) to facilitate this?
!Educational activity needs
This is covered in the section dealing with [[Educational-Vocational Training]].
!Language/Communication needs
* If English is not the first language then interpreters may be required.
**Sensitivity to a family's concerns about issues such as confidentiality in respect of interpreters is required.
**If at all possible the family should have access to the same interpreter, rather than having to meet a series of different individuals.
* List any needs and goals.
!Cultural/Religious needs
* This is also covered in the section addressing Sensitivity to [[Cultural Context]].
* It is helpful to make use of [[Cultural consultation]] when working with families from very different cultural backgrounds from one's own.
* Equally, an open, respectful curiosity (see [[Careful and concerned CURIOSITY]]) about the culture and customs of the family can facilitate engagement.
* The keyworker should consider whether their formulation and interventions are meaningful to the family and fit with their cultural and religious beliefs.
* Explore the communities’ expectations of the family and the young person.
** If there are differences in opinion within the community and family about these matters, be sensitive to the issue of shame, which parents may feel acutely if their children are seen as breaking traditional taboos.
** Likewise, if appropriate, ask about attitudes to mental illness in the family's culture.
** Ask about how other families manage such difficulties.
** Are there community resources that could help to mediate in such matters?
** Is one of the goals the arrival at an appropriate compromise between different members of the family?
* Explore the ''__family's expectations__'' regarding the duties of children, attendance and involvement at a place of worship, and major ceremonies such as rites of initiation (Confirmation, Bar Mitzvah, etc), Marriages, etc.
** Are there any such events, or important feast days or fasts, approaching, that might alter the family's availability, or be placing additional stress upon family members?
** Ask about what the religious teaching is in respect of adherence to particular rules in the context of illness (for instance there are special allowances for pregnant women, the elderly and the sick during Ramadan.)
** Is there a need for professional guidance in the form of a priest/Imam/Rabbi? See [[Cultural consultation]].
* ''Accessing Services''
** Are there particular days (e.g. Sabbath) that would make visiting more difficult?
** Are there specific rules regarding pollution (eg removing shoes indoors) that the family need to inform visitors about?
!!Why map social-ecological resources?
The primary task is to produce a document with all the resources available to the family and the young person.
!!Editing this document (for local teams)
You can edit this document by opening the tiddler [[Mapping social-ecological resources]]
!!Culture and Language
This is a key area to consider: See [[Mapping cultural and language resources]]
!!Family resources
See Family History and Family Work.
Also consider ''Family expertise'': The family may have information about additional agencies that are unknown to the KW or the team, and they should be asked about this. The kind of agencies that might provide support are local hospital transport schemes, self-help groups (such as Carers' groups for people caring for individuals with mental health problems) and support groups for people with specific disabilities (for instance there are many local groups for families affected by Autistic Spectrum Disorders).
*N.B. Sharing information: It is important to emphasise to the family the value in their communicating which groups/agencies they are involved with to the [[Key Worker]]; this should minimise the opportunities for splitting and the provision of multiple/parallel interventions.
!!Social activity resources
Are there particular resources in the local area such as parks, leisure centres, swimming pools, clubs, churches, etc
!!Team resources
See [[Working with your TEAM]] - consider things like people or organisations who might be useful to the team for [[Cultural consultation]].
!!Local health resources
Compile a list (with contact numbers) of the following:
*Local GP practice
*Health visitor
*Local A&E department
*Voluntary agencies.
To some extent this will be a database that the Team as a whole needs to take responsibility for documenting, and updating on a regular basis, which should be available to all [[key worker]]s in the Team.
!!Young person's social network
Map the young person's existing social network including the extended family - who does he/she see, where do they meet and how often? Friends, family members, clubs, etc. Use [[The AMBIT Pro-Gram]] to do this
*Ask about the network as it was before the current crisis, and check with the young person who she would be seeing at this time if things were back to normal.
*In consultation with the family and young person, (as well as drawing on information available to the Team, who may know far more than some - e.g. refugee - families) list the resources available locally:
**Youth clubs (including arts centres, music clubs, etc); what social interests did the young person have before, and what would they be doing now if things were back to normal?
**Sports clubs/centres, swimming pools etc.: What sporting interests if any did the young person have before, and what would they be doing now if things were back to normal?
**Volunteer agencies: These may be useful in two respects:
#For enlisting volunteers to help the family/young person (e.g. local Befriending Schemes, local Mentoring schemes.)
#For the young person to engage in voluntary work as a normative social activity.
**Local charities: Some local charities have funds for helping with holidays for young people and carers with special needs, etc., or may provide other services to families in need. (It would be important to gauge the family's attitude towards putting themselves forward for such support, as some might object or be offended.)
<a class="tc-float-right">[img width="150" [mm.PNG]]</a>
!!!AMBIT Assistant Psychologist
Marianne is the Assistant Psychologist to the AMBIT programme providing support with the online manuals and manualizing.
<div style="clear:both;line-height:0px;"></div>
<a class="tc-float-right">[img width="150" [md.PNG]]</a>
!!!AMBIT Trainer
Mark is an AMBIT Trainer based in Barcelona, Spain.
<div style="clear:both;line-height:0px;"></div>
This describes how a carer (often the mother) helps a baby/child begin to develop [[Mentalization]].
The mother responds contingently (see [[Contingencies]] for a definition) to her baby's emotional states and does so by mentalizing what might be motivating the baby to behave in the way he is - i.e. when the baby is crying she may conclude that
>//"He is likely to be angry, or upset, and that might be because he is hungry, or has a dirty nappy, or needs to be 'winded', etc..."//
She then ''mirrors'' the emotional state that she imagines the baby is in the middle of -
>She might frown at the baby, etc... ''BUT''
She also @@color(blue):''marks''@@ this mimicking of what she thinks is the baby's mental state...
>She deliberately ''engages'' the infant (using eye contact, and a certain amount of exaggeration - what is referred to as [[Ostensive communication]]) talking in a cheerful, sing-song voice, or holds the baby particularly gently...
This is as if to emphasise that:
>//"Wake up baby, I'm going to tell you something important about yourself!... This is what ''I think may be going on for you right now'' [say, anger] - this is __you__ ''"being-angry"'', it is ''not __me__'' being-angry with __you__!..."//
When this happens ''iteratively'' (again and again, hour by hour) it helps the developing baby begin to develop a sense that...
>//"I have a mind, and that mind can exist in different states - happy, sad, frightened, angry, etc..."//
Which is the beginnings of mentalization...
!Using this in our work:
We often speak of ''MARKING'' things out in our work (particularly OUR thoughts/guesses/hypotheses about the MENTAL STATE of the other person.)
In "marking" we are placing a "frame" or a "highlighter" around our communications at these specific times. This is just the same as when the mother deliberately uses "caricaturing" or other ways to show that she is "just painting you a picture of what //I think that I am seeing in you!//" - she is not BEING or EXPERIENCING those same things herself (a mother with a cross baby does not shout or roar back at it, although she may frown while talking in a sing song voice.)
This marking helps "//wake us up//" to the fact that somebody is trying to offer a //"best guess at how I see what is happening right now"// - and is exactly how the mentalizing practitioner tries to broadcast his or her understandings/imaginings and [[Intentional stance]]. The marking invites the recipient to stop and mentalize!
At the risk of overstating this, there is a sort of analogy with the use of specific rituals in some religious ceremonies - the ringing of bells, lighting of incense, etc, which serve to //mark// the presence of "//extra levels//" in the interaction at that particular point in time.
!!What is it?
This is the first step in a four-step 'ritual' called [[Thinking Together]] that is designed to help improve the quality of //communication about our work//, and thus to improve the //quality// of that work.
!!Why do it?
Most clinical discussions (we argue) start with [[Stating the Case]] and move straight into generating solutions ([[Return to Purpose]] in our language) - missing out two key elements (''Marking the Task'' and ''Mentalizing the Moment''). Investing some time in developing a plan - either for something as 'simple' as a conversation with my team-mate, or for something as complex as trying to help a young person, is associated with better outcomes than relying on chance, 'inspiration', or intuition on the part of the helper in determining what would really be helpful to her colleague.
More than this, Marking the Task involves a deliberate attempt to ''//kick start mentalizing in the worker//'' who is asking for help - emphasising that //in these conversations we ritually insist on mentalized explanations for behaviours - our own, as much as our clients'//.
!!Using chat usefully
As practitioners, we all talk about our clients in all kinds of ways and in all kinds of places. Stories are often what draws us into this work, and this is both a positive and potentially a negative, as we can get lost in the stories, especially if they are very compelling or anxiety provoking.
Marking the task is about making the best use of these conversations - that are generally happening anyway.
There is a risk that one practitioner's capacity to mentalize about what his or her colleague is //actually requesting// may not always be accurate. One team member may be keen to "pass the time of day" whilst the other is actually requesting a very serious discussion about important clinical material.
@@color:seagreen;__''KICK-STARTING MENTALIZING''__
As mentioned above, in insisting that my colleague stops and asks //their self// ([[mentalizes|Mentalization]] their self):<br><br> //''Why am I coming for help? What do I want out of this "help"? How would I know that I had been helped?''//<br><br>We are ''setting the tone'' in a conversation that insists quite explicitly on mentalized explanations by all participants. By insisting that our colleague does not rush headlong into [[Stating the Case]] we invite them into a mentalizing frame of mind - ''//"Help me understand what you think you need out of this conversation"//''@@
!!What is "Marking"?
We draw on the theory of [[Marked mirroring]] and [[Ostensive communication]], that explains how mentalization develops through infancy, and which is also a helpful technique that practitioners can use in working with clients who are in distress. In "Marking" the [[Key Worker]] takes responsibility for the clarity of his of her communication, and minimises the likelihood of misunderstanding about what is being asked for.
By explicitly MARKING a discussion we mean saying something that //explicitly// marks out what you want out of this conversation - that it is NOT just "passing the time of day" (although one could mark out that as the task, just as easily!):
>"I want to talk about THIS client, in THIS particular way, for THIS amount of time..."
A core team task in AMBIT is to foster and sustain [[Mentalizing]] in team members. By using language very explicitly in this way this function is supported.
!!''How to do it''
These are simple steps, and the key is for team members to find their way into using these as one of the [[Rituals and Disciplines]] that define the team's culture.
!!!1. Cards to choose from:
Some teams have printed out sets of [[Marking the Task Cards|AMBIT Marking the Task cards v2.pdf]] that list a wide range of options to help them think about the many different kinds of help that are commonly asked for.
!!!2. Ritualised language
Some shared "marker" that all team members will recognise is required. We have called these disciplines "[[Thinking Together]]", or "[[Passed-outwards Discussion]]s" (or "[[POD]]s"), and any of these phrases might be enough to signal that a very specific kind of communicating is being requested right here, right now. Teams may wish to agree in their //own// rituals to mark the introduction of this disciplined way of communicating - a simple form of words that carry a shared meaning as part of the team culture. What is important is that these Rituals are EXPLICITLY agreed, rather than IMPLICITLY //assumed// to be in place.
!!!3. Set boundaries
Agree ''how long we both have'', and ''what is the outcome we want''. This has been described as "turning the conversation upside down" and starting by defining what the ending might look like. The [[Key Worker]] requesting this should have in mind:
>//"what would a satisfactory outcome of this discussion look like?"//
Is there a key issue that needs a decision?
Is there an area of confusion that needs a better framework for understanding it?
Is there a crisis that needs an emergency management plan to ensure safety for the next few hours?
Is there a wish for some "ventilation" of feelings?
Is the task... to work out what the task is?
Etc...
!!!4. A contract
By agreeing to take part in a ''Marked'' discussion of this particular type, the colleague is effectively "contracting" to maintain the boundaries in the next steps - to //keep the staff member on task// and to help keep to these particular [[Boundaries]].
Mary Target is a psychoanalyst and is now Mary Hepworth. She was a Professor at UCL and was one of the original discussion group out of which AMBIT emerged.
The aim is to create a simple and low burden feedback system that could help teams to see how they are progressing against their agreed objectives. The precise method will be the decision of the team. Below are some suggested approaches to this.
!!Using staff ratings to measure change against objectives.
For example, a team may agree that the objective is to establish clearer goals with the young people that they work with. Taking this as a measure we could invite team members to feedback on a scale of 1-10 as to how they think they have been doing against this measure and also how the team has been doing. These ratings could be recorded using POD -. [[POD - a web based outcome measurement system]]. Team members could be invited to complete these ratings once a month with an agreement to discuss these ratings every three months.
!!Using standardised measures to record staff experience
If there was concern, for example, about staff morale or burn-out, it may be more appropriate to use a standardised measure about stress such as the GHQ in order to obtain more comprehensive information about this aspect of team working.
!!Obtaining feedback form young people
There is a whole range of suggestions about measuring outcome for young people in other parts of the manual e.g. the [[AIM]] system of measuring problems, or more standard problem checklists or satisfaction of service questionnaires (ESQ).
!!!Source: Julian Childs and colleagues at CORC at the Anna Freud Centre.
''Calculating recovery and reliable recovery''
''Recovery''
This uses the reliable change methodology (see [[Measuring reliable change]]).
''Recovery'' is shown if a young person moves from above a threshold or cut off to below a cut off. The size of change may be less than required for reliable change.
''Reliable recovery'' is shown if both recovery and reliable change criteria are met:
#the young person scores above a threshold at Time 1 and below threshold at Time 2.
#the young person shows improvement in scores greater than the reliable change criterion are considered to be ‘reliably improved’,
!!!Source: Julian Childs and colleagues at CORC at the Anna Freud Centre
!!''Calculating reliable change''
''Reliable Change''
This calculates whether change in scores was greater than could likely be solely attributed to measurement error.
This involves calculating a reliable change criterion score. This is the amount of change that needs to occur between Time 1 and Time 2 for change to be more than chance variation due to measurement error. This score will be different for each measure that is used.
''Reliable improvement'' is shown if the young person shows improvement in scores greater than the reliable change criterion.
''Reliable deterioration'' is shown if the young person shows reduction in scores greater than the reliable change criterion.
''No reliable change'' is shown if the young person does not show a change in score greater than the reliable change criterion in either direction.
!!''How it is calculated''
This formula calculates a size of difference between Time 1 and Time 2 for a particular sample of cases. For example, for goals measures, this is routinely recognised as being a difference of 2.45 on a ten point self report scale. This is called the reliable change criterion. For different measures and for different samples, the reliable change criterion will be different.
Reliable change criterion is calculated using the formulae below.
Reliable change criterion = SE(diff) * 1.96
SE (diff) is the Standard Error (difference). This is a statistic which estimates the amount of measurement error in a sample. Large measurement error indicates that changes may be due to measurement error rather than 'real' change. Small measurement error enables more confidence to be placed on changes in scores over time.
It is possible to calculate the S (difference) for each sample of data for different services. You need to know the standard deviation for your data at Time 1 and Time 2 and the size (number) of your dataset. Comparing T1 and T2 data, the sample size should be the same for T1 and T2.
It can be calculated using a basic calculator function on a standard PC or laptop. The formula is shown in http://vassarstats.net/dist2.html
For more information on calculating reliable change please go to the CORC website.
Page in development July 23
''The purpose of this page is to explain why and how we can measure the impact of AMBIT training with a team, service or network.''
When implementing AMBIT, we believe the training itself is only one part of the process.[[ Implementation science|Implementation Science]] tells us that changing practice is difficult and takes good planning, deliberate effort and support from a network at a number of levels. Much of the change (the actual implementation of the model) happens after training.
//''How do we measure implementation of AMBIT and learn whether AMBIT is making a difference to our work?''
//
!!!(i) Understanding the needs of the team
AMBIT training is designed to support services with particular challenges that they face in working with clients who have multiple needs. In order that a training makes a helpful difference, before it starts it is important that those involved are able to identify the issues or dilemmas that they would want training to help. We see this as mirroring the helping process with our clients, that before we embark on offering help, we first need to develop a shared understanding with our client of what their needs are and what may be helpful to them. The pre-training [[consultation process|AMBIT Consultation Day]] is designed to do this. The intention is that through working with the team before training, the AMBIT team and stakeholders are able to better understand the challenges for the service and work out where and how a training could meet these needs. This aim is that the consultation process leads to shared training objectives based on the expressed needs of the team.
!!!(ii) Outcomes for AMBIT training
There can be different intended outcomes (objectives) for a team who take up AMBIT training. In order to understand the impact of training we need to know whether there is progress towards these outcomes over time. The objectives may be both short and long term and some of these may be directly connected to the training e.g. // the Team to have a shared understanding of mentalizing and non mentalizing and ways to apply this to client interactions. //Some objectives may be indirectly related to the AMBIT training i.e. there may be a number of variables aside from AMBIT training that influence this outcome, but there is an intention that AMBIT could help this e.g.// For the team to reduce levels of burnout in our staff.//
The AMBIT program team has created its own [[ logic model|Logic model for AMBIT training (as an intervention)]]. This sets out some general outcomes that AMBIT training is designed to achieve. These won't all be relevant for every service, however they give a sense of common themes that often arise for services who take up AMBIT training.
In order to understand whether AMBIT training is making a difference, we can measure;
(i) Outcomes in relation to teams' specific training objectives and progress towards these over time.
(ii) A teams' progress towards overall objectives of the AMBIT program itself , as shown in the[[ logic model|Logic model for AMBIT training (as an intervention)]].
Note -we can use Quantitative and qualitative- implementation stories and examples...
''Measuring outcomes in the areas above helps;''
*A team to learn how they are progressing in relation to their objectives, informing their implementation of AMBIT going forward
*Learning about the effectiveness of a service, highlighting service developments and service outcomes
*The AMBIT program to develop the model through learning about a range of implementations of AMBIT and their impact
!!!Measuring outcomes of AMBIT training
list under specific outcomes linked to logic model
* The [[AMBIT Practice Audit Tool (APrAT)]] - is a way of a worker auditing a specific case in relation to the key areas of AMBIT practice
* The [[AMBIT Service Evaluation Questionnaire (ASEQ)]] - This measures a team's experience of their work in relation to the four core practice quadrants of AMBIT ([[Working with your CLIENT]], [[Working with your NETWORKS]], [[Working with your TEAM]] and [[LEARNING at work]]). This can be used before training to plan how training is adapted to fit the needs of a specific service. It can be used again after training to track change and progress
*[[The AMBIT Implementation Questionnaire|AMBIT implementation questionnaire.pdf]] is a tool that measures the application of AMBIT practice across a team. This can be helpfulto find out which bits of the AMBIT framework are being used in practice after a training and going forward.
!!!Teams may also have their own specific goals for training, and can develop simple ways to track these, for example;
*'''We'd like to reduce the level of staff burnout'''
Here we might record the level of staff turnover over time, or use a staff well-being measure such as the
[[GHQ-12|GHQ-12]]. We could then track whether there are changes in reported well-being over time, with the aim of understanding changes and developing practice of the team in relation to these.
*'''We'd like our team meetings to be less stressful and more helpful for team members'''
Here we could ask workers to anonymously rate how helpful the meeting was, or, how stressful it was on a simple scale. This would allow some evaluation of whether the hoped changes were happening and exploration of what might be helping/not helping, so as to further develop how the meetings happen.
!!!Please see [[Evaluating AMBIT trainings]] for more on the framework and theory we use to evaluate the impact of training.
Short term Outcomes;
1. Progress towards team training objectives
measure= Goal Based Outcome ratings of team objectives at start, end and follow up post AMBIT training
3. Teams’ use of practice and principles in 4 quadrants of AMBIT
Possible measure = AMBIT Implementation Questionnaire
https://manuals.annafreud.org/ambit/index.html#AMBIT%20implementation%20questionnaire.pdf:%5B%5BAMBIT%20implementation%20questionnaire.pdf%5D%5D.html
AMBIT Informed Team Practice (brief audit measure developed by Peter Fuggle March 23)- less sensitive to capturing change - this is a 'good practice' audit tool
https://forms.office.com/Pages/DesignPageV2.aspx?subpage=design&token=19c5a76ab2b543a5b5de00af6da8e3bd&wdlor=cA6C1917E-F492-4C04-96D1-A87DDBF53216&id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUOEpHN0k2ODVZNEQ4M1M3OU5ZV1o2QkNPMiQlQCN0PWcu&analysis=false
Longer term outcomes;
1. Improved Staff well-being
Possible measure- Schools staff well being measure adapted?, Team Climate Inventory?
2. Reduced staff burnout
Possible measure- Copenhagen burnout measure, measure of staff retention?/sickness?
3. Increased capacity to achieve teams own local objectives
Possible measure- outcome measures unique to team e.g. rates of substance use (TOP), number of inpatient admissions etc, ( note the AIM could be used here as the outcome measure for client functioning)?
4. Improved connectivity across the network
Possible measure- INTEGRATE network function measure, NET -AIM Q ? https://manuals.annafreud.org/ambit/index.html#NET-Aim-Q:NET-Aim-Q%20%5B%5BAMBIT%20implementation%20questionnaire.pdf%5D%5D.html
This page shows a role play example of mentalization based therapy with Antony Bateman and also an interview with Peter Fonagy about some of the core ideas about MBT.
!!An example
There are a lot of [[Videos]] embedded in the pages of this manual, many of which show role plays of aspects of Mentalization-based work which we encourage you to browse. Here is Prof Anthony Bateman, one of the originators of MBT, role-playing an MBT session.
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/oeboLKNV3PQ?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/oeboLKNV3PQ?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!Addressing Specific Failures in Mentalizing, Fostering Effective Mentalizing.
Mentalization based work is aimed at reducing dysfunction in mentalizing, and encouraging successful mentalizing.
Key concepts that help to describe the ''primitive ('pre-mentalizing') states of mind that are adopted when mentalizing fails'' are described at [[Pre-mentalistic stances]].
In fact, we have suggested that ''all that we label as "psychopathological"'' may be seen as the mind misperceiving or misinterpreting the status of its own contents and its own functions. See [[Specific diagnoses and their corresponding mentalizing failures]]
----
||''It follows from this formulation that a common component of effective psychological therapy must be the restoration of normal mentalizing.''||
----
Most systems of psychological therapy recognise the important role of the patient-therapist relationship as a key ingredient of change. The most critical yet generic facet of the therapeutic relationship is the therapist's mentalizing in a way that fosters the patient's mentalizing and undoes dysfunctions of mentalizing such as those considered above.
Further, a young person's family may be in trouble as an interpersonal system because of a collective failure of mentalization where selectively or in combination the family's 'mind' no longer functions to represent the feelings, thoughts, ideas and aspirations of each of its members consistently, truthfully and comprehensively.
In these situations, just as in the case of intervention with an individual, the therapist is there as a mind who has the client's mind in mind, whether the client is an individual or the family. The kind of intensive interpersonal interaction concerning emotionally significant issues has the potential to recreate the interactional matrix of attachment in which thinking about thoughts and feelings originally develops and flourishes. This framework emphasises the process of interpretation rather than the content of any understandings. It is the act of making sense of the sense made by another which has the promise of being therapeutic, that is, if it is experienced as being understood.
This approach to psychotherapy may almost be considered one of offering developmental help to a family or system collectively stuck at a phase of individual development that antedates the acquisition of a genuine understanding of mind.
!What are you working to achieve?
There are 3 core tasks in all [[Mentalization Based Work]], and this involves addressing the different [[Mentalizing Levels]]:
#The first concerns restoring [[Implicit mentalization]]
#The second concerns fostering [[Explicit mentalization]]
#The third and "highest" function of mentalization is learning about and fostering [[Affective mentalization]], or [[Mentalizing the Moment (in the Mentalizing Loop)]].
!!Aims of individual Mentalization based work
Individual therapy with the young person (YP) has a variety of aims:
#. To ''offer the YP a relationship with an adult who has the YP's best interests as his central concern and who keeps the YP in mind''. The keyworker (KW) has an overview of the YP, his family, his social network, his school etc. An important aim is to convey to the YP the KW's central interest in the YP, as a person-who-matters within this matrix. It is possible that some of the youngsters in crisis may, due to the distress of the adults around them, have experienced a loss of this sense of mattering. Some may never have had it. It is thought that this element of the relationship with the KW is likely in itself to be containing and therapeutic.
#. To ''help the YP to bring together and integrate his experience of the other aspects of the intervention'' (family meetings, multi family meetings, adolescent group meetings, educational interventions and pharmaceutics). Wherever possible the KW will be the worker undertaking these other interventions and will therefore have seen the YP in a variety of situations. Sometimes some interventions may be made by a colleague (eg. in running an adolescent group of which the YP is a member). The KW will be in close and regular contact with any other worker involved in the programme and this will be explicit to the YP.
#. To ''provide a safe setting for the YP to express feelings and concerns and have these heard and understood''. While it will be explicit that the team will share these concerns with each other it will also be made clear that anything the YP tells the KW will not be repeated to his family or, for example in a group with other patients, without negotiation with the YP. The exception to this will be anything which makes the KW think that the YP or some other person is likely to be in danger and the family may have to be involved in keeping him safe.
#. To ''help the YP become aware of thoughts, feelings and behaviours which impact negatively on his wellbeing''. Further, to help him examine the sources and causes of these as well as the effects and to consider whether these ways of being are the most adaptive that can be achieved. This aim further divides:
##. Helping ''to make explicit rational perceptions that have been suppressed'', e.g. that a parent is ill or that the YP is at risk or is actively being harmed
##. Increasing ''awareness and understanding that some thoughts and feelings (both explicit and more implicit - less conscious), about himself and/or about others may be inaccurate'' (e.g. his belief that people know his ‘disgusting’ thoughts and therefore hate him), helping the YP develop the capacity to take a perspective on himself and others and promoting reflection about himself and his relationships. In this aim the YP's relationship with the KW may sometimes be used as the locus for the therapeutic work, encouraging the YP to think about his relationship to the KW.
#. To ''enable the young person to develop and use more adaptive psychological responses and behaviours outside of the immediate context of the therapy''. Traditionally, Cognitive Behavioural approaches have used more explicit techniques for generalising shifts in understanding and feelings into real life situations. The aim of integrated therapy would be to equally promote psychological change both within and outside the therapy itself.
!Theoretical underpinnings of the approach
An interview with Prof Peter Fonagy OBE, Chief Executive of the [[Anna Freud National Centre for Children and Families]] and, with Prof Anthony Bateman, the orginator of MBT.
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/rrIbb92samk?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/rrIbb92samk?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
The individual treatment of the young person rests on and uses a mixture of attachment theory, cognitive behavioural theory and techniques and psychodynamic theory. There are fewer techniques from psychodynamic treatment, as community-based treatment of severely disturbed young people is not a context where we see the direct application of psychoanalytic therapy techniques as appropriate. The influence of this model is more through incorporating some of the principles into the keyworker’s understanding of the motivations and problems of the young person. A derivative of psychoanalysis, attachment theory, is used more explicitly in shaping technique, as is the idea of mentalization, rooted in psychoanalysis and seen by us as underpinning therapeutic work of various orientations.
*A main assumption is that the relationship of the young person to the keyworker will provide a context where an [[Attachment]] may develop (a safe, dependent relationship on a trusted adult, within which good independent functioning can be developed), where the nature of this attachment can be examined (at least by the keyworker and perhaps by the young person) and where consistency and reliability may promote security of attachment thus leading to the possibility of enhanced reflectiveness.
*[[Cognitive Behavioural]] techniques will be used to help the young person examine his assumptions and develop more adaptive modes of functioning.
*[[Psychodynamic]] ideas will also be used to help the keyworker form hypotheses about possible unconscious reasons for the young person's behaviour. Sometimes such hypotheses will be shared with the young person if it is thought this might help. For example, if a young person is behaving in a negative and maladaptive manner which does not seem amenable to rational discussion the keyworker may see an opportunity to offer him a hypothesis about this, usually related to the way he may unconsciously be perceiving the keyworker (e.g. //"I may be wrong //{note the tentativeness in this} //but I get the impression you expect me to want to get away from you, as you feel your Dad wanted when he left you and your Mum..."//)
It is acknowledged that the theoretical integration of these theories presents potential difficulties in the implementation of therapy and that there is a risk that sessions could become theoretically incoherent. The aim of this manual is to address this risk. We believe that these difficulties are more than outweighed by the advantages of trying to address limitations in each of the theories as separate therapy models. For example, in [[Cognitive Behavioural]] work, the relationship with the therapist is seen as crucial but the nature and processes involved in establishing an effective therapeutic relationship are much less fully articulated than in psychodynamic theory.
Mentalization is one of the [[Core Features of AMBIT]] and underpins the AMBIT approach. This page describes Mentalization in general and ''Mentalization in AMBIT''. Additionally, you may be interested in [[Training Exercises for Mentalization]].
!!''What is Mentalization ?''
''Mentalization is...''
>>//'The imaginative activity of making sense of the actions of oneself and others on the basis of intentional mental states such as desires feelings and beliefs'//
>>//'So, mentalizing is what we do when we are imagining what might be going on in the mind of someone, //underneath// the behaviour that we see on the outside'//
''We can mentalize ourselves...''
"Why do I keep getting into this same fix?..what am I thinking or feeling that means I keep ending up here?’’
''We can mentalize each other....'' “My mum doesn’t seem herself tonight…I wonder if it’s because she’s worrying about… or maybe she’s been thinking about…’’
''Mentalizing is a uniquely human process.'' It is something that we do automatically, often without conscious thought, in our every-day interactions. This is known as [[Implicit Mentalization|Implicit mentalization]]
Almost all aspects of social interaction involve the capacity to mentalize: //to understand the other person's behaviour in terms of the activity that has taken place inside their minds//…
//''Imagine if we never had any sense of other people’s feelings, beliefs or intentions..''//
We can also mentalize in a more conscious and verbal way. For example, in a therapeutic context with a client, we may try to understand with them, their mental states or the mental states of others, that underly certain actions. This is known as [[Explicit Mentalization|Explicit mentalization]]
So why use the term 'Mentalization' if this is what we already do? For some explanation on this, please see [[Is this the same as academic theory X,Y, or Z?|This is the same as academic theory X, Y, Z...!]] and [[Isn't mentalizing just being supportive?]]
Below are some video teaching sessions of varying length and detail explaining mentalization in slightly different ways.''
''For those who prefer to read, there is more explanation and links to related theory and concepts throughout this page too.
!!''Video teaching''
!!!Training videos
For most teams (short version - 10 mins):
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/sq61A5wGC8o" frameborder="0" allowfullscreen></iframe></html>
!!''A brief conversation about Mentalizing ''
Wih Dr Jon Allen, Menninger Clinic, USA
<iframe width="560" height="315" src="https://www.youtube.com/embed/NLT7ieO3hTk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
!!''Prof Peter Fonagy - interview: What is Mentalization?''
Peter Fonagy here describes mentalizing and its applications in a 20 minute interview made at the Anna Freud Centre.
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/OHw2QumRPrQ?rel=0" frameborder="0" allowfullscreen></iframe></html>
!! Where does the theory come from and why does it matter?
Mentalization (or Mentalizing as many practitioners prefer), originates as a hybrid, and not essentially novel, idea from: Philosophy of Mind, [[Attachment studies|Attachment]], [[SystemsTheory|SystemsTheory]], and Neuroscience.
It has been proposed by a group of psychologists working in the United States and Europe. It combines the framework of [[Psychoanalytic theory|Psychodynamic theory]], [[Attachment theory |Attachment theory]]and aspects of research on social-cognitive development.
It is proposed that mentalization is one of the core processes that effective therapies have in common. And in some ways the study of mentalization attempts to create a shared language between different therapeutic models. It explores how these shared factors play an important role in creating change.
''Mentalizing is central to understanding, regulating and communicating emotions,'' since emotions relate very directly to our beliefs, hopes and intentions, and whether they are being met, or frustrated or threatened.
Reflecting on one’s own beliefs, desires, and feelings is also important for maintaining a healthy inner life. For example, if we feel anxious but have no way of understanding this experience, or why it is happening, it might be pretty overwhelming !
''A broad range of psychopathology can be seen as involving one or another form of specific mentalizing dysfunction''.
See [[Specific diagnoses and their corresponding Mentalizing failures|Specific diagnoses and their corresponding mentalizing failures]].
''Mentalizing is closely connected to the development of a particular type of trust, known as'' [[Epistemic trust|Epistemic Trust]]. Epistemic trust is thought to play a central role in creating the conditions for the learning of socially and culturally relevant information through relationships. The links between mentalizing and epistemic trust are highly relevant in AMBIT, particularly as AMBIT was developed for clients who often have a [[Relationship to help|Relationship to help]] in which it is difficult to trust in the value of information passed through relationships.
!!''What is Mentalizing, and why does it matter? ''
A 70 minute illustrated talk describing Mentalizing, its origins, its value and what happens when it goes "offline":
<html><iframe width="640" height="360" src="//www.youtube.com/embed/xUdZaISunFU" frameborder="0" allowfullscreen></iframe></html>
!!Mentalizing and face to face work
Making sense of behaviour in this way is the cornerstone of clinical practice.
The [[Therapist's Mentalizing Stance|The Therapist's Mentalizing Stance]] is a core part of all of the growing family of mentalization-based approaches to therapeutic work - see [[Mentalization Based Work]] and [[Family Work]] in this manual.
Therefore, the ability of the clinician to mentalize (to make sense of the behaviour in mental state terms) is particularly important, especially when the behaviour of our clients does not make sense in obvious ways, or seems inexplicable.
Our Theory tells us that mentalizing is fragile, though – particularly in contexts of high emotion- and not just for clients, but for therapists too (in this sense it is a great "leveller" in the power dynamics of the patient-therapist relationship.) This explains the strong emphasis on [[SupervisoryStructures in AMBIT|SupervisoryStructures]] - so that stimulating and sustaining our colleagues' mentalizing is as important as the work we do face to face with our clients.
!!''Pre-mentalistic stances:'' (or Non-mentalizing stances)
Three key concepts help to describe the states of mind ([[Pre-mentalistic stances]]) that are adopted when mentalizing becomes imbalanced. These are:
[[Psychic equivalence]]
[[Pretend mode]]
[[Teleological thinking]]
----
!!''Complexities in Mentalizing:''
''Mentalizing is a complex and uncertain process for a variety of reasons including:''
• A person can act according to a belief that is wrong.
• Beliefs arise through a complicated interaction between sensory perceptions, memory, and motivation and so may change for many reasons, perhaps because the environment has changed, or because some hidden mental process has occurred.
• Because beliefs are just representations of reality, people can have very different beliefs and feel very different emotions about apparently similar things.
• Mentalizing emphasises the uniqueness and specificity of the human's subjective experience. Therefore making sense of this in each other (or indeed at times within ourselves) is a complicated task at which we are only ever partially successful.
!!!''More videos''
See below a brief video of the famous scientist (and extraordinary communicator) Richard Feynman - describing how he came to understand that even the most basic mental functions (like counting, or reading) that we might take for granted as being the same for all of us, may in fact be conducted in extremely different ways:
<html><object width="480" height="360"><param name="movie" value="https://youtube.com/v/lr8sVailoLw?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/lr8sVailoLw?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Another way of making sense of Mentalizing, courtesy of Pixar:
<html><iframe width="853" height="480" src="https://www.youtube.com/embed/_MC3XuMvsDI?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!A Developmental Concept:
The capacity to grasp mental states becomes evident in the second year of life. It continues to be refined over the whole course of our lives as the nature of mental states are understood with increasing sophistication.
See here [[Development of Mentalization]] for detail on how mentalization develops, in the context of attachment relationships.
Here see material on [[Developmental Considerations|Developmental Considerations]], especially in relation to adolescent brain development and the links with mentalization (including video).
!!''Further material:''
*There are many helpful [[Mentalizing Quotes]] that help to define this very old concept.
*There is a hierarchical series of [[Mentalizing Levels]] that can be observed, and which the therapist tries to build on.
*There are [[Features of Successful Mentalizing]] that can be useful 'checklists' for therapists (and clients!)
*There are [[Features of UNsuccessful Mentalizing]] that can be useful 'checklists' for therapists (and clients!)
*There is [[The Therapist's Mentalizing Stance]] which is how we translate //theory// into //practice//, and is a core feature of all the mentalizing practices.
!!''Powerpoint Slides''
You can access [[teaching slides|Downloadable Resources from Training]] about mentalization. Remember these slides are all released for sharing under a [[Creative Commons Licence|Licensed]] - you just need to not pretend they are yours, and share them on similar non-commercial terms!
This set of tabs (click on each tab to reveal content) gathers material in a "booklet" that instructs the practitioner in how to deliver [[Mentalization]] - based work with a client. If you open links from within the separate tabs those pages will open, as usual, below this open page. See the [[User Guide]] for help.
!A family of therapeutic approaches
Much of the material below is drawn and adapted from adult [[MBT]], which has also been adapted for adolescents to form the specific and focused therapy called MBT-A. The same core principles underpin the approach to [[Family Work]] that is recorded here as well - as a standalone approach to the treatment of families, this is known as [[MBT-F]] (or ~Mentalization-Based Treatment for Families).
The integrated approach to individual work described below offers a structured intervention that draws on [[Cognitive Behavioural]] approaches, too.
<<tabs MentalizationBasedTabs
Principles Principles MB-Principles
"Mentalizing Stance" Stance [[The Therapist's Mentalizing Stance]]
"The Loop - Structure for Sessions" Loop [[Mentalizing Loop]]
"Mentalizing Games/Techniques" Techniques [[Mentalizing manoeuvres]]
"Therapy course" "Therapy Course" MentalizingWorkCourse>>
!The verb is better than the noun!
Like "[[Mentalizing]]", this is actually a better word than [[Mentalization]] as ''it is a VERB'' - and mentalization is ''something that we DO'' rather than a thing we //have// or //do not have.//'
The main details for understanding this concept are to be found at [[Mentalization]].
!To "Mentalize a problem"
This implies to reach (via imaginative, curious, tentative enquiry) an understanding of the behaviours of the other person that "makes sense of" these in terms of their ''intentional mental state'' at the time.
>//"My mother is screaming at me now ''because she has been very worried for my safety'' and because she wants to know that I am growing up to be able to look after myself properly, and ''manage any future relationships responsibly''; i.e. to understand that treating people as I have just treated her is not alright. After I spoke to her six hours ago and said I would be back in a few minutes, she became increasingly worried when I did not turn up until now... she wants me to understand how difficult it will be for me if I do not learn this lesson at this stage in my life..."//
Would that all late-returning adolescents were able to mentalize a situation so accurately!
Any clips of a family interaction (movie, therapy session), a team meeting, an interaction between a young person and Social Worker, etc
At the point when some awkwardness/tension arises in the interactions (pick a situation with some ambiguity)... Pause the video and mentalize with the team...
!Why?
This second step in the [[Mentalizing Loop]] is deployed in order to share and provoke curiosity amongst and between the family members. The worker is //''modelling''// curiosity, but trying to stimulate curiosity about each other's minds between her clients (this is so in individual work as much as in family work - sometimes the worker might refer to members of the family/friends and ask:
>//"If they were here, listening carefully and calmly to what we have been talking about, and were trying to be helpful... what do you think they would make of this stuff?"//
!Examples
!!!Thought Bubbles
The most important features of a mentalizing stance are respect for, and curiosity about, the minds of others and an attitude that learning about how others are thinking and feeling is enlightening. In fact, ''the therapist models this by his /her very stance'', by enquiring about how others are feeling or what they might be thinking and by not making assumptions about either of these, literally or metaphorically scratching his head. Thus, the therapist may say:
>//“This is fascinating, I wonder Sally what it feels like for you when your dad does x?” “Dad, what do you think it feels like for Sally? If one could see thought bubbles come out of your wife’s head, what might be in there about how she thinks Sally feels right now?”//
<html><iframe width="560" height="315" src="//www.youtube.com/embed/Tgbe2rx7Heg?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!! Inviting curiosity about others' minds
''If there is only one person in the session'', you can still do this technique, by inviting them to imagine what A would be thinking or saying
>//"if they had been sitting calmly, right here in the corner of this room; if they had been listening to us, and now really wanted to help me understand something about X..."//
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/UUyN7DtvEGE?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/UUyN7DtvEGE?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!! [[Pause and Review]] and [[Circular interviewing]]
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ic4_8sLwJB4" frameborder="0" allowfullscreen></iframe></html>
!!!Exploring hidden feeling states
Below is an example of exploring hidden feeling states that is another (here in a 1:1 situation) example of mentalizing the moment - note the therapist is also [[Holding the Balance]] between thoughts and feelings in the here-and-now of the session and those of events the client is recalling from past experience:
<html><object width="640" height="360"><param name="movie" value="//www.youtube.com/v/SZ8mMOz0qO0?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/SZ8mMOz0qO0?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!!Curiosity and broadcasting one's own thoughts
In this example the therapist is using the [[Colombo-style Curiosity]] and is making efforts to broadcast his own thinking, and //not-knowing// to the young person (an actor). At the end of the clip there is an example of [[Highlighting and reinforcing Positive Mentalizing]]:
<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/vhPOC-z-3aw?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/vhPOC-z-3aw?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!Doing it with our colleagues
Note the strong similarities (they are the same!) between this part of the Loop, and the third step in the "dance" that we call [[Thinking Together]], which describes peer-to-peer case discussion/supervision; for clarity we discuss this under the separate heading "[[Mentalizing the Affect]]".
!What does it look like?
As noted above, the most important features of a [[mentalizing stance|General features of a "Mentalizing Stance"]] are respect for, and curiosity about, the minds of others and an attitude that learning about how others are thinking and feeling is //enlightening// and //valuable// to both parties.
In fact, ''the therapist models this by her very stance'', modelling what has been called //"safe uncertainty"// (another way of describing the assumption that ''minds are opaque'' - see the [[Strengths in RELATIONSHIPS]] associated with good mentalizing]].)
She may also enquire about how others are feeling, or how the young person //believes// they might be feeling, or what they might be thinking...
She scrupulously avoids ever making //assumptions// that she //knows// about either of these things (''@@color(purple):MINDS ARE OPAQUE!@@''), and she may literally or metaphorically use scratching or tapping of her head as a way of [[Marking|Marked mirroring]] very explicitly the fact that:
>//"these are just my ideas, I do not assume that they are TRUE, I want your help to get them more accurate to how YOU see things... "//
Thus, the therapist may say:
>//“This is fascinating, I wonder Sally what it feels like for you when your dad does x?” “Dad, what do you think it feels like for Sally? If one could see thought bubbles come out of your wife’s head, what might be in there about how she thinks Sally feels right now?”//
>//“Let me see if I got this right – are you saying that when your dad does x that makes you feel y, and you think to yourself z? Does anyone here have a different view?” “Can you discuss this with each other?!”//
Much of this is a process of the therapist [[Checking]] and encouraging family members to rehearse their own [[Checking]].
!The major aim
The major aim of this "status quo mentalizing" ...is to set a safe context for what could be termed //‘emotional brainstorming’//.
It encourages family members (or an individual) to voice feelings and theories; once mutual exploration unfolds and gains its own momentum, the therapist can decentralize herself and see her role as being that of a facilitator, enabling discussions between family members, or a kind of "exploratory self-talk" in the case of individual work.
!!Learning aims
Invite trainees on the [[Local Facilitator Training|Local Facilitator Training (LFT)- training model]] (who are starting to think about taking up the role of [[AMBIT Local Facilitators]]) to take the perspective of the trainer, to reflect on the position of trainer, the non-mentalizing nature of didactic teaching (trying to remember and stick to a curriculum, so that mentalizing the audience is lost), and the importance of co-trainers.
!!What to do
* Invite trainees to get into small groups or pairs, and remember the first morning of the training.
* Actively try to mentalize //the trainers//:
** how can we make sense of why they behaved in the ways they did?
** consider elements of the morning which went well
** and elements which perhaps did not go so well
Share these ideas and understandings in the large group. //Trainers notate significant points//
* Draw out the AMBIT training process (//what did we do, and why?//):
** Engage the group by attending to their experiences
** Draw out their strengths (validate their expertise)
** Draw out the challenges of the work (validate their struggles)
** When epistemic trust is present, offer materials
* Draw out the non-mentalizing nature of training
** Emphasise the use of co-trainers to help resist this
The active (verb) version of the word (noun) - "[[Mentalization]]". Most of the information about mentalising is at [[Mentalization]].
In fact, as Mentalization is something that people ''DO'', rather than a "Thing" that is either present or absent, Mentalizing is the preferred word.
!!Verb not noun!
Like "[[Mentalize]]", this is actually a better word than [[Mentalization]] as ''it is a VERB'' - and mentalization is ''something that we DO'' rather than a thing we //have// or //do not have.//'
The main details for understanding this concept are to be found at [[Mentalization]].
!!To "Mentalize"
"Mentalizing a problem" implies reaching (via imaginative, curious, tentative enquiry) for an understanding of the behaviours of the other person (or oneself) that "makes sense of" these in terms of their ''intentional mental state'' at the time.
>//"My mother is screaming at me now ''because she has been very worried for my safety'' and because she wants to know that I am growing up to be able to look after myself properly, and ''manage any future relationships responsibly''; i.e. to understand that treating people as I have just treated her is not alright. After I spoke to her six hours ago and said I would be back in a few minutes, she became increasingly worried when I did not turn up until now... she wants me to understand how difficult it will be for me if I do not learn this lesson at this stage in my life..."//
Would that all late-returning adolescents were able to Mentalize a situation so accurately!
!!Different ways of defining Mentalization:
>To see ourselves from the outside and others from the inside
>Understanding misunderstanding
>Having mind in mind
>Mindfulness of minds
>Introspection for subjective self-construction – know yourself as others know you but also know your subjective self
>Those psychological skills that allow us to spontaneously and largely in an intuitive manner //make sense of the actions of oneself and others by reference to mental states// such as beliefs, desires and feelings. Peter Fonagy (2004)
!!Birth of Mentalizing:
>//"The baby looks at his mother’s face and finds himself there"// ''Donald Winnicott''
>//"She/he thinks that I think, therefore I am"// ''Peter Fonagy''
>''Anna Freud'', talking of her admiration for ''August Aichhorn'' as a teacher and therapist: //“So often teachers are in a hurry to get their students to know something, to have the right answers: a possession. Aichhorn knew how to scratch his head and say: Well, we can look at this boy in this way, but we can also look at him in that way, and there may be other ways, too. He was challenging us: can you do the same – focus and refocus, shift your angle of vision, adjust your point of view?”// From ''Anna Freud: the dream of psychoanalysis'' by ''Robert Coles'', pub. ~Addison-Wesley, 1992
!!From literature:
>Do not sit at home,
>Do not go to the forest,
>But recognise mind
>Wherever you are.
''Saraha'' - ''"Treasury of songs"''
c. 1st millenium AD
>A pair of wings, a different mode of breathing which would enable us to traverse infinite space would in no way help us for if we visited Mars or Venus keeping the same senses they would clothe in the same aspects as the things of the earth everything that we should be capable of seeing. The only true voyage of discovery, the only fountain of eternal youth, would be not to visit strange lands but to possess other eyes, to behold the universe through the eyes of another, of a hundred others, to behold the hundred universes that each of them beholds, that each of them is…….with this, we really do fly from star to star.'
''Marcel Proust'' from ''The Captive''
>I am the wisest man alive, for I know one thing, and that is that I know nothing.
>Wisdom begins in wonder.
''Socrates''
>‘Teach thy tongue to say I do not know and thou shalt progress’.
''Maimonides (1135–1204)'' physician-philosopher
>O wad some Power the giftie gie us
>To see oursels as ithers see us!
>It wad frae mony a blunder free us,
>An' foolish notion:
>What airs in dress an' gait wad lea'e us,
>An' ev'n devotion!
''Robert Burns'' (1759 – 1796)
From ''"To A Louse: On Seeing One On A Lady's Bonnet, At Church"'' - 1786
We can conceive of a series of different LEVELS of mentalizing, in what could be seen as a hierachy, with each //higher// order relying on the presence of //lower// orders before it can be sustained:
[img[https://lh6.googleusercontent.com/-JeyI6uB6hwI/UOTcVrXTs-I/AAAAAAAAGTc/_UYilPrD5UE/s912/Levels%2520of%2520Mentalizing.jpg]]
# BASIC level: [[Implicit mentalization]]
# INTERMEDIATE level: [[Explicit mentalization]]
# HIGHEST level: [[Affective mentalization]]
The Mentalizing Loop is an important tool for devising and situating mentalization-based interventions in a structure within a session. It provides a framework for connecting the therapist’s ''observations of a family's or an individual's interaction patterns'' with ''underlying feeling states and related thoughts''.
Furthermore, it helps clients or family members to experiment with new behaviours and actions.
The Mentalizing Loop is a ''framework'', versions of which have been developed within individual and family ([[MBT-F]]) applications, which:
*Allows therapists to structure sessions, or at least parts of sessions.
*Encourages mentalizing, providing a ‘route map’ which can be followed.
!!The loop is not rigidly sequential
In sessions ''it is not always necessary or even desirable always to take each step one after the other'', but for the less experienced therapist it may at the outset helpful to do so, whereas more experienced clinicians may at times wish to ‘skip’ steps. The purpose is to offer a basic structure for the therapist to follow when the content of a session, the rising an falling of different affective states, is moving quickly.
[img[MentalizingLoop.jpg]]
!!!3 Steps and 3 Checks:
!! 1. [[Notice and Name]]
>[[Checking]] - //"Is what I noticed, and the way it may link to what happens at home, what you guys see, too?"//
!! 2. [[Mentalizing the Moment (in the Mentalizing Loop)]]
>[[Checking]] ''again'' - //"So do we think we have got an accurate enough understanding of this pattern...?")//
!! 3. [[Generalize (and Consider Change)]]
>[[Checking]] ''again'' - //"So where are things now?"//
!![[Checking]] (in case you missed it)
>[[Checking]] is in many ways at the very heart of mentalizing practice
!A Spiral, not a Cycle
These steps are not a simple cycle, but are better conceived of as a SPIRAL; return to a "previous" step, is never quite the same, as this can only occur in the context of shared experiences and learning //that were not present at the 'first pass'//. So these are not merely linear steps which need to be taken in a prescribed order, but they are looped. Hence our attempt to represent the model as a spiral. It is possible to skip a few steps, or move across to another ‘step’, as well as going back to an earlier one.
At each or any step it is possible to use specific mentalizing techniques (see [[Mentalizing Therapy Techniques]]) which aim to generate specific mentalization processes in individuals or family members.
So whilst in order to explain the usefulness of the [[Mentalizing Loop]], the model is presented here in a linear fashion, starting from how the therapist uses his process observation(s) of intra-family interactions and/or communication exchanges and how he feeds this back to the family, in an attempt to create reflexive process in each family member, the practice is much more fluid and allowing of the creative use of links.
!!A 'Mentalizing Stance'?
Working with ''Families'' requires that the worker adopts what is referred to as "[[The Worker's Mentalizing Stance]]", just as they might also do in working with an individual.
!!A way-of-being-with:
The [[The Worker's Mentalizing Stance]] is a //way-of-being-with// people, and in Family work it is especially helpful to grasp with confidence this simple "4-legged stance": in working with families, it is not uncommon to be exposed to high levels of affect, and to fast-moving communication, so that one's //own capacity// for [[Mentalization]] is constantly under threat. Knowing these simple "rules of thumb" makes it more likley that the worker can "keep his/her head" at these times of stress, and thus remain helpful for the family, while modelling the very skill that we hope to stimulate and support in all family members.
!!Mentalizing Therapy techniques
This is a series of pages that all contain practical techniques that are designed to foster or sustain mentalizing in young people or families. Because Mentalization-based treatments draw heavily on a range of other models of working (arguing that most therapy that is effective has the effect of increasing mentalizing) some of these techniques are more "generic" than others...
!!General Systemic/Therapy Techniques
#[[Engagement techniques]] or "Joining"
#[[Hypothesizing]]
#[[Circular interviewing]]
#[[Enactments]]
#[[Focussing on Strengths]]
#[[Problem solving]]
#[[Challenging techniques]]
#[[Family Life Space (Genogram) Techniques]]
#[[Reframing]]
#[[PsychoEducation]]
!!Specific Mentalizing Therapy techniques
#[[Mentalizing Loop]]
#[[Colombo-style Curiosity]]
#[[Pause and Review]]
#[[Feeling Spinner]]
#[[Mind-Scanning]]
#[[Simmering Down]]
#[[Therapist's use of Self]]
#[[Taking a break]]
#[[Coaching]]
#[[Training Challenge]]
#[[Stethoscope Games]]
#[[TV phone-in or Documentary games]]
#[[What makes me me?]]
#[[Find a falsehood]]
#[[Just the facts]]
#[[Draw my mind]]
!!{{$:/core/images/edit-button}} What to do:
In your small groups:
1. Nominate a scribe to take some notes
2. Holding your own team in mind, reflect on each of the 8 ‘Team Learning’ situations (see below for a summary)
4. Each pick one or two that you would like your team to develop/improve. Identify what might need to happen to achieve the change.
!!The 8 team learning situations
[img [team learning situations-min.jpg]]
Here is a blog from Dickon Bevington on his book co-written with Carla Sharp:
!!Mentalizing in Psychotherapy: a guide for practitioners: Carla Sharp and Dickon Bevington, 2022
It is funny how certain things become markers in the flow of time, left bobbing around rather like the buoys that a harbourmaster might set down to mark the safe path through shifting sandbanks. I am sure this book is one of those former. It is very sobering to realise that “Mentalizing in Psychotherapy: a guide for practitioners” (Guilford publications, 2022) is the result of twelve whole years of collaboration between Carla Sharp and I! That is far longer than I had imagined until I actually checked! Carla is professor of Clinical Psychology in Houston, Texas, an illustrious Mentalization researcher, and a past alumnus of the Anna Freud Centre, and I feel very privileged to have been able to join her on this mission.
The project of writing this book began with an excited conversation on the steps of a conference centre in Toronto in 2011! Carla had been presenting the ground-breaking work she had been part of, showing how failures in mentalizing helped make much better sense of the dilemmas and sufferings of a group of patients who were much maligned and stigmatised as ‘untreatable’ and labelled as ‘Borderline PDs’. I’d been presenting work on AMBIT that was by that stage a decade into its development and was beginning to articulate more clearly an understanding of mentalizing as something that inhabits and relies on the social and organisational world as much as it does the mental.
Getting from there to the finished book was not by any means twelve years of continuous hard labour; the work proceeded in fits and starts, including periods when our duties to family and other work pushed it away. For several years, though, Carla laboured entirely alone, and I credit much of the heavy lifting to her; she pulled me back in, though, and I was very glad to re-join for the last couple of years. Perhaps the dawdling pace of its genesis has actually helped this book in the end; where Carla brought the wealth of her ever deepening experience and knowledge from the research field, I used the process of thinking about this book and learning from her to help sharpen how I was continuing to teach about the essential, slippery and elusive liveliness of mentalizing (this, we agreed, is exactly what drew both Carla and I to the concept from our different perspectives in the first place.) Thanks to the diversity of AMBIT audiences, I was doing this with workers of many different types and from many different fields, and this pushed me to find images, frames and angles that could help us connect ideas and knowledge to real experiences.
I hope that, alongside the monumental scholarship and depth of Carla’s description of what we know, and how, some of my own contributions help bring that ‘lived experience’ side of mentalizing alive in text. That’s a tall order: books, especially academic textbooks, are not especially sensual or feeling entities (!), and yet mentalizing is all about balancing the fleetingly-present, existential, zen-like, in-the-moment feelings-from-a-position…alongside the cooler cognitions - all measured, evidentially-checked, purposely- and ‘perspectively’-positioned and carefully-described (with the question of “how might this land for you?” ideally always taking precedence over “have I got this off my chest?”) The extent to which Carla and I achieved that, if at all, is in the eyes and minds of our readers. So I do hope you will be one of them!
Dickon Bevington
!!The aim of this exercise
* To explore the experience of service barriers from different persectives
* To understand that service 'barriers' are primarily //''relational''//, involving difficulties between workers in different teams involved in the young person's network.
* To relate this to the [[Dis-integration grid]]
!!Three examples
*Problem 1 YOS and CAMHS. Young person (16 years) on court order with history of severe and persistent offending around violence to property and stealing. YOS worker (PERSON A) manages to negotiate that part of order can be met by the family attending family therapy appointments at CAMHS. YOS worker needs to know whether family attend as part of report back to court. CAMHS accept the referral, see the therapy as appropriate but the allocated clinician (PERSON B) believes that she cannot offer appointments if this is seen as being 'accountable' to the YOS worker for their work. The CAMHS worker has had previous experience of such arrangements becoming a little inflexible and unhelpful for the therapy. Referral is being delayed because of inability to agree this.
*Problem 2. Social Care and Adult disability services. Social care team has been referred a young person who is at risk of family breakdown. The mother of the young person has a learning disability (uncertain severity) but social care team unaware that mother is receiving help from adult learning disability services. Social care worker (PERSON A) is trying to empower mother to hold more responsibility with her son (13 years). When Adult disability keyworker (PERSON B) finds out about the work of the social care team, the keyworker feels that she has not been consulted about social care involvement and consider that the disability team are the primary agency involved with the family. The keyworker in the disability team has strong views about the rights of adults with learning disabilities to be parents and has been explicitly critical to the social care team manager about the impact of their intervention on her client.
*Problem 3. Acute hospital team and CAMHS outreach Services. Young person has been admitted for a couple of nights following an overdose and presentation at the local A and E department A mental health assessment has been completed and the locum Hospital Paediatrician (responsible doctor) (PERSON A) considers that the young person can return home but with high levels of community supervision. He has referred to the Outreach Team and the worker in that team (PERSON B) does not agree about the level of risk and feels that the young person does not require such intensive follow-up. The discharge is being delayed because of inability to agree a discharge plan.
!!Instructions for exercise
1. Divide the all trainees into three groups - ideally one trainer will work with each of these three groups.
* One group takes one scenario for consideration
* 3 example scenarios are given above (but others could be devised - ideally BEFORE the training event.)
2. Subdivide each of these groups into three small groups, and allocate responsibilities for each of these three small groups:
* Character A
* Character B
* The Young person and/or Family.
* NB ONE person from each group should be willing to be an active observer, who would be willing to form a [[Fishbowl|Fishbowl discussion]] in front of the group - consider this before starting the next step.
3. For about five minutes, the small groups actively try to mentalize the state of mind of their allocated person.
* The assumption is that each PERSON in the scenario is experiencing a //dilemma//
* How can you best represent the dilemma that each character is experiencing - so that if they heard you describe it they'd feel //"YES! they have got it!"//
4. The 'active observers' who have been part of conversations about characters in the same problem scenario now have a reflecting [[Fishbowl discussion]] about what they have observed.
* Try to represent "your" character's //wants// and //needs// faithfully - even if you as a professional would have different ideas.
* The other members of the group observe this.
5. The group now discuss ''one small action'' for each character in the scenario.
* E.g. something that //would be observable// to someone who knew what to look out for.
* Something that might help
* Consider the role and experience of the family:
** Are different professionals using inter-professional conflict to help them //engage// with the family?
** Facilitating conversation between who?
** Recognising positions([[Positioning Theory]]) that could be considered which would help address issues raised.
6. Come together as a large group (all trainees) to share experiences
* Recap the usefulness of the [[Dis-integration grid]]
* A systematic way of mentalizing the different characters involved.
!!Time allocation
20 mins, then 10 mins whole group relfection
{{MS.JPG}}
!Inquisitive/Thinking out loud
@@color:red;[Enter text] @@
!Punctuation non mentalizing
@@color:red;[Enter text] @@
!Holding the balance
@@color:red;[Enter text] @@
!Highlighting mentalizing
@@color:red;[Enter text] @@
!!A special interval
In a real sense the other three steps in <<tag [[Thinking Together]]>> (this being the third) are all designed deliberately to hold open this space - in which the worker who is [[Stating the Case]] is //steadied// enough by the mentalizing presence of their partner that they can mentalize more accurately. This is key to the value in [[Thinking Together]] - the FIRST task is ''to restore the mentalizing of the worker'', rather than to leap straight in to working out a plan for the young person or family.
!!Cabin Decompression!
It is like the advice in the safety message before a flight:
>//"In the event of a sudden loss of air pressure, oxygen masks will drop automatically from above your head. If you are with a child BE SURE TO PLACE YOUR OWN MASK FIRST, BEFORE ATTENDING TO THE CHILD."//
This is not about selfishness, it is about ensuring that our best intentions to help are supported by intact thinking!
''We can't support mentalizing in our clients if we are not first able to regain this state of mind as the worker!''
<center>{{MtM.PNG}}</center>
The ritualised, marked, and boundaried "dance" that these steps provide gives //permission// to the worker to discuss their emotional reactions, and reflect on their thinking, alongside those reported by the young person or family.
The intention here is to allow and foster a more curious and exploratory kind of thinking; one that does not shut down real thinking (on the grounds that the professionals "already know the answer", or that further thinking would somehow be //indulgent// when //it is action that is now required// - this last version would be a good example of [[Teleological thinking]].)
Too often, clinical discussion is //"un"//marked, and telling of the story (or rather purposeless and over-wordy "storytelling") leads straight into action.
Note the strong similarities between this and [[Mentalizing the Moment (in the Mentalizing Loop)]] that we use in mentalizing approaches to therapy/exploration with families and individuals. Effectively this is exactly the same process, but applied in a therapy case discussion.
!!Why do it?
This interval is an important space from which more accurate [[Mentalization]], and thus more accurate assessments of the changing risk assessment as well as therapeutic opportunities may emerge. Our hypothesis is that with more accurate mentalizing in the system, risks are reduced.
!!How to do it
1. The colleague who is offering help may firstly summarise back to the worker their understanding of the dilemma they have just heard. This gives the chance for the worker to hear their dilemma from a slightly different position, or from "closer to the bank" rather than being "right in the middle of the chaos"(if we use the [[Ripples in a Pond]] analogy).
2. Continuing this analogy, the helper here is momentarily trying to put themselves in the "middle of the pond", attempting to think about (and briefly communicate) what this dilemma may "//feel//" like for the worker. e.g.
>// "It seems like this is really tough for you at the moment with this young person..from what I understand, if I've got this right, it seems like the work has been going very well together over the last few months, and that this is a young person and family that you've got to know very well and really care about...This event seemed to come kind of out of the blue for you...I think if it were me I'd feel quite frustrated and a bit pushed away.."//
If successful the worker will be given a sense that their dilemma is understandable, that it makes sense to the helper.
3. The worker is then invited to join in acknowledging, clarifying and naming their ''own'' feeling states that may or may not be a reaction to the young person's dilemma - //but the keyworker will always try to MARK these as ''MINE'':// e.g.
>//"Thinking about it now, I guess my own emotional reaction is despair; I find myself thinking that giving up is the only option..."//
So although "feeling" in the present tense is a potential //barrier// to "thinking" ...in AWARENESS, it may also provide INFORMATION for the practitioner, and his or her SupervisoryStructures.
4. After this initial focus on the workers' state of mind it may be then helpful (and more possible) to mentalize the clients behaviour, looking for new understanding that might have been missed from being in the high emotion or chaos of the situation.e.g.
>// "Ok shall we just spend a minute trying to understand X's behaviour, because it does seem different and a bit unexpected..."//
!!And afterwards?
Only with the fourth and final step of [[Thinking Together]] ([[Return to Purpose]]) is this important "mentalizing hiatus" brought to a close.
----
See also:
Another name for this process of Mentalizing the Moment is ''Mentalizing The Affect'' or ''Affective Mentalization'' as we are trying to engage with the emotion that is present.
*[[Mentalizing]]
*[[Mentalizing Levels]]
*[[Attachment]]
*[[Affect]]
*[[Affective mentalization]].
!!Why?
This second step in the [[Mentalizing Loop]] is deployed in order to share and provoke curiosity amongst and between the family members. The worker is //''modelling''// curiosity, but trying to stimulate curiosity about each other's minds between her clients (this is so in individual work as much as in family work - sometimes the worker might refer to members of the family/friends and ask:
>//"If they were here, listening carefully and calmly to what we have been talking about, and were trying to be helpful... what do you think they would make of this stuff?"//
!!Examples
!!!Thought Bubbles
The most important features of a mentalizing stance are respect for, and curiosity about, the minds of others and an attitude that learning about how others are thinking and feeling is enlightening. In fact, ''the therapist models this by his /her very stance'', by enquiring about how others are feeling or what they might be thinking and by not making assumptions about either of these, literally or metaphorically scratching his head. Thus, the therapist may say:
>//?This is fascinating, I wonder Sally what it feels like for you when your dad does x?? ?Dad, what do you think it feels like for Sally? If one could see thought bubbles come out of your wife?s head, what might be in there about how she thinks Sally feels right now??//
<html><iframe width="560" height="315" src="//www.youtube.com/embed/Tgbe2rx7Heg?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!! Inviting curiosity about others' minds
''If there is only one person in the session'', you can still do this technique, by inviting them to imagine what A would be thinking or saying
>//"if they had been sitting calmly, right here in the corner of this room; if they had been listening to us, and now really wanted to help me understand something about X..."//
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/UUyN7DtvEGE?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/UUyN7DtvEGE?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!! [[Pause and Review]] and [[Circular interviewing]]
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/ic4_8sLwJB4" frameborder="0" allowfullscreen></iframe></html>
!!!Exploring hidden feeling states
Below is an example of exploring hidden feeling states that is another (here in a 1:1 situation) example of mentalizing the moment - note the therapist is also [[Holding the Balance]] between thoughts and feelings in the here-and-now of the session and those of events the client is recalling from past experience:
<html><object width="640" height="360"><param name="movie" value="//www.youtube.com/v/SZ8mMOz0qO0?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/SZ8mMOz0qO0?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!!Curiosity and broadcasting one's own thoughts
In this example the therapist is using the [[Colombo-style Curiosity]] and is making efforts to broadcast his own thinking, and //not-knowing// to the young person (an actor). At the end of the clip there is an example of [[Highlighting and reinforcing Positive Mentalizing]]:
<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/vhPOC-z-3aw?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/vhPOC-z-3aw?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!Doing it with our colleagues
Note the strong similarities (they are the same!) between this part of the Loop, and the third step in the "dance" that we call [[Thinking Together]], which describes peer-to-peer case discussion/supervision; for clarity we discuss this under the separate heading "[[Mentalizing the Moment (in Thinking Together)]]".
!What does it look like?
As noted above, the most important features of a [[mentalizing stance|General features of a "Mentalizing Stance"]] are respect for, and curiosity about, the minds of others and an attitude that learning about how others are thinking and feeling is //enlightening// and //valuable// to both parties.
In fact, ''the therapist models this by her very stance'', modelling what has been called //"safe uncertainty"// (another way of describing the assumption that ''minds are opaque'' - see the [[Strengths in RELATIONSHIPS]] associated with good mentalizing]].)
She may also enquire about how others are feeling, or how the young person //believes// they might be feeling, or what they might be thinking...
She scrupulously avoids ever making //assumptions// that she //knows// about either of these things (''@@color(purple):MINDS ARE OPAQUE!@@''), and she may literally or metaphorically use scratching or tapping of her head as a way of [[Marking|Marked mirroring]] very explicitly the fact that:
>//"these are just my ideas, I do not assume that they are TRUE, I want your help to get them more accurate to how YOU see things... "//
Thus, the therapist may say:
>//?This is fascinating, I wonder Sally what it feels like for you when your dad does x?? ?Dad, what do you think it feels like for Sally? If one could see thought bubbles come out of your wife?s head, what might be in there about how she thinks Sally feels right now??//
>//?Let me see if I got this right ? are you saying that when your dad does x that makes you feel y, and you think to yourself z? Does anyone here have a different view?? ?Can you discuss this with each other?!?//
Much of this is a process of the therapist [[Checking]] and encouraging family members to rehearse their own [[Checking]].
!The major aim
The major aim of this "status quo mentalizing" ...is to set a safe context for what could be termed //?emotional brainstorming?//.
It encourages family members (or an individual) to voice feelings and theories; once mutual exploration unfolds and gains its own momentum, the therapist can decentralize herself and see her role as being that of a facilitator, enabling discussions between family members, or a kind of "exploratory self-talk" in the case of individual work.
<a class="tc-float-right">[img width= 300 [brain.jpg]]</a>
''Mentalizing is:''
<<<
The imaginative activity of making sense of the actions of //oneself //and //others// on the basis of mental states such as thoughts, fears, intentions, desires, feelings and beliefs
<<<
*Mentalizing is what we do when we are imagining what might be going on in the mind of someone, underneath the behaviour that we see on the outside.
*It is a brain activity that takes place in the prefrontal cortex.
*It is not mind-reading. We can't ''know'' what is in someone else's mind, and it is often not clear to us why we ourselves behave in certain ways.
*It is something we can all do (notwithstanding some severe neurodevelopmental disorders)
<a class="tc-float-right">[img width= 300 [mentalizingmonkeys.jpg]]</a>There are four key features of effective mentalizing. If you see observe these in yourself or others you can bet there is some good mentalizing going on:
* Knowing that minds are //opaque//
* Curiosity
* Perspective taking
* Awareness of the impact of emotion
* Narrative continuity
We will learn a bit more about each of these in the coming pages.
!!What does "Meta-" mean?
"Meta-" refers to the quality of sitting "at one remove" from the action, and thus having a "different perspective". Examples to explain this include the [[Ripples in a Pond]] and [[Dive Boat - An Analogy]].
!!The Meta-team
The Meta-team may in some situations be those [[Key Worker]]s who are not working directly with a particular young person, but who make themselves available to the [[Key worker]] who is "in the thick of it" via a [[Reflective Quorum]]. More formally, the MetaTeam refers to the team of specialist professionals who may not sit directly //within// the team, as [[key worker]]s with caseloads themselves, but who have given consent to an agreed level of consultation to the team about areas requiring more specific expertise.
The nature of these agreements will vary from setting to setting and may range from a formal regular consultation slot, to something more fluid and informal, based on a shared understanding of the task and model. During [[AMBIT Training]] these local experts will ideally be involved in sharing core skills from their area of expertise, as a means of:
!!!(a) Extending reach
Extending the reach of specialist interventions into hard-to-reach settings: //An analogy would be the expert working "through" the keyworker in the same way that a surgeon might work in inaccessible places via an endoscope - sometimes the surgeon has to open up the patient and lay her own hands on the injured part, but endoscopic surgery tends to lead to faster recovery if you can get away with this "lighter touch" approach.//
!!!(b) Engaging local experts
For instance local experts on [[Cognitive Behavioural]] methods of work, or systemic [[Family Work]], etc: engaging these senior figures in the work of [[AMBIT training|Information About AMBIT Training]] or the onwards [[Training exercises]] that we advise an AMBIT-influenced team to [[sustain|SUSTAIN best practice]] will help to foster local ownership of local resources - be these skills or people.
!!!(c) Reducing the cost of training
Many of the core evidence-based skills required for a properly [[multimodal and multidomain|Working in multiple domains]] and [[evidence-based|Respect for Evidence]] AMBIT intervention are probably already held within professionals employed locally.
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/5cjW1kDHpMk?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/5cjW1kDHpMk?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
This is a playful way of helping an individual to use [[Explicit mentalization]]. It is probably best for younger children, but in the right, and playful, context, even adults or adolescents can enjoy this.
*Use a proforma (see the slides at [[Mentalizing Therapy Techniques]] for an example) of a "scan" that shows a head in outline, with some "thought bubbles" inside it.
*Use some drama in introducing this //highly technical piece of equipment// (vast expense, etc).
*Hold up the "scan" in front of the person's face, whose behaviour you are asking the other person to mentalize
**It is possible to do this in an individual session, using a "virtual" version of the subject, instead.
*Ask the young person (or indeed parent, etc) to wrtite in his or her "scan" of the thoughts and feelings in that person's head at present.
!Example Scan
feel free to design a better one... or print this one off...
<html><div align="center"><iframe src="https://docs.google.com/document/d/1NmPuE3zluPEoOc82-FguG_rnNPf34k7iUvLGaAZn6Pk/edit" frameborder="0" width="100%" height="600"></iframe></div></html>
https://docs.google.com/document/d/1NmPuE3zluPEoOc82-FguG_rnNPf34k7iUvLGaAZn6Pk/edit
This is a questionnaire developed from a longer version, the [[PREACHY]]. This measure was developed in the arly stages of AMBIT to survey staff attitudes and beliefs about their work in order to provide some baselines for developing team objectives which could be measured over time.
The mini-preachy is a short version of a much longer measure called the PREACHY.
|You can download this as a PDF| [[here|https://docs.google.com/file/d/0B5h_CVBdhJPYd1dyOTdQVjJhUkE/edit]]|
|...or see it| below:|
<html><iframe src="https://docs.google.com/file/d/0B5h_CVBdhJPYd1dyOTdQVjJhUkE/preview" width="640" height="480"></iframe></html>
<<tag-navigation tag:"Module 1: Introductions and Mentalization">>
<<tag-navigation tag:"Module 3: Working with your Team">>
<<tag-navigation tag:"Module 5: Working with your client">>
<<tag-navigation tag:"Module 7: Learning at Work 2">>
<<tag-navigation tag:"Module 8: Review and implementation planning">>
Getting well is often the easy part - the true art that we want to share is that of //Staying well//.
Some degree of "(mental) health monitoring" is likely to be a part of any good maintenance plan - just as the brushing of teeth is part of everyday //dental// health maintenance.
An example of a web-based mental health monitoring system that encourages a degree of "networking" to buddies/relatives who can share a response plan is the freely-available [[MoodScope|http://www.moodscope.com/login]].
The worker, young person and trusted others (such as family) may need to sit down together and define:
* ''What would make useful measures of wellness?''
** Moodscope scores (see above)
** the young person turning up to commitments, like college?
** Are they using substances in harmful ways at present?
** Are they sleeping OK?
** Etc...
* ''Who should check these measures and when?''
** The aim is for such checking to be perceived as [[Careful and concerned CURIOSITY]], not prurient prying, or punitive policing...
* ''What should the drill be if a measure indicates that all is not well?''
** See [[Relapse prevention]]
** See [[Crisis Contingency Planning]].
You can read more about the [[AIM Cards]] here in the manual
!!Using the online AIM cards (it's free)
If you are interested in using the AIM cards in your own practice you can set up your own AIM card rooms using the link below. They are free to use.
You will set up a new room, with a unique URL, for each young person.
[[Online AIM Cards: how to set up a room to use with your client]]
!!Purchasing physical packs of AIM cards
These are £10 a pack and can be purchased by [[emailing us|mailto:ambit@annafreud.org]]
{{AIM cards pic1.jpg}}
!Miller and Rollnick have described:
!!!4 core principles/practices that shape a motivational interview:
1. [[Express Empathy]]
2. [[Develop Discrepancy]]
3. [[Roll with Resistance]] - although more recently they have drawn back from referring to resistance, as this locates the problem in the client, rather than it being the result of the therapist taking a wrong turn by pushing the client towards places she is not yet ready to go to.
4. Support [[Self-efficacy]]
!!!4 key practices that evoke the exploration and clarification of motivation (Acronym: "OARS")
''@@color(red):O@@pen Questions'' - [[Open Questions]]
''@@color(red):A@@ffirmations'' - Affirmations
''@@color(red):R@@eflecting comments'' - [[Reflecting comments]]
''@@color(red):S@@ummarising'' - [[Summarising]]
!!!Examples
See a tricky situation WITHOUT using OARS:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/Ps7e9CLIbkY?rel=0" frameborder="0" allowfullscreen></iframe></html>
And a similar situation where the use of OARS makes a difference:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/jMfcEgazcrg?rel=0" frameborder="0" allowfullscreen></iframe></html>
!Structuring these elements:
Motivational work can be delivered across a number of sessions, or in a single session - it is as much a way of being with a client as it is a formulaic set of instructions. A typical interview will start with some [[Engagement techniques]], developing a sense of connection and a sense of empathic joining (accurately [[Mentalizing]] the client would be an alternative way of expressing this).
As part of this the worker elicits hopes and dreams for the future, sometimes with the use of [[Rating Scales]] to clarify beliefs and wishes. The hopes and dreams elicited may be elaborate, or very down-to-earth ("to not be in trouble with the police for six months").
Then the worker draws reflections upon the impact of the targetted behaviour upon progress to this goal ([[Develop Discrepancy]]).
Avoiding 'de-railment' ([[Roll with Resistance]]), the worker moves towards exploration of how the client may be able to support him or herself within existing structures that are already available (family and friendships, etc; this (supporting [[Self-efficacy]]) is a good example of one of the [[Core Features of AMBIT]], namely [[Scaffolding existing relationships]].
!!Ambivalence
Working with [[Ambivalence]] the worker may find techniques that are drawn from cognitive behavioural approaches helpful, such as [[Rating Scales]] or a paper exercise, the [[Pros and Cons (Decisional Balance) exercise]].
!Supervision
Supervision of motivational sessions will help the worker to avoid falling too far into the [[Scaffolding existing relationships]] position, and thereby missing the necessity of [[Managing Risk]] as well:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/YVktqmw6UkA?rel=0" frameborder="0" allowfullscreen></iframe></html>
<<tabs "[[Definitions & Principles of Motivational Work]] [[Adapting to Circumstances]] [[Motivational Core Aspects]]" default:"Definitions & Principles of Motivational Work" "$:/state/tab1" >>
''Affirmations ''could be seen as another version of what [[SystemsTheory]] practitioners refer to as a reframing - picking out the positive aspects of an account that may have origianlly been framed in more negative terms.
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/VaUQ7dvwWfk?rel=0" frameborder="0" allowfullscreen></iframe></html>
This page lists out the specific competencies for motivational work so that you can reflect on your own knowledge and competence and determine what you may need to develop your skills further.
#[_] Understand the four basic principles of a motivational interview, what the aim of motivational work is, and is NOT (see [[Motivational Work]].)
#[_] Understand the notion of the [[Stages of Change]] and how to [[Adapt your Discourse]] to fit this.
#[_] Check you have made an adequate assessment of the problem (see [[Multi-Domain Assessment]] or, more specifically, [[Assessment for SUD-Rx]])
#[_] Clarify the boundaries of the task at hand with yourself and the client as required.
##[_] ''Task'' - To spend time considering //what you want to do// in relation to subtances...
##[_] ''Authority'' - Are you the authorised person to be doing this motivational work?
##[_] ''Responsibility'' - Remember the emphasis in [[Motivational Work]] on [[Self-efficacy]]
##[_] ''Time'' - How long have you got for this session? Explain and agree this with the client. Note that [[Motivational Work]] can be delivered in a single session or delivered across a period of time, as and when the client is seen to be open to such work.
##[_] ''Space'' - Is this the best available space to work in? Will you be interrupted?
#[_] With the client [[Assess Stage of Change]] or review this.
#[_] Deploy the four principles of motivational work:
##[_] [[Express Empathy]]
##[_] [[Develop Discrepancy]]
##[_] [[Roll with Resistance]]
##[_] Support [[Self-efficacy]]
#[_] If appropriate end the session with feedback of progress, and invite planning of next steps, or offer information about additional resources.
<<tabs "[[Definitions & Principles of Motivational Work]] [[Adapting to Circumstances]] [[Motivational Core Aspects]]" "Definitions & Principles of Motivational Work" "$:/state/tab1" "tc-vertical">>
The MDT is taken for granted as the pre-eminent vehicle for delivering mental health care to patients. The close juxtaposition of multiple different explanatory models and modalities of intervention - each upheld in one or more of the various different professionals in the team - offers at least a structural //aspiration// towards integrated practice.
A typical MDT might consist of:
*Social Worker
*[[Psychiatrist]]
*Clinical Nurse Specialist (CPN)
*Psychotherapist
*Occupational Therapist
*Family Therapist
*etc, etc...
See [[How to speak to a...]] for advice on [[Mentalizing]] the positions and dilemmas that different professionals take, or face.
In reality teams are often faced with managing empty posts, or simply do not have the staffing levels to provide for more than occasional contact with other members of the MDT, so that a particular patient will primarily be managed by one or two workers, who may not have the benefit of multimodal training.
The [[AMBIT]] model of practice retains the MDT, but may place expertise at a 'Meta-level' - providing //supervision// rather than face-to-face management of the case. The shift is from a "team around the child" to a "team around the worker".
[img[https://lh6.googleusercontent.com/-Q--oDenShgU/UcD32HjdpVI/AAAAAAAAIlk/tGuG_Ps4QbE/s512/AMBITSpokes_B%252BW.JPG]]
!!Purpose
Explaining the purpose of an assessment of a client with complex needs, and the main components: what to ask about, and how to ask.
!!Why assess?
Assessment is key to ''delivering the most appropriate interventions for this particular young person's needs''.
Many of the target youth that [[AMBIT]] is directed at are functioning poorly, or demonstrating symptoms in multiple domains, and this //co-morbidity// is often a major reason for the failure of interventions. A common problem is that practitioners tend to deliver those interventions (from psychoanalysis to kicking a football around!) that they are most confident with, or enjoy delivering most, //rather than the interventions that this particular array of problems most calls for at this particular time//; as a result the young person and their family may not experience any meaningful change, so at best expensive professional time may have been wasted, and at worst they may be more likely to dis-engage, or have suffered unnecessary harm from the delay or inappropriate treatments.
!!What to do:
To avoid over focus on any //one// area, to the detriment of understanding in //other// areas, the assessment involves four parts.
Ideally the [[Key Worker]] starts from a "wide-angled lens" view, and then homes in on the most important ''Key Problems'' to target:
!!!Timescale
This should be completed by the end of the second week of working, but preferably within a week of first contact. ASSESSMENT IS A CONTINUOUS ACTIVITY and needs to be continuously updated as facts change and new information emerges.
!!1. NARRATIVE ACCOUNT
>//The details of the story - who, when, how, where...//
See [[Narrative History]] for suggestions on what to cover. You might find the page on the [[AIM]] helpful to ensure that you cover all the key areas that the AIM (see below) requires you to provide information about. //The resulting history and background details can be added to as additional information comes to light.// In addition there are various self-rated evaluative questionnaires that can help a young person to describe their current state of mind - for instance the ~Warwick-Edinburgh Self-rated Wellbeing Scale. Once you have covered the [[Narrative History]] you should have the information to complete the next stage of the assessment:
!!2. AIM QUESTIONNAIRE
>//A structured set of scored questions//
The questions we suggest using are found in the [[AIM]] questionnaire which uses validated questions that link directly to material in the manual; this is completed by the [[Key Worker]] during or after one or more interviews, preferably within a week of first contact, but definitely within 2 weeks. This questionnaire covers all the major domains, ensuring that the worker does not focus too narrowly, too quickly. It is where [[Key Problems]] are first identified. It //also// acts as one of the key [[Outcomes measures,|Evaluating outcomes]] as well as interacting with manualized material to generate lists of suggestions for appropriate interventions ([[AIM suggested interventions]]) to consider given this particular problem set.
!!3. RISK ASSESSMENT
>//A structured set of questions about risk//
There is an example of a Risk Assessment at [[Risk Assessment - paper form]], but a team's local [[Governance]] structures for [[Managing Risk]] may require alternatives to be used in its place - what is important is that //some explicit consideration of Risk is made//.
!!4. ~DIS-INTEGRATION GRID
>//A structured way of// [[Addressing Dis-integration]]// in networks//
A specific tool, the [[Dis-integration grid]], which highlights potential areas across the multiple domains (individual, family, team, inter-agency, etc) where a lack of integration across the various systems may influence outcomes, should be completed.
!!AFTER the assessment?
>//Putting together the information to plan the most helpful interventions.//
Follow [[Starting a NEW CASE - CheckLists]] to ensure that you translate your findings into clinically useful information and plans. This is where [[Active Planning]] is at its most active - in developing your [[Formulation and Treatment Aims]].
Educational-VocationalPrinciples
<<tabs MultiFamilyTabs
Principles MultiFamilyPrinciples MultiFamilyPrinciples
Structure MultiFamilyStructure MultiFamilyStructure
Techniques/Activities MultiFamilyTechniques MultiFamilyTechniques>>
"Modalities" of intervention refer to the different forms of practical work with patients - each of which in turn stems from particular [[Theoretical/Explanatory Frameworks]]. For instance pharmacological interventions stem from a biological explanatory framework, psychodynamic interventions from a psychoanalytic framework, family-based interventions from a Systemic framework, etc.
"Multimodal" therefore refers to the deployment of multiple modalities, more or less simultaneously, for a single case (for instance and individual may benefit from individual psychodynamic therapy, Family/Systemic therapy, Prescribing interventions and Social Ecological interventions.)
These theories and/or practices may appear dis-integrated (Dis-integratedInterventions) - especially if they are delivered by different individuals - the Integrative Multimodal Practitioner takes responsibility for delivering multimodal interventions in an integrated way - which occurs primarily as a result of how [[Service Delivery]] is arranged, with the majority of work coming from a single Keyworker.
The routes into harmful use of Cannabis or other drugs are multiple, and this is not dissimilar from other problems like [[Conduct problems]], [[Depression]] or [[Psychosis]]. ''This list is by no means intended to be exhaustive'', but may act as a helpful checklist if considering the complexity of substance use disorder in a client.
!Biological
*time-critical changes are occurring in the //adolescent// brain, meaning that the dopamine "reward system" and the hormone oxytocin (amongst other mechanisms, some less well understtod) interact with neural development so that this is a sensitive period of brain development, where new experiences are powerfully encoded and patterned behaviours become more easily ingrained than at other times in the life cycle.
*The //relative underperformance of the frontal lobes// (if the brain were a company, the Frontal lobe would be the "board of executives" in relation to the rest of the brain) in adolescence means that the young person is liable to be more impulsive, and also more prone to exploratory risk-taking behaviour as part of a biological imperative to explore the wider world.
*It is known that in genetically prone/vulnerable individuals Cannabis can trigger schizophrenia or other psychotic illnesses, or induce these to arise earlier than would have been the case - and the earlier the onset of psychosis, the worse the outlook.
!Cognitive - individual
*Early positive appraisals of an experience (//"this is nice!"//) make it more likely that this experience will be repeated, and that such patterned responses will become harmful to the individual.
*Early trauma (a need to blank out painful memories, etc) is a frequent finding in young substance users.
!Systemic factors:
*Children of families where drug use is common and normalised, or where one or both parents have significant Substance Use Disorder, are at far greater risk.
*Peer group influences are increasingly significant in the teenage years.
*Social-ecology - the pervasiveness of drugs in the local community/society; the availability of dealers, money to afford drugs, etc. are major factors.
!!!!Source: Dr Janne Walløe Vilmar & Dr Stefan Lock Jensen
The NET-AIM-Q was developed by Dr Janne Walløe Vilmar
& Dr Stefan Lock Jensen in [[Regions Sjaelland, Denmark|https://manuals.annafreud.org/ambit-denmark/index.html]]. The aim of the measure is to create an ongoing focus on the quality of network meetings, encouraging mentalizied cooperative meetings.
The measure is given to all participants at the end of a network meeting (at the start of the meeting it is
announced).
*12 questions; 7-point Likert-scale (agree….. )
*Takes 3 minutes to complete.
* People like the fact that we ask for feedback and take the meeting so seriously (great compliance)
* You get an instant feedback/overview of who might be quietly negative/positive (the not-so quiet- ones, you already know about
*The higher the score the more positive the result
To request a copy of the NET-AIM-Q, please email mailto:ambit@annafreud.org
!!!!Source: Dr Janne Walløe Vilmar & Dr Stefan Lock Jensen
The NET-STAT-Q was developed by Dr Janne Walløe Vilmar & Dr Stefan Lock Jensen in [[Regions Sjaelland, Denmark|https://manuals.annafreud.org/ambit-denmark/index.html]]. This measure is an extension of the [[NET-Aim-Q]], which they observed did a good job of implementing the sort of collaborative mentalized atmosphere in network meetings that they wanted.
The NET-STAT-Q aims to:
*evaluate/measure case-management over time
* integrate and ’tweak’ the experienced meaningful factors of the [[NET-Aim-Q]], so that we can get a continuous STATUS of the networking/case-management efforts.
To request a copy of the NET-STAT-Q, please email mailto:ambit@annafreud.org
!!Recapping AMBIT training
This page gathers key exercises/learning you will have done in your AMBIT Training that relate to the quadrant of the [[AMBIT Wheel]] described as:
!!><<tag [[Working with your NETWORKS]]>>
Note, there is plenty more to AMBIT than what is covered in your training, so feel free to browse further!
!!><<tag [[NETWORK exercises from AMBIT training]]>>
<html><div align="center"><iframe src="http://www.nice.org.uk/nicemedia/live/10970/29858/29858.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
There is a [[Learning module|http://learning.bmj.com/learning/search-result.html?moduleId=6054203]] hosted by the British Medical Journal and NICE that will guide practitioners through the implementation of this advice. It is free for all - clicking on the link above will lead you to a registration page that will ask you to register, and you can access the training from there.
the relevant NICE guidelines for sexual health are linked to [[Here|http://guidance.nice.org.uk/nicemedia/live/11377/31899/31899.pdf]], and they include this advice:
!Recommendation 5
!!!Who is the target population?
Vulnerable young people aged under 18. This may include young people:
*From disadvantaged backgrounds
*Who are in – or leaving – care
*Who have low educational attainment.
For a more detailed definition of vulnerable young people see Department for Education and Skills (2006)
!!!Who should take action?
*GPs, nurses and other clinicians working in healthcare settings such as primary care, community contraceptive services, antenatal and postnatal care, abortion and GUM services, drug/alcohol misuse and youth clinics, and pharmacies.
*GPs, nurses and other clinicians working in non-healthcare settings such as schools and other education and outreach centres.
!!!What action should they take?
*Where appropriate, provide one to one sexual health advice on:
**how to prevent and/or get tested for STIs and how to prevent unwanted pregnancies
**All methods of reversible contraception, including long-acting reversible contraception (LARC) (in line with NICE clinical guideline 30)
*How to get and use emergency contraception
**Other reproductive issues and concerns.
*Provide supporting information on the above in an appropriate format.
!Recommendation 6
!!!Who is the target population?
Vulnerable young women aged under 18 who are pregnant or who are already mothers. This may include young women:
*From disadvantaged backgrounds
*Who are in – or leaving – care
*Who have low educational attainment.
For a more detailed definition of vulnerable young people see Department for Education and Skills (2006)
!!!Who should take action?
Midwives and health visitors who provide antenatal, postnatal and child development services
!!!What action should they take?
*Regularly visit vulnerable women aged under 18 who are pregnant or who are already mothers.
*Discuss with them and their partner (where appropriate) how to prevent or get tested for STIs and how to prevent unwanted pregnancies. The discussion should cover:
**all methods of reversible contraception, including LARC (in line with NICE clinical guideline 30), and how to get and use emergency contraception
**health promotion advice, in line with NICE guidance on postnatal care (NICE clinical guideline 37)
**opportunities for returning to education, training and employment in the future.
*Provide supporting information in an appropriate format.
*Where appropriate, refer the young woman to the relevant agencies, including services concerned with reintegration into education and work.
<html><div align="center"><iframe src="http://www.nice.org.uk/nicemedia/live/12061/42107/42107.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
!Note!
This guideline is for adults (>18 yrs) although it may be relevant to younger people, who are in the care of an Early Intervention in Psychosis Service.
<html><div align="center"><iframe src="http://www.nice.org.uk/nicemedia/live/11786/43610/43610.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
Here we tag all NICE guidelines included in this manual.
<html><div align="center"><iframe src="http://www.nice.org.uk/nicemedia/pdf/CG026quickrefguide.pdf" frameborder="0" width="100%" height="400"></iframe></div></html>
Below is the page embedded in this manual, but you can also open the page in the NICE website in a separate window [[here|https://www.nice.org.uk/guidance/CG31]].
!Guidelines
<html><div align="center"><iframe src="https://www.nice.org.uk/guidance/CG31" frameborder="0" width="100%" height="600"></iframe></div></html>
!!Purpose
To ensure an assessment covers all the most important elements of the client's story.
!!Domains to cover
Assessment must cover ''all'' of the [[Domains]] in which a young person functions, including any StrengthsResiliencies, as well as difficulties. In parallel to the list below, you may find the topics covered by the [[AIM|AIM questionnaire - paper version] helpful in ensuring that important areas of enquiry are not left out.
!!!What do the young person and other people report?
These are the problems that a young person, their carers, or other professionals report
See [[Presenting Problems]]
!!!''Activities of Daily Living (ADL)''
Including Education, Employment or Training, Social activity, Self-care, and other basic 'living skills', etc.
See [[Education employment training]], StrengthsResiliencies
!!!''Family''
Including family relationships, resources, etc.
See [[Family History]]
!!!''Interpersonal''
Including relationships, supports, social skills
See [[Family Informal Network Members]]
!!!''Mental Health and Behaviour''
Which involves the intra-psychic domain (thoughts, feelings, perception, insight, etc) as well as 'externalising' behaviours (aggression, violence, etc) and [[Substance Use History]]
See [[Past psychiatric history]]
!!!''Physical/Biological''
Which includes physical health, early development, diet, drug and alcohol use, etc.
See [[Substance Use History]] (which cuts across the physical and psychological history for obvious reasons), PastMedicalHistory, DevelopmentalHistory
!!!''Network/Systems''
Including the young person's response to care, inter-agency issues (the integration or dis-integration of services working with the young person and family)
See [[Professional Network Members]]
This is a key comparison report for AMBIT with respect to work in the UK. Other pages linked to this are [[The Troubled Families Programme: an overview]] and [[The Troubled Families Programme: the intervention model]].
A number of important findings have been highlighted by this report. The evaluation involved a comparison group and a large sample size. This enabled the study to be sensitive to relatively small differences between the groups.
Key outcomes were service outcomes such as whether a child came into care; went to prison. The programme explicitly links to supporting employment as part of the intervention. so that reducing worklessness is also a key outcome. The key outcomes for AMBIT are highlighted below.
!!!Reduction in children coming into care and reduction in custodial care
*2.5% of families in the comparison group had a child come into care compared with 1.7% for the intervention group. This is a difference of 32% but this scale of difference would be very hard to recognise in a local service. Local random variation in presenting need is going to make it very difficult for local planners to identify this programme as producing significant change.
*1.6% of the comparison group received custodial sentences compared with 1.2% of the intervention group.
!!!Changes in multi-agency practice
*A number of positive conclusions are drawn about multi-agency practice being significantly strengthened. The evidence for this comes from case studies and highlights the role of multi-agency leadership and shared goals in supporting cross agency working by front line practitioners.
!!!Central role of key worker to family
*The evaluation highlights the crucial role of a single key worker relationship to the family that focusses on a range of family issues and is not specific to care, crime, mental health or employment. The capacity to see these problems as being interconnected is one of the reasons why this programme provides a very useful comparator to the AMBIT programme.
!!Introduction
This page gathers together material on finding your way around the large number of pages and resources that this manual includes.
!First, a 'DON'T DO THAT!' warning!
Not very welcoming, but let's get this clear quickly - there's lots that is very //typical// 'website behaviour' in this wiki, but a few things are a bit different! The main one is that multiple 'pages' can be opened at the same time, //but they all open (one above the other) in a kind of stack or list in this single browser window...// So... ''PLEASE DON'T USE YOUR Browsers 'back' and 'forward' buttons'' as you might if you are navigating an ordinary website. Instead, keep your cursor on this page and either scroll up and down it, or use the [[SideBar]] and the '''Open Pages' tab'' (see below) to flick back and forth at lightning speed. It may feel a bit odd to begin with, but //very quickly// it makes sense!
!Now, welcome...
* The simplest way to ''search for content'' is via the [[Search Bar]]
* The ''front door'' to all the content in this wiki is found in the ''Topbar Menu'' (see above, in the strip at the very top) , and this is described in detail at [[AMBIT Manual Site Map]], which helps you to understand how all the content is arranged.
* The [[SideBar]] (already mentioned above) has lots of very useful ''ways of organising, displaying, sorting and interacting with the content'', most of which are simple and obvious once you've seen them!
* ''Reading some notes on the'' [[Basic Structure of the Wiki Manual]] will help you to understand of how all the pages are organised into meaningful collections using [[Tags]] and via direct [[Links]].
* There is also a ''clickable'' [[AMBIT Wheel]] (it's on the homepage, too) that will send you to each section of this iconic summary of AMBIT. (And for a more general introduction to AMBIT see: [[AMBIT: an overview]]
* Finally, if you really can't find love for the wiki (heaven forbid) there is a [[Book about AMBIT|Bevington, Fuggle, Cracknell and Fonagy (2017) Adaptive Mentalization Based Integrative Treatment: a guide for teams to develop systems of care. (Book, pub. OUP)]] and a ''second book'' due out shortly (late 2022, early 2023?), on the range of different ''implementations of AMBIT'' around the world. The thing is, as the book makes perfectly clear, //AMBIT is constantly growing and changing, so the book is not the most current version of AMBIT, the wiki is!// (...though from a position of bias, we'd say that it still covers everything!)
Amongst other [[Developmental Considerations]], there are Neurodevelopmental challenges faced by the young person: these include freshly enhanced cognitive complexities, that in turn face the young person with integrating a far more complicated set of thoughts about her own and others' feelings and motivations.
!Brain changes in the adolescent - TED talk by Professor ~Sarah-Jayne Blakemore (UCL)
<html><iframe src="https://embed.ted.com/talks/sarah_jayne_blakemore_the_mysterious_workings_of_the_adolescent_brain.html" width="560" height="315" frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></html>
!Brain changes:
The outpouring of gonadal hormones in early and middle adolescence is implicated in the major changes that occur in ''brain development'' at this stage of life. the changes in the adolescent brain are more dramatic than any since the earliest stages of childhood. During this phase, the previous ''efflorescence'' (branching and re-branching) of neurones, with the formation of huge numbers of ''synapses'' (chemical 'bridges' carrying nerve impulses between neurones), that dominates the antenatal period and the earliest years of life, //effectively goes into reverse//. The dominant process at this stage in life is then ''Synaptic Pruning'', and this occurs in relation to use-dependent iterative processes, so that unused neural pathways are actively shed, whilst pathways with heavy traffic are reinforced. Put crudely, then, the adolescent development of the brain refines capacities so as to preserve those that are socially adaptive and advantageous, and losing those that are less relevant.
In effect, although some degree of 'plasticity' remains throughout life (we can to some extent relearn skills that have been lost after a stroke), the adolescent years are when the major brain architecture is laid down and finessed into its mature form, one that will have to carry that individual through adult life. An analogy that can be helpful to explain this uses the image of a nation's public transport system: this is the period when the brain's main motorway or railway systems are laid down. It is largely because of the sensitive nature of these changes, and the implications associated with getting a poorly adaptive "transport system" at the other end of adolescence, that early and intensive intervention in adolescence is justified.
Three 'functional nodes' have been proposed, which have more or less identifiable neural structures, and whichfucntion together to help to govern social interaction. These have been called the "Social Information Processing Network" (Nelson et al, Psychological Medicine, 2005). The first node (Detection) appears to fucntion by comparing incoming socially relevant information to pre-ordained (learned/remembered) 'social scripts'; it alerts the system if this information appears to err from these scripts. The second node (Affective) attaches an emotional reaction (generally fight/flight) to such instances. In the adolescent, crucially, the neurodevelopment of the third functional node normally lags about two years behind the development of the first two nodes described - this is the Cognitive Regulatory Node, and is a frontal function, which operates by inhibitting the impulsive affect-driven responses to such situations by applying higher order analysis to the situation, taking context into account, etc ([[Mentalization]], in short).
!Effects
As a result, there is a developmental hypersensitivity to mental states, which may overwhelm the adolescent's capacity to cope with thoughts and feelings except through action on his body or the world.
Although such adolescents may seem able to talk about feelings quite fluently, more abstract psychological ideas create great strain on the adolescent's system. This can lead to an apparently dramatic breakdown in [[Mentalization]], withdrawal from the young person's [[Social Ecology]] and the intensification of [[Anxiety]] and enactments ([[Acting Out]]). The extent to which this leads to long-term difficulty depends not only on the inherent strength of the YP's psychic structures, but also on capacity of the environment to support his weakened mentalizing function.
Naturally, this is further complicated by the fact that the YP may undermine the capacity of institutions to support him. An important principle, in integrating the different therapeutic interventions, is to create such support as strongly as possible, by reinforcing the understanding (and thus the effectiveness of the support) available in the YP's social environment.
There are [[CheckLists]] relating to New Referrals.
*See [[Referral Criteria]], which will be included in your locally-edited protols ([[Local Protocols]]).
*New Referrals are discussed in the Team Meetings - this discussion MUST include a [[Reflective Quorum]] to reach shared agreement on the current understandings of the [[RiskAssessment]].
*An urgent referral may require action before a full team meeting occcurs, in which case the [[Reflective Quorum]] may be smaller.
*Go to [[Processing a New Referral]] for details on getting started from the point of first contact, and [[Setting up a first meeting]].
*There is a checklist for the practitioner who embarks on a new assessment at [[Starting a NEW CASE - CheckLists]]
*Any work with young people and families occurs in [[Phases of AMBIT work]].
**A New Referral is obviously located in the [[INITIAL PHASE]] of the [[Intervention timeline]].
<html><iframe src="https://mailchi.mp/359e2b3c1dc4/ambit-helping-people-with-multiple-needs-newsletter/"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/7801754f7afc/ambit-helping-people-with-multiple-needs-newsletter-449358"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/d2ffba34686a/ambit-helping-people-with-multiple-needs-newsletter-449282"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/a013f92945d7/ambit-helping-people-with-multiple-needs-newsletter-449217/"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/a013f92945d7/ambit-helping-people-with-multiple-needs-newsletter-449217/"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/649bc8461319/ambit-newsletter-helping-people-with-multiple-needs/"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/4014af5662a2/ambit-helping-people-with-multiple-needs-newsletter-449314"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/0bfb6982393c/ambit-helping-people-with-multiple-needs-newsletter-449229/"height="900" width="100%"></iframe></html>
<html><iframe src="https://us13.campaign-archive.com/?u=aa2c9f8b722440e7e05bedb82&id=a81fb6ca8f"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/87d786cc323d/ambit-helping-people-with-multiple-needs-newsletter-449786"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/3e61cbab54a0/ambit-helping-people-with-multiple-needs-newsletter-449838"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/8ac2542b3aa2/ambit-helping-people-with-multiple-needs-newsletter-449878/"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/89f9d60f0bb5/ambit-helping-people-with-multiple-needs-newsletter-449706"height="900" width="100%"></iframe></html>
<html><iframe src="https://mailchi.mp/4e92f1526d66/ambit-helping-people-with-multiple-needs-newsletter-449582"height="900" width="100%"></iframe></html>
<html><iframe src="https://us13.campaign-archive.com/?u=aa2c9f8b722440e7e05bedb82&id=d10187e93d"height="900" width="100%"></iframe></html>
See also [[Contingencies]].
When I experience a behaviour or a response to me as //non-contingent// this implies that - from my point of view - there is a //"lack of fit"//. In it's turn, what this means is that the other person has failed to understand, or accept, or acknowledge ''ME'', and the unique predicament that I face, right here, right now.
In other word the other person has failed to [[mentalize|Mentalization]] me accurately.
The //lack// of any sense that //"this person has apprehended or accepted my mind"//, means that I do not experience "[[Epistemic Trust]]" - the knowledge that someone has authentically //connected// and sympathetically //understood// these things.
Activation of [[Epistemic Trust]] is necessary if I am to be able to LEARN from my "teacher". My being ''open to learn'' depends on my experiencing this Epistemic Trust - the sense that "you have noticed and understood what it is like to be me."
Mentalizing the state of mind of colleagues from other agencies assumes complexity of their mental state. Explicit descriptions of network relationships are often collapsed down into single dimensional positions that people are assumed to adopt. The aspiration of a mentalising approach to this situation is to recognise ambivalent, complex or conflicted states of mind in others in order to facilitate joining conversations that aim to validate lived experience of workers.
[[Positioning Theory]] from systemic practice may assist in constructing theory around this complex relational difficulty.
!!An illustrative case example.
A teaching assistant at a secondary school has developed a strong relationship with a young person who has very poor attendance at school. The Education Welfare Officer (EWO) has been referred the young person because of the severity of the attendance difficulties. A professionals meeting is called by the social worker because of increasing concern that the family are unable to cope with the young person out of school. At this meeting, education is represented by the EWO.The teaching assistant is not invited. This process 'positions' the relationship of the teaching assistant with the young person as not being of value in trying to address the young person's increasingly severe problems. The teaching assistant feels he understands the young person more than everyone else and that the higher status professionals do not understand the young person. This position is unintentionally communicated to the young person by the teaching assistant in his on-going contact with the young person. This unhelpful positioning is challenged by the AMBIT worker by inviting the teaching assistant to help with making sense of the young person's problems and by inviting the teaching assistant to meet with him and the young person together.
<a class="tc-float-right">[img [https://media.giphy.com/media/dvHbeNzFsyZ94ks1Bq/giphy.gif]]</a> ''Our ability to mentalize isn't fixed.''
When our emotional temperature goes up, our ability to mentalize goes down. This is part of our "fight or flight" survival mechanism, and it's very helpful at times when we are experiencing a physical threat.
However, we also respond in this way when we experience high levels of emotions for other reasons, and often at times when being able to keep mentalizing would be very helpful e.g. during an argument with someone, or during a professionals meeting about a worrying case
There are three main modes of thinking we tend to fall into when experiencing high levels of emotion:
*Certainty (or psychic-equivalence mode)
*Quick fix (or teleological mode)
*Waffle/ elephant in the room (or pretend mode)
<a class="tc-float-right">[img width= 300 [https://media.giphy.com/media/XGsaqVR8CGTEdrYvUL/giphy.gif]]</a>
!!!Certainty (or psychic-equivalence)
* Certainty, concreteness.
* Loss of the ability to recognise that what is in my mind doesn’t necessarily represent reality.
* I am not able to consider alternative perspectives.
<a class="tc-float-right">[img width= 300 [https://media.giphy.com/media/TfXYPGE942Pj1bx66n/giphy.gif]]</a>
!!!Quick fix (or teleological mode)
* Quick fix thinking, or “doing” mode.
* States of mind are understood in terms of external, physical things. I must see tangible “proof” before I can trust in a person’s intentions.
* Believing that something physical must be done to manage my current emotional state.
<a class="tc-float-right">[img [https://media.giphy.com/media/mEQCvfT374pozN7NBm/giphy.gif]]</a>
!!!Waffle/ elephant in the room (or pretend mode)
* Elephant in the room thinking.
* A disconnect with the reality of the here and now.
* There may be an incongruity between my thoughts and my emotions in which I appear quite reflective but with a lack of emotional awareness or content.
* A lack of attunement to another’s reality.
!!Hmmm...!
Could you please define what you wanted to do (the task you had marked out for yourself when you opened the manual, which we have not provided a simple path for) ...and then give us [[Feedback please!]]
!!Use your team
AMBIT stresses that we often think ([[Mentalize]]) more clearly when we are communicating with people to whom we feel securely attached. Hence the stress on SupervisoryStructures. Consider talking to a team member. Practice [[Thinking Together]] with a colleague.
!!Check for help:
There is technical help in the [[User Guide]]
There is advice for how to get outside help at [[Feedback please!]]
Johan Norberg is a popular science writer who writes about societal developments and political/economic themes.
In 2021 he wrote a book called Open - how collaboration and curiosity shaped humankind.
It was published by Atlantic Books 2021
The book is divided into two halves - the benefits of open systems - essentially liberal democratic capitalist societies are seen as best although imperfect examples of this and how these are balanced by the forces of closed systems what he calls ''tribalist'' thinking. . It was the latter that got me interested. He tends to consider the mechanisms of closed systems as if they were disorders but what attracted me to this framework was that open systems need to recognise the role of closeness etc.
For readers of this manual, the interest was whether this could help us understand the nature of complex systems and disintegrated processes. In some ways the book doesn't quite nail what I was looking for. Some of the sections are too high level and not connected to the details of collaborative practices. But the overall frame is I think useful. .
He posits a number of key barriers to open systems which are essentially ways of looking at the world. and that open systems carry the risk of stimulating these restrictive states of mind. These themes are consistent with Kahneman's exploration of cognitive biases and errors.
# Us and them
#Zero-sum thinking
#Antipatory anxiety
#Fight or flight
What can we do about these? He outlines his ideas on this on pages 368-382.
#Explore and reflect on our tribalism
#Exploring positive-sum solutions - which benefit both insiders and outsiders.
#Increasing individual self esteem reduces risk of tribal conformity.
#Increasing workforce mobility
#Limited value of verbally articulated shared objectives - mission statements
You are trying to make statements that might help reduce the level of anxiety (fostering security) in a young person. Statements that increase the sense that a particular pathological mental state (e.g psychosis) is not only //more common// than people might think, but also that it is still //understandable// (or can at least be //withstood//) help diminish the fear of [[Stigma]]. For instance:
//"Many people I have met, when they are under stress of one kind or another, experience episodes when they feel very worried, or have odd or frightening experiences - from research and from my own experience it is a lot more common than people think..." //
This is an example of [[Pause and Review]], that moves into the process of trying to ''"Notice and Name"'' common breaks in mentalizing:
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/x4kWdFiisko?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/x4kWdFiisko?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/6-NIABS4hFg?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/6-NIABS4hFg?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
!!Noticing
A statement about an interaction (preferably in the ‘here and now’, but it can also be a reported event or sequence) between two or more family members (if there is family present), or between the client and therapist, is the starting point.
Here the therapist focuses on ''an emerging pattern of how family members relate to each other'' or how this young person relates to others (or me). Keeping in mind that it is possible to make many different observations of what might seem just one event and that therefore any observational statement is highly selective, the therapist voices this and immediately follows it up by ''checking for CONSENSUS'' between family members...
>//“I notice that when Sally does x (cry), David it looks as if you find it very hard to understand what exactly she is feeling and why, and without this understanding her behaviour doesn’t seem to make sense ''(Noticing)''. Have I got this right or am I totally off the mark? ([[Checking]]) Can you see what I am talking about? Well, let me continue… to me it looks that when Sally does x (cry), this makes you feel (or act) really y (confused), and so you do z (cut off) or respond in y (confused) way. Likewise, Sally, when David then does this (y), it seems like you find it hard to understand exactly what he is feeling that makes him behave like this. And then to me it looks that this makes you feel (or act) z (irritated) and it goes round in circles. ''(Noticing)'' I don’t think anyone is to blame here because everyone is finding it hard and doesn’t quite understand where everyone else is coming from…I’m not sure I’ve got this right ([[Checking]]) … what do you think Sally?”//
In this example the therapist first identifies and highlights an interaction which (to him) appears to be related to some mentalization difficulty ''(Noticing)''.
The therapist then offers more [[Checking]] of her observation by inviting the family and its individual members to connect with and perhaps share this observation, but also giving them the chance to dismiss it.
It is possible that some or all family members might, for example, state that they had ‘no idea what the therapist was going on about'. This would then lead the therapist to reflect (in his own mind, without necessarily sharing this with the family at this stage) on the validity of his observation in view of the feedback obtained and himself dismiss the observation as insignificant and / or speculate about the possibility of – and potential reasons for - family members defending themselves again what has been observed. In either case it is unwise to just keep repeating the same.
If the observation (''Noticing'') and related comments resonate with some (or all) of the family members ([[Checking]]) then the therapist goes on to ''question the problem''; in doing this, the therapist is looking for
*Shared experiences of how this pattern of relating to one another is a problem for family members
*A common language with which to name or label it.
>//“Do you feel all right about the way this is…this kind of ‘going round in circles’ (are you happy with that)? If not, why or how does it bother you? Is that the way you want it? Is that something you want to change? Does it ever cause you a problem? Do you sometimes get stuck? If you kept this going what might be the outcome?”//
This line of questioning aims to elicit whether the family and its individual members regard the highlighted interaction pattern as something that causes them dis-ease (is experienced as ‘dysfunctional’), or as something that they regard as a non-issue (however ‘pathological’ it may seem to the therapist).
!!!When to focus in on an identified issue:
It is only if or when at least one family member perceives the observed interaction as being problematic, that the therapist can focus on this issue.
!!Naming
Once a problematic interaction has been noticed and focussed upon, the family are invited to find ways to NAME it.
In order to maximise the phase of emotional brainstorming introduced in the second step ([[Mentalize the Moment]]) the family can use [[Pause and Review]] techniques, playing with images of a video or DVD of the "action" which can be paused to allow time and space for mentalization to be recovered.
Family members are encouraged to form a ‘working party’ to think about interactions, from a meta-level, as it were. They are also encouraged ''to find some buzz words to mark the interaction sequence and the associated feeling states.''
>//“So what word or sentence comes to mind when you think about this?”//
The aim is to find a word or phrase that becomes some form of ‘mantra’ which family members can recall after sessions, when similar stuck interactions evolve. Examples are ‘tango’, ‘malignant clinch’, ‘top-dog’, ‘door mat’, ‘playing first fiddle’, ‘the knight in shining armour’, ‘playing the fool’, 'hot potato', etc
This is a place to gather locally-authored/adapted material describing //your// team's local protocols and "clinical" practices: //''"How we implement this work, here, with these young people."''//
>Click on any of the buttons below to reveal drop-down lists with topics that might be useful to manualize further by adapting that page, or creating a [[Sub-topic]] under that page.
> ''To MANUALIZE A NEW LOCAL RESOURCE'' (check you are [[logged in|Log in]]) select the ''"Create new tiddler as a sub-topic of this one"'' item in the picklist from any of these buttons.
>You will see your team's local protocols in a drop-down list; select a title to open it.
!!!Client
<<tag [[Our team and CLIENT work]]>>
><<tag [[Managing Risk]]>>
><<tag [[Manage CLIENT RELATIONSHIP]]>>
><<tag [[Manage CLINICAL PROBLEM]]>>
><<tag [[Active Planning - Local]]>>
!!!Networks
<<tag [[Our team and NETWORKS]]>>
><<tag [[Our Resources]]>>
!!!Teamworking
<<tag [[OUR LOCAL Teamwork and Governance]]>>
><<tag [[Implementation Plan]]>>
><<tag [[Team members]]>>
><<tag [[Local Protocols]]>>
><<tag [[SUSTAIN best practice]]>>
><<tag [[Thinking Together - Local]]>>
!!!Learning
<<tag [[Our team and LEARNING]]>>
><<tag [[TrainingManualization]]>>
><<tag [[Planning a training event in your team]]>>
This page acts as a Topic Heading (it [[Tags]] all relevant content) for material that a local team creates that describes:
----
<<tag [[OUR LOCAL Teamwork and Governance]]>>
----
[local team's should [[Edit]] this content by opening the [[OUR Team]] page]
!@@color(purple):WILLOW VUE@@
|bgcolor(lightblue): [[Our team's core expertise]] <br> Opens a page that briefly describes our team, what we do, where, with whom, and who we are... |bgcolor(pink): [[List LOCAL EDITS to the manual]] <br> Opens a page listing all the pages that have been //locally-edited// by this local team... |
|bgcolor(pink): <<tag [[Supervision Notes]]>> <br> Offers a drop down list of notes of learning points from local team Supervision sessions |bgcolor(lightblue): <<tag [[OUR LOCAL Resources and Practice]]>> <br> Offers a drop-down list of pages describing local resources in our locality, and our face-to-face ("clinical") practices |
|bgcolor(lightblue): <<tag [[Tasks & Problems to manage]]>> <br> Offers a drop-down list of pages describing the kinds of problems our team may have to manage |bgcolor(pink): <<tag [[OUR LOCAL Teamwork and Governance]]>> <br> Offers a drop-down list of pages describing our local approach to teamworking - our 'rules of play' or 'team culture' |
|bgcolor(pink): <<tag [[Local Manualization Homework Tasks]]>> <br> Offers a drop-down "to-do list" of [[Manualization]] tasks for a local team. |bgcolor(lightblue): [[+ Manualize our work]] <br> Make sure you are in [[Edit mode]] first, and then open this page to get started with your local manualizing... |
!Purpose
To give a brief overview of OCD, and pointers to material in this manual on how to help a young persn with these difficulties
!Information
Below, you will find a window containing the leaflet on OCD produced by the Royal college of Psychiatrists, or you can open this in a separate browser window, [[Here|http://www.rcpsych.ac.uk/mentalhealthinfo/mentalhealthandgrowingup/ocdinchildrenandyoung.aspx]].
You can also see the [[NICE OCD guidelines]], which outline the standards and best evidenced approaches.
<html><div align="center"><iframe src="http://www.rcpsych.ac.uk/healthadvice/problemsdisorders/obsessivecompulsivedisorder.aspx" frameborder="0" width="100%" height="600"></iframe></div></html>
!Some suggested screening questions:
How do you start to explore whether OCD might be an issue? Here are some examples of the kinds of questions that might begin to reveal the problem...
>//“Lots of people find themselves reacting to ordinary stress in different ways, and I want to ask a few questions about this to understand you a bit better if that’s OK."//
>//"Sometimes when people are stressed they get panicky, or angry, but sometimes people find other ways to kind of calm themselves down. If I list some of the ways that other people have told me about, can you let me know if you recognise any of these? Some of them may sound familiar, and some may seem really different – but we find that if we just go through some of the commonest things that come up, it can help people describe their own experience – does that sound OK to you?...”//
!!!Tidying
Some people find that they calm themselves down by keeping things in a really particular order – being very particular about tidying, etc. Is that something you like to do? If you imagined that someone very kind (perhaps a parent, etc) and well meaning came into your bedroom and did a bit of dusting, etc, and just moved a few little things out of place… would you notice? How might that make you feel?
!!!Checking
Some people find they want to check things a bit more than perhaps others would need to – things like electricity switches, the gas, window closures, door locks, etc. And sometimes they check things so much that other people notice and might remark on this – is that something that you notice?
!!!Appearance
Sometimes these kinds of habits are more focused on our appearance – getting hair, or makeup, or clothes ‘just right’ – and some people talk about finding that they spend more and more time having to do this… so that it starts to get in the way of other important things they want to be doing.
!!!Contamination
Sometimes feel safer when they know they are paying close attention to hygiene; so long as they can keep things clean they feel safer. That can lead to people washing their hands more than others would do, or taking quite a lot of time in the bathroom or toilet, using paper or disinfectant to protect themselves against any kind of contamination by bugs, etc., or washing their hands to the point when their hands can get quite raw, etc … Do you find that you have to take longer in the bathroom than you used to, or that other people of your age might do?
!!!Counting
Sometimes people find they just have to count things, or repeat phrases or car number plates, etc – they may feel a bit embarrassed about doing this, but they find they can’t stop doing it anyway – or that doing it helps them feel a bit calmer.
!!!Other superstitions
Sometimes people can feel quite embarrassed about other funny superstitions (like not stepping on the lines between paving stones, that sort of thing) that can get more and more important in their lives. I wonder if there are any things like that - which you just feel “you must do” because if you didn’t you’d feel worried, or something bad might happen
!What to Do
* You can look at the [[NICE OCD guidelines]].
* The most well evidenced approach to treatment is [[Cognitive Behavioural]] work, with or without medication (see [[Pharmacological]] approaches for advice on this, although the decision whether or not to prescribe is a medical one.)
* Some [[Family Work]] is also advisable, in order to:
** Help the family understand the difficulties (PsychoEducation)
** Recruit the family to support the treatment the young person is receiving.
** Reduce any criticism or blaming, and reduce the level of [[Expressed Emotion]]
!!Practice this in team training!
At the bottom of this page there is one of AMBIT's simple [[Training exercises]] on this topic, that a team could use on its own or with facilitation.
!!What is 'Graded assertiveness', and how does it fit with Mentalizing and Thinking Together?
[[Thinking Together]] is all very well if a colleague //asks explicitly for help with a problem//, or is// obviously upset about an issue// (in which case, even if they haven't asked to use Thinking Together as a way of clarifying the path ahead, they may easily agree to the process when their discomfort is acknowledged sympathetically!)
What about the scenario in which a worker becomes concerned for a colleague or about aspects of their practice, but there is no acknowledgement of any problem on that colleague’s part? ''Here there is a different task:'' first to find a way to stop and reflect, and this may involve a degree of //assertiveness// on the help-offerer, given that there is not (yet) anyone identifying themself as the help-seeker.
The problem is all the more acute if there is a ''difference in seniority or power'' between the worker/colleague they are concerned about.
* How do you challenge your boss?
* How does an administrator or youth worker challenge a clinical psychologist or doctor, whose specialist skills may be intimidating?
Of course it should almost go without saying that the capacity for a team to allow for transparent inquiry and challenge across all levels and grades is critical to being able to fulfil the AMBIT stance element [[Managing Risk]] safely. Doing this in a way that //works// is what this page is about...
[img[CUSS intro pic.png]]
There are ample examples of exactly the same kinds of issues arising within the ''airline industry'' (an industry that, above any other, has led the way in [[Developing learning organisations]], which AMBIT draws much inspiration from.) The journalist Matthew Syed published a very readable book on this, drawing out the similarities and differences between how the airline industry //learns from mistakes//, and how, in contrast, the worlds of health and social care frequently //do not// ([[Syed, 2016 Black Box Thinking]]). This book is highly recommended for thinking about how AMBIT positions itself in regard to learning.
>//Cabin crew who couldn’t find it in themselves to tell the pilot that he had shut down the wrong engine (the working one, rather than the burning one) despite the fact that they could see both engines, while the pilot couldn’t; a junior navigator who couldn’t convince the pilot and co-pilot that their lengthy efforts to check whether or not the landing gear had correctly deployed, while admirable and understandable, were less critical than the fact that the plane’s fuel was running out.//
Thanks to the existence of “black boxes” the conversations leading up to these (and other) disasters could be analysed, demonstrating two things;
* Workers' language used at the time revealed a failure of [[Mentalization]] (which includes what they describe as //“perceptual narrowing”// and what we might refer to as [[Teleological thinking]] or 'quick fix' thinking) on the part of the pilots
* ''Respect'' for seniority and expertise, ''fear'' of ''embarrassment'' if wrong, or of ''recrimination'' from their seniors, were ''significant barriers to raising a concern'' that - if they could have found a way through ''could have saved lives.''
As a result of these disasters and others, and in keeping with the way a [[learning organisation|LEARNING at work]] works, the airline industry developed social [[Rituals and Disciplines]] to support staff to make such challenges, known as ''Crew Resource Management''.
!!Graded Assertiveness in Communication and AMBIT:
A number of models of ''“graded assertive communication”'' drawn from this are now being taught in a variety of medical settings such as intensive care and surgery ([[Sutcliffe et al, 2004 - Communication failures: an insidious contributor to medical mishaps]]), of which two are referred to by the acronyms ''PACE'' and ''CUSS''.
* Both systems consist of 4 escalating levels of intervention by one team member to another in the event of concerns about practice arising.
* Each stage is marked by the use of different language as the level of assertiveness increases, with an expectation that (barring obvious and critical threats) a worker would usually start at the lowest level and build up to the highest.
* Like Thinking Together, a team that has collectively accepted, adopted and rehearsed these four steps is at an advantage, as the keywords used can act as helpful triggers, reminding the recipient of the essentially benign purpose in the intervention.
In the table below, the four levels of assertive intervention are mapped across both the two systems, which are in fact very similar.
This fits the context of AMBIT’s principled stance which focuses on the necessity of a [[Keyworker well-connected to wider team]], we would want to emphasise our team’s "cultural presumption of human fallibility", that is at the heart of our understanding of Mentalizing, which is fragile. The assumption in AMBIT is that //in doing this work we are all placing ourselves in a field of immense complexity, and potentially high risk//. It is well documented that serious untoward incidents are rarely attributable to single acts of monumental carelessness, but are much more commonly the result of an accumulation of small errors that were allowed to go unchecked. In such a situation it is risky to think otherwise than that in this work we are all constantly losing - or at imminent risk of losing - our balance. So, remembering the [[Ripples in a Pond]] analogy that we use, it is the feedback from our colleagues of their ‘on the bank’ perspectives, via clear and non-punitive communication, that enables us to make the multiple (and small, if we get there in time) adjustments and re-balancing movements in order to avoid a calamitous fall. These graded assertive interventions, like [[Thinking Together]], are no less important than the ropes holding mountaineers safely together in treacherous settings, and it is important for team members to remind each other of their benign intentions.
For the lower levels of assertiveness described in this table, if the worker causing concern is able to step back and reflect on their intervening colleague’s perspective, then Thinking Together to clarify an appropriate alternative response might be the most appropriate vehicle for this thinking.
!!Two models of Graded Assertiveness: PICK ONE!
There are (at least!) two systems that do the same thing; the table below compares PACE and CUSS.
It is important for teams to agree on one (not both!) and it would be acceptable for teams to think of an entirely different set of graded challenges if they wanted (or at least that would be much better than having //no agreed system// at all!)
What's important is that a team collectively holds a SHARED understanding of its important CUE WORDS.
* Using an AMBIT frame for understanding this, these cue words help a worker in [[Broadcasting Intentions]] and in [[Marking the Task]] with their colleague //whose behaviour/predicament is causing concern to others but not apparently to them self.//
* A team (just like an aircrew) must accept that these cue words and this discipline is in place to keep //each other// and //our clients// safe
* This is ''not about giving license for everyone in a team to criticise one another'', but to create an explicit and shared way of naming and exploring differences that connect to risk, and to be able to do this //in the heat of the moment.//
!!The (AMBIT-adapted) version of ''CUSS'':
[img[CUSS steps pic.png]]
!!Comparing the similar CUSS and PACE systems:
|''Level'' | ''PACE'' | ''CUSS'' | ''Notes'' |
| 1 | PROBE | CONCERN |This is the lowest level of assertiveness. Here the worker offers a question (probe) that models a tentative not-knowing mentalizing stance, but also offers their own mentalized sense of being concerned to know the answer. Crucially, they use a ~CUE-WORD from the relevant acronym (teams should choose ONE, not both!) and they focus on their OWN uncertainty, rather than focusing on their colleague's perceived error:<br>//“I may have misunderstood this, but I just want to ''probe'' whether you might be taking a lot of calls from X out of hours.”// or //“I'm just ''concerned'' to check things are OK in how you and X are working together?”// |
| 2 | ALERT | UNCERTAINTY |Raising their assertiveness, the worker shares (alerts the colleague to) their //own// uncertainty about whether what is happening is OK:<br>//“I want to ''alert'' us to the fact that the relationship between you and X seems to be getting very intense, which we know is risky.”// or //“I’m feeling ''uncertain'' about whether you might be becoming quite seriously isolated with this.”// |
| 3 | CHALLENGE | SAFETY | At this stage, the worker is clear that in their mind there is a real threat, and the intervention is more explicitly challenging, making reference to the lack of safety in the situation as it is perceived: <br>//“I think we need to ''challenge'' the assumption that only you can help X, as to me this relationship is now clearly outside normal professional boundaries.”// or //“The way this relationship is working seems ''unsafe'' to me; at the very least it puts you at risk of being accused of professional misconduct, and it may be harmful for X.”// |
| 4 | EMERGENCY | STOP |This is the highest level of assertiveness, calling for very clear and blunt communication:<br>//“I am calling this as an ''emergency'' now; until we can get clarification on what is going on and how best to support X and you safely, you need to ''stop'' taking calls from X, and we need to talk to a manager.”// |
!!!Training Exercises:
!!!!!1. PRACTICE using Graded Assertiveness in some role plays:
* As a group, design a few scenarios that are //true to life in your team// where a worker becomes a bit concerned that their colleague is missing something important, or is getting into risky territory.
* Divide into threes - a worker, a helper, an observer, and take it in turns to role play the different levels of intervention.
* Swap roles in the groups so everyone gets to be in the various 'hot seats'
* ''Humour can be helpful'' - remember it is marker of accurate and sensitively-attuned mentalizing
* Most of all, what the team is trying to do in this exercise is to ''develop their //own// [[Rituals and Disciplines]]'' that, as ''part of the team culture'' (//"we do it like this!"//).
** The intention is that these ''shared understandings/culture and shared practices'' will minimise the likelihood of a well-intentioned effort-to-help (by warning, by alerting, by suggesting alternative paths) being mistaken as a criticism, and to enhance the team's sense that //"We all work in risky territory, we all have blindspots, and we are all safer if we keep our eyes on each other and communicate clearly about risks we see in each other's vulnerability to 'falling off the path'"//.
!!!!!2. Use Post-it notes to describe how YOU would like to be helped (if you are not aware you need help):
Put two large pieces of poster paper on the team's office wall, each with a different heading:
''//How// I find it helpful to be told when (not if!) I am unintentionally doing something that is:''
* ''__Annoying__ you''
* '' __Worrying__ you''
<div style="background-color: #cde7e8">
<h2>How the system works</h2>
</div>
For each client you work with, you set up a new AIM Cards room. That room will have a unique web address that you will share only with your client. Your work in the room is saved between sessions.
Any room that you don't use for 30 days will be deleted.
<div style="background-color: #cde7e8">
<h2>STEP 1: Download the AIM Card file</h2>
</div>
There is no need to //open //this file, just //download //it to your device//////// The file is named aimcardsroom2024.pcio
{{aimcardsroom2024.pcio}}
<div style="background-color: #cde7e8">
<h2>STEP 2: Make an account at playingcards.io</h2>
</div>
Sign up from the [[http://playingcards.io]] homepage
[img width=400 [sign up.jpg]]
<div style="background-color: #cde7e8">
<h2>STEP 3: Create a new room on the playingcards.io site</h2>
</div>
Navigate to the [[this page|https://playingcards.io/game/standard-deck]] or chose ''any'' game from the homepage and click ''Start Game''
[img width=400 [start game.jpg]]
Click enter to enter the room
[img width=300 [custom link.jpg]]
<div style="background-color: #cde7e8">
<h2>STEP 4: Import the AIM Cards to your room</h2>
</div>
Now you will import the AIM Cards to your new room, using the file you downloaded in step 1.
* Click the briefcase icon to enter edit mode
* Under Room Options click "import from file" and chose the aimcards.pcio file you downloaded previously
* Click the briefcase again to leave edit mode
[img width=400 [room options and import from file.jpg]]
<div style="background-color: #cde7e8">
<h2>STEP 5: Invite your client to join you</h2>
</div>
* Share the web link for the room with your client
* Card movements are synchronised across screens
* Progress will be saved between sessions
* All rooms are deleted after 30 days if not used
[img width=500 [aim cards room.jpg]]
<div style="background-color: #cde7e8">
<h2>STEP 5: Copy as many rooms as you need and manage them from your account</h2>
</div>
From the playingcards.io home page, go to your account
[img width=600 [yourrooms.jpg]]
To copy a room click the three dots next to an existing room and select Copy Room
[img width=400 [copy room.jpg]]
These are questions that do not lead to yes or no answers, but instead leave the answerer free to structure a reply in as narrow or broad terms as they wish:
Some examples of Open Questions:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/GxmsoTtroZ0?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!AMBIT - open source therapy?
We have referred to AMBIT as an "opensource therapy".
//'Open Source'// refers to a model for the development of computer software that is at the opposite end of the spectrum from the single large (multinational) company that designs a product, wraps it in layers of secret code, and sells it, and subsequent updates.
An opensource project keeps the "source code" wide open on the internet, so that any programmer can examine it and offer improvements which are then debated and, if found to be effective, accepted into the core by the steering group. Software developed in this way tends to be "lighter", and much faster to adapt to the needs of users, and is generally easy to get hold of. A well known example would be the freely downloadable browser, "Firefox".
!!Parallels - an Open Source Therapy
There are some parallels between the "open source" movement in computer programming and the hierarchically devolved model of treatment manualization proposed by [[TiddlyManual]]s, and in general the [[AMBIT]] approach draws some of its inspiration from the Opensource movement in computing.
The Open source movement has a motto which, in their case, relates to computer code, but which might just as easily relate to our thoughts and beliefs about why we do what we do in therapy - that is:
>''//"Release early. Release often"//''
By this programmers mean that they publish their early attempts to make something work. There is no spur towards improving what I am working on more powerful than the anxiety that what I have released to the world is 'not quite good enough yet' (or worse...) Nor is there any better way to gather real //feedback// than to "put it out there".
In a sense the opensource programmers' explicit efforts to broadcast their intentionality, and their "best guesses so far" (by blogging, publishing or releasing code on the web) is not so very far removed from the [[The Worker's Mentalizing Stance]] - whereby my curiosity is partly about checking very frequently with my client to see if my ideas worked as such: //"Here's an idea that I have in my mind, it may make no sense at all, but what do you make of it..."//) have any resonance with the client.
At the level of the team 'blogging' its own ideas about //"what works here, with these young people"// in their local version of the manual the parallels are even easier to see.
This is a technical definition of what underlies [[Marked mirroring]].
It means "pointed" or "pointing" communication, and is the way humans not only tell each other things, but also tell each other that they are telling them something important! It refers to the way that humans use tone of speech, eye contact, physical contact, etc, to place a "frame" around a piece of communication to emphasise that it is a bit special... To say "wake up, what I am about to say is important!"
This is particularly important when humans offer each other (particularly when a parent offers a child) what are called // "second order representations"// i.e.
>//"__''my''__ understanding about how I think ''__you__'' are thinking and feeling in this situation."//
See [[Academic references]] for work on this by Gyorgy Gergely.
The nature of many psychotic symptoms (for instance paranoid ideas, thought disorder, distraction by hallucinations, negative symptoms) makes building confiding and trusting relationships very much harder.
Likewise, the poor concentration, or panic states that are often often associated with depression, or the anxious ruminations of OCD, etc, etc, interrupt the normal process for making secure bonds between patient and keyworker.
In some situations concentrating on QuickWins may be useful - ie. slowing down the drive to engage with Mental Health needs "head on".
Deploying [[Pharmacological]] interventions, which are demonstrably effective in controlling many symptoms of psychosis, at least to the point at which authentic engagement might begin, will be a high priority, but it is often medication that stirs the most trenchant opposition.
At worst, if the balance of risks and benefits suggests it, the team may be forced to consider whether and Assessment of whether it is appropriate to [[Use the Mental Health Act]].
!!''AMBIT takes a holistic approach''
AMBIT is focused on working with clients where complexity is a feature, and where there are multiple interacting problems. For this reason it places a high value on re-establishing the ordinary social/educational/vocational and recreational contacts that tend to shape and support clients (especially young people). It aims to address a wide range of aspects of the client's life rather than focusing entirely on a single target problem. In this way, AMBIT emphasises [[Working in multiple domains |Working in multiple domains]] of the client's life.
In parallel, AMBIT explicitly addresses the complexity within a professional network that we see as inevitable when complex problems invite multiple interventions from multiple workers and multiple services. (Please see [[complexity|Complexity]] and [[Addressing disintegration|Addressing Dis-integration]] for more detail.)
!!''AMBIT is a team intervention''
In spite of the emphasis on interventions being delivered by a single keyworker, AMBIT is essentially a team-based approach, with a strong emphasis on mentalization as a core concept of team working.
In AMBIT, there is emphasis on using different ways to help support and repair mentalization in the client and family. However, there is an equal emphasis on the organisational aspects of instilling within team members the day-to-day duty of mentalizing each other accurately and sensitively, and supporting each others' capacity to mentalize (in what are often hostile or invalidating environments (see [[Keyworker well-connected to the wider team|Keyworker well-connected to wider team]]).
There is a focus on developing and sustaining a team culture (see [[Rituals and Disciplines|Rituals and Disciplines]]) that maintains this. One way to understand this is a deliberate shift from the "Team around a child" approach, towards the [[Team around the Worker|Team around the Worker]], so that the wider team focuses on supporting a secure therapeutic attachment relationship between the young person and worker:
<center>[img width=700 [https://lh5.googleusercontent.com/-Q--oDenShgU/UcD32HjdpVI/AAAAAAAAIlk/tGuG_Ps4QbE/w891-h668-no/AMBITSpokes_B%252BW.JPG]]</center>
!!''AMBIT Manages risk''
Considerable attention is given to ensure that community based practitioners maintain clear boundaries with clients and work safely in often somewhat chaotic, unpredictable and potentially isolated situations. See [[Managing Risk]].
!!''AMBIT emphasises the importance of local expertise''
AMBIT aims to explicitly build on the existing strengths of the team, and pays attention to areas of practice that teams already do well. AMBIT is designed to support the development of local expertise that provides care which is contingent to the needs of the local setting.
AMBIT offers a theoretical framework, specific tools and ways of working. However, our experience is that services adapt and apply these in ways that fit their context and culture, and continue to adapt them. In this sense AMBIT is not a ‘static model’ and there is not one ‘AMBIT team’, rather there are a community of AMBIT influenced teams or services.
There are many different specific interventions included within the core AMBIT manual and few teams would claim to use all of these. Many teams would include additional interventions that they have expertise in.
!!''AMBIT has a web-based manual''
AMBIT is, by design, ''changing and adapting in relation to learning'' This is why it has been developed and described from its very beginnings in a flexible, adaptable online Wiki format, rather than in unchangeable printed text.
The wiki manual provides information about AMBIT, and is an aid to the team in their daily clinical work.
[[Who is this manual for|Who is this manual for?]]? gives a more detailed discussion of who this manual is really "aimed at". The manual includes all our [[AMBIT training materials|Suggested Team Training Sessions]], so it can act as an aid to teams trainings.
If this is your first time in a [[TiddlyManual|TiddlyManual]], you may need a little help in navigating around, but it works (on the surface at least) much like an ordinary website. Please see the [[User Guide]] for explanation on how to get started in navigating and for teams who have trained in AMBIT, how to begin adapting and developing your own local version of this manual.
!!''AMBIT promotes a Community of Practice and an "OpenSource" approach to therapy''
AMBIT influenced teams can co-construct their own localised version of the AMBIT manual building in their own local expertise alongside evidence-based or evidence-oriented practice.
The radical and award winning approach to treatment [[manualization|Manualization]] encourages the development of a [[Community of Practice|Community of Practice]] between the different teams using it. Teams are encouraged to share their learning and become curious about the work of other teams. This is facilitated by ''Comparing and Sharing functions'' within the manual (these functions are currently being updated)
AMBIT is strongly opposed to the notion that effective ways of working with can be turned into intellectual property or commodities. Its manual is freely available, and is built on developments from a wide range of fields. There are parallels between the OpenSource model of software development in computing and many of the ways that AMBIT is conceived of operating.
''See below for a brief visual explanation of the theory behind the Tiddly manual and the Community of Practice''
<html><iframe width="480" height="360" src="https://www.youtube.com/embed/EZ_yHJ1WLTE?rel=0" frameborder="0" allowfullscreen></iframe></html>
----
!!Is this new?
Please see [[What is different in what you are teaching?|We do most of this AMBIT stuff already - what is DIFFERENT in what you are teaching?]] for more detail around this question.
Many of the ideas in this manual will already be familiar to experienced staff working with this client group. In addition it provides manualized instructions on a wide range of specific interventions that are drawn from evidence-based practice.
The intention is to help workers become more confident in managing complex behaviour in their client group. It is designed to be highly practical, adaptable, and to build upon a set of //collaborative relationships//:
* Not only between worker, client, and their existing network
* But also between the worker and team members
* And between the team and external sources of evidence and advice that the core of this manual represents
!!Purpose
Each team who trains in AMBIT gets their own individual AMBIT manual, which they can add to and edit to become their own. Through the training, Teams learn to [[manualize|Manualization]] their own work which is a social discipline that teams report can help support one of the core AMBIT quadrants, [[LEARNING at work]]. At present there are a number of teams who edit their manuals and manualize on a regular basis, and we list these below.
Below that list, you'll see a window onto the general signposting site to ALL the local versions of the AMBIT manual (and other wiki manuals not relating to AMBIT) that are hosted by the [[AFNCCF]] (you can open this in a separate browser window with the URL ''manuals.annafreud.org'')
!!Teams Who Manualize
Below we have included a list of the teams who are currently using the practice of manualizing, the links to their manuals are included.
* [[AMASS|https://manuals.annafreud.org/ambit-amass/]]
* [[AMYOS|https://manuals.annafreud.org/ambit-amyos/]]
* [[Bexley CAMHS|https://manuals.annafreud.org/ambit-bexley/index.html]]
* [[Brighton & Hove|https://manuals.annafreud.org/ambit-brighton/index.html]]
* [[CASUS|https://manuals.annafreud.org/ambit-casus/index.html]]
* [[Herts & Bucks LD Service|https://manuals.annafreud.org/ambit-hertsandbucksld/index.html]]
* [[The Hive|https://manuals.annafreud.org/ambit-hive/index.html]]
* [[Lancashire & South Cumbria Collaboration|https://manuals.annafreud.org/ambit-lancs/index.html]]
* [[Wandsworth|https://manuals.annafreud.org/ambit-wandsworth/index.html]]
* [[The Winch|https://manuals.annafreud.org/ambit-winchproject/index.html]]
* [[Camden Resilient Families|https://manuals.annafreud.org/camdenresilientpeople/index.html]]
* [[IMPACT|https://manuals.annafreud.org/impact/index.html]]
* [[The VIP|https://manuals.annafreud.org/ambit-thevip/index.html]]
*[[C&E MIND|https://manuals.annafreud.org/ambit-cemind/index.html]]
*[[Voralberger Kinderdorf|https://manuals.annafreud.org/ambit-vorarlberger-kinderdorf/index.html]]
*[[Ungdomsbasen|https://manuals.annafreud.org/ambit-kristianstadyouth/index.html]]
!!General Wiki-manuals Signposting Site
You can see a list of all teams manuals through the signposting site manuals.annafreud.org. In the frame below if you click '>More' under AMBIT you will see the list of all AMBIT manuals.
<html><iframe src="https://manuals.annafreud.org/"height="900" width="100%"></iframe></html>
!!Further actions for AMBIT-trained teams:
For guidance on how to get started with manualizing see the page [[Manualization]]. If you would like us in the AMBIT project to help connect you up with other teams who are manualizing, then feel free to [[Contact us|AMBIT programme]].
----
As part of manualizing and creating [[your teams own local |Your Manual]]manual you may wish to create a library of resources that are currently in use in your team currently. The <<tag [[Our Resources]]>> tag is intended to help build a 'library' of useful resources for the work they are doing.
!!Adding a new resource?
Check you are logged in, create a new page or upload a pdf or video and tag this with 'Our Resources'. See [[How to edit - Videos]] for guidance on doing so. Below are some examples of resources which could be added:
*[[AMBIT Forms]] - offers downloadable copies of slides/paperwork that may have been used in AMBIT trainings, and which can be used by local teams.
*CrisisServices - a place to detail Crisis services operating in the local area. (You could create a range of separate tiddlers, each tagged with the phrase CrisisServices.)
*[[Local Protocols]] - where to record protocols that the local team has developed for specific tasks. (You could create a range of separate tiddlers, each tagged with the phrase "{{{[[Local Protocols]]}}}".)
!!!''Suggested Local resources to record:''
>e.g. Youth clubs
>e.g. Sports Centres
>e.g. Special offers available for young people
>etc
!!Privacy
Be mindful of individuals' rights to privacy. Do not add addresses or telephone numbers unless these are resources that are already available on the internet. If in doubt, you can provide [[HyperLinks|How to add Hyperlinks]] to existing web-based resources.
!!''"Resources" are not Strengths or Resiliencies''
We define StrengthsResiliencies in a young person/family as something different from the Resources that a [[Key Worker]] may be able to draw on.
Teams are invited to create new locally-relevant content here.
See <<tag [[Our team and CLIENT work]]>> to start a new page on working with clients in your team.
----
See <<tag [[Working with your CLIENT]]>> for material on how AMBIT might contribute.
----
Teams are invited to create new locally-relevant content here.
See <<tag [[Our team and LEARNING]]>> for questions and materials that this team has begun to develop.
----
See <<tag [[LEARNING at work]]>> for material on how AMBIT might contribute
----
Teams are invited to create new locally-relevant content here.
See <<tag [[Our team and NETWORKS]]>> to start new page about your work with networks
-----
See <<tag [[Working with our NETWORKS]]>> for material on how AMBIT might contribute
----
[''LOCAL TEAMS:'' This is a page that will only make sense when edited by a local team in its ''local version'' of the AMBIT manual. It is designed to be useful for other browsing teams to have a look at (part of the [[Comparing and Sharing functions]] offered by these manuals.) It should try to capture and summarise information that would lead a curious browser into the areas of THIS team's adaptations that might be of particular use and interest (that might be worth copying and developing.)
''Delete these instructions'' when you come to [[Edit|How to edit your team's manual]] this page in your own local version. ]
!!A Basic description of this team
!!!Where we work:
[...LOCAL teams ''Delete these instructions'' and add your own description here.]
!!!Our Target Population:
[...LOCAL teams ''Delete these instructions'' and add your own description here.]
!!!Our Specific Skills:
[...LOCAL teams ''Delete these instructions'' and add your own description here.]
!!!Problems for which we have developed special expertise
[...LOCAL teams ''Delete these instructions'' and add your own description here. Record here a basic list of the MAIN/COMMONEST KINDS OF DIFFICULTY your team has experience of working with]
1.
2.
3.
4.
See also some of local resources, practice, teamworking practices and governance protocols that support us in this work:
<<tag [[OUR LOCAL Resources and Practice]]>>
<<tag [[OUR LOCAL Teamwork and Governance]]>>
Suggested outcome framework for start of the work with client.
!Initial meeting score:
Remember the [[AIM]] KEY PROBLEMS offer the most specific problem-focussed outcome scale.
[_] - [[AIM]] scores completed and exported to database
[_] - [[CGAS]] (0 - 100) scores completed and exported to database
[_] - [[CGI-S]] (1 - 7) Severity score - complete and export to database.
[_] - [[HoNOSCA]] (0 - 52) scores completed and exported to database
[_] - [[SDQ]] - scores completed and exported
[_] - [[YPOR - Drug and Alcohol Outcomes]] if DRUGS or ALCOHOL are features.
Add other outcome scales as appropriate
These are to be completed after the first session, and at the end of therapy, and are one of a collection of key activities included in CheckLists for the therapist starting a new case ([[Starting a NEW CASE - CheckLists]]
Remember the [[AIM]] KEY PROBLEMS offer the most specific problem-focussed outcome scale.
[_] - [[AIM]] completed and exported to database
[_] - [[CGAS]] (0 - 100) scores completed and exported to database
[_] - [[CGI-S]] (1 - 7) Severity score - complete and export to database.
[_] - [[HoNOSCA]] (0 - 52) scores completed and exported to database
[_] - [[SDQ]] - scores completed and exported
[_] - [[YPOR - Drug and Alcohol Outcomes]] if DRUGS or ALCOHOL are features.
Add other outcome scales as appropriate
Record scores from the END of treatment here. Record scores from earlier phases in treatment at:
[[Outcome measures (T1, initial)]]
[[Outcome measures (T2, 3 months)]]
!Final meeting score
[_] - [[AIM]] scores completed and exported to database
[_] - [[CGAS]] (0 - 100) scores completed and exported to database
[_] - [[CGI-S]] (1 - 7) Severity score
[_] - [[CGI-I]] (1 - 7) Improvement score - complete and export to database.
[_] - [[HoNOSCA]] (0 - 52) scores completed and exported to database
[_] - [[SDQ]] - scores completed and exported
[_] - [[YPOR - Drug and Alcohol Outcomes]] if DRUGS or ALCOHOL are features.
This is a broad topic, that relates to [[LEARNING at work]] - addressing the fundamental question: //does any of this actually make a useful difference?// to our clients, to workers, to communities...
* <<tag [[Evaluating outcomes]]>> - describes the WHAT, the WHY and the HOW of evaluating outcomes
* <<tag [[Published/Current Outcome Studies]]>> - gives material on:
** studies ''about'' AMBIT
** studies that we think are ''relevant to'' AMBIT
* Also related to this material is the (not entirely comprehensive) list of <<tag [[Academic references]]>> that AMBIT has drawn on and contributed to.
!!!!Source: Peter Fuggle
!!!What do we know about the clients who drop out of treatment?
Because AMBIT began working with children and young people, we will look at the literature on drop out in child mental health services.
A metaanalysis of treatment drop out was carried out by ''A.M de Haan, Boon, A.E., J.T.V.M de Jong, M. Hoeve, R.R.J.M Vermeiren (2013) A meta-analytic review on treatment dropout in child and adolescent outpatient mental health care, Clinical Psychology Review,33,698-711.''
From this review, estimates of the number of drop outs from treatment vary but are high. Looking at different definitions of drop out, overall estimates of drop out were either 35.8% (therapist rating) or 44.5% (failed to complete expected number of treatment sessions). Drop out rates were higher for effectiveness studies than for efficacy studies ranging from 45-59%.
Predictors of drop out were:_
* more directive type of therapy (Effect size 1.25)
*perceived lack of relevance of the treatment (Effect size: ES 1.13:
*expecting improvement to occur quickly (Effect Size ES 0,.63)
*contact with deviant peers (ES=0.65).
Overall characteristics of family had less significance around drop out than aspects of the treatment offered.
!!!!Comments from James Fairbairn
Yes I think it makes sense to reference drop-out rates/non attendance from services when we talk in the paper about the stated aim of AMBIT i.e. that we are trying to help people to use help who otherwise wouldn’t……
The next questions ‘why do they drop out?’ and ‘do these people get worse without help?’ are very important but obviously are complicated to answer…. I don’t think we can go into detail on this in the paper (I don’t think you are suggesting this anyway, rather more a question to open in the discussion?).
One approach to the question ‘do they get worse?’ could be to look at data on waiting lists- do people on these get worse over time without help? (although some will get better and also there could be something about just waiting on a list that leads to things getting worse for some).
Another approach could be to take more of a developmental psychopathology stance- what does the literature tell us about the course of problems over time for people who have the most multiple burdens... there is the paper by Caspi et al on the ‘p factor’ which may help us with this. There is also literature on personality disorder and people who do get better without treatment (related also to the notion that you can actually do harm by intervening with this group if you do certain things).
In response to James' comments we have created a page to look at some of these longitudinal studies ([[Can longitudinal studies help us understand AMBIT outcomes?]])
I think this leads to some fascinating questions…like possibly exploring attrition rates of AMBIT as you suggest Peter…. Then if we are saying AMBIT is used in contexts where people are not traditionally help seeking… how do AMBIT attrition rates compare to other contexts…but then that leads back to the question above about ‘so what?’ …’do people actually get worse if they don’t connect with help of any form?’
!!!!Source: Peter Fuggle
!!!!Working notes on references relating to outcomes for children and young people with multi-agency needs.
//Tausendfreund, T., Knot-Dickscheit, J. (2015) Children in families with multiple problems: Advancing a main challenge. International Journal of Child and Family Welfare,16,11-21//
*Highlights that many programmes focus on parenting and this may result in little support to the child and little change in their problems. Advocates for longer term interventions and dual worker interventions where one worker works with the parent and one with the young person.
//Spratt, T. (2011) Families with multiple problems: Some challenges in identifying and providing services to those experiencing adversities across the life course Journal of Social Work 11(4):343-357//
*''Abstract.'' A concern amongst policy-makers to identify high cost and low productivity populations has created a new interest in identifying those who experience adversities across the life course. This article outlines the development of conceptual understandings of families whose children experience multiple adversities and links this with later poor outcomes in adult life and examines some of the research challenges in establishing such linkages. Findings: It is argued that current thinking with regard to these issues reflects historical domains within which services to children and to adults are located. The challenge to domain thinking is both horizontal and vertical, policy being required to address the horizontal axis by co-ordinating planned approaches to multiple needs across services, and policy being necessary to address the vertical cleavage between children's and adult services in ways which join up services across the life path; conceptually and practically acknowledging the links between child and adult experiences. Applications: Such policy developments will inevitably require social work to develop alternative paradigms for understanding the needs of children and adults and designing services to effectively meet these.
//What works in preventing and treating poor mental health in looked after children? Nikki Luke, Ian Sinclair, Matt Woolgar and Judy Sebba. (2014) NSPCC/Rees Centre.//
*Highlights the limited evidence for many interventions for this population. Many without comparison groups and small (often qualitative) studies.
//Mitchell, Penelope F., 2011. Evidence-based practice in real-world services for young people with complex needs: New opportunities suggested by recent implementation science. Children and Youth Services Review, Elsevier, vol. 33(2), pages 207-216, //
*''Abstract''. There is growing agreement that child and youth services have been slow to implement evidence-based practice (EBP). A variety of interrelated barriers and facilitators of EBP implementation have been recognized and investigated. Key categories include the attitudes of providers, the characteristics of client populations, the characteristics of usual practice, organizational factors, and resource availability. Implementation scientists are investigating these factors, seeking to bridge the gap between clinical science and practice. Much of this work has been conducted in the context of behavioural health services for children and young people. This paper provides a purposeful review of this research from the perspective of decision-makers in agencies serving young people with multiple and complex psychosocial needs. ''It is argued that major barriers to EBP may be mitigated if ways can be found to transcend the oppositional construction that has characterized the discourses of EBP versus practice wisdom. A conceptual approach to such integration is offered.'' New lines of implementation research are offering opportunities for practical action by decision-makers consistent with this integrative approach.
//Nunn, D. M. (2006) Spiralling Out of Control: Lessons Learned from a Boy in Trouble. Report of the Nunn Commission of Inquiry, Halifax, Province of Nova Scotia.
//
*This is a extremely impressive report about a young person receiving help from multiple agencies that led to a tragic death of another child. It is extremely valuable as an example of disintegrated help.
//Ann F. Garland, Richard L. Hough, John A. Landsverk & Sandra A. Brown (2001) Multi-Sector Complexity of Systems of Care for Youth With Mental Health Needs, Children's Services, 4:3, 123-140, DOI: 10.1207/S15326918CS0403_2//
*''Abstract.'' Children's mental health services have been revolutionized to reflect the realization that youth with mental health needs are served by multiple service sectors, including child welfare, juvenile justice, special education, primary health care, mental health, and alcohol and drug services. "Systems of care" models have attempted to improve integration of services across these multiple sectors and have been influential in driving policy and funding changes, but these models have focused primarily on cross-sectional service use. The goal of this conceptual article is to expand on these models by identifying factors that affect dynamic, longitudinal multi-sector service use. Greater understanding of these longitudinal patterns may suggest effective targets for intervention. In addition, this conceptual framework may provide a contextual template for current studies of multi-sector service need, use, and effectiveness.
*Their conclusions are based on their work with the Patterns of Care (POC) study in San Diego, California, which was a population-wide survey of over 22,000 children and adolescents who were receiving at least one service (75.8 per cent reported using a single service, 21.5 per cent were actively using two and 2.7 per cent were active in three or more). Service use included interventions by mental health, child welfare,juvenile justice, special education, and alcohol and drug services. The study, conducted in the mid-1990s, showed that children could receive very different mental health care depending on the service the child was using, with service provision aligning with the mission of the organisation rather than the child’s assessed needs. Furthermore, each system had different entry points, such as a child’s victimisation or delinquency, with treatment often narrowly focused on one particular problem. Garland et al. conclude that ‘Increased attention to, and understanding of, longitudinal pathways through service systems may suggest critical points of effective intervention to deter maladaptive pathways and facilitate adaptive pathways of service use and development’ (Garland et al., 2001, p. 126). For YPCNs, these critical points of decision and referral are complicated by service availability and limits on the scope of practice of each system’s providers.
//Malmgren, K.W., Meisel, S.M. Characteristics and Service Trajectories of Youth with Serious Emotional Disturbance in Multiple Service Systems. Journal of Child and Family Studies 11, 217–229 (2002). //
*''Abstract.'' Understanding the characteristics of youth with Serious Emotional Disturbance (SED) impacted by multiple agencies, and the pattern of services provided to these youth in the absence of or prior to coordinated intervention, can assist the design and implementation of multiagency intervention programs. The current study provides a descriptive analysis of a cross-section of 93 secondary students with SED served concomitantly by special education, juvenile justice, and child welfare. Characteristics of early service delivery and child risk factors were examined through an archival record review. Gender differences were found for age at earliest contact, identification for special education, and contact with juvenile justice, with girls being significantly older in all. Ethnic differences were found for age at identification for special education and experience with neglect, substance abuse, and incarceration of a family member. A majority of participants demonstrated early conduct problems and experienced high rates of school mobility.
//Grimes KE, Kapunan PE, Mullin B. Children's health services in a "system of care": patterns of mental health, primary and specialty use. Public Health Reports (Washington, D.C. : 1974). 2006 May-Jun;121(3):311-323. DOI: 10.1177/003335490612100315.//
*''Abstract.'' Children's mental health services have been revolutionized to reflect the realization that youth with mental health needs are served by multiple service sectors, including child welfare, juvenile justice, special education, primary health care, mental health, and alcohol and drug services. "Systems of care" models have attempted to improve integration of services across these multiple sectors and have been influential in driving policy and funding changes, but these models have focused primarily on cross-sectional service use. The goal of this conceptual article is to expand on these models by identifying factors that affect dynamic, longitudinal multi-sector service use. Greater understanding of these longitudinal patterns may suggest effective targets for intervention. In addition, this conceptual framework may provide a contextual template for current studies of multi-sector service need, use, and effectiveness.
//Young People with Complex Needs: Designing Coordinated Interventions to Promote Resilience across Child Welfare, Juvenile Corrections, Mental Health and Education Services, Michael Ungar*, Linda Liebenberg, and Janice Ikeda British Journal of Social Work (2014) 44, 675–693 doi:10.1093/bjsw/bcs147
//
*''Abstract.'' Young people with complex needs (YPCNs) use multiple services that are often poorly coordinated despite the best efforts of social workers to act as case managers. Based on two case studies from research with 116 youth who are multiple service users in Atlantic Canada, six principles for the design of services are suggested reflecting both this study’s findings and the broader literature on YPCNs. Services that are (i) multi-level, (ii) coordinated, (iii) continuous over time, (iv) negotiated with users, (v) provided along a continuum from least to most intrusive and (vi) shown to be effective are more likely to meet the long-term needs of youth facing the cumulative disadvantages of family, community, school and individual challenges.
//Höltge J, Theron L, van Rensburg A, Cowden RG, Govender K, Ungar M. Investigating the Interrelations Between Systems of Support in 13- to 18-Year-Old Adolescents: A Network Analysis of Resilience Promoting Systems in a High and Middle-Income Country. Child Dev. 2021 Mar;92(2):586-599. doi: 10.1111/cdev.13483. Epub 2021 Jan 22. PMID: 33480059.
//
*''Abstract.'' Adolescents' ability to function well under adversity relies on a network of interrelated support systems. This study investigated how consecutive age groups differ in the interactions between their support systems. A secondary data analysis of cross-sectional studies that assessed individual, caregiver, and contextual resources using the Child and Youth Resilience Measure (Ungar & Liebenberg, 2005) in 13- to 18-year-olds in Canada (N = 2,311) and South Africa (N = 3,039) was conducted applying network analysis. Individual and contextual systems generally showed the highest interconnectivity. While the interconnectivity between the individual and caregiver system declined in the Canadian sample, a u-shaped pattern was found for South Africa. The findings give first insights into cross-cultural and context-dependent patterns of interconnectivity between fundamental resource systems during adolescence.
Comparisons between untreated and treated groups. show that untreated clients have worse outcomes and that there is the risk of more of these continuing into adulthood.
!!!Behaviour problems
Children with untreated behavioural problems are more likely to leave school without a qualification, engage in delinquent activities, abuse drugs and alcohol and become unemployed
*Lochman & Salekin, 2003;
*Moffitt, Caspi, Harrington, & Milne, 2002)
!!!Emotional problems
Children with untreated anxiety problems are more likely to have anxiety problems in adulthood than those have received treatment.
*Dadds et al 1999
Outcomes from the Family Intervention Programme which was the programme which preceded the Troubled Families Programme have been summarised as follows.
Percentage Reductions in the following problems (selected)
*59% Anti-social behaviour
*45% involvement in crime
*52% Truancy and school exclusion
*24% Mental health problems
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Overview: LEARNING at work'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Overview: Working with your CLIENT'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Overview: Working with your NETWORKS'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Overview: Working with your TEAM'>>
</div>
----
!!''Two meanings, beware!''
1. POD is sometime used as shorthand for the [[Passed-outwards Discussion]] which is one of the AMBIT [[Training exercises]].
2. POD refers to [[POD - a web based outcome measurement system]] which can be access directly via this manual (open the link) or via your (or your client's) mobile phone.
!WHAT IS THIS FOR?
The purpose of this questionnaire is to help teams in defining their [[Post-training outcome goals]].
|There is also a [[Mini-PREACHY]] that is rather shorter and easier to use!|
!PREACHY (Practice, Relationships, Education, Attitudes, and Coherence in Helping Youth)
|This questionnaire is designed to help us learn about|
|You,Your work, What supports it, What hinders it.|
This will help us develop better support for workers.
!Acknowledgements:
Many of the questions that follow are drawn directly, or adapted from the ~CO-MORBIDITY AND ~CO-MORBID CLIENTS’ PROBLEMS PERCEPTIONS QUESTIONNAIRE produced by the Scottish Effective Interventions Unit in 2005 (Hazel Watson, William Maclaren, Fraser Shaw, Andrew Nolan; Glasgow Caledonian University and Greater Glasgow Primary Care NHS Trust).
In addition work by members of the AMBIT project at the Anna Freud Centre is acknowledged, especially Pippa Sweeney, Aine O’Callaghan and Yvette Boateng.
!1. Please tell us a bit about yourself
Indicate which of the following most closely fits your current level of training/education:
#No formal training, but life experience/time/willingness
#Some formal training/education, but not to degree level.
#Degree, but a non-clinical subject
#Currently in training for a professional Clinical or Social Care role (e.g. training to be an occupational therapist, social worker, nurse, clinical psychologist, medical doctor, etc.)
#Qualified as a health or social care professional (e.g. occupational therapist, social worker, nurse, clinical psychologist medical doctor, etc)
#Professional (clinical) qualification AND additional specialist therapeutic training.
!2. How long have you worked in face-to-face clinical situations, either in statutory or
in non-statutory services?
#Less than one year
#1 - 2 years
#3 - 5 years
#6 - 10 years
#Greater than 10 years
!Some statements about working with young people
|''Please say how much you agree or disagree with each one.''|
|1 = strongly AGREE 7 = strongly DISAGREE 0 = Don’t Know|
1. I feel I have a working knowledge of the common problems faced be complex 'hard to reach' youth.
2. I feel I know enough about the causes of complex (or "comorbid") problems in youth to carry out my role when working with these young people.
3. I feel I can advise complex 'hard to reach' youth appropriately about the range of common issues that come up.
4. I feel I know how to do effective therapeutic work over longer periods of time with complex hard to reach youth.
5. I feel I have a clear idea of my responsibilities in helping complex hard to reach youth.
6. I feel I know enough about the physical effects of drugs and alcohol use to carry out my role when working with my clients.
7. I feel I know enough about the psychological effects of drugs and alcohol use to carry out my role when working with my clients.
8. I am interested in the nature of the problems faced by complex hard to reach youth, and in the different ways workers can respond to them.
9. I want to work with complex hard to reach youth.
10. I feel that the best I can personally offer complex hard to reach youth is referral to somebody else.
11. I feel that there is little I can do to help complex hard to reach youth.
12. Pessimism is the most realistic attitude to take toward complex hard to reach youth.
13. I feel I am able to work just as well with complex hard to reach youth as with other client groups that I (may) work with.
14. All in all I am inclined to feel I am a failure with complex hard to reach youth.
15. In general, I have less respect for complex hard to reach youth than for most other patients/clients I work (or have worked) with.
16. At times I feel anxious working with complex hard to reach youth.
17 On the whole, I am satisfied with the way I work with complex hard to reach youth.
18. In general, it is rewarding to work with complex hard to reach youth.
19. In general, I feel I can understand complex hard to reach youth.
20. In general, I like complex hard to reach youth.
21 In general you can’t teach people how to work with complex hard to reach young people; they either have the skills or they don’t.
22. In general you need creativity and instinct in this work much more than technical knowledge and skills from books.
23. If I felt the need when working with my clients I could easily find someone with whom I could discuss any personal difficulties that I might encounter.
24. If I felt the need when working with my clients I could easily find someone who would help me clarify my professional responsibilities.
25. If I felt the need I could easily find someone who would be able to help me formulate a care plan for a client.
26. In a team doing this work, it is more important to have people who can offer a range of very different models of understanding and working, than it is to have a shared model.
27. In my own team, staff have very different ways of understanding human behaviour, and use very different ways of working.
28. In my own team we have a clearly agreed way to record any ‘learning points’ from discussions we have about 'how we do this work here', so that we can refer back to these and build on our experience.
29. Our team works according to instructions laid out in a treatment manual.
30. If you wish, please add any additional comments about why you do this work, or what makes it easier or more difficult, etc:
If (only if) your team uses a specific treatment manual please anser the next question:
31. In the past four working weeks I have actively looked at material from our treatment manual (either alone or in company) for a total of approximately:
Please tick the appropriate box: 0 minutes; 1 - 15 minutes; 15 – 60 minutes; > 60 minutes
32. If you wish, please add any additional comments about accessing your treatment manual here:
!If your team uses a treatment manual (even if you don’t use it yourself) please answer the following questions:
33. In my experience, using a treatment manual helps me work more effectively for my clients.
34. Treatment manuals don't change what practitioners actually do
35. I know exactly where I could find our treatment manual if I wanted to look something up right now.
36. I find treatment manuals are more of a burden than a support
37. Film clips showing techniques, or explaining ideas, are much less use than a page or two of text.
38. Treatment manuals never seem to fit the local culture or to cover the local problems we see at my place of work.
39. If I am honest I don’t like being told how to do things by distant “experts”
40. If you wish, please add any other comments about your experience of treatment manuals:
41. My team’s treatment manual is:
Paper-based -------------- Online ----------------------
If (only if) your treatment manual is an Online version:
42. The benefits of an online treatment manual outweigh the problems.
43. My poor technical (I.T.) skills mean I can't work the manual out at all.
44. Being able to search for key words is helpful
45. My access to computers at work is so limited that I can’t access the manual in working hours.
46. I like the video content
47. Although I have access to a computer, the I.T. systems at work make it very hard to access and use an online manual (as content is blocked, etc.)
48. Adding (editing) in our own team’s local expertise to the online manual makes it more relevant to our work.
49. If you wish, please add any other comments about your DIGITAL treatment manual
!Supervisory responsibilities:
50. Do you have a duty to offer formal supervision sessions to other staff at work? No/Yes
IF YES (i.e. if you DO give formal supervision people in your job) then please complete the questions below:
51. I always refer to our treatment manual in the supervision sessions I provide.
52. I always email/send copies of relevant material from the manual to my supervisees after case discussion.
53. Referring to treatment manuals in supervision sessions actually prevents good communication.
54. Our team’s treatment manual provides a supportive framework for my supervision.
!ABOUT A SPECIFIC CASE
The last questions are about a SPECIFIC CASE you have worked with.
Please recall a SPECIFIC RECENT CASE that you have worked with within the past two months. (NB the questions which follow do not ask anything that would breach confidentiality about your work). Please choose the case that you feel best illustrates the REALITY of your work and remember that your answers are confidential and will not be passed back to your managers! Answer each question by illustrating how much you agree or disagree with the statement (1 = Strongly AGREE 7 = Strongly DISAGREE) Please choose a SPECIFIC case that you feel best illustrates the reality of your work.
55. I deliberately and explicitly tried to develop a mentalized understanding of their difficulties
56. I deliberately and explicitly tried to maintain a mentalizing stance when with my client.
57. An understanding of mentalization was helpful in the work I did.
58. I completed a risk assessment, filed it, and kept it regularly updated.
59. In accordance with local protocols, I kept notes up to date and in good order, including a clear and regularly updated care plan.
60. There was evidence of conflict or disagreement between the different workers (or teams, or agencies) involved in the case, that threatened (or actually damaged) the outcomes of my work.
61. In situations of inter-professional or inter-agency conflict, I knew I could relieve my tension by criticising those people in the privacy of my own team.
62. I deliberately and explicitly identified (or tried to identify) resiliencies in my client's existing relationships.
63. I deliberately and explicitly planned work to support or strengthen these relationships.
64. I talked frequently, and in disciplined/structured ways, with other team members about the work I was doing.
65. If need be I know I could have consulted, or actually did consult, "live" with colleagues via phone whilst in the field.
66. I deliberately and explicitly planned and carried out work in MORE THAN ONE "domain" of functioning (e.g. physical health, individual psychological functioning, family, social-ecology, professional network, etc)
67. I deliberately and explicitly took responsibility for explaining or clarifying the roles and responsibilities of other professionals or agencies involved in the case.
68. I deliberately and explicitly tried to identify any elements in the network around my client that appeared contradictory or poorly integrated, using structured/disciplined methods to do this.
69. I deliberately and explicitly planned action to minimise or resolve any inter-professional or inter-agency disagreements or contradictions.
70. I completed one or more outcome measures at the appointed time(s)
71 Wherever necessary I took steps to check that the work I planned was faithful to the team's agreed protocols and what evidence supports as best practice.
YOU HAVE FINISHED! WE ARE EXTREMELY GRATEFUL TO YOU FOR THIS TIME
This is a residential and day service for young people with complex and multiple difficulties including mental health problems. The service provides intensive therapeutic work (including family work) and focuses on engagement and joint work between education professionals and mental health workers together with young people and their families.
!!Current Evaluation and Research
The team are currently writing an academic paper for publication about their experience of implementing AMBIT within the service.
There is basic information about this common problem in the section on [[Anxiety]].
!Common symptoms:
Not all of these will be present in all cases.
Breathlessness
Shaking
Heart racing ("tachycardia")
"Pins and Needles", typically in hands, or around lips (signs of over-breathing.)
Dizziness, "tunnel vision".
Overwhelming fear, often thoughts of impending death.
Feeling sick, urge to urinate.
!Other information:
There is also useful information on the specifics of [[PsychoEducation]] about this problem within the sections on two of the effective psychological treatments:
* [[Re-breathing]]
* [[Progressive Muscle Relaxation]]
In addition to these short term treatments:
* [[Cognitive Behavioural]] work is known to be effective, especially [[Graded Exposure]].
* Sometimes [[Pharmacological]] treatments may be recommended by the doctor to augment these psychological approaches.
* Finally, [[Family Work]] is helpful, with an emphasis on PsychoEducation, to recruit the family to support the rest of the treatment plan, as well as to reduce [[Expressed Emotion]].
This refers to a state of mind in which the sufferer has an inaccurate understanding of the nature of his or her relationship to others (either other people in general, or a specific relationship.)
Mostly, the content of paranoid thoughts and beliefs is negative:
>//"he hates me, he's out to get me..."//
Such beliefs and emotional responses may require careful [[Crisis Contingency Planning]] to ensure that you are [[Managing Risk]] appropriately.
It is important to remember that paranoia can also (less commonly) take the form of falsely 'positive' beliefs about a relationship, such as in paranoid infatuations where a person becomes convinced (against all evidence) that another person loves them. This paranoid condition is known as //"erotomania"// or "de Clerambeault's syndrome" and may be associated with stalking behaviours. It may be important to recognise this, as it is associated with a heightened risk of [[Violence]] (the paranoid person at first is convinced that the other person loves them, but becomes increasingly angry at their "refusal to accept this.")
All of these experiences are a very concrete version of [[Psychic equivalence]] - one of the ways that [[Mentalizing]] breaks down.
A [[Mentalizing]] approach to the paranoid client is helpful - this would lead you NOT to directly challenge or deny the beliefs in a way that could be seen as aggressive, belittling, or shaming - but instead to try gently to "make ones own thinking transparent", ie. to share ones own puzzlement:
>//"I can understand that you feel very strongly that the police are following you and may even have bugged your room - and that must be a HORRIBLE feeling// [here you are acknowledging the mental experience, and empathising with this] //and I suppose what I am struggling to understand is WHY the police would want to spend all that money and those resources in doing this - I can't get my head around that, I am afraid. It may be that I am just not understanding things from your perspective yet - can you help me with that?"//
At its most severe Paranoia is a symptom of [[Psychosis]] and should be taken seriously.
{{$:/images/fa5/solid/comments}} ''Purpose:'' this is an experiential exercise, to help us learn more about mentalizing.
''What to do''
Get into threes
In each group, allocate the roles of Person A, Person B and Person C
*''Person A'' - think of something that is causing you some genuine emotion at the moment. You will share this story with Person B (in no more than 3-4 mins).
*''Person B'' - actively listen to what Person A is saying. Your job is to help them to tell the story, NOT to problem-solve or give advice.
*''Person C'' - observe this conversation silently between A and B. Do not contribute.
When you have finished Part 1, move onto the next page for Part 2.
* ''Person B'' - your job is to tell Person C the story you have just heard from Person A. Focus on sharing your understanding of what you heard. It is not a memory test!
* ''Person C'' - listen to what Person B is telling you. Do not discuss the story with them or add in your own thoughts/advice/ideas!
* ''Person A'' - listen silently to this conversation between B and C. Do not speak during this part of the exercise, even though you might be tempted to do so, as it is your story.
When Person B has finished telling Person C, please do not discuss as a group; just come back to the group call.
!!Learning objectives for POD
The Passed-outwards Discussion (also known as the [[POD]]) is a teaching exercise to help trainees think about:
* the relationship between anxiety/stress and mentalizing
* the impact of this on our capacity to create a "coherent narrative" (a story of what's going on that makes sense)
* How the experience of //being accurately-enough-mentalized// helps us to //recover our own mentalizing// (this is nothing new: it is of course the main rationale for all supervision!)
** POD is a way to illustrate our [[Ripples in a Pond]] analogy
** It emphasises the importance of //recognising who is where in relation to the anxiety// in a help-seeking worker's story, with a help-offering colleague.
* Later in the training we will introduce [[Thinking Together]] which adapts some of the learning from this exercise.
!!Short Intro to POD by Liz Cracknell:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/0hea7zaIZdw" frameborder="0" allowfullscreen></iframe></html>
!!Where to use the POD
* ''"Clinical" applications:'' Although this is mainly a teaching exercise, many teams //also// use the POD as a technique in team meetings to help to facilitate [[Mentalization]] in a [[Key Worker]] if they are overwhelmed or stuck.
* It can be performed in a number of different settings, any of which would represent the gathering of a [[Reflective Quorum]]:
#As one of our [[Training exercises]] to develop our understanding of [[Mentalization]] and (via the [[Ripples in a Pond]] analogy) and support the [[core feature|Core Features of AMBIT]] of developing the [[Key worker well-connected to wider team]].
#Face to face in a team meeting
#Via a formal telephone conference call
#Using a mobile phone switched to "loudspeaker" to allow 'in-the-room' conferencing between more than two people.
In example 3, the [[Key Worker]] might be standing outside a young person's home, having explained //"What you have just told me seems very important, and there is obviously a LOT going on. I am not sure if I have got it all, but I'd like to take about 15 minutes break now if that is OK so that I can check in with my team-mates and get some help from them in thinking about all this. Does that sound OK? It may be that they will want to offer a message for both of us to think about. I'll go and phone them from the garden if that is OK..."//
!!How to facilitate the POD exercise
This exercise is designed to support or explain through experience the particular [[Rituals and Disciplines]] that are laid out in [[Thinking Together]]. It may conclude with the [[Key Worker]] agreeing to deliver [[Take Home Messages]] from other members of the team.
The ''basic technique'' is as follows:
!!!1. Set three "roles"
* person A
* person B
* person C
!!!2. person A selects their story
* best to use a //true// story if this is a training exercise
* best to be a story that //stirs emotions and is genuinely causing some upset// for person A (a young person they are very worried about, a colleague they are in conflict with, another team that is proving very difficult to work with... some area of work where they feel things are NOT going well. //"Don't choose a really tough case that - in truth - you are confident that no-one else could do better with, but which just shows how tough your work is!"//)
* agree //boundaries of confidentiality and respect// for material shared in the exercise.
!!!3. person A tells their story to person B.
* person B can ask occasional questions to check details and understanding, using ordinary 'listening skills'.
* person C must remain silent, but can listen.
!!!4. person B passes the story on to person C
* person B must retell the story to person C; they are not pretending to be person A, but they are trying to tell the story accurately from person A's perspective.
* they do not need to use exactly the same language, and can add their own observations if they [[mark|Marked mirroring]] these as such.
* person C can ask questions for clarification and as person B's account comes to an end, person C and person B can discuss the story briefly.
* person A must remain SILENT during this whole process (this can be hard!)
* person A is encouraged to be mindful of emotions, and thoughts as they have this experience of their story being re-told.
** what is my emotional reaction to hearing my story retold?
** were facts missed (in my account, or in their retelling of it?)
** do I become more aware of things in hearing the story?
** am I more or less able to think about this issue?
** are there any new insights?
!!How to set up the exercise (Video)
<html><iframe width="640" height="360" src="//www.youtube.com/embed/ISb-FT7RoL0" frameborder="0" allowfullscreen></iframe></html>
!!What is this POD exercise about?
We are deliberately setting up a rather artificial process whereby a [[Key Worker]], having passed "hot" or disturbing information to one colleague, is then able to "sit back" rather artificially, and witness that colleague taking up their role (or burden) to passing on the same information to a third colleague (Person C), and to witness the discussion that they have (these might be in keeping with the boundaries of [[Thinking Together]], but not necessarily.)
!!Why do this POD exercise?
By passing the information (and to a large extent the anxiety and affect) ''//outwards//'' (cf. [[Ripples in a Pond]]) the [[Key Worker]] can temporarily create a [[marked|Marked mirroring]] "space" (the "[[POD]]") where he/she is able to make an imaginative leap from //being in the midst of the chaos// (and unable to activate his or her Mentalization), to being in an observing/reflecting position (we could call this a temporary "MetaTeam"), where stress is a bit less intense, and mentalizing is more possible.
Record details of the young person's past psychiatric history. Note that past history of problems is fairly predictive of future problems.
*What problems occurred in the past? //Record diagnoses if these are remembered, if not the description of the symptoms.//
*Who did the child see for help? //Record the name of the clinician and the clinic address if possible.//
*What treatments were offered? //Talking therapy? Medication? Family therapy?...//
*Were they helpful?
Record any history of past MEDICAL problems tagged with this heading: use the [[Make or View Client Notes]] to do this.
(Record ''Psychiatric'' problems in the past under the separate heading PastPsychHistory).
!In particular ask about:
*EVER BEEN HOSPITALISED?
**What for?
**Still a problem?
*ALLERGIES?
**Especially severe reactions to things like penicillin.
*MEDICATIONS? - enter any of these under [[PrescribedMedication]] at [[Make or View Client Notes]]
**What are they taking?
**What for?
**Who is prescribing this?
The Law of the land applies to both Patient and [[Key Worker]].
Professional rules and regulations (laid down by professional bodies for nurses, therapists, doctors, etc), regarding ethics, probity, and professional conduct apply to the therapist/keyworker.
It is in the nature of working with adolescents in crisis that boundaries are often challenged and tested by our patients. In outreach situations it is necessary to be //additionally clear and explicit// about boundaries, and to maintain appropriate vigilance (see [[Work on the Self]]) so that any small infringements of boundaries are noticed and discussed in supervision (see SupervisoryStructures) at the earliest opportunity. Evidence from inquiries often demonstrates that significant untoward incidents involving boundary infringements very often occur //''after a succession of much smaller (and, individually, almost unremarkable) infringements''//.
!Boundaries as "Bearings"
See [[KeepingYourBearings]] for the ''T.A.R.T.S.'' boundaries that can usefully be applied at any point in time to whatever we are engaged in, so that they help to orientate the worker.
!Boundaries of Touch
An obvious boundary that needs to be rehearsed and repeatedly clarified in the [[key worker]]'s mind and in the team's protocols (notwithstanding the professional boundaries referred to above, which remain valid at all times) is that of //touch// between patient and therapist.
Ideally, the [[Key worker]] will work with a ''//mitigated// 'no-touch''' policy in mind.
It is recognised that there are many times when ''not'' touching a young person is either impossible or entirely inappropriate; for instance if the worker is checking a patient's blood pressure, or playing a game of football, some incidental physical contact would be quite ordinary. Likewise, a patient who is extremely distressed may actively seek out physical comfort, by putting a head on the worker's shoulder, or a young person who is excited and happy to see a worker to whom they feel securely attached may offer, and expect, a physical welcoming hug, pat, etc. //Recoiling// in such a situation could be interpreted as highly rejecting and be detrimental to therapeutic [[Engagement]], so as a [[Key worker]] you have to maintain a flexible stance, all the while KeepingYourBearings.
We work from a premise that ''distress is ideally managed through equipping the young person with the emotional and mental equipment to cope and contain themselves, rather than via physical methods of containment.'' So, resorting to physical contact as a primary means of dealing with distress may be the most immediately effective and essentially //human// response - if it is, say, the asking for and receiving of an empathising hug. However, there is a risk that remaining //only// in the realm of the physical as a means of resolving distress could be an example of [[Teleological thinking]], and this would not be helpful.
We also recognise that young people who have histories of physical or sexual abuse may either;
*Communicate their needs or wishes inaccurately around physical contact, or
*Interpret physical contact in ways that are very different from the way these were originally intended to be received.
!!Hence, if touch //does// occur it must //only// occur:
#With the //explicit consent/at the request// of the young person.
#For the //miminimum appropriate duration// of time.
#In the way that is //least liable to be misinterpreted// (for instance light touch to non-erogenous zones such as the forearms, or the giving of a brief hug in a 'side to side' position, rather than face-to-face, etc)
#In a way that is //obviously and exclusively for the benefit of the young person, rather than addressing any of the needs or wishes of the adult.//
!!Team SupervisoryStructures and touch.
The [[Key worker]] would be expected to raise incidents where 'more than incidental' physical contact had occurred with a young person for discussion in supervison, as a part of KeepingYourBearings. Part of the the team culture of [[Mentalization]] should be to allow and encourage an open curious exploration of these sometimes anxiety-provoking experiences between team members.
A [[Key Worker]] who displays avoidance of, or refuses to try to mentalize these experiences may need additional support and reassurance via SupervisoryStructures, but [[AMBIT]]'s focus on good Clinical Governance would be clear that this is not an acceptable position to maintain. Our capacity to share experiences amongst team members, and to mentalize openly between each other, is a major guarantor of safety for all individuals concerned.
This is designed to:
1. Slow down the interactions between family members, so that there is space for Mentalizing...
2. Question or express a specific interest in exactly //"what person x is feeling/thinking as this interaction unfolds"//.
This //may// involve using images of DVD or video as a way of providing some emotional distance between family members and the emotional drama that is unfolding between them. By conjuring the image of their interactions being on film, the therapist offers opportunities for imagining a 'meta-position'.
If appropriate this activity can even be "dramatised", with the therapist calling "Freeze frame!" and gesturing with his or her hand to freeze the activity.
>//“I notice x and y when you talk – can we just pause the action here for a brief moment. Let’s pretend for a minute that we had video-recorded this exchange and that be are going to do a replay of a previous segment, to see how things developed and built up. How do you think it all started?”//
This is an example of pause and review, that moves into the process of trying to [[Notice and Name]] common breaks in mentalizing:
<html><object width="640" height="360"><param name="movie" value="//www.youtube.com/v/JevynoYUAc8?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/JevynoYUAc8?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Here is another example - the pause and rewind technique is used just at the point at which there is a high risk that non-mentalizing will escalate (as it clearly has many times before):
<html><iframe width="560" height="315" src="//www.youtube.com/embed/biok3m3Ey80?rel=0" frameborder="0" allowfullscreen></iframe></html>
See [[Simmering Down]] for more dramatic examples.
<a class="tc-float-right">[img width="150" [peter manual.jpg]]</a>
!!!AMBIT Consultant
Peter Fuggle is a clinical psychologist and currently Clinical Director of the [[Anna Freud National Centre for Children and Families]]. As one of the original [[Authors]] of AMBIT, Peter acts as a consultant to the [[AMBIT programme]] and delivers training, consultation and supervision widely. He previously worked for over 30 years in the UK National Health Service integrating mental health services for children and young people into schools and social care. He has a long standing interest in working on projects for young people and families who do not seek help for their mental health needs and the AMBIT collaboration arose directly out of this interest.
<div style="clear:both;line-height:0px;"></div>
[[Working in multiple domains]] (one of the [[Core Features of AMBIT]]) means that occasionally it will be important to consider the [[Biology]] of an individual, and medication may play an important part in helping to settle symptoms to the extent that [[Mentalization]] becomes more possible (consider the problems of severe [[Anxiety]], [[Depression]], [[ADHD]] or [[Psychosis]], for instance - all of which have strong evidence in support of a role for medication).
''Medication is always the responsibility of the prescribing doctor'', but in cases where medication has a role to play the [[Key Worker]] can have a very significant effect on the effectiveness of this intervention - by acting to maximise the possibility that the right dose will arrive in the right place at the right time.
This means that there is a strong element of SystemsTheory implicit in pharmacological interventions.
[further info to follow here]
!!''There are 4 phases of work:''
!!!1. [[The Initial Phase|INITIAL PHASE]]
!!!2. [[The Intervention Phase|INTERVENTION PHASE]]
!!!3. [[The Maintenance Phase|MAINTENANCE PHASE]]
!!!4. [[The Ending Phase|ENDING PHASE]]
!!A map not a timed program
The point of the phases of AMBIT is for the worker (and the client, ideally) to have a shared understanding about [[Where are we in the therapeutic journey?]], so that [[Active Planning]] can take place //from where you are//, not from where you "ought" to be.
Any timings for these phases are made with the proviso that clinical work rarely, if ever, works to a predictable timetable, and whilst the presence of a clear sense of direction and some measurable 'waymarks' is implicit and valued throughout the whole intervention, it is still essentially a 'non sequential process'. A strength of AMBIT with hard-to-reach youth is its //flexibility// and 'light-footedness' - responding contingently to the needs of the young person and their family.
!!''A Manualization task''
The phases of intervention are mapped onto a suggested intervention timeline, ''which local teams should make an effort to define with their own commissioners and edit locally.''
----
See also:
*[[AMBIT: an overview]]
*[[Core Features of AMBIT]]
[[Screening for biological illness]] includes warning signs to look out for, some key "alarm bells" for physical illnesses/comorbidities/neurological differential diagnoses... but this manual explicitly does not intend to turn the practitioner into a doctor.
In addition there are notes on [[Safety and sex for youth]] that are frequent and important concerns, for both young people and carers.
There are therefore clear protocols for managing concern about physical illness.
[[AMBIT]] relies on a reflective, mentalizing approach to the complex difficulties faced by adolescents in psychiatric crisis and their families, and ''implicit in this is the assumption that this involves coming to "know what we do not know"'' (dangerous therapeutic omnipotence is the alternative.)
If there are concerns about a physical symptom a //particular// reflective quorum is required that must include medical expertise - "if in doubt, consult!"
[[How to speak to a DOCTOR]] covers areas such as
#"What information will s/he ask me for?"
#Making basic physical observations in preparation for a medical consultation (pulse, temp, resps, BP, assessing level of consciousness, etc...)
Finally there is information on common side effects of medication especially the acute or severe ones such as acute dystonia, Neuroleptic malignant syndrome, neutropenia - infections, liver failure, etc...
The principles and practice of AMBIT are both simple and yet easily lost. Teams using AMBIT need to plan on-going training as part of sustaining practice (see [[SUSTAIN best practice]]). Sustaining good practice is usually not so much about learning new methods of practice but more about practicing and reflecting on core methods and problems.
!!How often?
We suggest that a team using the AMBIT approach should aim to have a refresher training event at least every three months. This can be for one to two hours. This is what we would recommend as a minimum amount of AutoDidact training. Such training events can be facilitated by the AMBIT leads, using material from the manual.
!!Audit your training needs
Use the [[APrAT]] audit tool to develop ideas about where there might be gaps in your team's practice and understandings. See [[APrAT exercise in, or across, teams]]
!!Resources
In this manual we provide multiple examples of training activities that a team can choose to do:
* See [[Training exercises]] for ways to sort through what is here
* See [[Suggested Team Training Sessions]] for some "pre-sorted" suggestions
* ''Do It Yourself:'' AMBIT leads and team members are encouraged to devise their own training event according to their own preferences and the priorities for the team.
* See <<tag [[Local AMBIT training session plans]]>> (If you are using this manual as a //member//, and it is in [[Edit mode]], then you will see "create a new page" as the bottom item on the drop down menu!)
!!Top Tips
In designing your own training activity, we suggest that material in the manual may be helpful in a number of ways. See an [[EXAMPLE of a local training session]] which suggests an effective structure for a session.
#Download training slides from the basic training and use some of them as basis for discussion and reflection about current practice in the team (see [[Training slides|Downloadable Resources from Training]]).
#Find some video material to begin discussion or practice around an issue. Video material can be found by putting 'video' into the search function and this will list a range of video material in the manual (see [[Videos]] and look in the references at the top of the page to see all the pages linked to this page).
#There are a range of exercises in the manual that can be used to encourage practice (see our [[Training exercises]]).
#Try taking a specific case you thin you have managed WELL, and apply the [[APrAT]] audit tool as a way of reflecting on practice. Now apply the same tool to a case that you felt was UNSUCCESSFUL.
{{$:/images/fa5/solid/tasks}} We're interested to find out how you approach planning in your work with clients
''Complete this survey and then return to the group video call.''
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/ResponsePage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JURjVIUEVSWExBRjlKRE1YRFlHRkI0VkJYUCQlQCN0PWcu&embed=true" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
{{$:/images/fa5/solid/tasks}}'' Here are the results of the survey. Hover over the the bars to see exact percentages''
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/AnalysisPage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JURjVIUEVSWExBRjlKRE1YRFlHRkI0VkJYUCQlQCN0PWcu&AnalyzerToken=vxWdgxo9rRWKAJT4DN1fnxCaEQkus9Ih" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
Positioning theory is a part of Discursive Psychology (see references below) and has been adopted by systemic practitioners as a way of making sense of people's behaviour in complex systems. It has the potential to contribute to a theoretical understanding of how workers in different agencies become positioned with respect to each other around the needs of their shared client. It is included in the manual as part of the theoretical basis for one of the four key practices of AMBIT, namely [[Addressing Dis-integration]]
A basic introduction to Positioning theory can be found in the following eight minute talk by Professor Brian Morgan.
<html><iframe width="560" height="315" src="https://youtube.com/embed/LOS95tynLDk" frameborder="0" allowfullscreen></iframe></html>
Positioning theory proposes that people are positioned with respect to their rights and duties out of first order self constructions of identity/role (e.g. I am a social worker) and second order constructions (or narratives) of identity/role (e.g. social workers are mainly concerned with child protection). The theory emphasises that the interaction of these constructions is fluid and continuous and is mediated through speech acts i.e. language.
The value for AMBIT is that the theory proposes that workers in a network contribute to the narrative about each other which 'positions' individual workers and impacts on their capacity to fulfill their rights and duties. Such positioning is also done by clients.
From a Positioning Theory perspective, the task for an AMBIT worker is to explore and perhaps challenge polarised constructions of workers within a network (e.g. he's good but she's useless) with a view to enabling workers within a network to adopt authentic positions with respect to their rights and duties.
Two references may be useful for those interested in understanding this theoretical model a little more.
Recent Advances in Positioning Theory (2009) Harre, Moghaddam, Cairnie, Rothbart and Sabat. Theory and Psychology; Vol 19(1), 5-31.
Pond life that ‘know their place’: exploring teaching and learning support assistants’ experiences through positioning theory
(2011) Watson, Bayliss, Pratchett. International Journal of Qualitative Studies in Education,Vol. 26, No. 1, 100–117.
The latter paper explores the construction of teaching assistants in a school setting using positioning theory.
Positioning theory does not have an extensive range of intervention techniques. Perhaps most useful is that invites curiosity as to how people have become positioned in the way that they have. This may be a useful question to ask in considering network interactions and difficulties.
The PANSS is a standardized, clinical interview that rates the presence and severity of positive and negative symptoms, as well as general psychopathology for people with schizophrenia within the past week.
Reference:
Kay, S. R., Flszbein, A., & Opfer, L. A. (1987). The positive and negative
syndrome scale (PANSS) for schizophrenia. Schizophrenia //Bulletin, 13//(2),
261–276.
See [[Specific diagnoses and their corresponding mentalizing failures]] for a description of how exposure to trauma (that is, a dramatic, uninvited, apparently life-threatening or life-altering experience) can affect our capacity to [[mentalize|Mentalization]]
Post Traumatic Stress Disorder (PTSD) has a number of key features, and it is important to recognise it, as there are some fairly well evidenced ways of treating this condition. As a formal psychiatric diagnosis it may be necessary to clarify the diagnosis through an assessment by a qualified mental health professional, and complex PTSD may require specialist treatment. In those circumstances, the goal of an AMBIT team might be to alleviate symptoms, or to provide the first 'port of call' on a journey that would lead ultimately to a young person engaging with specialist treatment.
!Key features
Key features that might suggest PTSD are:
*''Flashbacks'' - these are very vivid memories of part of a trauma, that are uninvited, intrusive and occur quite suddenly. At their most severe the person afflicted may have an experience that is so severe they report feeling as though they are "back there, having it all happen again" (this is a form of [[Psychic equivalence]])
*''Hyper-vigilance'' - this refers to a heightened sense of threat and is often accompanied by an exaggerated "startle" reflex (the person may well be described as very //"jumpy"//.) When they are calmer (ie when [[mentalizing|Mentalization]] can come back on stream) the individual will usually say that they //know// they are over-reacting, but can't stop themselves - this is a subtle but important difference from the kind of [[Paranoid]] symptoms that may be associated with [[Psychosis]].
*''Avoidance'' - this is the most insidious and in many ways the most damaging of the PTSD symptoms; over time the suffer starts to avoid situations that they assume might trigger further flashbacks. Instead of providing the relief that they intend, however, too often this response actually amplifies the fears; the sufferer never gets to test out the belief (a kind of [[Pretend mode]]) so the belief //"If I go down that street it will all happen again"// becomes increasingly firmly held (this can be another form of [[Psychic equivalence]].) Severe sufferers find that their lives can become dramatically constricted so that they are housebound, for instance.
!What to do
There are well-researched [[NICE Guidelines for PTSD]]
[[Cognitive Behavioural]] approaches are the most strongly supported by the research evidence. [[Trauma-focussed CBT]] is recommended as the first approach for children by NICE.
In some cases specialists might add [[Pharmacological]] interventions (i.e. medication) to augment the psychological approach.
Although [[Family Work]] //alone// has not been shown to be effective, there is good reason to focus some energy on ensuring that family members understand the nature of the problem, and the plan for treatment, as family members may well be able to reinforce some of the key therapy tasks and 'homework' ([[Training Challenge]]s.)
!!What and Why?
The Post-training outcome goals form the backbone of the [[Implementation Plan]] - that aims to use what we know from [[Implementation Science]] to improve the odds of sustainable, effective change resulting from the investment that a team makes in [[AMBIT training|Information About AMBIT Training]].
!!Stage 1 - Self-audit
There is an "Application Form" which forms a crucial stage in the [[Pre-training team audit]].
This should be completed by teams before acceptance on stage 2 of the [[AMBIT training|Information About AMBIT Training]] which is the face-to-face training events. The form is designed to help direct teams towards a [[mentalized|Mentalization]] form of thinking about the following:
>//"Why do WE need THEIR training at all? ...and how would we know if it had helped US in the work that we are already doing?"//
* AMBIT explicitly acknowledges that in team trainings //it is not a “given” that all team members are equally invested in the training//.
** Some workers may feel less than positive about the idea of a team-based training.
** Although our post-training feedback from [[AMBIT training|Information About AMBIT Training]]s has been overwhelmingly positive, it has not been exclusively so, and we describe this at [[Individual differences and AMBIT training]]
* It is important, however, for teams to develop some shared notions of:
** The existing competencies and expertise within the team
** (Notwithstanding what the team is already doing well) a number of ''observable differences //post-training// that would indicate successful outcomes'' from this training.
* The AMBIT project does not presume to know what these outcome goals are (see also the [[Implementation Plan]]). Common examples might be:
** Reduced examples of young people "bouncing" from service to service
** Improved engagement rates for young people who have to date been seen as "opting out" of treatment
** Reduced burnout in staff (reduced sickness leave, staff turnover, etc)
** Shorter team meetings
** Team meetings and supervision sessions that leave staff feeling more supported
** etc
* The more you can identify [[SMART goals]] the better.
From the AMBIT conference 2014:
<html><iframe width="560" height="315" src="//www.youtube.com/embed/ODEZxU6x0_g?list=PLaZguIPxZjqaudOxA29jJE-ds2eGT3HoV" frameborder="0" allowfullscreen></iframe></html>
In the [[Core Features of AMBIT]] you will find eight markers of the ''Stance'', which feed into five core aspects of ''Practice'' that define AMBIT.
There are a series of <<tag [[AMBIT Stance Exercises]]>> that local teams can use adapt to practice this, as part of the [[AMBIT training|Information About AMBIT Training]].
The approach provides a wide range of home- and community-based [[Specific interventions]], that are [[Multimodal]], [[Integrative]], and are delivered at a [[Level of intensity]] aimed at minimising or avoiding hospitalisation of young people in significant psychiatric crises. Interventions are divided into [[Phases of AMBIT work]] which are mapped on a suggested [[Intervention timeline]] but the [[Key Worker]] is able to work flexibly deciding WhichInterventionWhen in consultation with the team's strong SupervisoryStructures.
Any practitioner working in the field will also require access to [[Local Protocols]], which can (and should) be edited into this manual.
There are a number of [[Boundaries]] discussed in this manual, including [[AMBIT Practice Boundaries]] that are important for any worker to understand.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Practices: LEARNING at work'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Practices: Working with your CLIENT'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Practices: Working with your NETWORKS'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Practices: Working with your TEAM'>>
</div>
This is the state in which change is 'not on the agenda' - there is NO contemplation about change at this stage. In Cognitive terms, (see [[Cognitive approaches to SUD-Rx]]) the "sums do not add up" in favour of change (see [[Weighing Pros and Cons]]); however, this may simply be because that there has been no opportunity or motivation to examine these "sums" to date.
!A Mentalizing take on this:
The 'pre-contemplation' stage is really the same as saying that [[Pre-mentalistic stances]] are active.
The person who is not contemplating (or [[Mentalizing]]) their behaviours is generally in a [[Pretend mode]] (//"It's fine, there isn't any problem, in fact this way of doing things is working just fine for me..."//) or a [[Teleological thinking]] (//"Whoops, lets do it again..."//). Often there may be a kind of hopelessness (//"There's no point in trying anything else, this is just the way it is..."//) that could be described as [[Psychic equivalence]].
!...and the point of this is...
Understanding that a client is in the Pre-contemplative position is vital if the [[Key Worker]] is to keep to one of the [[SUD-Rx principles]] that states you should [[Adapt your Discourse]] to fit the stage, or state of mind, that is being addressed (this is a profoundly [[Mentalizing]] stance, too, of course.)
This is what happens when [[Mentalization]] fails - usually in response to overwhelming affect (when feeling states overwhelm - referred to as [[Affect storms]]) or the activation of the [[Attachment]] system.
It is important to recognise that these states of mind are not in themselves //pathological// - they are just relatively 'primitive' methods of thinking. In their right place, they may be "just what is required". For instance:
* Much of a child's learning about the world is carried out through [[Pretend mode]], i.e in make-believe;
* On being threatened by a life-or-death situation, some [[Psychic equivalence]] may improve the likelihood of my taking the threat seriously and responding appropriately, and may thereby improve my survival chances!
* ditto for [[Teleological thinking]] - ''there is little survival advantage in sitting and explicitly mentalizing the tiger as he prowls towards me, salivating as he comes...''
Another way of putting this is to say that we should avoid ''"sentimentalising mentalizing"''.
{{Non MZ.JPG}}
!!The 3 common pre-mentalistic stances are:
[[Psychic equivalence]] - 'inside out thinking'
[[Pretend mode]] - 'elephant in the room thinking'
[[Teleological thinking]] - 'quick-fix thinking'
!! Purpose
Before diving into learning together as a team and manualizing there are some preconditions that can support this task to happen effectively. The diagram below lays out the preconditions or foundations that can assist the team learning (and manualizing) process.
At the bottom is a ''team learning exercise'' that might help build dialogue around these ideas.
<center>[img width= 500 [Picture1.png]]</center>
!!Three Preconditions
1. [[Epistemic Trust]] – has epistemic trust been established in the team? Are people open to learning from each other? Are people in a mentalizing space? Are people sufficiently able to be “not knowing”; curious, flexible and open about their practice, in terms of their strengths and their difficulties? Where teams do not feel safe enough to openly express and share uncertainties, dilemmas or acknowledge limitations with each other, the process of manualizing might be more challenging.
2. [[Active Planning]] – is the team in a place to proceed in a purposeful manner, where reflection and action is balanced? Does it have some ideas or shared intentions about where it wants to get to?
Usefully recording team learning requires an ability to tune into the team’s collective mind – are there things that we do well as a team or want to develop? Why do we do these well or why do we want to change these things. Getting enough of a sense of this before embarking on an area to work on will help the task to feel more meaningful to all involved. Equally, spending too long reflecting on strengths/needs or talking about why it would be helpful without getting into the action of selecting something to manualize is also not a helpful balance.
3. ''[[Manualizing |Manualization]]''– The team needs a way of recording what they are learning and sharing this learning as it evolves. The wiki manual is the AMBIT tool that we use for this.
When enough shared agreement has been established within the group around the value of learning together and a plan has been made about what it would be useful to manualize, a team is ready to sit down and begin.
!!Training Exercise: What gets in the way (or facilitates) this?
Invite your team to reflect on which ones apply, and might deserve strengthening, or need addressing?
Place a poster of this picture on the wall in an office and invite respectful graffiti from team members...
[img[TeamLearning.png]]
!!Purpose
To define presenting problems, describe how to get more details about presenting problems.
!!What are they?
The Presenting Problems are the ones the young person, or members of their [[Family Informal Network Members]] or ProfessionalNetworkMembers bring to you for help.
When you use the [[AIM]] assessment you may find that there are particular [[Key Problems]], which one would expect to be amongst the main problems presented.
!!Details to ask about
*How long the problem has been around?
*How did it start (did it arise suddenly, or "creep up on us"?)
>Ask the young person //"Can you rewind the DVD of your life to a point before the problem was there? If we could watch at that time what would we see? How would we we see the problem starting to show itself?"//
*Is it getting worse, or getting better?
*Consider WHOSE problem is this (sometimes a problem for one person is experienced as a pleasure for another - such as teenage substance misuse)
*Do other [[Family Informal Network Members]] or ProfessionalNetworkMembers share the same understanding about this problem?
**If not, what are the other understandings?
**Use the [[Dis-integration grid]] to explore this if required.
*Ask whether this problem would count as one of the [[Key Problems]] for this young person/family.
This is one of three [[Pre-mentalistic stances]] that we can identify when peoples' mentalizing is not active.
*In Pretend mode there are indications that //subjectivity// (my sense of what it is to be me) //is completely separated from physical reality.//
*There is a quality of "wordiness" (lots of talk, without a real connection to the realities of the here-and-now world).
*This state of mind tends to be characterised by pervasive //self-deception//, and the //rejection of alternative realities that threaten this pretend mode.//
In the case of the ''substance-user'' this would apply to the long-winded justifications for //"...why my habit is not really a problem..."// (in spite of the fact that it has got me a criminal record and lost me my home, etc.)
Monty Python make clear the problems of pretend mode functioning:
<html><object width="480" height="360"><param name="movie" value="https://youtube.com/v/79vdlEcWxvM?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/79vdlEcWxvM?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!How to respond to Pretend Mode
In such situations, carefully-deployed [[Challenging techniques]] may be required.
!When is Pretend mode OK?
Of course there are some situations in which Pretend mode is an entirely appropriate way of functioning - much of children's development of social-interactive skills and enculturation is achieved through make-believe games that are - as the name suggests - carried out in pretend mode!
! ''What is Problem solving?''
Problem solving is something that everybody does already. Implicit problem solving routinely involves thinking about something that you need to sort out and deciding on what you are going to do about it. e.g. 'I feel a bit guilty about not having contacted my Mum for a while, I'll give her a call this evening'. Often implicit problem solving moves very quickly from problem to some sort of action without much in between. Commonly the decided action is then put off and/or avoided so that a few days later the problem reappears and the person again feels guilty about not contacting his mother and further resolutions of action are made. This implicit problem solving can end up stengthening the very problem that it is trying to address.
* There is a difference between ''implicit'' and more deliberate ''explicit'' problem solving methods. Explicit problem solving is part of [[Cognitive Behavioural]] methods in that it is a method which links together thoughts and actions.
* Implicit problem solving works fine for many situations but for more tricky issues it may be ineffective for several reasons
** ''The wrong issue is being focussed on.'' In this case, the problem is being experienced as about guilt towards his mother whereas the main difficulty may be something different i.e. finding it difficult to talk to his mother etc.
** ''Too rapid focus on action'' before considering a range of options.
** ''Planned actions are located at some vague point in the future.''
! ''Moving from implicit to explicit problem solving- general tips''
** ''Generally try to slow the process down''...
*** avoid getting into discussion of actions for as long as you can get away with!
** ''Try to elaborate the problem as fully as you can''
*** e.g. (from example above). 'what's your Mum like?' 'Does she like people calling her?'
** ''Develop some options''
*** At first, try to develop as many options as possible. Opportunities for humour to lighten mood may arise. May suggest some useful and some more wacky ideas. Reduce options to a few possibles.
** ''Try to evaluate strengths and weaknesses of different options'' - see [[Weighing Pros and Cons]]
*** Some options will be harder, more effort and some will be more likely to work. Get client to determine criteria as to how to evaluate what is likely to work.
** '' Dont choose option for client!''
*** Easily done as often best option is very obvious to you but not to client. Avoid persuading.
** '' Encourage options that may inolve one small immediate action''
*** Texting a message may often be a first step. In the example above, just texting the client's Mum to say that he is thinking of her etc may be something to shift pattern of avoidance.
!!A 'checklist' problem-solving model:
This is a checklist that may be usefully adapted to fit the needs of a situation: [[Problem-solving checklist]]
!Problem solving: an example
Young person (Sam) angry with friend for coming on to her boyfriend. Describes how she plans to 'batter' her friend for this. This will make Sam feel better. This is implicit problem solving. Sam wants to find relief from her anger. Hitting and hurting her friend will achieve this.
* Problem solving approach would start by ''being really interested in Sam's belief'' that this will make her feel better. How does this work? What would you feel like afterwards etc?
* Opening up other options.
Are there any other ways of feeling better in this way? What other things bring relief? However, 'battering' works best okay? Are there any downsides to 'battering'? Would these downsides apply to other options? Are there other options which relieve anger as well? Would thye have similar risks and consequences?
Obviously this example rasises some ethical dilemmas as the therapist would not want to convey encouragement for violence to others but it si provided here to indicate that problem solving can be applied to wider issues than may be generally recognised.
The family is encouraged to describe a sequence of events that leads to conflict or symptomatic behaviours. The KW then searches for the steps or events that precede what has been described to find the "first" step in the sequence. The family is asked to identify at what point evasive action could have been taken and is requested to consider how they could re-act in similar future situations.
!The following stepped model can be used:
[_] Agree on the exact nature of the problem sequence
[_] Specify desired outcome (goals)
[_] List past (failed) solutions
[_] Track pre-problem sequence of events
[_] Identify early preventive action / re-solution
[_] Brainstorm about other possible solutions
[_] Highlight advantages and disadvantages of each proposed solution ([[Weighing Pros and Cons]])
[_] Choose one specific solution
[_] Formulate a detailed plan to implement this solution
[_] Speculate about the consequences of implementing a specific plan and discussing ''how to review the outcome''.
!!Purpose
Things don't always go well in teams ... [[Dis-integrativeProcesses]] are always present to some extent, and [[Dis-integrative processes in a Multi Disciplinary Team]] are common. Knowing what to look for, and accepting the inevitability of this, especially in a field of work so prone to creating anxiety or distress in workers, is one way to reduce their impact. Having some tools to avoid problems or address them when they do arise is helpful. This page provide you with a list a pages tagged with Problems in Teams.
!!Sub Pages
Below are the pages that are tagged with 'Problems in teams':
<<list-links "[tag[Problems in teams]]">>
!First Principles
Remember the [[CultureOfHospitality]] that a team is responsible for generating and upholding.
!Adapt your local version!
Different teams will receive their referrals or meet new clients via different routes, and AMBIT does not seek to define these pathways. This is therefore a page that a LOCAL team will want to Edit and adjust to fit their circumstances.
!Initial "triage"
Team members taking referrals (telephone/letter/fax/e-mail) will need to make a preliminary assessment of whether this referral requires an EmergencyResponse.
*Is immediate liaison with Police and Social Services required?
*Use the team's SupervisoryStructures where required - in particular consider are you [[quorate|Reflective Quorum]] to make decisions about these matters?
*According to the staffing levels it may or may not be possible to provide this service, especially on a 24 hour basis.
*In such cases it will be necessary to have clear [[Local Protocols]] for the joint management of such crises with existing Crisis/Home Treatment Services.
Once decisions have been made, see [[Setting up a first meeting]].
!!What is the significance?
The Professional Network is one of the key [[Domains]] to work across. [[Dis-integratedInterventions]] may easily result from differences between members of the professional Network in:
*CONCEPTUAL understandings - //WHAT IS THE PROBLEM?//
*PRAGMATIC understandings - //WHAT IS TO BE DONE?//
*RESPONSIBILITY understandings - //WHO SHOULD DO IT?//
!!Keep a record of your client's Professional Network
This is critical if you are to be effective in [[Addressing Dis-integration]].
!!For each professional record the following:
''Name:........................................
Role:........................................
Contact details:...................................................
Brief description of the relationship between this person and the young person/family (positive, distant, rejecting, supportive, etc):.....................''
[[Anxiety]] may be a key driver for the use of substances, or anger/violence. High levels of anxiety are incompatible with accurate [[Mentalization]].
This is a well evidenced behavioural relaxation technique used in [[Cognitive Behavioural]] work to reduce anxiety.
Another acute behavioural technique worth considering (particularly if there are odd sensations of tingling, or the person feels breathless in a panic state) is [[Re-breathing]].
!!PsychoEducation
*Explain the "vicious circle" of anxiety (see below). Use diagrams to help. Give the diagrams to the young person at the end of the session.
*Emphasise that this is a very powerfully evidenced technique, that has been tested with thousands of people and is known to be effective.
*There are plenty of other methods, but it is best to adopt one and stick with it than to flit from thing to thing without ever really mastering any of them.
!!The problem - a vicious circle:
#Anxiety in the brain sends messages to the ADRENAL glands (above the kidneys) which release ADRENALINE. This raises the heart rate, and quickens the breathing, preparing the body for "fight or flight".
#At the same time, adrenaline increases the likelihood of MORE anxious thoughts and worries in the mind (this is useful if there is a real threat out there, but can be unhelpful if it just increases panicky feelings.)
#The more anxiety you feel, the more messages the brain sends down to the muscles, teling them to "tense up" in case of the need for "fight of flight".
#At the same time, "stress sensors" in the muscles send messages BACK to the brain, telling it how tense the muscles are - the more tense they are, the more stressful messages are sent back to the brain - and this makes the brain (and your mind!) even more more stressed - a classic vicious circle!
!!The solution - switching off the circle:
!!!Be a scientist about this!
''BEFORE YOU START'' - you want to know that whatever you do is WORKING. So give your anxiety a ''SCORE (0 = totally chilled out, 100 = complete panic)''
!!!Now start:
#Find a quiet spot if you can, but you can even do a version of this on a bus if you have to...
#Now, just as the more tense your muscles become, the more anxious you become, so the more relaxed and soft you can make your muscles, the more this calms the system down, because those "stress sensors" send reassuring messages back to the brain (//"Dunno what's going on up there, but we're all mellow down here!"//
#By tensing a muscle ''as hard as you can'', and then ''relaxing it slowly'', you can't help but leave it more relaxed than it was before you started.
#Sit comfortably. Feel the level of tension in your muscles. Try to focus on the physical feelings of tension in your body.
##''Start at the toes''; clench them, count slowly to ten, then relax them ''slowly''.
##''Do the same with each group of muscles''; - calves, thighs, buttocks (remind the young person that this and the face muscles are the only muscle groups that you might want to ''avoid'' tensing in a public place - the rest you can do without anyone noticing!), stomach muscles, then fists, arms, then jaw, then facial muscles (screw your face up as tight as you can then relax.) Count slowly in your head (or aloud if you wish) to ten for each muscle group, and then relax them ''slowly''.
#At the same time you can use another useful fact - which is that ''the conscious mind can only really host one thought at a time''. So, if you fill it with reassuringly boring methodical thoughts, there is less room for panicky anxious ones to keep stirring you up and triggering the vicious circle:
##Each time you relax a group of muscles, ''slowly'' repeat something reassuring to yourself, such as: //"My arm muscles are starting to feel really relaxed and soft now."//
##Even though this feels a bit odd/silly at first, because it //is// rather a dull and methodical thing, it will be blocking those anxious thoughts from filling your head...
##So you are now going about the business of stopping the vicious circle from the ''top down'' (your thoughts) and the ''bottom up'' (your muscles).
#Go from the toes to the facial muscles in strict order three times (takes less than 5 minutes.
!!!Be a Scientist about this!
When you stop, ''give your anxiety another SCORE (0 - 100, just as before)''... it may not have reduced down to zero, but it is very unlikely to have increased.
#Just knowing that ''you have some control over your anxiety'' can itself be very reassuring
#''PRACTICE MAKES PERFECT'' - this exercise works like any athlete works - the more you train, the better you get at it. Set yourself a target to do this twice a day - by all means more if you wish, or need to. It is useful to try to use it when you are not too panicky to start with, so that you can get into a pattern.
Role play example:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/id913uT_FME?rel=0" frameborder="0" allowfullscreen></iframe></html>
!Now practice this yourselves:
* Select some behaviour or habit that you are AMBIVALENT ABOUT CHANGING
** We will only ask for feedback to the large group on PROCESS and not CONTENT
** So be brave and pick something that is real and has some "bite" in your personal experience
* Divide into 3's to discuss statements about your
** Explore the "cons" first
** Socratic questioning, hypothesising
** NOTE that the QUESTIONING is the intervention here, not some form of [[Assessment]]
* "OARS" exercises with a statement
** ''O''pen questions
** ''A''ffirmations
** ''R''eflecting back
** ''S''ummary
These are just one category of the <<tag [[Features of UNsuccessful Mentalizing]]>>
Pseudo-mentalization, perhaps more appropriately termed ‘inaccurate mentalization’, refers to the type of difficulty where there is //apparent// thoughtfulness, but this lacks some essential features of //genuine// mentalization.
It is a //partial understanding//, containing //some// truth and it is not intentionally abusive.
!!Certainty
Broadly speaking pseuso-mentalization difficulties manifest themselves by a tendency of the individual to express absolute certainty about the thoughts and feelings of others. We also find a limited or absent recognition of the inherent uncertainty about knowing someone else’s mind or appreciation for what it is like to have someone else define what is on one’s own mind. Furthermore, thoughts and feelings in others or the self are recognised as long as these are consistent with the individual’s self interest or preferences. For example, in a separated family, each parent may feel confident that they know how the children feel and that the children prefer to be with them and dislike the other parent. The //lack of recognition of ambivalence//, or of //the child’s need to present a distorted picture of his or her feelings to please the parent//, characterizes such instances of impaired mentalization.
!Pseudo-mentalization can take a number of forms.
!!!Preserving a developmentally early view of the child/parent:
In these instances the parent/child continues to think of the other person in the dyad from an earlier perspective. For example, a parent may not be able to consider their adolescent’s burgeoning sexuality and continue to view them from a developmentally earlier point of view.
!!!Intrusive mentalizing:
In these instances the separateness/opaqueness of minds is not respected within a family– someone thinks they know what another person thinks/feels. Sometimes elements of the parent’s image of the child’s mind might be correct (making it even more pernicious) but the subtle differences between what the parent expresses and what the child is likely to feel reveal that they are not in touch with the thoughts and feelings of the child. In any case they are unaware of the impact that being told what they think and feel can have on children’s capacity to have their own mind.
!!!Overactive inaccurate mentalizing:
Often parents invest a lot of energy in thinking or talking about how people in the family think or feel, but this has little or no relationship to the other person’s reality. There can be an idealization of ‘insight’ for its own sake. The child might come to feel that mentalization is obstructive and confusing and should be avoided whenever possible.
!!!Completely inaccurate attributions:
At the extreme end of this category there may be somewhat bizarre attributions (//"you are trying to drive me crazy","your grandma is in league with your father against us"//), denials of objective realities (//"you provoked me", "you fell down the stairs, I never hit you"//), or denial of the child’s feelings (//"you enjoyed it when I touched you like that", "you don’t care about whether your Dad is here or not", "you don’t care about me", "you would be glad if I was dead"//). In these cases the child may be so traumatized by the parent’s misperception, and the threat that the parent’s mental state represents to the child’s welfare that //children will seek to inhibit their own capacity to mentalize//. These more chronic states should be distinguished from the consequences of the more temporary loss of mentalization.
A Psychiatrist is a medically trained doctor, who specialises in the assessment and treatment of mental illness or psychological disorders. Amongst mental health practitioners it is generally the psychiatrist who is responsible for making //diagnoses// and for prescribing medication if that is required. Often it is the psychiatrist in the team who would be expected to manage situations where there is the highest risk, or where there are complex interactions between physical or brain-based illness and behviours.
Some AMBIT teams may have a psychiatrist as part of the team; others will not, but may require input from a psychiatrist at times.
You can read about [[How to speak to a DOCTOR]] for further advice on [[Mentalizing]] the position and dilemmas of a Psychiatrist...
This is one of three <<tag [[Pre-mentalistic stances]]>> - primitive ways of thinking and solving dilemmas that are basically "unbalanced" by the higher (but fragile) function of [[Mentalization]].
The person in Psychic Equivalence assumes that mental events (thoughts, beliefs or wishes), while recognised as internal, ''have the same status as physical reality''. In other words the person is "Living in the cognition" rather than the cognition living in their mind. Another way of describing this state of mind, then, is ''~INSIDE-OUT THINKING''.
To give an example of this; if I think //"the world is rubbish"// then I can either mentalize about that (reflecting, perhaps, that //"it is curious that such a thought has come into my mind today, but perhaps understandable as I smoked and drank too much last night and am hung over now, with lots of work piling up in front of me"//) or I can assume that //"I am living in a rubbish world."//
''Anger is a good example of this state of mind:''
[img[https://lh3.googleusercontent.com/-c2oMQzz081c/UfM4QeAemOI/AAAAAAAAJA0/6Jfa7PmLZt8/s566/PsychicEquivMan.jpg]]
When a person is functioning in Psychic Equivalence there is little point in directly challenging their utterances, as this is more likely to escalate things and leave them with an experience of you as someone who very clearly does NOT mentalize their dilemma clearly. A client who enters the room shouting about a traffic warden who has persecuted him does not want, and is not able, to hear reasonable justifications of the traffic warden's job. A more effective reply might be first to acknowledge the mental state that they are sharing with you:
>//"That sounds absolutely infuriating - horrible! I can understand why you're so annoyed and upset by the __way__ the warden seemed to put the ticket on your car... if you were only //just// on the edge of the no-parking zone, and the warden seemed to you to be //pleased// to be doing this, that would be even __more__ annoying than just getting a ticket."//
Only after the client exeriences you as having some empathy with his here-and-now dilemma, may he be able to start to think ([[Mentalize]]) about the experience in a different way.
>//"What on earth do you think was going on in that wardens mind that might have made it look as though he was __pleased__ to be doing that?... I suppose there are a number of ways of thinking about that...//
This is not un-connected to the instruction to [[Express Empathy]] found in [[Motivational Work]].
!from MBT (Anthony Bateman)
Here is an example of Anthony Bateman roleplaying a response to a patient who is in Psychic Equivalence:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/U0QJ5dTA44I?rel=0" frameborder="0" allowfullscreen></iframe></html>
Giving clear, unadorned, unexaggerated and accurate information is a key part of Cognitive approaches to any treatment.
It supports a respectful relationship between [[Key Worker]] and young person - allowing them to share in the decisions about their care. In this sense it relates closely to ideas of [[Self-efficacy]]. PsychoEducation is usually understood as an aspect of the [[Cognitive Behavioural]] approach to treatment.
!!Giving advice - not quite the same thing!
A related but subtly different area is [[Giving Advice]].
!!First assess the current understandings:
Before attempting to introduce new information it is important to be clear about the family's current models of understanding. It is important not to allow this to become a 'question and answer' session, which might justifiably be perceived as positing a //"Me: knowledgeable, you: ignorant"// axis. Instead, this can be explored using circular questioning, which allows relationships and reflective functioning to be assessed simultaneously:
>''[To daughter]:''//"If I asked your father what he thought the cause of this problem was, what would he say?"//
>''[To father]:''//"Is she good at reading your mind? Did she get that right?"//...
>//"Does anyone in the family have different ideas from these?"..."What are they?"//
An important question for the keyworker is whether or not the family have been given a formal diagnosis (which is often far from clear in early onset; quite commonly there will not be a "label" in the early months, if a 'longitudinal' assessment is being made.) Close liaison between the keyworker and psychiatrist is required if this is the case, to avoid the possibility of mixed messages being given.
!!Psychoeducation about Mentalizing
A specific area of Psychoeducation is when a form of [[Mentalization Based Work]] is starting. For some families it is more helpful to bring out the nature of Mentalizing through the work, but for others some psychoeducation is helpful - a basic explanation of what mentalizing is, how fragile it is, and what it looks like when it is working well is all that is required (see [[Mentalization]], [[Features of Successful Mentalizing]], and [[Features of UNsuccessful Mentalizing]] for useful lists on this...)
!!Introduce new information respectfully, reframing where possible
Presenting new information should ideally take place in such a way as to preserve or emphasise the family's own sense of agency, rather than subjugating it to an external, potentially judgmental, authority figure which enhances the family's sense of passivity, dependence, or guilt and failure.
For instance, presenting the evidence on expressed emotion (EE) in terms of the damaging effects of critical comments, hostility or emotional over-involvement may easily carry a blaming quality with it, to which service-user groups and carers have justifiably objected. The same information can equally well be framed as //an opportunity for the family to deploy protective strategies// (achieving a low-EE environment) in support of the young person within their midst. This reframing employs a certain amount of normalisation of high-EE behaviour ("Many families in this situation find that the stress leads them to become critical or judgmental - and if they can find ways to cut this down...") in order to remain engaged with the family system.
!!Activate the individual's or family's curiosity about the information required:
The family is reminded that //they are the experts on what it is like to experience a son/sibling in their midst develop a psychiatric illness.// Bearing in mind that the family may be quite unused to a formal teaching environment, they are invited to help generate questions that people in their position might want answered.
For instance, they might be asked:
>//"Imagine we are trying to design a course for families in just your position - what are the questions that you think (with your first hand experience of what it's like to be in the situation) they would want answers for?"//
This means of generating questions affirms the family's experience and competence and by positing the existence of other families in similar situations, it reduces the sense of isolation and stigma that families may be overwhelmed by and by introducing the idea of shared experience helping other families, it begins to prepare the family for the potential benefits of multi-family therapy.
!!Information about a diagnosis:
Producing written material is helpful (see below for sources.) Information 'required' by the family may be drawn out on flip-chart paper to produce a "knowledge tree" with branches representing the major areas, such as 'Definition' (''"what is it?"''), 'Aetiology' (''"Causes" ''), ''Treatment'', Prognosis (''"The future"'').
The [[Key Worker]] might ask the family to elect a scribe for this process. The keyoworker may wish to raise additional areas that have been missed, by asking questions such as, "Would it be helpful for families to know something about...?" These can be sub-divided so that aetiology might have sub-branches concerning genes, environment (including family interactions - EE, illicit drugs). 'Definition', for Schizophrenia, should include 'positive' and 'negative' symptoms, as well as Epidemiology (''"How common is it?"'' - and this can be a helpful way to introduce the notion of ''Stigma'', by emphasising how common the condition is.)
!!Didactic teaching - the Stress-Vulnerability model of mental illness
This is a useful model of the aetiology of psychosis, and many other mentla illnesses; it accepts the multi-factorial nature of causation in these illnesses. The manifestation of a psychosis in any individual is seen as the end point of a long and varied chain of different factors, reaching back to the moment of conception, each of which multiplies the risk of that individual eventually falling ill with psychosis.
At the beginning of the chain is a genetic vulnerability; a ‘vulnerability factor’ is something that multiplies an individual’s risk of becoming psychotic. Vulnerability to psychosis is certainly coded for by more than a few separate genes, and probably by quite a significant number, so that all of the population would have some genetic vulnerability, but some of the population (about 1 – 2%) has a lot of vulnerability. Following this enhanced risk at conception, an individual’s risk would be further multiplied by pre- or perinatal infections, further multiplied by having a traumatic birth (causing microscopic damage to developing neurons in the brain), further multiplied by experiencing early abuse or deprivation, and in general further multiplied by stress from a wide variety of sources (for instance acculturative stress such as immigrants coming in to very different and often hostile cultures suffer, academic stresses, bullying, etc). Coming on top of all of these multiplied and re-multiplied risks, street drugs are often the ‘straw that breaks the camel’s back’.
!!Information sources:
For reliable information on SubstanceUseDisorder, refer to the [[TalktoFrank|http://www.talktofrank.com]] website. There is some documentation on [[Cannabis Legal issues]] here.
For information on Mental Health matters, refer to the [[Royal College of Psychiatrists|http://www.rcpsych.ac.uk/mentalhealthinfoforall.aspx]] website, or [[Young Minds|http://www.youngminds.org.uk/]]
!!Key elements for Psychoeducation in a CBT treatment
*The basic relationship between Thoughts, Feelings and Behaviours.
*The inevitability of //some// anxiety in life - the necessity of this, even!
**Evidence that the ~Hypothalamic-Pituitary-Adrenal axis is working properly.
**Evolutionarily very important to have these systems that respond to threat.
**The "~Yerkes-Dodson Curve" suggests that some anxiety is required to get the best performance out of humans - just not //too// much!
*The fact that anxiety, though very unpleasant is //not of itself dangerous//.
!Good practice in psychoeducation:
*Consider the language that you use, and always ''[[check back|Checking]]'' with the young person that they have understood what you have said.
*Avoid checking back in a way that could be taken as critical, or that could trigger unhelpful associations with school settings, where the young person may have had unhappy experiences of "inquisitorial" teaching techniques:
**Try using the young person's own expertise at communicating with their peers as the route in: //"I don't know about you, but some of that stuff is very complicated and I know I find it hard to get my head around it and so do many of the young people I work with. I tell you what, say I was one of your mates and didn't have a clue, can you tell me how you would explain it to him, as you will probably have a better way of putting it than I would... what would you say?"//
*Use ''diagrams'' wherever possible and give them to the young person //"...to stuff in that draw you put things that you know you'll never look at, but you might want to be able to find again some day in the future"//...
<html><img src="https://docs.google.com/drawings/pub?id=15NSkmut8m3ML2TrGZQ-M4H3ySAYBsEPNvj38aIbOIjU&w=960&h=720"></html>
This is one of a series of [[Tags]] that gathers together information about a topic.
Psychoanalysis is made up of two related but different sets of ideas:
|bgcolor(pink):1. |bgcolor(lightblue):The psychoanalytic //theory of the mind// - a fairly wide variety of ways to structure relationships between functions of mind|
|bgcolor(pink):2. |bgcolor(lightblue):The theory of //psychotherapeutic practice// - as it is embodied within a framework of intensive insight-oriented psychotherapy.|
These two strands of knowledge are loosely coupled, with theoretical information guiding clinical work to some degree, while clinical experience serves selectively to inform theory:
*Historically, psychoanalysis as therapy came to be identified with the entire body of psychoanalytic knowledge:
**There was no uniform set of theoretical ideas, no common set of beliefs to which all psychoanalysts after Freud could adhere.
**Psychoanalysts achieved their identity through their adherence to certain aspects of the insight oriented clinical therapy which Freud originated (for example, the number of sessions of psychotherapy per week, the use of the couch with adults).
**In this way the technique of therapy came to define what psychoanalysis was.
**It therefore could not be modified or adapted to changing demands without destroying professional identity.
*But psychoanalytic theory and practice are not very closely linked:
**There has been a proliferation of psychoanalytic theories since the death of Freud, each proposing a radically different model of the mind.
**But there are relatively few differences in the way the therapy is practised across theoretical groups.
[[Mentalization]]-based interventions such as AMBIT do not draw on any specific psychoanalytic theory but rather draw on the idea that there is [[Hidden, private or implicit theory]] - that psychoanalysts hold about people (and which people may hold about psychoanalysts), and which cannot be found in books.
Thus our approach is psychoanalytic in this most generic sense of using an [[Implicit psychoanalytic model]].
!! Purpose
!!!To define terms related to psychometrics and psychometric tests
Psychometrics is about how we measure psychological characteristics in people.
It involves the theory and the technique of measuring aspects of human behaviour and human characteristics.
When we talk about psychometric tests we often mean questionnaires, interviews or ways of rating psychological features on scales which allow comparisons to be made.
The kind of psychological features that might be measured by psychometric tests include things like:
*Thinking and learning skills
*Knowledge
*Beliefs
*Attitudes
*Behaviours
*Mental Health
*Our experience of something or views about it
*How we function in various areas of our life
*Our personality
!!!Psychometric properties
This is a way of talking about the features of psychometric tests, in particular how well they measure the things they set out to measure.
It includes the study of ''how'' we measure these things in ways that are as accurate and reliable as possible.
There are some particular aspects of psychometric tests that we evaluate to assess how good they are at measuring what they set out to measure. These include:
''Validity'' This is about how accurately it measures the concept that it says it is measuring. For example, if a test says that is is measuring someones mental health, does it actually measure this ?
''Reliability'' This is about how consistently the test measures the thing it is intending to measure over time. For example if you repeated the test on the same person, would it still capture the same things?
''Factors'' These describe the areas of a test that are measured within it. These are separate aspects of the test that don't overlap with each other. For example, within a test of someone's overall life functioning there would be questions about things like relationships with family and education,...these questions may fall into separate factors as they ask about different aspects of life which are separable from each other. When we look at people's answers to their questions if there are not relationships between how they rate these aspects of the test they may be defines as 'separate factors'.
A ''Factor Analysis'' is a way of reducing down all of the questions in a test to leave only those which don't overlap with each other and which best capture the separate areas that to be measured.
This information is adapted from the ROYAL COLLEGE OF PSYCHIATRISTS, who produce a helpful series of leaflets that are accessible online: [[Royal College of Psychiatrists|http://www.rcpsych.ac.uk/]].
!For the carer
!!About psychosis
Psychosis is a word used to describe symptoms or experiences that happen together. Each person will have different symptoms, the common feature is that they are not experiencing reality like most people.
Some people only have a single episode and make a full recovery; for others, it is a longer process. As 1 in 10 people with psychosis commit suicide, it is important to recognise the symptoms of [[Depression]]. An earlier onset of psychosis (i.e. in adoelscence) may be associated with more severe forms of psychosis, so this is not a diagnosis to apply a wait and see approach with for too long, regardless of the direct risks to the young person or to others if he or she is [[Paranoid]]
!!A person with psychosis may:
*hear, smell, feel or see things which other people do not ([[Hallucinations]])
*have strange thoughts or beliefs which may make the person feel they are being controlled, persecuted or harassed ([[Delusions]])
*have muddled or blocked thinking ([[Thought disorder]])
*at times seem unusually excited or withdrawn and avoid contact with people
*not realise that there is anything wrong with themselves ([[Lack of insight]]).
!!Early changes in the person’s behaviour
As a carer, you may notice that the person:has problems understanding reality and thinking clearly
*talks to themself and/or appears to be listening to something else
*has problems communicating effectively
*loses interest in their personal appearance and life in general
*is restless, irritable or tense and anxious
*avoids other people
*is aggressive or violent (in a minority of cases)
*be very high ([[Mania]]) or very low ([[Depression]]), or swing from one state to the other (manic depression).
!!Making a diagnosis
There is no single specific test for psychosis as the symptoms are common to a number of disorders, including schizophrenia, manic-depression/bipolar disorder and psychotic depression.
A diagnosis is made by talking to the person and a close relative or friend to get an understanding of the person’s history, as well as considering all other possible causes for the symptoms. Diagnosis is made by a Psychiatrist, who will usually be accessibkle via the young person's GP, if they have one (see [[How to speak to a DOCTOR]] if you need help with this.)
!!Treatments
* There is a [[NICE Guideline - Schizophrenia (over 18yrs)]] although this is not specifically focussed on the needs of younger people.
* Medication ([[Pharmacological]] treatment) should be started as soon as possible if there is a psychosis, to help the most disturbing symptoms and this can make it possible for other kinds of help to work.
* Once acute symptoms are under control, [[Relapse prevention]] is an important intervention.
* Other treatments used together with [[Pharmacological]] treatments, or on their own, include:
** Talking therapies (psychotherapy), such [[Cognitive Behavioural]] Therapy (CBT).
** [[Family Work]] is usually an important part of the care package, especially for young people, and with a focus on:
*** reducing [[Expressed Emotion]]
*** supporting [[Relapse prevention]]
!!As the carer, you may feel:
*guilty
*worried that you are losing the person you knew
*wonder if anyone else in the family will be affected
*exhausted by caring and ensuring that the person is safe
*scared about admitting there is a problem
*worried about the long-term outcome for the person
*worried about coping and getting help
*worried about the long-term financial responsibilities of caring
*worried about people’s negative attitudes towards mental illness and the stigma associated with it.
!!Tips for carers
You need to try to get into a //partnership// with your doctor and members of the mental health team
*Good communication between a doctor, members of the mental health team, a person with psychosis and their carer is important, but takes time and effort.
*Forming a positive, long-term relationship with all the staff and doctors involved in the care of the patient is especially important if the condition is long-term.
*If the person has the symptoms for the first time, it is important to see the GP as soon as possible. The GP, or a member of the Community Mental Health Team (CMHT), or Child and Adolescent Mental Health Service (CAMHS) will make the initial assessment before referring the person to a specialist.
!!If the person refuses to see a doctor...
*The carer or another trusted person should try to persuade them to accept professional help.
*The person may not need to go into hospital, as assessment and treatment can now be done at home by the CMHT or CAMHS.
*Where there are very real risks that cannot be contained in the community, it may be necessary to [[Use the Mental Health Act]].
!!Questions to ask the doctor
#What does the diagnosis mean?
#Can you explain it in a way that I will understand?
#Are there any treatments?
#Where can I get information about medication and possible side-effects?
#How long will it take for the medication to work?
#Are there other things we can do to help ourselves?
#What can we expect in the near future and over time?
#Will the person be able to continue in work or in education?
#Is it safe for the person to drive?
#Will the person I care for get better?
#How often should I come and see you?
#Can you give me an out-of-hours emergency telephone number?
#Do you have any written material on this disorder, if not who does?
#Is there anything that we can change at home to make things easier, or safer?
#Are there any organisations or community services that can help?
#Which health service worker is my main contact for guidance and advice?
!For the professional
As a professional working with people with psychosis and their carers, we hope that the following is a helpful guide to good practice.
When doing an assessment, do you?
*Try to see the patient and the carer separately, as well as together
*Try to see them at home first
*Do you allow yourself enough time to?
**Listen, and, listen again
**Obtain a life history
**Leave time for questions and discussion
**Explain how you/the doctors arrived at the diagnosis
**Talk about the prognosis - or find an opportunity for the young person to speak to an expert about this
*In the management of the illness, do you?
**Discuss possible treatments
**Talk about the possible side-effects of drugs
**Talk about the importance of the patient maintaining positive social roles, work or education goals, if possible (see [[Taking Responsibility for integration]] and [[Dis-integratedInterventions]])
*Spend time asking about the carer’s health: physical and emotional
*Make it clear that someone will always be available.
*Give an out-of-hours telephone number.
*Make sure that there is a named professional
person whom the family can contact at any time.
*When you write your letter to the GP, consider sending a copy to the patient and carer.
*Try to talk to the GP on the telephone as well as writing.
*Make sure the patient and the carer have adequate information about their care and treatment.
!Further help
!!!Royal College of Psychiatrists
17 Belgrave Square, London SW1X 8PG.
Tel: 020 7235 2351 ext 259.
Produces information for the general public on common mental health problems and treatments.
[[Royal College of Psychiatrists|htpp://www.rcpsych.ac.uk]]
!!!MIND
Granta House, 15-19 Broadway, London E15 4BQ.
Mindinfoline: 0845 766 0163.
Publishes a wide range of literature on all aspects of mental health.
[[MIND|http://www.mind.org.uk]]
!!!Rethink
30 Tabernacle Street, London EC2A 4DD.
National Advice Service: 020 8974 6814.
Voluntary organisation that helps people with severe mental illness, their families and carers.
[[Rethink|http://www.rethink.org]]
!!!MDF The Bi-polar Organisation
Castle Works, 21 St George’s Road, London SE1 6ES.
Tel: 08456 340540.
National user-led organisation providing support and information.
[[MDF-Bipolar|http://www.mdf.org.uk]]
!!!The Princess Royal Trust for Carers
Further information for carers is available from
The Princess Royal Trust for Carers,
142 Minories, London EC3N 1LB.
Tel: 020 7480 7788;
[[Carers Trust|http://www.carers.org]]
* <<tag [[Published/Current Outcome Studies]]>> are subdivided into:
----
** <<tag [[AMBIT Outcome Studies]]>> - gathers together current or published material on the outcomes from ''specifically AMBIT-influenced teams''
----
** <<tag [[Studies relevant to AMBIT]]>> - gathers together ''other outcome studies'' (not relating to AMBIT-influenced services) that are seen as having direct relevance for AMBIT's learning.
----
* See also material on:
**<<tag [[Evaluating outcomes]]>>
** the (non-comprehensive, but extensive) list of <<tag [[Academic references]]>>
!!!!Source: Cheryl Hunter
!Summary
In 2020 Cheryl Hunter, one of the AMBIT team at the AFNCCF, carried out a detailed analysis of the free text comments from a large sample of training session feedback forms. The analysis examined 565 free text responses from the session feedback form for trainings delivered between March 2018 and February 2020. The 565 responses were coded as positive (426), negative (56), neutral (24) or mixed (positive and negative) (59) feedback
The majority of the feedback was positive, especially around the quality of the training process. Some of the tools were specifically highlighted as useful and valuable and there was a small but significant number of comments about implementation intentions, which have a positive association with behavioural change in research. The skill, energy, enthusiasm, and knowledge of trainers was often praised, and engagement and enjoyment were common themes.
There were meta-comments about the training approach which suggested that at least some attendees were connecting with how the training was being conducted and the reasoning for it.
The majority of negative comments were about housekeeping issues, e.g., breaks, venues, comfort which may be worthwhile considering how to help people set up a conducive space for online training. Other negative comments tend not to be shared across attendees, so it may reflect individual differences within a group. There were indications in a couple of trainings that team dynamics were complex, and comments were still mixed, e.g., a couple of people reflecting that more tailoring to context would be helpful and the others feeling that the facilitators did well to adapt to the context.
All suggestions are considered by trainers during the training itself as this is a key aspect of the AMBIT training approach to respond to the issues raised by the participants themselves.
!Method
Free text comments were transferred to an excel spreadsheet and then were hand-coded as positive, negative, neutral or mixed, based on the tone of the comments. “Neutral” comments were those where the statement did not allow a judgement of tone. “Mixed” comments were those containing both positive and negative comments
Data was then hand-coded in terms of content, drawing on the Kirkpatrick framework, namely as Flaws/ limitations/ considerations. Only one person (CH) coded the comments.
565 responses were coded as positive, negative, neutral or mixed (positive and negative) feedback
#Positive – 426 responses
#Negative – 56 responses
#Neutral – 24 responses
#Mixed – 59 responses
#Suggestions - 59 responses
!Content
!!1. Positive comments (n=426)
Note that comments here come from either “positive” or “mixed” coded responses
Positive comments are grouped into:
*Reaction comments
*Knowledge, skills, attitudes (including useful or value-based judgements)
*Applicability of learning to practice (including implementation intentions)
''1) Reaction comments''
Reaction comments were typically comments which described an emotional or intellectual response to the materials. These categories did overlap/co-occur. ''“Praise”'' was typically used when the comment was generically positive, with enjoyment, engagement, and interest being used when either these words were used in some form or a close synonym
*276 responses complimented the training or the trainers (coded as “praise for training/trainers”) but did not descriptively specify what was good about the training or trainers. This ''praise'' was typically statements like “thank you!”, “great training”, “really enjoyed”, “Interesting”, “I had a great time”, “brilliant trainers”, “excellent trainers”, and “trainers were excellent”.
*85 comments were about ''enjoyment'', typically describing the training as enjoyable or praising it as “great” or “fun”
*46 comments were about ''engagement'', such as describing the session as engaging, feeling engaged by the materials or the trainers, or feeling like there was lots to think about, e.g., “Looking forward to developing knowledge practices to know how it can be used within the team”; “Really helpful ideas and lots to think about I appreciate the space to reflect and activities done”; “It was very engaging, well structured and delivered”; “The training was great, really engaging and informative. I do wonder whether it could be condensed into three or four days but it was nice that there was time to really think about the different elements.”
*37 comments were coded as “interest” or ''“interesting”'', where the attendee used either of these words or talked about being interested in the model or implementation, feeling like they are learning “good ideas”, finding it “thought provoking” or being “stimulated” by the training.
*14 comments were coded as enthusiasm and 7 as ''“enthusiasm for implementation”''. These reflected times when attendees were enthused or excited about training others, communicating the ideas to others, or implementing or practicing AMBIT techniques and ideas further.
''2) Knowledge, skills, attitudes comments''
*''Enhanced understanding'' – 43 responses about feeling like they (or the team) have started to understand AMBIT and its applicability. When people say something about ''things starting to make sense'' or become clear, e.g., “Excellent bringing together of everything”; “thank you for another great session. It feels like its all start up and come together in my head”; “I understood the framework which made me feel very positive”
*''Enhanced knowledge'' - 18 responses about feeling like they have ''learnt something new'' or interesting, e.g., “It was useful to learn things in a different way, which challenged my own learning from previous training”; “learned a lot from both of you”; “I’m learning a lot”
*''Enhanced skills'' – 3 responses which state that people feel they have learned a new skill, e.g., “I gain considerable means and skills during the presentations”; “Very good session useful to see mentalization in practice helped me to learn new skills that I can use attitude job as well”; “Amazing training, empowering my skills to deliver training”
*''Usefulness'' – 156 comments about finding some aspect of the training (e.g., a specific tool, tools, exercises or reflection, or implementation conversations) useful or helpful, e.g., “I felt that the content was very interesting & helpful”; “I felt the training was very useful and relevant.”; “The framework is useful and fits into the reflective practice approaches within Social Work. The added benefit is that it comes from an emotional stance and then leads into a task centred outcome.” Often comments on usefulness accompanied comments on relevance or intention to implement, e.g., “It provides an easy to use/apply framework to support staff with their work with clients, learning and work with other agencies.” A more detailed summary of the specific aspects of the AMBIT model highlighted by this feedback can be found at [[Qualitative feedback on usefulness of AMBIT]]
*''Value'' – 38 comments mentioned that they valued AMBIT (as a model) or they valued an aspect of AMBIT (e.g., tools, ideas) or that they valued the training approach
**10 comments on value of AMBIT model – e.g., “It is a great shared language to introduce to other agencies”; “I work systemically and this system will provide greater opportunity to develop a shared understanding of systemic approaches and level out the hierarchy”; “many thanks for excellent training week - loved style pace energy attunement > Human! Looking forward to using the framework & resources to adapt it in our service”
**8 comments on value of reflection – e.g., “Good to reflect all together as a team.”; “I enjoyed the moments when our team could have frank conversations and learn together and even experience a bit of tension with the safety of having the facilitators there”; “helpful sessions to see our work from other point of view”
**7 comments on value of team work/group work/exercises – e.g., “helpful to have protected space to think about our service and the services we work with”; “opportunity to interact in practical application was excellent”; “group session really supported the learning”
**6 comments on value of training approach – e.g., “I had good feedback on my exercise so maybe I am using parts of it already. I look forward to the rest of the training. Very interesting and supported with the facilitators”; “I felt the day was great & supportive in encouraging thinking!”; “A great weeks training with two fantastic trainers. Great observations about the team and great mentalizing of the team.”; “particularly appreciated your taking our position and mentalizing our group dilemma, i.e., dialogue between you both”
**2 comments on value of implementation focus/discussion – “Very helpful to present and discuss implementation processes we have started the process”; “implementation planning really valuable and gives me confidence we will take forward the learning.”
**2 comments on the value of tools (sculpt and disintegration are mentioned) - e.g., “Like the practical tools. Sculpt exercise a great exercise”; “Liked thinking about thinking and exercises dis integration grid”
''3. Applicability of learning to practice (implementation/relevance/intent to use)''
These sub-themes interrelated heavily, e.g., when someone thought AMBIT was applicable, they often talked about implementing it too. Applicability of AMBIT is more relevant to comments where the comment’s focus was on the model as a whole. Relevance captured general relevance and relevance of specific tools, techniques and ideas.
*''Relevance'' – 59 comments were made on the relevance of AMBIT or specific aspects of AMBIT to the practice of a team/service/needs of a client group. Included comments about fit with current ways of working (where this was seen as a positive), e.g., “It validated elements of what we do anyway, it clarified elements and gave additional golden nuggets to take away.”; “mentalizing helped me a lot with one of my clients”; “Found the training really relevant, really delivered well.”; “lots of parallels to what were already doing and I’m excited to learn more about the tools”; “Really great ideas. I have been able to use the 'thinking together' framework with a colleague and found it very helpful.”
*''Applicability of AMBIT'' – 44 comments were made on the applicability on AMBIT, e.g., “AMBIT is very applicable to the young people who *** of ICP service.”; “Learnt some really useful tools that I can see myself implementing.” “Its all fairly common sense stuff but crucially this training gives us words to name what we are doing, and to hold each other to account – e.g. when the mentalizing stance is dropped, in times of stress, we have tools and words to gently and constructively raise things to each other”; “Prior to the course I was apprehensive and anxious that the content would be pitched at a higher level than my capabilities..."I'M ONLY A PRISON OFFICER" (I got reprimanded for saying this on more than one occasion). Very early on, it was evident that, as a team in the establishment, we are already "very AMBIT"-it's just giving what we do a name. I learnt some really valuable information on the course-some good exercises to share with my team and can't wait to pass on all that I have learnt.”
*''Implementation intentions'' – 40 comments were made around people’s intentions to use AMBIT or to train people in AMBIT or to use a specific part of AMBIT - e.g., “We already have similar approaches within our core 18 day training programme, which will make it easier for staff and volunteers to understand metalizing and the AMBIT wheel, I will also be introducing the tools that I learnt over the coming weeks”; “Getting excited about pitching to senior managers”; “today was really good for me, starting to think about how this can be delivered into the unit.”; “I found the team discussions very helpful and I look forward to using the tools in my work. I found the thinking together exercise great and the steps are so useful. We will hopefully use at clinical conversations”
*''Implementation hopes/desires''' – 16 comments were made which expressed enthusiasm or a hope or desire to implement AMBIT or some aspect of AMBIT (e.g., “looking forward to”), but didn’t necessarily suggest what they would do or how, e.g., “Looking forward to developing knowledge practices to know how it can be used within the team”; “looking forward to practising + utilising some during my work with ICP.”; “Excited. Hoping we can embed as soon as possible.”; “Both trainers were really engaging and personable - I often find it hard to stay focused on training but both Laura & Rebecca were really great in training - so thank you! Hope we can implement this in practice.”
!!2. Negative comments summary (n=56)
The negative comments were themed around personal, environmental, training content and training delivery.
''Personal''
*''Engagement ''– 7 comments, typically attendees reflecting on being tired, stressed or distracted personally so that their engagement levels were low, e.g., “Noticed my interest as we discussed how to broadcast our intentions which could be explained by tiredness, the fact I’m leaving the service or because it’s been a thinking experience trying to XXX for our service.”
*''Missed sessions'' – 2 people commented that they had missed sessions which affected their understanding and engagement, e.g., “having not been here some of the practicing scenarios were difficult”
*''Team dynamics'' – 1 person said their existing team dynamics made the training more difficult, e.g., “The final day - tiredness from the certainty factor in this. There are also dynamics withing the group that more evident as some are leaving the team, therefore genuineness in connection as a team was sometimes compromised”
''Environmental''
*''Distraction/disruption'' – 2 people commented on other attendees coming and going and this being disruptive and distracting, e.g., “would be helpful if so many people did not get up and leave during the day, it reduced my engagement and concentration”
*''Environment'' – 9 people commented on the chairs, the venue, the heating or another aspect of the venue as uncomfortable, e.g., “the room was difficult as it was too hot, and florescent lights give me headaches”; “Location + room suitability not adequate”
*''Breaks'' – 2 people thought breaks should be more frequent or length of breaks, e.g., “I prefer an hour long lunch break”; “Small break every hour would be nice!”
''Training content''
*''Difficulty or complexity of content'' – 9 comments on the difficulty or complexity of an exercise, presentation or tool (AIM cards or questionnaire), e.g., “aim card- less information on the cards would make them more accessible- perhaps put explanation on the card back”; “I found the manual difficult and frustrated with myself” (from the mixed comments); “Minor detail: The slides had a lot of text, and when the presentations were in english (we are Danish), it was hard to keep up, because we had to read the slides and listen to the teacher at the same time. It would have been easier to follow, if the slides had more visual figures or models, and less text :-)”; “It wuld be handy to send the questionnaire out after people had completed the training- we have 2/5 left to do thus it is hard to evaluate the training properly”
*''Redundancy/Repetition'' – 3 comments on the content or the model not being new and the training feeling repetitive, e.g., “A lot of what I previously learnt & laboured the point sometimes eg Sculpting”; “Rated 2 because I know the content from last year”; “Day 5 somewhat redundant about implementation”
*''Desire for more explanation'' – 4 comments about wanting more examples or more information, e.g., “More cases; Maybe have some pre-reading material before the course as I was not entirely sure what to expect before the training”; “''Would like some more examples'' of how teams have evaluated/implemented ambit- challenges and how overcome.”; “would benefit from a brief introduction to what the course covers”
*''Lack of handouts'' – 11 comments on desire for handouts or printed manual pages or slides, e.g., “Presentation print outs or opportunity for individuals to print out the presentation for the training if they wish to, to fit with individual learning styles; This would have enabled me to refer back throughout the days to keep up with what was being discussed”
*''Concerns about implementation in context'' – 4 comments raising queries around ability to implement in their own context, e.g., “working in separate offices - makes it harder to regularly implement”; “I do feel that without management the training may get lost. So can only integrated in a limited manner”
*''Manual accessibility'' – 1 concern raised about accessibility of manual to public, e.g., “concern about webpage with regards to us being part of [council] and or media/legal team. It will need further discussion”
''Training delivery''
There was a handful of negative comments focused on aspects of training delivery, e.g., trainers, training pace, organization of session, time dedicated to particular activities.
*Session organization – 2 people commented in the same train the trainer session on the sessions feeling “less organized”.
*Training pace - 2 people commented that the training pace was slow or could be faster
*Inconsistent trainers – 1 person commented on the trainers changing across days
*Preparation time for presentations (specific to train the trainer) – 1 person wanted more time to prepare
*Preparation time – 2 people talked about wanting further preparation, either via advance notice of implementation planning/slides to review in advance
*Implementation planning – 1 person wanted more time to create an implementation plan with their team
*Completion of activity – 1 person felt the team did not have long enough to answer a questionnaire
*Self-facilitation of group exercises – 1 person felt that this was less helpful than facilitated group exercises
*Training length – 1 person thought the training was too long
!!3. Neutral comments summary (n=24)
The 24 neutral comments break down into:
*4 Suggestions for the trainers, phrased in a neutral way, e.g., provide a reference or training materials, e.g., “hard copies of presentations”; “Feedback from trainees to managers not present - may be useful”
*13 Reservation of judgement, e.g., need to practice more or think more or complete more training before a judgement is made, e.g., (on day 1) “considering having limited information for the course today has given me the thirst to learn more”; “Nothing at this time”
*2 Implementation to test model, e.g., “I think hard work is to come with implementation!”
*4 Personal response without judgement of the training, e.g., “Scores above do not reflect the quality of delivery or content - more to do with the day job getting in the way meaning I was unable to fully engage in the session as much as I would have liked.”; “I need to remember that the training is train the trainer too”
*1 unclear - “Pushing boundaries”
!!4. Mixed comments summary (n=59)
The 59 comments that were “mixed” are mostly covered in the “positive” and “negative” sections, as they had to be relevant to both to be coded as “mixed”.
Some themes were:
*''Environment'' - People commenting on the environmental/housekeeping aspects alongside praising the training. Environment aspects are covered in “negative” section and so not counted here. The best example is probably “enjoyed it but not the biscuits”
*''People making suggestions'' (e.g., to be provided with more examples of practice/more time/handouts/faster pace of training/balance of activities) alongside praising some aspect of training. Suggestions are covered below.
*''Familiarity/Redundancy'' - People commenting on familiarity of materials and still appreciating some aspect of training (3 comments), e.g., “I think, that we already work with mentalising, and that not all tools are applicable in forensic psychiatry and maximum security where I work”; “The content was not totally unfamiliar. Yet the prementalizing states are still a bit difficult to recognise. Thank you for a good day”; “Some interesting ideas, v. similar to the way we work anyway but feels good that more explicitly acknowledged as way forward for under sense. Would be helpful to have higher energy maybe? I felt a bit too reflective - soporific at times”
*''Personal barrier'' - People commenting on a personal issue which detracted from engagement or on their own confidence, and commenting on an aspect of training positively (10 comments), e.g., “I came into today’s session late so it was harder to pick up on but still very informative”; “Unfortunately, I wasn’t in a healthy emotional place to receive the information but great facilitation.”; “This course has come at a bad time for me, I just took over on my ward and my concentration is primarily on that and not really on ambit. Sorry. But it is a really great course and I'm learning a lot anyway!”
*''Reservations'' - 4 comments which were positive with reservations about the applicability or feasibility of AMBIT or an aspect of the training experience, e.g., “It is very good but the time for reflection always comes after. I know I am going to use it but right now I don’t know how and this is why I wasn’t fully engaged I think”; “Score for ability to use knowledge has dropped a little. I'm cautious about delivery training and supervision in my role however I recognise that I need to commit some time to preparing specifically for AMBIT training and supervision.”; “I definitely plan to use several of the tools in my one to one work. However I anticipate most of my work to be about group work and social action projects over the next year - and while certainly the general stance and approach is relevant to all work and all teams, the specific tools eg. AIM, dis-integration, Pro Gram etc are all more suited to one-to-one work”; “The idea of mentalization is powerful. I think a lot of the challenges as a team have been bringing up may not relate to the course thus for me personally I feel like we are going up and down round and round and losing the main focus of the actual topic. In practice with young people focused examples/scenarios a lot of the process especially mentalization will work.”
*''AIM Cards'' - 1 comment on the AIM cards being useful but wordy: “AIM cards: I feel the aim cards would be very useful however there is a lot of writing on the cards which could put young people off. I think some of the information could be put on the back of the card. I feel the time give to group work was too long. People discussed the task but then got distracted and started to talk about unrelated things. If the time was shorter I don’t think this would have happened.”
!!Suggestions
59 suggestions were made by attendees.
These included:
#Providing handouts/slides/printouts of manual/references – 14 comments
#Providing more examples from practice/implementation – 7 comments
#Reducing training length or faster pace – 6 comments
#Advance prep/introduction – 3 comments
#Longer prep time/plan time/reflection time during training - 3 comments
#AIM cards – reduce wordiness – 3 comments
#AIM cards – explanation on the back – 2 comments
#Connect managers into the training – 2 comments
#More practice time in training – 2 comments
#Regular breaks/more breaks – 2 comments
#More theory/ mentalization – 2 comments
Single comments on the following:
#Focus more on organisational requirements to enable mentalizing
#Role play thinking together
#More interaction
#Acknowledge overlap with existing ways of working
#Outline trauma’s impact on mentalisation
#Adapt slides – more visual, less text
#Handouts – focus less on young people
#More varied presentation
#Group activities after lunch
#Questionnaire sent out after training
#Group people from same clinical areas during training
#Create connections post-training
#Provide picture of wheel
!!Summary and Conclusions
The majority of the feedback was positive, especially around the training/trainers being good. Some of the tools were specifically highlighted as useful and valuable and there was a small but significant number of comments about implementation intentions, which have a positive association with behavioural change in research. The skill, energy, enthusiasm, and knowledge of trainers was often praised, and engagement and enjoyment were common themes.
There were meta-comments about the training approach which suggested that at least some attendees were connecting with how the training was being conducted and the reasoning for it. This was not analysed here, but it may be that this was more common on Train the Trainer courses (and is worth analyzing in future).
The majority of negative comments are about housekeeping issues, e.g., breaks, venues, comfort, which are less likely to be problems with online training. However, it may be worthwhile considering how to help people set up a conducive space for online training. Other negative comments tend not to be shared across attendees, so it may reflect individual differences within a group. There were indications in a couple of trainings that team dynamics were complex, and comments were still mixed, e.g., a couple of people reflecting that more tailoring to context would be helpful and the others feeling that the facilitators did well to adapt to the context.
Coding notes
- “Interest” and “engagement” comments could be collapsed as categories
- “Valued” and “useful” comments also overlap and could be collapsed as categories
- Using the Kirkpatrick structure for comments might work in future
''The AMBIT team at AFNCCF are extremely appreciative of the work done by Cheryl Hunter in carrying out this analysis of training feedback. The themes identified here have provided important material for the trainers to reflect on and consider. ''
!!Comments on the usefulness of specific aspects of the AMBIT approach
This page provides more detailed summary of the qualitative feedback given by AMBIT trainees and is a subpage of [[Qualitative feedback from training]] which gives an overview of the qualitative feedback analysis.
*25 comments on the ''usefulness of the tools'', e.g., “really useful tools that embed the AMBIT approach”; “Today's session gave me new tools thinking together for team meetings”; “The tools were helpful”; “It will be a really useful tool that will have significant impact in clinical care”
*13 comments on the ''usefulness of reflection'' – e.g., “Even though the process of planning the training was hard, it was valuable to unpick some of the dilemma and link it with the wheel and the stance”; “really enjoy having time to talk to the team as well as others in the room”; “Appreciate the open discussion and exercises throughout the day to test learning and keep us engaged”
*12 comments on the ''usefulness of the group exercises'' – e.g., “I’ve learned the most from the exercise and for me there was a good balance between theory and practical exercises.”; “I thought the exercises were very useful & relevant to the training”; “I found the exercises very helpful and insightful I can already take back information to use into practice with the team & yp.”
*12 comments on the ''usefulness of thinking together'' – e.g., “I think the thinking together exercises great and the steps are so useful”; “I found the thinking together exercise will be beneficial both personally and professionally - thank you!”
*5 comments on the ''usefulness of sculpt'', e.g., “The bit around help seeking was very thought provoking. The sculpting exercise also.”; “Will be using the sculpt idea with clients to get better understanding of who is in their lives”; “Like the practical tools. Sculpt exercise a great exercise.”
*5 comments on ''usefulness of Mentalization concept'' or mentalization experience, e.g., “It will make mentalising explicitly part of the work I do”; “Very good session useful to see mentalization in practice helped me to learn new skills that I can use“
*4 comments on the ''usefulness of disintegration grid'', e.g., “definitely use dis integration grid for resettlement updates to share at planning meetings”; “really enjoyed today - the dis integration table was especially useful for me in relation to working with families/ networks. Thank you”
*4 comments on the ''usefulness of implementation focus'' and planning implementation, e.g., “good to have time to plan delivery”; “day 3-4 helped to make sense of how to bring AMBIT to life as an approach”
*3 comments on valuing ''practicing tools/techniques/presentations'' - e.g., “liked practising doing the training!”; “enjoyed having the opportunity to deliver a session on mentalizing”
*3 comments on the ''usefulness of the AIM cards'' – e.g., “We were reflecting on the possible use of the aim card for younger children, with pictures. Very practical tools to be able to apply theory to practice and very useful training- thank you”; “The cards were very helpful”
*3 comments on the ''usefulness of the training approach'' – e.g., “2 facilitators helps with my own way to understand as I can get differing perspectives”; “very useful responsive facilitation. Found it challenging as it is a lot of mental work but also useful and really relevant.” “Experiential, excellent approach and tools. So very relevant to f.lives project. Excited. Hoping we can embed as soon as possible. Excellent trainers! Thank you. Beautifully model AMBIT training & trainers”
*2 comments on the ''usefulness of the Pro-Gram'' - e.g.,”Pro-Gram makes sense as a visual for all staff & utilise other professional information to help the YP”
*2 comments on the ''usefulness of Group work'' – e.g., “Group work in relevant teams is useful”; “Well co ordinated group work. Trainer approachable and helpful. Useful sculpt exercise”
*1 comment on ''usefulness of Manualization'' – e.g., “I enjoy manualising and would like to do this with the team so things are not lost.”
*1 comment on ''usefulness of providing examples'' (although there are other comments where people request more examples)
!!What is a Quick Win?
Another way of describing these are as 'low hanging fruits' - //easily achievable goals// that have obvious intrinsic value to the young person or their family.
This may be the case even though such 'wins' may not easily fit into the stepwise progression towards a previously agreed major treatment aim (see [[Formulation and Treatment Aims]]), such as completing a [[Cognitive Behavioural]] programme, in order to reduce avoidance of social situations.
If a young person expresses frustration or loss of interest in work towards a previously agreed goal, then it may be possible to preserve their sense of being taken seriously, and understood, by avoiding going to "head to head" over our different intentions, but instead to find some //other activity// that re-connects our intentions. The hope is that in feeling understood, and helped once again, the client may renew their curiosity about the potential value of other ideas (and plans) in the worker's mind (see [[Epistemic Trust]] for an explanation of the mechanism that underlies this.)
This is a good example of the principle directing workers to [[Roll with Resistance]] in [[Motivational Work]]: in order to preserve the experience of [[Contingency|Contingencies]] in what is offered, so as to preserve or bolster [[Epistemic Trust]], it may be necessary for the worker quickly to change direction (at least temporarily) away from planned work, towards more obvious, shorter-term gains.
!!Examples of QuickWins might include:
*Tidying up a chaotic bedroom (or a corner of a bedroom!)
*Filling forms for a benefits claim (may not be quite so quick!)
*Buying some new clothes (internet, shopping mall?)
*Connecting one or other parent to a relevant adult service.
*Registering with a GP.
*Simply "going for a coffee/burger" to get a breatherr, etc...
!!How to use Quick Wins
The ideal situation is to keep a stock of possible QuickWins available, so that if treatment seems to be stalling, or engagement is faltering one of these could be focussed on to keep a sense of momentum and 'potency' in the intervention as a whole.
!!!! Source:
The Reflective Functioning Questionnaire (RFQ) was developed as a brief, easy-to-administer screening measure of reflective functioning
-----
Reference:
//Fonagy P, Luyten P, Moulton-Perkins A, Lee YW, Warren F, Howard S, et al. Development and validation of a self-report measure of mentalizing: The Reflective Functioning Questionnaire. PLOS ONE. 2016;11(7):e0158678. doi: 10.1371/journal.pone.0158678//
!! Purpose
!!!''To define this term''
This is a way of carrying out research where different interventions or treatments are compared against each other, to test how effective they are.
It means that participants within the research are randomly allocated (by chance alone) to receive different conditions or interventions. Differences between the interventions can then be measured.
Participants are allocated randomly to the different groups in order to remove the chance that results will have been caused by 'confounding factors'. 'Confounding factors' mean anything about the characteristics of the participants that might influence the results.
One group of the participants are allocated randomly to a 'control group'. This means that they do not have the intervention. They may receive something else like 'treatment as usual' or simply nothing at all. This allows comparison of the treatments against 'no treatment'.
''Blind and double-blind randomised control trials''
A ''blind trial'' is when the participants are allocated randomly to an intervention but ''they are unaware of which intervention they have been are allocated to''. For example, in a test comparing medication effectiveness, participants are given one of some different medication but do not know which one they have been given. One group may also be given a 'pretend' medication (placebo) as the control condition. The idea is that if participants are aware of the condition, their expectations, motivation or beliefs about the intervention can impact on the results.
A ''double-blind'' procedure is when both the participants and the researcher are unaware of which condition people have been allocated to. Here the idea is that it helps remove bias from the researcher, whose own beliefs or ideas about each intervention might impact on how they carry out the research.
Using scales (0 to 10, for instance) is a helpful way of measuring progress or testing the notion that //"Nothing will change"//, and fostering [[Self-efficacy]] in that small changes are marked and even a small change implies some control, where perhaps none had previously been believed possible.
The use of a rating scale encourages externalisation of the problem, or reflection upon it in a way that fosters [[Mentalization]].
When using rating scales it is important to RECORD the scores - ideally in a visual way such as a graph, but alternatively on a table. This can be positively reinforcing if a young person begins to see change 'in black and white'. It also emphasises the [[Cognitive Behavioural]] stance of therapist and client acting as joint enquirers/scientists, rather than expert and patient.
!!Stress management
Rating scales can also be used in more immediate ''stress management'': spend some time getting a 0 - 10 scale "personalised" with short "portraits" of what a stress level 2, 3, 4...7, 8, 9 look like in this client. A sentence or two that gives an example of what that level of stress feels like will help a young person to "calibrate" how they are feeling against their own experience. Such a personalised scale could be printed out on a small card and carried around if that helps. Then specific relaxation techniques (such as [[Progressive Muscle Relaxation]] or techniques to manage [[Panic Attacks]]) or [[Anger Management]] approaches, can be tied to specific rating scores, giving the client a menu of possible responses.
!!Motivational work
Scales can also be used as a key technique in exploring and clarifying in [[Motivational Work]]:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/-Mmq1epK9d4?rel=0" frameborder="0" allowfullscreen></iframe></html>
This is a useful behavioural technique for managing panic symptoms where there is evidence of over-breathing, that leads to frightening sensations (commonly tingling in the hands/lower arms or around the lips and mouth). These sensations can be alarming to the sufferer, which can add to the anxiety (a vicious circle.)
!!PsychoEducation
*Explain that panic is horrible, but not actually dangerous (though one of the symptoms of panic is often fearing that you are about to die.)
*Explain that panic is a natural process, and just an exaggeration of ordinary healthy mechanisms.
**When you are anxious your brain sends messages to the ADRENAL GLANDS which produce ADRENALINE.
**Adrenaline makes your heart beat faster and you breathe faster. This is all very useful if you are in a dangerous place and might be required to face, say, a tiger - but in a panic attack this //natural reaction// (note the stresson this being a normal, natural process) becomes unhelpful. In a panic attack it makes you think and feel as though you cannot get enough breath, when in fact the opposite is true - you are over-breathing and that is making you feel worse!
**When you breathe, you take in Oxygen and blow out Carbon Dioxide (like a car exhaust) - so far so ordinary.
**Carbon dioxide in your bloodstream keeps the blood at just the right level of acidity. When you blow out //too much// Carbon dioxide (when you are panting out of fear, but not actually making more Carbon dioxide by running/fighting) then your blood becomes slightly less acid than the nerves are used to - and they start to tingle...
*THIS FEELS ODD/SCARY BUT IT IS NOT DANGEROUS.
!!The Solution
#Introduce a "highly technical piece of equipment" - a brown paper bag!
#If you scrumple and unscrumple this it becomes more pliable.
#Explain that the young person can keep this "technical equipment" in their purse or back pocket, and nobody will ever know what it is really for.
#If they feel panicky and are over-breathing (//"hyperventilating"//) then they should breathe in and out of the bag for a couple of minutes.
##By re-breathing their own Carbon Dioxide they will quite quickly replace the lost acidity, and the tingling will go down.
##Concentrate on slowing the breathing down, count 1,2,3 after each in-breath and each out-breath.
##Take a breath of fresh air every couple of minutes - you cannot starve yourself of oxygen in this way - it is a very safe method of repairing what medics refer to as the "acid-base balance".
Use the [[Progressive Muscle Relaxation]] to supplement this, and to try to maintain anxiety levels at a lower level.
Retraumatization is a term used for two different phenomena.
It refers to the situation when a client experiences the same or similar traumatic event repeatedly. An example of this is a child or young person who experiences physical abuse repeatedly over a period of time.
It can also refer to the experience of re-experiencing a trauma when this is triggered by specific environmental cues or by being asked to recall the traumatic event itself. This type of re-traumatization may be experienced as equally or even more severe than the original event.
The intention of trauma informed services is to reduce the risk of re-traumatization through applying principles of safety, collaboration, empowerment, choice, trustworthiness.
Specific treatment of trauma through evidence based treatment such as [[Trauma-focussed CBT]] may also reduce the risk of re-traumatization. However, many children and young people may not have access or may not choose to have therapy for their trauma.
Contextual support for children and young people may involve providing psychoeducation of trauma for workers, carers and parents. Mentalization based approaches to trauma would aim to enable the client to develop an understanding of the way that their mind reacts around the trauma experience and how it easily leads to non-mentalizing states. A mentalization based approach to trauma tends to include a recognition of the role of attachment in regulating emotion which may distinguish this approach from more cognitive focused treatments.
<a class="tc-float-right">[img width="150" [RS.PNG]]</a>
!!!AMBIT Lead Trainer and Specialist Project Worker
Rebecca is an AMBIT Trainer and Specialist Project Worker at the AFNCCF.
<div style="clear:both;line-height:0px;"></div>
This is a manualizing of a recent method of facilitating the [[Sculpting a Network|Sculpting a network]] exercise that has worked well in training. Previous instructions on this exercise can be found on the page [['Sculpting a Network'|Sculpting a network]].
!!__''Setting up the exercise''__
Invite one group member to describe a client scenario from their experience. This person will work with the AMBIT trainer to sculpt the network.
Facilitator to remind people that this is not about solving the case – do not fall into making suggestions or trying to fix or getting caught up in asking for more information about the client.
!!__''Listing the network''__
Facilitator to write up on the flipchart the list of all the people involved in the network (professionals and relevant family and friends), by asking the worker to name them.
Facilitator then invites volunteers from the group to take the positions of different people in the network. First, choose someone to be the client and place them at the centre. Then place someone in the position of the worker who is bringing the case (the actual worker who brings the case does not participate physically in the sculpt).
!!__''Build the sculpt''__
Build up the network by working through the list, asking the case-holding worker to position the different people in relation to the client, according to their best guess of how the client might see it. Give each person in the sculpt a ''post-it'' to remind them and others of who they are representing in the network
* Close relationship - sit them close together, looking at each other
* Distant relationship - sit them far apart
* Consider whether you want them seated "facing"or turned away from each other, etc, etc
!!__''Reflecting on the sculpt''__
Once the network is sculpted "as it is", ''stop and pause for a reflection''. Trainer to remind the group that you are not asking people to PROBLEM SOLVE or ASK QUESTIONS RELATEED TO THE CASE, but to stop and look at this network and reflect on:
*What thoughts and feelings is this bringing up for people in the room, seeing this network sculpted out?
*How do the group think the client might be thinking/feeling about this network?
*How do the group think other people in the network might be experiencing this?
''Hold the boundary'' of sticking to the reflections – part of the purpose is to offer people a chance to connect with what kind of experience of help we end up creating around a client. Does this seem like a helpful way of organising care?
!!__''
Re-sculpting the network''__
Next, move onto consider how this network might be arranged to increase the likelihood that the client might experience it as more helpful. A way of structuring this part of the activity might be to
*Invite the case- holding worker to think about whether who within the network the client might trust – is there an obvious [[Key Worker]] or is there a lack of a key worker?
* After this has been established, who might they move to be closer to who?
* Who might they take away?
Again, this is not about solving the case, but is about ''empowering'' the case-holding worker to see it is as within their role to INFLUENCE how the network around clients might look (see [[Key worker]] responsible for integration). Acknowledge that it may not feel so possible in “real-life” to make these changes, but to make a plan about how they might want the network if it were going to be experienced as useful is a helpful starting point. Secondary to this, the worker could think about HOW this might be possible to influence. (Sometimes we get stuck with the feeling that we can’t change it and therefore never make attempts to try to plan what it is that we might want to do).
The key message to leave the group with, from this section of the exercise, is that they should feel that it is within their influence to think about how they would like the network to look and to make a plan about how they might support this to happen (often a gradual process, rather than a one-off re-organisation).
To reciprocate is to "return in kind" - this implies the kind of //to-ing and fro-ing// that human relationships are built on. The development of [[Mentalization]] requires sensitive reciprocity from trusted attachment figures - which reduces the experience of [[Non-contingent]] communication, that babies (or indeed all humans) find aversive.
The content of this tiddler should be customised by each team using this approach.
These comments are representations of the workers thoughts but they are offered as somewhat tentative statements that could be seen as examples of what AMBIT has referred to as [[Broadcasting Intentions]], or as examples of the kind of "transparency" of thinking that is part of the [[The Inquisitive Stance]]:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/w1GztzhYxwQ?rel=0" frameborder="0" allowfullscreen></iframe></html>
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/YSbYGdhK7S0?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!What was that like?
!!{{$:/images/fa5/brands/youtube}} Practitioner reflections on Thinking Together
Here we see Charlie and Laura, the actors in the thinking apart and together role plays, talking as themselves about their experiences of Thinking Together as practitioners.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/rrPNer2c5rs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
These are trainers' reflections on the training for International teams made in October 2016
!1. Link slides to manuals pages.
* Make content consistent in the summary in the manual with the slides.
* Demonstrate manualizing by demonstrating learning by trainers during the training.
* Model the process of learning:
** Mark learning, because the trainees will not know what we are learning if we dont show it. Encourage similar process. Highlight our learning by doing stop and rewind process.
** Collaborative learning process. Stop the teaching session. Highlight learning. Making explicit new thinking. Whole group reflect on the learning. Record the learning in the manual.
!2. Day 1 of the training
* Recognising existing expertise in a very explicit way.
* Exercise of describing a case from the position of 'I am.........'
!3. Teaching Mentalizing
...Should take place //before// the introduction of the wheel
...Day 1 Introduction to wheel is very important.
Proper introduction needs to be done. Allow an hour to describe the wheel. Do not rush.
!4. Training on //training// (Day 4).
Each team had time to prepare day one of their training. How would they start talking about AMBIT and sharing it with the team.
Role playing of the training of day 1 with the team.
Role playing the other members of each team by the rest of the group.
Team members were mentalized by the group and then teams practiced a training session with the rest of the group playing team members based on information by the team members.
Reflections on role play that allow rethinking on how to organize this day one taking into account the dynamics that were explored in the role play.
!!Definition
A Quorum is a group of people who are empowered to perform a specific task.
The Reflective Quorum is an example of how two of the core features of AMBIT ([[Core Features of AMBIT]]; [[Mentalization]]; [[Keyworker well-connected to wider team]]) underpin the practical application of an AMBIT team. There is related material at [[Rituals and Disciplines]], including those under the heading of [[Thinking Together]].
!!Mentalization and the Quorum
The notion of the quorum refers to the way in which the team, and its wider SupervisoryStructures adopts a distinct ''culture of interaction''. The assumption is that talking to somebody //''with whom I have a working relationship''// helps me to regain/sustain my mentalizing capacity. (This is a contrast to many 'Duty systems' where junior practitioners may discuss cases with seniors who they have not actually worked with, or do not actually know.)
The team develops clear and explicit [[Rituals and Disciplines]] that are not rigidly defined by the model (although some are offered), but which should be considered and selected ''explicitly'' by local teams, and written in to their version of this manual.
The Reflective Quorum //marks out very clearly the presence of a "mentalized focus"// to discussions about case material (see also [[Thinking Together]].)
An //example// of the kind of ritual that we are talking about might be something as simple as framing these specific conversations with the statement:
//"Can we agree that we are quorate to discuss this here and now?"//
or //"I need help mentalizing this particular situation"...//
For further description, and recordings of local team agreements, see [[Rituals and Disciplines]]
From a team culture point of view, the emphasis is that:
>//"This is how we work - we talk to each other all the time, because it helps us to think more clearly in situations where is is difficult to think straight."//
!!Reflective Quorum and AUTHORITY
In practice a 'Quorum' is ''the number required for a group to have delegated authority to act in a certain circumstances.''
For instance, Town Councils may debate whether or not they are "quorate" to make //specific decisions// about street lighting if the "street furniture expert" is on annual leave...
A different analogy is the case of questions of "capacity to consent":
>This refers to whether or not a person is able to take legal responsibility for agreeing to a treatment that a doctor or therapist offers. Now, this is always and only //in relation to a specific procedure/question// (i.e. I may be seen as having capacity to consent to having a tooth removed, but at the same time (if I had, say, a psychosis with delusional beliefs about my leg being controlled by aliens) I would NOT be seen as having capacity to consent to a leg amputation that was offered me by an enthusiastic but misguided surgeon.)
!!Situation specific
The notion of whether keyworkers are "quorate" when they discuss a clinical problem is //situation-specific// - they may be quorate to decide on one question, but not on another.
*We acknowledge that multiple perspectives add to the likely accuracy of the picture/understanding.
*On the other hand reality frequently impinges and not all members of the team can be present for all discussions.
Thus two practitioners discussing an issue via mobile phones may be agreeable as quorate if both parties are confident that they have considered:
#The potential risks associated with what they are discussing.
#The limits to their own capabilities.
!!Not Quorate?
When practitioners decide they are NOT quorate:
If the nature of the problem, or practitioner-evaluations of their own capabilities, suggest that the involvement of a third person or even wider group, then decisions will have to be postponed until this can be arranged.
This is not so different from best practice in well-functioning teams, and in that sense is merely the making explicit what is often implicit.
!!Using technology
We advocate the use of technology to help form a Reflective Quorum - Technologies such as hands-free or speaker-phones (included on many/most mobile phones nowadays) can help to deliver "instant" quorate groups.
Teams may wish to consider the value of contracting formal ''"conference-call"'' facilities on their telephone network as another alternative: this is a reasonably cheap and very effective technology, that is probably easier to use than face-to-face video chat services such as Skype, Webex, etc, although some teams use these latter to good effect.
Reframing is the technique by which the [[Key Worker]] changes the conceptual and emotional setting in which a situation is experienced and places it in another frame which fits the 'facts' of the same situation equally well, if not better, and thereby changes its entire meaning and thus potentially the behaviours of the participants.
''One of the keyworker's intentions, when reframing, is to change from a frame that is implicitly unalterable, to a frame that is implicitly flexible and open to change.'' Changing the frame of reference against which a given event is perceived, also changes how it is judged. With the attribution of meaning comes a value judgement - the assigning of a given value in accordance with a variety of different "scales", such as healthy-sick, sane-mad, physical-psychological, personal-interpersonal, good-bad etc. Such judgements have a tendency to pin down individuals and families to fixed roles, resulting in specific patterns of interaction. Relabelling a psychotic young person’s seeming withdrawal in the home as "autonomy", or - in other circumstances - as a "way of producing closeness in the family that would otherwise not exist" can have dramatic effects on family interaction.
In practice, reframing interventions may take the following form:
*Describing observations regarding the family's interactions and communication patterns, with special reference to quantity, quality and direction of communication; affective tone; boundaries, coalitions and alliances. Such a description is, strictly speaking, not a "re-frame", but an initial "frame" in that it deliberately singles out and names a specific interactional sequence which may then, at a later stage, be referred to when re-framing it.
Example: //"I notice that you don't look at one another when you talk to each other. Is that helpful?"//
*Outlining identifiable (positive) 'functions' of the symptom (i.e. protection of aspects of the family organization from the change due to family life cycle development and other crises of loss or addition)
Example: //"Some people have elaborate explanations, others take breaks or holidays, and others get depressed"//
*Putting forwards thoughts about what might be the 'risk' to the family of losing the symptoms (i.e. fear of break-up of marriage, pain at the loss of special closeness, dread of taking responsibility for current situation or past disasters). This is based on the assumption that people make the best choices they can, given the constraints of their situation; this means that a known distress may seem preferable to a feared consequence of change.
Example: //"Perhaps you are afraid to improve too quickly because your partner could say to you: if you can do X now, how about doing Y and Z etc as well...he could suddenly make too many demands on you"//
Some reframing may attend to the developing relationship between the family and the [[key worker]], and the implications of change for that relationship (including the cessation of therapy).
Reinforcement describes how controlling particular [[Contingencies]] may affect the repetition of particular behaviours - what is confusing is that BOTH Positive and Negative Reinforcement //encourage// a behaviour.
''Positive Reinforcement'' is where the contingency (i.e. the response to a behaviour) is pleasant.
>//A simple example of this is one of the effects of drugs, which is of inducing euphoria.//
''Negative Reinforcement'', is where an unpleasant experience is removed as a result of the behaviour.
>//Staying with the same example as above, drugs may also remove pain, anxiety, and the unpleasant symptims of withdrawal. This is a powerful [[Reinforcement]] of the drug habit, although the "reward" is the removal of something unpleasant, rather than the delivery of something pleasant.//
!Using this:
The [[Key Worker]] can use [[ABC Diary-keeping]] to analyze what might be the Reinforcers that are supporting a particular behaviour, and use this knowledge to plan simple behavioural interventions, which involve changing the Reinforcers, so that different [[Contingencies]] exist.
>//''For example:'' Anton has rages, when he is destructive and abusive. After this he becomes tearful, and he receives comfort and support from his mother who hugs him. If the hugs act as a Positive Reinforcement, then a change would be to ensure that anton's mother gives hugs when he is behaving well (not in a rage) and that she expresses her sympathy and a wish to be helpful without lengthy hugs directy after a rage...//
In respect of the [[Stages of Change]], this describes the falling back into prior (harmful) patterns of substance using behaviour.
In respect of a major mental illness such as [[Psychosis]], it describes the recurrence of more florid patterns of illness.
It is important that in either sense of the word, Relapse is not to be seen as //failure//, as it is common - and many successful treatments occur after one or more relapses.
[[Relapse prevention]] work and plans drawn up as part of [[Crisis Contingency Planning]] are an important part of sessions once the possibility of stable change is made real.
!Purpose
To lay out the basic principles and practice of a Relapse Prevention intervention
!What is Relapse Prevention?
Relapse prevention refers to the work that should go into setting up plans to maintain good mental health once an acute crisis has been brought under control.
Unfortunately it is a fact that many mental health conditions recur, although this is not inevitable. May factors contribute to determining whether or not a mental health condition recurs - some are not easily 'treated' (for instance a strong genetic predisposition), where as others can be addressed. In particular, some of the the commonest TRIGGERS can be learned, and avoided (commonly these are things like high stress, sleep deprivation, drug or alcohol use, and high [[Expressed Emotion]] in families.)
!First
Check that the present is seen as preferable to the recent past ([[Reviewing change]]):
!Introducing Relapse Prevention
>//"You have done really well in the way you (and your family) have responded to such a difficult time - and I am really glad you say you are feeling things are a bit better. Now, here is the headline... GETTING WELL is very important, and it seems to us that you are doing very well at that... but now we need to think about something that is ''at least'' as important, and that is the tricky business of STAYING WELL - because we know from working with lots of young people with similar problems to your own that these problems can have an annoying habit of coming back again if we don't spend some time fixing up a plan to prevent that... Do you think you are up for doing some simple stuff about helping yourself to stay well?//
Relapse prevention consists of 2 key steps, and then there is always useful [[Family Work]] to support this:
!1. RELAPSE SIGNATURE
Agreeing on and define the likely RELAPSE SIGNATURE is a key piece of work.
An individual's relapses tend to unfold in similar ways across time (though they are by no means always the same.) Work with the young person and network to uncover:
>//"What did the //last// deterioration into symptoms [be they psychosis, substance misuse, etc...] look like?"//
Gather information from the ''client's perspective'' and then question others to get ''family/friends''' persectives.
Using the Sort Cards (see below) the young person and therapist can invite trusted family members to comment on whether there were other signs/symptoms that may have been more noticeable to outside observers than the young person themself at that time.
#Use [[Sort Cards]] with multiple symptoms/difficulties printed on them - see [[Sort Cards]] for how to do this.
#Divide the resultant timeline into ''Early signs'' ("Amber"), and ''Late signs'' ("Red"), as well as ''Crisis signs'' ("Blue light") if required.
!2. Crisis Contingency Plans
How to draw these up is outlined in [[Crisis Contingency Planning]]. Plans should be agreed for the future, relating to each of these phases of a "typical" relapse, so that a ladder of responses is agreed, appropriate to each step of a deterioration.
''(a) Print small laminated crisis cards:''
Put the colour-coded signs/symptoms on one side of a small laminated card, and the [[Crisis Contingency Planning]] on the other side.
''(b) Consider circulation list for these cards:''
#Client (//"I don't expect you to carry it around in your wallet (though you could!) but you could maybe put it in that drawer in your bedroom where you tend to put important bits and pieces - you know the kind of place? - somewhere where you would know where to find it if you did need it again."//
#G.P.
#Family members
#Friend?
!3. Family Work
Helping the family to [[Mentalize]] a young person who has had mental health problems more accurately and reliably is important - not least because evidence strongly suggests that reducing [[Expressed Emotion]] in families is a powerful intervention to reduce relapse.
This work will consist of [[Family Work]], but usually with a special emphasis on PsychoEducation.
!!Key points of theory
* AMBIT is an approach which emphasises //the importance of relationships in promoting positive change//, so [[Engagement]] is a primary task for the worker (and the young person!)
* It makes use of [[Attachment theory]] (especially the idea of [[Internal Working Model]]s) and [[Mentalization]] (especially the related topic of [[Epistemic Trust]]) to provide the theoretical basis for this; help-seeking behaviour lies at the heart of attachment theory and research.
* There is also a fit here with ideas about [[Hidden, private or implicit theory]] drawn from the [[Implicit psychoanalytic model]] that can be seen as contributing to the [[Mentalization]]-based approaches.
!!How this fits with AMBIT
* Within this general framework, there is also interest in the specific processes and experiences of people seeking professional help for their difficulties:
** One of the assumptions of the AMBIT model is that many of the young people will have had negative previous experiences with professional helping systems and/or will have negative beliefs and feelings about such help.
** Many AMBIT practices are designed to find ways of working with clients who may have many reasons for not wanting to work with professional services.
!!!A universal 'Primary Outcome' for ~AMBIT-influenced teams?
* There are few if any generalisable treatment [[Aims and Goals]] in [[AMBIT-influenced]] teams - but ''"developing a more adaptive relationship to help" is probably one of them''.
!!Mentalizing the relationship to help
There are many ways that clients might //perceive// the help that we offer, and these may be influenced by early experiences (see [[Internal Working Model]] for an Attachment-based explanation of this.)
Our perception of what help is will trigger emotional reactions to this, and these will influence our behaviour. AMBIT takes a view that there are many different ways in which our clients might experience our help (however authentically //we// might feel we are offering it). The point is that ''understanding how young people see our help'' might in itself help us with [[broadcasting our intentions|Broadcasting Intentions]] in a clearer way //for this young person// - to enable them to accept (or "enter") help, despite their concerns or objections. In this way we are offering opportunities for them to develop new perspectives on help.
!!Diagram
<<image [[RelatToHelpDiagram]] width:600 height:480>>
This diagram (animated below) is ''not an attempt to define reality'' (which would be [[Psychic equivalence]] on our part!) but is more a "thought experiment" that tries to describe some of the commonest barriers to help that may be worth considering.
A young person may (mis)perceive help in different ways at different times. Getting to be helped requires a "[[Therapeutic Bargain]] - in which the client "takes a chance" and "enters anyway". Although she may enter through many different "doors", she may leave understanding rather more accurately the perspectives of a helper that may have been misunderstood from "outside the door". There may commonly be "comings and goings" in and out of relationship with help, rather than a "coming to stay".
*Consider ''"//different kinds of Help//"'' as being available "inside" the diagrammatic "house".
* There are four doors in and out of this house (though in reality of course there are many more)
* The three "Blocks" that stand in each doorway are as follows (from the outside going in):
#The ''Response to Help'' in terms of the ''//affective/behavioural response//'' to what they "see" standing between them and real help ...e.g. hopeless, fearful, denying, angry.
# The ''Response to Help'' in terms of the young person’s own ''//perception/construction/imagination//'' of the ''state of mind of the worker'' who stands between them and help ...e.g. helpless, useless, refusing, accusing.
#The ''Offer of Help'': A selection of potential ''states of mind that the worker might actually offer the young person'' e.g. interested and committed, holding hope that things will change over time even though ways forwards now are difficult to see, authentic and truthful (expressing confidence in the young person's self-agency, unafraid to "tell it as it is" in terms of diagnoses or reflections.
If the worker can properly mentalize the young person's authentic feelings and beliefs, right here, right now, and can //show// (in her eyes, and her manner of speech, etc) that this has been sensitively understood, then [[Epistemic Trust]] may be established, and help or learning may quite suddenly be accessible - like a door opening. There may be learning, that //"help may look unhelpful sometimes, and this can be explored..."//
The point of this thought experiment is that ''if we, as workers can more accurately mentalize our clients' experience of (or relationship to) this "Help" we are offering, then we may be more successful at __[[adapting the way that we are offering it|Adapt your Discourse]]__'', in order to make it less indigestible than unfortunately our well-intentioned offers of help too often appear. Of course, the shift towards greater mutual understanding is the work of [[Engagement]], and a key skill is how the worker can find ways of [[Broadcasting Intentions]].
!!!Animation:
<html><object width="640" height="480"><param name="movie" value="https://youtube.com/v/SGBZt1W1TnE?version=3&hl=en_US&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/SGBZt1W1TnE?version=3&hl=en_US&rel=0" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!Welcome the Coming and Speed the Going
(With thanks to Dr Paul Caviston for this quote)
Note that the end point is not the young person "__taking up residence__" in the help centre, but taking what is on offer there to set off on the next stage of her journey. This echoes the ancient "code of conduct" described in Homer's //Odyssey// which all dwellers in the Greek islands held:
>''"Welcome the coming, speed the going"''
This code dictated how islanders were obliged to behave towards sailors who were shipwrecked on their shores (which must have been a pretty commonplace event back then.) The duty was to provide hospitality, repairs, and to stock the ship for the onwards journey. See also [[In my beginning is my end]] for how this approach might be used clinically.
My Avenue to Help - The MAP Project
This project is led by Professor Pia Jepperson, Dr Janne Walloe Vilmar and Stefan Locke Jensen. Pia is a child psychiatrist but also based at the University of Copenhagen. Janne and Stefan are service leads in child mental health in the municipality of Roskilde.
There is a wider steering committee for this project which Peter Fuggle has been invited to be part of. From the AMBIT Programme point of view, Peter is the link person with this research programme.
The project is potentially for several years with a feasibility study between 2024-2027 with the explicit aim to develop locally attuned materials and measures and to test the feasibility of using these in a research trial. One aspect of this is to write their own AMBIT manual which they are calling their own AMBIT Playbook.
<center>{{Stance-RespectEvidence.JPG}}</center>
One of the [[Core Features of AMBIT]] is ''respect for the fact that //there is such a thing as __evidence__//'', on the basis that to ignore this would be to show great disrespect towards those whose future may depend upon the outcomes of our decisions.
<html><object width="425" height="344"><param name="movie" value="https://www.youtube.com/v/zHWXq1CctxQ?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://www.youtube.com/v/zHWXq1CctxQ?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
As the phrase suggests, AMBIT strives to orient itself to reality, and to facts that are proven, rather than a particular clinician's opinions or wishes. This is entirely consonant with [[Mentalizing]] practice, which promotes a curious inquisitive //tentative// stance - open to learning and avoiding the assumption of knowledge without evidence ([[Pretend mode]] functioning.)
!!!There are [[Training Exercises for Respect for Evidence]] in this manual.
Evidence can take a variety of forms; different pieces of evidence are different not only in how much respect they command, but also in their applicability to a specific situation at a specific time. This work is an inexact science, but [[Evaluating outcomes]] lays out the rationale for integrating the day-to-day therapeutic tasks with regular, robust outcomes measurement. Of course, in the hierarchy of evidence applicable to the developing content of the AMBIT manual, properly conducted trials and systematic reviews are at the top. Outcomes evaluations from teams working in the field constitute a valid and important step towards developing and conducting such trials.
Respect for evidence is applied in AMBIT in three ways:
!!(a) Manualization
Firstly, the approach takes seriously the need for [[Manualization]]. The [[AMBIT]] approach is manualized, using highly innovative web-based documentation (see [[User Guide]]), in recognition of the fact that evidence points to improved outcomes for interventions that are manualized, as opposed to 'reactive' or eclectic approaches (Huey et al, 2000), and where fidelity to the model is high.
!!(b) Evidence-based interventions
Wherever possible we use [[Working in multiple domains]] to deliver interventions which are ''evidence-based'', or adaptations of these to fit them for the non-standard settings they are delivered in. The [[AIM questionnaire - interactive version]] embedded in this manual will generate a range of [[AIM suggested interventions]] from the scorings you enter into it about a particular young person, and there is advice on how to think about WhichInterventionWhen (please note this function of the manual is currently under development).
It is accepted that in some such settings (home-based, street-level), there is not yet sufficient trial evidence to assert effectiveness, so that the phrase 'evidence-oriented' is rather more fitting at this early stage than the rather over-used 'evidence-based'.
As regards the evidence for home-based, multimodal, assertive models of practice, we acknowledge the huge role played by MST (Multisystemic Therapy) in developing a rich literature on this area of work. It is helpful to consider some of the [[Differences between MST and AMBIT]].
!!(c) Regular, systematic Outcomes measurement
See [[Evaluating outcomes]].
!!And finally...
Making sense of evidence is helped by an understanding of the skills of critical appraisal - how to read a scientific paper, so as to understand its reliability and validity, and in particular its relevance to one's own clinical practice. We don't explain these skills here, but why not sing about it... with thanks to James ~McCormack (and Prof Peter Fonagy who pointed this little gem out):
<html><object width="420" height="315"><param name="movie" value="//www.youtube.com/v/QUW0Q8tXVUc?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/QUW0Q8tXVUc?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
A stance of respect for local practice and expertise is one of the [[Core Features of AMBIT]], and there are [[Training Exercises for Respect local practice and expertise]] in this manual.
<html><object width="425" height="344"><param name="movie" value="https://www.youtube.com/v/mNUJg4LMEkU?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://www.youtube.com/v/mNUJg4LMEkU?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
Consistent with a [[Mentalizing]] stance, AMBIT adopts an explicit sensitivity and respect towards the local service ecology; for instance, local Social Work departments, Youth Offending Services, Medical services, Education, Housing departments, etc.
The aim is to build on strengths and existing local expertise ([[Scaffolding existing relationships]] as it were) and this is reflected in the process of [[Manualization]], which asserts the value which existing local expertise in a team will add value in terms of //how to implement// other evidence-based ways of working, or AMBIT-influenced practices //here, in this specific locality, amongst these specific organisational constraints//.
Much of what a successful team is already deploying locally with success will be expertise that offers value for other teams working in similar settings, or with similar target groups. This explains to some extent the high value that AMBIT places on its [[Community of Practice]]. AMBIT's TiddlyManual format allows for a "__co-construction__" of evidence-based practice and practice-based evidence, and moves away from the monolithic 'one-size-fits-all' approach that has characterised many manualized approaches before.
What this means is that AMBIT workers deploy their [[mentalizing|Mentalization]] skills ''not only'' towards:
* Young people and families
* Their team colleagues (the [[Keyworker well-connected to wider team]] is another of the [[Core Features of AMBIT]])
''But also'' in relation to:
* The local service ecology (other agencies and professionals working with the same client group.)
This means making a positive and explicit efforts (adopting this as a deliberate staff culture) to avoid 'polemic positions' (//"Social workers are ALWAYS doing this to my clients...!"//, or //"Typical GP!"//), instead [[Addressing Dis-integration]], for instance by using the [[Dis-integration grid]] to clarify one's own ('mentalized') understandings of local practitioners' positions.
!!AMBIT is never a stick to beat other practices with...
A huge amount of investment goes into training and developing models of practice, and developing the outcomes evidence that supports these. For a new model or approach to arrive in a locality and unintentionally (or, worse, intentionally) undermine or damage an existing model of practice that is working well, would be a serious "side-effect" of the training intervention.
AMBIT is expressly designed to //avoid// such unintended consequences. Indeed, any active attempt to use AMBIT as a "stick" to beat other methods and practices in a kind of "treatment models turf war" would be an extremely non-mentalizing use of these materials and theories.
!!Training
The training of [[AMBIT]] increasingly tries to recruit LOCAL specialists to deliver training on specific interventions during team trainings, or to deliver AMBIT training. There are [[Training Exercises for Respect local practice and expertise]] in this manual which we encourage [[AMBIT Lead]]s and others to practice.
!!Experts by Experience
Another area of Local Expertise, is of course that of the Service users - who are "experts by experience". The constant harvesting, learning from, and adaptation of a service in relation to service user feedback is thus a key part of the practice that flows from this principled stance.
An overarching theoretical assumption of our approach is that at the point of contact with our service the family and/or surrounding system may have temporarily lost its capacity to tolerate the young person. Hence the intervention is focused not merely on addressing the young person's condition, but also on reinforcing the aspects of family function or wider social ecology that have faltered in the face of intrafamily and social challenges. Getting this environment back into more collaborative and [[contingent|Contingencies]] relationship with the young person enables what we refer to as the IntegrativeContext. This is a very practical example of one of the [[Core Features of AMBIT]], which is [[Scaffolding existing relationships]].
A fundamental aim of the intervention is to prevent the family's abdication of responsibility for the YP. In that context, a range of theoretical frameworks offer explanations why the family might wish to give up this responsibility, and we aim to include all these frameworks as possible contributors to defusing the family crisis.
At the end of the [[Thinking Together]] exercise, there must be a return to the overarching Task...
!!START Boundaries.
In this respect is is helpful to remember the ''START boundaries'' of around any task (these are described at [[KeepingYourBearings]]).
*Space
*Time
*Authority
*Responsibility
*Task
!!The Task in Thinking Together
All Thinking Together has a task that relates back to the search for some kind of product (a ''decision'', an ''intervention'', an ''understanding'', etc) that ''offers promise as help'' for the client/family.
!!The previous stages are a DELIBERATE SUSPENSION of this task-focus..
To enable what we refer to as //"the curious exploratory play of ideas..."//
So to end the exercise there must be a return to this purpose.
!!If no progress is made...
If a decision cannot be made, or an understanding is not reached, etc, then the practitioners will decide if the [[RiskAssessment]] is at a level that leaves them "quorate" (see [[Reflective Quorum]]) to make decisions about postponing this decision, or if widening the Quorum is required right now, and who else might be required to advance the management of this problem. They may need to resort to formal SupervisoryStructures and/or EmergencyProcedures, or they may be able to agree a process to carry forwards their thinking to, say, one of the next [[Team Meetings]].
It is important to look back with the young person (and family) to build a narrative of "what has happened since our paths met"...
Narrative coherence is an indicator of successful mentalizing ([[SELF REPRESENTATION]]).
This ties in with the notion of recognising a relapse signature and developing a drill to address this - which is part of [[Relapse prevention]].
!!{{$:/images/fa5/solid/book-reader}} What to do
*Get into 4 groups (see below) and take a quadrant each.
*In pairs prepare a 3 min overview explaining one quadrant and the stance featured in it.
**This can include bits of theory or tools that can be used in this quadrant.
**Explore the manual to find content to help you:
***[[Working with your TEAM]]
***[[Working with your NETWORKS]]
***[[Working with your CLIENT]]
***[[LEARNING at work]]
* You have 30 minutes to prepare.
{{AMBIT wheel 2014_SMALL}}
!An analogy
We use this analogy to explain AMBIT's use of Mentalizing in supervisory or consultative relationships:
[img width=600 height=400 [Ripples_picture]]
A stone thrown into a pond creates a predictable pattern. At the centre of the disturbance, the water is chaotic, patternless, and this is analogous to the situation that the [[Key Worker]] finds him or herself in when working up close to a young person and family in crisis. In such situations it is difficult to see what is happening, why, and where it is likely to lead.
For an observer on the bank, however, a more predictable, patterned response is clearer: the further out from the original splash, the more the chaos at the centre resolves itself into smooth, outward-flowing circular ripples. These travel at a predictable speed, etc, and on the grounds that what can be //understood// or predicted can also better be //withstood//, the observer on the bank can feed useful information back in to the [[Key Worker]] at the chaotic centre.
This is key to the notion of SupervisoryStructures in AMBIT, and in particular informs the practice of [[Thinking Together]], as well as the [[Reflective Quorum]], as well the notion of the MetaTeam.
A similar example is the [[Dive Boat]] analogy.
!!Purpose
Explain why risk assessment is important and provide a downloadable assessment. Suggest a training exercise to practice using this.
!!Why assess risk
Risk Assessment is a key part of good clinical practice and [[Managing Risk]] is one of the [[Core Features of AMBIT]].
A clear framework for enquiring about risk - especially those risk factors that research has proven to be significantly associated with poor, even fatal, outcomes guards against mised opportunities to prevent preventable harms. //There is no evidence to suggest that asking about risky behaviours or other risk factors actually increases these risks.//
You can go to the site directly by clicking [[Here|https://docs.google.com/open?id=0B5h_CVBdhJPYYWFjYjYxZjEtMzg3Mi00ZjAzLWEzZTEtNjI2MDlhZDVhZDYz]] or see a preview of it below:
<html><iframe src="https://docs.google.com/file/d/0B5h_CVBdhJPYYWFjYjYxZjEtMzg3Mi00ZjAzLWEzZTEtNjI2MDlhZDVhZDYz/preview" width="640" height="480"></iframe></html>
!!Training practice:
* Form a small groups (or work with a partner) where there is some shared knowledge about a young person.
* Complete a Risk Assessment together on this young person.
* Discuss the process of arriving at this assessment, and your results.
* Consider a basic risk management plan
* Now review the client's notes and compare what you have come up with, alongside what is presently recorded.
In managing risky clients', it is likely that workers can at times feel out of balance.
There can be a tension between trying to scaffold and develop relationships that are there (attuning to the client and their network), with the need to use more clear and at times decisive risk management procedures. This can be a complicated balance to negotiate in face to face work.
Closely related to this balance, is the notion that many teachers and therapists describe the dififuclty of knowing when to challege and when to offer support in bringing about therapeutic changes with clients (Sanford, 1966).
In thinking about this balance, we suggest that it is helpful to see the process as finding a pathway balancing between:
* ''CONTAINMENT'' (nurturance, safety, responsivity, sensitive attunement)
and
* ''CHALLENGE'' (promotion of concrete changes, termination of non-mentalized [[Pretend mode]] patterns of behaviour, etc).
The important point is to avoid an overly rigid position, but to maintain a thoughtful ([[Mentalizing]]) journey towards change.
The graph below attempts to highlight this balance.
[img[https://lh3.googleusercontent.com/-KEiI90D-FRI/URIYCmnyUwI/AAAAAAAAGqw/iWWYcAgP-7I/s912/ActivePlanning-RiskManagement.jpg]]
Too much focus on containment and attunement to the client without any introduction of new perspectives, differences or challenge may be seen as falling within the 'fan club position'. Whilst overly adopting a position of challenge and introducing differences to the client might be experienced as being a 'persecutor'.
Rather than avoiding either of these (known as an 'abdicator role') we would want to find a balance between these two points. In the journey towards creating an effective therapeutic relationship there are likely to be times when the workers' estimations about the right level of challenge turn out to be wrong. At these times the client may experience being pushed too hard or being misunderstood. The worker acknowledging this and taking responsibility for these episodes, showing genuine motivation to understand better for next time is critical in the process of continuing towards change.
The above theory is adapted from N. Sanford, Self and Society: Social change and individual development, 1996.
For further material on this, see the dynamic balances involved in [[Active Planning]], and [[The Therapist's Mentalizing Stance]].
Please see here <<tag [[Risk of suicide]]>> for sub- topics under the heading Risk of suicide
!!What is the target group for risk support?
In THRIVE this is defined as:
* those children, young people and families who are currently unable to benefit from evidence-based treatment but remain a significant concern and risk.
*This group might include children and young people who routinely go into crisis but are not able to make use of help offered, or where help offered has not been able to make a difference;
*who self-harm; or who have emerging personality disorders or ongoing issues that have not yet responded to treatment.
!!Key elements of risk support practice
#''Shared agency responsibility:'' a principle of sharing Vs. 'passing around' the risk via processes of discharge and referral.
#''Supporting trusted relationships:'' this is directly connected to (and inherited from) AMBIT
#''Team around the worker:'' This at least in part addresses the 'how' of shared agency responsibility
#''Making referrals 'relationally':'' Referrals if they are made at all will be made with //conversations// or //meetings// between workers, and wherever possible with the client/family involved (as opposed to 'at distance' referrals by letter/email/form...)
#''Having a shared risk support plan:'' This is a THRIVE/AMBIT principle that relates to making the helping network EXPLICIT (who do you go to for problem type-X or challenge type-Y?)
!!Introduction
Attention to [[Managing Risk]] is one of the [[Core Features of AMBIT]], and this is one of the key features of [[Governance]] in general.
* This page is about the actual process of ASSESSING risk
* See [[Managing Risk]] for broader discussion on how to think about and position yourself in relation to the risks in this work
!!Resources
There are many standardized risk assessments available, and while AMBIT would recommend that //one// of these is used, it does not take a line on which one is best suited to the different environments in which AMBIT supports work. Local services may have their own Risk Assessment paperwork, and (in keeping with our stance principle of [[Respect local practice and expertise]]) we do not seek to replace risk assessment these if they are already well embedded in practice; however, we do offer a version of a risk assessment in this manual.
* There is a [[Risk Assessment - paper form]]
* This offers a paper-based version of the same assessment that is built in to this manual for use
!!To record/update a Risk Assessment:
* See the [[Risk Assessment - paper form]]
*Remember that Risk assessment is an ONGOING PROCESS rather than a once-off exercise - see [[Managing Risk]].
*Any substantive change in circumstances should prompt a revision of the Risk Assessment.
Working as an individual [[Key Worker]], or as a whole AMBIT team, requires a very clear set of Rituals and Disciplines ''that collectively define the Team's CULTURE''. These are ways of talking about problems, and behaving in certain circumstances that the team collectively "signs up to".
!Why?
There are three main reasons for this:
!!1. Shared culture = less misunderstanding
Having shared understandings of what certain phrases mean to each other (a [[Cultural Context]]) minimises the likelihood of misunderstandings. In managing high risk young people, this is the most obvious benefit.
!!2. Marking and mentalizing
Second, Rituals have much in common with the concept of [[Marking|Marked mirroring]] that is how mentalizing starts (or may be re-started.)
!!3. Well-connected
Third, sharing certain practices and phrases offers some reassurance to individual team members that this could be a "well connected team" (see the [[Core Features of AMBIT]], which include [[Keyworker well-connected to wider team]].)
See <<tag [[Rituals and Disciplines]]>> for sub-topics that list the various key Rituals and Disciplines that work towards this goal.
!!What is this?
There are 3 specific roles in an AMBIT-influenced team meeting - the ''Chair'', the ''Team Learning Support Worker'', and the ''Scribe''. This page describes the role of the Chair. See also [[Role of the Team Learning Support Worker]] and [[Role of the Scribe]].
!!Ordinary aspects of chairing
Ensure that:
* The meeting runs to time
* Different people's perspectives are heard respectfully (Dialogue as opposed to Discussion)
* Disagreements are mapped and tested (Discussion rather than Dialogue)
!! Additional explicit roles for the Chair
In an AMBIT-influenced team there are some extra roles:
!!!(a) Ensure that no discussion starts before the team has [[Marked the task|Marking the Task]]
!!!(b) Offer occasional but regular real-time commentary on the conversation
* The intention is to [[Mark|Marked mirroring]] what kind of conversation the team are //currently// (in-this-moment) engaged in:
** Engaged in ''__the task-in-hand__'' (in doing this they are frequently engaged in [[Implicit mentalization]] - getting on with the task of helping their colleague answer a question/manage specific concerns, etc
** Engaged in ''__Team Learning__'' (this generally involves [[Explicit mentalization]] - and links to Dialogue and the work of Peter Senge ([[Developing learning organisations]]).
!!!(c) Deciding when and where [[Manualization]] of any identified learning should take place:
* Manualizing in the middle of another previously-identified task (//"to help me get a better risk plan in place"//) might be unhelpful in achieving a [[Return to Purpose]] that answers the worker's need.
* In such cases the Chair might simply identify this as something to add to the list of [[Local Manualizing Tasklist]] for manualizing at a later date.
* At other times, it may be appropriate to record the team's learning there and then.
**Experience suggests that setting aside specific time for team's to attend to manualizing specific aspects of their recent learning is likley to be most effective.
!What is a Scribe for?
The scribe is a key role in the team activity of [[Manualization]] - a technique to support [[LEARNING at work]] and the principle of [[Respect local practice and expertise]]
!Who supports the Scribe?
The scribe works with the [[Chair|Role of the Chair]] who must ensure that the scribe is able to follow the key points and record them in a way that the team can accept as a 'good enough' representation of the team's thinking at that time.
!How does the Scribe do their work?
The scribe should wherever possible write in a way that ''the team can see what is being recorded in real time'' (using a projector, or large screen, or if online, using the 'share screen' facility. This:
* ''Enables the team to observe their thinking being reflected upon'' in real time
* ''Allows for corrections to be suggested and made'' 'on the fly'
* ''Acts to SLOW DOWN the team's dialogue'' in ways that need to be framed as //useful//:
** Manualizing is a ''team activity'': it is all about distilling some of the key points of agreement, or at least agreements-to-differ and going slower facilitates all voices being heard
** Things can get complicated or emotionally charged and having to travel at the reduced speed of the scribe can reduce the 'runaway train' effect (that may be destructive of [[Mentalization]] in the team)
* The Scribe is ''empowered to ask the team to stop/clarify points'' if they are falling behind, or not following the conversation
* The Scribe ''can make their own contributions to a dialogue'' but must do so out loud (rather than just writing their criticisms or extra suggestions in!)
!Who is the scribe?
Teams may decide on this in different ways (some people rotate this role, others have a few people who are confident/fast at typing)
According to [[Peter Senge|Developing learning organisations]], it is the capacity for a team performing any task //to become and sustain itself as a ''Learning Organisation''// that is - above all else - what determines its long term success.
Unfortunately many organisations act in ways that Peter Senge describes rather challengingly as //"Learning disabled"// because they fail to learn from their experiences, or from other available evidence. Although Senge is talking mainly about commercial organisations/companies, these principles apply equally to therapeutic teams.
The allocation of a ''Team Learning Support Worker'' for [[Team Meetings]] recognises how vulnerable all teams working in fields that provoke anxiety are to acting in ways that are "learning disabled".
!Who does this?
The primary Team Learning Support Worker is the [[AMBIT Lead]], but the role can be explicitly appointed for a meeting, or rotated between team members of the team, rather than lying with only one team member permanently.
!Role:
The ''Role of the Team Learning Support Worker'' is to:
* Maintain a "meta-perspective" on their team's live case discussions or other business;
** They can take part in those discussions, but they are particularly tasked with keeping in mind one specific question:
** //"What are the learning points about practice that might be generalisable from this discussion?"//.
* Summarise their observations to the team
** This may be at a specific point towards the end of a team meeting
** Or a team may agree they can raise these as they come up.
!Why have a specific role?
Of course it is fine for //other team members// to make observations and suggestions about possible practice learning points that could be developed from the content under discussion:
* The point of specifically allocating a Team Learning Support Worker ''role'' is at least in part its value as an //''illustration''//...
* The role represents to the wider team an explicit 'keeping-in-mind' of the need for team learning
** Learning ''about'' the work they they are doing
** Alongside ''doing'' the work that they are doing.
See Related Information for material relating to <<tag [[Roles and Responsibilities]]>> in an AMBIT team.
* [[AMBIT Editors]]
* [[AMBIT Trainers]]
* [[AMBIT Assistant Trainers]]
* [[AMBIT Local Facilitators]]
Another way of putting this is scrupulously to //''"Avoid argumentation"''//.
As soon as the practitioner tries to argue for change s/he is failing to [[Express Empathy]] and risks an ironic process, in which the young person "digs in his/her heels".
!!!Sometimes Rolling with Resistance should be explained explicitly:
//"I am thinking to myself that whatever arguments I might have about what ''I'' think might be a good course of action for you, I will never ever win an argument with you - because ''this is about you, and not me''. So I won't tell you what to do, and if you catch me doing that, you must please tell me, so I can put that right!"//
Consider the martial arts such as Aikido - where an attack is countered not by counter force (like boxing), but by using the attacker's momentum. The Aikido master avoids the blow by moving around it and then slightly redirecting it, rather than countering it 'head on'. Do not take this analogy too far - Motivational work is not combat!
!!!Respect due
Always acknowledge resistance - reminding oneself and the yougn person that [[Ambivalence]] is normal. The offer is thus to //"..take what you want - what might be helpful to you - and leave the rest"//.
!!!Resistance is seen as a cue for a different approach.
The practitioner is //flexible// - at times a complete change of tack is required to avoid argumentative confrontation (look for QuickWins to shift to, that will keep a sense of momentum in the therapy.)
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/huFlysFfNKM?rel=0" frameborder="0" allowfullscreen></iframe></html>
J Am Acad Child Adolesc Psychiatry. 2012 Dec;51(12):1304-1313
!Abstract
!!OBJECTIVE:
We examined whether mentalization-based treatment for adolescents ([[MBT-A]]) is more effective than treatment as usual (TAU) for adolescents who self-harm.
!!METHOD:
A total of 80 adolescents (85% female) consecutively presenting to mental health services with self-harm and comorbid depression were randomly allocated to either MBT-A or TAU. Adolescents were assessed for self-harm, risk-taking and mood at baseline and at 3-monthly intervals until 12 months. Their attachment style, mentalization ability and borderline personality disorder (BPD) features were also assessed at baseline and at the end of the 12-month treatment.
!!RESULTS:
MBT-A was more effective than TAU in reducing self-harm and depression. This superiority was explained by improved mentalization and reduced attachment avoidance and reflected improvement in emergent BPD symptoms and traits.
!!CONCLUSIONS:
MBT-A may be an effective intervention to reduce self-harm in adolescents.
A recently published set of standards gives helpful guidance for Child and Adolescent Mental Health Services (CAMHS) establishing crisis and outreach services. A link to this page externally is available [[here|http://www.rcpsych.ac.uk/pdf/QNCC%20Service%20Standards%203rd%20Edition.pdf]], or the same page should reveal within this page, below:
<html><div align="center"><iframe src="http://www.rcpsych.ac.uk/pdf/QNCC%20Service%20Standards%203rd%20Edition.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
This is an old medical abbreviation for "Recipe" which means TREATMENT in ordinary English
This describes //how individuals experience themselves when they are mentalizing successfully//.
!!A rich internal life
This is characterised by the person rarely experiencing their mind as being empty or content-less.
[img[https://lh5.googleusercontent.com/-wg9Tjenw0QU/UOTM-My0bVI/AAAAAAAAGRs/SecpU4g8zXs/s912/A%2520Rich%2520Internal%2520Life.jpg]]
!!Autobiographical continuity
This is the capacity to remember oneself as a child and to experience the continuity of ideas.
[img[https://lh6.googleusercontent.com/-tNsUdL4X-GY/UOTIunozkhI/AAAAAAAAGQs/6FzuwPEw1A8/s912/Narrative%2520Continuity.jpg]]
!!Advanced explanatory and listening skills
These denote the person’s ability to explain things to others and the person with these skills is experienced by others as patient, able to listen and to comprehend.
This text is from [[Wikipedia|http://en.wikipedia.org/wiki/SMART_criteria]]:
!Developing SMART goals
Paul J. Meyer describes the characteristics of S.M.A.R.T. goals. (Meyer, Paul J (2003). //"What would you do if you knew you couldn’t fail? Creating S.M.A.R.T. Goals". Attitude Is Everything: If You Want to Succeed Above and Beyond//. Meyer Resource Group, Incorporated, The. ISBN 978-0-89811-304-4.)
!Specific
The first term stresses the need for a specific goal over and against a more general one. This means the goal is clear and unambiguous; without vagaries and platitudes. To make goals specific, they must tell a team exactly what is expected, why is it important, who’s involved, where is it going to happen and which attributes are important.
A specific goal will usually answer the five "W" questions:
* What: What do I want to accomplish?
* Why: Specific reasons, purpose or benefits of accomplishing the goal.
* Who: Who is involved?
* Where: Identify a location.
* Which: Identify requirements and constraints.
!Measurable
The second term stresses the need for concrete criteria for measuring progress toward the attainment of the goal. The thought behind this is that if a goal is not measurable, it is not possible to know whether a team is making progress toward successful completion. Measuring progress is supposed to help a team stay on track, reach its target dates, and experience the exhilaration of achievement that spurs it on to continued effort required to reach the ultimate goal.
A measurable goal will usually answer questions such as:
* How much?
* How many?
* How will I know when it is accomplished?
!Attainable
The third term stresses the importance of goals that are realistic and attainable. While an attainable goal may stretch a team in order to achieve it, the goal is not extreme. That is, the goals are neither out of reach nor below standard performance, as these may be considered meaningless. When you identify goals that are most important to you, you begin to figure out ways you can make them come true. You develop the attitudes, abilities, skills, and financial capacity to reach them. The theory states that an attainable goal may cause goal-setters to identify previously overlooked opportunities to bring themselves closer to the achievement of their goals.
An attainable goal will usually answer the question:
* How: How can the goal be accomplished?
!Relevant
The fourth term stresses the importance of choosing goals that matter. A Bank Manager's goal to "Make 50 peanut butter and jelly sandwiches by 2:00pm." may be Specific, Measurable, Attainable, and Time Bound, but lacks Relevance. Many times you will need support to accomplish a goal: resources, a champion voice, someone to knock down obstacles. Goals that are relevant to your boss, your team, your organization will receive that needed support.
Relevant goals (when met) drive the team, department, and organization forward. A goal that supports or is in alignment with other goals would be considered a relevant goal.
A relevant goal can answer yes to these questions:
* Does this seem worthwhile?
* Is this the right time?
* Does this match our other efforts/needs?
* Are you the right person?
!Time-bound
The fifth term stresses the importance of grounding goals within a time frame, giving them a target date. A commitment to a deadline helps a team focus their efforts on completion of the goal on or before the due date. This part of the S.M.A.R.T. goal criteria is intended to prevent goals from being overtaken by the day-to-day crises that invariably arise in an organization. A time-bound goal is intended to establish a sense of urgency.
A time-bound goal will usually answer the question:
* When?
* What can I do 6 months from now?
* What can I do 6 weeks from now?
* What can I do today?
----
When setting goals, it is important that they are clear and achievable.
They need to be : Specific – Measurable – Agreed (collaboratively) – Realistic – Time limited
<<link-pdf "SMART Goal handout" "https://drive.google.com/open?id=1n-KiufWlI_3xIniCOtqv5iqNFe_ec-fDGYh_OumuvhE">>
Sexually Transmitted Infections
!Spotting them
This is not simple, and some STI's don't have dramatic symptoms at all (for instance Chlamydia in women) but can have devastating long term outcomes (chlamydia is a common cause of infertility.) Rashes, soreness on passing urine, sores, discharges, frequent need to urinate, abdominal pain, pain during intercourse... and many other symptoms are amongst those that can be present - as well as No SYMPTOMS...
An AMBIT worker is NOT expected to make diagnoses, but they WILL be interested and motivated to get proper testing and diagnosis for any young person who is sexually active.
!What to do
See [[NICE - Sexual Health Guidelines for Youth]] - make sure you know where your local [[GUM]] clinic is, and how to access it with a young person.
This is an abbreviation of SubstanceUseDisorder
Substance Use Disorder - treatment ("Rx" is short for "recipe", which means "treatment" in Latin!)
!Ideally:
In keeping with one of the [[SUD-Rx principles]], [[Balancing INSIDE and OUTSIDE change work]], ideally there will be:
(a)''Attendance of member(s) of the family/care network for up to two sessions.''
**Attendance with family/carers in ''one of the initial two sessions'', and again for the ''last session'' (as part of a systemic [[Relapse prevention]] intervention) would be the ideal arrangement, but...
**...In working with families the [[Key Worker]] must accept a degree of flexibility. See [[Families and Engagement]].
(b)''Individual work for four of the total six sessions.''
!Practicalities:
Often young people //do not want the involvement of family members//.
In keeping with the [[SUD-Rx principles]] of [[Engagement]], and the need to [[Roll with Resistance]] the [[Key Worker]] does not push this argument, but instead adapts to use a "virtual" family, holding the hope that at some point real family members/carers may become available:
>//"I understand completely that you want to keep this work separate from your family, and that is fine. So just to help me think about your situation a bit more accurately, if we just ''imagined'' that somehow that your ~Mother/Father/Aunt was suddenly here anyhow..."//
>//''"Can you help me understand what that would be like for you?''//
>//''"For him or her?"''// (This is one of many [[Mentalizing Therapy Techniques]])
!Concerns:
In the case of a young person vetoeing the involvement of the family, the [[Key Worker]] will bear in mind [[Child Protection]] concerns that may potentially underly this (parental neglect, abuse, etc) and will use SupervisoryStructures if required to ensure appropriate action is taken in such circumnstances.
!Sessions 1 and 2:
Broadly speaking the intervention in the opening 2 sessions is directed at achieving the following tasks:
__''Check the box when done:''__
1. [_] - Introductions and [[Engagement]], if this is not already in place.
2. [_] - Clarifying [[SUD-Rx - Who should be present at sessions?]]
3. [_] - Discussion/reminders of [[Confidentiality]], if this has not already been covered.
4. [_] - Clarifying the nature of the challenge via [[Assessment for SUD-Rx]].
5. [_] - Completing the Baseline Outcomes Measures, such as:
>[_] - [[YPOR - Drug and Alcohol Outcomes]]
>[_] - [[AIM]]
>[_] - [[CGAS]]
>[_] - SDQ
6. [_] - Feeding back and discussing the implications of this (see [[Assessment for SUD-Rx - Giving Feedback]]).
7. [_] - Drawing up your [[Care Plan]] with defined [[QuickWins]]
8. [_] - Beginning [[Motivational Work]].
9. [_] - Use SupervisoryStructures to help clarify plans and ensure you are [[Balancing INSIDE and OUTSIDE change work]].
10. [_] - Plan the content and goals of [[SUD-Rx Session 3]]
!General:
The stress in the early intervention sessions ([[SUD-Rx Session 3]] and [[SUD-Rx Session 4]]) tends to be more "inside" oriented, while the stress on the later intervention sessions tends to be more "outside" oriented (see [[Balancing INSIDE and OUTSIDE change work]]). Use SupervisoryStructures to help get this balance right.
!Tasks:
[_] - Check [[Make or View Client Notes]] to recap progress in previous sessions and your plans for this session.
[_] - Use techniques drawn from [[CognitiveBehavioural for SUD-Rx]] to develop a shared dialogue and strategy to address Cannabis use.
>[_] - Include some form of [[ABC Diary-keeping]] as a [[Training Challenge]].
[_] - Where appropriate use further [[Motivational Work]] as required.
[_] - Start to formulate appropriate [[Social-Ecological Work]] building on the information you have about the contribution of social-ecological factors to the substance use: record these in [[Make or View Client Notes]].
[_] - Draw up plans for next session in liaison with the young person and your SupervisoryStructures.
[_] - Where there is evidence of resistance to change, roll back to [[Motivational Work]].
>It is important to avoid over-reaching expectations, in a brief intervention - shifting through the [[Stages of Change]] from [[Pre-contemplation]] to [[Making plans for change]] may be a realistic goal to work towards. In such situations
[_] - Continue [[CognitiveBehavioural for SUD-Rx]].
>[_] - Review the [[ABC Diary-keeping]] that was the [[Training Challenge]] from [[SUD-Rx Session 3]]
>[_] - Target behaviours and cognitions as they arise, using [[Rating Scales]] to set targets and measure change.
>[_] - Look for opportunities to build positive [[Contingencies]] (rewards) for reduced use or abstinence.
>>[_] - [[FamilyWork for SUD-Rx]] offers ways to enlist the family in developing such contingencies, and potentially negative [[Contingencies]] such as the reduction of an allowance, or temporary removal of priviledges, etc
Not uncommonly comorbid [[Anxiety]] or low mood/depression will reveal itself. If necessary use
>[_] - [[Progressive Muscle Relaxation]] or [[Re-breathing]] to develop coping skills and [[Self-efficacy]]
!6 session intervention
Material is laid out in this module that offers a six session intervention for young people who are using substances: this is delivered WITHIN an AMBIT framework, rather than replacing other key AMBIT principles (see [[Core Features of AMBIT]]). This module sets out some:
*''Additional core STANCE principles'' (the stance features laid out in [[Core Features of AMBIT]] are already assumed to be in place) and
*A ''set of techniques'', that are deployed according to your [[Care Plan]], which is developed out of your [[Formulation and Treatment Aims]].
!Flexibility and Clinical Judgement
The detailed structure and contents of individual sessions are offered here as a //''guide''//; recommendations contained here should never be allowed to replace clinical experience, but are desgned to support and shape best practice.
The basic tasks for specific sessions should be covered as directed, but the therapist must feel able to move flexibly between different techniques and interventions //according to clinical need// - so that the detailed suggestions and examples set an overall ethos and 'style' rather than offering a mechanical and step by step manualization, sacrificing the flexibility required to maintain [[Engagement]] in young substance users.
!Sessions and Steps:
__''PREPARATION''__
#[_] See the general AMBIT [[Starting a NEW CASE - CheckLists]].:
#[_] Read through [[SUD-Rx principles]] and in particular [[Balancing INSIDE and OUTSIDE change work]])
#[_] See [[SUD-Rx - Who should be present at sessions?]].
#[_] Preparing yourself for Family and Systemic work: In keeping with the [[SUD-Rx principles]] of [[Balancing INSIDE and OUTSIDE change work]], if the situation requires or allows it, the practitioner will aim to hold
##[_] Up to 2 sessions of Family-focussed work amongst these sessions: study the techniques at [[FamilyWork for SUD-Rx]].
__''GETTING STARTED''__
#Initial two sessions: [[SUD-Rx Session 1 - 2]]. There is more detail for the first and second sessions as these include the important processes of engagement, assessment, motivational work, planning and baseline outcomes measurements.
#[_] [[SUD-Rx Session 3]]
#[_] [[SUD-Rx Session 4]]
#[_] [[SUD-Rx Session 5]]
#[_] [[SUD-Rx Session 6 - FINAL]]
These four concluding sessions consist mainly of a balance of [[CognitiveBehavioural for SUD-Rx]] and [[Social-Ecological Work]], primarily designed to offer:
*PsychoEducation
*Change-oriented work and Strategies
*[[Crisis Contingency Planning]] to support [[Self-efficacy]] in the young person and their carer network's capacity, equipping and supporting the young person to choose and act upon the goal of ''reducing the harms'' associated with substance use, or reducing/stopping his/her ''absolute usage'' of this drug.
!
This tab gathers together the main techniques deployed in this intervention, each of which has some claim to an evidence base for effectiveness in the treatment of harmful Cannabis use in young people, and is likely to have some effectveness in the treatment of other substance use disorders.
*__[[Motivational Work]]__ is often the starting point.
**This is entirely in keeping with the [[Mentalizing]] focus of AMBIT, and the principle of [[Maintaining Mind-mindedness]]
**Indeed, the [[Stages of Change]] that Motivational work makes use of can be seen as ways of describing the presence or absence of mentalization.
*__[[Cognitive Behavioural techniques with Substance users|CognitiveBehavioural for SUD-Rx]]__ can be applied to a young person's beliefs and practices once there is sufficient therapeutic alliance to support this work.
*__[[Family work with substance users|FamilyWork for SUD-Rx]]__ recognises that a young person's substance use always occurs in a //context//: not uncommonly this includes low parental monitoring, or significant family disruption, and sometimes there is implicit or even explicit parental approval of substance use.
*__[[Social-Ecological Work]]__ takes into account the wider ecology that the young person is involved with.
**This would include access to substances, and to antisocial or substance-using peers
**This also includes the need to identify and build on [[StrengthsResiliencies]] that might come to represent meaningful alternatives to substance use.
*__''Other Approaches:''__ Note that treatment of disorders involving 'harder' drugs such as heroin may require additional augmentation with [[Pharmacological]] approaches, and will almost certainly require more than the manualized six sessions, but the main principles of treatment remain the same.
!!What is it?
The [[Substance use disorder - treatment]] module within [[AMBIT]] has been developed within the [[CASUS]] team, and is based on a critical review of the most recent international trials evidence on "What Works for Whom" for children and Adolescents by Dr DickonBevington. The [[Substance use disorder - treatment]] module (sometimes abbreviated to [[SUD-Rx]]) is designed as a relatively brief intervention (up to 6 sessions). It is accepted that a proportion of young people will require a lengthier intervention, especially if there are significant [[Comorbidities]] present. Local teams may wish to adapt their manual to recognise this.
!!What substances is it for?
Most of its principles are applicable across a wide range of substances, although it was specifically designed with Cannabis as the primary target substance. More entrenched use of harder drugs (heroin, crack cocaine, etc) is likely to require additional measures, including, potentially, prescribing interventions - these are not part of this manual, but can be used alongside (see [[Pharmacological]] interventions.)
!!Before Starting:
#Initial [[AMBIT training|Information About AMBIT Training]] is recommended.
#Familiarise yourself with this TiddlyManual.
#Read through the four core principles (below) and the more general [[Core Features of AMBIT]].
#Read through the structure of the 5 - 6 sessions in [[SUD-Rx Sessions - CheckLists]]
!!Four Core Principles of AMBIT Substance Use Disorder Treatment
There are FOUR core principles that underly the intervention. These are drawn from the best available trials evidence about "What Works for Whom"...
''Note:'' These priciples overlap with and/or build upon the [[Core Features of AMBIT]], and these foundation principles and practices should also be borne in mind.
#__[[Assessment for SUD-Rx]]__ - which identifies the //specific// problems for which //specific// interventions are required, and informs your [[Formulation and Treatment Aims]].
#__[[Adapt your Discourse]]__ - which sets the style of communication according to a [[mentalized|Mentalization]] understanding of the young person, and offers the best chance of this being understood, accepted, and acted upon.
#__[[Balancing INSIDE and OUTSIDE change work]]__ - which addresses the [[Multiple interacting aetiologies]] that initiate and sustain substance use.
#__[[Maintaining Mind-mindedness]]__ - which offers a focus that is normative, offers opportunities for enrichment (beyond the simple 'giving up' of something that has previously been valued) and fosters a respectful engaged relationship between worker and client.
This is a topic that collects together all material relating to a team or individual practitioner's capacity to sustain best practice - often in settings that threaten or challenge this.
<<list-links "[tag[SUSTAIN best practice]tag[SUSTAIN best practice]]">>
!!Systemic approaches to service provision
AMBIT does not specify organisational structures for AMBIT teams. The intention is to develop a method of practice based on key principles drawn from evidence and [[Implementation Science]] that can be adopted by teams with very different managerial or organisational structures.
Our thinking around team functioning and development has been strongly influenced by [[systemic ideas|SystemsTheory]] and practices.
Some key ideas from a number of systemic writers are summarised in the manual.
#[[Increasing service value: the work of John Seddon]].
#[[Developing learning organisations]]: the work of Peter Senge
There is local material on [[Exploitation and Substance use]], as well - mainly relating to young people using substances.
Below are useful guidance documents/websites:
!1. Screening for Sexual Risk
[[Brook|http://www.brook.org.uk/index.php/home-professionals]] have produced a useful [[Screening Tool for Sexual Exploitation by Brook]].
!2. Risks, Interventions, Integrated working...
The first is a UK government supplement to their large policy document [[Working Together to Safeguard Children|https://www.education.gov.uk/publications/eOrderingDownload/00305-2010DOM-EN-v3.pdf]]. It provides good information on the RISKS to vulnerable youth of sexual exploitation, and a range of recommended INTERVENTIONS and guidances about INTEGRATED WORKING as proactive responses to these risks (see [[Addressing Dis-integration]], one of the [[Core Features of AMBIT]].)
[[External link to Safeguarding Children and Young People from Sexual Exploitation|https://www.education.gov.uk/publications/eOrderingDownload/00689-2009BKT-EN.pdf]]
<html><div align="center"><iframe src="https://www.education.gov.uk/publications/eOrderingDownload/00689-2009BKT-EN.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
!3. What to do if you suspect...
The second is a step by step practitioners' guide on ''"what to do if you suspect a child is being sexually exploited"''
The direct link to this document is [[here|http://data.parliament.uk/DepositedPapers/Files/DEP2012-1110/StepbyStepGuideFINAL.pdf]]
<html><div align="center"><iframe src="http://data.parliament.uk/DepositedPapers/Files/DEP2012-1110/StepbyStepGuideFINAL.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
<center>{{Stance-Scaffolding.JPG}}</center>
''Pictured above:'' the repair of the famous Mostar bridge that was all but destroyed in the war that accompanied the break-up of former Yugoslavia.
Scaffolding existing relationships is one of the [[Core Features of AMBIT]]. Accordingly you will find [[Training Exercises for Scaffolding existing relationships]] in this manual.
There is constant effort to support, or add scaffolding to, key //existing relationships//:
* The young person's relationship to him or herself
* Relationships within the family
* Relationships between the family and other professionals in the network
* Relationships with key professionals in the network that may be of significant value, or likely to be longer lasting than ours
...rather than a drive necessarily to //replace// these. Other ways of looking at this include:
* The necessity of identifying any (rudimentary, or frail) StrengthsResiliencies that might easily be overlooked, and building on these
* The need for a practitioner to hold in mind the risk that out of good intentions (to become an important, helpful figure in a young person's life) I might inadvertently undermine a relationship that - although fragile, and perhaps even apparently //unhelpful//, actually holds a greater [[ambit|AMBIT]] for influencing positive change over the coming year(s) than I - or my team - do.
Wherever possible, security in existing [[Attachment Relationship]]s is supported as being in the long term interests of the young person’s psychological development, even in settings that may conventionally be seen as high risk.
<html><iframe width="480" height="360" src="https://youtube.com/embed/CrJV2SRcLxI?rel=0" frameborder="0" allowfullscreen></iframe></html>
AMBIT stresses the importance of [[Social Ecology]], and [[SystemsTheory]], and supports an unwillingness to be drawn into [[Teleological thinking]] that attempts automatically to //replace// existing supportive structures. The focus in AMBIT is always on //scaffolding what is there//, so that fundamental structures (relationship to self, to family, close friends, School, Social Services, a Youth worker, etc) can be strengthened in ways more likely to sustain the task of maintaining an IntegrativeContext.
>>"Scaffolding is a major word we use - as in intensive treatment service, our CPNs see themselves as a temporary part of a young persons life and talk of scaffolding other workers in the network."
>>>Ambit-influenced team, 2014
!!But...
This is unless, of course, the level of Safeguarding or [[Child Protection]] concerns make this option inevitable - and it is not at all uncommon that a high degree of uncertainty surrounds such questions.
!!Keeping a Balance
Of course scaffolding relationships //that may be far from ideal// requires attention to [[Managing Risk]]... It is important to work with what is //there//, but not to lose sight of the need for careful [[Governance]] so that risks are managed and client, worker, and others are protected as much as possible.
...this is why [[Managing Risk]] is the stance item in the [[Core Features of AMBIT]] that is paired with ''Scaffolding existing relationships''. See the [[AMBIT Wheel]].
At times we overbalance into too-rigid protocol-driven ([[Teleological thinking]]) risk management interventions that in the long term threaten our relationship with a young person, or their relationship with others who might actually still be in their lives long after we have left the scene. At other times, a diligent worker's compassion and empathy may lead them to over-identify with the young person, or "up-regulate" their tolerance of risk (//"maybe it's just me being too much of a worrier, or getting old and not understanding how young people live these days - who am I to wade in and tell people they are wrong?"//)
!!What to do?
* An approach to assessing what is there: the [[Multi-Domain Assessment]] and in particular the [[Narrative History]] and StrengthsResiliencies are key.
* [[Social-Ecological Work]] for building resiliencies in a young person's life
* [[Mentalization Based Work]] for work on a young person's relationship to themself and others
* [[Family Work]] for work on family relationships that might be improved
!!Training
See [[Training Exercises for Scaffolding existing relationships]]
These are seven principles of helping outlined in [[Helping by Edgar Schein]]
#Effective help occurs when both giver and receiver are ready.
#Effective help is given when the helping relationship is perceived to be equitable.
#Effective help occurs when the helper is in the most appropriate helping role.
#Everything you say or do is an intervention that determines the future of the relationship
#Effective helping starts with pure enquiry
#It is the client who owns the problem.
#You never have all the answers.
In the manual there is a page called [['Helping' Stories]] with brief anecdotes of interactions either successful or unsuccessful where one person was intending to be helpful.
!About the Score 15:
The Score 15 is a self-rated measure of family functioning developed by family therapists. It is free to use, and takes less than 10 minutes to complete.
<html><div align="center"><iframe src="http://www.psychotherapy.org.uk/score.html" frameborder="0" width="100%" height="600"></iframe></div></html>
There is a (downloadable) article about it [[here|http://www.aft.org.uk/SpringboardWebApp/userfiles/aft/file/Members/UsingSCORE(Jan2012).pdf]]:
<html><div align="center"><iframe src="http://www.aft.org.uk/SpringboardWebApp/userfiles/aft/file/Members/UsingSCORE(Jan2012).pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
!Download or view a copy
The questionnaire is available for download via the CORC website [[here|https://docs.google.com/viewer?a=v&q=cache:JyRtXmWAOAEJ:www.corc.uk.net/wp-content/uploads/2012/05/SCORE-151.pdf+&hl=en&gl=uk&pid=bl&srcid=ADGEESgxwIc_Df6PnW2we6W0YUjpKZtcQ0U7N0mPSMf8zSrJPWP2QItVfh1R_kAh1J7JKP7aPEWl4ZsB1c6uiO75XN7fQn1-5eKoaLyS6bMnmq-X391Zbbxb1Lzmei09DYoaFz8ET08t&sig=AHIEtbS-6k63PFg-IQ5bv8ZHuWLeRjUtcw]]
View a copy:
<html><iframe src="https://docs.google.com/file/d/1It9tW_R4G2nMfkyJifKVXSl0zK1eoIO3z60hEEsiRs3FLp4jZ5aXLF6ofx5x/preview" width="640" height="480"></iframe></html>
Source: Cheryl Hunter and James Fairbairn
!! ''Purpose of this page''
Many front line workers have a negative experience of using questionnaires as they often involve time in making sure that the data is properly scored and stored. This page provides a tool to reduce the burden of this task. There are 2 parts to this page;
(i) A description of how the AIM questionnaire is scored,
(ii) A downloadable specifically designed spreadsheet for the AIM for workers to easily store and visualize results when using the [[AIM|AIM]] questionnaire.
''Scoring the AIM Questionnaire''
The [[AIM|AIM]] is a worker rated measure, where each item is rated between 0-4 with the worker's 'best guess' rating of that item. When scoring the AIM (interactive or paper version), if you do not know the answer to a question, it should be scored as a "0" but act as a prompt to find out about this question. In the AIM Interactive version workers can easily view which answers are missing in the results tab to prompt further assessment/conversations with their client (and hence updating AIM scores if needed).
When rating the AIM, you can use a "0+" to indicate an area of particular strength, but it is advised not to use this score on the spreadsheets below as it will disrupt any score change calculations. Use "0" instead.
The AIM allows workers to choose to identify key problems. Key problems can be used as goal-based outcomes for the client and they should be the most important targets for intervention. Only modifiable items should be considered and the same key problems should be measured at T1 and T2. You can choose up to 6 key problems.
''Score meanings''
* 0= No problem
* 1= Mild
* 2= Moderate
* 3= Severe
* 4= Very Severe.
Higher scores indicate worse functioning.
We have adopted a pragmatic rule that the total AIM scores can be compared if at least 80% (34 out of 43) questions are completed.
For subscales, the scores can also be compared if over 80% of subscale items are completed. The spreadsheet also calculates the average score across all questions (per individual, and across cases) - this will be out of 4 (from -4 to + 4, dependent on direction of change).
Negative change scores indicate a decline in functioning between time 1 and time 2, positive change scores indicate an improvement.
!!Making sense of AIM scores
The AIM can be used for a range of different purposes, not least ''as a basis for a conversation'' with a client about how his/her difficulties may be understood by the worker. So, for some teams it may be used as a communication tool and the actual scores may not be used in this.
The AIM can be used to help ''to decide what sort of intervention may be most useful'' for the type of needs identified in the AIM. If you are the [[AIM questionnaire-interactive version|AIM questionnaire - interactive version]] (within this manual), then this will provide a range of intervention options to consider around the young person's needs. (See [[AIM suggested interventions]] for more details).
The AIM can also be used ''to gauge the level of need'' (higher scores equals greater needs) and also ''the degree to which these needs have changed between two time points''. For this purpose, the CASUS study has provided some comparison data on the AIM and is provided here as a way of providing a starting point about how to interpret the scores obtained. (See [[Interpreting AIM scores: the CASUS study]] for more details)
In the CASUS study, the average (SD) total AIM score at the beginning of the intervention was 27.89 (11.98) and the average score at the end of treatment was 13. 43 (11.12). A reduction in total score of 12.91 points would indicate that the degree of change met criteria for reliable change, ie that it was unlikely to be due to chance variation. In the CASUS study 56% of cases met this criteria.
Total scores and change scores are likely to be different for different need groups so this data should only be used as an initial way of making sense of the data that has been obtained for different teams.
!! The AIM spreadsheets
''//Here are the links to the spreadsheets://''
<<link-pdf "AIM Data Collection Spreadsheet - Ten Cases" "https://docs.google.com/spreadsheets/d/1U9T0l5DJgZFvt0WAGCdeq5n6U1Mb-Q6x/edit?usp=drive_link&ouid=108983181073089183472&rtpof=true&sd=true">>
<<link-pdf "AIM data Collection Spreadsheet - Team data" "https://drive.google.com/open?id=1Rep9AxFygozqIg_LQcGtYGX5Om3iknW5">>
''1) ''''Intention of the spreadsheets''
The spreadsheets are designed to:
* Help teams quickly and easily record AIM scores
* Help teams visualise change in individuals and across teams over time
* Help teams share data easily with [[AMBIT study group|The AMBIT Study Group]]
The spreadsheets are currently in English, but teams are welcome to translate for their own use.
''2) Downloading the spreadsheets''
When you click on the spreadsheets in this manual they will open in googledocs.
First, save the spreadsheet onto your own device before adding any data. The spreadsheet should be out of 'read only' mode before you can add data.
We recommend that you do not unprotect formulas
''3) Entering your AIM scores into the spreadsheets''
Scores should be inputted into the sheet named 'Data'. Each row should represent one individual's data. You insert the person's identifier (e.g., name or ID number) into the first column. If you scroll across, you will see that Timepoint 1 (T1) scores are coloured in Blue and Timepoint 2 (T2) scores are coloured in Orange. You can also record the date of completion (for T1 and T2).
Formulas will generate totals and averages for you so that you only have to enter the scores.
The 'Data' sheet is automatically linked to the 'Individual Scores', 'Individual Graphs', 'Team Scores' and 'Team Graphs' sheets.
The 'Key Problems' sheet needs to be filled in separately to the 'Data' sheet.
When using the ''AIM questionnaire- interactive version'', once you have completed the questionnaire in the wiki manual you can copy and paste your scores directly into the 'Data' sheet using the ''Copy to clipboard'' function
You can also copy and paste your data in from any other excel spreadsheet. For this function to work you must copy and paste in your raw data for T1 and T2 only. Do not try to copy and paste in the totals and domain scores as this prevents you from copying and pasting.
''3) Summary of what is in each tab within the spreadsheets''
''AIM''
Summarises the instructions for using the spreadsheet and the AIM measure
''Data Sheet''
Where you enter the raw ratings of the AIM at T1 and T2.
''Individual Scores Sheet''
Automatically re-orders the data so that you can quickly scan across individuals and compare time 1 and time 2 scores for individuals.
''Individual Graphs Sheet''
//This sheet is only included in the Ten Cases version of the spreadsheet as there are a lot of possible graphs generated per person.//
You will see automatically generated graphs for each individual. These include a comparison of AIM score at time 1 and time 2, plus change in score; comparison of each subscale score at time and time 2, plus in subscale score.
''Team Scores Sheet''
Automatically displays mean item scores and subscale scores at T1 and T2 (plus change between T1 and T2) for the entire team dataset.
''Team Graphs Sheet''
Automatically displays graphs for AIM total score and AIM subscale scores at T1 and T2, and change over time.
''Key Problems Sheet''
Allows you to record the Key problems, and track change in them over time, and generates graphs.
There is a section on the sheet for the worker to record the specific key problems for each individual using the AIM Item Numbers (see 'appendix' sheet for items list with associated numbers).
''Appendix Sheet''
Lists the items on the AIM with an associated number. The number matches with the numbers on the AIM and the AIM cards.
''4) Outputs''
There are different outputs generated within the spreadsheet.
The y-axis on the generated graphs always indicates the highest and lowest possible scores, e.g., for item scores, the highest possible score is 4 and the lowest is 0; for the full AIM, the highest possible score is 160 and the lowest is 0; for the mental state subscale, the highest possible score is 76 and the lowest is 0.
* Individual graphs (only in the ten cases spreadsheet)
** AIM scores at T1 and T2 and change
** AIM sub-scale scores at T1 and T2 and change
//Example output: AIM score at T1 and T2 for an individual//
[img[AIM individual score.JPG]]
* Team graphs (in both spreadsheets)
** Average item score across clients at T1 and T2 (Average item score offers a more precise indicator of change than comparing total or subscale AIM scores)
** Average AIM scores across clients at T1 and T2 and change between times
** Average AIM sub-scale scores across clients at T1 and T2 and change between times
//Example output: Average item score//
[img[AIM score.JPG]]
//Example output: Average AIM score across clients at T1 and T2//
[img[Average score.JPG]]
''5) Links to Spreadsheets''
There are two version of the spreadsheet that are filled in in the same way.
The reasoning is that most teams will want to know whether they are making a difference to their clients across their service, and therefore the "Team Level" spreadsheet allows you to collect up to 100 people's data at a time and will generate graphs that visualise this. It would be too cumbersome and slow down the spreadsheet to include the capacity to generate individual client graphs as well, so a smaller spreadsheet ("Ten cases") is provided that allows you to automatically generate individual client graphs as well as group graphs.
We recommend that teams use the team level spreadsheet for //all your team's data// and copy over a particular client case into the ten cases spreadsheet if you want to visualise change on total AIM scores or AIM domains for an individual client.
''Technical notes''
* The spreadsheets are protected to prevent accidental deletion of the formulas (which generate sums and averages and outputs). If a team want to edit the spreadsheet formulas, they can do so by entering the password "ambit"
* The spreadsheets also lose this protection if opened in google sheets
Please read about [[AMBIT Client Impact Project|AMBIT Client Impact Project (ACIP)]] which describes a protocol of how to use the AIM measure. This protocol is developing in response to feedback from teams who are currently trialling the AIM as part of their practice.
There is a link to the [[Brook Traffic Light Tool|https://www.brook.org.uk/our-work/category/sexual-behaviours-traffic-light-tool]] for young people, or you can see it here:
<html><div align="center"><iframe src="https://www.brook.org.uk/our-work/category/sexual-behaviours-traffic-light-tool" frameborder="0" width="100%" height="600"></iframe></div></html>
!Listen to the young person!
*Often a young person will have symptoms that are distressing or worrying them; listening to these concerns, and responding appropriately, is the most fundamental responsibility of the [[Key Worker]].
*Young people are frequently very anxious about conversations relating to their physical bodies - any discussions about this should acknowledge this, and ensure that the young person is comfortable about talking.
**Sometimes having a friend or family member to support them in such a conversation is helpful
**Sometimes an additional "chaperone" for the [[Key Worker]] may be required.
Note that, apart from a visual examination of //injection sites// or specific injuries (which even then may not be appropriate, as in the case of groin-injecting) ''we do not expect the Key Worker to be making formal physical examinations of young people''; this is the role of the nurse or doctor.)
!Signs to look for:
It is plainly unwise to list specific symptoms and signs to look out for. Young people may look quite obviously run down and in poor health - the key determinant of best practice is not to allow oneself to //ignore// such an observation.
Look out particularly for signs //that appear to deteriorate over time//, as these can be harder to spot:
*Weight loss (most young people would expect to be putting on weight until they have finished growing)
*Coughs or breathing problems (wheeze, shortness of breath).
*Problems with bladder or bowels.
*Pain that has no obvious cause.
*Weakness in limbs
*Altered sensations that persist.
*Dental problems (these are particularly common in people with mental health problems.)
!Special groups:
*''Intravenous drug users'' are at risk of many helath problems:
**Local infection of injection sites is a problem - ask to see these if they are on the arms: look for redness, tenderness and heat over the area, which might suggest a developing abscess.
**Hepatitis (B and C) - keep an eye out for jaundice (a yellow tinge to the skin, and the whites of the eye), tiredness, etc (any young person who is injecting drugs MUST be offered (and encouraged to take up) [[Blood Borne Virus Screening]])
**HIV - sometimes (but only in later stages) associated with multiple other infections.
**Septicaemia - look for high temperatures, or cold extremities.
*''Sexually Active youth''
**Sexually transmitted diseases - most of these can easily screened for at a local Genito-urinary clinic - many hosptials have special clinics for young people.
**Pregnancy - workers should have access to the means for pregnancy testing. Remember that continued heavy drinking or Drug use during pregnacy is known to be damaging to the unborn baby, and constitutes a form of ''Neglect'' (see [[Child Protection]]) by the mother-to-be.
*''Fighting/Bullying/Physical Abuse''
**Stab wounds may not be reported because of fears of Police involvement.
**Bruises, and small fractures may easily be covered up, or overlooked. (Look for the position of bruising - is it in a site that fits the young person's description of how it occurred?)
*''On medication already''
**Check what [[PrescribedMedication]] young people are taking
**Some medications have common or important side effects.
**''Antipsychotic medication'' (for instance Risperidone, Olanzepine, Quetiapine, Haloperidol...) has a wiode variety of side effects, and some are given below (not an exhaustive list.) Note that these drugs are sometimes prescribed for //non-psychotic// conditions, such anxiety, or aggression...
***Look out for ''stiffness'' (especially in the neck, and causing the eyes to wander upwards) - this is a //dystonia// and is relatively common, easily treated, and should not be left.
***Sometimes antipsychotics can cause constipation or difficulty passing urine.
***Sometimes they can cause disturbance of periods (in women) or production of breastmilk/secretions at the nipples (men or women) - this is rarely mentioned by young people, but can be very worrying and cause them to stop taking a medication. It is often easily manged by adjuting the dose or switching to an alternative medication.
***Rarely, antipsychotics (and some other drugs too) cause very dangerous side effects such as ''Neuroleptic Malignant Syndrome (NMS)'' - the signs of this are that the person is obviously poorly, sometimes with a lowering of the level of consciousness, and unstable central features such as pulse (high or low), temperature (usually high, but can be low), blood pressure (high or low) etc. The body is noticeably stiff. THIS IS A MEDICAL EMERGENCY AND MEDICAL CARE NEEDS TO BE CALLED IMMEDIATELY - in most cases the person would need to be admitted to a medical ward immediately, as this can worsen and lead into coma and even death (NB this is very rare.)
!What to do if a Health concern arises:
*''Young people should all be registered with a local GP'' - if this is not already the case it should be an early priority in the [[Care Plan]].
*GP's or A&E clinics are available - try to use A&E clinics only for genuine medical emergencies, rather than routine concerns that a GP could manage just as well.
*Use the [[How to speak to a...]] material to get the best out of the health service workers.
!!Introduction
This is a "low impact" form of roleplay - minimal dramatic skills are required. A paper based version of the exercise is the [[The AMBIT Pro-Gram]], and a more directly clinical tool that addresses the same topic of [[Dis-integration|Addressing Dis-integration]] is the [[Dis-integration grid]].
A Sculpt is one of the [[Training exercises]] AMBIT uses, and is designed to help teams to:
* Visualise the large and complex networks around young people
* Take multiple perspectives from the positions of various protagonists (note [[Positioning Theory]])
* Map out ''Dis-integration'' in physical space that might otherwise be mapped via the [[Dis-integration grid]]
!!What you need
* Space to move people around, chairs
!!Activity
* Invite one person (or a small group) to describe a clinical scenario from their experience
** Brief history of the case
* Start with the index client, and arrange other figures in ways that reflect their relationship with each other
** Close relationship - sit them close together, looking at each other
** Distant relationship - sit them far apart
** Consider whether you want them seated in a "face-off", or turned away from each other, etc, etc
* Add all members of the immediate family first
** Then extended family, peers, friends
** Then significant others (Pastor, Imam, Coach, etc..)
* Then complete the Professional network
** with each professional, consider the 3 levels of dis-integration that the [[Dis-integration grid]] uses
*** What is their EXPLANATION for why they are involved: "What's the problem?"
*** What is their intended INTERVENTION: "What to do?"
*** What is their understanding of systemic RESPONSIBILITIES: "Who does what?"
* Once the network is sculpted "as it is", ask key "players" to talk about how it might feel for their character to be in this [[position|Positioning Theory]].
* Try to ''re-organise the network''
** Re-arrange characters in ways that the main protagonists might start to experience them as more accessible, helpful, etc.
** What are the barriers to such systemic change?
** What are the most glaring ''Dis-integrations'' in the network?
This is a training exercise that could form part of Day 5 of TTT (or any AMBIT training).
Instructions: put pieces of paper on the floor to mirror the 4 quadrants of the AMBIT wheel: Client, Team, Network, Learning and mentalizing in the centre. Don't worry about including the stance features.
Ask the group to go and stand on the part of the wheel that they feel most confident about explaining or that connects with them the most.
Notice where everyone has gone to stand. What do people notice about the balance of where people have positioned themselves?
The facilitator can take on the role of being someone who knows nothing about AMBIT and is trying to make sense of what it is. The facilitator moves around each quadrant in turn and asks the people who stood in each place to share why they have chosen that position. Facilitate discussion on what does that quadrant of the wheel mean to them? What stands out about that quadrant?
!!Learning points
* Within a team, there will hopefully be a balance of people in different places. How can people make use of this in the future training/implementation plans?
* Being an AMBIT facilitator doesn't mean knowing it all perfectly! Starting with the part that you most connect with might help you to feel confident in sharing the ideas.
* Hopefully the exercise gives participants a chance to practice talking about an explaining AMBIT concepts - this is a great skill to take forward in their role as a facilitator.
The manual has a search bar (located on top bar, and on the right hand sidebar under the site title) that will search the whole manual for a word you type in, listing what it finds - first in the titles of pages, and then in the content within those pages.
When you have typed in word you may see a (small downwards arrow leading to a) drop-down menu with links to all the relevant findings; you can scroll down and click on the page you want.
You can also search for material by following the trail of [[Tags]] and [[Links]], or via the (clickable) segments of the [[AMBIT Wheel]]
This term is central to the theory of Attachment. It stems from observations that an infant or young child will use contact with a caregiver (eye contact, physical contact, verbal contact) to re-orient and reassure himself in an uncertain situation.
!The Strange Situation
The "Strange Situation" procedure with infants, is used to assess the Attachment style (i.e. which of the [[Attachment Definitions]]), best illustrates this. When the child in a new room knows that his or her mother (for instance) is there, he or she can begin to explore (often via play), and can overcome a momentary 'overwhelm' (caused, say, when a tower of bricks he is constructing falls) by 'checking back' with the parent. Assuming the parent can adequately deploy [[Mentalization]] of the child's predicament (perhaps deploying [[Marked mirroring]] of his or her surprise/shock in a playful way) the child is quickly reassured and can resume exploration. In order to use the caregiver in this way, the child must activate an [[Internal Working Model]] that associates Security with the relationship with this parent; that in circumstances of difficulty this figure "will most probably act confidently, competently, benignly enough to get us through..."
!In therapeutic work
In the therapeutic context, the AMBIT worker is aiming to rekindle whatever vestige of this 'Secure Base' there remains in the patient's [[Internal Working Model]]s of relatedness, so as to allow the patient to begin to explore his or her inner and outer world, as part of the task of recovery.
!An example in 15 seconds
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/pGj-8ZF57o4?rel=0" frameborder="0" allowfullscreen></iframe></html>
Demonstrated by Pip in just 15 seconds, here's the principle of the Secure Base in action.
What follows, of course, is just a crude attempt to Mentalize the fine beast that is Pip; to make sense of behaviour on the basis of imagined intentional mental states.
So Pip hears the kiss-kiss sound, and knows he's close and safe, so he can immediately do what a dog must do... Explore. That's what the Secure Base is for... To facilitate exploration of the world.
For our clients, the "world" that //they// may need to explore might not be a big field, but instead their inner world, or the tangled circumstances that have conspired to bring them to this predicament, here, now. It may be just as (or rather a lot more) daunting to head into that territory as it is for Pip, whose "world" is just a socking great field.
You see Pip check back for just a fraction of a second. Sees master, carries straight on....
Stops... Looks ahead of him... Recognises this is a Very Big Field.
Freezes. What to do?
It's a Very Big Field indeed.
We imagine a small flutter of uncertainty. [[Attachment Behaviours]] are triggered... So he has a good long look at his master. Straight after that (I can tell you) he's off like a rocket. But still a glance here, there, now and then, says that ''it's the secure base that //lets// him explore''.
How do we go about creating secure base experiences, especially for clients whose experience of help may have been anything but helpful? That is what AMBIT is all about.
John Seddon - Systems Thinking in the Public Sector: The Failure of the Reform Regime.... and a Manifesto for a Better Way, 2008, Triarchy Press, UK
See [[Increasing service value: the work of John Seddon]]
This is a distressing and serious problem, that often relates to [[Affect storms]] and attempts at [[Affect Regulation]] (using [[Teleological thinking]]) rather than //necessarily// being directly driven by Suicidal intentions.
''It should always be taken seriously'' as the risk of completed suicide is significantly greater in people who have previously self-injured. It is //very unhelpful// when people describe self-injury in terms of "Attention-seeking" - it is much more important to ask the question: //"What is it that requires attending to?"//
Interventions for Self-injury include [[Motivational Work]], [[Mentalization Based Work]], [[Family Work]] and [[Crisis Contingency Planning]] - which includes the need to be clear about [[EmergencyProcedures]] and for the carers around the client to be clear on what to look for, and what helps.
This problem is rated as one of the items on the [[AIM]] questionnaire 26. Mental State (1) - Self-injurious Behaviour.
This is also known as an AutoDidact function.
!Ask yourself:
*Are you tending to shy away from particular areas of the manual?
*Do you have 'least favourite' parts?
*Do these correspond to areas of the work that you tend to avoid, too?
!!Note:
Every practitioner has strengths and weaknesses - a key exercise in self-directed learning is continuously to //reflect// ([[Mentalization]]) on what these are, so that safegurads can be put in place, perhaps with your clinical supervisor or team leader, to develop the broadest range of skills and capacities.
!!Where to go next?
* Use the APrAT reflective audit tool to evaluate your work
* Look at the lists of [[AMBIT Competencies]] to identify areas for improvement.
This is linked to [[Cognitive Behavioural]] work, and refers to [[Implicit Core Beliefs]] about oneself; particularly a person's (or group's) belief in their ability to cope and achieve - by //their own// ability, strength and resourcefulness.
[[Family Work]] is often directed at increasing the Self-efficacy of the [[Family]] as a whole, which may "lose confidence" that it could ever manage the behaviours displayed by a young person without external/professional support.
[[Motivational Work]] stresses the need to "Support Self-efficacy" - this involves taking the client's [[Autonomy]] very seriously - allowing THEM to be the author of any change in their lives, //not// the [[Key Worker]] or therapist. Sometimes this will mean accepting that a person is choosing //not// to stop a damaging behaviour at this time.
In adulthood this is relatively simple - the adult is generally considered responsible for his or her choices. However, with young people, //and in particular where there are [[Child Protection]] concerns//, supporting self-efficacy is sometimes more an ideal that shapes practice than the sole reality at play.
Senge (2006) The Fifth Discipline: the Art and Practice of the Learning Organisation. Random House Business Books
See [[Developing learning organisations]]
Link to Amazon UK: http://www.amazon.co.uk/dp/1905211201
!Amazon blurb:
Peter Senge, founder and director of the Society for Organisational Learning and senior lecturer at MIT, has found the means of creating a 'learning organisation'. In The Fifth Discipline, he draws the blueprints for an organisation where people expand their capacity to create the results they truly desire, where new and expansive patterns of thinking are nutured, where collective aspiration is set free, and where people are contually learning together. The Fifth Discipline fuses these features together into a coherent body of theory and practice, making the whole of an organisation more effective than the sum of its parts.
Mastering the disciplines will:
* Reignite the spark of learning, driven by people focused on what truly matters to them.
* Bridge teamwork into macro-creativity.
* Free you from confining assumptions and mind-sets.
* Teach you to see the forest and the trees.
* End the struggle between work and family time.
The Fifth Discipline is a remarkable book that draws on science, spiritual values, psychology, the cutting edge of management thought and Senge's work with leading companies which employ Fifth Discipline methods. Reading it provides a searching personal experience and a dramatic professional shift of mind.
This edition contains more than 100 pages of new material about how companies are actually using and benefiting from Fifth Discipline practices, as well as a new foreword from Peter Senge about his work with the Fifth Discipline over the last 15 years.
These brief notes on Senge's use of systems thinking are not intended to be comprehensive. For those of you interested in the organisational aspects of your team or service, we would recommend reading 'The Fifth Discipline'. The intention here is to illustrate some of the main themes so that you can judge whether further reading would be useful.
!'Laws' or principles of the Fifth Discipline
Senge lists eleven 'laws' that underpin his systems approach.
#Today's problems come from yesterdays solutions
#The harder you push, the harder the system pushes back.
#'Solutions' often result in short term gain before they get worse.
#The easy way out of a problem often leads back into the problem
#The cure can be worse than the disease
#Faster is slower
#Cause and effect are not closely related in time and space
#Small changes can produce big results but the areas of highest leverage are often not obvious.
#High quality and low cost may not be opposites but may be related to each other over time.
#Dividing an elephant in half does not produce two small elephants
#There is no blame
!Processes in systems
The core process is ''feedback'' in relation to goal directed behaviour. Senge emphasises two types of feedback:- ''amplifying'' and ''balancing feedback''. Amplifying feedback is more obvious and similar to positive feedback. Balancing feedback is often implicit and unrecognised and represents the process of adaptation to the goal behaviour (e.g. new initiative). Balancing feedback may be experienced by managers as 'resistance' but often represents the adaptation of systems to the wider implications of whatever new developments are taking place.
!Common system 'archetypes'
Senge suggests that there are several repeated system patterns that are helpful to be able to recognise.
#''Limits to growth''- 'running out of steam'
#'''Shifting the burden'' - moving the problem to somewhere else
For organisations (and leaders) the challenge is to try to gain ''leverage'' on systems that may be behaving in unintended or unstable ways.
PAGE IN PROCESS OF BEING DRAFTED
Personal mastery is the second of the five disciplines advocated by Senge. It emphasises that the development of staff within an organisation is not just good for business but has intrinsic value to the individuals in the organisation. People like learning to be good at things. Why do they like it? They like it because they like it. Some of the ideas around supporting the development of personal mastery may seem to be somewhat idealistic. Again, you are invited to read the book itself to develop your own judgement on this. Personal mastery starts with some very key assumptions or starting points.
!Key themes
*Theories of organisational development need to have an explicit set of ideas as to why staff learn new skills. Senge argues that this is intrinsically rewarding for people.
*Learning happens more easily in people when work connects with their own sense of purpose. Purpose is different from vision. For example, a purpose could be to make the world a better place for children to grow up in. The vision might be what the organisation could do to contribute to that. For organisations, it is important to be interested in the perceived purpose of their staff.
*Learning may be inhibited by feelings of powerlessness and by negative beliefs about whether the vision of where a person wants to get to can be achieved.
*Organisations need to have an explicit psychology about how people function. Senge advocates for a balance between reason and intuition, a recognition for the role of the sub-conscious and for the place of compassion in supporting individual development and 'mastery'.
!Implications for AMBIT
#Mentalization invites curiosity as to why people do things. Senge's approach similarly places investment in people's intrinsic motivation (or sense of purpose) at the centre of the organisation.
#AMBIT is an open system which explicitly advocates for on-going development of the approach. This is dependent on supporting the development of those working in AMBIT teams to be able to improve the models by moving form positions of powerlessness to an increasing sense of 'mastery'.
Mental models is essentially using a cognitive model which suggests that how we see the world will impact on our feelings and actions to address what we see. ''Collaborative learning'' in an organisation takes place when staff within a team or service explore these mental models together.
!Key themes
*One of the major tasks for an organisation is to enable staff to explore and ''make explicit'' their basic assumptions about what may underpin problems and decisions in their work.
*This is supported by developing:-
**''reflective practice within the organisation''.
**''exploring differences between espoused theory and what we do in practice''
*''balancing enquiry and advocacy''. (pages 183-188 in The Fifth Discipline). This is a very interesting section with respect to AMBIT as it is very similar to [[Thinking Together]]. Senge proposes that the exploration of mental models is active process between colleagues in which there needs to be a balance between exploring the ideas held by a colleague (enquiry) and also being able to be transparent about one's own ideas (advocacy). He observes that ''too much enquiry without advocacy does not promote collaborative learning'' and vice versa i.e. just inviting reflection is not enough.
!Implications for AMBIT
#The degree of fit between Senge's theory of learning organisations and AMBIT is very high. The principle of collaborative learning has been operationalised in AMBIT with techniques such as [[Thinking Together]] and by ensuring that the [[Keyworker well-connected to wider team]].
#Specific observations about the need to balance advocacy and enquiry in team interactions are particularly helpful in developing the process of [[Thinking Together]].
#It is easy to see that the exploration of mental models is extremely consistent with a mentalized approach to team practice. (see [[Working with your TEAM]])
#In our view, the process of manualizing offers an explicit (and additional) method of exploring espoused theory against actual practice. (see [[Manualization]])
Senge is clear that a shared vision for an organisation cant be developed by senior managers devising a vision statement and disseminating this to the wider staff team. A shared vision has to be built out of individual personal 'visions' about what people believe their work to be about.
!Key themes
*Developing a shared vision is a process of enquiry rather than a process of 'selling'. It starts with an assumption that everyone has an idea of what the purpose of the organisation is and encourages this to be shared and made explicit.
*There is a limit as to the degree by which a leadership team can enable individual 'visions' to come together. There may be a degree of chance that brings people together who share a common sense of what the main task is.
*Organisations do not need everyone to have a commitment to the vision. Many people within an organisation may be 'compliant' with the main purpose of the organisation and this is fine (much better than opposition!). However it is often the case that some people within the organisation show a commitment to the vision whereby there is a self investment which goes beyond usual expectations of work.
!Implications for AMBIT
#One of the 'visions' of AMBIT is that it creates a context of continuous learning. Senge offers a framework which is very accepting that not all staff within an AMBIT influenced team will be equally enthusiastic about this.
#Developing a shared vision involves accepting diversity of perspectives on the core purpose of a team or service. More concretely, not everyone is equally enthusiastic about mentalization as an organising framework for what we do. It is important that mentalization does not become a new form of orthodoxy not least because this would close down the capacity of team members to make sense of each others experience of work.
This section is extremely relevant to AMBIT and readers are encouraged to read this section of the book (The Fifth Discipline pages 223-254)
!Key themes
*The difference between ''discussion'' and ''dialogue''. Discussion (like 'concussion' and 'percussion') is characterised as being a process of passing things back and forth between people in order to see which idea will prevail i.e. 'win'. Dialogue is different and means to 'a free flow of meaning between people'. People are no longer primarily in opposition but are participating in developing common meaning. One feature of dialogue is that ''people become observers of their own thinking'' i.e. mentalize.
*Dialogue needs three conditions.
**All participants must suspend their assumptions
**All participants must view each other as 'colleagues'.
**There must be a facilitator who 'holds the context' of dialogue.
*Dialogue may not necessarily lead to action. Focusing back on action and decisions may need discussion. ''Teams need both dialogue and discussion.''
*Learning organisations are characterised by 'productive conflict' i.e. they are not conflict free. Non-learning teams tend to be characterised as either 'conflict free' (on the surface) or being 'highly polarised'.
*Defensive processes which block dialogue are common and pervasive. Hierarchical structures may present particular challenges for overcoming defensive positions e.g. I don't want to show my boss that I don't feel confident of what to do. Learning teams are not free of defensive processes but aim to recognise and address them when they can be observed.
*Teams need structures or processes that enable them to practice team learning.
!Implications for AMBIT
#AMBIT is a team approach and team learning is central to the effective delivery of such an approach.
#In AMBIT, manualization has been an operational technique to promote team learning. It may be helpful to conceptualise manualising within a broader process of team learning i.e. the purpose of the manual is to support team learning.
#Further development and clarification of the role of the facilitator in team learning processes may be useful, particularly taking into account hierarchical structures and ways of addressing likely defensive processes which will occur in all teams.
This is still being written
!1. Integrating learning and working
##Always ensuring reflection concludes in action e.g. [[Thinking Together]]
##Knowing that learning takes time - avoid quick fixes if possible
!2.Starting where you are with whoever is there
##Working with people across all levels of the organisation
!3. Becoming bi-cultural
##Working in the language of the dominant culture.
##Balancing the voices of tradition and innovation
!4. Creating practice fields
!5. Connecting with the core of the business
!6. Building learning communities
!7. Working with the 'other'.
!8. Developing learning infrastructures
Senge described the characteristics of organisations which were in his phrase 'learning disabled'. These were:-
*''I am my position''. - the focus of individual staff being on doing their job well without consideration of the wider purpose.
*''The enemy is out there'' - focus on external factors outside of control
*''The illusion of taking charge'' - the tendency for management to become increasingly 'proactive' in difficult situations, often making things worse.
*''The fixation on events''- focus on short term performance rather than longer term strategy
*''The parable of the boiled frog'' - not noticing small but important changes in the system which over time will be critical to organisational prosperity.
*''The delusion of learning from experience'' - many of the most important decisions are the ones in which the impact of the decision will only be realized after several years. Not easy to learn from these.
*''The myth of the management team'' - management teams rarely function as a team and often individual managers mainly concerned about protecting their part of the organisation.
!!What is it?
The idea of Sensitive attunement has come from research into [[Attachment]]. It is closely linked to the process of establishing a [[Secure Base]] (if the parent is sensitively attuned to the mental state of the infant/child (if they can [[Mentalize|Mentalization]] them effectively and reliably enough), then they are much more likely to become associated with security, and to act as a kind of safe harbour from which the child can go out and explore. In addition, the sensitively attuned adult is the one most likely to gain [[Epistemic Trust]].
!!Using this idea in AMBIT
Here we are thinking about how the WORKER can maintain sensitive attunement with their CLIENT...
This is one of the THREE elements that [[Active Planning]] requires that we [[hold in balance|Holding the Balance]], if the plans that we make and promote are to have any likelihood of taking hold and resulting in meaningful change:
#[[Making plans for change]]
#[[Broadcasting Intentions]]
#[[Sensitive attunement]]
!!An exercise in developing sensitive attunement
[img[StatusUpdate.jpg]]
The steps above, asked in this particular sequence (//''Where?, Who?, What?, Why?''//) can help to shape a conversation, stepping worker and client into an exploration, by assuring safety at the most fundamental levels:
* Addressing ''physical safety/comfort'' in //"Where?"//
* Addressing ''relational safety'' in //"Who?"//...before stepping into the more explicitly "mentalizing" levels:
* Addressing the ''//What?//'' - developing an accurate descriptive perspective (what psychologists refer to as a 'meta-perspective') on what is going on - in my head, between us, etc. - a kind of cool observer's-eye-view.
* Addressing the ''//Why?//'' - a more explicit [[Mentalization]] of the person/people engaged in the behaviours/situation in question - how might we account for why in their minds this is what is required?
!!These steps can form the basis of a self-reflection exercise, too
Try going for a short walk and asking these same core questions of oneself, in relation to a concern about work, etc.
Practising this in one's personal life can enrich the ways that it is put to use in clinical situations (see [[Work on the Self]].) The point is not to create a "sensitivity-by-numbers" but to create just enough structure to provide //containment// for thinking/mentalizing to become active.
As the young person begins (according to predictable [[Developmental Considerations]] and cultural expectations) to separate from the family of origin she also has to adjust and adapt in relation to new Social Systems.
An aspect of the difficulty here is that the parents may have been used up to that point to maintain equilibrium, compensating for aspects of inadequate personality and social development, but this no longer works once the YP is obliged to give priority to developing close peer relationships, sexual relationships and work or study which is increasingly separate from the family.
This may be complicated by one or both of the parents having used the child to compensate for their own problems, for example the mother having pressed the child to stay at home to keep her company.
Separations may also trigger [[Attachment Behaviours]] at the point at which they occur, which has a known (and detrimental!) effect on [[Mentalization]]
The [[Core Features of AMBIT]] defines eight markers of the AMBIT ''STANCE'', and these collectively define the five key features of [[AMBIT]] ''PRACTICE'' that are the elements of //service delivery// without which AMBIT cannot be said to be delivered. These key features of practice are laid out below:
!!1. [[Mentalization]]
Just as it is a skill that is //formed// within relationships, and is essentially about //negotiating and acting adaptively// within relationships, so [[mentalizing|Mentalization]] in AMBIT might be seen as the 'oil' that helps to lubricate the various related parts in the complex system required to help very complex young people and families; different workers and different methods of working.
AMBIT insists on [[Working in multiple domains]], and this is included in the process of drawing up the [[Formulation and Treatment Aims]] - which is essentially about developing a [[mentalized|Mentalization]] understanding of [[What's the problem?]].
Many of the interventions that an AMBIT practitioner makes with young people or their families are designed explicitly to increase or repair mentalizing.
In AMBIT, mentalizing is also plays a key part in determining how //individual// and relatively //autonomous// team members work together in a //[[team-based|Key worker well-connected to wider team]]// approach.
!!2. [[Active Planning]] - as part of [[Working with your CLIENT]]
A key innovative feature of this approach is the promotion of [[Working in multiple domains]] mainly (at least initially) via one [[Key Worker]] - who have also been described as [[BarefootPractitioners]]; these are trained to deliver a wide variety of interventions in multiple domains and contexts.
To avoid the gravitational pull towards chaos in such conditions, [[Active Planning]] is applied //to make explicit the goals// (intentions) underlying all work - from the briefest interactions (//[[Thinking Together]]//) to the long term [[Care Plan]].
!!3. [[SupervisoryStructures]] - as part of [[Working with your TEAM]]
Clear [[SupervisoryStructures]], including //[[disciplined ways of managing peer-to-peer case discussion|Thinking Together]]// support the [[Key Worker]] who is often exposed to highly invalidating environments that reduce their own capacity to use [[Mentalization]]
!!4. [[Addressing Dis-integration]] - as part of [[Working with your NETWORKS]]
As part of the [[AMBIT stance|Core Features of AMBIT]], the [[Key Worker]] //[[takes responsibility|Taking Responsibility for integration]]// for trying to increase the integration of services and informal support networks around the young person by taking active steps in [[Addressing Dis-integration]].
!!5. [[Manualization]] - as part of [[LEARNING at work]]
[[Specific interventions]] are [[manualized|Manualization]], using a novel wiki-based approach, that encourages a marriage (or conversation) between 'top-down' evidence-based modules, and 'bottom-up' ''//locally-authored//'' material that documents a local team's ongoing learning ("practice-based evidence") and existing expertise. Included in the manual are the [[Boundaries]] that help to [[SUSTAIN best practice]].
This is a vital part of the [[AMBIT]] model, and discussion of this should form a regular part of [[Team Meetings]]. It falls under the principle that workers in an AMBIT service should [[Respect local practice and expertise]] (one of the [[Core Features of AMBIT]]).
The team needs to develop a culture of constantly harvesting feedback from their who are [[Experts By Experience]], and, crucially, ''feeding this into [[Your Manual]] to adjust what is delivered if required.''
!!Recruiting clients to help develop the Service:
On taking on a new client one of the early tasks included in the CheckLists is to let them know HOW they can feed back suggestions and information (either anonymously - give them some Stamped Addressed Envelopes for the team administrator, marked ExpertsByExperience), or by giving a message directly to their Key Worker), and WHAT will be done with this information.
!!Regular reminders of our interest in feedback.
This can be an empowering manoeuvre - especially if things have become "stalled"; the [[Key Worker]] can adopt a non-expert ([[Mentalizing|Mentalization]]) approach that takes responsibility for things not working as well as they might:
//"I got things wrong here in some way. Can you help me be clear about where I went wrong so I can take that back to the team and we can get your advice written down in our manual?"//
!Measures of Service User Experience of Care
The CAMHS Outcomes Research Consortium website offers various versions of the well-validated CHI-ESQ (Experience of Service Questionnaire) for different age-groups, or Parents.
Access these via the [[CORC website|http://www.corc.uk.net/]], or directly for different groups:
[[CHI-ESQ 12-18yr olds self report|http://www.corc.uk.net/wp-content/uploads/2012/05/Self-ReportESQ12-181.pdf]]
[[CHI-ESQ 9-11yrs self report|http://www.corc.uk.net/wp-content/uploads/2012/05/Self-ReportESQ9-111.pdf]]
[[CHI-ESQ For parents whose children have been seen|http://www.corc.uk.net/wp-content/uploads/2012/05/Parent-Chi-D.pdf]]
[[CHI-ESQ addendum for children/young people living away from home|http://www.corc.uk.net/wp-content/uploads/2012/05/ESQ-Addendum1.pdf]]
!!OpenSource parallels
This approach is also in keeping with the OpenSource model of developing flexible, responsive and pragmatic solutions to computing problems; [[AMBIT]] aims in some senses to emulate this model for combining and refining therapeutic techniques and interventions drawn from many sources.
The plan below provides a teaching session outline for a half day session on mentalization set out in a more formal learning format.
* See also [[Local Session 03: Mentalization]] for more general guidance for shorter "bitesize" session for a team.
* See also <<tag [[Training Exercises for Mentalization]]>> for specific exercises.
This is offered as a suggestion for a training event and also a structure that can be useful in ensuring that training activity is linked to training objectives.
<<image [[session 3 page 1]] width:600 height:480>>
<<image [[session 3 page 2]] width:600 height:480>>
<<image [[session 3 page 3]] width:600 height:480>>
>Session Rating Scale (SRS) (Miller, Duncan and Johnson, 2002)
>Outcome Rating Scale (ORS) (Miller and Duncan, 2000)
The Session Rating Scale (SRS) is a simple, four-item visual analogue scale designed to assess key dimensions of effective therapeutic relationships. The SRS is administered, scored and discussed at the end of each session to get real time alliance feedback from young people and carers so that alliance problems can be identified and addressed (Miller, Duncan, & Johnson, 2002).
The SRS translates what is known about the alliance into four visual analogue scales each 10cm long to assess the clients’ perceptions of:
* Respect and understanding
* Relevance of the goals and topics
* Client-practitioner fit
* Overall alliance
!!Purpose
Describe what a session plan is and why it is worth drawing them up.
!!Why plan sessions?
This is part of the [[Active Planning]] that is one of the [[Core Features of AMBIT]]. It is important to plan Sessions/Appointments ahead of time - even if only briefly; research into effective interventions suggests strongly that work that is carried out according to a plan, and within a clear structure tends to produce better outcomes for the young people. Active Planning incorporates the fact that at times our "best laid plans" are inappropriate to a mentalized assessment of the young person or family's needs - but it is still helpful to know if I am "on-plan" or "off-plan".
Session plans are important for the [[Key Worker]], who may struggle to maintain a sense of momentum without clear [[Active Planning]] - both to structure the //long term// trajectory of care, but also the individual steps taken in a //single session//.
A session plan may be no more than
>//"Check family share same understanding of the Crisis Contingency Plans we drew up last week..."//
...or it may be much more detailed.
!!What to include?
*What is the focus to be?
*How does this fit with the priorities identified in your RiskAssessment and [[Multi-Domain Assessment]]?
*What techniques or [[Specific interventions]] do you plan to use?
*How will you measure the success of the session [[Evaluating outcomes]]?
!Timing - when to start
Individual therapy will only be formally put in place after the initial crisis and assessment phase of the intervention. However, since the KW will have been meeting the YP throughout that time, this early work will have laid the basis for the individual work. Individual meetings of some sort will be a part of the treatment package in the majority of cases but will be tailored to the needs and capacities of the YP.
!Sessions - timing and location
As a standard arrangement individual therapy will take place either once or twice a week for 40 minutes at the office of the KW. At the time of setting up the treatment plan some YP's may feel unable to travel to the office. In this case shorter meetings will be offered in the YP's home but an explicit aim will be that the YP becomes able to travel to the office (see starting individual treatment). In some case the YP may find that 40 minutes is more than he can tolerate in which case the KW (after discussion with the team) might decide to offer 20 minute meetings, at least initially.
!Relating individual work to other interventions
The relationship between the individual therapy and other therapeutic interventions (e.g. medication, family meetings) needs to be made very explicit and preferably confirmed in writing to family members and other members of the therapeutic team. An integrated treatment approach gives much higher prominence to making clear the links between the pragmatic, theoretical and specific aims of each part of the intervention plan.
In addition, from the beginning, the treatment plan needs to include regular planned methods by which components of the intervention are shared and considered as part of an integrated intervention. This is essential as there is a continuous risk that the most uncomfortable issues are mutually displaced by either the therapist or the young person and other family members on to other components of the overall treatment. Such arrangements need to include planned meetings between professionals and the family to review the overall progress of the therapy, clear agreements about information sharing, particularly including telephone calls and email communications. In addition, there should be clear procedures for actions by the therapist and the wider professional team in response to predicted high risk situations such as self harm, violence or threatened violence towards others or psychotic type symptoms.
Similarly, the relationship between individual therapy and parents/carers needs to be made explicit and supported in writing. The separation of roles of client and patient for young people often differentiates work with young people compared with adults. In this way, the parents/carers may often be the ‘client’ in the sense that they are the primary motivators for the young person attending therapy and, in this sense, are stakeholders in the treatment. Maintaining parental confidence in the value of the treatment is central to supporting individual treatment and pragmatic and transparent arrangements need to be made with the parents about how this will be done.
!Typical Course of therapy
Broadly the therapy will have beginning, middle and end phases with the addition of a follow up. The exact timing of each will be different for each young person and there will also be overlap of phases in terms of the psychological tasks in each phase. The degree of engagement of the young person with the keyworker is seen as central to the intervention and at all stages of the work the keyworker will endeavour:
*To estimate the degree and nature of the engagement;
*To consider ways to facilitate engagement;
*To be aware of the potential impact (especially negative impact) of other events on engagement, for example unavoidable absences of the KW;
*To keep in the forefront of his mind (the KW's mind) the stage of the overall intervention and to explicitly mark this for the YP. The YP is involved as much as possible in collaborative planning for each stage of treatment and for the future. Great care is taken over not stopping or handing over to another worker, abruptly or without planning.
This guidance applies when a service receives a referral of a young person that they do not already know due to some emerging problem. For services that already know a young person (e.g. a youth club or hostel) this may not apply in the same way.
! Who should be meeting who?
In seeking to establish a helpful relationship with the young person, the AMBIT-influenced team will be motivated by the notion of the “[[Team around the Worker|Keyworker well-connected to wider team]]”. This phrase is used in AMBIT to highlight the critical importance of peer to peer supervisory relationships between workers, but it also invites an alternative (we think mentalizing) or complementary perspective on the young person’s predicament in a multi-professional environment. In considering a new referral to the team, it is an invitation for the worker to ask him- or herself:
>//“Is there perhaps already a worker in relationship with this young person, whom they would see as trustworthy, and through whom they might be introduced either to ‘my’ work, or to me?”//
Critical for this is an awareness that there may be unwanted effects from any intervention, and adding a new worker carries a risk that this could add confusion to a network, or even inadvertently undermine important existing relationships (consider the other stance elements [[Respect local practice and expertise]] and [[Scaffolding existing relationships]]).
In such circumstances, the AMBIT worker might reach out to meet this “key” worker (as defined by the young person, rather than the system) in order to acknowledge how important the relationship they have formed with the young person is, and emphasising the importance of preserving this. It is critical that the entry of a new worker into the clinical field is not seen as a threat to existing work, but as supportive of it, and it may be necessary to explain the rationale for this new team’s intervention - with the hope that the sense the established worker makes of it might then be translated and handed on to the young person. If the young person hears positively of this from a trusted source, there is a higher chance of successful engagement.
It is important to stress that it is not a given that every worker who has already struggled to successfully engage a young person will look upon the arrival of additional workers with unambiguous relief; the AMBIT stance element of “[[Respect local practice and expertise]]” is apparent here, as the AMBIT worker presents him- or herself as actively supportive of the existing worker, and sensitive to the fact that inviting them to try to talk to the young person about this referral, and to explore the young person’s questions about this new worker, might appear as a “big ask” in the face of competing priorities.
! How to set up a first meeting
This is usually arranged through a parent or referrer, but in many situations services may make first contact with the young person, without any contact with parents or other professionals (drop-ins, street level outreach projects.)
* If there is a referral, aim to have a telephone conversation with the parent/referrer //beforehand// to discuss meeting the young person (assuming this is not in breach of any confidentiality agreements).
** Ask parent/referrer //how// she thinks young person would like this meeting to happen?
** Ask about who young person gets on with or trusts? (Is there a positive relationship that you could work through or [[scaffold|Scaffolding existing relationships]]? It may be that an existing worker who already has a good relationship could be supported through active consultation and supervision by members of your team to deliver some of the early work, in terms of information-giving, [[PsychoEducation]] or [[Motivational Work]], for instance, and that this would be more effective than a new worker "muscling in".
** Ask about or make suggestions about a //location//, and //time// for the meeting, and //who should be there?// Where, who would feel safe for the young person?
** Achieving what we call [[Contingent|Contingencies]] care means trying to offer this //quickly// - over the next few days, and at the young person's house, or in whatever place they define as safe (after a preliminary RiskAssessment on our part to ensure this is safe for the //worker//).
* Encourage the parent/referrer to discuss with the young person to convey that his/her views are important, but avoid allowing a young person to have a complete veto on any meeting:
** //If the young person refuses to see any professionals, then one line may be to offer to see the parent/carer (or another trusted adult) first, relaying the message to the young person that they "...Should think up some really tough questions that would need answering", and ask the parent/carer to ask them __on their behalf...__//.
** This can also be done by inviting the young person to bring a trusted worker or parent, and setting up the first meeting as one in which //"you (or your worker) can interview ME - ask me the toughest questions you need to ask, and check out my answers"//. This is a good example of the technique we refer to as [[Broadcasting Intentions]].
* Ask the parent/referrer to get back to confirm that this has been agreed with the young person.
! Note on "Emergencies".
Sometimes referrers can be very stressed and want things done immediately as an emergency.
If a team is not designed to provide a response to an immediate emergency, it needs to know how to direct a referrer to the appropriate emergency service e.g. police, ambulance etc.
See material on:
*CrisisServices
*EmergencyProcedures
*EmergencyResponse
This is a new marker (using [[Tags]]) to gather together the increasing number of different teams working in different contexts, with different client groups or in different geographical locations. The intention is to create opportunities for teams to make connections with each other especially of they think there may be possibilities for useful shared learning.
The teams listed in the different categories here are far from being an exhaustive collection! NB. Other teams wanting to be tagged and included should notify us at ''ambit [at] annafreud [dot] org'' !
<<tag [[Settings for AMBIT implementations]]>>
Sharp, C., Fonagy, P., & Goodyer, I. M. (2006). Imagining your child's mind: Psychosocial adjustment and mothers' ability to predict their children's attributional response styles. British Journal of Developmental Psychology, 24(1), 197–214.
!Abstract
One class of parent-child interaction that has recently received attention is a mother's engagement with her child at a mental level. The current study operationalizes this notion by asking the mothers of 354 7- to 11-year-old children drawn from a larger community sample (N = 659) to guess the responses of their children, who, in turn, were asked to attribute thoughts to their peers in distressing peer-related scenarios. The following predictions were made: (1) mothers would be above chance in the accuracy by which they predicted their children's overall attributional styles; (2) increased maternal accuracy would be an important correlate of reduced psychopathology symptoms in children; and (3) poor maternal accuracy would associate with a maladaptive child attributional response style characterized by unrealistic and overly positive attributions. Results suggested that maternal accuracy was normally distributed with mothers accurately guessing the responses of their children for about half of the social scenarios. Furthermore, mothers were shown to be above chance in the accuracy by which they predicted their children's overall attributional styles. Maternal accuracy was found to be related to child psychosocial adjustment (reduced scores on child psychopathology measures), whilst poor maternal accuracy was associated with ineffective social-cognitive reasoning, as indexed by an unrealistic and overly positive child attributional style. Findings are discussed within the context of the burgeoning literature linking attachment, family talk about feelings and thoughts, and parental mind-mindedness.
[img[Mz Sharp-Bevington.jpg]]
!!Description (from Guilford website)
How can therapists help clients reflect more deeply on their own—and other people's—thoughts and emotions? How can the therapeutic relationship be leveraged effectively to create change? This concise book guides therapists of any orientation to incorporate innovative mentalization-based strategies into assessment and intervention. Complex ideas are clearly explained and illustrated with extensive session transcripts and vignettes. Ways to help clients struggling with dysregulated emotions and behavior are highlighted. Compelling topics include the role of mentalization difficulties in personality disorders, special concerns in working with adolescents, and how clinicians can improve their own mentalizing capacities.
!!Reviews
“Undoubtedly the most clearly written and most easily accessible depiction of MBT that is available to date….This book could, just could, be a game changer. I very much hope that its lively style, its compassionate language, and its genuine human interest provide the foundations on which a new generation of psychologically informed, trauma-sensitive, humane, generous, and competent practitioners will emerge.”
''—from the Foreword by Peter Fonagy, OBE, FMedSci, FBA, FAcSS, Head, Division of Psychology and Language Sciences, University College London, United Kingdom; Chief Executive, Anna Freud Centre''
“This essential book is written by leaders in the scientific investigation and real-world implementation of mentalization-based treatment. In an encouraging, down-to-earth style, the authors render mentalizing accessible and use clinical vignettes to illustrate common pitfalls and effective interventions. The book is well contextualized in the current atmosphere of change toward dimensional understandings of mental illness. It offers needed, practical guidance about how to reach clients who feel chronically alienated and misunderstood.”
''—Lois W. Choi-Kain, MD, MEd, Director, Gunderson Personality Disorders Institute, McLean Hospital; Department of Psychiatry, Harvard Medical School''
“This volume offers a clear, accessible approach to mentalization, the capacity infusing our humanity and social world. With so many children and adults needing but unable to access mental health care, the authors make a compelling social justice plea—mental health professionals from multiple disciplines should learn the basic principles of mentalization-informed clinical care to make this efficacious, often life-changing treatment more widely available.”
''—Linda Mayes, MD, Arnold Gesell Professor of Child Psychiatry, Pediatrics, and Psychology and Director, Yale Child Study Center''
“Are you a clinician who keeps wondering what mentalizing is and whether you are ‘doing it’ with your patients but are never sure? If so, then, expert or novice, this is the book for you. In everyday language, the authors explain the concept of mentalizing, how it develops, and how to change your clinical practice to enhance mentalizing in your clients and yourself. The authors use research findings to underpin recommendations for clinical practice and provide simple take-home messages for effective mentalizing treatment in the consulting room. Abundant clinical examples and a carefully constructed dictionary of key terms and concepts help transform academic discourse into clinical reality.”
''—Anthony Bateman, MA, FRCPsych, Visiting Professor, University College London, United Kingdom; Honorary Professor, Copenhagen University, Denmark''
!The Side Bar is very useful!
It helps you sort, jump around, search, and work with pages and content in the wiki. It can be folded in and out of sight with the little arrows on the topbar (highlighted with the arrow and the red circle).
Below this picture, we describe the key features in the order they appear on the picture, and how to use them. Mostly pretty obvious, but ''do look at the 'Tabs''' as these can really help the 'power user'!
<center>[img[Sidebar.png]]</center>
!Site Title
You can change your local manual's Site Title [[here|SiteTitle]]
!Site Subtitle
You can change your local manual's Site Subtitle [[here|SiteSubtitle]]
!Tool Icons
There are lots of tools, and we have selected a few for you, but you can get others if you feel the need (via the Tabs - see below - but only techies need this)
!!!!Home icon
Click this and the wiki goes back to the default pages that open on starting.
You can change the pages that you want to show at start up by adding or deleting page links in the page (this kind of wiki often calls pages "Tiddlers" and we are sorry, but that is how it goes!) called DefaultTiddlers
!!!!Weird hashtag icon
Click this and you will automatically generate a web link that (if you post it to a friend) will open up the manual ''with exactly the selection of pages that you currently have open'' - this is good if you are talking about a piece of work and want to share a selection of relevant pages.
You can also send a link for a single page (see [[Create shareable weblinks to specific manual page(s)]] for more detail - this is a very helpful feature of the manual because it means it is a ''giant collection of shareable worksheets''!))
!!!! Plus (+) Sign
Clicking this (only visible if you are [[Logged in|Log in]]) generates a blank new page that is opened in 'edit mode' so you can start to [[Edit]] new content (see [[Using the manual to RECORD learning (manualization)]] for more details)
!!!!Paperclip icon
This allows you to upload material (pictures, PDF's) to your manual that other people will then be able to see and download. (Remember these manuals are [[OpenSource]] and there are [[Manualization Boundaries]] - which are pretty simple: nothing confidential, and YOU are responsible for content you upload, not the AMBIT programme (we reserve the right to remove content, but don't moderate actively.)
!!!!Cloud icon
This is only visible if you are logged in and shows the synchronisation status of your version of the wiki with the online version. You can use these wikis when you are OFFLINE, even edit content, except you wont get any of the ''streaming [[Videos]] content'' - but it is //certainly best to be online if you are editing content//, and //don't close your browser down// if you are editing offline or the cloud isn't showing its reassuring 'tick'!
!Search Bar
See [[Search Bar]] - there is another one on the top bar, too.
!Tabs
You will see a set of 'tabs' below the search bar, titled as follows:
!!"Open Pages" tab
This is the tab that is most useful to keep open when browsing. It ''lists links to all the pages that you __currently have open on your desktop.__''
''You can flick from open page to open page'' by clicking on the links in this tab.
''You can close pages'' from this tab by clicking the little X beside each page link (Unlike a standard website, here multiple pages can open in the same browser window, stacking up as a list - that is why you //DON'T use your browser's 'back' and 'forwards' buttons, but just navigate with links within the page//.)
!!"Our Pages" tab
This tab lists all the pages that ONLY EXIST in your local wiki (i.e. are new material you have created by [[Using the manual to RECORD learning (manualization)]] or locally-edited versions of pages that already existed in the AMBIT core content that your manual has 'inherited'. ''Useful for finding a page your team has previously created or adapted.''
!!"Recent Edits" tab
This tab lists all the ''pages that have been changed in sequential order (the most recent changes first)'' - changes that are //LOCAL to your own manual are marked with a bright yellow sticker,// but you will also see the sheer number of changes that are occurring to the main AMBIT content, which is constantly being updated, improved, and built upon in response to [[Feedback please!]] from workers in the AMBIT [[Community of Practice]] and trainees.
!!"More" tab
Not for the faint-hearted, and not really necessary for most users. From here you can access all the 'guts' or 'machinery' that makes these unique wikis (called TiddlyWiki) work, and if you are a serious editor there are various useful functions here. For the brave, seek out information at https://tiddlywiki.com or from the remarkably friendly and helpful online [[TiddlyWiki Community|https://tiddlywiki.com/#Community]]
!Signs of Safety Child Protection Practice Framework (2nd edition, 2011)
Published by:
Australian Department for Child Protection
189 Royal Street
East Perth WA 6004
Telephone: (08) 9222 2555
Country free call: 1800 622 258
http://www.childprotection.wa.gov.au
!Access online:
[[Link to online PDF|https://www.dcp.wa.gov.au/Resources/Documents/Policies%20and%20Frameworks/SignsOfSafetyFramework2011.pdf]]
Or see it below:
<html><div align="center"><iframe src="https://www.dcp.wa.gov.au/Resources/Documents/Policies%20and%20Frameworks/SignsOfSafetyFramework2011.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
A systematic review of the effectiveness of Signs of Safety was published by What Works Centre for Children's Social Care. in 2021. This is a highly relevant and quite unusual report in suggesting their is no evidence to suggest the Signs of Safety has led to changes in practice or changes in outcomes. The report is extremely interesting as a study of the problems of implementation even for a high profile initiative such as this.
A summary of the main findings can be found at https://whatworks-csc.org.uk/wp-content/uploads/WWCSC_Signs-of-Safety_summary-report_Jan-20212.pdf
A link to the main report - https://whatworks-csc.org.uk/wp-content/uploads/Signs_of_Safety_a_mixed_methods_systematic_review.pdf
The report is clear that there is little evidence that SoS has resulted in changes for children and families, or for front line workers. There is some indication that kinship care occurs less frequently in SoS sites even though this would be contrary to SoS approach.
There longer report is full of observations about implementation which are highly relevant to AMBIT firstly be recognising the disorganised nature of large scale implementation and also the need to remain very unambitious. Like AMBIT the training was well received. But this was perhaps the only clear positive finding that came out of the evaluation. Using Kirkpatricks model, it appeared that change took place only at level 1, satisfaction with training.
!These are important responses to [[Affect storms]].
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/Z8y1sR3rzKg?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/Z8y1sR3rzKg?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
!Simmering down techniques include:
#Drastic, if not dramatic, //“stop, stop, stop” interventions// ("pressing the pause button") - See [[Pause and Review]].
#The therapist may even have to ''stand up'' and use his/her hands and arms, like a conductor, to ask for momentary silence, saying: //“I can see how good you are at getting each other excited – this looks like a well rehearsed act…. How many times have you performed it so far? 10 times, 100 times, 1000 or more times? Is it getting anywhere? Does it help or stop thinking? Let us take a deep breath and think about what happened here and how helpful or useless it may be to have more of the same….”//
#''Focusing techniques'', such as those hypnotherapy-inspired manouevres suggested by Milton Erickson, may help to create a calm space. It is a deliberate move to block dysfunctional, spiralling and seemingly ‘mindless’ interactions between family members.
#''"prescribing"'' tight time-frames for each family member to express what needs to be expressed, be that thoughts or feelings. The technique of ''“60 seconds each”'' invites turn-taking and enforces temporary listening. Using a stop-watch introduces light-heartedness, particularly if the therapist is the time keeper, inviting each family member to express themselves during the allocated time slot and indicating aloud when “times is up, next please”.
#The therapist may need to actively ''change the focus and shift it'' onto another mentalizing topic.
#If working with just the parental couple, see: [[Taking a break]], which is an example of the [[Therapist's use of Self]].
Siri, M. (2012). Mentalization-based therapy for adolescents. gap 26, 62-65.
(In Swedish).
Retrieved September 9, 2012, from http://www.mellanrummet.net/nr26-2012/Artikel-Om-AMBIT.pdf
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1182 1182" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-10986,-2729)">
<g id="Artboard2" transform="matrix(0.805473,0,0,0.805473,2088.06,2683.23)">
<rect x="11047.2" y="56.864" width="1466.35" height="1466.35" style="fill:none;"/>
<clipPath id="_clip1">
<rect x="11047.2" y="56.864" width="1466.35" height="1466.35"/>
</clipPath>
<g clip-path="url(#_clip1)">
<g transform="matrix(4.11075,0,0,2.11266,837.055,-157.835)">
<g id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M10.574,17.92C10.664,27.585 17.723,36.064 27.584,37.626C32.336,38.378 36.965,37.403 40.83,35.164C40.739,25.498 33.681,17.02 23.819,15.458C19.067,14.706 14.439,15.682 10.574,17.92L10.574,17.92Z" style="fill:rgb(164,222,232);fill-rule:nonzero;"/>
</g>
<g id="Shape1" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M20.646,35.171C25.728,32.232 29.492,27.111 30.482,20.865C31.824,12.39 27.669,4.307 20.659,0.25C15.576,3.189 11.813,8.31 10.824,14.556C9.481,23.03 13.636,31.114 20.646,35.171L20.646,35.171Z" style="fill:rgb(164,222,232);fill-rule:nonzero;"/>
</g>
<g id="Shape2" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M0.5,35.186C2.577,36.384 4.904,37.229 7.412,37.626C18.405,39.367 28.74,31.858 30.482,20.865C30.64,19.869 30.722,18.878 30.732,17.898C28.654,16.7 26.327,15.856 23.819,15.458C12.826,13.718 2.491,21.226 0.75,32.219C0.592,33.215 0.51,34.206 0.5,35.186L0.5,35.186Z" style="fill:rgb(164,222,232);fill-rule:nonzero;"/>
</g>
<g id="Shape3" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M30.732,17.898C30.721,18.878 30.64,19.869 30.482,20.865C29.492,27.111 25.728,32.232 20.646,35.171L20.646,35.171C14.572,31.655 10.641,25.116 10.573,17.92C14.438,15.682 19.067,14.706 23.819,15.458C26.327,15.856 28.654,16.7 30.732,17.898Z" style="fill:rgb(101,95,170);"/>
</g>
<g id="Shape4" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M20.6,43C16.076,43 12.404,39.328 12.404,34.803C12.404,30.278 16.076,26.607 20.6,26.607C25.124,26.607 28.797,30.278 28.797,34.803C28.797,39.328 25.124,43 20.6,43Z" style="fill:rgb(255,219,0);fill-rule:nonzero;"/>
</g>
<g id="Shape5" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M30.674,25.337C26.15,25.337 22.477,21.665 22.477,17.141C22.477,12.615 26.15,8.944 30.674,8.944C35.198,8.944 38.87,12.615 38.87,17.141C38.87,21.665 35.198,25.337 30.674,25.337Z" style="fill:rgb(255,219,0);fill-rule:nonzero;"/>
</g>
<g id="Shape6" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M10.502,25.337C5.978,25.337 2.305,21.665 2.305,17.141C2.305,12.615 5.978,8.944 10.502,8.944C15.026,8.944 18.698,12.615 18.698,17.141C18.698,21.665 15.026,25.337 10.502,25.337Z" style="fill:rgb(255,219,0);fill-rule:nonzero;"/>
</g>
<g id="Shape7" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M36.504,22.9C35.017,24.404 32.954,25.337 30.674,25.337C26.15,25.337 22.477,21.665 22.477,17.141C22.477,13.252 25.19,9.993 28.824,9.154C30.083,11.833 30.764,14.809 30.732,17.898C32.976,19.193 34.929,20.9 36.504,22.9Z" style="fill:rgb(252,172,204);"/>
</g>
<g id="Shape8" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M12.945,37.737C12.595,36.826 12.404,35.837 12.404,34.803C12.404,30.278 16.076,26.607 20.6,26.607C25.124,26.607 28.797,30.278 28.797,34.803C28.797,35.831 28.607,36.815 28.261,37.722C28.036,37.694 27.81,37.662 27.584,37.626C25.066,37.227 22.73,36.377 20.646,35.171C18.311,36.522 15.696,37.411 12.945,37.737Z" style="fill:rgb(252,172,204);"/>
</g>
<g id="Shape9" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M12.464,9.181C16.041,10.06 18.698,13.292 18.698,17.141C18.698,21.665 15.026,25.337 10.502,25.337C8.264,25.337 6.235,24.439 4.756,22.984C6.356,20.933 8.337,19.215 10.573,17.92C10.563,16.811 10.644,15.687 10.824,14.556C11.126,12.649 11.686,10.848 12.464,9.181Z" style="fill:rgb(252,172,204);"/>
</g>
<g id="Shape10" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M12.016,25.197C11.103,22.923 10.597,20.463 10.573,17.92C12.971,16.531 15.663,15.629 18.496,15.323C18.628,15.908 18.698,16.516 18.698,17.141C18.698,21.147 15.818,24.486 12.016,25.197Z" style="fill:rgb(255,106,172);"/>
</g>
<g id="Shape11" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M29.284,25.22C25.421,24.559 22.477,21.191 22.477,17.141C22.477,16.512 22.548,15.899 22.683,15.311C23.06,15.349 23.439,15.398 23.819,15.458C26.327,15.856 28.654,16.7 30.732,17.898C30.721,18.878 30.64,19.869 30.482,20.865C30.24,22.389 29.834,23.845 29.284,25.22Z" style="fill:rgb(255,106,172);"/>
</g>
<g id="Shape12" serif:id="Shape" transform="matrix(8.34412,0,0,16.2357,2489.68,97.5646)">
<path d="M14.37,29.479C15.873,27.721 18.108,26.607 20.6,26.607C23.126,26.607 25.386,27.751 26.89,29.55C25.22,31.848 23.085,33.761 20.646,35.171L20.646,35.171C18.153,33.728 16.022,31.776 14.37,29.479Z" style="fill:rgb(255,106,172);"/>
</g>
</g>
</g>
</g>
</g>
</svg>
a manual of developing practice
This is a very simple technique for approaching a large area of practice.
* First slice it into a series of 'chapters' - the key larger topic areas that all need to be covered to give a proper overview
* Then 'dice' each of these into smaller sub-topics and details
{{Slide1.JPG}}
{{Slide2.JPG}}
If the severity of the presenting difficulties allows it, it is better to build a relationship over a number of brief visits (coupled with telephone and/or face to face meetings with family members) which allow the young person time to build trust.
A daily succession of ten minute visits over the course of a week or more may be required to signal the worker's good faith and thus acceptability to a young person - particularly if you need to manage [[Paranoid]] states of mind. The worker must recognise that this often frustrating process may raise questions in her mind as to the value of her work, and be prepared to review this process as required, using the appropriate SupervisoryStructures.
See the [[Wikiedia entry|http://en.wikipedia.org/wiki/Social_capital#Definitions.2C_forms.2C_and_measurement]] for a good profile of what is meant by this useful term:
<html><div align="center"><iframe src="http://en.wikipedia.org/wiki/Social_capital#Definitions.2C_forms.2C_and_measurement" frameborder="0" width="100%" height="600"></iframe></div></html>
An important influence on any family-based intervention (see [[SystemsTheory]]) arises from an understanding of the social context within which the family and its members function. Traditionally, environments are thought of as a set of concentric circles, each nested within another, the individual at its centre, surrounded by the nuclear family, extended family, friendship network, neighbourhood network, and community.
<<image [[SocialEcologyPicture]] width:600 height:400>>
It is self-evident, and very much at the core of our understanding of these families, that difficulties within one ecological context are never independent of what is happening in others, therefore effective intervention at the level of the family must entail attention to problems in the school or peer context, and even more broadly to cultural pressures, that can arise for example because of the minority status of the family. These pressures may be eased by helping the family to understand the way in which they interact with the more immediate tensions within the family, or - where the external social system (such as a school or social services) is serving the family poorly, this may be helped by enabling this aspect of the system to understand the family. [[Attachment]] processes also operate between the individual and social systems, and detachment from these systems, and the institutions representing them such as school or neighbourhood, is known to be a risk factor for mental health problems. Working towards a reattachment is highly desirable, and this can be begun within a crisis intervention.
<<tabs "[[Working with the Social Ecology]] [[Mapping social-ecological needs and goals]] [[Mapping social-ecological resources]] [[Allocating community tasks and recognising gaps]] [[Implementing social-ecological change]]">>
This tradition, emanating from social learning theory, concerned with the cognitive structures that govern behaviour, has been particularly helpful in suggesting strategies for changing behaviour by pinpointing and restructuring dysfunctional cognitions.
Elaborate packages of [[Cognitive Behavioural]] interventions have been developed to deal with many specific types of both emotional and behavioural problems, including [[Depression]], [[Anxiety]], [[Conduct problems]], symptoms of [[Psychosis]], and [[EatingDisorders]]. In the context of a crisis-intervention programme, it will often not be appropriate to deploy the full packages, either to the parent or to the YP. However, using this approach may help to resolve the immediate crisis, after which further work along the same lines could be continued as needed by the CAMHS team.
A social-cognitive framework is also very relevant to the Assessment (see [[What's the problem?]]), in terms of identifying ideas that distort either the interpersonal relationships within the family, or the relationship of the family to the community. Interventions in crises might not be aimed at modifying these cognitions, but rather modifying others' expectations and attitudes in relation to such distortions. One aim of cognitive therapy is to prevent the same problems causing a crisis in the future, by helping the YP, the family and the network to recognise early signs that the YP is again becoming overwhelmed by distorted thinking.
See the notebook on [[Cognitive Behavioural]] work for basic principles and simple manualized practices that draw on this theoretical model.
Print a set of cards with common psychiatric and other "day-to-day" symptoms or problems on them. Examples are listed below.
You will use these as a helpful way of externalising problems, and in particular placing problems into a //timeline//...
It is helpful to be quite playful in these sessions, and potentially to have a digital camera to hand to photograph the visual reresentation of the crisis that you will generate.
Select which of these cards are relevant to the young person. Flick through them, as if you are playing a game of cards - show, or read out, each one, and if necessary expand on the meaning of the symptom described (this may be especially necessary for some of the symptoms of psychosis such as ideas of reference, or paranoia.) It can be helpful to have symptoms written out, as this makes asking about them less intrusive. Any cards that are rejected, as not being recognised or remembered can be tossed away in a playful way, so that what is left is a pile of symptoms that have all at one time or another been acknowledged.
You may need to have some blank cards handy to write additional symptoms on, that were not covered on the original card set.
Once you have selected the relevant cards, spread them out on the floor, and use the whole length of a room to lay out a "cascade" of symptoms, starting from the earliest things noticed, and leading up to the wide range of symptoms and signs that were apparent at the most florid part of the episode. this can take a while to arrange - typically the number of cards fans outwards as you approach the critical point (hospitalisation, attendance at A+E, Police called, etc...) and young people may find this exercise moving, educative, or upsetting.
You can photograph the finished work if the young person agrees.
Inviting family members or other trusted friends, etc, to come and examine the cascade, and perhaps to ADD any details that the young person may not have noticed, is a helpful way to develop a more systematic understanding of the difficulties, and may shed new light on the development of symptoms.
Then try to divide the timeline/cascade that you have created into three clear "phases":
*''Amber'' - Early warning signs
*''Red'' - Late warning signs
*''Blue-light'' - Crisis signs
These can subsequently go towards planning your ''Relapse Drill'', which is really a particular version of your [[Crisis Contingency Planning]] - different actions will apply (who to call, what to do, what medication to take, etc...) for each of the different stages you have identified.
!Examples of useful symptoms to include:
These ones focus on [[Psychosis]] and are taken from Max Birchwood, Elizabeth Spencer and Dermot McGovern //"Schizophrenia: early warning signs"// Advances in Psychiatric Treatment (2000) 6: 93-101, but additional signs and symptoms can easily be added as required...
Thoughts are racing
Senses seem sharper
Thinking you have special powers
Thinking that you can read other peoples minds
Thinking that other people can read your mind
Receiving personal messages from the TV or radio
Having difficulty making decisions
Experiencing strange sensations
Preoccupied about 1 or 2 things
Thinking you might be somebody else
Seeing visions or things others cannot see
Thinking people are talking about you
Thinking people are against you
Having more nightmare
Having difficulty concentrating
Thinking bizarre things
Thinking you thoughts are controlled
Hearing voices
Thinking that a part of you has changed shape
Feeling helpless or useless
Feeling afraid of going crazy
Feeling sad or low
Feeling anxious and restless
Feeling increasingly religious
Feeling like you’re being watched
Feeling isolated
Feeling tired or lacking energy
Feeling confused or puzzled
Feeling forgetful or far away
Feeling in another world
Feeling strong and powerful
Feeling unable to cope with everyday tasks
Feeling like you are being punished
Feeling like you cannot trust other people
Feeling irritable
Feeling like you do not need sleep
Feeling guilty
Difficulty sleeping
Speech comes out jumbled filled with odd words
Talking or smiling to yourself
Acting suspiciously as if being watched
Behaviour oddly for no reason
Spending time alone
Neglecting your appearance
Acting like you are somebody else
Not seeing people
Not eating
Not leaving the house
Behaving like a child
Refusing to do simple requests
Drinking more
Smoking more
Movements are slow
Unable to sit down for long
Behaving aggressively
We have suggested that ''all that we label as //"psychopathological"//'' may be seen as the mind misperceiving or misinterpreting the status of its own contents and its own functions:
!Trauma
Trauma and its re-experiencing in flashbacks (PTSD) may entail a collapse of mentalizing, evident in an experience of mind-world correspondence wherein mental states are equated with reality ([[Psychic equivalence]]) while simultaneously the sufferer is decoupled from current reality ([[Pretend mode]]).
!Depression
Depression entails the adoption of an over-involvement with mood-related cognitions ([[Psychic equivalence]] in relation to negative self statements, and statements about the world, or the future.)
!Borderline personality
May be viewed as a fear of minds - with a proneness either to avoid mentalizing - using [[Teleological thinking]], or at times to engage in //over-active// (pseudo)-mentalizing that is nonetheless inaccurate ([[Pretend mode]]) and may be overinterpreted ([[Psychic equivalence]]).
!!Psychosis
May be seen as an an overactivity of mentalizing, with [[Psychic equivalence]]
!What interventions are described here? Browse them...
----
Pick from this drop down list of ALL the specific interventions described in the manual: <<tag [[Specific interventions]]>>
List them out according to which [[domain|Domains]] you want to work in: <<tag [[Interventions (by target group)]]>>
----
!Is these Specific Interventions part of
!!Alternative ways to sort interventions:
*
** with the ''individual''
** with the ''family''
** with the ''network'', etc...
!!Selection:
* Interventions are principally selected during the [[Active Planning]] process
* The [[AIM]] questionnaire can provide recommendations about interventions based on actual problems described.
* There are [[AMBIT Practice Boundaries]] which constrain workers in order to ensure they maintain safety (see also our [[Disclaimer]] - practitioners remain responsible for their practice, because AMBIT is definitely not a "therapy-by-numbers")
** All [[Practice]] always takes place in consultation with the team's SupervisoryStructures.
!!Sequencing:
* Further information on sequencing the interventions that a complex situation may call for is also available at WhichInterventionWhen
* There is a range of <<tag CheckLists>> which may help a worker to set things up.
!!Why so many interventions?
* The AMBIT-influenced [[Key Worker]] is trying to offer a fit ([[Contingencies]]) with what the young person or family's specific dilemmas are - not to offer the same "help" whatever the problem.
* The nature of [[Complexity]] in [[Hard to reach]] families, and the AMBIT stance principle of [[Working in multiple domains]] means that a wide range of interventions are likely to be required.
----
The AMBIT project is supported by a number of key sponsors and collaborators, to whom we are extremely grateful.
[[Anna Freud National Centre for Children and Families]]
[[Comic Relief]]
[[James Wentworth Stanley Memorial Fund]]
BT - Osmosoft - open-source collaborator.
[[JeremyRuston]] - open source collaborator
We also acknowledge the [[Cambridge and Peterborough CLAHRC]], that has supported [[DickonBevington]] in a one year Fellowship, looking at teams, workers, and outcomes of AMBIT-influenced services.
{{$:/images/fa5/solid/tasks}}'' Over the next few pages are some examples of non-mentalizing. See if you can work out which mode of non-mentalizing each one demonstrates.''
!!What form of non-mentalizing is the man in this cartoon showing?
<br>
[img [lose some weight.jpg]]
<$button set="$:/state/Revealfat" setTo="correct">Certainty (psychic equivalence)</$button>
<$button set="$:/state/Revealfat" setTo="wrong">Quick fix (teleological)</$button>
<$button set="$:/state/Revealfat" setTo="wrong">Pretend Mode</$button>
<$reveal type="match" state="$:/state/Revealfat" text="correct">
That's right! The man is ''certain'' that the woman meant that he is fat when she suggested making changes to his appearance. This is just one interpretation and it's not possible to be certain about what she really meant.
</$reveal>
<$reveal type="match" state="$:/state/Revealfat" text="wrong">
No, this is actually an example of ''certainty'' (psychic equivalence). The man is certain that the woman meant that he is fat when she suggested making changes to his appearance. This is just one interpretation and it's not possible to be certain about what she really meant.
</$reveal>
!!What form of non-mentalizing is the black knight (the one who gets his arm chopped off) demonstrating?
<br>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/ZmInkxbvlCs?start=85" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<$button set="$:/state/revealblackknight" setTo="wrong">Certainty (psychic equivalence)</$button>
<$button set="$:/state/revealblackknight" setTo="wrong">Quick fix (teleological)</$button>
<$button set="$:/state/revealblackknight" setTo="correct">Pretend Mode</$button>
<$button set="$:/state/revealblackknight" setTo="hide">Reset</$button>
<$reveal type="match" state="$:/state/revealblackknight" text="correct">
Yes. The black knight is in ''pretend mode''. He maintains he is fine - "tis but a scratch" - and this appears very removed from the reality of the situation!
</$reveal>
<$reveal type="match" state="$:/state/revealblackknight" text="wrong">
No, this is actually an example of ''pretend mode'' (psychic equivalence). The black knight maintains he is fine - "tis but a scratch" - and this appears very removed from the reality of the situation!
</$reveal>
!!What form of non-mentalizing is Frasier (the guy who comes through the door 30 seconds in) in this cartoon showing?
<br>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/b--LSrWfzS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<$button set="$:/state/Revealfrasier" setTo="correct">Certainty (psychic equivalence)</$button>
<$button set="$:/state/Revealfrasier" setTo="wrong">Quick fix (teleological)</$button>
<$button set="$:/state/Revealfrasier" setTo="wrong">Pretend Mode</$button>
<$reveal type="match" state="$:/state/Revealfrasier" text="correct">
Yes, that's right! Frasier immediately becomes ''certain'' that his dad spilt the oil on the carpet intentionally, and that he did it because of his "latent hostility". He doesn't consider any other perspectives.
</$reveal>
<$reveal type="match" state="$:/state/Revealfrasier" text="wrong">
No, this is actually an example of ''certainty'' (psychic equivalence). Frasier immediately becomes ''certain'' that his dad spilt the oil on the carpet intentionally, and that he did it because of his "latent hostility". He doesn't consider any other perspectives.
</$reveal>
!!Claire and Megan are social workers. What form of non-mentalizing is Megan (the blonde one with glasses) demonstrating?
<br>
{{teleology drinking at work.jpg}}
For more cartoons like these see [[Harry Venning's Claire in the Community|https://twitter.com/harrymvenning]]
<$button set="$:/state/Revealwine" setTo="wrong">Certainty (psychic equivalence)</$button>
<$button set="$:/state/Revealwine" setTo="correct">Quick fix (teleological)</$button>
<$button set="$:/state/Revealwine" setTo="wrong">Pretend Mode</$button>
<$reveal type="match" state="$:/state/Revealwine" text="correct">
Yes. Drinking is Megan's "immediate, effective and anaesthetising" ''quick fix.'' Although she is mentalizing well enough to recognise it isn't the best way to cope with things!
</$reveal>
<$reveal type="match" state="$:/state/Revealwine" text="wrong">
No, this is actually an example of ''quick-fix''. Drinking is Megan's "immediate, effective and anaesthetising" ''quick fix.'' Although she is mentalizing well enough to recognise it isn't the best way to cope with things!
</$reveal>
!!What form of non-mentalizing is the man in the red top demonstrating?
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/naleynXS7yo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<$button set="$:/state/Revealwine" setTo="correct">Certainty (psychic equivalence)</$button>
<$button set="$:/state/Revealwine" setTo="correct1">Quick fix (teleological)</$button>
<$button set="$:/state/Revealwine" setTo="wrong">Pretend Mode</$button>
<$reveal type="match" state="$:/state/Revealwine" text="correct">
Yes. The man in red is in ''certainty''. He is making assumptions about the intentions behind the texts messages, and doesn't consider that they can be taken in more than one way. It seems that as he gets more upset, he interprets the messages more and more negatively.
He is also demonstrating ''quick fix thinking'' when he suggests they fight it out.
</$reveal>
<$reveal type="match" state="$:/state/Revealwine" text="correct1">
Yes. The man in red is demonstrating ''quick fix thinking'' when he suggests they fight it out.
He is also in ''certainty'', making assumptions about the intentions behind the texts messages, and doesn't consider that they can be taken in more than one way. It seems that as he gets more upset, he interprets the messages more and more negatively.
</$reveal>
<$reveal type="match" state="$:/state/Revealwine" text="wrong">
No, this is actually an example of both certainty AND quick fix.
The man in red is in ''certainty'', making assumptions about the intentions behind the texts messages, and doesn't consider that they can be taken in more than one way. It seems that as he gets more upset, he interprets the messages more and more negatively.
He is also demonstrating ''quick fix thinking'' when he suggests they fight it out.
</$reveal>
!!!You've now completed this section: rejoin the group call
!This is a model of understanding change
* It is chiefly associated with the work of Prochaska and ~DiClemente and derives from the field of [[Motivational Work]] (Miller and Rollnick).
!Why it matters
* It suggests that it is critically important to [[Assess Stage of Change]] so that you can then [[Adapt your Discourse]] accordingly to fit this.
!A cycle is proposed:
#[[Pre-contemplation]] leads to...
#[[Contemplation]] which leads to...
#[[Making plans for change]] which leads to...
#[[Action/Making change]] which leads to...
#[[Maintenance]] which we hope may ''NOT'' (but accept that sometimes it may) lead to...
#[[Relapse]]
<<image [[StagesPicture]] width:480 height:320>>
!Why this matters:
It is the stage of change that should allow practitiones to [[Adapt your Discourse]] to fit in with "where the young person is" - otherwise there is a risk that you will be //"speaking the wrong language"// and this will lead to misunderstanding and a loss of [[Engagement]].
!Training
There are some <<tag [[Motivational Training exercises]]>>
![[Respect local practice and expertise]] Vs. [[Respect for Evidence]]
[img[stance tension learning.jpg]]
![[Scaffolding existing relationships]] vs [[Managing Risk]]
[img[stance tension client.jpg]]
![[Working in multiple domains]] vs [[Taking Responsibility for integration]]
[img[stance tension networks.jpg]]
![[Individual key worker relationship|Key Worker]] vs [[Key worker well-connected to wider team]]
[img[stance tension team.jpg]]
!!Purpose
This is a checklist of tasks for the [[Key Worker]] who has been allocated a new client and who is starting out on an assessment.
!!Before you start:
* [_] - ''Understanding the principles:'' The //principles// behind developing a [[mentalized|Mentalization]] understanding of your client, and further detail on the process of gathering the information and putting it to use, are found under the tag [[What's the problem?]], and at [[Active Planning]].
* [_] - ''Understanding the timeline:'' The [[Key Worker]] needs to have a grasp of the [[Phases of AMBIT work]] in the [[Intervention timeline]], especially the [[INITIAL PHASE]] which includes material on assessment and determining and sequencing a treatment plan. Getting the sequence of [[WhichInterventionWhen]] is hard, and occasionally the [[key worker]] may feel "[[I'm stuck: what next?]]" - there is useful material here to support you.
!!First contact
* [_] - ''Managing first contacts:'' - A [[Key Worker]] should understand how to manage a new, or potential, referral. There is material on [[Processing a New Referral]], and there are [[Referral Criteria]], which your local team will need to edit.
* [_] - ''[[Setting up a first meeting]]'' - the first face to face contact is all about [[Engagement]], and the beginnings of addressing the question of [[What's the problem?]].
!!Keeping notes
*[_] - ''Keeping notes:'' - We advise all services to keep records in accordance with their local [[Governance]] agreements, as this is a key element of [[Managing Risk]] for all concerned.
!!Introductions
*[_] - Explain who you are, what the service is, who works with it, and our interest in [[Service User Feedback]].
!!What's the problem?
*[_] A [[Multi-Domain Assessment]] which is a 4-part assessment including:
*[_] The [[AIM]] assessment
*[_] A narrative account via [[Narrative History]]
*[_] A [[RiskAssessment]]
*[_] The [[Dis-integration grid]] - a tool for understanding, and increasing the coherence and integration of care across the network.
!!Formulation:
When you have developed enough undersatnding to make a formulation, you can draw up aims, plans and resources from this.
*[_] A record of the current [[Formulation and Treatment Aims]] in this case.
!!Active Planning
[[Active Planning]] is one of the [[Core Features of AMBIT]]; it is important that this way of working is not just improvisation! Supports for this include:
*[_] The [[AIM]], once completed within the manual, will generate [[AIM suggested interventions]] that it will help you rank in different ways.
*[_] [[Thinking Together]] is a key part of the routine of drawing up a Care Plan, requiring use of the team's SupervisoryStructures.
*[_] [[Crisis Contingency Planning]] is completed, covering the most predictable crises, and recorded alongside longer term planned care in the....
*[_] Care Plan - which is regularly reviewed and updated, as per the Care Programme Approach (CPA) in the NHS.
*[_] The [[Client Case Review - Date and Agenda]] must be set, to review the [[Formulation and Treatment Aims]], and Care Plan. (This would be a CPA meeting, in an NHS setting.)
!!Preparing for work
*[_] Develop a list of QuickWins to provide opportunities to maintain momentum and engagement when these falter (see also [[I'm stuck: what next?]] to address this common dilemma.)
!!Building evidence
*[_] Complete and record the relevant initial [[Outcomes|Evaluating outcomes]] (e.g. [[CGAS]], HoNOSCA, [[YPOR - Drug and Alcohol Outcomes]], etc...)
We recommend [[AMBIT Training]] to start with. See also [[Guidance for Teams Considering Applying for Training]].
There may be ways to use the material here together with the materials for the AMBIT Basic Five Day Training to support locally-based training, but [[Implementation Science]] is quite clear in recommending the benefits of external training as one of the elements of establishing sustainable change in team practices. As the materials on this website are deliberately kept "open source" there is no bar on local teams using the materials themselves - though use of these training materials for direct profit is prohibited under the [[Licensed]] terms under which it is released.
There are also some useful resources at [[Technical aspects of how to set up wiki manuals]] - designed to support the team to negotiate and arrange for the kinds of changes in I.T. that their organisation might need to make to support the use of the [[TiddlyManual]].
It is important for the practitioner to clarify in his or her mind what are the ''SIMPLE BONES'' of the story or problem that they wish for help in thinking about. In conversation with a colleague about this problem I must ask myself:
>//what information does my colleague need in order to help me decide on actions that will address my concerns?//
There is never time to tell the //whole// story, so the [[Key Worker]] must act as a faithful editor, trying to represent to the best of his ability the account that has been given, but in an abbreviated form. Over-long "STORYTELLING" is in fact a version of [[Pretend mode]] thinking.
There is a balance to be struck between:
#Providing sufficient data and information to convey the richness and complexity of the story, and...
#Applying sufficient discernment to provide practical knowledge rather than an overwhelming "sea of facts."
!!''Adding links''
We do this to create narrative coherence. At times, in telling the stories of our clients, we are drawn into //adding// detail - that connects facts and which adds to the overall //coherence// of the narrative. This is tempting, and to some extent inevitable if we are to help our colleagues form "three dimensional" pictures of young people. It is important that if we do find ourselves doing this we MARK the fact explicitly: //"Now this is my assumption, rather than anything Jane has directly said to me, but it seems that after her difficult experience with her father she went on to suffer a series of other difficult relationships with older men..."//
!!''The listener is contracted''
The colleague who has //agreed// to hold a conversation that is //''Marked''// as 'Thinking Together' has effectively //contracted// to hold the speaker to these boundaries - of task, time etc (see [[KeepingYourBearings]]) . It may be necessary to point out:
>//"Hey, we need to keep the SIMPLE BONES here... is this is getting into story-telling?//
...Equally the worker giving the account needs to hold onto this shared understanding of the task, so that such prompts are not taken as //criticisms//. [[Thinking Together]] requires a degree of trust, and allows for conversations that might be seen as blunt, or fast outside of this environment. (Remember that the [[Theory]] of [[Mentalization]] places //error// right at the centre of communication; rather than it being something that is a surprising disappointment, it is to be //expected//.)
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/rqveaXZtR6c?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/rqveaXZtR6c?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
Here, the use of the stethoscope allows playfulness in //slowing down// the act of trying to mentalize another person's position - "listening" to their ''thoughts'' by placing the stethoscope the head, or their ''feelings'' by placing it to their heart. This is particularly popular with younger children, but introduced with the right degree of humour and self-deprecation it can appeal to teenagers and parents, too. In many such cases the actual stethoscope needn't be produced, but it can be raised as an //"as if"// scenario:
>//"Imagine I had some kind of truly fancy stethoscope, that instead of just listening to boring things like the lungs or the heartbeat could hear what a person was really feeling inside, or what they were really thinking... What would you have heard if you'd clapped it on your Dad's head just at that moment when you told him you were planning to leave school?"
The word stigma comes from the ancient Greek name for a mark (or tattoo) designating a low or infamous state, such as slavery. In mental health it describes the negative associations that are appended to the societal perception of mental illness (for instance such people are //assumed// to be learning disabled, morally deficient, dangerous, etc.)
The [[Key Worker]] must be sensitive to the likelihood of this phenomenon affecting their work, most commonly by interfering with engagement, or adherence.
By following the [[Tags]] on stigma the reader will find a range of techniques that are helpful in countering its negative impact.
Much of the reticence to acknowledge mental illness and its symptoms can be related to the profound sense of [[Stigma]] attached to these conditions.
It is important for the [[Key Worker]] to bear in mind the fact that //just to meet with the young person and their family// constitutes a major intervention in the lives of this group of people, and one which (at least in their minds) is potentially //shaming// and //damaging// to future prospects for //work, marriage, social life//, etc.
In one's life as a mental health professional it is easy to underestimate how utterly 'foreign' our daily practices seem to most of the people that we work with (the questions we ask, the stories and experiences we listen to, the control we can exert over people's lives).
Engaging the young person voluntarily on an outpatient/outreach basis is, of course, the ideal. Various [[Engagement techniques]] can assist in this process.
!Published
Springer, 2011
!AMBIT
Describes AMBIT on p.41 ([[Link to preview of page|http://books.google.co.uk/books?id=zuqXTeEyAewC&lpg=PA41&ots=Zjll6Bp40y&dq=tiddlymanuals&pg=PA41#v=onepage&q=tiddlymanuals&f=false]]) and [[Link to Amazon|http://www.amazon.co.uk/Children-Substance-Abusing-Parents-Dynamics-Treatment-ebook/dp/B0051TKUBO/ref=sr_1_1?ie=UTF8&qid=1387494348&sr=8-1&keywords=Children+of+Substance-Abusing+Parents%3A+Dynamics+and+Treatment]].
<html><iframe frameborder="0" scrolling="no" style="border:0px" src="http://books.google.co.uk/books?id=zuqXTeEyAewC&lpg=PA41&ots=Zjll6Bp40y&dq=tiddlymanuals&pg=PA41&output=embed" width=500 height=500></iframe></html>
The Strengths and Difficulties Questionnaire (SDQ) is a brief behavioural screening questionnaire about 3-16 year olds.
The questionnaire includes 25 items, with 5 subscales:
#emotional symptoms
#conduct problems
#hyperactivity/inattention
#peer relationship problems
#prosocial behaviour
The SDQ can be completed by parents of teachers of children aged 2-4 yeard.
The SDQ can be completed by parents, teacher or self report for those aged 4-17. //By Robert Goodman (2005)//
To download the SDQ click [[here|http://www.sdqinfo.org/py/sdqinfo/b3.py?language=Englishqz(UK)]].
----
!!Record scores of this at:
*[[Outcome measures (T1, initial)]] after inital assessment
*[[Outcome measures (T2, 3 months)]]
*[[Outcome measures (T3, treatment close)]].
!7 characteristics of relational strengths in Successful Mentalizing:
!!!1. Curiosity
This refers to an attitude where the individual is genuinely interested in other people’s thoughts and feelings and respectful of the respective perspectives of others. It is also characterised by an expectant attitude that one’s understanding will be elaborated or expanded by what is another person’s mind. It also implies openness to discovery and a reluctance to make assumptions, or hold prejudices, about what others think or feel.
!!!2. The stance of safe uncertainty (Mason 2002) – also referred to as ‘opaqueness’:
This refers to the open acknowledgment that one frequently does not know what other people are thinking, without being completely puzzled or overwhelmed by what happens in the mind of others. This stance is based on a general sense that the reactions of others are to some extent predictable, given the knowledge one may have of what others think and feel.
!!!3. Contemplation and reflection:
This refers to the desire to reflect on how others think in a relaxed rather than compulsive manner.
!!!4. Perspective-taking
This is a stance and attitude which is characterised by the acceptance that the same thing can look very different from different perspectives, which tend to reflect individuals’ different experiences and histories.
!!!5. Forgiveness
This refers to the understanding of the actions of others by basing this on the understanding of their mental states. An example of this is the dissipation of one’s own anger once one has understood why the other person had acted as they did.
!!!6. Impact awareness
This refers to the awareness of how one’s own thoughts, feelings and actions impact on others.
!!!7. A non-paranoid attitude
This describes the stance whereby the individual does not implicitly consider the thoughts of others as presenting a significant threat and having in mind the possibility that minds can be changed.
A focus on strengths and resiliencies is important in this work - particularly as building on these gives more scope for SUSTAINABLE changes.
This is an aspect of one of the [[Core Features of AMBIT]], the stress on [[Scaffolding existing relationships]]:
* Identifying those moments in a young person's functioning that indicate a capacity to mentalize and a more compassionate ''relationship to their self'' (this is one of the key "legs" of [[The Therapist's Mentalizing Stance]], which is [[Highlighting and reinforcing Positive Mentalizing]].)
* Identifying the strengths in a young person's ''network'' can be challenging, but equally it is not uncommon to find that there are more strengths present than at first had seemed to be the case.
* In addition the young person may have particular ''skills or abilities'' that could be part of recognising and supporting [[Self-efficacy]]; re-engaging with these skills, or supporting a young person to find ways or places to use them and excel may have as much impact as any other therapeutic work. For instance supporting a footballer to re-engage with a local club, or for a musician to take up playing again... These are examples of [[Social-Ecological Work]].
Look at the [[AIM questionnaire - interactive version]] for prompts about areas of interest or skills (items are scored "0+" if they are particular strengths.)
!Examples:
*Sporting prowess
*Musical talent
*Membership of a local faith group
*Academic abilities
*Good relationship with an uncle/aunt/etc
*Prosocial friends - who may have drifted away but be "re-connectable".
*etc.
!Resilience Trunks and Maintenance Knots
Most problems can be seen as "knots" emerging from "trunks" of resilience:
[img[https://lh5.googleusercontent.com/-FCX1y_QkW3M/USajOWnhbGI/AAAAAAAAHCQ/79COfvcMZ80/s512/Knots%2520and%2520Trunks.JPG]]
Download a PDF version of this diagram [[here|https://docs.google.com/file/d/0B5h_CVBdhJPYMVBTQUNzUl9sSkE/edit?usp=sharing]]
The concentric rings around the core of a branch (that may be growing in an //adaptive//, or in a //poorly adaptive// direction) are what //support it// to keep growing in that direction:
[img[https://lh6.googleusercontent.com/-dhBqsyqC_j4/USajO_r4KpI/AAAAAAAAHCQ/eUpWSJxcpvg/s512/Maintenance%2520Trunk.JPG]]
This tag collects references to and descriptions of work that is from studies that are not themselves directly connected to AMBIT implementations, but which are seen as being highly //relevant// for AMBIT
This is the same as a Sub-topic. It is what the panel (top right in any page acting as a tag, where they are listed) calls them
Any page that is [[tagged|Tags]] with the title of another page automatically becomes a Sub-topic (or ''Sub-page'' - which is how they are described in the panel that lists them out, top-right of any page that is acting as a Tag) under that heading. Hence the page heading "Dodo" might be tagged with "Birds", but also with "Extinct", etc. Conversely, it would not make sense to tag "Extinct" with the Topic heading "Birds".
!What is this?
This introduces the topic of interventions designed to help access basic needs for families or young people.
!Why?
There are a numerous difficulties that families, children or young people encounter that are
* ''Either:'' a direct lack of a basic resource
** Money
** Food
** Shelter/Housing
* ''Or:'' other problems which are made much more serious (or harder to help) because of a lack of basic resources. E.g.:
** Inability to afford the bus fare to get to the pharmacy to pick up medicine
** Inability to address anxiety in therapy because of impending homelessness
** etc
Anyone familiar with Maslow's HierarchyOfNeed will know how these (along with safety) are some of the most basic foundations of any therapeutic work. To try to do "therapy" with a young person who is starving is a good example of [[Non-contingent]] care! The risk is not just that the therapy is ineffective and thus wastes resources, the risk is that this negative experience of what results from help-seeking influences a child or young person's long-term [[Relationship to help]], making help-seeking approaches later (perhaps in even more critical situations) even less likely to happen.
!What to do
This is an area that necessarily involves a wider network
* Benefits agencies
* Housing Agencies
* Social Care, etc.
Recognising the limits of an individual's or a single agency's power to change things is important if we are to avoid burnout, but equally it is important for teams to develop and hold local knowledge about:
* ''WHO'' (or WHAT AGENCY) to approach for ''WHAT NEED''
* ''HOW'' to pitch approaches to give the greatest chance of success
* Likely ''TIMESCALES'' for help to arrive
There are local variations in relation to Benefits Agencies, Charities, etc, so this is an area that local teams would do well to [[Manualize|Manualization]] as part of their local resources (<<tag [[Our Resources]]>>)
!Manualization task for local teams
Use the [[How to run a team manualizing session]] page to help you create new pages (perhaps make them [[Sub-topic]]s under the heading [[Our Resources]]) to build a database of local contacts, workarounds, etc that team members can use to help access the kinds of subsistence needs that families, children and young people require.
Substance Use is one of the most important [[Comorbidities]] in vulnerable young people.
Consider the amount of stigma attached to substance use disorders, and consider the use of [[Engagement]] techniques.
!!Consider the following information:
*''__What is/are the substance(s) being used__''
**Some young people may be very unclear about what they are using
**Some may appear very certain, but on closer questioning may know less than they make out.
**Names of substances change frequently (much as retailers "re-brand" old products to stimulate new demand) and there may be local variations. It is perfectly acceptable to want to check what a young person means by a specific phrase - indeed, taking a non-expert stance may help [[Engagement]].
**If in any doubt, ask them what the substance looks like, and what amounts they buy it in and how much those amounts would cost them, etc.
*''__Age when first started__''
**The younger a person starts regular use, the poorer the outlook.
*''__How much used (amount/cost per week)__''
**Sometimes it is more helpful to work on cost per week, than weights.
**Be aware that adolescents may be more likely to //exaggerate// the amount they are using (interestingly, this tendency may be somewhat opposite to adults who often //underplay// the amount they are using. though this is of course not a fixed rule.)
*''__Frequency of use (x times daily, or weekly binges, etc)__''
**Distinguishing between binge-patterns of use and regular use is important.
**Regular (daily, or more than once daily) use without "days off" should raise concerns about the possibility of physical dependency.
*''__Circumstances of use (alone/with peers, etc)__''
**In general, lone usage is indicative of more seriously problematic use.
**A pattern of social usage that slowly gives way to lone usage (often on the grounds that sharing the substance becomes too difficult, indicating increasing //"saliency"// of the substance (placing it above other things such as friendships in order of importance) which is one of the features of dependency.
*''__How used (Route of intake; swallow/smoke/sniff/inject etc)__''
**This may be a way to clarify what a young person is //actually// using, as opposed to what they think (or have been told) that they are using.
**Identifying any INJECTING is extremely important as this method of intake is more dangerous by orders of magnitude (risk of accidental overdose, and of serious blood-borne infections are the two most serious risks, along with the risk of local abscesses, loss of limbs, etc.)
*''__Any Other relevant info:__''
**''Drug debts, risky behaviours involved in paying for drugs, reported overdoses, etc''
**This may be a point at which the worker "normalises" some of the more stigmatising aspects of drug and alcohol use, in order to facilitate exploration of risky or abusive experiences.
**//Some of the young people we have worked with, who may have been using substances in ways similar to you, have told us about the ways that along with some of the things they like about doing this, they have also got into awkward or worrying relationships - or found themselves doing things that they wouldn't ordinarily have wanted to be doing. Would it be helpful for me to give you a few examples of the kinds of "pickles" that other young people have told me about?..."//
!!Terminology
In this manual we refer to Substance Use Disorder as [[SUD]] and Treatment may be referred to as "[[Rx]]"
!!Specific substances
* Alcohol Misuse
* [[Cannabis Misuse]]
* Opiate Misuse
* Solvent Misuse
* Stimulant Misuse
!!Interventions
* [[Assessment for SUD-Rx]]
* [[Substance use disorder - treatment]]
!Navigate this "booklet"
Click on the different tabs below to reveal content (by the way, "SUD-Rx" stands for "Substance Use Disorder - Treatment")
<<tabs "[[SUD-Rx principles]] [[SUD-Rx Sessions - CheckLists]] [[SUD-Rx Techniques]] [[Special circumstances in substance use treatment]]">>
Substance Use Disorder (also known as [[SUD]]) in young people may be serious - and should be distinguished from experimentation; Disorder implies that the use of substances is repeated, and that it causes impairment.
There are various ways to classify the seriousness of SUD (commonly a distinction is made between HARMFUL USE and DEPENDENT USE) but in Children and Adolescents we can also speak of ''"early at risk"'' and ''"late at risk"'' stages in the journey towards harmful use and dependence, as it is in the ''initiation'' and ''early progression'' phases that we meet most young people with Substance Use problems (direct external link to this table is [[here|https://lh4.googleusercontent.com/-utBsBfmyG7o/UHMdJBNY02I/AAAAAAAAFRU/p9T0iJwr2SI/s864/SUDClassification.jpg]]):
[img[https://lh4.googleusercontent.com/-utBsBfmyG7o/UHMdJBNY02I/AAAAAAAAFRU/p9T0iJwr2SI/s864/SUDClassification.jpg]]
!What to do for SUD
[[Assessment for SUD-Rx]] - (we use the abbreviation Rx to mean "treatment".)
[[Substance use disorder - treatment]]
See [[Planning a training event in your team]] to help you think about this in more general terms.
Below is a list of possible team training sessions about particular themes that teams could use (or adapt) for local training sessions. These aim to gather key material, and some of the many [[Training exercises]] that the manual contains. They are there for [[AMBIT Lead]]s and [[AMBIT Local Facilitators]] to adapt and build upon - developing their own locally attuned and adapted local AMBIT training session plans.
!!Resources
There are multiple topics listed under [[Training exercises]] that are worth browsing, or select these exercises under sub headings: <<tag [[AMBIT Stance Exercises]]>>.
!!Specially recommended
Here we list the key sessions that we recommend for team-based and locally-organised training sessions:
All such training sessions provide an opportunity for updating and improving the manual.
*''What is AMBIT?''
** [[Local Session 01: What is AMBIT?]]
*''What is AMBIT Training for?''
**[[Local Session 02: What is AMBIT training for?]]
*''Mentalization''
**[[Local Session 03: Mentalization]]
*''Thinking Together''
** [[Local Session 04: Working with your Team]]
*''Addressing Dis-integration''
** [[Local Session 05: Working with your Networks]]
*''Using the Therapists Mentalizing Stance, the structure of the Loop, and specific techniques''
** [[Local Session 06: Working with your Client pt. 1 (Mentalizing stance)]]
*''Active Planning, Broadcasting Intentions and deciding what to do''
** [[Local Session 07: Working with your Client pt.2 (Hard to reach)]]
** [[Local Session 08: Review (1) and Auditing Team Practices]]
** [[Local Session 09: Working with your Client pt.3 (Outcomes)]]
** [[Local Session 10: Review (2) and Top-up plans]]
** [[Local Session 11: Making a real difference - Implementation Science]]
*''What interventions do we do''
**[[Team training session: what interventions do we do?]]
*''Deciding on the intervention''
**[[Team training session: deciding on the intervention]]
!Respect
We emphasise the need to [[Respect local practice and expertise]]
The AMBIT-influenced team works towards finding ways to support and enhance existing SupervisoryStructures
!Set the boundaries
!!1. Agreed ''TIME''
!!2. Agreed ''PLACE''
!!3. Agreed ''PERSON'' (or ''persons'')
//Most AMBIT-influenced teams report that GROUP supervision, often via the [[Team Meetings]] is the preferred setting.//
!!4. Agreed ''METHOD''
* This is generally to structure the conversation around [[Thinking Together]]
* ''The underlying INTENTION'' is to work to recover or sustain mentalizing in the worker in relation to their practice.
** There are clearly additional frameworks involved that form the context for this work, and ''supervision is never a short cut to avoiding/overruling'' contextual factors such as:
*** Existing structures of ''AUTHORITY'' in the team and wider organisation.
*** (Possibly statutory) ''OBLIGATIONS'' as regards working protocols in any team.
!!5. Agreed ''TASK'' of supervision:
Picking the right task for the supervisor is absolutely critical
* The primary ''TASK'' is generally a "practice" question ([[Marking the Task]] that the worker needs help with)
** Generally ''the right topics to cover in supervision are the ones associated with the most anxiety'', and AMBIT's [[Thinking Together]] framework is specifically about thinking in high-stress settings:
*** Consideration of RISK
*** Coping with inter-professional disagreements
*** Inter-agency dis-integration
** However, ''not all topics that require supervisory discussion are //necessarily// highly anxiety provoking'' (by all means ask yourselves //is there anxiety here that is hidden?//) for instance:
*** Redistributing a caseload
*** Planning for a complicated hand-over or referral
*** Considering an extension of work beyond normal timescales
*** Discussing something that went //well//
This is always a medical emergency, and requires proper assessment by the local Mental Health Services. Use your own team's [[Local Protocols]] to arrange for an assessment with the local CrisisServices.
!Key questions to consider:
#What was the young person's intention when they set out on the act?
##Did they take plans to avoid being found?
##Did they write notes, indicating planning?
##How lethal was the method chosen?
##How much opportunity for 'second-thoughts' did the method allow for?
#Is a repeat likely?
##How do they feel about being here now? Do they regret 'failing' or are they relieved?
##Are the same problems that precipitated the attempt still there?
#Is there sufficiently robust support around the young person to keep them safe without being admitted to hospital (most local areas have a policy that insists on admission to a paediatric ward or adolescent crisis bed at least until assessed by the appropriate team.
!A completed suicide
When a young person does commit suicide it is extremely traumatic for all concerned. Unfortunately, we know that young people DO commit suicide, and in spite of all that we do, we are not able to prevent this fact.
*There will be a need to consider the effect on peers - whose own risk for suicide will be increased by this fact.
*There may be a need to link with family members to offer support, and, where possible, explanations.
*There is a need to consider staff reactions.
*There will be a need to consider how to mark such a tragic event in a dignified way that yet values the efforts of those who are left behind.
*There will be a need to review what went wrong, so that any lessons can be learned.
!Warnings and Acts...
There may be suicidal ''warnings'' or suicidal ''acts''.
You should see also [[Self Injurious Behaviour]] when there are episodes of actual damage/harm or suicidal actions are ocurring.
!A suicidal warning may be:
(a) An attempt to warn people that a Suicidal Act is about to take place - so it should ''always be taken seriously''.
(b) An attempt to influence people's behaviour - which can have a negative effect on those around the young person:
>//"This person is trying to manipulate me! this is just attention-seeking!"//
*The RISK in this situation is that a genuine "cry of pain" can get overlooked.
*The REAL ISSUE if someone is seen as "attention-seeking" is:
*@@color(red):WHAT PROBLEM REALLY NEEDS ATTENDING TO?@@
(c) An attempt to communicate about an overwhelming emotional experience.
!Effects on the worker:
Hearing a young person say //"I'm going to kill myself"// will often leave the worker feeling:
*Helpless
*Hopeless
*Frightened
*Infuriated
*Panicky
This is likely to reduce the worker's ability to mentalize accurately, but if this can be overcome it is an experience that (through [[Mentalizing the Affect]]) can be a helpful opportunity to develop more accurate understandings of the client, and to deepen the authenticity of the therapeutic relationship.
If left un-processed, there is a risk that such feelings could de-stabilise the [[Key Worker]]'s own [[Mentalization]],
!What to do
The key in these situations is to use the available SupervisoryStructures to help you do some [[Thinking Together]] about this.
*''The feelings that the worker is overwhelmed with may be just the same feelings that the young person himself is struggling to cope with.'' ([[Psychodynamic theory]] would describe this as an example of 'Projective Identification'.)
*Being able to distinguish and work with experiences like this is an example of how [[Mentalizing the Affect]] can help the [[Key Worker]] better work with the young person.
>//"I don't know quite what it must be like going through all the things that you are going through, but I am wondering if it seems important for me - to have a kind of taste of how it feels - to be kind of frightened and furious at the same time? I find myself thinking that I need to be really careful to make sure I have understood what //you// need right now for this to be helpful. Can you help me make sure I have understood things properly, as I may have got this wrong?"//
!Interventions
1. Make a proper assessment - including a good understanding of what happened, as well as covering:
(a) What is the risk of:
*[[Self Injurious Behaviour]]
*[[Suicide Attempt]]?
>See and update your RiskAssessment, and ensure that any risks are addressed in your updated [[Care Plan]]
(b) Why now?
Are there ''recent changes'' in the young person's [[Social Ecology]] or personal history (relationship issues? abuse? impending criminal proceedings? etc) that might be acting as precipitants to this?
(c) How does the young person understand this behaviour?
The young person may have a very clear idea in his or her head as to why they are making these utterances, and what they want, or they may be very confused.
Either way, if the the [[Key Worker]] is to [[Mentalize]] the problem accurately, these are questions that need to be approached.
Ask calmly, respectfully - mindful of the [[General features of a "Mentalizing Stance"]].
!Interventions to reduce Suicidal Warnings?
This depends largely on how the young person and family understands the "behaviour" (i.e. making utterances that falsely give other people the impression that there is a risk they will kill themselves is different from giving a warning because I am worried that I might indeed kill myself)...
Of course we WANT a young person to give suicidal warnings, not to hide suicidal ideas and plans until it is too late. What we want to avoid is the kind of mixed signals whereby the young person wants one thing (care, relief from pain or fear, etc) but asks for another thing ("I want to die".)
If the worker can begin to [[Mentalize]] the young person's position accurately, then root causes can be addressed, and alternative ways for the young person to achieve their ends (i.e. //"I don't want to feel this pain any more"// or //"I want to know that there are people about there who do really care about me"// or //"I am frightened that I am about to get sent to prison."//, etc) sought.
!Techniques that may be applicable:
[[Mentalization Based Work]]
[[PsychoEducation]]
[[Family Work]]
[[Cognitive Behavioural]] work
This is a simple technique that demonstrates to the client that they have been listened to with some degree of accuracy, that their dilemma or state of mind has been taken seriously, and respectfully, and that they have been understood. Accurate summarising in which a client recognises themself in the description is one of the keys to developing [[Epistemic Trust]]. Here there are repeated examples of summarising alongside other OARS features (subtitles mark them out):
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/jMfcEgazcrg?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!What is this?
This page introduces readers to the the use of ~Peer-to-Peer SupervisoryStructures, which is critical for [[Working with your TEAM]], one of the [[Core Features of AMBIT]] practice, and in particular this relates to the AMBIT Stance of [[Key worker well-connected to wider team]].
A key point is that //this is work that involves all the protagonists (our clients, and ourselves as workers) in anxious worrying situations.//
AMBIT trainings spend some time emphasising that ''if this work does NOT make you worried at times, then you are probably in the wrong job'', as you are [[out of touch with the reality of what is at stake|Pretend mode]].
[[Mentalization]], and its fragility in situations of anxiety, is something that underpins __not only__ much of the therapeutic work with //clients//, __but also__ the //relationships between members of an [[AMBIT]] team//. AMBIT-influenced teams place as high a priority on attending to the mentalizing of their professional peers as they do upon stimulating and sustaining mentalizing in their clients.
!!AMBIT Training
The page [[AMBIT Training]] includes a section on [[Learning about Supervisory Structures]].
!!Implications
It is important to note that the kind of peer-to-peer supervision described in AMBIT is not //instead of// ordinary clinical [[Formal supervision]] arrangements (that [[Governance]] arrangements in the wider system will determine) but are an //additional feature//; defining the //particular culture// of [[Working with your TEAM]] that is deliberately and explicitly developed in an AMBIT-influenced service.
!!Live, responsive, accessible supervision
The team is expected to use appropriate technology to support this (mobile phones, telephone conferencing, mobile email, etc), enabling team members to form a [[Reflective Quorum]], flexibly, and at short notice. Seeing this as //part of the daily work// rather than an 'occasional extra' is central to the [[AMBIT]] model.
This core feature is adopted because of the considerable potential for individual practitioners to end up working in isolation in a community setting with high risk and potentially adversarial clients. In our view, apart from impact on staff morale that such isolation can cause, clinical effectiveness and decision-making also become compromised as practitioners struggle to ‘think’ ([[Mentalize]]) in such high stress contexts.
!!A Team around the Worker
We know that [[Mentalization]] is restored in secure relationships. Access to immediate phone or face-to-face supervision needs to be positively supported by a whole team approach, which recognises the need for such back-up as essential to such services. ''Doing this work for each other is seen as a CORE part of a worker's role, not an "added (optional) extra"''!
This is something of a shift from the traditional notion of the "team around a child" (which may still have great value, but can drive [[Dis-integratedInterventions]]), towards an arrangement that is about the ''"TEAM AROUND THE WORKER"''
[img[https://lh6.googleusercontent.com/-Q--oDenShgU/UcD32HjdpVI/AAAAAAAAIlk/tGuG_Ps4QbE/s512/AMBITSpokes_B%252BW.JPG]]
!!Implementing and Sustaining this peer-to-peer supervision
[[Rituals and Disciplines]] within the team define this culture of mutual support, and an important example is the way in which such consultations are marked out and structured (see [[Thinking Together]] and [[Passed-outwards Discussion]].)
The critical component of this process is to enable a conversation to take place between a front line practitioner who is exposed to the full multi-dimensional aspects of the young person’s difficulties and a member of the clinical team who will know the case but who is not emotionally engaged with the family members. The [[Ripples in a Pond]] analogy is used to explain this aspect of the practice. Another metaphor that we routinely use to describe this relationship is to describe the front line practitioner as a deep sea diver in which the meta-team is likened to those in the [[Dive Boat]].
!!Transparency
Such supervisory input is provided in a transparent way with the family and young person so that they are aware that the front line practitioner is supported by a wider team (note one of the [[Core Features of AMBIT]] is the principle of [[Key worker well-connected to wider team]].
!!Team Meetings
The availability of this live supervision needs to be complemented by [[Team Meetings]] which provide weekly group-based [[Formal supervision]] of the clinical team. Such group supervision could be likened to an in-patient ward round in which the weekly treatment goals are reviewed, risks reassessed etc, but with particular attention to ensuring that the meeting addresses the needs of the workers who attend - which is helped by structuring [[Case discussion]] along the lines of [[Thinking Together]] conversations.
!!Line Management
[[Key Worker]]s are under the line-management of a lead clinician who is responsible for ensuring that appropriate supervision is provided for each activity that he or she undertakes. A psychiatrist provides medical assessments, and is responsible for the prescribing of medication and any other physical treatment.
!!The MetaTeam
The Meta-team may in some situations be those [[Key Worker]]s who are not working directly with a particular young person, but who make themselves available to the Key worker who is "in the thick of it" via a [[Reflective Quorum]]. More formally, the MetaTeam refers to the team of specialist professionals who may not sit directly //within// the team, as key workers with caseloads themselves, but who have given consent to an agreed level of consultation to the team about areas requiring more specific expertise.
!!Experts By Experience
The team should aim to recruit over time a panel of [[Experts By Experience]], who can be consulted on problems of managing the difficulties of young people and their families.
Communities of practice do not spring into existence spontaneously, but need support.
In the face of stress at work, time and financial constraints, these kinds of informal supportive structures are often the first to be dropped.
!//Suggestions// for supportive measures under discussion:
* Annual awards for the best examples of a range of AMBIT-influenced behaviours in the community.
* ~AMBIT-trained teams linked to a specific (named) trainer
* //Quid pro quo// arrangements - we visit and run a top-up session but only on the understanding that the local team invites 2 other local/nearby AMBIT teams?
* Newsletter - documenting what is going on in AMBIT teams and the AMBIT project; broadcasting about Outcomes from teams;
* Support with Outcomes measurement, analysis, and presentation.
* An opt-in status to become an ''"AMBIT development site"''
* Mapping of the geographical location of AMBIT trained teams - using a google map, etc.
* Initial training includes a fee for membership of the COP, with the AFC training team acting as a "keyworker" for the team, introducing them to their buddy teams (in same locality, working in similar ways/with similar populations) through joint supervisions, etc.
!Plan - 11.12.15:
AMBIT coordinator to work on developing the most promising of these ideas, or better ones. Feedback from teams is invited to ambit@annafreud.org.
!!Introduction
Developing and sustaining new ways of working presents many challenges for front line teams who are usually experiencing many complex pressures in their work, not only from the high levels of need and difficulties in their clients but also because services themselves are often facing uncertainty and instability and such uncertainties easily dominate a team's experience and functioning. A consultation in November 2014 with a group of team leads who had been trained in AMBIT about a year previously focused on the problems of sustainability of practice. This page is based on some of the ideas that emerged from this meeting.
!!Post training experience of teams
The degree to which teams continued to actively refer and use mentalizing and AMBIT techniques varied. Some of this could be attributed to the degree to which teams felt that the AMBIT approach was helpful to them but some of this was additional to this. Some teams remained very enthusiastic about the AMBIT approach but, even so, found it hard to retain a clear sense of whether they were 'really doing it'. Some of the themes about this were:
*''Hard to develop team confidence in their practice.'' AMBIT leads sometimes did not feel confident in their knowledge and experience of AMBIT in order to practice them and advocate their use in the team.
*''A 'strange and mysterious thing'''. AMBIT has strange words ('mentalizing') and practices ('Thinking Together') and that these had become a bit disconnected from actual day to day concerns.
*''Another thing that we had to do''. AMBIT had become an extra demand on time to fit in rather than a way of handling and reducing demand and pressure. Team members would express the view that they hadn't got time for an AMBIT practice session etc.
*''Disconnected from mainstream team routines and practices''. Core team routines such as team meetings, case discussions, business meetings and supervision did not refer directly to the AMBIT approach in a confident way.
!!Moving forward
A number of themes then emerged as to what processes might be useful to attend to in supporting team practice.
*''Linking AMBIT to supervision.'' Could a mentalizing stance become a component of usual supervisory practice. Would this be experienced as adding value or adding demand? How could it be encouraged so that it was more helpful than burden.
*''Recognising emotional states of team.'' AMBIT offers permission to recognise the emotional states of workers as part of the work. How could this culture be nurtured in such a way that it was linked to a mentalizing stance and did not feel a burden or unboundaried.
*''Developing small realistic explicit objectives'' for the team which were connected with existing team practices and routines.
*''Applying AMBIT ideas to the process of team meetings''. What experiments could be tried which would test whether it increased or reduced burden.
*''AMBIT leads from adjacent teams working to support each other''. This could be done by developing a local support group to sustain energy, gain confidence, problem solve and nurture creativity.
*''Organising a follow-up session with the central AMBIT team.'' This would be targeted at local AMBIT leads and enthusiasts as a way of renewing confidence, tailoring the AMBIT model to local circumstances and nurturing small changes and developments.
<html><iframe width="560" height="315" src="//www.youtube.com/embed/jwmY-2i0tdA?list=PLaZguIPxZjqaudOxA29jJE-ds2eGT3HoV" frameborder="0" allowfullscreen></iframe></html>
Sutcliffe KM, Lewton E, Rosenthal MM (2004) Communication failures: an insidious contributor to medical mishaps. Acad Med. 79(2):186-94.
!Abstract
!!!PURPOSE:
To describe how communication failures contribute to many medical mishaps.
!!!METHOD:
In late 1999, a sample of 26 residents stratified by medical specialty, year of residency, and gender was randomly selected from a population of 85 residents at a 600-bed U.S. teaching hospital. The study design involved semistructured face-to-face interviews with the residents about their routine work environments and activities, the medical mishaps in which they recently had been involved, and a description of both the individual and organizational contributory factors. The themes reported here emerged from inductive analyses of the data.
!!!RESULTS:
Residents reported a total of 70 mishap incidents. Aspects of "communication" and "patient management" were the two most commonly cited contributing factors. Residents described themselves as embedded in a complex network of relationships, playing a pivotal role in patient management vis-à-vis other medical staff and health care providers from within the hospital and from the community. Recurring patterns of communication difficulties occur within these relationships and appear to be associated with the occurrence of medical mishaps.
!!!CONCLUSION:
The occurrence of everyday medical mishaps in this study is associated with faulty communication; but, poor communication is not simply the result of poor transmission or exchange of information. Communication failures are far more complex and relate to hierarchical differences, concerns with upward influence, conflicting roles and role ambiguity, and interpersonal power and conflict. A clearer understanding of these dynamics highlights possibilities for appropriate interventions in medical education and in health care organizations aimed at improving patient safety.
Excellent, and very readable book from Times journalist Matthew Syed, published in paperback, 2016, by John Murray.
How the airline industry developed as a Learning organisation, and what the worlds of health and social care might usefully learn from this. The book is packed with references from airline disasters or near misses from which fundamental learning about the importance for clarity in communication, and other [[Rituals and Disciplines]] emerged, that now make the airline industry a paragon of safe working culture. The parallels with AMBIT, and the applicability of a [[Mentalization]] framework to these accounts are striking.
Systems theory differs from other theories that have contributed to the understanding of psychopathology by ''rejecting the notion of linear causality'' (//"Event A caused event B"//) in favour of understanding causation as a set of ''concurrent, bi-directional, inter-related influences''. Key to understanding Systemic thinking, is an understanding of how we are all influenced by ''feedback loops'' from other parts of the system (other family members, other agencies or workers), and a branch of Systems Theory is [[Positioning Theory]], which emphasises the way individuals are drawn into taking up positions within a system for reasons that may be at least as much to do with the other parts of the system as to do with their own internal motivations and disposition. (e.g. the mother who is drawn into being the soft, forgiving parent in reaction to her partner's perceived harshness, or who is drawn into being the "housework police", ordering and bossing other family members, in relation to her partner's perceived abdication because he works as a long distance lorry driver!)
!!!Influences in all directions
The family is then inevitably more than the sum of its members. Moreover, the psychological problems of one of its members are understood in terms of how they fit into the complex network of interactive motives and understandings that exist within that particular family, shaped as they may be by culture, by history, by biology, and by more current economic and social factors. Thus, //the impact of the YP's behaviour on other family members// is as critical as the traditionally (and often unfairly) promoted causative link between the parents' actions and reactions which were seen as influencing the behaviour of their child in only one direction.
!!!Subsystems
In addition, systems are seen as containing interacting subsystems, thus parent-child or parent-parent dyads are assumed to have an impact on each other, and the inability of the family as a system to cope with and contain the YP may be understood in terms of such subsystem interactions. Within the dyads, symptoms may be understood in terms of dysfunction of the attachment system, but there is then a further level of interaction between the dyads in a complex system.
!!!Intervening systemically
See [[General Systemic Techniques]] and [[Family Work]] in particular.
The aim of a systemic intervention is to identify and then deal with systemic problems that are causing the YP to be felt by the family as 'unmanageable without external intervention'. Understanding this may involve consideration of factors within individual family members, or the way that members are relating to one another, or factors outside the family (the father's work that takes him away for long periods, the mother's poor relationship with her own mother, etc.) By introducing new perspectives and information into the system, highlighting the kinds of unhelpful feedback loops that might be at work, the systemically-informed worker hopes to facilitate the system's own capacity to self-reorganise, so that new (we hope more virtuously self-reinforcing) patterns of relating can be tried out.
!!Recapping AMBIT training
This page gathers key exercises/learning you will have done in your [[AMBIT training|Information About AMBIT Training]] that relate to the quadrant of the [[AMBIT Wheel]] described as:
!!><<tag [[Working with your TEAM]]>>
Note, there is plenty more to AMBIT than what is covered in your training, so feel free to browse further!
The tag below provides you with a dropdown list of all TEAM exercises from the AMBIT Training:
!!><<tag [[TEAM exercises from AMBIT training]]>>
This text is based on the Thrive Elaborated (second edition) document that was published in 2017.
''THRIVE Elaborated. Miranda Wolpert, Rita Harris, Sally Hodges, Peter Fuggle, Rachel James, Andy Wiener, Caroline McKenna, Duncan Law, Ann York, Melanie Jones and Peter Fonagy CAMHS Press.''
!!!GETTING ADVICE
!!!Context.
There is an increased interest in the promotion of resilience, to build the ability of a community
(school/family) to prevent, support and intervene successfully in mental health issues. Initiatives such
as HeadStart (a £75-million project funded by the Big Lottery Fund), the Penn Resilience programme
and others seek to help young people and families to help themselves. A proliferation of digitally based
support (e.g. via email, phone and web) is increasingly becoming available and being used to support
young people in their communities.
!!!Resource.
In theory this is the likely least resource intensive (cheapest) of the needs-based groupings.
If we assume that around 30% would benefit from only limited resource to allow coping and the average amount of resources used was equivalent to two face-to-face sessions then the amount of resource use would be equivalent to 8% of total resource given other assumptions. It is important to note that this is only conjecture at the moment. This framework must be tested and we do not want to make extravagant claims of cost savings without evidence.
!!!Need.
Within this grouping would be children, young people and families adjusting to life circumstances,
with mild or temporary difficulties, where the best intervention is within the community with the
possible addition of self-support. This group may also include, however, those with chronic, fluctuating
or ongoing severe difficulties, for which they are choosing to manage their own health and/or are on the road to recovery.
!!!Provision
The THRIVE model of provision would suggest that wherever possible, this provision should
be provided within education or community settings, with education often (though not always) the
lead provider and educational language (a language of wellness) as the key language used. It is our
contention that health input in this group should involve some of our most experienced workforce,
to provide experienced decision making about how best to help people in this group and to help
determine whose needs can be met by this approach.
Support within getting advice should ''build on existing family resources''. In particular if the difficulty
seems to be in a secure context then draw on these strengths. Coping is defined as there being
sufficient resilience in person and community (context) so as not to be such high risk as to need intervention
if not asking for more intervention.
!!!Key elements.
*Getting advice might include providing families with research or experience-based information related to the difficulties presented to the professional – information is relayed in such a way as to enhance the self-efficacy of the family and increase the chance of taking appropriate ameliorative action;
*using the interview to draw out the options available to the family and inviting the family to consider the pros and cons of each of the options; making suggestions for limited changes in aspects of the child’s and family’s routines;
*helping to identify extant proximal resources both within their social network or support agencies, voluntary groups etc., drawing on resources such as the Youth Wellbeing Directory10 to identify relevant resources; an invitation for re-contacting the service is embedded in the offer of any advice if things do not improve or they deteriorate.
*There are occasions where the young person or family may say they are “coping” and not seek further input, but the professional feels more input is required and the risks of intervention are outweighed by the risks of non-intervention. This would include occasions where there are major risks for the young person, such as of placement or school breakdown; there are significant concerns about deterioration or the context is not deemed safe for the young person or their family. If these factors applied then consideration should be given as to whether the needs of the young person and/or family should be more appropriately conceived of as falling into one of the other needs-based groupings such as getting help, getting more help or getting risk support.
This text is based on the Thrive Elaborated (second edition) document that was published in 2017.
''THRIVE Elaborated. Miranda Wolpert, Rita Harris, Sally Hodges, Peter Fuggle, Rachel James, Andy Wiener, Caroline McKenna, Duncan Law, Ann York, Melanie Jones and Peter Fonagy CAMHS Press.''
!!GETTING HELP
!!!Context.
There is increasingly sophisticated evidence for what works with whom in which circumstances
(Fonagy, 2002), and increasing agreement on how service providers can implement such approaches
(NHS CYP IAPT, 2012), alongside embedding shared decision making to support patient preference
(Mulley, Trimble, & Elwyn, 2012) and the use of rigorous monitoring of outcomes to guide choices both between different types of interventions and within interventions (Bickman, Kelley, Breda, de Andrade, & Riemer, 2011). The latest evidence suggests that a significant minority of young people will not be
“recovered” at the end of even the best evidence-based treatments.
!!!!Data:
Analysis of data from the Payment Systems Project work (Department of Health, 2014; Wolpert,
et al., 2015) (see above, pp.12-16, for fuller discussion) found that of the 60% of children, young people
and families who had difficulties that appeared likely to benefit from goal-focused interventions under
the heading of “getting help”, about half looked likely to be clearly aligned to specific NICE guidance
and half were not clearly aligned, either because of co-morbidity or because the primary difficulty was
not captured by NICE guidance, such as family relationship difficulties.
!!!!Resource:
The average (mean) number of face-to-face contacts for episodes of care within the payment systems pilots was seven. It is hypothesised that the THRIVE model would support more clearly targeted work with some young people getting more intervention and others getting less. It is conjectured that the mean number of contacts for this group might rise (to e.g. 10 – see Table 2 on p.16) but with fewer young people being seen for extended periods of time if it were felt an intervention was not proving effective.
!!!Need.
This grouping comprises those children, young people and families who would benefit from
focused, evidence-based treatment, with clear aims, and criteria for assessing whether aims have been
achieved. This grouping would include children and young people with difficulties that fell within the
remit of NICE guidance but also where it was less clear which NICE guidance would guide practice.
!!!Provision.
The THRIVE model of provision would suggest that, wherever possible, provision for this
group should be provided with health as the lead provider and using a health language (a language
of treatment and health outcomes) with a greater emphasis on ending an intervention if it was felt not
to be working or if was felt gains no longer outweighed costs or potential harms. It is our contention
that health input in this group might draw on specialised technicians in different treatments, possibly
allowing less expensive professionals to provide more procedurally defined interventions.
The most radical element of what we are suggesting is that treatment would involve explicit agreement
at the outset as to what a successful outcome would look like, how likely this was to occur by a specific
date, and what would happen if this was not achieved in a reasonable timeframe.
This text is based on the Thrive Elaborated (second edition) document that was published in 2017.
''THRIVE Elaborated. Miranda Wolpert, Rita Harris, Sally Hodges, Peter Fuggle, Rachel James, Andy Wiener, Caroline McKenna, Duncan Law, Ann York, Melanie Jones and Peter Fonagy CAMHS Press.''
!!!GETTING MORE HELP
!!!Context
There is emerging consensus that some conditions are likely to require extensive or intensive
treatment for young people to benefit. In particular, young people with psychosis, eating disorders and
emerging personality disorders are likely to require significant input.
!!!Data
Analysis of NHS outpatient CAMHS data for payment systems found that “37.8% of all appointments
were attended by the 5.25% most ‘resource-intensive’ patients, who attended more than 30
appointments each”, (Wolpert, et al., p.21) Key problems that were associated with larger amounts
of contact included eating disorders and psychosis. It should be noted that there was great variation
within the groups and that the analysis was not able to consider inpatient treatment. The payment
system pilot work found the average number of appointments for those provisionally allocated by the
algorithm to this group was around ten.
!!!Resource
It is suggested that for some young people and families more extensive treatment is likely
to be required and that these young people are likely to have most impairing difficulties such as
those reflected in eating disorders and psychosis, though there may be many other issues that lead
to significant impairment or requirement for more extensive input. It is hypothesised that the THRIVE
framework may result in an average number of outpatient appointments of around 30 (see table 2 p. 16).
However, it is recognised that, for some of these young people, individual agreements with commissioners
will be needed to arrange payment as the range of costs within this group are so wide.
!!!Need.
This grouping comprises those young people and families who would benefit from extensive
long-term treatment which may include inpatient care, but may also include extensive outpatient
provision. The THRIVE framework proposes that there may be some people currently allocated to
this grouping who are not benefiting from intervention, and are being held in services solely because
of concerns about risk and safeguarding. It is hypothesised that around half of the 10% of young
people currently allocated to this group (as per the payment systems algorithm) might appropriately be
reallocated to getting risk support.
!!!Provision.
The THRIVE model of provision would suggest that wherever possible, provision for this
group should be provided with health as the lead provider and using a health language (that is a
language of treatment and health outcomes). It is our contention that health input in this group should
involve specialised health workers but again it may be that more procedurally defined interventions can
be provided by less highly trained practitioners than may be needed for the decision making required
for getting advice.
!!!GETTING RISK SUPPORT
!!!Context.
This is perhaps the most contentious aspect of the THRIVE model and has certainly been
the need-choice group we have found it hardest to agree a simple heading for. We posit that even the
best interventions are limited in effectiveness. As noted above, a substantial minority of children and
young people do not improve, even with the best practice currently available in the world (Weisz et al.,
2013). There has, perhaps, in the past been a belief (strongly held by service providers themselves) that
everyone must be helped by a service and if they are not then that is an unacceptable failure.
The THRIVE model suggests that there be an explicit recognition of the needs of children, young people
and families where there is no current health treatment available, but they remain at risk to themselves
or others.
!!!Data.
On current data sources available it is not possible to disaggregate this group from the other
groups within the THRIVE model, which are proposed to be used for future payment systems. It is likely
that many, though not all, of this group will be subsumed within the getting more help group above –
and our hypothesised estimate is that this group may account for 5% of all young people accessing
services currently.
!!!Resource.
Practitioner reports suggest this group may require significant input; they certainly take up
a lot of energy in terms of discussions within and between services. Some services report that they are
currently distinguishing members of this group as a group of children, young people and families who
may be termed “not ready” for treatment, or in need of ongoing monitoring. It may be that many are
currently being offered intensive treatment for which they are failing to attend appointments or making
no progress in terms of agreed outcomes. It is suggested that over time this group may be disaggregated
as a distinct grouping for payment systems.
!!!Need
This grouping comprises those children, young people and families who are currently unable
to benefit from evidence-based treatment but remain a significant concern and risk. This group might
include children and young people who routinely go into crisis but are not able to make use of help
offered, or where help offered has not been able to make a difference; who self-harm; or who have
emerging personality disorders or ongoing issues that have not yet responded to treatment.
!!!Provision.
The THRIVE model of provision would suggest that, for this group, there needs to be close
interagency collaboration (using approaches such as those recommended by AMBIT (Bevington,
Fuggle, Fonagy, Target, & Asen, 2013) to allow common language and approaches between agencies)
and clarity as to who is leading. Social care may often be the lead agency and the language of social
care (risk and support) is likely to be dominant. Health input should be from staff trained to work with
this group and skilled in shared thinking with colleagues in social care, but with explicit understanding
that, although it is not a health treatment that is being offered, health staff must play their part in
providing input to support and in some cases lead on risk support provision.
In terms of the support offered within this grouping, it would focus on supporting children and parents/
carers during periods when they did not feel safe and were unable to take ameliorative action to regain
safety. Service users would have access to support from someone whom they know, whom they had
helped select and in whom they had confidence and trust, and who is responsible for coordination of
the support backup-team (this could be anyone in the system, not necessarily a social care worker).
Children and families would have an agreed written safety plan which they participated in drawing up
and which explicitly lists agreed actions to be taken by everyone concerned (including the backup
team). The aim of the support is to develop the children and families’ capacities for self-management
of the emergent needs and the opportunity to exercise this capacity as rapidly as it is feasible to move
people either into the getting advice, thriving or getting help/more help groupings as relevant.
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/Fn2PhfpYoac?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/Fn2PhfpYoac?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
Here the use of the imaginary TV screen and the TV remote controller allows for a playful means of //slowing down// a difficult conversation, and allow different combinations of family members to be in an active or an observing/reflecting position. If the pair 'in the TV' become agitated or lose their mentalizing capacity during their conversation, the observers can playfully "turn the volume down" and discuss the discussion.
!!What are they?
Think of <<tag [[Tags]]>> as pieces of string that connect all the pages that are related to a particular subject area. So a tag (say "Birds") is really just a [[Topic]] or 'chapter' heading, and any pages that are //tagged// with "Birds" become [[Sub-topic]]s under that heading heading (so pages on Sparrows, Eagles, Seagulls and Dodo's might all be tagged with "Birds".)
So far so good - tags are like chapter headings. But in a wiki like this, many individual pages are tagged with a //variety// of tags, allowing for their content to be connected in multiple ways across different areas and different themes - "Dodo's" might __also__ be tagged with "Extinct" or "Dead", for instance. So a single page can be a part of a number of different chapters/topics.
!!Creating a tag when editing
''If you are editing a page'', you will see a box above the main content box titled "tags". Any title to another page added in that box tags the page with that title... Here is a video to show you how: [[Adding a Tag to a page (tiddler) - video]].
One of the interesting features of this wiki format is that a page can be both a "chunk of content" in its own right __and also__ a [[Tag|Tags]] gathering up other pages under its heading.
!!What's the big deal?
There isn't one, really. Tags = [[Topic]] (or chapter) headings and are pages in their own right.
However, because pages can be tagged with multiple other pages, a single page can be a [[Sub-topic]] under a variety of different headings - as if you could have a page in a book that could fit in a range of different chapters simultaneously.
This fosters [[Integrative]] practice...
!!To add or change a tag
If you are editing your manual, it is important to think ''not only about the content, but also how it integrates with (fits into) the wider whole'' - you can help this by adding the right tags. You can add tags when you edit a page (aka "Tiddler" in this wiki format) - it is very easy, see [[A Guide to Editing the Manual]].
If you click on the ''edit'' (pen icon) button on this tiddler, you will see the tiddler in editing mode, and any tag(s) in the bottom box. When adding tags it is important to get the spelling and capitalisation correct. For existing tags you can use the button "tags" right underneath the tags box - it will list off all the tags in the document - select the one you want to add, and it will automatically be added.
This refers to messages relayed by the [[Key Worker]] to the young person or their family, from members of the Team. Usually these will be from other [[Key Worker]]s not working directly with a young person, but sometimes they may come from specialists not directly in the AMBIT team but offering consultation. Most commonly Take Home Messages will be recorded from [[Case discussion]]s, particularly those occurring in [[Team Meetings]].
It is a powerful way of demonstrating to a young person or family that their struggles are being thought about carefully, and that there is a communicative and very 'live' team working in support of their [[Key Worker]]. The young person and Family have an experience of (we hope) carefully mentalized input, that is offered to both them AND their Key Worker, and can be a springboard for new areas of discussion.
!What constitutes a good Take Home Message?
!!Brief
Not too wordy, keep it simple.
!!Always framed in "mentalizing" language
I.e. always ''tentative'', ''hesitant'', rather than presuming to have access to expert knowledge about private experiences. Tending to refer to inferences/hypotheses about //mental states//.
!!May be there to:
##Remind the young person of resiliencies or successes that have been overlooked
##To enquire about new directions where the team would like to encourage exploration
##To challenge unhelpful patterns of behaviour, whilst allowing the Key Worker some freedom from being directly "to blame" for this (this needs to be done very carefully, bearing in mind the nature of the relationship with the Key Worker, and the rest of the team. A challenging message would aim to be:
###Non-accusatory, but more //"We were wondering if it made any sense to suggest..."//
###Positioning itself as offering a 'third position' apart from the Key Worker and young person; which they could then discuss between themselves.
###Never to be read as an ultimatum or threat, or as a simple criticism.
<a class="tc-float-right">[img width= 300 [iceberg.jpg]]</a>
!!{{$:/images/fa5/solid/comments}}What to do
1. Think of a behaviour
*In your pair, one person brings a behaviour observed recently in someone
*It could be a client, another professional (someone in another team who is working with one of your clients), someone from your personal life or even someone from the news
*Describe that behaviour to your partner
2. Perform a deep dive
*Together, try to make sense of what might explain the behaviour
*Use the iceberg diagram to remind yourself of all the aspects you can consider
*If your partner is the one bringing the example behaviour, help your partner to consider things from different angles
*Whilst you are doing this activity, try to take notice of which aspects of the deep dive seem easy and which bits are harder to think about
!!{{$:/images/fa5/solid/clock}} 15 minutes
We will start back in 15 minutes
!!What is this?
This is the first //and last// part of [[Active Planning through the phases of AMBIT work]]
''Planning can't happen without knowing (a) Where are we are starting from, and (b) Where do we want to get to''
//"Taking Aim"// is about the process of [[Assessment]]; it is about holding ongoing ''curiosity'' to learn [[What's the problem?]] so that we are better equipped to make decisions about [[What to do?]].
It is in this stage that we use [[Goals-based outcome measures]] to have a measure of where things are now [[marked out|Marking the Task]] and goals for the work you are doing with a young person of family.
!!Mapping where we are - 4 practical steps
[img[https://lh6.googleusercontent.com/-igIsaDsH-Jg/URG2sSb78wI/AAAAAAAAGp0/u52sBQ9dF94/s640/Compare%2520Maps%2520and%2520Destinations.jpg]]
!!!(a) The AIM
* The phrase //"Taking Aim"// is also a reminder that AMBIT promotes the use of //structured// assessments for mapping //"where are we?"//, and provides one that is built in to the manual, the [[AIM]].
* The AIM is a broad [[Multi-Domain Assessment]] providing [[Goals-based outcome measures]] for the worker and client.
* Some teams may choose to use their existing structured assessments, rather than the [[AIM]]; but there are advantages to the AIM that are worth outlining:
** The [[AIM questionnaire - interactive version]] is embedded in this manual - it is ready to go.
** Completing it (or even just parts of it) will generate lists of [[Links]] to manualized interventions in this manual, specifically indicated for the problems you have indicated in the AIM. (See [[AIM suggested interventions]])
** These suggested interventions can act as a prompt to promote the most evidence-based interventions for specific areas of difficulty.
** In situations where there are multiple complex interacting problems the AIM can help by suggesting ''rankings'' and sequencing for these interventions.
!!! ''(b) Understanding how the young person stands in relation to me (and help) ''
'Develop clarity about the client's [[Relationship to help]] (or to me, the worker) at //this// time.
* This is an example of "Sustaining [[Sensitive attunement]]" Understanding their perspective may help the worker to helpfully adapt to the way they //present// the help they are able to offer. ''How do they see me and my offers of help at this time?''
!!!'' (c) Understanding which phase of work we are in?''
Develop clarity about [[Where are we in the therapeutic journey?]]
* [[Mentalizing theory|Mentalization]] suggests that //knowing which of the Phases of AMBIT work my client and I are currently in is helpful for my state of mind, and clarity about my aims, goals and plans.//
* [[Phases of AMBIT work]] are not necessarily //sequential//, and you may return to earlier phases at those points in time when you are introducing a new focus for the work.
!!! (d) Keep on Mapping!
Taking Aim applies regularly //throughout// the work, too: progress towards agreed [[Aims and Goals]] is measured (see [[Comparing Destinations]] and [[Agreeing Waymarks]] - the next steps in [[Active Planning]]) using your [[Outcomes measures|Evaluating outcomes]] (for instance the [[Key Problems]] identified in the AIM questionnaire (see [[AIM]].) Adaptations of earlier plans may be required to get back on track.
<a class="tc-float-right">[img width= 400 [complexity pic.jpg]]</a>
!!Networks around clients who have multiple needs
Often, the clients we see are experiencing
multiple problems, in multiple areas of their lives.
Mental health problems, histories of abuse & neglect,
substance use, CSE, gang involvement, school
exclusion, physical health problems, poverty, housing
problems, offending behaviour…
These problems interact in multiple directions which makes it difficult to know how best to intervene and in what order.
At times (although not always), the more complex the difficulties, the greater the number of services and professionals that are brought in over time, offering help in different areas of the clients' life.
Sometimes this can work well. However, this is often not the case. Clients can experience the number of people involved as overwhelming, hard to navigate and make sense of.
''In AMBIT we make the assumption that there will almost always be some kind of helping system in place already in a clients' life. Therefore there is a real risk that when we (and other services) become involved, this further disrupts or undermines existing forms of help.''
!!!Mutiple interventions
An additional level of compexity is added because the various interventions that might be offered to address different areas of life are often drawn from different theories, they may represent different treatment //models// (pharmacological, individual work, family work, cognitive behavioural, psychodynamic, etc etc...), and may be delivered by //different workers// or different //agencies//.
As professionals, we are then faced with the challenge of working together in these networks, being clear on our roles, and building shared ideas about what we are trying to do, and where we are headed.
However, clinical experience suggests that this ‘team around the client’ may experience difficulties in working together.
!!!Why?
!!!We work in systems where there are:
* separate minds
* different organisational constraints
* different organisational goals
* different theoretical models
* different practical interventions
* different levels of training and different professional groups
* the possibility of misunderstandings...
!!!There may be many different underlying processes at play...
*Conflict (implicit, unrecognised)
*Rivalry
*Policy contradictions
*False beliefs: These are the kinds of 'mythologies' or 'stories' about other agencies in a network that can arise
So ...it is easy for tasks and arrangements ''that are developed out of the best of intentions'' to pull in opposite directions, or inadvertently to undermine each other.
This can be experienced as overwhelming or simply confusing and aversive for clients. It also can raise strong feelings in members of the network all who are trying their best to help.
''In AMBIT we have a way of making sense of this that we call....''
!Dis-integration
We take the position that no service intends to deliver dis-integrated interventions. But, it is not the job of the client to integrate the various services involved in their lives. We see this as the role that services should take on.
''In AMBIT we believe that each member of the network has a role to play in this. ''
This is called.......
''Taking Responsibility for Integration''.
//Seeing it as my business to do something helpful about Dis-integration in my professional networks is central to work in an an AMBIT-influenced team//
Here Liz Cracknell talks about network complexity and Dis-integration
!!! A video on Complexity & Dis-integration
<html><iframe width="640" height="360" src="//www.youtube.com/embed/lRoOYlPwzWo" frameborder="0" allowfullscreen></iframe></html>
!!!What do we do about this?
!!Working in Multiple Domains
When working with complex difficulties it is rarely sufficient to intervene in one area of a clients' life. There are often things happening in multiple parts (domains) of life that contribute to the overall situation. e.g. being out of work, ongoing family conflict, falling out with friends, drug use, thinking style, past trauma etc. We know that for change to happen we need to do more than focus intervention on, for example, thoughts and feelings alone (i.e. one domain).
''We propose there may be more to gain from offering different interventions through a single practitioner who has a good therapeutic relationship (where there is the potential for [[Epistemic Trust|Epistemic Trust]] and learning), rather than a number of professionals offering help simultaneously, increasing the potential for dis-integration and puts emphasis on clients to manage multiple relationships.''
So the AMBIT worker takes a"wide-angled" approach aiming to support or intervene in different areas of someones life.
''We call this........''
[[Working in multiple domains|Working in multiple domains]]
At the same time, the AMBIT worker tries to help the client (and network) in integrating the interventions that are offered.
''We call this.....''
''Worker Taking Responsibility for Integration''
Exactly how the worker does this will vary and should depend on what is most useful for the client. For example, it may be the role of the worker is to support, and work through helpful relationships which already exist for the client in their network, rather than attempting to build a new relationship with them.
Please see [[Addressing Dis-integration|Addressing Dis-integration]]
This gathers together the tools and practices that AMBIT uses to help workers promote integration and manage dis-integration in their networks.
!!!Workers Taking Responsibility for Integration....
!!!How does it look in practice?
Integration is in the doing as well as the thinking - integration happens between worker and client, and in conversations that take place between worker and teacher, police officer, social worker, etc, etc.
''Below are some examples''
* Developing a shared understanding with a client of the difficulties. Then with their agreement, communicating this understanding with the wider professional network, to help others think about how to approach the work.
*Organising a meeting between key members of the network to find out more about each others roles and understandings of the client.
* A worker helping ''interpret'' to a client information about other parts of the system, what they do and why they are there.
*Leading on from the above, the key worker may physically map out with a client the professional network, helping the client to make sense of the various relationships, how they connect with each other, and their own relationships to each. Please see the [[AMBIT program|The AMBIT Pro-Gram]] which provides a practical tool to do this.
''Note that the worker attempts to hold and model a [[mentalizing stance|General features of a "Mentalizing Stance"]] towards other network members at all times.'' We take particular care not to increase dis-integration that may already exist or feed into pre-existing negative experiences the client may have about what can happen between people around them in their life.
----
If you would like to read more on the theory and ideas around the '''Domains and levels of dis-integration''' and dis-integrative processes, please see the tag <<tag [[Extended learning]]>>.
[[Team around the Worker|Team around the Worker]] provides an explanation of how AMBIT influenced teams may support and work through a key therapeutic relationship in order to increase the chance that the help offered is useful
Therapists at times get caught up in heated exchanges themselves, or feel paralysed by the family’s dynamics.
Here it is important to ''take a ‘breather’''. This can be done by getting up and stating:
''//“Sitting here in the midst of it all makes my head spin…. It stops me from having useful ideas. I need to clear my head – I think I’ll take a short break, I’ll be back in 5 minutes…. feel free to take a break as well or continue arguing if you need to”.//''
The purpose is to create a reflective space for the therapist who may, away from the battlefield of the family, literally clear his head for new ideas and direction, talking to himself outside the consulting room – or indeed with colleagues if this is possible. Leave the session with an explanantion along the lines of: "my own mentalization is really under pressure here!"
You are modelling the fact that ''//"I know my own mentalization (like everyone's) is fragile and I take responsibility for sustaining it."//''
See [[Affect storms]]
Laura Talbot, Peter Fuggle, Zoe Foyston and Kim Lawson. (2020) Delivering an Integrated Adolescent Multi-Agency Specialist Service to Families with Adolescents at Risk of Care: Outcomes and Learning from the First Ten Years //British Journal of Social Work// (2020) 0, 1–20 doi: 10.1093/bjsw/bcz148
Online: https://academic.oup.com/bjsw/article-abstract/50/5/1531/5758003
!Abstract:
This article presents a ten-year service evaluation of the Adolescent Multi-Agency Specialist Service (AMASS), an edge of care service based within Islington Children’s Services. A description of the AMASS model and the social care and mental health outcomes for the cohort of families supported by the service across this period (n = 181) are presented. The service had a completion rate of 85 per cent and improvements in both social care and mental health outcomes were found for a significant proportion of those who completed the intervention. Placement stabilisation was achieved for 82 per cent of young people across the service’s three referral categories (home stability, foster placement stability and return home from care). Statistically significant reductions in parental report scores were found on the Strengths and Difficulties Questionnaire and two measures of family functioning in a paired sample (n = 48). Potential learning arising from the AMASS model, in terms of implications for service design for adolescent edge of care interventions, and the limitations of this service evaluation are discussed.
!!Basic Practice
#AMBIT teams should meet together ''weekly'' (remember one of the [[Core Features of AMBIT]] is the idea of a [[Keyworker well-connected to wider team]] and the emphasis on SupervisoryStructures.)
#During team meetings the AMBIT manual can be projected (LCD projector or large screen) so that all team members can see it and refer to it, and notes can be made (for instance manualizing 'on the fly' (see [[How to run a team manualizing session]], or save the task for later by adding a topic to the [[Local Manualizing Tasklist]] for your team.)
#AMBIT team meeting materials should be made available.
##Project the AMBIT stance diagram (see [[Core Features of AMBIT]])
##Shuffle and hand out cards with each major component of the stance ([[AMBIT stance playing cards]])
##Have your team's Care Pathway Chart, or [[Assessment]] schedule available to support case discussion.
##Have paper copies of the [[Dis-integration grid]] to hand to support complex case discussions.
##Have paper copies of the [[The Egg and Triangle]] available.
!!Why do this?
*One of the distinguishing features of a successful AMBIT team should be the extent to which they talk about their clients, in informative, boundaried ways //''that are experienced by the key players as helpful''//.
*The weekly team meeting is a key forum, where the team comes together to discuss cases, and is the most obvious example of a [[Reflective Quorum]], and a key provider of [[Formal supervision]] in a group format.
*[[Case discussion]] takes place according to agreed [[Rituals and Disciplines]], such as [[Thinking Together]] to ensure that information has the best opportunity to be reflected upon in ways that maximise SAFETY while allowing creative flexibility:
!!!How NOT to do it
This is crudely role-played team meeting where [[Thinking Together]] is NOT used, and the needs and feelings of the worker are poorly mentalized - obviously few teams are quite as poor as this, but consider //are there elements of ''our'' team meetings which could be changed for the better?//:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/CPuTn9ExNuw?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!!Two role-plays of using [[Thinking Together]] in a team meeting:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/jyOQdu9QwAc?rel=0" frameborder="0" allowfullscreen></iframe></html>
<html><iframe width="640" height="360" src="//www.youtube.com/embed/lKI3zeHrQX8?rel=0" frameborder="0" allowfullscreen></iframe></html>
Notes:
* Thinking together helps team members remember that their primary task is to help their COLLEAGUE who is consulting to them - the young person about whom the discussion takes place ''is not present'', and the best hope of helping //them// is to help the //worker// [[mentalize|Mentalization]] more accurately.
!!!When workers struggle with using [[Thinking Together]]:
It is not always the case that workers instinctively embrace using this ritualised or boundaried way of approaching case discussion - it is important to be able to justify and hold these boundaries with confidence - this is about helping the worker:
<html><iframe width="640" height="360" src="//www.youtube.com/embed/G9myCdw6WrM?rel=0" frameborder="0" allowfullscreen></iframe></html>
*Teams will need to decide locally how their team meetings are best conducted.
* A suggested 'agenda' is provided below, and can be [[Edited|How to edit your team's manual]] as required.
!!Suggested Agenda
Local teams may want to edit this
!!1. Introductions
If there are visitors, new team members.
Set the context, and possibly hand out [[AMBIT stance playing cards]] to set "monitors" for elements of the AMBIT stance - the meeting is there to help individual workers to regain balance in a working environment that leaves them constantly "off-balance".
!!2. Mark Boundaries
#How long have we got today?
#What cases are in the "Red Zone"? //(note these, and use [[Marking the Task]] at this stage, but ''avoid getting into discussion yet'')//
#Record cases for discussion, [[Marking the Task]] for the worker bringing them at this stage, but not moving into case discussion.
!!3. Case Discussion
(a) "Red Zone"
(b) [[New referrals]]
(c) [[Existing cases]]
!!4. Manualization
(a) [[Service User Feedback]] - is this team explicitly interested in learning from its own [[Experts by Experience]]?
(b) [[How to run a team manualizing session]] - Many teams find it helpful to have a ''separate [[Manualization]] session'' (perhaps monthly). However, do consider following the instructions in [[How to run a team manualizing session]] in a live team meeting to manualize 'on the fly' occasionally.
(c) There is also a [[Local Manualizing Tasklist]] for when a subject comes up that the team agrees //"that needs manualizing (but not right now!"//. You can do this quickly during ordinary meetings via the [[Local Manualizing Tasklist]] button (<<tag [[Local Manualizing Tasklist]]>>) - just create the TITLE of a page that the team can come back to at a formal manualizing session.
//The team that ''manualizes'' itself is probably the team that is ''mentalizing'' itself!//
!!5. Team Business
This should be strictly time-limited and teams should consider setting up sub-groups tasked with administrative work if it threatens to encroach on Case discussion time.
!!{{$:/images/fa5/solid/comments}} ''What to do''
<a class="tc-float-right">[img width= 300 [ripples.jpg]]</a>
''Role play a team case discussion using Thinking Together''
*Allocate a worker to bring the case and a chair to hold the group to the process
*Follow the four steps (reminder below)
!!{{$:/images/fa5/solid/book-reader}} The four steps of Thinking Together for use as a team
Here are the four steps, as a reminder.
{{mark the task ttt.jpg}}
{{state the case ttt.jpg}}
{{mz the moment ttt.jpg}}
{{return to purpose ttt.jpg}}
!Introduction
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/xjYFu6VkiMs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
''Team around the Worker'' is a phrase that has been used to talk about two areas of experience in this work:
* the young person's focus
* the team focus.
There is a deliberate echo in ''"Team around the Worker"'' of the phrase more conventionally used in this field, the ''"Team around the Child"''. It is very important to understand how the Team around the Worker concept is not an alternative to, or a contradiction of this, but is instead a complementary "position" that helps address some of the potential unintended problems that the Team around the Child can bring - especially in working with socially excluded, unconventionally (or non-) help-seeking youth.
Team around the worker is one of the ways that we use [[Mentalization]] in [[Working with your TEAM]] to help the worker hold their balance in the ever-present tension between the [[principles|Core Features of AMBIT]] of forming strong individual Key Worker relationships, but ensuring that to counter the unbalancing forces at play in such relationships, there is also a [[Key worker well-connected to wider team]].
!1. Young person's focus: privileging existing helping relationships
This refers to the privileging of a specific relationship (of [[Epistemic Trust]]) between a Key Worker and a young person.
Here, the point is not to define an organisational ROLE (//"Who is the key worker in this case?"//), but instead to ''define the worker who, in the mind of the young person, is KEY, right now'' - who does this young person have a relationship with that is characterised by anything approaching [[Epistemic Trust]]? Powerful individual relationships that have this "Key Worker" characteristics are not easy to sustain, and this is why AMBIT advocates a team-based approach, and is never "just" an individual therapy. The person (or there may be more than one) in the role of Key Worker may change over time.
{{Team around the Worker - pic}}
Particularly for young people who - for reasons of past disappointments, trauma, neglect, genetic disposition etc - have very //low// levels of this specific kind of trust ("Epistemic Hypervigilance"), it does not make sense to ask them to share this out between multiple new workers. This can more often or not be overwhelming to a young person in crisis, who may experience multiple different workers with different specialist interests and trainings as a latter day version of the [[Tower of Babel]] experience - too many different voices and "languages", all speaking at once, and often apparently disagreeing with each other.
Unlike the conventional notion of the ''"Team around the Child"'' - which has its place, but can also (out of the best of intentions) deliver an experience of care that is //aversive// (see [[Dis-integratedInterventions]]), in AMBIT the primary setting for therapeutic change at any moment in the "treatment journey" is the relationship between a young person (and/or family) with a //single practitioner//. That individual practitioner may be replaced by others across time, and the young person or family may develop more relationships alongside this [[Key Worker]] as time passes (and the capacity for [[Epistemic Trust]] grows), but attention to WHO is significant and helpful in a young person's mind, and building on that relationship, is at the heart of the ''Team around the Worker'' approach.
Thus we advocate deploying early efforts towards one of the [[Core Features of AMBIT]] which is [[Scaffolding existing relationships]]. At least to start with the existing relationship to focus on is the best helping relationship that the young person already has. Supporting this person (who may be another member of the team, or from another team, or an informal contact such as a family member, but who - at the time in question is seen as "key") may well be the prelude to developing a direct 1:1 relationship with me as a new worker (especially if my team is delivering a particularly specialist intervention that other workers would not feel skilled, authorised or motivated to do themselves even with my active support.) On the other hand it is worth
!2. Team focus: taking responsibility for the mentalizing of colleagues in these key relationships
This links to another of the [[Core Features of AMBIT]], which is the principle of the [[Key worker well-connected to wider team]]: placing //as much emphasis// on [[mentalizing|Mentalization]] one's colleague (insisting on and supporting them to sustain a mentalizing stance) as one does on encouraging the same in our clients.
In order to privilege such a powerful individual [[Key Worker]] relationship, we must acknowledge the risks that this can lead a worker into. Intense, intimate relationships with young people whose backgrounds and difficulties are of the kind that AMBIT is designed to help, may be fun and rewarding but they can also be unsettling. We are invited to collude with risky or antisocial behaviours, we are shocked or worried by threats or authentic concern. We may "up-regulate" our "ordinary" antennae for risk and become rather macho, denying or downgrading risks, we may burn out, or be drawn into overintrusive actions more to settle our own anxiety than to help the young person. Sometimes young people, particularly those whose early experience has been blighted by sexual abuse or exploitation, may act in ways that are frankly seductive. The active Team around the Worker is there to help the worker hold her balance.
This is why AMBIT is a team activity, in which team members are expected as a matter of course actively to support, and take some responsibility for, the mentalizing of their colleagues. We emphasise that this is a ''CORE task'' for ''all'' workers.
In order to sustain a position as a worker who is a predictable, attuned, helpful presence, the [[Key Worker]] must be recognise the universal ''frailty of'' [[Mentalization]] - particularly at times of high anxiety, or confusion, and be prepared to use his or her colleagues to support his or her mentalizing, as well as taking responsibility for protecting and strengthening the mentalizing of his or her colleagues. Under [[Working with your TEAM]] we document a range of [[Mentalization]]-based approaches that support this effort - the principle one being [[Thinking Together]].
Effort is always directed at making the [[Key Worker]] relationship safe, predictable, aiming to activate a secure [[Internal Working Model]] of relating to help, thus stimulating or allowing //exploration// into new and transformative understandings on the part of the young person and family.
{{$:/images/fa5/solid/tasks}} We're interested to find out how you find the meetings in which your team discusses cases and client work (you might call it case discussion, group supervision, clinical meeting etc.)
''Complete this survey and then return to the group video call.''
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/ResponsePage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUNVZMMkhMTE5DUjJYOE9WNUdKRUMzSzhLWSQlQCN0PWcu&embed=true" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
{{$:/images/fa5/solid/tasks}}'' Here are the results of the survey. Hover over the the bars to see exact percentages''
<iframe width="100%" height= "480px" src= "https://forms.office.com/Pages/AnalysisPage.aspx?id=lyB7OzDxNkCiCd9_O8wIcMMofNkLZPZCgEz4aM2oF9JUNVZMMkhMTE5DUjJYOE9WNUdKRUMzSzhLWSQlQCN0PWcu&AnalyzerToken=vxWdgxo9rRWKAJT4DN1fnxCaEQkus9Ih" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
The majority of young people that teams using AMBIT work with have more than one problem. The aim of this session is to focus on the interventions being offered by the AMBIT team in the context of other interventions by other agencies.
This works best if each group can have a laptop and be connected to the manual. We suggest dividing the team into 2-3 groups. It may be helpful for this session to have additional paper copies of the AIM for people to refer to as part of the exercise.
!!What is the problem? Divide into 2-3 small groups (20 minutes)
# Pick a young person known to the team.
# Do an [[AIM]] assessment (don't click the suggested interventions button, though!)
# PREDICT what interventions would be your team's priority:
## to address the ACUTE CRISIS here and now
## to address the longer term needs
#Now look at the Suggested Interventions from the AIM
##Check both the GLOBAL and FOCAL rankings...
!!What is the intervention plan? - in small groups (20 minutes))
#What is the current plan? How have we made this?
##young person's goals? (see the [[Active Planning]] as a tool to help map and negotiate these alongside [[Broadcasting Intentions]] by the worker/team)
##expertise in the team?
##focus on narrow range of domains?
##use of evidence as to what is likely to work?
#Should we do anything different?
!! What have we learnt? (whole group) (20 minutes)
# Review page in the manual [[How to draw up a Care Plan]] and make amendments to it so that it is consistent with your practice
The purpose of this session is to name all the different methods and techniques that team members use to work with young people and their families. The intention is to be as inclusive as possible.
!! List all the different interventions that you do (20 minutes)
* Put all the different techniques you use on post-it notes.
**Aim to get coverage of the wide range of different conversations and activities that the team does...
**''__Include everything!__'' (''@@color(blue):we want a MINIMUM of 50 post-it notes!@@'') from the highly specialised "clinical" work (such as Cognitive Behavioural therapy) to non-specialist activities (//"Going for a cup of tea in the local cafe as a way of engaging a young person", "texting somebody in the week to see how they are doing", "Reviewing someone's suicide risk", "Arranging a family outing", "Taking a young person to meet with a teacher."//)
* Post them under headings (stick notices up around the room) for all the different domains in which we work
** Main domain: ''Individual'', ''Family'', ''Social ecology'', ''Systems-network of care''
!!Look at your manual (20 minutes)
*Look at the [[Domains]] and [[Interventions|Interventions (by target group)]] in the manual to see what is there...
** Are all your methods and techniques represented? (10 minutes)
* Are there things that we do NOT do? Why is this? (10 minutes)
!!Manualize one local method of working that the team use (20 minutes)
*Are there things that we DO that are NOT reflected at all (or are poorly represented) in the manual?
**Make a sub-topic of one of these in the manual
In the past it was occasionally difficult to persuade large organisations such as the NHS or Social Services to make the I.T. changes to allow the full use of wiki manuals, as they run best in Firefox or Chrome browsers (although they do run OK in the Windows Explorer browser that many NHS Trusts use as their default browser.) See [[OpenSource]] for more details about the wiki software.
!!Simple fixes
!!!Use a better browser
It may be possible to make a specific case for a team using tiddlymanuals to be allowed to download and use the freely available [[Firefox browser|http://www.mozilla.org/en-US/firefox/new/]], which is a much better browser than Internet Explorer (especially its earlier versions) and which works much better with the simple technology that [[TiddlyManual]]s use. [[Google Chrome|http://www.google.com/chrome]] is another free option. Most NHS Trusts now allow use of these browsers as well as the default Windows Explorer.
!!!Permit streaming video
Apply for an exception for a team using Tiddlymanuals so that they are allowed to access Youtube or other streaming video content. Much (most) of the AMBIT video content is situated on YouTube, and many large organisations have historically been anxious about "everyone" in the Trust using streaming video resources (these are demanding on "bandwidth") but in reality, staff in a tiddlymanual are not going to be spending all day watching the [[Videos]]!
!!!Upgrade Flash player
With the advent of newer video handling only a very few videos still require the Flash Player, so this "fix" is largely redundant now. Some Trusts did not (or do not) update the Flash Player that older videos/browsers required to play videos and in the past this made it hard to access video content in the manual. Just occasionally you may be prompted to "upgrade to the latest version of Flash" and your local IT dept will be able to help you do this.
!!Strategy
Find a friendly senior member of the I.T. department in your organisation - many of these people are only too aware of the limitations of the systems they are paid to maintain, and are looking for interesting, creative ways to improve the organisation's use of IT, in ways that are not too expensive. It is important to emphasise the fact that this is a "future-facing" approach, and that it is free. The UK government published [[guidelines|http://www.cabinetoffice.gov.uk/resource-library/open-source-procurement-toolkit]] advising offices to look at open source solutions as a first port of call. These manuals are [[OpenSource]].
Ideally, broker a meeting between senior managers in your organisation with a more strategic outlook, and the IT department, to consider how the organisation wishes to move forwards using IT to support its aims. Suggest that your team might be seen as a small test case for this kind of approach.
See also some of the external resources laid out below.
!!External resources
There are some helpful online resources to show to managers in the NHS, that may help to allay concerns or overcome common barriers to change that occur:
An official NHS site called the [[Armchair Involvement project|https://www.england.nhs.uk/improvement-hub/wp-content/uploads/sites/44/2017/11/armchair-involvement-report.pdf]] describes itself as //"Helping you to use new technology to engage people in service improvement"// which ticks a lot of boxes.
!!Keep up, the world is changing!
Finally, the [[UK government|http://www.cabinetoffice.gov.uk/resource-library/open-source-procurement-toolkit]] itself is recommending that opensource solutions are looked at by its various offices before they commit to old-style 'closed-source' resources.
!!What is it?
Teleology is one of ''three'' <<tag [[Pre-mentalistic stances]]>> - ways that the mind thinks when the mentalizing function has been overidden or switched off (the most common cause for this is high levels of [[Affect]].)
Teleological thinking effectively assumes that difficulties (ie unpleasant mental states) can be "solved by doing"; the person whose thinking has become //teleological// is focused entirely on the physical //ends// - the //outcomes//, not on what getting these might mean.
The //Telos// in ancient greek is the "final/complete/perfect __end__."
!Examples:
*''Anger'' may be resolved by destruction of property of violence
*''Grief or fear'' by use of substances
*''Self-hatred'', or the ''confusion of dissociation'', by cutting or other self-injurious behaviour
Equally, the 'doing' may be something that is ''to be done by another person'':
*I may decide that my partner can only really prove their love by //doing// something such as leaving work //now// because I am in a crisis.
*I may be convinced that the //only proof// that my keyworker cares about me would be if they agree to see me //this evening// - even though this is out of their ordinary working hours.
* I may believe that the only way my mother can show she loves me is for her to give me the £20 I need to go out with my friends - anything else would "prove" that she doesn't really understand or care about my need to avoid losing face with my friends.
!!Teleology is NOT always pathology!
* We all need to eat, and for the human race to survive, we must reproduce - achieving both of these things requires that we engage in broadly teleological states of mind at times!
* The question of whether teleology is //pathological// or not is really all about //context//.
** Grabbing a child on a windowsill before they fall does not involve taking their subjective mental state much into account, but few would deny that it would be the right thing to do.
** Sometimes our professional roles involve us having to impose power on others (a police officer arresting a violent offender, a mental health professional removing a potentially fatal ligature, etc) and in these kinds of situations the challenge is to mentalize around (or in spite of) this massively challenging context: trying to pay attention to how we are [[Broadcasting Intentions]] in ways that can take account of how we [[imagine these actions will have an impact|Sensitive attunement]] on our client. See [[Active Planning]] for more on this topic.
This is one of the four key elements of the workers mentalizing stance.
How we stop non-mentalizing may take many forms, but the principle is that once we have spotted non-mentalizing we don't let it run on and on.
[img[https://lh5.googleusercontent.com/-CN9yGbK_cEY/UOiZqQqjDvI/AAAAAAAAGeE/KNuVvJiVQQM/s177/Mentalizing%2520Hand.jpg]]
This is a rather [[Teleological|Teleological thinking]] approach - to "kick start mentalizing", and in relation to this Anthony Bateman and Peter Fonagy have referred to the "mentalizing hand"... (dramatic //"Stop! Stop!"// interventions such as you can see at [[Simmering Down]]), but obviously such dramatic interventions are only deployed if gentler attempts have not succeeded.
Here is a rather gentler approach to terminating non-mentalizing, that leads into efforts to start to [[Notice and Name]] a common pathway for mentalizing to break down in this family:
<html><object width="640" height="360"><param name="movie" value="//www.youtube.com/v/fby8dqcXO7A?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/fby8dqcXO7A?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="640" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Here is a response in a situation of higher [[Affect]]. For a more dramatic version of this see [[Simmering Down]].
<html><object width="480" height="385"><param name="movie" value="https://youtube.com/v/cflKHEbGdHs?fs=1&hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/cflKHEbGdHs?fs=1&hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></html>
Other techniques that may fulfil this role include: the [[Therapist's use of Self]], [[Circular interviewing]] or [[Careful and concerned CURIOSITY]].
!Why terminate non-mentalizing?
[[Mentalizing theory|Mentalization]] presumes that non-mentalizing interactions are unlikely to produce significant changes in family interactions, so simply allowing these interactions to occur is unlikely to be therapeutic.
Once the therapist has:
*A clear idea of the //nature// of the core mentalizing problems
*A good //example// of such an interaction to work with
The therapist
*Intervenes and shifts attention away from //"preferred non-mentalizing narratives"// (or "[[Fillers]]" for short)
*The practical application of this intervening is explained in greater depth in the [[Mentalizing Loop]].
*The overarching aim is to highlight the missing perspective for each person in the family that leads to the behaviour of others not being fully understood. It is the therapist’s task is to help create new and different perspectives.
Trying this out for local editing
!!''Purpose''
One of the aims of AMBIT is to enhance mentalization both in work with clients but also in work with colleagues in the formal or informal network around the young person. [[Addressing Dis-integration]] (and the use of the [[Dis-integration grid]]) is
one of the [[Core Features of AMBIT]].
The 'What's it like to be...' exercise is designed to encourage team members to explore their capacity to make sense of the network from another person's point of view. The exercise can be done to think about differences between staff //within a single team// or //between different teams or agencies//. The basic exercise is simple and can be adapted to specific training circumstances.
!!''How to do the exercise''
The exercise requires three people.
!!Two practitioners (person 1 and 2)
These identify a member of the team (or network) (person 3) that they know least well...
!!What's it like to be person 3?
Then person 1 and 2 have a conversation together imagining what it would be like to have this other person's job.
!!!Focus on the LIVED EXPERIENCE
The focus in this conversation should be on the lived experience of this other person (not their formal responsibilities) to include:
* what's fun about the job
* what's stressful
* what they do for lunch
* what a typical day comprises of
* what is the Xmas party like for them, etc.
!!Person 3
Person 3 ''simply listens'' to this conversation. Having built up a bit of picture of this (10 minutes max), Person 3 then reflects back what it is like to listen to the story of one's own work in this way. Inevitably this will include some consideration of the 'accuracy' of the description but the focus of interest is around the feelings (e.g. indignation!; supported; validated; etc) evoked by discrepancies or inaccuracies rather than the inaccuracies themselves.
If this is done in as part of a group activity, a sub-group of all "Person 3's" can be invited to feedback to the wider group (as a group [[Fishbowl discussion]]) about what it was like to see one's working life described by others.
!!What is the AIM questionnaire?
*The AIM questionnaire was developed by[[ Peter Fuggle|Peter Fuggle]] and [[Dickon Bevington|DickonBevington]] and is an adaptation of a measure called the Hampsted Child Adaptation Measure (H-CAM). Please see [[Development and properties of the AIM|The Development and Properties of the AIM]] if you'd like to know more about how the AIM was developed, its background and psychometric properties
*Any team can use the AIM questionnaire you do not have to have completed AMBIT training
*The AIM is recommended by the AMBIT team as a [[Multi-Domain Assessment]] as it measures a wide range of areas (or domains) of life functioning. We believe that measuring client function can provide workers, teams and their clients with rich information. For example, for some teams learning more about the characteristics of the clients they see and the implications this has for interventions, has been an important use of the AIM questionnaire [[(Fuggle, Bevington and Cracknell 2014)|Fuggle et al (2014) The AMBIT approach to outcome evaluation and manualization: adopting a learning organization approach]]. For clients with multiple overlapping needs we think that measuring changes in functioning can be more informative than more narrow measures (for example measures of mental health symptoms alone)
*[[We have recently revised the AIM questionnaire. |AIM Questionnaire: Updates and revisions]]This has involved the addition of 3 further items which focus on issues of [[discrimmination|AIM New Items: Experiences of Discrimination]], [[exploitation|AIM New Items: Experiences of Exploitation]] and [[online life |AIM New Items: Online Life]]alongside some small changes in text to improve clarity of items
''This has included the addition of a new
online version of the AIM questionnaire based within the wiki manual''
!![[The AIM questionnaire-interactive version |AIM questionnaire - interactive version]]
!!![[A paper version of the AIM questionnaire can be downloaded here|AIM questionnaire - paper version]]
!!''How to use the AIM Questionnaire''
*The assessment is designed to be __''completed by the worker''__ at an early stage in work with a client.__ It is scored from the perspective of the worker i.e. how the worker views each of the issues (not what the worker feels the client may think).__ It can be completed over a period of time (e.g. 2 weeks). It covers a number of areas of life, so it may take a little while to find out about all of these.
*The AIM is then completed again at the end of contact with the client (by the same worker if this is possible) to evaluate changes
*There are 43 questions with numerical measures for each, ranging from 0+ (a positive strength), through 0 (no problem), and up to 4 (very severe problem). Each question has its own descriptions of the levels of severity to help in scoring.
* The 43 questions are divided into 7 sub-scales e.g. 'Family', 'Socio-Economic', 'Mental State' etc. Scores are derived for the 7 subscales as well as a 'Total AIM score'. See [[AIM Items]] for a list of the 43 items (questions) and their subscales
*Each question also offers the opportunity to label it as one of a small number ( 6 or less) of [[Key Problems|AIM - Key Problems]], which can be a helpful way to focus on the most pressing problems in a complex situation. Again, the key problems are rated here from the perspective of the worker
''A set protocol for using the AIM questionnaire has been developed for the
[[The AMBIT Client Impact Project|AMBIT Client Impact Project (ACIP)]]''. This protocol includes the points above. The protocol explains more detail on why we use the AIM in this way and the intentions behind this approach to measuring client outcomes.
!!What do we with our AIM scores?
''//A key aspect of measuring clients' outcomes is then using them to directly influence our work, to stimulate curiosity, learning and improvement. In order to do this we need a simple way of scoring, managing and viewing the data we collect//''
Please see [[Scoring AIM data]] where we provide tools and instructions for supporting teams to do this.
!![[What is our purpose for using the AIM?|What purpose am I using the AIM for?]]
Workers often ask about how they can use the AIM in their client work. The AIM questionnaire can be a very helpful tool to support conversations and planning with our clients. However, we think that it is essential to be clear about the purpose that we are using the AIM questionnaire for in our team, as it is often not possible to use it reliably for multiple purposes in parallel.
!!AMASS (Adolescent Multi-Agency Support Service)
This is a team who work with young people on the edge of going into care to try to prevent the need for a care placement. They have been collecting data on their clients' functioning near the start and at the end of contact with their service, as well as outcomes related to the commissioning of their service (in particular whether young people who they see go into care or not). They are about to publish an academic paper with the findings and learning from this work.
>>"We have found that without regular cheerleaders of the approach and top up trainings, elements of it can be lost"
>>> Feedback from an AMBIT-influenced team, 2014
!!Who does this role?
Within each AMBIT team, it is essential that at least two members of the team acts to support AMBIT practice for the team - we call this role the AMBIT Lead, and there is additional training for these people as part of the AMBIT Basic Five Day Training.
*One AMBIT Lead must be a ''senior'' member of the team, with leadership or supervisory responsibility for the team.
!!What does the AMBIT Lead do? (A job description)
The job description for an AMBIT lead can be seen as having several broad roles.
#To be part of the [[Implementation Team]] which supports and encourages AMBIT practice via the [[Implementation Plan]].
#To become competent in [[using the manual |User Guide]] in order to support others in making use of it.
#To encourage innovation and local adaptations of the approach in order to take into account the local context and service objectives and priorities.
#To facilitate and/or deliver ongoing in-house training of AMBIT practice for team members.
#Working with the team leaders/managers to integrate AMBIT practice within core team activities, [[roles, and responsibilities|Roles and Responsibilities in an AMBIT team]].
#Facilitating team discussion around practice in order to develop systematic ideas that can be [[recorded as part of the manual|Manualization]].
#To promote a culture that respects help seeking within the team, and the practice of [[Thinking Together]].
#To maintain links with the AMBIT [[Community of Practice]] - via the manual/ [[AMBIT Lead peer-to-peer system]]/ relationship to a nominated AMBIT trainer
#Although being an AMBIT Lead is a large responsibility, the time commitment is quite low; no more than one hour per week.
!!Person specification
#The person needs to have demonstrate active interest in the dilemmas of supporting good practice in the team.
#''At least one of the two AMBIT Leads should have a senior/supervisory/leadership role'' within the team (this work involves trying to shape another team member's work, and all the dilemmas that this poses.) There may be advantages in having the second AMBIT Lead as someone who is not in such a senior position - but we do not prescribe this in detail as teams differ - but there SHOULD BE TWO.
# Both AMBIT Leads must be able to talk to each other! The importance of this cannot be over-stressed - as our [[Theory]] of [[Mentalization]] supports the idea that being in relationship supports this function of mind.
# An interest and enthusiasm for understanding mental health and psychological interventions.
# Some confidence in using computers and the internet. (Not excessive and probably not more than most people are familiar with) Not someone who is over anxious about these matters.
#The person does not need to know about all the CONTENT of the AMBIT approach before doing the training. So it is not necessary for them to be ready-made experts on mentalization etc. They would be expected to learn this stuff with the rest of the team during the training.
!! Getting comfortable with the manual
It is helpful for the AMBIT lead to become interested and familiar with the manual and to be able to make the best use of it for the team. In this way we suggest that the AMBIT lead should aim:
# To become familiar with the content of the AMBIT manual and to be fluent in [[finding and using it|User Guide]].
# To be fluent in [[Editing|How to edit - Videos]] and adding new material to the manual, as needed.
# To [[Create shareable weblinks to specific manual page(s)]] to share manual content to other team members as much as possible.
# To encourage team members to make new material for the manual particularly [[Videos]] explaining or demonstrating parts of the approach.
# To encourage that team discussion about protocols and good practice is recorded in the manual as part of local [[Manualization]].
# To encourage team members to refer to the manual as a resource in response to clinical problems and client difficulties, promoting attention to, and the valuing of the [[Core Features of AMBIT]]
!!Training
The AMBIT lead should attend a one day training for AMBIT leads which would provide familiarity with the manual. The learning objectives of this day are to:
# Provide an opportunity to consider the AMBIT lead role in your team ([[The AMBIT Lead - role and responsibilities]]).
# Become familiar with [[using the manual|User Guide]].
# [[Planning a training event in your team]].
# Practice [[Manualization]] as a team process.
See [[Downloadable Resources from Training]] for the powerpoint slides used in the training.
!!Why do this?
[[Manualization]] is one of the [[Core Features of AMBIT]] and is based on the evidence that interventions supported by manuals tend to be more effective than those which are not. The purpose of manualization is to encourage teams to reflect on what they do and to record the outcomes of their discussion in order to support future practice.
!!What is the AMBIT Pro-gram?
A tool for mapping the professional and non-professional network around a client.
This technique helps to find out who is important in the network around the client and to be curious about people who the client trusts. The purpose is to enable the worker to open up conversations about other people in the community who are important to the client and to ensure that the emphasis is not solely on services. It is helpful to identify opportunities for [[Scaffolding existing relationships]]. The AMBIT Pro- gram is intended to be as simple as possible and can be adapted by a worker to their own style of working.
!!Video introduction by Peter Fuggle
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/yU3jiKYUJEE" frameborder="0" allowfullscreen></iframe></html>
The diagram can also be used in a developmental sense in that it may highlight previous relationships with professionals which are no longer active. For example, a relationship with a previous social worker that was felt to be helpful may want to be included. A simple method of doing this is to discriminate between live and past relationships by using two different colours to mark these names on the chart.
!!How to do it?
The basic idea is to make a drawing or map in which the client in the //centre //of the piece of paper and then to position professionals and key non-professionals (family members or peers) in the network in relation to the client. Those positioned closer to the client have a stronger relationship than those positioned further away.
The aim is to be as inclusive as possible, to include teachers at school, and those who may appear at first sight to be more peripheral including peers and family members. The quality of relationships can be indicated - straight lines for positive (thick for more significant ones) and zig-zag lines for negative/conflicted relationships.
[[The AMBIT Pro-Gram: an example]] pages illustrates the use of the tool.
!!AMBIT pro-gram, described live by [[Peter Fuggle]] during a training for [[AMBIT Local Facilitators]] in 2014
<html><iframe width="640" height="360" src="//www.youtube.com/embed/0G_Ub3CsRZw" frameborder="0" allowfullscreen></iframe></html>
!!(Fictional) example:
<center>[img width=600 [Pro-gram picture]]</center>
Joe is a talented footballer who has stopped playing for his local side since getting into Cannabis use and low level running and dealing to pay for this. He has been convicted of shoplifting, and has an Order with the Youth Offending Team (YOT) - which he has started to see quite positively because he gets on well with his YOT worker (also a keen footballer). His low mood had led him to start self injuring (cutting) and he has started to see a therapist about this. His treatment is overseen by a psychiatrist because of serious threats to kill himself or others by setting fires that were made around the time of his initial arrest.
Although he initially got on quite well with his therapist, and was positive about this, he has recently been missing appointments, and appears to be drifting away from her. During the creation of the Pro-gram he reveals that he thinks that the Therapist and YOT worker "don't get on at all well" - though it is unclear how he has decided this, and whether they even actually know each other at all.
He has remained on good terms with his old football coach, but is still not going back to football.
A family support worker is dismissed as "working for my Mum" by Joe, and he denies ay connection between this man and anyone else in his network - describing him in neutral, disconnected terms.
He is annoyed at the fact that his Social Worker has changed recently - his previous one had been "funny" and he had felt that she "really got on with me". He compares his present one negatively with this.
He is entrenched in his aggressively negative views about the Police who he sees as "out to get me" and (perhaps because he first met her in a Police cell) he is equally negative about his psychiatrist, who he sees as "working for the Police".
[img width=100% [studying together image.jpg]]
!! The AMBIT study group
Click on the yellow tag below to see a drop down list giving a brief summary of current AMBIT study group projects:
!!!<<tag [[AMBIT study group projects]]>>
!!!What is the AMBIT Study Group?
The AMBIT study group is an international collaboration of representatives from AMBIT influenced teams who meet and connect with each other to learn.
The group aims to generate an atmosphere of curiosity and learning together about the AMBIT approach.
The overall intention is to build collaboration and relationships across the AMBIT community and develop the emerging evidence-base around the model.
!!What does the study group involve?
*One key goal is to understand the //effectiveness// of AMBIT influenced teams in their work with clients
*The group provides a structure for members to work together on projects that are relevant and interesting to their own practice
*The group is a resource for supporting learning about the dilemma’s and challenges that AMBIT influenced teams face
The group is linked with and aims to support[[ the AMBIT Client Impact Project|AMBIT Client Impact Project (ACIP)]]
!!What are some of the benefits of the group?
!!! As an individual group member
*An opportunity to develop experience of field research and build relationships with colleagues internationally from across the AMBIT community
*Opportunities for exciting continued professional development and travel, through working alongside enthusiastic colleagues from different contexts
!!!For teams
*Opportunities to contribute towards research and publications through international collaboration and the potential for team recognition for this
*We hope membership brings a 'quality mark', that would be of value to the wider service and to commissioners
*The group will provide opportunities to visit each other's teams through other members of the international collaboration as a way of sharing learning, practice and re-energising AMBIT practices
!!Group membership
In order to obtain AMBIT study group membership one individual from a team/service would commit to being a consistent member throughout a project.
One specific requirement is that members use the [[AIM|AIM]] (AMBIT Integrative Measure) in their own services. The AIM questionnaire will be used to measure client functioning at the start and at the end of treatment
Members will then combine together their AIM results with the group to create a larger pool of information so we have more ability to learn about the work and client outcomes ''(group members would not need to be using the AIM questionnaire before joining the group. The study group leads will support teams to implement the AIM in their teams)''.
Members are asked to commit to joining a ‘physical’ meeting once a year, alongside attending more frequent multi-site meetings (including online) throughout the year. Physical meetings will alternate between the UK and the rest of Europe.
!!!!Please note the AMBIT project would not be able to pay members or fund their travel.
!!FAQ's
!!!How is the [[AIM]] used?
Workers in a team will fill out the [[AIM questionnaire - paper version]] or the [[AIM questionnaire - interactive version]] or online on [[POD|POD - a web based outcome measurement system]] (Patient Outcomes Database).
Members of the study group will be supported through the process of using the AIM within their own services by the AMBIT programme team.
Training will be provided on how to use the AIM questionnaire and POD.
!!!What will happen with the data we collect in the study group?
Data from the AIM questionnaire is entered onto POD and will be stored securely and only accessible and viewed by your team, the study group and AMBIT programme team.
Inputted data on POD will be not include any identifying client data. Team’s will be able to know and report on their individual data.
!!!What are some advantages of using the AIM for my service?
As well as the value of the AIM data for the study group, we believe that using the AIM will help teams know the impact of their work and learn about which areas of the clients’ life in particular your work is having an impact on.
The broad nature of the measure means that it helps to capture a wide range of impact your work may have.
We understand that outcome measures are a current reality of service provision and hope that the AIM is a helpful measure that informs teams about their practice and supports with client work.
!!!How do I join the study group?
If you would like to get involved in the study group please contact the joint study group leads
[[anna.oriol-sanchez@annafreud.org|mailto:ana.oriol-sanchez@annafreud.org]]
and
[[James.Fairbairn@annafreud.org|mailto:James.Fairbairn@annafreud.org]]
We will then arrange a time to have an initial conversation about the group.
''If you would like to read more about the background and ideas behind the AMBIT study group please see [[AMBIT Study Group Development|AMBIT study group development]].
See the external link to Gregory Clarke's opensource materials [[here|http://www.kpchr.org/research/public/acwd/acwd.html]] or see the PDF manual for the Adolescent Coping with Stress Course workbook [[here|http://www.kpchr.org/research/public/common/getdocpublic.aspx?docid=0A6A6B12-0A81-4B46-B626-44DFB77BD0FF]] or displayed below
<html><div align="center"><iframe src="http://www.kpchr.org/research/public/common/getdocpublic.aspx?docid=0A6A6B12-0A81-4B46-B626-44DFB77BD0FF" frameborder="0" width="100%" height="600"></iframe></div></html>
''The purpose of this page is to give more detail on the development of the AIM measure and its [[psychometric properties|Psychometrics and Psychometric Tests]].''
''This information is primarily for people wishing to use the AIM for research and publication as well as those who would like to learn in more depth about the AIM. ''
!!Introduction
In 2023, a comprehensive guide on all aspects of the AIM was written by the AMBIT team at the Anna Freud Centre. The guide is called ''The Development, Design, Administration and Psychometric Properties of the AMBIT Integrative Measure (AIM).'' (Fuggle, Bevington, Talbot, Cracknell, Fairbairn). A copy of this reference document can be obtained below.
{{The Development Design Administration and Psychometric Properties of the AMBIT Integrative Measure (AIM).pdf}}
The AIM was developed by Dickon Bevington and Peter Fuggle from two two previous research measures, namely the HCAM and the FACE. These will be briefly described below.
!!The H-CAM
The AIM is an adaptation of a measure called the Hampstead Child Adaptation Measure
(H-CAM).
*The H-CAM was developed at the Anna Freud Centre by Tiffany Schneider, Mary Target and Peter Fonagy ([[Schneider et al., 2000)|Academic references]]. It was developed to fit with the Children’s Global Assessment Scale [[(CGAS) |CGAS]] [[(Schaffer et al 1983)|Academic references]] and the DSM III diagnostic system
*The scale was influenced by Anna Freud’s theory of developmental lines, which stresses the interaction between internal psychological processes and the environment. The theory outlines how human development does not happen evenly across all areas of life and that we can move both forwards and backwards along lines of development in relation to challenges we are faced with
* The H-CAM assesses the general adjustment of 2 to 18 year olds at the beginning and end of treatment. It is a semi-structured interview carried out with parents or carers. It uses a 100 point rating covering 15 aspects of life, including relationships (within and outside the family), ability to work, learn and play; to cope with stress and anxiety, levels of confidence and self-esteem, frustration tolerance, mood, sense of moral responsibility, psychosomatic vulnerability, self-care and sexual development
*A detailed coding system and rating manual were developed and preliminary investigations of the HCAM’s psychometric properties were good (Schneider et al 2000). The HCAM rating scale was used as part of the [[Anna Freud Centre's Retrospective Study (Target and Fonagy, 1994; Target and Fonagy 1994, a&b)|Academic references]] and was shown to be a useful measure of overall functioning [[(Kennedy and Midgley 2007)|Academic references]]
!!The FACE
*The Functional Assessment of Care Environments (FACE) was developed at the Centre of Outcome Research and Evaluation (CORE) at UCL for use in adult mental health services and was a more pragmatic measure for use in service settings than the HCAM (Clifford et al, 1999). This measure had eleven content areas with a total of 85 items. The content areas were:
** 1. Mental health and behaviour;
**2. Risk;
**3. Physical wellbeing;
**4. Daily activities;
**5. Interpersonal relationships;
**6. Social circumstances;
**7. Complexity;
**8. Response to care;
**9. Family environment;
**10. Family resources;
**11. Trauma, life experiences and stressors.
These items were designed for use by practitioners working with adults. In the FACE, each item had a five point scale (from 0-4) where zero indicated that this was not a problem and 1-4 represented mild, moderate, severe and very severe levels of difficulty with brief descriptions for each level. This well tested method of rating was adopted for the AIM as a way of assessing specific items on the measure.
*The HCAM provided a detailed developmental, theoretical and measurement framework of areas of functioning that needed to be covered by the AIM. The psychological richness of adaptive functioning developed for the HCAM was seen as an excellent basis by which to develop the content that was needed for the AMBIT Programme. But these content areas needed to be converted from a long qualitative interview schedule into discrete items with a well-structured rating structure that would enable practitioners to make judgements about variations in functioning for the client group that they served. For this purpose, the AIM drew on the items and structure provided by the FACE.
!!Formal acknowledgement of these contributions.
*The AMBIT Integrative Measure (AIM) was developed from two previous and connected strands of work on measures of psychological functioning, namely the Hampstead Child Adaptation Measure (H-CAM) developed by Peter Fonagy, Mary Target and Tiffany Schneider (Schneider et al, 2000), and the Functional Analysis of Care Environments (FACE), primarily developed by Paul Clifford (Clifford et al, 1999) in collaboration with Peter Fonagy. Both of these measures preceded the AIM and Dickon Bevington and Peter Fuggle wish to acknowledge the fundamental contributions of these authors in the development of the AIM (as a brief adaptable clinical outcome measure) which is built on these more comprehensive instruments. The FACE is currently offered as a copyrighted instrument by Imosphere (https://imosphere.com/).
References:
*Clifford, P., Orbach, G., Hobbins, J., Pavyer, J. (1999) Measuring disability and outcomes in routine practice with the FACE Core Assessment Bulletin of the Menninger Clinic; 63, 3; Periodicals Archive Online pg. 33)
*Schneider, T. (2000). Measuring adaptation in middle childhood: The development of the Hampstead child adaptation measure (Unpublished PhD thesis). University College London.
!! First version of the AIM.
The H- CAM and FACE were adapted by Dickon Bevington and Peter Fuggle into the AIM measure. The intention was to develop a tool that is practical and easy to use for workers, whilst capturing rich and detailed information allowing measurement of change over time
*The AIM consists of 40 items providing a holistic (or 'global') assessment of life and overall functioning. It covers seven categories: daily life, socio-economic factors, family, social relationships, mental state, response to situation and measure of complexity. The AIM is completed by the worker after getting to know the client at an early stage (usually within the first 2 weeks). Each item is rated on a 5-point scale ranging from 0 to 4 based (0 as no problem 4 as severe problem)
*Apart from being significantly shortened (to 40 items) from the H-CAM, the AIM also introduces some new questions, tailored towards young people, around pro and anti-social behaviour and on Mentalization
*The AIM does not yet have specific 'norms' or 'cut offs' (these are scores that allow you to compare your client scores against those of the 'typically developing' adolescent population). However a recent study using the AIM [[Fuggle et al (2021) Improving lives: Not just saying no to substances.]] allowed calculation of [[reliable change|Measuring reliable change]] and has provided further data for each AIM item to compare against (these developments are further described at the end of this page)
!!Validation and Psychometrics of the AIM
The first evaluation of the [[psychometric properties|Psychometrics and Psychometric Tests]] of the AIM was carried out at the Anna Freud centre by Eugenia Larsinou and Saul Hillman (2017) in the context of the IMPACT project (described below).
*The AIM was used in the Improving Mood with Psychoanalytic and Cognitive Therapies (IMPACT) project[[ (Goodyer, Fonagy, Target, Midgley Senior et al, 2011)|Academic references]]. This was a [[randomized-controlled trial |Randomised Control Trial]]comparing effectiveness of three interventions in the treatment of adolescent depression. The study was conducted across East Anglia, North London and North West/Manchester regions
*Data from the AIM measure in the IMPACT trial was then used to examine the psychometric properties of the AIM
*The sample used to validate the AIM included 157 participants, 113 females and 44 males between 11.8 to 17.9 years of age (mean age = 15.6, SD = 1.38) from a range ethnicity and backgrounds. All participants were diagnosed with moderate or severe depression. Exclusion criteria included SSRI medication, pregnancy, a diagnosis of bipolar disorder, schizophrenia, substance addiction or pervasive learning or developmental difficulty.
!!!Structure of the AIM
*An analysis of the factors within the AIM showed that there were 7 separable factors (i.e. separate sub-scales that are reasonably independent of each other). These were defined as:
**Psychological Disturbance
**Conflict/Non-conformity to social norms
**Family Conflict/Authority
**Self-harm
**Delinquent Habits
**Cognitive/Learning Difficulties
**Social Activities/Talents
*There was no correlation between these sub-scales above r=0.7 suggesting that each sub-scale measures a different aspect of functioning.
!!![[Reliability|Psychometrics and Psychometric Tests]] of the AIM:
''This examines whether the AIM measures things in a consistent way.''
''Internal consistency:'' This measures the degree to which the questions in each sub-scale are measuring a similar concept. This was good (a= 0.87).
''Age and gender:''This looked at whether there were differences in results depending on age and gender. Age showed a weak negative relationship with Conflict/ Conformity to social norms (r=-.187, p<0.05). No other significant relationships existed. The only existing significant difference between male and female participants was in Family Conflict (t=-2,23, p<0.05.) Female participants scored significantly higher in Family Conflict than male participants.
!!![[Validity|Psychometrics and Psychometric Tests]] of the AIM
''This tests whether the AIM actually measures what it sets out to measure''
''Convergent Validity:'' Do scores on the AIM relate to scores on other assessment tools which measure similar concepts? (i.e. those measures used in the IMPACT study).
The Health of the Nation Outcome Scale for Children and Adolescents (HoNOSCA) was most closely related to the AIM than any other measure used in the study. This is a widely used tool in the UK with satisfactory psychometric properties.
Correlations between .30 and .65 were found for 4 factors as well as with the AIM total score (r=0.65). A significant relationship between the AIM and the Moods and Feelings Questionnaire (MFQ) was found (r=0.59). The MFQ (Angold et al., 1987) measures depression related symptoms. Research has shown that MFQ has good internal consistency and convergent validity.
There were relationships between sub-scales of the AIM and a number of sub-scales of measures used within the IMPACT study. For example, the Psychological Disturbance sub-scale of the AIM showed correlations with all measures r=.14 to .61, apart from Alabama parenting Questionnaire (APQ). The APQ which briefly measures aspects of parenting style did not correlate to the overall AIM score.
''Discriminant validity:'' Whether the AIM relates to concepts or measures that are theoretically different.
The APQ was used as a measure of this. The APQ measures aspects of parenting style. It did not correlate to the overall AIM score although did correlate with the AIM sub-scales: cognitive difficulties, self-harm and delinquent behaviour.
This validation study provides an important step and positive data on the validation of the AIM. It also had some clear limitations:
The sample size was small and was of adolescents with a primary diagnosis of depression, meaning there are problems in generalising the findings more widely.
!!AIM data from the CASUS study
In 2021 a study has been published which shows AIM data for a case series of 100 cases. Individual item scores are also shown in this paper. [[Fuggle et al (2021) Improving lives not just saying no to substances: evaluating outcomes for a young people’s substance use team trained in the AMBIT approach.]]
The study showed that the measure was sensitive to change and reported substantial improvements for young people when comparing pre-and post AIM scores. The study also calculated the size of difference to indicate reliable change on a total AIM score.
!!![[Reliable Change |Measuring reliable change]]
Increasingly reliable change or reliable improvement are being used as an indication of effective interventions for children and young people. Reliable improvement calculates whether the degree of improvement on a particular measure is greater than what might occur by chance. Each service is then able to calculate the percentage of cases that achieve reliable change within their service.
From data collected for the evaluation of the CASUS team we have calculated the reliable change criteria. This is the degree of change between Time 1 and Time 2 that suggests that the change may be greater than chance variation. For the Total AIM score this is 12.91. This means that any case where there is a difference in total scores of more than 12.91 is a case that has achieved reliable change.
''We would greatly welcome further studies which explore the usefulness and properties of the AIM across other populations.''
[img[Egg and triangle (marked)]]
!!''What is the Egg and Triangle?''
The Egg and Triangle is a simple "back-of-an-envelope tool" to support active planning with clients.
We use this tool after the worker has begun to gain some understanding of the client and their life to check out with the client how accurate this understanding is.
!!!How is the Egg and Triangle used?
*The Egg and triangle is filled out either in front of the client, or separately from the client. It is then shown to the client as a way of [[Broadcasting|Broadcasting Intentions]] and summarising the workers' understanding of the client so far.
*This summary is presented in a tentative way, with an acknowledgement that this is 'my understanding so far, but there may well be parts I haven't got quite right'.
*The worker then invites the client to help them correct and amend the Egg and Triangle. Note: rough this process the worker attempts to model a curious and not knowing stance i.e. supporting mentalizing
*The intention here is that the worker makes explicit their understanding and ideas Broadcasting Intentions whilst then attuning to the clients' perspective ([[Sensitive attunement]]) in order to move towards a shared plan about the work together. These are the core elements of the [[Active Planning]] Stance.
!!!There are two specific parts to the Egg and Triangle
!!!1. The Egg
This represents what is going on in the clients' life. The different layers of the egg represent different parts of life (what's going on with my self, family, others). The worker briefly annotates these areas, and can use different colours to denote, things that are going well, strengths, difficulties etc
!!!2. The Triangle
The triangle can also be filled out during the discussion with the client, or separately as a 'best guess', then presented to the client. This highlights the workers' understanding of what is important to the client to prioritise now, what is important next, and , why this direction of travel is important to the client. In the same way, the client is invited to correct or amend the workers' understanding
e.g.
//What I heard you say was that right now the main thing for you is to get back to school again and see your friends more, have I got this right?//
The intention is that the triangle forms the basis of deciding together what the focus of the work may be i.e. the plan.
''The Egg and Triangle does not have to be used just once. It can be revisited and re-vised throughout stages of the work together, as a way of supporting the ongoing [[Active Planning]] Process''
!!''The Egg and Triangle ''
Go to [[this link|https://docs.google.com/file/d/0B5h_CVBdhJPYNkJNamFPVXhsYXM/edit?usp=sharing]] to download this in PDF format, or just use the back of an envelope!
[img[Egg and Triangle]]
!!''Video of introducing this to trainees''
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/z88UjW2iRpk" frameborder="0" allowfullscreen></iframe></html>
There may be times when it can be a real challenge to reach a shared agreement about plans or priorities not only between clients' and workers but also between members of the professional network. All of these people may struggle to reach shared agreement on the plans or priorities.
This is one of the four key elements - or “legs” - of the [[The Therapist's Mentalizing Stance]]
This is maintained via an inquiring, respectful, curious, and tentative stance. A mentalizing //"icon of inquisitiveness"//, detective [[Columbo|Colombo-style Curiosity]] represents this; he is one of the legs on [[The Therapist's Mentalizing Stance]] table!
<<image [[Ment_Table_Stance_pic]] width:440 height:300>>
See also [[Maintaining Mind-mindedness]] and [[Careful and concerned CURIOSITY]] which address aspects of this stance.
<<image [[Curiosity.jpg]] width:440 height:300>>
The stance a mentalizing therapist needs to acquire and display is one which is inquiring and respectful of other people’s mental states. Systemic therapists also refer to this position as one of ‘curiosity’ ([[Cecchin, G. (1987). Hypothesising, circularity and neutrality revisited: an invitation to curiosity]]), though we particularly emphasise that it is important for therapists to reflect a view that //an understanding (or the activity of working out my understanding) of others' states of mind is important//, including what those feelings might be and what thoughts, meanings and related experiences are attached to them.
With a few provisos, [[Colombo-style Curiosity]] is a good way to capture this quality of //"Safe Uncertainty"// ([[Mason, B (1993) Towards positions of Safe Uncertainty]]) - a confident //"~Not-Knowing"// that stimulates authentic exploration and new learning.
The implication in this is that the therapist needs to be actively promoting and provoking an interest and measured enthusiasm about MENTAL STATES, and value of learning about them. Thus the therapist may say:
>//“This is interesting, I wonder Sally what it feels like for you when your dad does x?” “Let me see if I got this right: are you saying that when your dad does x that makes you feel y, and you think to yourself z?” If the therapist wants to share a hypothesis about what someone might be feeling, he or she qualifies this by saying “I’m not sure I’ve got this right, so please tell me, but I was wondering whether Sally might feel x, is that right Sally?”//
!!!Understanding Misunderstandings
The inquisitive stance allows for a confident "//not-knowing"// - on the basis that it is through coming to understand the things that I //misunderstand// I am most likely to achieve real understanding:
<html><iframe width="560" height="315" src="//www.youtube.com/embed/DcluMgkUe3w?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!!Therapist posture
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/nyEmImJ7ODo?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/nyEmImJ7ODo?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
!!What is Thrive?
Thrive is a framework for organising how to respond to the needs of children and young people with mental health needs.
In this framework there are four need groups which are organised around the type of help that the child or family are seeking/receiving.
[img[THRIVE-Framework.jpg]]
These need groups are:
#[[THRIVE: Advice and support]]
#[[THRIVE: Help]]
#[[THRIVE: More help]]
#[[THRIVE: Risk support]]
more to be written
!!Introduction
The Troubled Families Programme represents the largest government initiative in the UK over the last ten years to try to provide a form of help for families with multiple needs. It provides a very useful comparator programme to AMBIT in its methodology and its efforts to evaluate benefit to families and young people.
The programme followed on from an earlier government initiative called the Family Intervention Programme. The programme has been extensively evaluated with mixed reports appearing at different time points. The purpose of having pages in the AMBIT manual is to try to draw out what we can learn from this programme in order to develop the AMBIT model and practice.
!!What is the problem that needs addressing
Social Exclusion Task Force (2007) reported that families with the most complex needs and entrenched problems did not benefit from the services they receive because of these services did not take the full family situation into account and that systems and services around families are highly complex and fragmented resulting in uncoordinated and inadequate responses to chronic, multi-faceted needs.
!!Scale of programme
in 2012, it was stated that £448 million would be invested in this programme targeted at 120,000 families.
!!Criteria for families to access the programme
*young people involved in youth crime or anti-social behaviour
*children and young people regularly truanting or not in school
*have an adult on out of work benefits
*Cause high costs to the tax payer
!!Payment by results
A council would get £4000 for each family that showed improvement
!!Introduction
An overview on the Troubled Families Programme in the UK can be found at [[The Troubled Families Programme: an overview]]
*'This work requires a single dedicated worker to walk in the shoes of these families every day. To look at the family from the inside out, to understand its dynamics as a whole, and to offer practical help and support – but also to be the person to authoritatively challenge that family to change.'
(Page 4 from 'Working with Troubled Families; a guide to the evidence and good practice.2012 Report from the Department of Communities and Local Government).
!!Development of the intervention model
This developed in three phases. Firstly, the Dundee families project resulted in a series of pilot projects were run by Action for Children. This led to the Family Intervention Programme which then developed into the Troubled Families Programme.
!!The Five elements of practice
*A dedicated worker, dedicated to the family
*Practical hands on support
*A persistent, assertive and challenging approach
*Considering the family as a whole
*Developing a common purpose across agencies
The development of trust between worker and family is referred to often in the report.
!!Supporting and building a family intervention workforce.
The model is essentially an individual single practitioner casework approach with supervision and training. Both these aspects are thinly described in the report. One comment being that some teams are bringing in clinical supervision.
!!!!The Water of Systems Change
A more comprehensive and highly influential framework for conceptualising whole systems change is provided by Peter Senge and colleagues (The Water of Systems Change 2018). The full document can be downloaded from the FSG website. https://www.fsg.org/publications/water_of_systems_change
In this framework, the system is defined as ''the conditions which hold the problem in place''.
Six components of the system are highlighted in three levels,
*'' Level 1 Structural''
**(1) Policies
**(2) Practices
**(3) Resources
*''Level 2 Relational''
**(4) Relationships and connections
**(5) Power Dynamics
*''Level 3 Transformative''
** (6) Mental Models
The model does not require that all components are considered equally as the specific requirements and contexts of a particular programme will determine what may be essential in a particular case. Much greater detail for each of these components is provided in the full paper.
!!RATIONALE for a "Mentalizing Stance"
During the assessment and intervention stages of Mentalization-based work (see [[Mentalization Based Work]] and [[Family Work]] in this manual), specific [[Mentalizing Therapy Techniques]] are the primary skills that the worker needs:
*To flesh out their understanding of the mentalizing capabilities within ones self, or their family
*To assist the client or family members in improving their understanding of mentalizing and the role it plays in all relationships - with family members, with friends, with the self.
*To improve the family members' capacity to mentalize about each other.
However, ''there is also a "way-of-being-with" our clients'', that is referred to as the ''Mentalizing Stance'', that represents [[Maintaining Mind-mindedness]], and which characterises the mentalizing worker.
There is one of our [[Training exercises]] to help teams learn about this, at the bottom of the page.
!!The heart of good mentalizing
>//Is not so much the capacity to always accurately read one’s own or another’s inner states, but rather a way of approaching relationships that reflects ''an expectation that one’s own thinking and feeling may be enlightened, enriched, and changed by learning about the mental states of other people.'' In this respect, ''mentalizing is as much an attitude as it is a skill'', an attitude which is inquiring and respectful of other people’s mental states, aware of the limits of one’s knowledge of others and reflects a view that understanding the feelings of others is important for maintaining healthy and mutually rewarding relationships.//
This stance is the ultimate foundation of the approach that the worker tries to demonstrate and thereby encourage. Remember that [[Mentalization]] is one of the [[Core Features of AMBIT]], which includes it as the first aspect of its own stance.
!!GENERAL FEATURES of the Mentalizing Stance
A series of [[General features of a "Mentalizing Stance"]] have been described, which give a broad flavour of the "way-of-being-with" that the stance represents.
In addition there are four more specific and practical aspects of worker behaviour that make up the...
!!FOUR "LEGS" OF A MENTALIZING STANCE:
[img [Ment_Table_Stance_pic]]
|''1. ''|[[The Inquisitive Stance]]|Consistently modelling the value of mentalizing|
|''2. ''|[[Holding the Balance]]|Emphasising //mobile// or //adaptive// qualities|
|''3. ''|[[Terminating non-mentalizing interactions]]|Diverse (often playful) methods apply|
|''4. ''|[[Highlighting and reinforcing Positive Mentalizing]]|Encouragement of the desired behaviour|
!!Video
The therapist's mentalizing stance - by [[Liz Cracknell]] and [[DickonBevington]] at a training for [[AMBIT Local Facilitators]]
<html><iframe width="640" height="360" src="//www.youtube.com/embed/EzSRHiNPHL0" frameborder="0" allowfullscreen></iframe></html>
!!Video - see the first five minutes
A narration to a slide show about the Mentalizing Stance and [[Active Planning]] - the mentalizing stance is covered briefly in the first 5 minutes:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/GQZ6EIt_aP0?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!Exercise: Real time practice
Client's part played by a volunteer.
''Exercise instructions:'' Watch this video, press PAUSE whenever you are directed, and consider these two questions:
#What's the therapist trying to do?
#What would you try next?
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/AIzhoXvbtBQ" frameborder="0" allowfullscreen></iframe></html>
!!!![[Source|https://www.who.int/substance_abuse/research_tools/whoqolbref/en/]]
The World Health Organization Quality of Life (WHOQOL) project was initiated in 1991. The aim was to develop an international cross-culturally comparable quality of life assessment instrument. It assesses the individual's perceptions in the context of their culture and value systems, and their personal goals, standards and concerns. The WHOQOL instruments were developed collaboratively in a number of centres worldwide, and have been widely field-tested.
The WHOQOL-BREF instrument comprises 26 items, which measure the following broad domains: physical health, psychological health, social relationships, and environment. The WHOQOL-BREF is a shorter version of the original instrument that may be more convenient for use in large research studies or clinical trials.
!Introduction
This page is to help with ''how to run the team activity of manualizing''
See also [[Before you can start a Manualizing Session]] and [[Deciding what to Manualize]].
>Remember that the ''PROCESS'' of manualizing (//having the team mentalize together about "__how__ we __do what we do__, and __why__"//) is really at least as important as its ''PRODUCT'' (some bulleted points of shared understanding and intent - that act as a reference for the team, but also //a mark in time// that //"at this point, this is how we agreed on our shared intentions in this corner of our work..."//).
!(a) Understand the 'why' of manualizing
Manualizing as a technique to support [[LEARNING at work]] and embed [[Respect local practice and expertise]] is described at [[Manualization]]
!(b) Allocate Roles:
This is one of the [[Rituals and Disciplines]] that AMBIT teams create to support their work, and two specific Roles are required:
* [[Chair|Role of the Chair]]
* [[Scribe|Role of the Scribe]]
* A third role has also been suggested, but is not used in any formal way in existing AMBIT implementations that we know of (remember we are always hungry for [[Feedback please!]]) - that is the [[Role of the Team Learning Support Worker]]
!(c) A technique that many teams report finding helpful
The [[Slice and Dice Method]] helps the team take a larger topic and break it into manageable chunks for manualizing. Most topics are larger than you think at first!)
!(d) Dealing with Disagreements
See [[Individual Differences and Disagreements]] for advice on this
!(e) Understand the Boundaries
See [[Manualization Boundaries]]: __''NB this is a TEAM TASK''__, not an individual team member's choice...
!(f) Reminder: technical skills
See [[How to edit your team's manual]] for the technical skills required to edit your team's manual
!(g) Feedback, always feedback!
The AMBIT Programme relies on hearing from the [[Community of Practice]] if stuff doesn't work or is not clear! Please help us to help you by contacting ''ambit@annafreud.org'' or use the [[Feedback please!]] form to give technical reports of glitches or other suggestions for improvements to this page, please!
!!{{$:/images/fa5/solid/comments}} Think about your own examples of mentalizing
* Mentalizing is something we all do already, at times
* In pairs, discuss examples of when you have noticed yourself doing each of the different "sides" of mentalizing
* Think about examples in your personal and professional lives
* Which seem the most familiar/most difficult to connect with?
<div class="tc-tiddler-frame" style="background-color:ghostwhite;">
!!Reminder of the different sides of mentalizing
<a class="tc-float-right">[img width= 150 [thinking monkey.jpg]]</a>
''You can mentalize //someone else//''
* Why is he not attending school?
* Why do they keep asking my team to put her in care?
* Why does my Mum keep calling the police when I go missing?
''You can mentalize //yourself//''
* Why don’t I want to spend any time with him?
* What’s making me feel stressed?
* What do I like about this job?
''You can be mentalized //by someone else//''
* My supervisor gets how hard I’m finding this case
* My worker gets why I keep going missing
''You can help other people to //mentalize you/another//''
* “Here’s why I want to ask you a bit more about your self-harm…”
* “The reason my team is involved is…”
* “I was asking because I want to make sure I’m being helpful to you”
* What was your Mum thinking do you think?
</div>
Jos De Blok has set up a new community nursing organisation in Holland. This is attracting a lot of interest. The principles of his organisation are highly consistent with AMBIT but he has proposed a structural model which is breath taking in its radical simplicity.
The whole organisation is organised into teams of about 12 community nurses. There are no managers. The current service has 9000 staff and there are 7 staff who make up the central team. there is no strategy, no meetings, no managers in the usual sense.
A link to a 10 minute you tube introduction to his ideas is shown below.
https://www.youtube.com/watch?v=BeOrNjwHw58
!What is the theory behind family work?
The symptomatic young person is seen as being part of a whole variety of ''different contexts'':
*The various behaviours, including the symptoms, are viewed as being connected to, and to a large extent shaped by, these contexts, which may include patterns in here-and-now relationships and from families of origin, and from other contexts such as the world of school, culture or other aspects of society.
* Rather than simple linear causal relationships ("A causes B"), SystemsTheory suggests that the influences that propel change (or that maintain repetitive and //unchanging// patterns) occur in multiple directions, acting reciprocally, via a range of //feedback// mechanisms
** Close relationships are regarded ''__both__'' as //influencing// and //being influenced by// the young person and the symptoms.
** The responses of family members to the young person may then be seen as helping to maintain, or contributing to, their distress and symptoms.
A branch of SystemsTheory is [[Positioning Theory]], which suggests that different people in any system are often "positioned" by the wider system, as much as (or even more than) they can be seen as taking up a particular position because of internal attributes, or by individual choice.
See subheadings under <<tag SystemsTheory>> for more description of this, and for ways in which this model for understanding human interactions has shaped specific ways of working.
!Systems and Mentalizing in Families
<<image [[Family System Mentalizing diagram 1]] width:480 height:320>>
<<image [[Family System Mentalizing diagram 2]] width:480 height:320>>
*[[Mentalization]], when it is working more or less effectively, is associated with a range of [[Features of Successful Mentalizing]], including particular [[Strengths in RELATIONSHIPS]].
*Given that for many (or most) young people, their family is the closest and therefore most powerfully affecting, aspect of their [[Social Ecology]], it is rational to make attempts to improve relationships.
AMBIT has a strong sense of [[Theory]], but it particularly stresses [[Theory in Practice]].
Sometimes different theoretical or explanatory frameworks, applied to the same problem in life, can appear frankly contradictory.
As a variety of interventions flow from these different explanatory frameworks, this can easily lead to services or teams inadvertently (out of the best of intentions) delivering interventions that lack overall coherence (see [[Dis-integratedInterventions]]).
AMBIT aims to explicitly to minimise this (see the one of the [[Core Features of AMBIT]] which is [[Taking Responsibility for integration]].
An earlier version of AMBIT was called [[Integrative Multimodal Practice]] which emphasises how //integration// has been central theme of AMBIT from its inception.
Alongside integrative work with differnt theories and practices, there is also a pervasive emphasis on sensitivity to the [[Cultural Context]] and the involvement of users, '[[Experts By Experience]]'.
!Links
[[Attachment theory]],
[[Mentalization]],
[[Biology]],
[[Psychodynamic theory]],
[[SocialCognitiveTheory]],
[[SocialEcology]]
SystemsTheory
!!!SpecificEthnoSpiritualTheories
We leave this page open for editing by local users. Certainly [[Mentalization]] and [[The Therapist's Mentalizing Stance]] is a capacity or orientation that is well suited to trans-cultural working. Indeed, it has been argued that Mentalizing may have evolved as a capacity at least in part to allow the human species to make sense of different culturally-influenced manifestations of behaviour.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Theories: LEARNING at work'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Theories: Working with your CLIENT'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Theories: Working with your NETWORKS'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Theories: Working with your TEAM'>>
</div>
AMBIT does not claim to be an overarching 'supertheory' which has worked out all the theoretical and practical relationships between different therapeutic models. It starts from an assumption that the //relationships between different theories and practices// need to be considered in a way analogous to how the //relationships between different domains of a person's life// are considered in clinical practice. As a clinically-oriented practice/intervention, there is a strong overarching emphasis on [[Theory in Practice]].
|bgcolor(lightblue): <br>Key assumptions from each of a set of different theoretical orientations are briefly considered under<br><<tag [[Theoretical/Explanatory Frameworks]]>><br><br> |
The core notion of [[Taking Responsibility for integration]] of the different ways of working that flow from all these different schools of thinking does not require the [[Key Worker]] to be //expert// in all these [[Theoretical/Explanatory Frameworks]], but to be aware:
|bgcolor(pink): <br>(a) That very different ways of making sense of complex things like human behaviour exist.<br><br>(b) That sometimes one or other of these explanatory frameworks offers an intervention or technique that most particularly and [[contingently|Contingencies]] addresses the problem at hand, offering a lever for change //in that time.//<br><br> |
Other points of theory are gathered as Sub-topics under this heading (see the "show references and info" panel, top right of this page)
!!!Some further thinking and theoretical ideas which underpin this central AMBIT idea.
The thinking behind this is rooted in [[Attachment theory]];
For example, what contributes to the wish to hospitalise a child (whether expressed by the YP or by the family, school, etc) is the breakdown of the perception of a [[Secure Base]].
The introduction of a key individual, (supported by a second co-worker who will be Keyworker to other patients), who is equipped and skilled at a basic ("Barefoot") level to deal with //all// aspects of the family's problems within the home context, is intended to lay the ground as quickly as possible for the re-establishment of a [[Secure Base]] for the future. The Keyworker is not a 'Jack-of-all-trades' but a "specialist generalist".
A contributory factor to the crisis may have been a collapse of confidence in the [[Family]]'s ability to cope with the young person's behaviour and problems. Thus, there is a loss of 'self-efficacy' at the Systems level, added to by a number of external systems of care coming to the aid of the family simultaneously, each trying to help the family by taking on some of the responsibility which the family are assumed no longer to be able cope with, or by taking a young person away from a family which has become unbearable to him.
In either case it is very important that through [[Family Work]] a service should offer strong support for the family's //own// care of the YP, [[Restoring family capacity]] by [[Scaffolding existing relationships]], if you like, rather than seeking to replace these.
In [[AMBIT]] this is provided via an integrated system delivered primarily through a single Keyworker (and his or her co-worker - keyworkers will support and cover each other for leave, study days, etc). This is a fundamental difference from the conventional [[Multi-Disciplinary Team]] or MultiAgency context whereby a variety of different services offer different types of support to different people within the crisis situation. Freqently such multi-agency input unwittingly fragments the support on offer (something we refer to as the [[Tower of Babel]] experience.) Hence one of the [[Core Features of AMBIT]] is specifically directed at ensuring that the Keyworker is [[Taking Responsibility for integration]] through, amongst other things, the development of a therapeutic relationship that allows activation within the young person of some version of a Secure [[Internal Working Model]] of an [[Attachment Relationship]].
Having a keyworker system allows the family and its social network to be held in mind continuously, offers contact as frequently as is needed in the early stages in order to help the network to regain its effectiveness, and delivers whole range of basic interventions (that are more or less EvidenceBased) flexibly, light footedly, via a single person who is known and trusted, and //contingently// - according to the demands of the moment. (It is well known that adolescents are often poor at deferring the gratification of their wishes, and families in crisis will often also have a very limited capacity to wait for another unknown professional to arrange and deliver a specific intervention - by the time the intervention is on offer they will often feel "the moment has passed".
The Keyworker also engages with the [[Community]]
!!Training
There are [[Training Exercises for the Keyworker Relationship]]
!!Material on Theory
*[[Theory]] and [[Theoretical/Explanatory Frameworks]]
!!Material on the Practice of [[AMBIT]]
*[[Practice]]
!!Theory and Practice in AMBIT
*[[AMBIT: an overview]]
*[[Core Features of AMBIT]]
!!Linking Theory and Practice
[[AMBIT]] is not a single "thing", but an //orientation// that is primarily about //linking// [[Theory]] to [[Practice]], and developing an organisational structure that can provide the kind of well-structured supervisory/support sytems that can sustain such service delivery. It is a framework for developing attuned, evidence-based practice, as much as ready-made thing-in-itself.
Practitioners should have an understanding of the theoretical models that underpin their practice, not least because this instils confidence in their technique. They are encouraged to browse this via links from manualized practical instructions (or to add such links if they wish - see instructions on how to [[Edit|How to edit your team's manual]] the manual.
This is not a comprehensive textbook. The descriptions of theory contained in this manual are designed to provide the [[Key Worker]] with a sufficient conceptual grasp to:
#Understand why she is doing what she is doing in respect of any particular intervention technique.
#Provide a corresponding level of confidence in the technique and its evidence-based effectiveness which will inevitably be conveyed to the patient.
In other words [[Theory]] (and an evidence base) underpins individual interventions but the manual's focus is on supporting and framing clinical [[Practice]] in newly integrated and integrative ways (see [[Taking Responsibility for integration]].)
As one of a new breed of BarefootPractitioners the Key Worker is not expected to be a theoretician or indeed an expert in any specific theoretical or interventionist framework, but to understand basic concepts insofar as this empowers him or her to deploy //techniques// - the expertise is in deploying existing "technologies" in integrated ways, to a target group that has previously been poorly served by conventional services, rather than in brand new (and "branded") technologies.
The Key Worker is supported in the work by strong SupervisoryStructures within the wider team, but also through possession of a 'toolbox' of different techniques (see [[Specific interventions]] and WhichInterventionWhen) which are themselves drawn from a range of theoretical and explanatory frameworks.
Will a young person and family in crisis be able to //make sense of and to use// such a wide range of interventions? Perhaps the sheer diversity of the different interventions could simply confuse the recipient? This question of User Acceptability is particularly relevant if we consider that the interventions are being delivered in the midst of a crisis.
An important question regarding this notion of Theory in Practice is [[Why intervene simultaneously in multiple domains?]]
!What is it?
This is really prompt for therapists/workers to be sensitive to how ''hard'' it is for families or young people to come into any kind of treatment relationship - they are "putting a lot on the table" and have a right to expect that we treat this with the greatest of care and respect.
!Rationale - what is being bargained for?
* Maladaptive behavior provides some comfort and an illusion of control, safety and attachment.
* The choice to relinquish non-mentalizing behavior requires enormous courage from the child and the rest of the family.
* All children and families seeking help wish to change, and recognize the price they pay for their efforts to cope... BUT
* Even the most motivated are reluctant to give up the ways they know to gain safety, control and attachment
!The BARGAIN:
|"Taking the risk of attempting new ways to communicate, cope and relate in order to replace a non-mentalizing illusion of control and attachment with a mentalizing approach that offers the opportunity for real mastery and genuine attachments."|
The relationship between [[Key Worker]] and young person is not ordinary, even though the Key Worker may make use of much 'ordinariness' in his or her interactions to develop and maintain [[Engagement]]. The entire focus of the Key Worker is to use this relationship as a platform to facilitate meaningful change for the young person. Every interaction between young person and Key Worker is dictated by the [[Boundaries]] of this relationship ([[Patient-Worker Boundaries]]).
The Key Worker uses an understanding of the nature of an [[Attachment Relationship]] to help foster the most therapeutic alliance possible, a process that is documented under [[Engagement]] - the aim is to build a strong ''therapeutic alliance''.
A key element in the formation of good [[Engagement]] is the creation of [[Epistemic Trust]], and in turn, this is built through good [[Mentalization]] by the worker.
The therapeutic relationship requires a judicious (by which, of course, we mean "well-mentalized"!) [[Holding the Balance]] between SUPPORT and CHALLENGE.
See two pages:
[[Isn't mentalizing just being supportive?]]
[[Challenging techniques]]
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/EjdE7W0M5Cs?rel=0" frameborder="0" allowfullscreen></iframe></html>
!Why this matters:
There is plenty of strong evidence to support the importance of the therapeutic relationship, (or ''Treatment Alliance'') as being an extremely important part of what connects to improved outcomes.
* [[Bachler (2014) Differential effects of the working alliance in family therapeutic home-based treatment of multi-problem families]]
* [[Ungar et al (2013) Service use, risk factors and resilience in adolescents using multiple services]]
On occasions the therapist may use descriptions of his or her experience of being in the situation as a way of:
*Alerting the family to the 'meta-position' - giving a 'bird's eye view on the situation:
>//"Right now I must tell you that I am feeling quite lost and overwhelmed by the sheer volume and intensity of what is going on between all of you - it is all I can manage to hold onto myself - so I am guessing that this might feel slightly similar for some of you, too."//
<html><iframe width="560" height="315" src="//www.youtube.com/embed/976INYkc_WM?rel=0" frameborder="0" allowfullscreen></iframe></html>
*Repairing or strengthening the therapeutic alliance:
>//"Id like to check with you all [especially parents] if you would feel you could tell me if at any point any of you find yourself defending yourself, feeling attacked, misunderstood, or are not sure if I am really on your side."//
**Other techniques
***Monitor one’s mistakes and be ready to model honesty and courage by acknowledging mistakes
***Promise you will make more mistakes and suggest that:
>//"I hope my next mistakes will not be hurtful, but will give us a chance to take a step back and learn how to talk about how to work out our mistakes, misreadings and all the resulting hurt and anger."//
Cognitive Theory tends to distinguish between three levels of thinking:
#[[Explicit Negative Thinking]] (e.g. "I can't think of anything to say!")
#[[Semi-implicit dysfunctional assumptions]] (e.g. "If I get cross with my child then he will hate me foreever")
#[[Implicit Core Beliefs]] (e.g. "I am unlovable")
A core proposition in Cognitive Behavioural approaches is that specific thoughts influence the feeling state of the thinker, and this offers an angle from which to address the task of changing a prevailing mood state.
! What is //Thinking Together//?
Thinking Together is one of the most prominent tools that AMBIT promotes; it can take a while (perhaps a year?) for any team to fully adopt, but it has proven to be one of the most consistently valued elements of this framework for practice that AMBIT-influenced teams report back on.
* It is a simple way of ''structuring helping conversations'' between workers that can occur in many different contexts.
* It is designed to support helping conversations to happen in a ''time-limited and purposeful'' way.
* Its regular use can have a profound influence on ''team culture''; encouraging a team to mentalize one another with as much care as they mentalize their clients
* It is grounded on principles of [[Mentalizing]].
!!!!//Thinking Together// is designed to support helping conversations:
>a) ''1:1'' - one worker seeks help from another worker (e.g. informal conversations between team members; supervision; line management)
>b) ''Groups'' - one worker seeks help from a group (e.g. team meeting; group supervision)
!!Structure
There are ''four distinct steps'' in //Thinking Together// (which has been described as a 'four-step dance'). When team members are learning this approach, it is worth marking each step fairly explicitly, as they support the conversation to take a very particular and purposeful 'trajectory':
Click the highlighted links for more detail on individual steps as required:
!!!1) [[Marking the Task]]
This is the step most commonly left out in ordinary conversations. The ''help-seeker'' has to:
* Mentalize their own self (//'why am I coming to you asking for help? What kind of help am I asking for? How would I know if I had been helped?'//)
* Broadcast these intentions accurately to the helper //before// filling the helper's head with all the details of the problem!
The ''helper'' should //not allow the conversation to proceed beyond this// until they feel quite clear about the ''kind of help'' that they are being asked for:
*emotional help?
* informational or sense-making help?
* practical help?
* Fully-'completed' help, or 'first steps' towards a solution? and until they have clarified there is ''enough time'' to get somewhere helpful and that the ''place'' (a corridor, an office, a phone-line) is adequate to support the task
!!!2) [[Stating the Case]]
Giving the story, but allowing the helper to be sternly boundaried in holding the teller to ''keeping to the bones'' of the story, and avoiding storytelling (over-inclusiveness that is often a strong clue to non-mentalizing). What does the helper really need to know in order to help with the task their colleague has just marked for them?
!!!3) [[Mentalizing the Moment|Mentalizing the Moment (in Thinking Together)]]
During the first two 'hard-boundaried steps', both workers will know that this third step is coming (this is a //team// approach, and knowing this sequence and the point of this discipline will help workers to 'get there faster' without experiencing the first two steps as too blunt; the point of these boundaries is because the helper is taking very seriously their intention to help (rather than just making sympathetic noises that are ultimately self-soothing but unhelpful!). ''The helper tries to mentalize first of all their help-seeking colleague'' (//not// - first of all - the client or other people in the story, who are //not present//). In doing so they are showing a willingness to engage, and to work to show their colleague that this predicament is understandable. If the help-seeker experiences themself as having been //accurately mentalized// this is validating and is often a powerful support in the task of restoring their own mentalizing. They will also develop more epistemic trust in the helper who does this well - so that if the helper does have important safety advice, etc, the help-seeker is more likely to hear this and experience it as relevant to their work. Only after the help-seeker has been mentalized do both of them go on to mentalize and discuss the task and other people involved ...
!!!4) [[Return to Purpose]]
The helper asks the help-seeker first if their mentalizing and telling of the story has helped them fulfil the purpose of this conversation (rather than 'pouring out solutions' that may have already been thought of...). Here there is space to 'get practical' and if the helper has key safety messaging they can give it.
!Why do we need a tool like Thinking Together?
Helping conversations take place between workers all the time. Trying to learn a new discipline of //how to conduct these conversations// can feel like being re-taught how to ride a bicycle. We encourage you to persevere!
Over the years most practitioners have told us that, while of course they are often helpful, existing patterns of helping conversations between professional colleagues are not always experienced as useful or as addressing what is wanted or needed. Sometimes they can leave help-seeker or helper feeling
* Experiencing dilemmas, challenge, stress and arousal is an //expected part of helping work//, particularly when working in teams supporting clients with multiple needs and presenting with risk.
* Challenges occur in all aspects of our work;
** with clients
** with team-mates
** with other professionals or informal contacts in the client's wider network.
* Stress places our own capacity to sustain a mentalizing stance under strain. Poor mentalizing leads to:
** problems in articulating what we need
** problems in hearing what someone else is asking for
** problems in offering what is needed
** problems in trusting help that's offered
This is a key practice relating to the peer-supervision that flows from having a [[Keyworker well-connected to wider team]] and applying [[Active Planning]] in all that we do (both of these are [[Core Features of AMBIT]]).
In terms of [[Active Planning]], Thinking Together is the very shortest-term version of this practice - making a plan (and [[Broadcasting Intentions]] about this) for how to use //this next ten minutes// 'around the water-cooler', or on the phone, in my colleague's car, or in [[Team Meetings]], etc., (see below for "When and Where").
!!Three Analogies
!!!1. Ripples in a pond
//Thinking Together// draws on the [[Ripples in a Pond]] analogy for how anxiety reveals itself in teams:
[img[https://lh3.googleusercontent.com/-J5GW0cjH2CI/Ubjka0EsxgI/AAAAAAAAIb4/UpMrGfUpVm8/w721-h541-no/ThinkingTogether.jpg]]
//Thinking Together// is an example of the [[Rituals and Disciplines]] that AMBIT suggests teams should work explicitly to develop and maintain: its steps-for-a-helping-conversation are designed to maximise the amount of ''useful'' information that can be '[[passed outwards|Passed-outwards Discussion]]' from places of greater disturbance (the middle of the pond, //where mentalizing is hardest//) towards calmer places or people, from where attuned and //productive// thinking together (a.k.a. [[Mentalization]]) is more possible. When a colleague is in trouble ''we don't all want to jump into the middle of the pond together'', but when you are sinking, you do need to talk to someone who is at least prepared to wade in a little; this is perhaps what the helper's efforts at [[Mentalizing the Moment|Mentalizing the Moment (in Thinking Together)]] should feel like!
!!!2. Who's got my rope?
Mountaineers have worked out over time that maintaining a strictly disciplined a ritualised approach to communicating across their ropes is lifesaving.
<a class="tc-float-right">[img width= 600 [Who has your rope pic.jpg]]</a>
The kinds of ''ritualised call-and-responses'' required to use a rope safely (//making absolutely sure you are holding my rope and are tied on before I start to climb, that you can pay out when I need slack, and hold tight when I am slipping//) is critical to ensure safety - especially when climbers are stressed and tired.
//Thinking Together// is a very similar attempt to "get things lined up" in preparation for 'supervisory' conversations about things like
* what to do next
* how to cope
* how to make sense
* how to adapt in the face of an unexpected obstacle to progress
These help-seeking conversations are very common, and often critical operations in our risky world of trying to help very vulnerable clients who present with significant risks.
!!!3. Landing lights
The ''4 steps'' of //Thinking Together// that provide structure for helping conversations are like the landing lights on a runway that show a plane coming out of the fog where to land safely:
[img[Landing lights.png]]
!!''A Video on Thinking Together''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/nYFxbzL76aI" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></html>
The more that ''accurate'' and ''relevant'' information can be passed-outwards from a very chaotic and overwhelming focus (see [[Passed-outwards Discussion]]), the more it can be digested and acted upon in a timely, effective and therapeutic way.
!!''A "good pass"? Four steps to Thinking Together''
''1.'' ''[[Marking the Task]]'' <br>''2.'' ''[[Stating the Case]]'' <br>''3.'' ''[[Mentalizing the Moment (in Thinking Together)]]'' <br>''4.'' ''[[Return to Purpose]]'' <br><br>What is absolutely critical is that in a team there is a ''shared understanding'' of WHAT these 4 steps are and WHY we choose to use this disciplined way of setting up dialogues to seek help from each other .
!!''When and Where to use it?''
This is for teams to work out as part of the development of their local team culture, but certainly existing AMBIT-influenced teams have reported finding this useful in:
!!!(a) ''1:1 staff conversations''
Here we are trying to replace the "water cooler/kettle chat" or enhancing telephone consultations with workers in the field.
In these situations, if appropriate, the exercise can be done //in front of the young person// with the mobile phone switched to "loudspeaker" - this is very similar to the systemic practice of the "reflecting team", but in addition, we would argue that it is a great way to be [[Broadcasting Intentions]] and to be modelling help-seeking behaviour to the young person. By showing a young person that //"My own ability to think clearly and make the best decisions is affected by my circumstances, and 'phoning a friend' is a helpful thing I do"// I am modelling healthy help-seeking, and there is an implicit invitation for worker and young person to explore later, which is: //"You've seen how I have a bit of a back-up team who help me keep my balance. Who is in __your__ back-up team, that you could lean on at these kinds of times? How could we go about getting a few people in place that you could use?"//. This is a nice way to introduce [[Scaffolding existing relationships]].
!!!(b) ''Team Meetings''
There is video of some role-plays in [[Team Meetings]] that shows how this can have a significant impact on how these critical working spaces can be enhanced by a team adopting this approach.
!!''What if my colleague doesn't recognise the concern? Graded assertiveness.''
Thinking together is helpful if a concern (even if poorly defined) is //acknowledged// between parties. //What about the situation when a worker notices something of concern in their colleague's situation or practice, which they, however, do not seem to recognise?//.
>''Here there is a requirement for'' [[Graded assertiveness in challenging a team member]].
This may be necessary to create awareness of the concern, and is certainly a critical aspect of a team's duty to pay attention to [[Managing Risk]] (one of the [[Core Features of AMBIT]].)
!!Role play videos on Thinking Together
* Below are two videos - "thinking apart" and thinking together, that give a simple demonstration of how the technique might be helpful.
* There is a [[Video introduction to Thinking Together]] - (8 minutes) that explains the text above.
* There are also role-played examples of doing it, and not-doing it in [[Team Meetings]], where the technique can have a helpful impact on the effectiveness and sustainability of meetings that involve case discussion, group supervision, etc.
!!''How not to do it: Thinking Apart''
Here we offer two examples of what might be called ''"Thinking Apart"'' - well-meaning but un-marked and un-boundaried (and ultimately, not very well [[mentalized|Mentalization]]) discussion, that can inadvertently serve to amplify anxiety or shame in the worker:
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/dhVwRaNGmtk" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></html>
<html><iframe width="480" height="360" src="https://www.youtube.com/embed/GMKWnfMN6uo?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!''Thinking Together (OK, it is idealised!)''
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/iUaWgJ2ibiE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></html>
<html><iframe width="480" height="360" src="https://www.youtube.com/embed/ZeSW-uWFfE0?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!''Exercises''
These steps can be put to work in a more formal exercise - the [[Passed-outwards Discussion]] or [[POD|Passed-outwards Discussion]] introduces the rationale for making space for mentalizing in discussing high affect situations, and the [[Thinking Together - Training exercise]] helps to practice the day to day routine.
See [[Local Session 04: Working with your Team]] for a full training session for a team.
!!''Feedback from AMBIT-influenced teams (2014)''
>>"We are now using thinking together regularly"
>>"Thinking together is used in our peer supervision"
>>"We talk about 'having an AMBIT moment' - meaning thinking together time"
>>"Utilising thinking together in our case discussions has helped team stay more focused and achieve more from team discussions. Shared team language and people feel more supported and cohesive."
>>"The "thinking together" concept has been very influential when used appropriately. It is very clear in meetings when we have an "AMBIT facilitator" and mark our task compared to meetings that try to follow an agenda, but we miss the mark."
>>"Outside of meeting the team use 'thinking together' frequently and speak v positively of it at review."
!!The steps (reminder)
See [[Thinking Together]] for more details
#Mark the Task
#State the Case
#Mentalize the Moment
#Return to purpose
!!How might we introduce and use this in practice?
Record notes here.
!!Purpose
To practice the [[Thinking Together]] "[[ritual|Rituals and Disciplines]]" for discussing casework...
!1. Exercise for individual worker-to-worker conversations
Watch a video case discussion between two colleagues (without any Thinking Together routine, and not entirely successful...)
<html><iframe width="480" height="360" src="https://youtube.com/embed/GMKWnfMN6uo?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!!In pairs and small groups:
* How was the discussion helpful or unhelpful?
* How might they use the four step structure to promote mentalizing/be more helpful
* Role play the scenario using Thinking Together
!!!Final video clip
Another video clip to demonstrate the same discussion with the workers using [[Thinking Together]]
<html><iframe width="480" height="360" src="https://youtube.com/embed/ZeSW-uWFfE0?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!2. Exercise for Team meetings
* As a team, go to [[Team Meetings]] - watch the videos there (they are designed as a simple role play to demonstrate //technique//, not as perfect practice!).
* Discuss this, and compare and contrast with how your own team meetings work well when they do, and don't work so well at other times
* Choose a live case that is //not too contentious// (this is for practice) and role play a team discussion using this framework.
* After the role play, open some reflective discussion by breaking into pairs in the team first, and discussing how this may or may not help your team if brought into common practice.
!!{{$:/images/fa5/brands/youtube}} Thinking Together
This is the same scenario as the "thinking apart" video, but this time the workers are following the steps of Thinking Together.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/iUaWgJ2ibiE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
{{$:/images/fa5/solid/comments}} ''Go back to the group call'' when you're done, to discuss what you think. What is different about this conversation?
!!{{$:/images/fa5/solid/comments}} ''What to do''
<a class="tc-float-right">[img width= 300 [ripples.jpg]]</a>
''Practice Thinking Together in your group of 3:''
Allocate a Person A, Person B and Person C
* ''Person A'': shares a dilemma with B. Choose a real dilemma from your work that is causing you some worry at the moment.
* ''Person B'': takes A through the steps of Thinking Together (it is helpful to name the steps so that everyone knows where in the process they are)
* ''Person C'': is observing, but can help out
!!{{$:/images/fa5/solid/book-reader}} The four steps of Thinking Together
Here are the four steps, as a reminder.
{{mark.jpg}}
{{state.jpg}}
{{mz.jpg}}
{{return.jpg}}
!!{{$:/images/fa5/brands/youtube}} Thinking apart:
This is an example of a well-intentioned but not very helpful conversation with a colleague
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/dhVwRaNGmtk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
{{$:/images/fa5/solid/comments}} ''Go back to the group call'' when you're done, to discuss what you think. Is anything in this video familiar?
||bgcolor(pink):"''Mentalization based approaches are the least novel approaches imaginable''" <br> Peter Fonagy<br>||
!Integrative purpose
* An explicit purpose in the development of mentalizing theory was the focus on ''integrating'' theoretical and practical models that may have arisen in diverse academic traditions...
** in a sense the developers were purposefully trying to move beyond tribal allegiance to a "school" and towards clarification of what has been validated (wherever it has emanated from)
** Ultimately, the question is about what can be integrated and applied effectively in multiple settings, via multiple levels and types of training/professional.
** Can skills and knowledge built up painstakingly in many places be transmitted in useful ways more widely than has previously been the case?
* MBT, AMBIT, ~MBT-F, ~MBT-A etc do not therefore seek to invalidate other models of practice any more than any scientific endeavour does. The question is ''"Is this helpful in measurable ways?"''
!Clarification Vs Over-complication
* There will be academic theories that I and/or others do not know about.
* I find it helpful to become curious to understand more clearly what elements of the theory that is being described are seen as being the same, and how these ideas are seen as similar...
** BUT... In a training there is a balance to be struck between exploring other understandings/models in this way, and avoiding becoming sidetracked into theoretical/academic debate that could be perceived by other trainees as [[Pretend mode]] - clever words, but not to the point...
** Is the question about clarifying some element of the theory? Or is it about challenging perceived plagiarism in Mentalizing theory or AMBIT, etc?
!Plagiarism Vs Pragmatism
* Is this a worry that [[Mentalization]] based treatments or theories are guilty of plagiarism?
** There are many sources for the science behind Mentalization, and these are quoted at length in the source material (see [[Academic references]] for some of these.)
** Inevitably many theories point towards the same areas of interest - the developers of Mentalization based practice certainly make no claim to originality, but rather to utility.
** If Mentalization-based theory were to be used as a stick to beat another "rival theory" we would see this as rather non-mentalizing - it is, after all, just a different "lens" through which to examine and make sense of human behaviour and interaction.
There are many techniques to block out unwanted thoughts - particularly obsessional thoughts that the young person may be aware are "silly" or "disgusting" or "frightening" but which keep coming back in ways that interfere the rest of their day to day functioning.
The commonest techniques rely on the fact that in general it is very hard to keep two mental activities going in full consciousness simultaneously. So by consciously deciding to do ONE thing (think one kind of thought) it tends to block out another, less welcome, kind of thinking.
!Critical steps
1. Help to ''encourage noticing'' of unhelpful thought patterns
** See [[Notice and Name]] in family work - this is an individual version of exactly the same principle.
** Being able to notice (to think about my own thinking) is of course a feature of [[Mentalization]].
2.Develop a ''drill'' in response to this
** This is a kind of harnessing of some of the more //helpful// aspects of obsessionality/compulsions...
** You are designing a detailed (almost //"ritualised"//) response to an unhelpful experience (thinking an unhelpful thought.)
For example:
* Distraction techniques:
** Watch an episode of your favourite TV show
** Play a game
** Talk to someone you trust
** Take a bath, go for a run, do some sit-ups
** See [[MP3's are like thoughts]] - consider preparing a special playlist for these times that you can listen to on your phone/ipod/etc
** Prepare a list of ALTERNATIVE TRUTHS for the young person to say to themselves as an alternative to the unwanted thoughts:
*** These are statements that should be created by the young person (often with some help) and selected on the basis that they are //unarguably true// in the young person's mind.
*** But they should also be statements that //challenge or contradict the unwanted thoughts//. For instance:
**** if obsessional thoughts arise about germs and contamination, a young person may repeat a thought such as //"I have a normal immune system that learns about germs by meeting them."//
**** if obsessional thoughts arise about violence or distressing sex, something like: //"It is normal to be curious about violence (or sex), but I am also someone who has loving friends and family."//
* Sometimes more physical "wake-up!" calls are found to be helpful - using a large rubber band around the wrist, so as to pull it back and flick it on one wrist is mildly painful, but might act as a "//WAKE UP!//" call to a young person, helping to alert them to the fact that they are starting to think in negative ways (be careful that this is not "framed" as a kind of //punishment// for thinking in unhelpful ways, though.)
This refers to the loss of ordinary connections between thoughts, so that language flows in a broadly logical direction, with one thought leading to another, and so on.
At its most severe the person can hardly make any sense in conversation at all, or be appearing to talk nonsense; in more subtle forms there may just be a "loosening of associations" between the thoughts expressed so that the person appears to keep 'losing the point' or 'going off on a tangient'.
This is symptom of [[Psychosis]] although [[Cannabis Misuse]] or intoxication with other drugs can cause it, too.
What you are reading is a TiddlyManual. It is a way of manualizing complex interventions that offers multiple additional functions over paper "how-to-do-it" guides, and a lot more than other web-based treatment manuals that do not use the highly innovative opensource software called TiddlyWiki (hence the name.)
The use of wiki manuals has increased enormously over the past years at the [[AFNCCF]] and AMBIT is proud to have been the beginning of this. Here is a brief introduction to how wiki manuals are being used across the centre, and below this is more detail on what they are and how they work.
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/uMWnm3ymDzU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
!!Brief narration and animation to explain "Why use Wikis?"
By DickonBevington
<html><iframe width="480" height="360" src="https://youtube.com/embed/EZ_yHJ1WLTE?rel=0" frameborder="0" allowfullscreen></iframe></html>
Tiddlymanuals take much inspiration from the 'OpenSource' movement in computer software development. They are freely available (though released under a Creative commons [[License|Licensed]]), as the notion of closely guarded, and expensively-marketed, intellectual property in respect of best psychotherapeutic practice seems contradictory in the helping professions. We acknowledge the support of the [[AFNCCF]] and our [[Sponsors]] in allowing this development.
''Practitioners using Tiddlymanuals remain responsible for their own professional practice.''
~TiddlyManuals take the form of Wikis, but they function as completely self-contained and easily editable documents, too; they can be downloaded, saved locally, and run from a USB stick, or a local computer without any access to the internet.
See the [[User Guide]] for more details, and go to @tiddlymanuals to see other versions of tiddlymanuals that are available.
TiddlyWiki is the OpenSource software that these manuals are built on.
* The ''unique properties'' of TiddlyWiki allow AMBIT manuals to be built as "layer-cakes" so that the bottom level is curated by the [[AMBIT Editorial Group]] with multiple separate upper layers that can be curated separately, one for each team that trains in AMBIT.
* Hence, ''local teams can blend their own local expertise'' and details on how they apply AMBIT within their specific local cultural and organisational ecology (this is one of the ways that AMBIT tries to live up to its own ideals by balancing the need to [[Respect local practice and expertise]] with the need to [[Respect for Evidence]]).
* You can ''see what other people are writing about'' (see [[Community of Practice]] or a list of [[Other team's AMBIT manuals]] which you can browse) or you can look at the Recent changes tab Soon we hope to make it possible to browse other teams' local content from //within// your own manual.
* ''Content within each page is linked'' in meaningful ways via [[Links]] and [[Tags]], which can easily be shared with colleagues by generating a unique web address that opens the manual with just that page (or collection of pages) pre-opened: ([[Create shareable weblinks to specific manual page(s)]])
* Pages can embed video, pictures, sound recordings, and more, but are easily edited by users; every team that trains in AMBIT gets their own version.
* The Open Source community of programmers that has developed TiddlyWiki under the guiding influence of Jeremy Ruston has been enormously helpful to the AMBIT programme, and their working methods have been highly influential, too (see OpenSource)
* ''Find TiddlyWiki online'' from where you can download and play with your own wikis [[here|https://tiddlywiki.com]]
!Title:
Understanding and sharing intentions: The origins of cultural cognition
!Authors:
Michael Tomasello, Malinda Carpenter, Josep Call, Tanya Behne, and Henrike Moll
Max Planck Institute for Evolutionary Anthropology, D-04103 Leipzig
!Abstract:
We propose that the crucial difference between human cognition and that of other species is the ability to participate with others in collaborative activities with shared goals and intentions: shared intentionality. Participation in such activities requires not only especially powerful forms of intention reading and cultural learning, but also a unique motivation to share psychological states with others and unique forms of cognitive representation for doing so. The result of participating in these activities is species-unique forms of cultural cognition and evolution, enabling everything from the creation and use of linguistic symbols to the construction of social norms and individual beliefs to the establishment of social institutions. In support of this proposal we argue and present evidence that great apes (and some children with autism) understand the basics of intentional action, but they still do not participate in activities involving joint intentions and attention (shared intentionality). Human children’s skills of shared intentionality develop gradually during the first 14 months of life as two ontogenetic pathways intertwine: (1) the general ape line of understanding others as animate, goal-directed, and intentional agents; and (2) a species-unique motivation to share emotions, experience, and activities with other persons. The developmental outcome is children’s ability to construct dialogic cognitive representations, which enable them to participate in earnest in the collectivity that is human cognition.
!Online versions of the paper:
Go to this [[Link|http://email.eva.mpg.de/~tomas/pdf/BBS_Final.pdf]] or see it below:
<html><div align="center"><iframe src="http://email.eva.mpg.de/~tomas/pdf/BBS_Final.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
* ''Broadcast the common "trajectories" of team trainings''
** Different stages of motivation, and resistance
** A "journey"
** The experience of trying to AVOID the necessary period of difficulty/feeling is not helpful
** But "Fools rush in where angels fear to tread" - the advantages of the PREP day are to address these issues head and ake then explicit
** We could MARK a bit more explicitly //"what it might be like to be at the end of day 1 in the AMBIT training..."//
* ''Applying the Motivational Interviewing model'' to training people who are already experienced clinicians.
** Decisional balance with teams in the PREP day
** Advantages of team changing its practices
** Costs of team changing its practices
* [[Addressing Dis-integration]] in team trainings needs to happen AS EARLY AS POSSIBLE, and in as sustained a way as possible
** Identifying OTHER valued models that are already there, that have already been invested in.
** Working as early as possible to address the possibility of dis-integrations harming the work
** AMBIT positioning itself as trying to "help you do this work better" rather than being how to do AMBIT + the work you do
* There is work to identify existing models that might potentially be challenged or undermined by a "new" training (eg [[Signs of Safety]]) and do this work in advance of any trainings, but equally, doing this fast, flexibly, as opportunities arise is also "very AMBIT"
A Topic is (of course) just a collection of information gathered together, describes all you need to know about a particular subject.
In this manual, the pages covering each of the many topics are gathered together with [[Tags]] - so ''a Tag is really best seen as a Topic Heading'', and page that is tagged with a title is a [[Sub-topic]] under that. When you [[edit|A Guide to Editing the Manual]] pages you have the option to add or remove tags.
[img[TowerOfBabel.jpg]]
The Tower of Babel is an ancient story, versions of which are described in the Jewish, Christian and Islamic faith traditions. The story has it that in Babel men started building a tower to reach up into heaven. God, dismayed at this arrogance, introduced different languages into the population of builders, architects, designers and decorators; as a result, unable to communicate effectively to one another, work ceased.
To caricature this process, in a conventional [[Multi-Disciplinary Team]] setting the young person and family are approached at various times by a variety of different characters, all with a job of work in mind.
Inevitably, each practitioner presents his or her formulation of the "problem" either implicitly or explicitly in the language of framework within which he or she was trained.
For instance (and we are here deliberately caricaturing this process), the systemic family therapist may speak of "patterns of relating", the psychiatrist of "genetic vulnerabilities and neurotransmitters", the cognitive-behaviourist of "negative automatic thoughts", and the social worker of "deprivation and lack of opportunity", etc, etc.
Thus traditional modes of delivering multiple modalities via different members of the [[Multi-Disciplinary Team]] risk delivering to the patient an experience of many interested adults who nonetheless appear to be in disagreement, and who perhaps do not fully understand each other, let alone how to integrate their approach with that of other professionals (see [[Dis-integratedInterventions]].) So, at the point of their own experience of extreme psychic disintegration, the young person and the family are implicitly expected to integrate //what academics and clinicians over the past century have signally failed to integrate.//
The position of the patient then becomes analogous to that of a child of warring parents, who may fear to be seen to side with either parent too definitely for fear of upsetting the other and sink into paralysis. In integrative practice, far as possible, it is the [[Key Worker]] who takes responsibility for this integrative function him or herself, rather than leaving it to the patient. In delivering the majority of the treatment modalities through a single relationship, albeit one that is explicitly, actively and powerfully supported by a wider team, //integration// occurs in the private interstices between client and therapist.
You can see [[Formulation and Treatment Aims]] for the [[AMBIT]] version of recording this.
This is another name for ''__"Homework"__'', or an ''Inter-session activity'', but this title is chosen here because for some young people ''the word homework is immediately aversive'' (for those with a poor educational history, or for those who have left school and would no longer consider themselves subject to such conventions.) It is a structured form of [[Behavioural activation]].
It is helpful to set Training Challenges, not only as a probe to explore the level of [[Engagement]], but also to increase the sense of [[Self-efficacy]], either in an individual, or a family.
!1. Content
Try to ensure this arises organically out of a session - practicing something that has come up...
Tasks have the purpose of continuing some of the work initiated in the session, and create a framework within which the family is requested to function, pinpointing or dramatizing certain interactions. Examples of such tasks for individuals are:
*[[ABC Diary-keeping]] of certain observable activity - such as "worst moods and people's responses"...
*Practising a technique such as [[Progressive Muscle Relaxation]], or working on a [[Graded Exposure]] task.
Example tasks for families include:
*A controlled argument about a specified agenda once weekly at a set time for a set period
*Diary keeping (see above), for instance, "guessing when patient is feeling well and noticing and observing the circumstances".
*An "unusual" outing
*Prescription of more autonomy for a family member around specific issues
*[[Focussing on Strengths]].
Tasks are designed to provide new information rather than being "prescriptions for more adequate living". While the keyworker is interested in feedback about the task, it is important that the family should not feel blamed for not carrying out the task, or for modifying it, since all the responses to the task are of use to the keyworker and family in gaining more understanding of their patterns of interaction and beliefs. While some specific examples and generic tasks were mentioned above, tasks or rituals essentially emerge from the specific keyworker/family interaction in a particular session.
!2. Consistency
If a training challenge is set you must always ask about it at the next session: to ignore it when a young person or family has put effort in would undermine [[Engagement]].
!3. Contingencies
Preparing for likely [[Contingencies]] is important - what do you do if a Training Challenge is set and the young person or family ''doesn't do it''?
*Avoid at all costs implying that this is a failure on the part of the young person or family members (this would be to risk repeating a story that they may have heard retold many times before.)
*Instead refer to the therapist stance of taking responsibility in [[Maintaining Mind-mindedness]]
>//"I just didn't get that Training challenge right at all, then did I?! What do you think I should have done to fix you up with a challenge that wasn't just going to turn into a drag for you? Can you help me out here, because I definitely got that one wrong!"//
The principle of the [[Keyworker well-connected to wider team]] is one of the [[Core Features of AMBIT]]. See subtopics or pick from the drop down menu:
<<tag [[Training Exercises for Keyworker well-connected to wider team]]>>
[[Managing Risk]] is one of the [[Core Features of AMBIT]]. See subtopics under this page, or select from the drop-down menu:
<<tag [[Training Exercises for Managing Risk]]>>
!!1. Read through the material
See [[Mentalization]] in the manual, which includes [[Videos]]
!2. Select an exercise
Use the drop down menu to select a training exercise:
<<tag [[Training Exercises for Mentalization]]>>
See a suggested local training session: [[Local Session 03: Mentalization]]
!3. Consider Therapeutic tools
Some of the [[Mentalizing Therapy Techniques]] that you can use in therapeutic settings can also be used in training/practice/role play. These include techniques, games, exploratory questions and exercises that can be used with young people, in groups, and with families. Role playing these, or using them "for real", //with staff/practitioners// can also help in developing understanding of the process of mentalizing. (Some of the exercises included are based on ideas from ''Jon Allen at the Menninger Clinic'' in Houston who generously allowed us to include them in the AMBIT manual. His exercises were originally designed for work with adults and have been adapted for young people and families. Others derive from the MBT-F manual.
[[Respect for Evidence]] is one of the [[Core Features of AMBIT]]. See subtopics or selct from the drop-down menu:
<<tag [[Training Exercises for Respect for Evidence]]>>
[[Respect local practice and expertise]] is one of the [[Core Features of AMBIT]]. See subtopics or pick from the drop-down menu:
<<tag [[Training Exercises for Respect local practice and expertise]]>>
[[Scaffolding existing relationships]] is one of the [[Core Features of AMBIT]]. See subtopics or select from the the drop-down menu:
<<tag [[Training Exercises for Scaffolding existing relationships]]>>
[[Taking Responsibility for integration]] is one of the [[Core Features of AMBIT]].
See subtopics or select from the drop-down menu:
<<tag [[Training Exercises for Taking Responsibility for integration]]>>
.
[[Working in multiple domains]] is one of the [[Core Features of AMBIT]].
For training exercises, see Subtopics under this page, or select from the drop-down menu :
<<tag [[Training Exercises for Working in multiple domains]]>>
The [[Key Worker]] and their relationship with the young person/family is one of the [[Core Features of AMBIT]].
See subtopics for specific exercises, or select from the drop down menu:
<<tag [[Training Exercises for the Key worker Relationship]]>>
Click for pick list: <<tag [[Training Exercises on AMBIT in general]]>>
This tag gathers [[Training exercises]] that are about the general AMBIT stance, rather than the specific elements that you see represented in the [[AMBIT Wheel]].
You can see exercises to practice each of these specific elements here: <<tag [[AMBIT Stance Exercises]]>>
See Subtopics, or select from the drop-down menu:
Tag feedback reports on each year's AMBIT trainings with <<tag [[Training Feedback]]>>
This page provides more details about the feedback from AMBIT training provided by the Anna Freud Centre team in 2018.
For 2018, feedback was collected from 10 trainings. We received 402 feedback forms. (Actual names of teams are not provided in this open source site). Four trainings were for single teams and six trainings were for multiple teams. Levels of satisfaction with the training were generally high with all types of training having variable ratings.
The table below shows mean feedback scores for each training and % 6-7 ratings for each of the main trainings delivered over the year.
|!Type of training |N|Mean|SD|% 6-7|Satisfaction|
|Total sample|402|25.54|3.05|85%|High|
|''Single Team/Service''|
|Team A|29|24.23|2.92|76%|High|
|Team B |19|23.72|2.31|95%|Very high|
|Team C|7|26.86|1.95|100%|Very high|
|Team D|31|23.67|3.86|70%|Moderate|
|''Multiple teams - same location ''|
|Location A|77|26.29|2.15|94%|Very high|
|Location B|103|26.24|3.35|80%|High|
|Location C|72|25.47|2.51|72%|High|
|''Multiple teams -different locations''|
|Multi-team A|17|26.11|2.11|94%|Very high|
|Multi-team B|25|25.07|3.32|81%|High|
|Multi-team C|22|23.52|3.65|70%|Moderate|
''Note.'' Some people in the trainings will have completed more than one feedback form as feedback is collected at the end of a day's training. So the number of responses is not the same as the number of trainees. As feedback is anonymised, it is not possible to link feedback to trainee so we cant accurately measure how many of the those who attended training completed feedback forms.
This page provides more details about the feedback from AMBIT training provided by the Anna Freud Centre team in 2019.
For 2019, feedback was collected from 10 trainings for a total of 436 responses. (Actual names of teams are not provided in this open source site).
Five trainings were for single teams and five trainings were for multiple teams. Levels of satisfaction with the training were generally high with all types of training having variable ratings.
Table below shows mean feedback scores per training and % 6-7 ratings for each of the main trainings delivered over the year. N is the number of ratings received during a training.
|!Type of training |N|Mean|SD|% 6-7|Satisfaction|
|Total sample| 436|25.60|2.82|80%|High|
|''Single Team/Service''|
|Team A|12|25.92|2.15|90%|Very high|
|Team B |64|23.05|3.75|48%|Low|
|Team C|19|26.63|2.77|89%|Very high|
|Team D|51|25.78|1.92|82%|High|
|Team E|33|24.00|2.98|73%|High|
|''Local Facilitators - multiple teams - same area/borough or region''|
|Location A|121|26.92|1.77|96%|Very high|
|Location B|68|25.50|2.49|89%|Very high|
|Location C|68|25.50|2.49|89%|Very high|
|''Several teams -different locations''|
|Multi-team A|21|25.54|2.65|76%|High|
|Multi-team B|14|22.79|2.99|64%|Moderate|
This page provides more details about the feedback from AMBIT training provided by the Anna Freud Centre team in 2020-21. This training has all been delivered remotely so it represents a major change in how the AMBIT training is delivered although the core content has remained the same.
For 2020-21, 197 feedback responses have so far (April 2021) been collected for trainees experiencing AMBIT training remotely. This provide some preliminary feedback of this new way of working and we will continue to examine the feedback we get about this.
In the Table below, a comparison is made between overall face to face ratings based on previous two years before the pandemic and ratings from remote training.
|!Question|!% 6-7 Face to face|!% 6-7 Remote|
|How engaged did you feel in the session?| 83 | 68 |
|How did you find the quality of the facilitation?| 92 | 72 |
|How helpful was the session in enabling you to learn knowledge, skills or ways of thinking?| 87 | 67 |
|How much do you feel that you will be able to use the knowledge, skills or ways of thinking from this session in your work?| 83 | 63 |
Levels of satisfaction with the training were generally lower than ratings of face to face training. Considering the emphasis given to interaction with trainees in AMBIT training, it would seem to us to be strange if this was not the case. Remote training is not equivalent to face to face training. It seems to us somewhat inevitable that levels of engagement in a training session will be reduced in remote delivery. The more important question for us is whether remote training is experienced as sufficiently positive for the trainees and for us to develop ways of improving engagement using this technology.
Table below shows the overall feedback scores and % 6-7 ratings for trainings delivered on zoom and compares with overall ratings of face to face trainings based on 2018-2019.
|!Type of training |N|Mean|SD|% 6-7|Satisfaction|
|Total sample (zoom trainings) | 197|23.15|4.39|67%|Moderate|
|Total sample face to face trainings |1092|25.92|2.15|90%|Very high|
We are continuing to collect feedback about this type of training. Our impression is that, for some trainees, the level of satisfaction is clearly negatively affected by connection problems and other technical difficulties. In general, these seem to be reducing both as trainees are more familiar with remote access systems and as these systems themselves improve. We will continue to evaluate remote training experience and aim to have a more comprehensive data in due course.
!!The Manual
* Each team who trains in AMBIT gets their own online [[manual|About this Manual]]. A list of all the current manuals can be found on the [[signposting site|Other team's AMBIT manuals]]. The online manual provides teams with all of the core AMBIT content, i.e. everything you need to know to be able to use the AMBIT approach in your work, as well as a space for teams to capture their own practice and what they are continuously learning from their practice.
!!Training Slides
* Teams who train in AMBIT are provided with the training slides from each day of training through the [[Downloadable Resources from Training]] page. The training slides are accessed through the manuals and are added to a teams manual following the training- the links to each day can be found on your homepage and are freely available to download from Google Docs.
!!Training Exercises
* Descriptions of all [[Training exercises]] can also be found on the manual. These include exercises in the [[Client|CLIENT exercises from AMBIT training]], [[Team|TEAM exercises from AMBIT training]], [[Network |NETWORK exercises from AMBIT training]]and [[Learning |LEARNING exercises from AMBIT training]]quadrants, as well as [[AMBIT in general|Training Exercises on AMBIT in general]] and [[suggested ideas for training sessions in your team|Suggested Team Training Sessions]].
* Additionally, you can access a list of all the [[Downloadable Resources from Training]], through which you can download the tools in pdf format.
!!Videos
* There are a vast amount of videos on AMBIT, which can be found on the manual. Using the tag <<tag [[Videos]]>> users can access these videos. Any page tagged with 'Videos' will have a video explanation or role play to explain the theory or tool being described. You can also access all videos from YouTube on [[AMBIT.tv|https://www.youtube.com/user/ambitafc/videos]]
//N.B All AMBIT Training Resources are freely available under the [[Creative Commons License|Licensed]].//
!!Introduction
In spite of best efforts, ''Dis-integration'' is a common experience in multi-agency settings. Not infrequently people may ask:
''Dis-integration! - it's still so hard to understand why people can be so unhelpful!''
This is a training exercise designed to help teams think about specific Dis-integration that becomes apparent during the process of transitioning a young person across from one service to another.
!!Learning Outcomes:
* To understand and practice identifying dis-integration in the multi-agency setting
* To generate better mentalized understanding of how and why dis-integration occurs at transition points
* To generate 2 - 4 "practice points" as small, practical interventions to reduce the impact of this barrier to effective treatment.
!!Exercise:
!!!Intro:
|This exercise is about managing the fact that we have chosen to work in a world in which dis-integration and anxiety are constantly present... Finding //small purposeful actions// to mitigate the damage that these can inflict.|
* ''MARK THE TASK''
>"to come up with 2 - 4 practice points that we can manualize today, that reflect the teams' learning and experience in MANAGING TRANSITIONS ACROSS DIFFERENT ELEMENTS OF THE SERVICE."
* ''STATE the CASE''
>Help us understand the pattern in general.
>How many per year?
>How many go OK? How many not? (Not just one difficult case)
>Give a flavour of how things tend to go wrong.
>Use Group discussions and plenary feedback
>''__Teams/Workers feed back to the trainers about the issues at stake.__''
>...each team/worker presents a few bones of the challenges as they see them.
>Keep to time!
* ''MENTALIZING the MOMENT''
>Use a SCULPT to mentalize the different components of the team and the wider network.
>NOBODY ACTS AS THEMSELVES - use post-it notes to designate characters (this is a version of the passed outwards discussion;
>''The trainers select the actors at random''.
>''__Simultaneous recording of this in a [[Dis-integration grid]]__''
|We are inviting people to see the way that the systems tend to //''"[[position|Positioning Theory]]"''// people within it, and it is very easy to //''personalise''// what is actually a person's //being [[positioned|Positioning Theory]]//.|
* ''RETURN to PURPOSE''
>Consider 2 - 4 practice points in small groups.
>Record these and share.
>VOTE for the top 2 - 4 items.
>''Each team member has a total of 4 votes only''.
>''__Show of hands for each item as we work through the list.__''
|''NOW MANUALIZE THE POINTS THAT YOU HAVE SELECTED''|
!!Time allocation:
1.5 - 2 hours
!!What's here?
This page is a tag for all the pages that either describe or sort the many training exercises developed for teams to practice skills in relation to AMBIT.
!!Training Exercises Contents
The below contents table categorises the exercises from training. Click on the arrows to view the dropdown lists.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Training exercises'>>
</div>
[img width=100% [alexis-brown-omeaHbEFlN4-unsplash.jpg]]
!!What training do you or your team actually //need//?
Consider using the [[AMBIT Practice Audit Tool (APrAT)]] to help your team decide what to practice or work on.<br>There is an [[APrAT exercise in, or across, teams]] to structure this.
!!Additional Training Exercises
*''Advice on planning'' a //local// training event: [[Planning a training event in your team]]
*''Pre-formed'' suggested team sessions: <<tag [[Suggested Team Training Sessions]]>>
*List ''Locally-developed sessions:'' <<tag [[Local AMBIT training session plans]]>>
!! Core AMBIT Training Content
These pages cover the CORE aspects of the AMBIT approach and form the basis of the AMBIT manual.
Each of the pages tagged with 'TrainingCore' covers the content to support the topics covered within the [[AMBIT Training]].
All of these pages are listed on the right hand side and are categorised for ease below.
The AMBIT manual contains many pages in addition to the Core Training pages. These include further explanation of related theory, therapeutic approaches and interventions, evidence and research. These pages are not integral to using or applying the AMBIT approach but are intended to be a resource and a learning aid for workers who would like to read in further depth.
!!Links to the Core Training pages
!!!Overview
*[[Mentalization]]
*[[Core Features of AMBIT]]
*[[AMBIT: an overview]]
!!!Client
*[[Working with your CLIENT]]
*[[Scaffolding existing relationships]]
* [[Managing Risk]]
*[[Active Planning]]
* [[AIM Cards]]
* [[Broadcasting Intentions]]
* [[Epistemic Trust]]
* [[Relationship to help]]
* [[The Worker's Mentalizing Stance]]
!!! Team
* [[Working with your TEAM]]
* [[Key Worker]]
* [[Keyworker well-connected to wider team]]
* [[SupervisoryStructures]]
* [[Thinking Together]]
* [[Marking the Task]]
* [[Stating the Case]]
* [[Mentalizing the Moment (in Thinking Together)]]
* [[Return to Purpose]]
!!!Network
* [[Working with your NETWORKS]]
* [[Working in multiple domains]]
* [[Taking Responsibility for integration]]
* [[Addressing Dis-integration]]
* [[Dis-integration grid]]
* [[Sculpting a network]]
* [[The AMBIT Pro-Gram]]
!!!Learning
* [[LEARNING at work]]
* [[Respect for Evidence]]
*[[AIM|AIM]]
* [[Respect local practice and expertise]]
* [[Manualization]]
* [[Community of Practice]]
* [[Evaluating outcomes]]
* [[Developing learning organisations]]
* [[TiddlyManual]]
* [[Training Resources]]
* [[Training exercises]]
!!What is this?
The <<tag TrainingManualization>> tag gathers together all of the (semi) blank pages in the manual that we would hope that training teams will populate during an [[AMBIT Training]].
For teams previously trained, but who are just getting started with [[Manualization]] these pages are a good place to start.
!!What to do
Ideally with some facilitation, arrange a series of time-limited workshops (say 15 minutes per page/discussion topic) to create a series of 'first drafts' (remember, the point of [[AMBIT]] is for our work to be forever in draft, directed at continuous learning and improvement. What is your best effort on this day to represent the team's answers? Allow a spread of opinions in discussion ([[mentalize|Mentalization]] each other!) and try to arrive at a short series of key bullet points that capture the teams existing ''strengths'', current ''challenges'' and identified ''needs'' for improvement in each of the four quadrants of the [[AMBIT Wheel]].
This exercise dovetails nicely with the [[Four corners - Training Exercise]]
A tag to gather all relevant material under the heading of Trauma
.
.
.
.
[img[Ripples_picture]]
!!What is trauma informed care?
Many welfare organisations are now committed to providing trauma informed care (TIC). The exact definition of trauma informed care varies between organisations but has a number of common features. In many ways it is a set of shared values by which care is delivered.
Fallot and Harris (2009) suggested that TIC should be underpinned by five core values:
*safety,
*trustworthiness,
*choice,
*collaboration,
*empowerment.
A useful government guidance is provided https://www.gov.uk/government/publications/working-definition-of-trauma-informed-practice/working-definition-of-trauma-informed-practice
This has the same five key values as above but also emphasizes the importance of cultural sensitivity, inclusiveness and diversity as being crucial to effective trauma informed practice.
One of the main drivers for encouraging the creation of trauma informed care has been the research on the impact of early [[Adverse Childhood Experiences (ACEs)]] on the long term physical and mental wellbeing of people who have experienced these in childhood. This framework places adverse experiences and trauma in the context of individual developmental histories. The role of ''adverse community experiences'' (e.g., the experience of racism; discrimination against LGBTQ+ communities; powerlessness and poverty) is given less prominence in this framework. The role of these broader contextual factors needs to also be highlighted.
A second key motivation of TIC is to reduce the risk of [[Re-traumatization]]. This is the risk that the type of help being offered to the client may inadvertently trigger a re-experiencing of the original traumatic event. An example of this is a situation where a client is asked to describe a traumatic event and the recalling of the details of this leads to a re-experiencing of the traumatic event such as a sexual assault. Trauma Informed Services aim to enable staff to be sensitive to the risks of this and to have skills to mitigate this risk.
Two influential practice ideas are regularly referred to in TIC. One is the concept of the ''window of tolerance'' which is very similar to ideas of emotional regulation and mentalization. In TIC this is generally applied to clients whereas AMBIT applies this idea to clients, and workers and worker interactions with other staff as well. The second key idea is the ''fight/flight response'' which again is readily shared with the AMBIT framework.
Trauma informed care recognizes that the source of trauma is not just attachment relationships, but can also be community and intergenerational contexts and also that institutions can contribute to people’s trauma. Again, this is highly congruent with AMBIT which is continuously trying to broaden people’s awareness of these other societal/community/wider contextual factors in thinking about what disrupts safety and increases threat.
TIC tries to remove the barriers that exist for people with trauma histories to accessing services – the multitude of things that we might need to pay attention to to increase safety/reduce threat. TIP doesn’t exist to treat trauma as such but it’s just a helpfully general application of a set of ideas that probably would benefit a great number of people, including those who have been traumatised.
Trauma-focussed CBT is recommended by NICE. An excellent web-based resource is provided by the Medical University of South Carolina at:
> http://tfcbt.musc.edu/
This web resource is highly recommended, and although it will not turn the trainee into a "certified" practitioner it will build on skills and knowledge to support improved practice. Trauma-focussed CBT builds on the work of many dedicated individuals and we quote from the ~TF-CBT website here:
>//~Trauma-Focused ~Cognitive-Behavioral Therapy, was developed jointly by Esther Deblinger, Ph.D., ~Co-Director of the New Jersey CARES Institute at the University of Medicine and Dentistry of New Jersey's School of Osteopathic Medicine, and Judith Cohen, M.D., and Anthony Mannarino, Ph.D., who are the Medical Director and Director of the Center for Traumatic Stress in Children and Adolescents, Allegheny General Hospital, in Pittsburgh, PA.//
!Key elements:
Here we distil the key elements that distinguish Trauma-focussed work.
!Setting up sessions
Most CBT is about making and carrying out rational plans (see also [[Active Planning]]) - and in trauma-focussed work this planning is particularly important. Trauma-focused work should not be something that a young person and worker 'dip into', but instead it is something that they spend time setting up, so that there are a pre-arranged number of sessions (usually a minimum of 6 - 8) about a week apart.
!1. Psychoeducation
''[[PsychoEducation]]'' is where to start, as it frames what you will be doing, and why. It needs to be pitched at the right level for the young person (and/or carer) to understand. In particular attention needs to be given to explaining the way that AVOIDANCE in PTSD tends to amplify fear, and that in fearful states it is very difficult to think ([[mentalize|Mentalization]], if you like).
Rather as in [[Marking the Task]], it is easy to skip over the preparatory work involved in setting the scene for what will follow once the 'work' gets started - and particularly in this work this is unhelpful.
At least one session will be devoted to this
!2. Managing Stress
This is important, and is achieved using
*[[Rating Scales]] that help to increase the accuracy with which feelings can be communicated and understood, and if necessary directing action to help manage these feelings.
*[[Progressive Muscle Relaxation]] and [[Re-breathing]] are among many other relaxation techniques that can help to give a young person more of a sense of mastery over their own feeling states (knowing that moods come and go, and that I can to some extent alter them at will, is useful knowledge, but also reduces my anxiety in and of itself.)
Some evidence suggests this part of the work is mostly important because //it reassures the young person that their therapist cares// - i.e. because it supports [[Engagement]], rather than being the most important 'change-engine' which is probably the graded exposure (see below).
At least one session will be devoted to this.
!3. Telling the Story
This is really a special version of [[Graded Exposure]] and ''this forms the heart of the therapy''. You can read about this in more detail at [[Graded Exposure]].
This may take 4 or more sessions.
!4. Reworking Beliefs
This is only possible when some [[Mentalization]] has been recovered - i.e. when the levels of anxiety have reduced a bit. Here you are focussing on some of the beliefs about the self (//"I was a coward"//, //"I am a failure"//, //"I can never be safe in the street again"//...) and are using gentle questioning ([[Weighing Pros and Cons]]) and [[Coaching]]. We usually use coaching in relation to how a young person might handle a parent in a given situation, but in this setting it would be how they might handle the appearance of a particular thought in their mind.
To some extent this work is interlaced with the sessions recalling the narrative, and as the narrative work continues it may be found that more time is spent homing in on, and addressing particular beliefs (or "cognitive disortions"). It is important not to rush into this aspect of the work before the anxiety provoked by 'being in the act of remembering' has begun to reduce through the repeated telling of the story.
Allow 2 sessions for this work
!5. Reinforcing Behaviour Change
This is about setting up [[Contingencies]] for the young person, that will support new ways of managing the self addressing some of the more 'outward signs' of the PTSD, such as the avoidance of going out, etc. Other [[Graded Exposure]] programmes may be relevant here, along with a range of other [[Cognitive Behavioural]] techniques.
The key point is that although changes can happen quite quickly (not always!) there is a natural tendency for people to 'slip back' into previous habits, such as AVOIDANCE (which as you will remember is one of the key features of PTSD.) This element of the work is directed at strengthening and sustaining new patterns of behaviour.
This work, again, is increasingly "interlaced" with the earlier stages, and is largely about setting up [[Training Challenge]]s (or 'homework'!) for the young person, preferably supported by carers.
!6. Working with Carers
Although [[Family Work alone has not been shown to be effective for childhood PTSD, there is good reason to focus some energy on ensuring that family members understand the nature of the problem, and the plan for treatment, as family members may be absolutely key players in reinforcing some of the key therapy tasks and 'homework' ([[Training Challenge]]s.)
AMBIT describes itself as a "Treatment" but we are well aware of the fact that it is neither a single therapeutic "modality", nor is it a closely-defined set of procedures that are "done" to patients/clients. We refer to "Clients", too, rather than patients - just because of the wide range of settings in which AMBIT is applied, which include youth and social work, justice settings, etc.
So why a "treatment"? We use the word to remind ourselves that at its heart AMBIT is about how we //treat// each other. It's as simple as that.
Look for events close in time to the [[Presenting Problems]], or to the particular example of [[Substance Use History]] that is causing concern. Consider the mental state of the young person at the time these problems arose, and the mental states of other key protagonists (see [[Mentalization]]). In what ways was what happened a response to external challenges (//"the best response possible, given the available resources"//), relating to the young person's [[Social Ecology]]?
!!Infant-Mother Face-to-Face Interaction: Age and Gender Differences in Coordination and the Occurrence of Miscoordination
Edward Z. Tronick and Jeffery F. Cohn
Child Development Vol. 60, No. 1 (Feb., 1989), pp. 85-92 (8 pages)
!Abstract
To evaluate the extent to which infants and mothers are able to coordinate their behavior, the interactions of 54 mother-infant pairs-18 each at 3, 6, and 9 months of age-were videotaped. Coordination was evaluated with 2 measures: (1) matching-the extent to which mother and infant engage in the same behavior at the same time; and (2) synchrony-the extent to which mother and infant change their behavior with respect to one another. Mother-infant pairs increase their degree of coordination with infant age, but the proportion of time they are coordinated is small. Mother-son pairs spend more time in coordinated states than mother-daughter pairs. The results suggest that interactions be characterized in terms of their movement from coordinated to miscoordinated states rather than only in terms of their degree of coordination. The gender differences are discussed in terms of their importance for the developmental differences in females and males.
{{$:/images/fa5/solid/comments}} ''In your pairs, allocate roles''
* Person A plays the part of client known to them
* Person B plays the part of a worker
1. Both A and B click on the relevant link below for your pairing:
*[[AIM cards room 1|https://playingcards.io/gmwvvn]]
*[[AIM cards room 2|https://playingcards.io/8kss89]]
*[[AIM cards room 3|https://playingcards.io/krtqzm]]
*[[AIM cards room 4|https://playingcards.io/axvmvq]]
*[[AIM cards room 5|https://playingcards.io/cv567a]]
*[[AIM cards room 6|https://playingcards.io/26swyu]]
*[[AIM cards room 7|https://playingcards.io/bfb2xg]]
*[[AIM cards room 8|https://playingcards.io/reav3z]]
*[[AIM cards room 9|https://playingcards.io/rfacwe]]
*[[AIM cards room 10|https://playingcards.io/sk58y2]]
2. Practice using the cards:
* Ask the young person to sort the cards into piles of “strengths”, “challenges” and “not relevant”.
* Explore each pile in turn, to build an understanding of the young person’s perspective of their strengths and any challenges
* Explore with the young person how the challenges fit together or relate to each other
!!Useful links
[[Click here for instructions on how to the use the AIM cards online|Using the online AIM Cards]]
[[How to set up your own AIM cards rooms to use with your clients|Online AIM Cards: how to set up a room to use with your client]]
!Analogy
Risk can be thought of as a three-legged stool, or tripod - if any one leg breaks the whole will fall.
!!!The three 'legs':
#Risks for the client
#Risk for other people
#Risks for the worker
!Risk and Mentalizing - an Assumption:
Risk is highest at those times when [[Mentalization]] fails:
#Mentalization in the client/family
#Mentalization in the worker
#Mentalization in the people (networks) around the client
These are times when non-mentalizing interactions, particularly [[Teleological thinking]] (i.e. 'quick fix'), can easily and quickly erupt - common examples of this are violence and "dramatic" interventions which have not been thought through (these can lead to further unwanted effects - such as absconding and increased vulnerability, direct side effects from medical interventions, or non-coordinated actions by agencies, etc).
!Managing Risk, not Abolishing it
In this field we can never get rid of all risks. Working with impulsive clients, who have limited ability to plan, predict risk, and consider the consequences of actions, is always risky. This is one of the reasons why we stress that some level of anxiety and worry for the key worker is expected within this role. With this in mind, the way in which the keyworker and team are able to manage these experiences, through their connections to colleagues, is essential in order to do this work effectively.
A [[key worker-well connected to the wider team |Keyworker well-connected to wider team]] is more likely to be able to re-gain and sustain their mentalizing and hence to be able to hold a wider and more balanced view about risk.
In managing risk, we suggest that it is helpful to see the process as another form of holding a balance between
* ''CONTAINMENT'' (nurturance, safety, responsivity, sensitive attunement)
and
* ''CHALLENGE'' (promotion of concrete changes, termination of non-mentalized [[Pretend mode]] patterns of behaviour, etc).
The important point is to avoid an overly rigid position, but to maintain a thoughtful ([[Mentalizing]]) journey towards change.
The graph below attempts to highlight this balance. Too much focus containment and attunement to the client without any introduction of new perspectives, differences or challenge might be seen as falling within the 'fan cliub position'. Whilst overly adopting a position of challenge and introducing differences to the client might be experienced as being a 'persecutor'. In working towards changes we would want to find a balance between these two points, acknowledging that at times we might shift towards one point more than another and then need to re-balance.
[img[https://lh3.googleusercontent.com/-KEiI90D-FRI/URIYCmnyUwI/AAAAAAAAGqw/iWWYcAgP-7I/s912/ActivePlanning-RiskManagement.jpg]]
For further material on this, see the dynamic balances involved in [[Active Planning]], and [[The Therapist's Mentalizing Stance]].
*The aim of the current study is to evaluate the effects of mentalization-based team supervision on a German early prevention program (EPP) in a welfare service working with child protection. This will be a non-randomized, open-label, single-arm feasibility study. The EPP staff will be trained according to the mentalization-based team approach (MB-TA) and regularly receive Mentalization based supervision by a trained and experienced child and adolescent psychiatrist.
*The study hypothesizes that the intervention will help professionals to better consider parents’ perspectives and to communicate more effectively with their team members and other institutions for child protection. In turn the study hypothesizes that the parental system will be strengthened and risk of maltreatment reduced.
*This will be evaluated at the end of the follow-up period by comparing the subjects’ burden associated with the care for their child (measured by the Parental Stress Index scores) pre- and postintervention.
* The feasibility of the approach will be investigated based on the acceptance of the intervention by staff members and their subjective feelings about the associated additional workload. This will be evaluated by measuring staff stress levels (using the trier inventory for chronic stress and a burden questionnaire) and staff mentalization in relation to their work (using the AMBIT service evaluation questionnaire).
*The study draws on AMBIT principles including the importance of mentalizing within a team, across networks and directly with clients
*The study was modified to a non-randomized, single-arm feasibility study during covid and when it became apparent that a group comparison study would not be possible due to the number of variable across teams that can influence outcomes and the difficulties in randomizing families in the care system to different interventions. The aims of the feasibility study were adapted and now include evaluating (1) the acceptance of the approach by the EPP staff, (2) the burden of the EPP staff, and (3) the success of the EPP staff to better retain hard-to-reach parents/caregivers in the care program, in addition to measures for the risk of maltreatment by parents.
*Intervention for the EPP staff includes; (1) training of staff to recognize mental disorders and the risk of maltreatment of parents and children and (2) an MB-Team approach developed for work with clients who have multiple needs, which applies to relationships with clients, team members and work across agencies. The training will be supported by regular case conferences and biweekly staff supervision by experienced child and adult psychiatrists/psychotherapists.
*The elements in the supervision will be raising awareness for reasons of problems in relationship building, learning techniques of appreciative, open conversation, recognizing one’s own mentalization difficulties, applying techniques to stabilize and restore one’s own mentalizing, using techniques to promote the mentalization of parents, recognizing relationship breaks, and knowing techniques to actively deal with relationship breaks and repairing them.
* All supervisors will have been trained at the Anna Freud Centre in London and attended the “Mentalization-Based Treatment for Families” course. The supervisors, in turn, will receive ongoing supervision (meta-supervision)
* if feasibility emerges from this study, the MB-TA approach can then be incorporated into future intensive evaluation and, with corresponding proof of effectiveness, sustainably improve the EPP in Germany.
This is a very useful and inspiring book on working with troubled adolescents. Michael Ungar adopts so much of the AMBIT approach implicitly. Without using mentalizing at all, his stance has several key features. Firstly, he considers that the difficult behaviour of his clients makes sense to them, they do it for a reason. One of the reasons he considers is the young person's wish for autonomy, adulthood and excitement, all of which he sees as legitimate and not best seen by adults as just being a "problem". He makes a strong case that this often arises from a context of excessive safety, particularly amongst prosperous and secure North American families who are often puzzled by the self destructive behaviour of their offspring. Secondly, he makes sense of behaviour in terms of an aspiration towards independence and maturity, that young people seek out challenge and that repeatedly he sees the task of adults (parents) to be to find alternatives to the challenges which can be destructive when they involve drugs and crime. Thirdly, he is strongly optimistic in his style of writing and provides many anecdotes to illustrate his thesis.
!Reference:
Michael Ungar, Linda Liebenberg, Peter Dudding, Mary Armstrong, Fons J.R. van de Vijverd (2013) //"Patterns of service use, individual and contextual risk factors, and resilience among adolescents using multiple psychosocial services"// (2013) Child Abuse & Neglect 37 (2013) 150–159
!Abstract:
!!!Background:
Very little research has examined the relationship between resilience, risk, and the service use patterns of adolescents with complex needs who use multiple formal and mandated services such as child welfare, mental health, juvenile justice, and special educational supports. This article reports on a study of 497 adolescents in Atlantic Canada who were known to have used at least 2 of these services in the last 6 months. It was hypothesized that greater service use and satisfaction with services would predict both resilience, and better functional outcomes such as prosocial behavior, school engagement and participation in community.
!!!Methods:
Youth who were known to be multiple service users and who were between the ages of 13 and 21 participated in the study. Participants completed a self-report questionnaire administered individually. Path analysis was used to determine the relationship between risk, service use, resilience, and functional outcomes. MANOVA was then used to determine patterns of service use and service use satisfaction among participants.
!!!Results:
Findings show that there was no significant relationship between service use history and resilience or any of the three functional outcomes. Service use satisfaction, a measure of an adolescent’s perception of the quality of the services received, did however show a strong positive relationship with resilience. Resilience mediates the impact of risk factors on outcomes and is affected positively by the quality, but not the quantity, of the psychosocial services provided to adolescents with complex needs.
!!!Conclusions:
Results show that ''resilience is related to service satisfaction but not the quantity of services used by youth. Coordinated services may not increase resilience or be more effective unless the quality of individual services is experienced by an adolescent receiving intervention as personally empowering and sensitive to his or her needs.''
This will generally require reference to multiple causes that have been working at multiple levels, or in multiple domains to cause these problems.
Consider the [[Family History]], DevelopmentalHistory, PastPsychHistory and PastMedicalHistory - where there may be information that suggests vulnerability to stresses in the present.
!N.B. This applies to England and Wales only
!!!!Other jurisdictions will have their own mental health legislation
[NB - page needs updating - Oct 2014]
The Mental Health Act provides a legal framework for the compulsory detention, assessment and treatment of people with serious mental illness who, by virtue of active mental disorder are not currently able to make informed decisions about their own care and are presenting a significant and imminent risk to themselves or others (see [[Managing Risk]].) In the case of children (technically under the age of 18) it is rare to use the MHA, and it is not uncommon to encounter resistance to its use. There may be issues about how you [[Working with your NETWORKS]] - recruiting the right professionals (Police, Social Services, Psychiatrists) to attend.
!Use of the Mental Health Act (Vs. The Children's Act) for children.
In extreme cases, where it is necessary to admit the patient to hospital and voluntary admission is not achievable, this may require activation of an assessment under the Mental Health Act ([[Local Protocols]] will apply for summoning of the appropriate personnel).
In the under 16 age group (who are clearly still Children under the definition of the //Children's Act//, which also empowers parents with the responsibility to make medical decisions on their behalf) there are sometimes major concerns about which legislative framework to apply (the Mental Health Act or the Children's Act.) Owing to the rarity of such cases, many Approved Social Workers feel inexperienced in making these kinds of judgements.
Under the terms of the Children's Act, young people under the age of 16 can be admitted to hospital (and medicated and restrained) using parental consent alone, though discussion will need to take place with the parents and relevant professionals regarding the potential merits and demerits of such an approach if the child is refusing. Moreover, in general it is not an appropriate use of the Children's Act if //Mental Illness// is a feature.
The Mental Health Act can be applied for //any age//. The Children's Act does //not// in such circumstances provide:
#Statutory services (police or ambulance services) with a 'power to convey' to hospital.
#Any right of appeal for the young person.
#Any statutory obligations for adequate aftercare (as Section 117 of the Mental Health Act does).
Therefore Children's Act, whilst perhaps avoiding the very real risk of stigmatising a young person, is significantly less practical, more authoritarian and less facilitative of ongoing support than the Mental Health Act.
There is also a much greater chance of undermining the long term relationship between the young person and their parent (under whose authority they are admitted and treated) when using the Children's Act, rather than the authority of the professionals involved in applying the Mental Health Act (Section 2, for assessment and treatment, does not legally require the consent of any nearest relative, although good practice would always suggest seeking such consensus.)
If the Mental Health Act is used, the following Sections are generally the most applicable, although Social Workers and Doctors approved under the Mental Health Act will make the decision as to how to apply the Act:
*Section 2 (Assessment and Treatment, up to 28 days) can be applied without parental/nearest relative consent (though it should be sought)
*Section 3 (Treatment - for patients with a known diagnosis) requires the consent of the nearest relative.
*Section 135 (Allows Police to gain entry to a dwelling and transport a person suspected of suffering from a mental illness to a place of safety for the purposes of an assessment under the terms of the Mental Health Act)
*Section 136 (Allows the Police to convey a person found in a public place and suspected of suffering from a mental illness to a place of safety for the purposes of an assessment under the terms of the Mental Health Act.)
N.B. A major revision to the Mental Health Act is currently being debated in the UK Parliament (2006-7)
<<tag-navigation tag:"User Guide">>
!From the 2013 AMBIT conference
... reporting on work in Bexley, South East London:
<html><object width="560" height="315"><param name="movie" value="//www.youtube.com/v/ALvv0yLC68k?version=3&hl=en_GB&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/ALvv0yLC68k?version=3&hl=en_GB&rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
This page collects together pages that describe how to use the AIM questionnaire
See sub-pages for relevant content: <<tag [[Using the manual as a REFERENCE tool (looking stuff up)]]>>
----
The first (but not only) use of the AMBIT manual is for ''looking things up and sharing developing best practice and evidence''. This page gathers information to help you to do that.
The manual also functions as a [[way of recording learning for a team|Using the manual to RECORD learning (manualization)]] and as one way of [[connecting members of the AMBIT Community of Practice|Using the manual to CONNECT with other AMBIT workers]]
!!!Navigating and Finding stuff
You will already understand that [[Navigating the manual (finding what you need)]] is a really ''critical skill to master quickly'' but be reassured that this is ''easy to do!''
!!!Sharing stuff
Once you have mastered finding your way around, you can [[share the content in here|Create shareable weblinks to specific manual page(s)]] very easily (as URL hyperlinks that you can send via email or social media
!!!Quick Glossary
There are of course lots of phrases, words and acronyms that it is easy to assume we all share - here is a <<tag Glossary>> that might help as a quick reference guide
!!!Reminder that this material is Open source and Licensed
The material in this manual is all OpenSource and is released under an [[Creative Commons License|Licensed]] for people to share and adapt, but there are limits (if you plan to use it to make private profit, for instance!)
See Sub-pages: <<tag [[Using the manual to CONNECT with other AMBIT workers]]>>
----
The [[OpenSource]] wiki format of these manuals, allows anyone to look at their content and the multiple teams using AMBIT can build their ''locally-adapted'' manuals (see [[Manualization]]) on top of a shared core of AMBIT content.
This tag collects material that describes the ways thiese wiki manuals can support the AMBIT [[Community of Practice]]
See the sub-topics under this title to get to what you want to understand: <<tag [[Using the manual to RECORD learning (manualization)]]>>
----
* [[Manualization]] covers the ''ideas, rationale and evidence'' for inviting teams to develop a regular habit of what is often referred to as 'reflective practice' or 'theory/practice' sessions, and connects this to [[Mentalization]]
* [[Your Manual]] is about the ''unique LOCAL VERSION of this wiki manual'' that every team trained in AMBIT is provided with, which they can use to learn about AMBIT //but more importantly, to record their own team's// [[LEARNING at work]]: defining their own practice, alongside any AMBIT influences on this or how they have adapted these to their local cultural, service and geographical needs.
* [[How to edit your team's manual]] gives ''the technical instructions/skills (it is EASY... promise!) that are required to create web-based content'' like this page, or upload videos, pictures, etc, etc.
* As a public-facing website, there are some rather obvious but nonetheless important [[Manualization Boundaries]] for anyone creating content to remember. (What a local team uploads, they are responsible for, not the AFNCCF, and we reserve the right to remove material that in any way places the reputation and intentions of the [[AFNCCF]] and the [[AMBIT programme]] at risk.
* This includes the fact that material in these manuals is released under a [[Creative Commons License|Licensed]] in keeping with their [[OpenSource]] nature
* [[Create shareable weblinks to specific manual page(s)]] is to remind us all that Manualizing is ultimately about sharing the fruits of team work, and evidence-gathering, so that best practice can be disseminated as widely and cheaply as possible. Every page in this wiki is in effect an emailable worksheet that you can send to anyone else.
!!{{$:/images/fa5/brands/youtube}} A one minute video on how to use the online cards
<iframe width="560" height="315" src="https://www.youtube.com/embed/z0lPpG7QgyY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!{{$:/images/fa5/solid/tasks}} A step-by-step user's guide to the online AIM Cards
!!!Instructions
1. ''Share the link'' to your personal AIM card room with your client/s. You can access the room in your browser from any device. Multiple people can be in the room on separate devices simultaneously
[img width=600 [aim instructions.jpg]]
2. ''Drag cards to move them around'' the table.
3. ''Click a card to turn it over''. You can drag cards into the ''card holders'' (see image) to group them together
[img width=600 [aim2.jpg]]
4. We have left the labels for the card holders //blank// so that you can add labels that make sense for the client (e.g. "problems" or "things that are going well"). To add labels click the ''briefcase icon to enter edit mode'' then click on the card holder you wish to label, enter your text and then click the briefcase again to exit edit mode.
[img width=600 [aim instructions2.jpg]]
<a class="tc-float-right">[img width="150" [VB.PNG]]</a>
!!!AMBIT Trainer
Verity is an AMBIT Trainer based in Cambridge, England.
<div style="clear:both;line-height:0px;"></div>
!3 videos for you:
!Liz Cracknell talks about Team Working in AMBIT
Starts with discussion of "Team around the Child", and ten moves on to Thinking Together at 8:55.
<html><iframe width="640" height="360" src="//www.youtube.com/embed/0e_kGvCtOEw" frameborder="0" allowfullscreen></iframe></html>
!!!A 9 minute talk by Peter Fuggle
<html><object width="425" height="344"><param name="movie" value="https://youtube.com/v/1RguBQkBPa0?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/1RguBQkBPa0?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
!8 min narrated slideshow on Thinking Together:
By Dickon Bevington
<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/NaQ5ALsPR_Y?hl=en_GB&version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/NaQ5ALsPR_Y?hl=en_GB&version=3&rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
''Dis-integration'' is a core concept for AMBIT, and [[Addressing Dis-integration]] is one of the [[Core Features of AMBIT]].
This is an early video of [[Peter Fuggle]] explaining Dis-integration:
<html><object width="425" height="344"><param name="movie" value="https://youtube.com/v/HSeq3ggkR_E?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://youtube.com/v/HSeq3ggkR_E?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>
Streaming video in this AMBIT manual is all of clinicians and trainees who are role-playing, and who have bravely given their permission for this material to be made available. The [[Authors]] are extremely grateful to all who have agreed to this, and remain keen to extend the use of video clips to illustrate particularly effective techniques.
!!See Video Content
Click the <<tag [[Videos]]>> to see pages which contain video content.
!!Add new video content
See [[How to embed a video]] to learn how to embed videos from youtube. Additionally, adding images and documents are very easy, and we would encourage local teams to try this out!
!!Apologia:
Role-playing is almost always awkward, but it is an extremely potent method of learning and sharing best practice. AMBIT trainings involve a lot of role playing, and we recognise that it is //play//! So the clips in this manual are not intended as 'showcases', and do not claim superiority at all, but rather are offered as 'broad brushstroke' guides to techniques that are perhaps easier played out in the privacy of the therapeutic relationship than under the glare of lights and cameras!
Title of paper. The national wraparound initiative: a community of practice approach to building knowledge in the field of childrens mental health
J.S. Walker, E.J. Conan and C.Laforce
Best Practices in Mental Health Volume 7 No 1 Lyceum books January 2011
This is an interesting and honest paper about the challenges of developing a community based joined up model of intervention following ideas of creating a community of practice. It does not describe wraparound services themselves but the processes of model development. It is a useful mirror for some of the issues that commonly arise in the AMBIT programme.
The authors emphasise the participatory nature of wraparound approaches and the importance of recognising the expertise of community workers as well as families and young people. They affirm the need to move away from clients as receiving services to people who are making sense of their own ideas as to what is helpful for them and their families.
They contrast this approach with the scientific, empirical model of what works and that it sits uncomfortably with the ideas of evidence based practice which tends to position clients as passive recipients of professional expertise.
The paper positions this approach in post modern multi-perspective frameworks but highlights the problem of establishing consensus and authority as to what wraparound services critically entail. They acknowledge that efforts towards consensus building require time and resources which such initiatives often lack, leading to slow progress and at times a sense of frustration for some of those trying to develop this approach.
Some of these themes seem to resonate with our experience in the AMBIT programme.
!!Yes, it should be a bit the same as what you do already and no, we think it adds something to what is usually practiced.
*If your practice didn't include things that you do already, then it would be very strange to us. We do not believe that there is some completely new way of working with very troubled young people that nobody has thought about before. So, to some degree, we are reassured when teams tell us that some of what we do is familiar to them.
*This work involves working in three directions at once, with clients, with colleagues and with the wider network. This is certainly not new but we are not aware of any other framework that addresses these three components of the work in an integrated framework organised by a shared approach to all three directions. Without loosing an important sense of boundaries, it seems to us that how we help our clients through the use of mentalization may also apply to how we help each other and other agencies to do what they are trying to do.
*So we think we do add something to most current practice. But the concept of mentalizing is on the surface a relatively simple idea which everyone can relate to. The idea of making sense of people (and oneself) through a process of mentalizing lies at the heart of most people's therapeutic and welfare practice.
*But the theory of mentalization comes with a lot of added ideas and theory, particularly about the loss of mentalizing and the processes which take place around this, particularly anxiety and high arousal. What comes with putting mentalization at the centre of the work is the acknowledgement that understanding the mental state of oneself and others is much harder than we can often believe and that much of what takes place in our minds is opaque and disguised.
*At the heart of AMBIT and mentalization based treatments in general is a recognition that the mind is a tricky piece of equipment for us all to carry around and that it is capable of both creativity and destructiveness which may be only partially understood by those involved. In our experience, to put this unambiguously and EXPLICITLY at the heart of the work with young people adds something to the work that we do.
!Purpose
Explain the dilemma of an outreach service, when others want the child taken into hospital or social care - suggest ways to manage this
!Theory
It is explicit in this model that referral to the Team is assumed to have arisen at the point at which the existing network is no longer able to provide containment for the symptoms. This means that it is not unusual for families and local networks to feel as though they have held on for as long a possible, and there will often be an assumption that the only possible next step is admission to hospital.
When an outreach assessment and treatment package is offered this can lead to significant divergence of opinion between the Team and the family and network as to what should happen next.
Faced with high levels of anxiety in a patient, the family and the network, who may have all reached the limits of their endurance, the outreach team will often be confronted with strong opinions about how it should act. The strength of these opinions (or projections) can have the effect of narrowing the range of responses that can be thought about, and this is to the detriment of patient care.
It is important for the team to maintain an open stance to the dimension of "actions and intentions", acknowledging the wide spectrum of options that are available:
!At one end:
Admit to Hospital and hand over a problem that can no longer be borne safely, accepting the risks of stigmatisation & negative peer group pressure that may result from this manoeuvre
!At the other end:
Offer intensive Outreach support in the community, working to strengthen the coping capacities of existing networks, and to avoid the risks of stigmatisation and negative peer group pressure.
If these opposite outcomes are represented as two ends of a scale (like the //x-axis// in a graph) they can be set against a different axis (like the //y-axis// in a graph), this time in the realm of the moral/ethical spectrum:
!At one end:
Caring, responsible (this can easily become 'stuck' to the 'Admission' axis.)
!At the other end:
Callous, reckless (this easily gets 'stuck' to the 'Outreach' axis.)
In the heat of the assessment there is a very powerful tendency to collapse these two sets of dimensions onto each other, so that 'Admission' becomes conflated with 'Caring', and 'Community treatment' is conflated with 'Callous and reckless disregard' (or vice versa.) If this were a graph, it would be as though the two axes (//'x' and 'y'//) had ceased to sit at right angles to each other, but had 'scissored' down onto each other, to form just a single scale with these (artificial) conflations at each end. If this is allowed to occur without explicit acknowledgement of the fact that //all parties seek a caring and responsible resolution//, then confrontation and escalation are likely to follow.
The [[Key Worker]]'s job, therefore is to keep these axes prised apart, allowing for the possibility that //either// outcome may represent the caring and responsible manoeuvre, and using her own access to SupervisoryStructures to help her in the task of KeepingYourBearings and arriving at the best evidence-based conclusion for the particular case, following the [[Multi-Domain Assessment]].
See [[Disintegration in networks: respect for local practice and expertise?]] for detailed description of how to use these exercises.
[img[Wearing different hats.jpg]]
[img[Wearing different hats2.jpg]]
See content tagged in the 'show references and info' panel.
!Reflections on implementing AMBIT across a London Borough
A video recording of the chat will be posted here after the event
!!!Speakers:
* James Wheeler - AMBIT trainer, ex Commissioner
* Oliver Sindall - Clinical Psychologist, Wandsworth CAMHS
* Rebecca Smith - AMBIT trainer and Wandsworth
Training doesn't necessarily bring about CHANGE... how do we ensure that the investment in training actually results in change?
See material on [[Implementation Science]] which has influenced the development of AMBIT.
!The work in Wandsworth - James Wheeler (Commissioner)
Wandsworth is a borough in SW London. Mixed population with areas of urban deprivation quite close to affluence. Large population of younger people. James started in Wandsworth as a commissioner in 2013, working in adult substance use services, with a concern about the connection/disconnection of services. How do we work better together, and particularly with young people in transition who are easily lost as they move from Children's to Adult's services.
Got money together for an initial AMBIT training and discussed with the AMBIT training team how to get best value for the money.
6 years ago held a Multi-team [[AMBIT Training]] for c. 35 people from a range of different services: MH, Youth Offending, Substance use services, Social Care with a view to improving the connectivity and collaboration by creating more of a ''"common language"''... with the CLIENT at the centre of the thinking.
* The complications of training/System Change:
** not breaking what is already there!
** There were already some important systems in place, including [[Signs of Safety]] which had been significantly invested in. Some work ([[Broadcasting Intentions]]) to clarify the "fit" that AMBIT could offer - it is about [[Scaffolding existing relationships]], not competing!
!Oliver Sindall
* The value of introducing ideas of how we are not mentalizing (and how that is //common// and //ordinary// in all of us...)
* High levels of anxiety are appropriate in settings where there are high risk. The FIT with [[Signs of Safety]] was really supportive.
* AMBIT is a fully operational approach, ongoing trainings are always full, but it //"Doesn't have a prominent place"// - it tends to be out of sight
* AMBIT implementation requires that the implementation team "Constantly have to keep your hands up"
!Rebecca Smith
* the importance of identifying a team of "key people" who are ready to "Keep their hands up" for implementation
* Organising and Galvanising work is a "forever" task!
* Benefits of a shared language are really apparent (still, 6 years down the line).
!Key learning points
!!1. Convincing the Key Management personnel that this is worth doing
A critical task!
!!2. Be ready for Shocks
A poor Ofsted report just as implementation was starting - this takes a huge amount of "bandwidth" - serious reorganisations, and programmes in place to ensure key targets are hit... inevitably novel ideas/risks are placed on the back burner.
AMBIT tried to respond to this dilemma in a sensitive way
Address the same priorities as senior management have - sensitivity to the fact that there is a disruptive aspect to training
!!3. Be ready to persevere and WORK IN MULTIPLE DOMAINS
This includes addressing things like BUDGET as well as theoretical and 'practice' points
It is critical to "Work with your own AMBIT" as a local team in a larger system... but you also have to address POWER in your system - be able to "talk upstairs."
Have early conversations with the people who can help a team/service manage, track and analyse their data
Be able to address "WHAT I DID AS A RESULT OF AMBIT..." and how this might have changed the outcome for me/my client/the system, etc
!!4. Create a local training offer quickly
* Create a big wave early if you possibly can!
*Find volunteers in Wandsworth who can become local trainers. These workers grew in their own understanding of the model THROUGH THEIR DELIVERY OF TRAINING
** Really worth checking that there is clarity about what they are being invited to do - in some cases people were less clear about what they were being invited into
* ''Selection:'' Identify staff who are already recognised as enthusiastic practitioners and who have already got some training skills - these were prioritised for the second and third waves of training
* GET THEM TRAINING EARLY! Very important to move these people into delivering training themselves SOON AFTER their own training
** in Wandsworth this was supported by a bit of supervision and on-site support from the AFC AMBIT team.
** Staying connected to the AFC team seemed important
** The value in training workers from different teams together
!!5. What happened next?
* Local trainers trained their own teams and then designed a local training offer - shortened to a 2 day training that people can book onto from different teams all over the borough - this is still running and is still fully booked with a waiting list
** Some teams AMBIT is very "explicit", others much less so
* More recently trained whole teams
* Very helpful to have someone embedded in these teams who has AMBIt experience
!!6. Look after your local trainers! Support ADAPTATION!
*Initially offer training in THREES (AMBIT training is always delivered by a minimum of two) to create more support/confidence in the trainers
* As trainers move on, there is a need to think about top-ups from the outside
* Allow local adaptation: initially Wandsworth developed a two day AMBIT training locally, but added a third day to include some of the parts that had got a bit sidelined (especially the "[[LEARNING at work]]" quadrant of the [[AMBIT Wheel]])
* Address the technical problems - archaic I.T. systems that made wiki-manualising hard!
* [[LEARNING at work]] is the hardest quadrant to "justify" and move forwards - adding the third day of the local training has given a bit of space for this.
* Giving people a bit of space for people to "digest" the core material before the third day...
!!7. Things to do better...
* ''Monitoring the implementation'', the outcomes, etc is so easy to lose sight of when everything is happening at pace and in stressful contexts
* E.g. developing the most practical and USABLE ways to monitor practitioner change as well as client outcomes...
* The profile of a working approach in a large system...From "dominance" to "prominence" - addressing anxiety in the wider system if "your" change-work is seen as a threat to others.
* Working groups - the risk that teams dont come to implementation review groups if they feel shame for "not doing enough"
* The AMBIT programme is only rather lately taking more interest in different Local Implementation Stories, and thinking/learning from research and local experiences.
!8. And finally...
Note that the AMBIT programme at AFNCCF has learnt as much from the Wandsworth implementers as they might have from us!
This page was written during the fifth AMBIT Webinar, which took place on the 11th June 2020, during the COVID 19 crisis. The aim of this page is to capture how workers can do online mentalizing and use Active Planning whilst working remotely.
!!Webinar Recording
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/4Kx8C9eWJUE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!What we are covering
*[[Mentalizing]] is at the heart of AMBIT, it encourages us to be curious to find out about what is going on for others. We know that it can often switch off when we need it, when we are stressed and anxious about our work. Can be used with clients but AMBIT acknowledges that it is also crucial between team members and the networks around the clients.
* ''Helping networks'' - we don't create them we join them
* ''Team is there for support'' - asking yourself what do I need to get me back in balance?
* ''When too many agencies and workers are involved'' - being aware of the differences and chaos between these workers that can replicate the chaotic family lives that yp are experiencing
* [[Active Planning]] - Helps us to try to have a course of action in mind whilst being aware that changes in direction are inevitable. Knocks can be felt, there might be chaos and life events may attempt to derail the work, but it is also important to be mindful that a lack of privileged may mean that for some their options really are limited. In these situations if we are too focused on our intervention we may appear unhelpful!
!!Working Remotely
Working remotely seems to increase accessibility for some and decrease it for others.
*For example, some individuals don't have access to phones or data allowing them to connect to the internet
* Additionally, it seems there can be issues with intimacy and entering a yp's bedroom for example, maybe the only place where they experience respite
* For some YP speaking with workers over the phone or via video calling allows them to say more than they would have previously. For some face to face interactions may be overwhelming.
It seems that at this time we require more explicit mentalizing - it can be hard to makes sense of whether or not you are making sense to others.
* The video of yourself that you see makes it a very different experience almost the same as the client having a mirror on their shoulder, you are able to see what you look like to them - mentalizing here is key - you are able to gain an insight into //"what do I look like to you?"//
!!Active Planning
The is the process of making and enacting purposeful plans with clients, what we know is that going into this kind of work with no plan at all is not helpful. A way of creating a plan that you are both aiming towards.
* When it feels like stuff is being 'done' to clients this can feel completely unhelpful, so we are aiming for a joint understanding between worker and client as to where we want to get to.
Broadcasting intentions - it is easy to feel confident in your own intentions but lose sight of clients ability to mentalize and understand you - this is where you can check, am I sharing my intentions clearly does the client understand my intentions (mis communication is easy done). Losing sight of the clients understanding of you can make us blind or partially sighted - so you as the worker has to put it all out on the table
* Think of active planning like a 'Vector' (//'a quantity having direction as well as magnitude, especially as determining the position of one point in space relative to another.'//). Where are pointing towards? will this change based on your feedback? We are trying to help clients to see what is in our minds and if they don't believe you then there is something to talk about; they have thought about what is in your mind, this is a relationship.
* YP needs to have an experience of feeling viscerally understood - door opens in our minds creating learning curiosity
** We have to be conscious of where they want to go - so with active planning we are adapting and co-creating a plan together
**We have to be honest about what we are thinking comes next, and importantly the point is why... why do we want to get there...
!! Ros Law - Clinical Psychologist at the AFC
Interpersonal Psychotherapy (IPT) - with children, YP & Parents with Depression
Key observations from moving online from conversations with parents, yp and colleagues:
* Imagining a yp's journey into help if they have not met me ever before and we are trying to form a relationship
** Usually they would have been coming into the building in which we work. In the Centre we have a big picture board with clinicians photos, I often see families looking at them and think that they might interested in who we are and what minds are going to be looking at their understanding of the world. They also get an idea of race, gender and age and from this might be felt wondering whether these people will get me.
*Speaking with a young champion at the Centre about the role of supervision, they said oh well your supervisor is my supervisor too when you speak to them about me.
* When I first met a yp online I found myself taking so much more time talking about what I can see and what they can see. We spend time working out how to see each other, what is best, what is most considerate to each other and how do we help each other to keep seeing and helping each other
*There is a lot of checking in as to whether they are in a safe space, checking with them where is the best space? is it better to be walking in a park with strangers who might hear rather than parents who are in the next room. So we are always considering other minds and the impact these might have on what we share.
* We discuss practical issues: What happens if I disappear, if my video goes down because of internet connection etc
** What happens when a Video stalls; you are wondering are they frozen or just being thoughtful - you have to ask, enquire and share. This is an opportunity to expand and attempt to MZ
* In IPT we use graphs and questionnaires and now this has to be done online
** We have a Thermometer which indicates to the best and worst points of your week
** Co creating these images - creating an impression together involves mentalizing, they do one and I do one and we can discuss and share the differences and similarities.
** We use a Symptom wall - doing it online we can actually be more creative and go beyond the questionnaire - what are the strengths and positives in their lives, we can use colour to change and visualise problems and helpfully we can easily revisit these as we go.
**The Interpersonal inventory - initially I had a lot of questions from supervisee's about difficulties converting PDF's to word, but these can be easily recreated they are simple diagrams; this process actually reminds us of intention of the inventory - invitation to people in life who might have been wiped out because of their experience of depression - what that map looks like in their mind. In training I take the pen out of the therapists hand and into the roleplaying YP's - it is not about being able to write on their behalf it is much more revealing for them to do this themselves, they have to remember and think, we are witness to the participants active remembering - not being in control adds shades and dimensions to the work
* Again, co-creating relationship diagrams for example invites discussion through comparisons and similarities - is my version the same, what do we need to change based on what I didn't hear or imagine? This forces you into ''not'' knowing more increasing mentalizing
*The unintentional aspects of working this way have also been fascinating - there was one yp who was incredibly sensitive to actually being seen on the video and during one session where the light was different, they were trying to move around the room and said it was because the light meant that I could see their spots; they were able to cover the picture of themselves on the screen and pretend I couldn't see them. This isn't something I would have anticipated.
*Intimacy - I wouldn't in normal circumstance see their bedrooms, and for example ever see a collage of friends photos on their bedroom wall and that's how they hold them in mind. Same for art work that they have talked about and can now show me and I can share that maybe that is not what i was imagining in my mind before. Nice opportunities to bring mentalizing in.
** I would usually sit beside YP rather than face to face so working out where to look at the camera has taken some time, do I appear to look at you but I am not looking at your or I look at you on the screen but it doesn't look like I am.
There are positives and negatives to being online, screen sharing - visual tracking and creating in the moment is still a reality. Seeing yourself being seen can be agonising but we have to do it and there is additional power to be considered in being able to control the screen.
!!Rebecca Smith - Local Authority Worker & AMBIT trainer
Some similarities and differences to Ros. The work is outreach which is quite different to Ros' approach, but some things we have been doing include:
*As a team we thought about lockdown as not being able to go out and see them and I think there is a perception that this is quite an informal way of working, but we have really had to adapt our way of working.
*We had all these great ideas about calls being more structured than previously
* Some of the difficulties we faced though were with people that we would say we have a relationship with would not answer video calls but would call us back on a normal call - we as a team tried to make sense of this
** We thought the video element might be too overwhelming - these were YP and young adults who were a bit suspicious of us.
**It was unfamiliar and we had to help them make sense of why we thought it was important
*We realised that it was more important to be consistent with the time and date of calls so that clients expected it.
* One colleague would send cards to those who don't want to engage in this way to let them know what we are keeping them in mind
We definitely used our team to stay connected, we felt we had to be brave and work with the clients where ever they might be and where Resistance might come from; not expecting calls, being in their home
*We had to be flexible, brave and creative
The other thing is that Attunement here is key - how do we make sense of where yp are at if we can't see them
* There was an experience of a Family meeting which we did via video; previously older members of the family could not make the sessions but via call everyone was able to attend. I wasn't sure how it had actually been experienced by the family, but the feedback was really good. So it can be hard to make sense of people via call but it can also increase peoples availability and ability to show up!
!!Reflections
Some reflections from the session:
*Seems like we have permission to go a bit slower -
taking time to work things out together, taking more time to think about what help would look like if it is helpful
* Early on considerations of practical issues - how do we do this, setting up foundations for becoming a team together and how do we form a relationship. We wouldn't necessarily have to speak about these things in face to face work
*Weirdly relaxing we are in this together we have to feel our way through.
This page was written during the third AMBIT Webinar, which took place on the 14th May 2020, during the COVID 19 crisis.
The aim of this page is to capture how teams can and have been adapting to the current situation and maintaining connections to Networks, remotely.
!! Introduction to AMBIT Approach to Networks
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/IaGY-LfAe2U" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[[Working with networks|Working with your NETWORKS]] we acknowledge that:
* Clients can attract the attention of many helpers
** All of these workers (helpers) have their own minds - they may have different ideas about (a) what the problem is (b) what should be done, and (c) who's responsible for addressing these things problems
* Clients are therefore on the receiving end of many different offers of help
* These are often clients who make us feel worried and anxious - if we ignore these feelings, clients may not feel helped and workers not sure what to do.
These issues moves us further away from being helpful to the client.
AMBIT helps navigate some of these challenges and aims to highlight that workers in these role can come to feel emotionally isolated which in turn effects our ability to sustain meaningful help for those who need it.
!!Discussion with Charlie & Scotty
''How have you been continuing to work with Networks at this time?''
* We have been working remotely using Microsoft Teams
* Following each referral we have post consultation - a network meeting about each referral.
** We use MS Teams meetings to discuss the referral with everyone in the network there.
** I take responsibility for [[working in multiple domains|Working in multiple domains]] - balancing the understanding the needs of the client with the thoughts and wishes of the professional involved.
* We work in Social care with many different YP - Looked After Children, Special Guardianship Order, Child in Need
**Remote platforms have been working for the networks, using teams means that we are still able to connect and bring the work together - we are actually able to bring in more people than before, those who could not have previously been present e.g. Teachers & nurses - this add a new dimension to the situation
* It has been interesting keeping the influences of AMBIT in mind at this time
** It has been particularly hard on professionals for different reasons
** I have been providing consultation to referrers, where we look at the referral and try to understand what is going on in the mind of the //referrer// and the network around the client being referred
** During the consultation I try to mentalize them the referrer and in turn they have to mentalize the child/young person or family being referred.
** This has encouraged us to think more curiously about referrals.
''Things that are going well:''
* It has been more possible to link up as a network as the ''previous constraints'' of getting there physically which prevented some people before are gone.
*Consultations - we had started to offer these before the crisis but it wasn't long before.
* Using the ''language'' that I have adopted from AMBIT has worked well
** For example, when a referrer present lots of different problems that the individual is facing but they are unable to say what it is that they want help with.
** During the consultation I use language like:
***//'what is the help that is needed here'//
***//'we have 15 minutes - what would you like to get out of this in 15 minutes?//'
***//'what could they be thinking'//
***//'what is the workers anxiety' and 'what is the families...'//
**The feedback from workers is that they find the space to think about the referrals really helpful - sometimes when we are anxious as workers we make lots of referrals - but its is important to actually think about what is going to be the most useful for this family and is going to be the best use of help available.
* Meetings can be much faster than before
* Meetings that would have required travel can be done remotely
* Amount of meetings can increase - however this is a double edge sword as it helpful to the service but a strain on the mind
* Number of professionals attending has been incredible
* We work in twos to help address disintegration - see what we both make of the situation, one person might see things differently from the other - One example, is if one of us is taking responsibility for chairing the other might notice something that the other is unable to pick up on.
** It is really difficult to hold on to your ability to mentalize all the time
**Network meetings - can be stressful regardless of whether they are online and offline
''Challenges for you and/or the clients at this time?''
* Example: A situation where the client was 'almost under the bank of the river' everyone in the network was trying to make things happen but the client wasn't involved in the process - bringing the client on board wasn't on difficult but working with the network was more challenging.
** It is easy to forget to ask 'what does the client think his/her needs are' - it became apparent that the network had ideas in their own minds that were different to what the client had in their mind - From speaking with them I was able to inform the network
** Trying to balance getting the network to work more smoothly with keeping in mind whether the client is getting the support that is right for them - holding these both in mind is what we are trying to do.
''In the previous webinars people have raised the issue of clients not having access to technology or not finding this way of connecting helpful - Have you had any experiences with clients in these situations?''
* A lot of my work is focused on the network - technology poverty hasn't been an issue
* In the beginning I think kids found it interesting to be able to do this online - how much more familiar they were with it than us, they were more comfortable than us - engagement went up
* But... in the last couple of weeks we have had situations where a client will say "can you call me back tomorrow?" and we have to be clear about the boundaries it has to be today or next weeks 'session'.
** We have been getting the feeling that phone calls feel like friendly calls that are optional - checking in though is still a positive and it helps that we are able to recognise that it is hard to maintain this way of working
* The other thing is that we have to be aware that they are getting calls from others in the network. We had an example of a family where the kids went to 2 different schools, they have CIN plans so get two calls a week from each school - 4 calls.
**This can be an adverse experience for families - so its our responsibility to think right could they answer 1 call a weeks and the person who made the call inform the rest of the network as to how the contact with the family was.
**Reducing number of calls can be helpful - less overwhelming for families
*There have been times when the Network's anxiety has led to more people being brought into the network
** One example is of a client who wasn't taking calls, wasn't engaging. It occurred to me that we might in fact be frightening the client off. When I spoke with them they said //"there are too many people, I have to tell my story too many times, I'm not answering my phone to numbers I do not know."//
** So we worked out with the network who had the strongest alliance with the client and could therefore take the lead to help - here are the numbers of those who will contact you so that you know who they are.
!!Additional Questions from Attendees & Discussion
''Do we spend too much time with networks and less with the client?''
*It is a struggle not being in a room with a yp (there is an different energy being in the room) - for example, in situations where there has been a death in the family not being able to comfort them or bring a tea a coffee is removed. It's your relationship that brings the connection so this is really a struggle for some yp and the workers too.
''Socially distanced contacts - have you done this or heard of others doing it?''
*Not personally - but have spoken to some community based workers and they are going out meeting people - for a lot of YP it is really difficult to stay home and they have no option but to go out (so there is still some work going on outside of the community)
* Workers have really wanted to - some of them are NHS and they have not been allowed to, their governance is dictating this. It seems to be the same with social care - only high risk children or those in vulnerable placements would be seen.
*It has been really hard for the workers not to see them.
*Sometimes you just want to know what someone looks like rather than just hearing their voice. Feels like this is part of [[Epistemic Trust]] they can see who I am what I am like.
''Have you had any experiences of better mentalizing seeing people remotely?''
*Some interactions where mentalizing has gone totally offline
* Others where I have noticed myself mentalizing a client has encourage them to mentalize their child
* So much more aware of how easy it might be to get it wrong - An example was when I was speaking with a YP about something really important and I couldn't quite get how they were feeling about it so I said //" tell me which emoji would it be"// and this was different to what I thought so it is easy to see how difficult it can be to get it right.
* You are left feeling really curious when they are quiet or looking away ... what are they thinking about - in these circumstances it feels so important not to pretend to get it but being honest that it is really hard to understand because I can't see you. Something to do with the medium that doesn't help with this.
!!Take Away Points
Previously our focus on networks was around trying to improve co-ordination but the focus now has changed and it is apparent that there are real disadvantages to having too many people involved and some issues are partly to do with how many people are around them. The expectation that a family will engage with so many services is unrealistic - how can we establish trust or where trust lies - there is a real advantage in reducing the number of people that are phoning someone. Being able to recognise the numbers that come up makes the world becomes a bit more predictable to them.
* Canadian research- less helpers did better - //To be added//
It seems important to think about how we nurture trust and whether/ how much can we do this over a screen.
Presence and trust is massively interesting because it is //possible//. It is interesting what can be done through this medium.
It may be that the rule is that clients may be less agitated and aroused by communicating via social media. They may be able to think more than when they are present with us.
It seems worth considering:
* What enables a yp to feel comfortable and safe in the interaction with a helper.
* Remote working as a 'Vehicle' to helping which adds another option for those who do not like being present in the flesh; and we can consider this going forward. It is also beneficial for long distance involvement providing options in some cases but not replacement in others.
* Sometimes we even match people to their size - these types of things cannot be replaced
* Team around the worker - its your role to support and introduce other people through teams - this wouldn't have been considered before - but now this is an option and people can give their preference!
''This page was written during the eighth AMBIT Webinar, during the COVID 19 crisis.''
The focus of this webinar is on using AMBIT in a youth and community setting, with a focus on [[mentalizing|Mentalization]] and [[epistemic trust|Epistemic Trust]].
The webinar was hosted by James Wheeler, AMBIT Lead Trainer and Specialist Project Worker.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/y8j8WAHrUQ0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
''Our guest was Andre Kpodonu, who has worked for several years as a Youth Work Manager in a London-based community organisation.''
Below is a recording of the AMBIT webinar:
!!! 1) What does AMBIT in a Youth & Community setting look like? Who trusts who?
As a starting point, James Wheeler introduced mentalizing and epistemic trust in the context of youth and community settings.
!!! Overview of AMBIT
At the centre of the AMBIT wheel is mentalizing, Mentalizing applies across all four quadrants.
Today the focus is on the centre of the wheel, specifically [[working with clients|Overview: Working with your CLIENT]].
With working with clients, we pay attention to balancing
* [[Managing risk|Managing Risk]] – young people often come into contact with us and are engaged in risky behaviours
With
* [[Scaffolding relationships|Scaffolding existing relationships]] – young people also typically have pre-existing relationships (with services and in their personal lives)
Key question in the client quadrant is:
How can we scaffold these relationships whilst managing risk?
!!! Introduction to mentalizing
[[Mentalizing|Mentalization]] – is just something that humans do.
What’s important is to recognise that we are doing this when we are trying to make sense of someone’s mind (our own or someone else’s).
Minds and mental processes drive behaviour.
Minds are opaque.
Mentalizing is affected by stress or heightened emotional states, as well as our developmental experiences which affect our ability and capacity to mentalize and to trust others.
Different types of mentalizing
* Mentalizing someone else
* Mentalizing yourself, e.g., if I mentalize myself during this webinar, I am feeling nervous and thinking about saying what I need to say!
* You can be mentalized by someone else
* You can help other people to mentalize you or other people
Next stage of when mentalizing is going well = epistemic trust.
!!! Epistemic Trust
[[Epistemic trust|Epistemic Trust]] is about learning social knowledge - our ability to receive and learn social knowledge.
//"The greatest benefit from a therapeutic relationship comes from generalizing epistemic trust beyond therapy so that the patient can continue to learn and grow from other relationships"// – Fonagy et al., 2017
We wouldn't limit epistemic trust to therapeutic setting or patient/doctor relationships. It is important within any relationship that aims to be helpful in some way.
You are likely to feel like you can learn or pay attention to somebody if you feel ‘got’ by them, that they're trying to mentalize your experience.
The door to learning is closed when you have experiences where nobody understands them or 'gets' what it’s like to be them, where people don't 'get' their emotional state or even recognise that they don’t know what it’s like to be that person (recognise the limitations of their mentalizing).
The way someone is acting and talking shows the person being helped that they are curious about them and they are trying to get what it’s like to be them – which builds trust. The person can recognise themselves in the other person’s view and feel understood.
* ''An example'': as a young person with dyslexia, the one teacher who recognised this had an impact on me, and is someone I haven't forgotten. Feeling ‘got’ is a very powerful experience.
Because of this working relationship, the person who is helped feels they might be able to trust others in their life. The goal of the helper is that you want to help the young person become able to both accept help from you and from others.
''Epistemic trust ''– describes a state in which the person who is the learner holds a sense of trust that what is being offered by the teacher has social value to them, i.e. a sense of trust that this information is meaningful and relevant for me. This idea of “it’s relevant to me” is really important.
Where there is epistemic mistrust – often in the case of young people we work with – this is also really important, lots of problems arise from this.
!!! 2) Reflections from working within a youth community organisation
We heard from Andre Kpodonu, who worked in a London-based voluntary sector organisation as a youth work manager for 8 years, and his experience of implementing AMBIT in that setting.
''Context''
* The community organisation had fifty years’ experience working in the area, delivering services to people of different ages
* Idea of ‘services’ was held rather loosely – working within a community model rather than service provider/service user model
* The work was not linear and relationships tended not to be time-bound
* People came in and out of the organisation – sometimes present and sometimes absent – dropping in over time
* People often came in and said “it felt like it was a good time to pop in” – not necessarily asking for help explicitly
* Diverse group of practitioners, which is important for the trust that can be built with marginalised young people
* Focus has been on trying to invest in the collective agency and effectiveness of the community
*As far as possible, trying to build trust within community, between young people and others in the community and with other stakeholders
''Reflections on his experience of mentalizing with young people and with staff''
''Staff ''
* With staff, the context presents a lot of opportunities to underscore importance of mentalization. Often you walk in with a clear plan for your working day, and then stuff happens quickly and the plan gets abandoned. There's lots of needs and anxieties, tensions and conflicts within the working environment.
* As a manager, my role was to be a support mechanism to make sure the work was happening and young people were being supported
* AMBIT approach could fit into this environment
* Certain things would commonly come up and cause stress and anxiety for staff. We used mentalizing as a tool to help separate out the anxieties staff are holding for young people and for themselves.
''Young people''
* With young people, some of the same experience is mirrored, e.g., young people coming in with an urgent need and plans needing to be adjusted or abandoned
* Sometimes, the important work was the small chats in the wings of an activity – where you can explore what’s happening for that young person in that situation or in their lives to help understand what’s affecting their engagement
* Important to be explicit about anxiety that staff and young people might be feeling
''Parallel Anxieties and The Implications of Power''
* It's often easy for staff to think of the chaos around young people with multiple needs
* Yet, institutional settings are often chaotic as well – short funding cycles, changes of policy, sometimes poor implementation, staff turnover, all sorts of competing influences into institutional life - lots of anxiety played out there
* For young people who struggle to trust people in power, this can be difficult to experience and can create mistrust
* Being able to address and name these in staff is helpful for building trust
* Reflective practice as important within the organisation - workers are part of the service, too
* Need to be thinking about power, who holds it and how it’s being used
* Important to interrogate staff’s intentions and bring these to light – otherwise can’t build that trust with young people
* Young people often ask us why aren’t we doing x, y, z – and we need to ask the question "if that’s our desired intention, why //aren’t //we doing x, y, z?"
* We need to be able to move ourselves out of [[pretend mode|Pretend mode]] – and addressing racism and issues of power is so important for epistemic trust
* Within my work, I have noticed that problems of social exclusion (e.g., people being marginalised and not given fair recourse to resources) are often passive. A lot of it can be quite subtle and about inaction.
* ''Example:'' Thinking about managing risk – staff anxieties can get confused and muddled with risk management and they are not necessarily the same things, e.g., anxiety might be rooted in being unfamiliar with someone’s context rather than represent the actual risk presented. It's really important to be able to hold this and unpick this to build trust with young people.
* What can happen if we don’t do this work, is that exclusion (subtle inaction) can take place, e.g., we don't follow up on a referral because we feel uncertain or threatened or lacking to manage it. This subtle inaction can drive people further to the margins
* We try to chip away at that passive marginalisation, and in the process of doing it, we can build trust
* In eight years, we haven’t excluded anyone from our service – which is a marker of this work we try to do to keep the doors open
* This organisational behaviour can build trust – when we can see the minds behind the actions as a team, and we don’t give up on the young people and don’t further marginalise them
* This doesn't ignore risk - there is difficult behaviour to manage
* ''Example:'' Some goods within the organisation went missing and it was discovered that a young person took them to sell them and get out of trouble.
** We talked about it afterwards with the young person, taking a three-pronged approach to conversation
*** 1) What action you could take to make this up to staff? As the action had real consequences for the staff
*** 2) What were the conditions led up to the behaviour? Being curious and taking time to mentalize with the young person
***3) What needs to change for this to no longer be the risk? Developing a good understanding together and establishing what else needs to be done to help the young person and address the risk
** The 1-1 relationship with the young person continued, but the pattern of engagement changed as a result of this work
** The lesson being that you as staff can handle things like this, you can address these situations and build trust with the young person. We can hold the risk, we don’t have to let people drift away.
* The work is relational and longitudinal – you build trust over time
* Internationally, we are being struck out of pretend mode at the present time, as racism is being acknowledged and discussed, even though for many of these young people, it's part of their lived reality daily. In terms of epistemic trust, there's something really important about the signals your organisation is sending out about the world and how your organisation conceptualises what’s wrong in the world. This is important to think about and tough to think about. Ask yourself and your organisation:
** How does your service acknowledge the lived experience of the people they are working with?
** Are you in pretend mode about certain things?
* The young people we see will be paying attention to where we are at and whether we 'get' where they are coming from and what they're experiencing
''Extending that epistemic trust to scaffold other relationships''
* Sometimes things can be used to test you as an organisation or to end the relationship – a protective behaviour that stems from experiences of victimisation. How your team deals with conflict is therefore really important. If as a team you can navigate through conflict, in a way that builds good faith and addresses needs of both parties, you are doing a lot of work to create epistemic trust with the young person
* Need to consider symbolic power – that power is not just embedded in physique or administration, but it’s built into the way we talk, our values and our goals.
** Young people with experiences of marginalisation and oppression may see you as using your symbolic power to delegitimise them and may terminate the relationship to protect themselves
** It's really important for practitioners to mentalize their services to young people. If you do this, you’re helping the young person to mentalize other organisations, to scaffold their understanding of different organisations, and help them understand where they have agency in these relationships and to know what to expect
** I.e., sharing your symbolic power by [[broadcasting intentions|Broadcasting Intentions]]
* Do work to map relationships and their proximity to the young person – helping them to understand that they still have the ability to decide who is close and who is far away and help them to be curious and ask about the purpose of each individual and organisation. Scaffolding the young person to realise that they have agency in their network is important
* For young people, they often experience the complexity of systems, where they have to make sense of a lot of people
* The power and importance using the trust you've built to help the young person to understand what they can do, their agency, what they can influence
* We can also be interested and curious about what might help a young person find different organisations helpful (without demonising other organisations – mentalizing them in their contexts)
''Professional Networks and Disintegration''
* On the practitioner-practitioner level – there are hierarchies of power among organisations of different ilk
* Community organisations might have a power imbalance with statutory organisations, which creates interesting dynamics.
* We tend to find that our community organisation can be a relief valve for other organisations because we offer long-term work and can hold relationships.
* We tend to try and overcome issues with this power hierarchy by building close relationships with other organisations, so that you can advocate for the young person when institutional blockages occur
* Helpful to remember that [[disintegration |Addressing Dis-integration]] is normal and commonplace, and we have developed some adaptive ways of working with this
!!! 3) Conversation
Andre and James Wheeler were joined by Laura Talbot to answer questions and reflect on comments from the audience.
//Within a shorter time frame, can you build these worthwhile relationships?//
* Yes, you can still build trust. A key part of AMBIT is also about looking for where the Epistemic Trust (or potential for it) already exists in a young persons' life and trying to scaffold this too (i.e. build this)
* By putting mentalizing at the centre of what we do, this would increase the chances of building epistemic trust
* Broadcasting your intentions is really valuable way of building trust (i.e., being really clear about what your purpose is) as the chances of having a not-trusting experience is high if we’re not really clear
* With short term work, we can be realistic and choose to do one thing and work with the young person on that agreed thing. Your purpose might be in helping scaffold another relationship with someone else in the network who is better placed to hold this, or you might be the one to hold the trust, so important to be curious about relationships in the young person's life
//How do we avoid interrogation of the young person, when trying to mentalize them?//
* We like to preface questions with an explanation of the intention behind the question. Sometimes they don't have a 'picture' of the mind generating the question. I like to tell the young person that I tend to ask questions, but I never want them to have the impression that they have to come up with an answer. It's a way to try to manage the 'power' issue, and an example of broadcasting intentions. One example, a boy with whom we worked in our organization was talking about the meetings we had with him and his parents, and he called it 'the tribunal of death!'. We have started in this conversation as helpers to express our thoughts and intentions out loud and the quality of the conversations has improved a lot! //(comment from Michael Hollenstein)//
//We are looking at a new model for those YP on edge of care and wanting to put youth work at the centre of this - does anyone have any examples/ideas about this way of working?//
* Youth workers being embedded in local authority contexts as part of teams who support families at risk of breakdown is a familiar model
* E.g., Islington AMASS (Adolescent Multi-Agency Support Service) use the AMBIT model - https://manuals.annafreud.org/ambit-amass/index.html
This page was written during the sixth AMBIT Webinar, which took place on the 25th June 2020, during the COVID 19 crisis. The aim of this page is to capture how AMBIT can be used to influence whole systems change.
!!Webinar Recording
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/50JBceVkJhQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!Notes on AMBIT webinar on 29th June 2020 on whole system change
This seminar invited Michael Daubney and Arun Pillai-Sasidharan from Queensland, Australia to describe their experiences of developing AMBIT orientated services across the State.
Michael has a state wide clinical leadership role and has established 14 outreach teams across the State working with young people (aged 13-18 years) with multiple problems including mental health problems on an outreach basis. Arun has recently been tasked with setting up a campus based provision to complement the outreach teams. Both components of the service have adopted AMBIT as an organising framework for their work within which evidence based interventions for specific diagnostic needs and social difficulties are applied. .
AMBIT provides an overall framework for this state wide service but also allows for local variability of practice based on local service conditions and expertise and local types of needs. The approach is supported by a strong team ethos, reflective practice to support assertive outreach practice. The application of a [[mentalizing stance|Mentalization]], much of which is highly indebted to MBT, focuses on the challenge of how to establish helping relationships which have some capacity to develop[[ epistemic trust|Epistemic Trust]].
The service aims are to increase safety and reduce risk and to enable young people to establish more effective relationships to helping agencies and individuals, A range of AMBIT techniques such as [[Thinking together|Thinking Together]], [[disintegration grids|Dis-integration grid]] are central to the [[active planning|Active Planning]] methods used in supervision. The disintegration grid was seen as particularly helpful in exploring ways of establishing more trusting relationships with service. is crucial to the method of establishing epistemic trust.
The service has been in place for several years and service outcome data has now been collected for over 800 cases.
Arun presented about a more recent development of creating a campus based service for 13-18 years for young people which included close working and shared expertise with education and social care. This service has recently opened but has taken five years to set up. It comprises:-
*1. An in-patient unit
*2. A day programme
*3. A Recovery college,with a training programme. co-designed with young people.
The criteria for access to this range of provision are serious and complex mental health needs and some willingness to engage in process of care. The assumption is that previous experience of help has often not been helpful and the focus is to enable young people to articulate their own understanding of their needs and to focus on functional gains . The creativity of this problem was illustrated by sharing an example of a young person who was supported in their interest in developing skills in bee keeping with certificated skill development in this area of interest.
The whole approach emphasised the flexibility needed to address individual needs and flexibility across systems. AMBIT was seen a s providing a grounded approach which can be adjusted to individual needs and a shared language across different types of need.
The key function that supported this flexibility was the recognition of the importance of team learning.
For the new Unit, was AMBIT part of the total staff team training (including security staff) and was integrated with all other parts of the training of new staff. Fortnightly AMBIT supervision is provided to campus staff.
What are the three key things that you need to consider in how to develop this type of system change.
The first advice was the need to be patient as real systems change takes time.
#You need a service champion and lead.
#You need to create interest and support from the core staff team.
#You need data to assure those in commissioning roles are getting value for money. The importance of central systems is vital here but but needs to be balance with local issues. This is crucial as it allows for fidelity to the model with local variability. A level of local co-construction is critical to avoiding unbalanced top down service initiatives which are likely to create resistance with respect to local priorities and strengths
#Consumer/service partnership are crucial for securing resources and for influencing commissioning decision making.
#The need to build relationships with key agencies such as youth justice service and child protection
#Mentalizing the motivations of referrers who may not have the resources that they need and may be seeing mental health services as having such resources such as a place for the young person to live.
#Keeping close to the principle of recognising areas of influence and areas which are outside of what can be changed.
#maintaining a focus on the importance of the role of epistemic trust critical in relationships between teams. Many difficulties in the whole system can be exacerbated by loss of trust between teams or agencies and preemptive consideration fof these types of problems can be time very well spent.
The AMBIT team at the AFNCCF were hugely appreciative of Micheal and Arun's contribution to this webinar (which was held in the middle of the night for them) and for sharing their impressive work in developing AMBIT influenced services across the state of Queensland.
This page was written during the fourth AMBIT Webinar, which took place on the 28th May 2020, during the COVID 19 crisis. The aim of this page is to capture how teams can and have been adapting to the current situation and learning at work, asking what works about AMBIT?
!!1. The AMBIT Context
Peter Fuggle introduced the [[AMBIT|AMBIT: an overview]] approach:
* AMBIT stemmed from wanting to help young people with multiple problems
** These young people often become focus of interest for lots of agencies (e.g., schools, social work, youth justice, mental health)
** These young people may not see us as very helpful
** ''Key question''- How can we be helpful to young people with multiple problems and multiple helpers?
!!!''AMBIT Wheel''
<center> [img width = 400 [AMBIT wheel 2014_SMALL]] </center>
*Each part of the Wheel is equally important
** Often work with client is main focus
** Equally important to consider [[working with team|Overview: Working with your TEAM]] - we can't do AMBIT on our own
** Young people often present with complex life problems that can defeat the team
** Equally important to consider [[working with the network|Working with your NETWORKS]] - we want to create a helpful system together - easy to say, not easy to achieve
** Key is [[mentalizing|Mentalization]] our own behaviour and behaviour of others
** Fourth element is ''humility'' - we don’t know how best to help young people
** We need to develop our knowledge of what helps young people, based on our experience of working with young people AND research
** Learning is therefore a core part of AMBIT
!!2. Does AMBIT Work?
* What evidence do we have that the AMBIT approach gives effective help to young people?
*Two examples from local studies
* Working with young people at the 'edge of care'
**10 years of outcomes for team working with young people on edge of care
** Team aim was to reduce number of young people coming into care system between 12-16 years of age
** Work aimed to support stability of placement for young people
** Team included education, youth service, mental health and social care working together, offering 12 months of intervention overall with an intensive 6 month intervention period
**Referrals were //for// the social worker, not the young person - the aim was to create a team around social worker to support their work with young person
**Efforts made to alter dynamics of young person being passed across agencies, and promote agencies working together
**Critical to have measures to understand outcomes of young person
**Looked at functioning not at problems, for instance, friendships, schooling, fun, familial relationships
**Desire to provide an experience of help that is not humiliating or shameful, an experience of the social world as beneficial or helpful to young people rather than threatening or frightening
**Placement stabilisation was achieved for 82 per cent of young people
**Also significant changes in functioning for young people and families
** See paper here: https://doi.org/10.1093/bjsw/bcz148
*Does AIM show improvement when AMBIT-influenced teams work with young people?
**[[AIM |AIM]] measure has seven domains of functioning, including social activities, relationships, education/training/employment etc
**Team’s focus on helping young people coping with substance misuse
**In this study, young people improved in all areas measured by the AIM significantly
**YP substance misuse did reduce, consistent with other teams
**Wider benefits witnessed than just the focus of work, with work that focuses on process as much as outcomes
!!3. Discussion about Outcomes
* Peter Fuggle and James Fairbairn discussed outcomes
*How do we evaluate the ideas we have developed, to see if they’re helping young people?
* James introduced the [[AMBIT Study Group|The AMBIT Study Group]]
** AMBIT has been around for 15 years
** People seem to find it really helpful
** Some promising service evaluations have been conducted
** But we need evidence - we can't be sure AMBIT is working for clients
** Do our clients improve? Do they get better?
** [[Study Group|The AMBIT Study Group]] aims to come up with shared understandings of how we assess benefits we see in clients - is there a general benefit from teams employing the AMBIT approach?
** Need to enable AMBIT community to measure client outcomes
** Need robust and simple way to collect outcomes
** [[AIM|AIM]] – as primary outcome measure – as we have a clear steer that client functioning is more valuable than focusing on symptoms
** Difficult to evaluate AMBIT – as by its nature, it is adaptive – teams are invited to adapt and fit to context
** Use of measures can present many challenges for teams
** Need for simple and sensible measures for frontline workers
** Focus has often been on service outcomes, e.g., admissions numbers, number of young people in care
** Observation after an inpatient team trained in AMBIT - in inpatient unit, there were reductions in inpatient referrals and relationship with referrers changed. Team was working with referrer and young people prior to referral. Change seemed to come from the team focusing on their relationship with referrers and young people
!!4. Reflections and Questions from Audience
* Can we make small improvements in multi-professional networks?
** We were joined by Janne Walløe Vilmar and Stefan Lock Jensen from Denmark, who have been measuring outcomes in network meetings
** In Denmark we have 3 AMBIT teams - One team where there is a group of more complex patients as AMBIT patients; One team where the whole team was an AMBIT team; and now we have a clinic with 50 employees - regular public child and adolescent psychiatry. Certain team-members in each team are AMBIT-trained and handle more complex cases. These people are experienced workers in child and adolescent psychiatry and we have named them the mentalizing case managers
** We have developed a questionnaire that tries to measure the quality of network meeting. We call it NET-Aim-q, and it tries to capture the experience of [[TRUST|Epistemic Trust]], COORDINATION AND [[MENTALIZATION|Mentalization]] from meeting that we have just completed
** Mainly we chose to engage ourselves in AMBIT because certain cases - not all - demand more focus and more flexibility and focus on particularly the relationships and dynamics within networks
** We started a clinic where the municipality and the psychiatry were not on speaking terms and the one place they were forced to meet were network meetings around the individual family. These meetings drowned in non-mentalizing and were not helpful for the clients - even though everyone attending wanted to help
** We have seen an improvement in subjective experience from parents and the youngsters in the integration of the team around the case
** We have seen an increase in our own teams ability to mentalize - and we think it is in part because we try to measure this
** So TAKEAWAYS from Denmark - reach out to the networks, take on a role as what we call 'the mentalizing case-manager' (a role as a coordinator that keeps up mentalizing for the whole network)
** Just the fact that we set our own security out on a limb and authentically showed insecurity and curiosity regarding this conflict helped us a lot in meeting each other
** By asking genuinely in meetings what people expected and being curious about intentions, it seemed our meetings improved and people actually started to share their insecurity as well
** It is our belief that it in most cases, it is not possible to help young people if we do not help the people around them to help the young people. If the young person cannot regulate affect himself, he needs someone in his network, and if this somebody cannot regulate his or her own affect, certain dynamics emerge in networks. By introducing a mentalizing caseworker (who is well connected with his or her team and him or her self), this affect can be regulated within the team and enable everyone in it to withstand the role they have in regard to the young person
** The NET-Aim-q can be used to measure the quality of the network meeting, and the network coordination in general. But it is also a process tool, where you can use an app and get instant feedback while doing the meeting thereby starting a process of intervening to provide more coordination. You get instant feedback from e.g., a very silent dad, who did not speak during the meeting but now has a chance of showing his frustration and not leave the meeting as frustrated
** We take a mentalising stance – what’s it like to be a teacher or social worker for this young person?
** We develop a shared understanding of what we are trying to do together as a network
** This way of working is about perspective taking
* Could AMBIT be a way forward to aid consistency of approach for the Social Emotional and Mental Health dimension of Specialist Teaching & Learning Services?
** AMBIT attending to relationship between different problems
** Definitely a role for AMBIT in relationships between school, families and relationships
**[[ Epistemic trust|Epistemic Trust]] – to learn in a relationship, we need specific trust – in AMBIT, we try to locate epistemic trust, where can we foster it
** Many young people have negative experiences of teaching and learning – locating epistemic trust makes sense
** Be curious about who the young person trusts and who they feel might be helpful to them
** Idea is to avoid the unhelpful, do the helpful things
** Person with expertise might not be the person who can help with a particular problem, it might be the person who the young person trusts
** AMBIT is about thinking more widely about who is helpful to young person and how to support that relationship
* What's the feedback from clients, do they recognise the outcomes (if that's the correct term 'improved functioning')?
** Young people do resonate with functioning domains
** When feeding back on the AIM to young people, they sometimes see things as being possible for them that didn’t seem possible before – these achievements can sometimes be missed unless captured on outcomes monitoring
** MASSIVE value to young people of explicit outcomes monitoring
** We use [[AIM Cards|AIM Cards]] with young people, explicitly checking are we doing what you want? Are we heading in the right direction for you? – we use these live in the moment with clients
** Sometimes a conversation with a young person about what I see and what they see, helpful to open up curiosity, [[thinking together|Active Planning]] and mentalising
** Feedback on AIM cards – Young people find them really helpful and effective at opening up conversations about what it’s like to be them without shame and humiliation, helps young person to see our interest in them is curious, thoughtful, caring, benign
* How do teams work with the issue of accountability and duty of care? I.e. if I don’t refer out (to yet another team), I’ll get into trouble etc. So often these decisions are driven by anxiety so how might AMBIT contain this?
** Not straightforward to use outcomes in teams – lots of feelings in teams about them
** Need to think how do we generate curiosity about monitoring outcomes?
** Mentalising together around monitoring outcomes – have teams been able to be curious about this? And how?
** Janne and Stefan's work with networks offers some insight into how explicit monitoring of mentalising in the network can be beneficial
* Have any Health Visitors been trained in this approach, as part of bigger integrated teams?
** The ITSIEY (International Training School for Infants and Early Years) that Anna Freud Centre hosts does trainings for health visitors with a day on AMBIT-influenced practice delivered by Dickon Bevington each year for the last five or so years. It seems to go down well - they work in settings where they can be isolated, and are managing risk and complexity, which are key AMBIT target constituencies
!!5. Take-Away Points and References
* People are welcome to get in touch with the AMBIT team if they are interested in outcomes and outcomes monitoring for their teams
* Ultimately, if what we are doing as teams and networks isn't helping clients, then we need to find other ways of working with them
* Explicit outcomes monitoring conversations with young people can be really helpful in promoting mentalization, building epistemic trust together and drawing attention to what is working to client and worker
* As much about process as it is about outcomes - how we learn as teams about what works for our clients
* Find the earlier AMBIT publications by clicking [[this link|Academic references]]
* Edge of Care Study - https://doi.org/10.1093/bjsw/bcz148
[InternetShortcut]
URL=https://manuals.annafreud.org/ambit-afc/index.html#Webinar%2028%20May%202020%20-%20What%20Works%20about%20AMBIT
This page was written during the second AMBIT Webinar, which took place on the 30th April 2020, during the COVID 19 crisis.
The aim of this page is to capture how teams can and have been adapting to the current situation and connecting with people, remotely.
!! ''1. Meeting people where they are, remotely''
As a starting point, Liz Cracknell introduced [[AMBIT|AMBIT: an overview]] and the AMBIT programme offer to teams to help them create and sustain effective systems of care for people with multiple problems.
She introduced the aim of a fortnightly webinar series which was to promote and enable a [[Community of Practice|Community of Practice]], as people are facing common dilemmas. She invited people to speak about their practice so that we can [[learn at work|LEARNING at work]] together.
Laura Talbot added that the client’s experience (and the staff’s) of connecting with each other is changing. She also noted the changes to how key workers are [[connecting with their teams |Keyworker well-connected to wider team]] and wider networks and how this brings challenges and opportunities.
The pandemic situation is affecting everybody, making it more challenging for us to link up with others, clients, teams, networks.
[img[john-schnobrich-2FPjlAyMQTA-unsplash (1).jpg]]
!! 2. Experiences of adapting to [[working with clients|Working with your CLIENT]] remotely
!!! Dr Owen Muir and Dr Carlene MacMillan of Brooklyn Minds shared some of their experiences - https://www.brooklynminds.com/mbt.html
* Thinking about [[Epistemic Trust|Epistemic Trust]] – core of relationships and working with clients – and what might help cultivate and sustain it online. Using humour to meet young people where they are (e.g., via sharing youtube clips)
* [[Mentalising|Mentalizing]] the client – what’s their experience of being online? Being curious about how they experience it
** They completed a survey of clients’ experiences of tele-psychiatry service
***Some people preferred participating in group online; 72% would consider same format in the future
***Vast majority wanted some face-to-face contact, even if some support was then online/phone
*People shared some concerns around privacy online and on the phone
*Being able to see everyone’s face in gallery view is different to being in a face-to-face group – clients could experience this as more emotionally intense
*It may be easier to misunderstand each other when all we can see is each other’s faces
*However, not being physically present and being able to control what they can see/what they show seems to reduce emotional temperature for some
*People miss the mingling at the end of group sessions
*Some people are disappearing during an online group session
**Some people find gallery view too overwhelming and take breaks during session
**Can affect [[epistemic trust |Epistemic Trust]]within the group, as not sure who is present/absent
**Some may turn off their videos when they find it difficult to stay connected and present
*Connecting with the client
**Sharing short clips to illustrate [[non-mentalising states|Pre-mentalistic stances]] (e.g., youtube videos of MBT) is much easier when sessions are online
**Moving between different activities can be facilitated online – documents, videos, pictures, records of sessions can be accessed and shared quickly
*[[Working with the team|Working with your TEAM]]
**Need to build and sustain trust with each other
**Employing virtual drop ins (“happy hours”) for people to connect with each other – helps to connect new members in and help them feel welcome
**Team is well connected and tech savvy; they have threads on messaging platform to connect, with humour as well. A self-care thread of cats “greeting our new co-workers”
**[[Thinking together|Thinking Together]] with other team members has worked well online
**[[Team around the worker|Team around the Worker]]
***Bringing a colleague into a session for consultation is much easier now – can bring two people’s minds together at once to aid mentalizing
***This has also been useful in supervision, where you can invite a colleague to bring an [[edge of the pond|Ripples in a Pond]] perspective by joining parts of supervision
*[[Learning at work|LEARNING at work]] – adapting practices
**Each digital platform offers its own opportunities to connect with clients
***Zoom as a living document, being iteratively developed and scrutinised as its use grows
***Using the whiteboard function on Zoom to draw formulations with clients, e.g., using the [[Egg and Triangle|The Egg and Triangle]] Technique to aid [[Active Planning|Active Planning]] collaboratively
***Being able to save screenshots or send pictures quickly as records of conversations
**Using the [[AIM cards|AIM Cards]] online as a way to [[attune to clients’ perspectives |Sensitive attunement]]and [[broadcast our intentions|Broadcasting Intentions]] as workers – being able to send screenshots/pictures
*[[Working with networks|Working with your NETWORKS]]
**Being online can have the benefit of enabling more members of the network to attend, therefore enabling access to more perspectives and voices
**[[Disintegration grid |Dis-integration grid]]can be used online, but it can be tricky to ensure every member has space to say something in the meeting
!!3. Learning from teams during this time
Individuals from various teams had questions and learning to share with each other, these were around:
*[[Holding the balance|Holding the Balance]] – teams are experiencing challenges and benefits from new ways of working, e.g., being able to bring someone in from the [[edge of the pond|Ripples in a Pond]] during a session with a client
*[[Connecting with clients|Working with your CLIENT]]
**The client experience of online video calls
***Some young people can experience them as more intrusive, e.g. young people having their bedroom visible in the background
***Others are more used to video and online conversations than the teams are
**Marking endings
***Digital sessions offering not much opportunity for the gentle easing transitions that we don’t notice until they are not there
***Teams are missing not being able to ‘walk to the door’ with people
***Feeling that endings on video calls can be abrupt
***How staff are missing opportunities to connect with clients through small rituals (e.g., offering clients hot chocolate and tea) and containing practices before and after tricky sessions
***During virtual sessions, teams suggest ensuring the client finishes first so that they are not left abruptly
**Teams are developing new ways to connect via video call, using technology (e.g., the ability to share youtube videos and bring humour to calls) or the body (using hand gestures to mark differences, e.g., barriers to one side or the other, thresholds above or below)
**How being online brings much of the implicit work we are doing to the surface, and renders it more explicit, and the need to broadcast our intentions even more explicitly to compensate for the lack of shared space
**Opportunities for clients to share more personal achievements easily, e.g., one family sharing amazing woodwork creations during an online call
**Inequalities - technology poverty - many young people don’t have access to laptops or smart phones
***Some teams are relying on texts and calls when young people don’t have access to laptops or smart phones
***Important to think about funding and pushing back on funding to address inequalities of access
***One team used their organisation’s COVID-19 fund to get clients smart phones
***One team has found many young people and adults have preferred to just phone or text not virtual appointments
***Phone does allow people to walk about and discuss things more privately
***Texting allows crisis intervention at the moment in the crisis
**[[Managing risk|Managing Risk]]
***One team has responded by increasing supervision, team meetings and daily check ins to stay connected with each other (and the wider network)
***Confidentiality – difficulties around having a private place to talk during lockdown
*[[Team around the worker|Team around the Worker]]
**Staff are missing the chats with colleagues in the corridor or on the way to/from appointments – these moments help them process sessions and mentalize themselves and clients
**How staff need ways to [[connect with each other |How do we help each other in this team?]]in order to stay able to connect with clients and mentalise themselves and others – teams are developing small rituals to connect with each other, e.g., virtual social times, daily skype check ins, both scheduled and drop in supports
*[[Working with network|Working with your NETWORKS]]
**Different organisations are using different online platforms to meet – how people are navigating this? One suggestion was that the meeting host determines the platform
**[[Keeping integrated with the network|Taking Responsibility for integration]] as crucial – one team is having active planning meetings using [[Thinking Together|Thinking Together]]
**Challenges for[[ keeping networks integrated|Addressing Dis-integration]] – everyone is so busy. Vulnerable young people who don’t access school places may be even more isolated and hard to reach when teams and schools are physically not present. This can leave teams feeling very anxious, with days without young people answering calls
**Teams are doing risk assessments and safety planning with others in the young people’s network that can be reached
*[[Edge of the pond |Ripples in a Pond]]reflections from Dickon Bevington and Peter Fuggle
**Any constraint is a canvas upon which to mentalise about
**All therapists in Anna Freud Centre now working remotely – some concern about impact of doing this work, remotely
**Working remotely in your own home is not the same as working off site – people may protect themselves with maintaining some separation of personal and professional identities. Important to consider the team worker is as important as the client
**[[Learning at work|LEARNING at work]] - Mentalization Based Treatment is very much about process, and the digital on-offness is another polarity we can potentially use in our work; as some thing to notice and name, mentalize the moment, and then generalize and consider change
**Creativity of the teams in their adaptations to practice is fantastic to see – the webinar has produced a smorgasbord of ideas
This page was written during the ninth AMBIT Webinar, which took place on the 6th August 2020, during the COVID 19 crisis. The aim of this page is to capture our discussion on working with young people with substance use problems.
!!Webinar Recording
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/VtROsgqAroU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!What we are Covering
Introduction to AMBIT
*[[AMBIT: an overview]]
* Young people and now adults too - who do not find help easy to access
*Aim is to encourage a real curiosity how a team can be helpful to a yp, and how others can be helpful too (family, friends, other agencies - who already have a relationship with the yp, who has a trusting relationship with them) - appreciative of the help of others rather than seeing it as solely down to us.
*[[Mentalization |Mentalization]]- making sense of others and your own mental states
* Avoid workers feeling that they are holding a case on their own - AMBIT is a team approach
* Networks - it is rare for only one agency to be involved. It is critical that we try to see and articulate the value of others to the needs of the YP.
*Learning at Work - we don't know //everything //, we make use of research and experiences but there are many aspects of work that cannot be covered, therefore teams need to learn and consolidate the learning of adapting to new changes and experiences
Working with young people with substance use problems
*Consider the impact of substance use difficulties in all aspects of their lives
**Helping with their lives rather than just the substance
* Are there things that have been helpful in the past?
**Instances where you found someone helpful? what did they do? who were they to you?
*What does effective help look like for individual people - this will vary
**Can we learn from what has been helpful in the past to mirror what they find useful - we may have to adapt and change our behaviour
CASUS
*Outcomes from CASUS - showed team were very effective in reducing substance use (as we would hope), but they were also very effective in addressing a whole range of difficulties; anxiety, family relationships, returning to education
*NHS substance misuse service, up to age 18 (sometimes transition help), large geographical locations, transport can be an issue
**Variation of cases - a couple of sessions with psychoeducation to very serious co morbidities
Example case:
Yp, 16 years old, parent with serious mental health problems, sofa surfs on occasion, traumatic events in early life (sexual abuse), Child in Need (CIN) - service involvement. School is difficult, cannabis is the main drug used, youth offending have been involved. Feels independent, looks after younger siblings and does not see others as helpful.
We take referrals; self referrals (friends of friends). Yp has to agree the referral (informally mandated), we might spend time with the youth offending team and ask is there someone that she trusts that she works with, they can tell us youth worker who does help. We can then ask her, we know you might not want to meet with new people but would you meet with youth worker - we can offer youth worker help, it is about helping the youth worker (but not giving her our work) "i met this person, who was really helpful told me things that I didnt know about...".
We need an understanding of the YP, but a real understanding not just a check list. We are trying to build a her eye view.
Rich and wide understanding of the YP. We use the AIM - helps shape our understanding of them. We are interested in all aspects of their live. They get an experience of us actually wanting to know about them, things they are proud of things that people don't always notice about them. The goal isn't always abstinence.
How might we draw in the youth worker?
Balancing the outer sections of the ring.
*Respect for local expertise - respect for their work and trying to be helping to them with their goals
*Whatever we are doing we are trying to build a coherent framework of help for the yp.
*Conveying confidence in other workers influence 'oh she is really helpful'
We don't always pay attention to the detail in our influence on families about others.
Contemplation and pre contemplation - you ahve failed to mentalize me; weed is the only thing i enjoy doing, you dont get me. Pre contemplation; thinking about what they like and dislike about it - mz helps to deconstruct these;
non mentalizing - certainty - psychic equivalence; I need cannabis, Telelogical 'quick fix' - rolling a spliff; quick fix solution to distress, pretend mode; normalising, too many words
Substance use can be exploration - mentalizing in adolescence
Questions:
#What about yp who are selling to fund their own habit?
What we are trying to connect with is distress, and for a yp in this situation the distress may be blanked our where they have nice things and access to money, where they have had adverse experiences it may feel safe to be with the people carrying guns rather than those who come up against them.
Mz is about understanding, help me to understand, it will likely make sense; so tell me things about selling - it is about engaging in their experiences.
Initial motivation is to get more drugs; is not always the reason people stay.
Fundamentally, whatever the person is doing it makes sense to them. There is a hope that they will see the light but for workers, in an effort to make sense of their experience, you don't know whether they will change if it makes sense to them, there can be a worry that you are colluding and whether this is a process of change.
County lines - if this doesn't make sense, but you can try to make sense together. This can be really confusing; how did this happen to me, how did i get here, started off making sense and ends up not making sense anymore (this can happen very quickly).
What does ambit most mean for you: Team Approach - no lone rangers, use of a lot of mobile phones, calling each other using thinking together as a discipline.
Yp who ask for hep with other problems rather than substances - example of child feeling less anxious, didn't talk about weed - the help that he needed was about anxiety than drugs or alcohol.
!!AMBIT in Education Settings
''Dr Dickon Bevington'' was joined this month by ''Catherine Fraser'' and ''Becky..''(add surname) to talk about the application of AMBIT within an education setting.
Catherine has worked for many years as a teacher and over more recent years as the head teacher of a school based within a specialist inpatient and day patient unit for young people with complex mental health problems. Becky has worked within the same Tier 4 unit as a teaching assistant, like Catherine, providing specialist education and support to young people who have often experienced significant difficulties in their 'relationship to education and learning'. They may often have been out of education or face barriers in re-connecting with learning and education.
We heard about [[Mentalization]] and then [[Epistemic Trust]]. Dickon introduced these as key ideas in understanding how young people learn (or struggle to learn) in relationship with others.
''Catherine and Becky have recently begun a new specialist education provision within a mainstream school. They use AMBIT and mentalizing as their guiding model.''
Becky and Catherine explained that at their new school provision, they work with a group of young people who have significant difficulties in managing education, who have often become 'switched off' from learning. Most of the young people in this setting have particular challenges with social communication and interaction. Catherine and Becky described a type of 'relationship to learning' where young people may feel problems are their fault, are highly self critical, or may actively avoid learning.
!!Why AMBIT in this particular education setting?
*Learning is an emotional experience and thoughts feelings around learning can arouse powerful emotions in young people and the staff
*Learning is a relational process so relationship needs to be placed at the centre
*Young people in this provision often don't trust teachers or people in the positions of authority so placing trust and re-building epistemic trust is at the centre
*Young people can easily feel mis- understood
*Trauma impacts on young people's capacity to mentalize, so focussing on how we can help to re-gain mentalizing when it is lost
!!How has AMBIT been used so far?
*Taking a mentalizing stance from the initial contact with young people- thinking about how to position ourselves as teachers in order to reduce anxiety and build trust...what might make it easier for a young person to feel comfortable?
*Planning design of the building- having break out rooms to have quiet private spaces, sensory space, open spaces (and a big room).
*The overall idea has been trying to shift or challenge beliefs about how young people might expect a school to look and feel
*Using planning meetings to design individualised plans around education
*We heard about the value of having a big rather than smaller classrooms, where young people could sit together around a large table in centre and the group process can be used to help each other (this space was designed in relation to past experience of what worked in a Tier 4 unit and young people's feedback)
!!Young People leading their own curriculum
This means helping young people to lead their own curriculum...mentalizing themselves and trying to think about what they need/want from learning rather than being told 'this is what you have to do'...using this as a way of taking ownership of learning rather than being 'done too'
!!Mentalizing ourselves in the classroom
'''Why do I feel like this when I'm with this young person?'''
Becky and Catherine talked about how valuable it has been to structure time and space to explicitly mentalize together (as staff) their responses to the work and relationships with the young people.
* In particular how we feel when we are working with the young people
*Becky talked about the importance of making sense of these feelings in helping think about the most helpful responses to the young people
!!Some outcomes so far....
*It is early days in the new unit however initial signs have been very encouraging.....
*Attendance has been really good (often a good marker of how young people are feeling about the school !)
*Mornings have been easier and the transition in to school has been smooth for young people starting their day
*Relationships with staff and with peers have been very positive and young people and parents' feedback on this has been positive
Thankyou very much Catherine and Becky that was fantastic and really lovely to have your experiences, enthusiasm and expertise shared with us.
This page was written during the first AMBIT Webinar, which took place on the 9th April 2020, during the COVID 19 crisis. The aim of this page is to capture how teams can and have been adapting to the current situation and trying to stay connected as a team.
!!1. AMBIT in a Lockdown
Below is a recording of the AMBIT webinar:
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/10ujY0zETtk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
As a starting point Dickon Bevington provided an overview of:
* [[Mentalizing]]
* [[AMBIT Approach|AMBIT: an overview]]
* [[Thinking Together]] - the four steps were initially designed for online or over the phone working conducted by outreach workers
* Sharing Experiences & Learning
!!2. Learning from Local Teams During this Time
Individuals from various teams had questions for the AMBIT team, these were around:
* ''Trust'' during this time - Managers trusting workers to //work// from home and not doing the washing
** There is also a slight intrusiveness, an insight into colleagues homes through video calling
* ''What do we lose in terms of body language and cues that we get from real life human interactions and as well as closeness to colleagues''
** There are ways to make use of the technology that you are using to help for example looking at camera rather than the faces on your screen. But we have also had to use tone of voice from calls for a long time before this crisis.
** Can we create a team working that feels less intrusive and more collaborative even if it is virtually?
** One team commented that "whilst we are apart it is important to make it clear to the team that we are not alone - daily calls to stay connected with one another"
* How do we manage risk and manage our own feelings as workers when we hear about risky behaviours related to the virus that put others in danger?
** This is something we are also trying to balance in normal practice, this work is anxiety provoking
** It might help that this is a shared experience among everyone
** Some of us may feel more connected during this time of suffering - as we share the worries about the present and the future.
!!3. Adapting to Change at the VIP - https://manuals.annafreud.org/ambit-thevip/
About us...
*West London Based Team
* We focus on the important connection between Shame and Violence
** Prior to covid we would meet YP in trap houses and in custody with a focus of readdressing the power dynamics between these YP and the workers that they may interact with
Before the pandemic...
*Trained in AMBIT as our approach seemed like a really good fit with the model
* AMBIT has helped with creating sustainable relationships with YP, those in the network around a YP and our colleagues
And Now...
*Working from home often with our families around us - this has been a shared experience among colleagues and reminds us that we are all going through similar experiences
*We have a morning team meeting everyday to check in with one another
*There has been a massive influence on virtual contact - lots of YP have access to social media, Skype, Whatsapp
* There have been feelings that we do miss things with eye contact and body language - but we have tried other things
*We have made use of online gaming to connect - online chess, COD (varying games) speaking whilst playing seems to help
* We are really trying to sustain relationships that we have spent so much time developing weeks, months, years
* We are really interested in [[Scaffolding Existing Relationship|Scaffolding existing relationships]] - with a focus on their families
** We asked the YP how we could help these YP and their families during this time
** We set up a mobile food bank, we collected up lots of food and essentials and delivered these to around 15 of our YPs
** It was really successful and we have received some money to continue this
* Important that we don't feel like we are losing relationships
* Risk management - when we receive a cry for help, it is a reflection of our great relationships with these YP - the YP is asking for help
** We have developed a dynamic risk assessment tool to use on a case by case basis
* We are not allowed to meet clients at this time
**When there are difficulties it would be easy to say we are going to 'save' you but we have to look after the team the YP and others
* How do we address capacity for disintegration - we haven't found this so challenging - the first couple of weeks people spent a lot of time trying to get to grips with all this online stuff - great to see the AMBIT team are no different
* We have Whats app groups for workers from different services called 'Core Groups'
** We can communicate on issues that arise - particularly risk management - we communicated on pragmatic tasks
* There's no script for this work during this time
* We are all remote workers anyway and used online working before - so we have had to have remote ways of working already
* But it feels like this time has allowed us to move the organisation forward - the daily meeting assists an ongoing process of refinement
** We use the call to feedback on casework - how is it going, how are //we// doing
* Manualizing on a Wednesday - this has really taken off because these conversations are needed
** The team are really starting to get how useful this is
* We have been able to focus on [[Learning at Work|LEARNING at work]] - we are all doing a Mentalization Based Module every Friday as a team. It is a chance for us to stay connected and embed AMBIT in practice.
*Games and online working- this feels like we are meeting YP where they are, lots of YP were online before this experience so getting onto their level is so important.
**Great to know that YP are not necessarily put out by online way of working
** We have been able to think about 'Respect for evidence' - for example questioning 'what has effective in this piece of work that we are doing on a COD call?'
*** Manualizing is important here, what are we capturing, what are we recording and how are we working out what works and what does not!
And next...
*Really curious about how much of this we are going to maintain when we come out the other side
** Some things may change for the better
---
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/jZaccXrMbjM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
!!!This page was written during the 7th AMBIT webinar.
The focus of this webinar is on what happens after lock down from the COVID-19 pandemic. In particular, how do we move out from this period, what have we learned and what might help?
''Our guests are Michael Hollenstein and Bee Huter from Vorarlberger Kinderdorf, Bregenz, Austria.''
*Bee and Michael are Clinical Psychologists who manage an AMBIT influenced service in Austria which works with around 60 young people who have multiple needs and require residential treatment. The team work closely with education workers and much of the input involves connecting together as small multi-disciplinary teams around the young person.
!!The Context
At the moment we are in the context of the global pandemic and there are still many changes ahead. We are at different stages of moving out of the lock down. This is a bit different for everyone partly because of their own personal and family circumstances as well as where their country or region is at in relation to the pandemic.
Todays webinar fits within the [[Learning at work quadrant |Overview: LEARNING at work]]of AMBIT. We emphasise in AMBIT the importance of teams learning together within their local context, alongside being informed by the evidence that exists. We are at a time when we are working hard to learn about how we can work helpfully and adapt.
This has been a time of huge energy and activity for workers in adapting and finding ways to try to work helpfully and do their job differently..or in ways that are manageable in this context.
So what has this been like for workers?
There have been a great range of experiences.
However, many teams have told us that it has felt increasingly challenging for them.
Teams have told us during this period it has felt like many people are 'in the middle of the pond', that it has been hard to see ways forward at times and that there has been a real sense of difficulty and worry. Also that it has sometimes been harder to mentalize themselves and each other, i.e. to think about 'what this is like for me or for us at the moment.' Some teams have told us that this has been quite a bonding experience, managing these difficulties together and finding ways to cope when 'in the middle of the pond'
!!!Bee and Michael shared some of their experiences and learning during lock down and through moving out of lock down. In Austria the lock down phase has eased ahead of many other parts of the world.
''Bee and Michael linked their experiences to the following areas of AMBIT practice''
!![[Active Planning|Active Planning]]
*This has been a key idea during this period. Bee and Michael talked about the importance of [[Broadcasting intentions|Broadcasting Intentions]] to their team, being clear and explicit about their plans and ideas for moving forward..alongside attuning to the team and feedback from colleagues...this was essential during this transition time.
!![[Holding the Balance|Holding the Balance]]
*There were different balances to hold...for example between being 'stuck in the mud', not being able to move out of lock down, but on the other hand the speed of decisions needed at times when situations were changing quickly
*Holding the balance also between being cautious and consider safety about returning after lock down alongside the need of the team to be back together and to connect again
!![[Thinking Together and the Well-Connected team|Keyworker well-connected to wider team]]
*The team decided to make extra efforts to maintain connections with each other during this period with a focus on checking in on how each other are. The team wanted to continue these rituals as lock down eased, highlighting the value of this
* After the lock down the team made efforts to come back together in a graded step by step way so as not to overwhelm the team. They first asked each person to come back once a week to get the feeling of being back in the team and at base again. Then the next step, for half the team to come back together for distanced case discussions. The 3rd step was to to bring back the whole team in a distanced way- everyone was very happy and wanting to see each other and have contact again at this point.
*Bee named the importance for leaders as actively caring for their colleagues...This felt even more evident during this period- That one key role of a leader is caring for your colleagues. This relates of course to the capacity of the team to then be in the best position to help their clients. But, as leaders, there is a real need to care for others as human beings, above all.
*Bee and Michael talked about the need for support and connections for themselves in order to look after their team. Members of their team said they were concerned about them as leaders. They used the climbing analogy 'who secures the securer in climbing?' they learned that in this context the securer has to secure themselves...but also that they have a buddy system or partner who checks them, checking that they are secure. This was easier for Bee and Michael as they work together as a leadership team.
*Michael reflected that he has noticed in leadership meetings during the pandemic those in management positions had been finding it hard to talk about their experiences and their feelings.. He explained that allowing this to happen has been very important.
* Bee and Michael were able to use each other to think together and stay connected around decisions and planning
!![[Mentalizing as a human quality|Mentalization]]
*After lock down there seemed to be more [[non mentalizing modes|Features of UNsuccessful Mentalizing]] present and the team needed to think actively about how to re generate mentalizing together. Bee and Michael talked about the importance of bringing life and lightness back to the team, having time for fun and enjoyment and bringing liveliness again after such a long period of structure. This has been critical. They suggested to their team that they should all take a day off (the team said they didn't want this) so instead the team went out for pizza and beer together.
* We reflected on creating a mentalizing atmosphere and attunement with clients in the context of wearing masks- Bee said that being able to talk about what this feels like wearing masks (in the moment) i.e. what feelings this brings has been important. This is easier to do in a context where there is already epistemic trust between people in the meeting.
!![[Working with our Clients |Overview: Working with your CLIENT]]
*Don't be afraid of meeting with masks! It is still possible to mentalize and have an emotionally close encounter where there is a focus on the experience of each other and the client.
*The lock down context has been able to promote some helpful 'side effects' for some young people in bringing relationships closer with workers who have needed to have more contact together
*The team have been thinking about the increase in family violence after the lock down. They have been manualizing about this
*''Bee and Michael reflected on the implementation of AMBIT in their service:
We heard about how they had not made AMBIT something which was 'compulsory' in their service but had worked to develop curiosity and interest in a step by step way.''
!!!This was a fantastic and heartfelt presentation with some incredibly helpful ideas and reflections on the process of moving out of lock down. A huge thank you to Bee and Michael !''
!!Community of Practice Webinars
During the Coronavirus pandemic we felt the need to be more connected than ever to the Community of Practice and to those who may be faced with new work challenges during this time.
In an attempt to connect with other workers we have set up regular webinar. The theme for each webinar is chosen by a member of the AMBIT team and we invite guests to join us for discussions on how they are approaching their work during this time.
<a class="tc-float-left">[img width= 300 [Monthly Webinars.jpg]]</a>
The sessions are manualized by a member of the team to capture some of the learning from the session. Additionally, we record the webinar and have been uploading these to [[AMBIT.TV|https://www.youtube.com/channel/UCgbnI4t6m4JlLwMKrH7XOVQ]].
For details on how to sign up please go to our twitter page [[ambitafc|https://twitter.com/afcambit?lang=en]].
This is a technique (also known as "''decisional balance''" but ultimately it is a version of a ''"cognitive challenge"'' that is designed to elicit thinking ([[Mentalizing]]) about a specific ''behaviour'' (eg drug use), or a specific ''cognition'' (eg a belief that the young person is perceived to be clinging to, which the therapist believes may be associated with other symptoms - such as the depressive cognition //"I am useless"//).
!Materials/techniques:
*Paper, pens
* Create a 3 x 3 grid:
| Decisional Balance | PROS | CONS |
| CONTINUING to do X | blah blah blah blah | blahblah blah blah |
| CEASING to do X | blah blah blahblah | blah blahblah blah|
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/id913uT_FME?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!Alternatively
You can use a diagram of a set of weighing scales (this is apposite for young people who may have seen dealers weighing out cannabis)
*one pan for ''PROS''
*one for ''CONS''
Start with the PROS first, not the CONS.
*Avoiding starting with the cons first is an [[Engagement]] technique from [[Motivational Work]]
*Invite the young person to reflect ([[Mentalizing]]) on why they like Cannabis/other drugs, or why they agree/support the cognition in question.
*Only prompt when they get stuck:
//"I am thinking to myself, that there may well be more reasons than that - most people don't do something unless they are getting something back..."//... in the case of drugs this might be:
*Pleasure (never deny the possibility of this)
*Socialising
*Joining techniques? A way to join a group in which the young person is less confident (Cue discussion of [[Social Ecology]])
*"Psychonauts" - exploring the intriguing fact that //"I have this thing called a mind!"//, creativity, etc (Consider the possibility that this is a form of [[Pseudomentalizing]]?)
*Self-medication (a "Smokescreen" to blank out trauma, depression, etc) - see [[Assessment for SUD-Rx]].
*...others
!Move on to CONS
*If there are none, consider the [[Stages of Change]] and [[Adapt your Discourse]] accordingly.
*Be very careful to [[Roll with Resistance]] (a principle from [[Motivational Work]])
*Use [[Normalising]] techniques to suggest //possible// cons that //"other young people have told us about"//:
**Cost (//"We can agree that it could be cheaper!"//)
**Criminal record
**Interference with academic work or employment
**Disruption of family/other relationships (//"...So ''you'' don't have any particular problems with the weed, but when you smoke it your family go ballistic and THAT is a drag for you - have I got that right?"//)
**...others
!Reference:
Weisz, ~Jensen-Doss, Hawley (2006) ~Evidence-Based Youth Psychotherapies Versus Usual Clinical Care. American Psychologist 2006, 671-689.
!About the paper
This is an excellent meta-analysis of studies that compare ~Evidence-Based Treatments (EBT) with "Usual Care". Overall, EBT's provide better outcomes than "Usual Care", but what is great about this paper is that it looks in detail at (a) the fact that the differences are actually quite modest (in other words, usual care is probably getting a lot of things right!) and (b) what might be the reasons for EBT doing better, or for not doing much (or at all) better in some respects.
In ways, AMBIT is constructed as a platform for teams to take a more systematic approach to developing and improving their "Care as Usual" - this is an approach that has been referred to as ''"Treating Usual Care with Care"''
!Links to the text
There is an external link to the paper [[here|http://cfc.uoregon.edu/classes/CPSY_642/Readings/Class%201/Evidence%20based%20youth%20psychotherapies.pdf]]
If you are online you an see it below:
<html><div align="center"><iframe src="http://cfc.uoregon.edu/classes/CPSY_642/Readings/Class%201/Evidence%20based%20youth%20psychotherapies.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
Weisz J.R., Simpson Gray J. (2008) ~Evidence-Based Psychotherapy for Children and Adolescents: Data from the Present and a Model for the Future. Child and Adolescent Mental Health Volume 13, No. 2, 2008, pp. 54–65
<center>[img width=100% [module 3.jpg]]</center>
<center>[img width=100% [mod4.jpg]]</center>
<center>[img width=100% [module 5.jpg]]</center>
<center>[img width=100% [screen.png]]</center>
<center>[img width=100% [law1.jpg]]</center>
<center>[img width=100% [law2.jpg]]</center>
<center>[img width=100% [module 8.jpg]]</center>
Invite all team members, following discussion as guided in [[Local Session 02: What is AMBIT training for?]] to consider and make notes on:
!!!Three things I would like to learn during the AMBIT training:
1.
2.
3.
!!!Three things I would like to //preserve or strengthen// from our __existing__ practices:
1.
2.
3.
!!!!Source: Peter Fuggle
!!!Introduction
AMBIT has been loosely described as a method of working for families and young people who do not make effective use of mainstream services. We prefer not to use the term 'hard to reach'. The descriptions that have been used are often based on pragmatic service definitions such as having multiple needs or having input from multiple agencies at the same time.
In this page, we want to define this group in such a way that we can draw on research literature as to what we know about the likely outcomes for this group without any input from AMBIT. What would happen to this group of clients without input from AMBIT? What do we know about the outcomes for this group in general? If we know something about this, then we may be able to more accurately gauge the benefit offered by introducing the AMBIT approach to a particular groups of clients.
The common approach to evaluating the benefit of a particular approach to identified needs is to ask the question whether this new approach is any better than what happens already. For many promising approaches (e.g. MST), this has proved a challenging test. For AMBIT we consider that this may not be the best comparator as the clients that we are focussing on do not access treatment as usual or mainstream services. In many ways, are ambition could be that the AMBIT approach enables clients to achieve similar results as treatment as usual. Rather than setting the bar as needing to be better, the aim is to enable these clients to do as well as everyone else.
!!!How can we describe the population served by AMBIT teams
The group probably overlaps with the following groups of clients.
#[[Outcomes for clients who drop out of treatment]]
#[[Outcomes for untreated clients]]
#[[Outcomes for clients with multi-agency needs]]
#Outcomes for clients who refuse mental health treatment'
These are likely to be overlapping groups who will not fully map on to the groups of clients served by AMBIT trained teams but they may help us to shape expectations about the likely outcomes from this group. If we know something about the likely baseline outcomes for this group of clients, this will help us to make sense of local evaluations of AMBIT teams.
Introducing the 2014 AMBIT conference. The tools that were begun in the practical session after this talk are in development and will add to the range of tools for measuring "fidelity" to AMBIT.
<html><iframe width="560" height="315" src="//www.youtube.com/embed/Y5dwfo9FM7s?list=PLaZguIPxZjqaudOxA29jJE-ds2eGT3HoV" frameborder="0" allowfullscreen></iframe></html>
See the [[APrAT]] and the [[AMBIT Full Competency Framework]] and the tools that are being originated in the workshop at the end of this talk are in development - proposed release date Autumn 2014.
!A
[[Adaptive]] (in the early days of AMBIT it used to be [[Adolescent|Developmental Considerations]], but teams working across all age groups now use it, and ''Adaptation'' is core the approach)
!M
[[Mentalization]]
!B
Based
!I
[[Integrative|Taking Responsibility for integration]]
!T
[[Treatment|AMBIT-influenced]]
!But
[[We are not JUST directed at Adolescents now...|AMBIT]]
The following ideas about [[LEARNING at work]] were generated by two teams from Hackney during their team training in response to the exercise [[Learning about Team Learning - a discussion exercise]] who generously agreed to share their idea in the core content of the manual.
The team would have: -
!Clear structure
*regular meetings
*multi-disciplinary team
*with agreed ways to implement
*team shared understanding of why
*key core values of remit
*shared resources
*good supervision structures
!Contained and supported staff
*welcoming and accommodating
*be able to explore uncertainty through discussion
*be able to tolerate differences/ appreciation and respect for different disciplines
*reviewing and reflecting on practice
*able to shift positions and adjust thinking and practice
*creative thinking
*sharing knowledge of own profession through presentations
*nurturing students
!Training and working together
*attending training together
*joint working with clients
*internal consultations -its okay!
*team away days to think about training needs
Sorry!
There isn't a word in the the language that exists already which captures the activity that we describe as [[Mentalization]].
There are many [[Mentalizing Quotes]] that might help to capture the idea.
In some ways the //activity of ''making sense'' of behaviour// might be enough - but it is really important that this is applied to self and others, and that this is achieved //by attributing a mind// (a //mentality//) behind the behaviour.
!An anti-stigma statement?
Mentalizing = //"attributing mentality"// to people
''We are all mental'', inasmuch as we all have minds... mental needs to stop being associated with a term of abuse, and use of the word Mentalize might be part of this...
Mentalizing self or others is necessarily intimate. Some workers may find the level of intimacy that a rather "concrete" approach to "doing mentalizing" with their colleagues seems to require rather intrusive.
...But that might actually indicate that their team mate is not mentalizing their situation as accurately as they might.
Of course if their colleague is //accurately// mentalizing them, then they might be able to gather that the reason for their reticence or avoidance is that they are uncomfortable with self disclosure in one or other area, and would respond better to more concrete communications.
There is an emphasis on the need for some [[Work on the Self]], and this is something that [[Formal supervision]] might help to address.
The AIM Cards have been designed specifically for use with clients and young people as an interactive tool to generate important conversations about areas of need. In using the AIM cards, there is no expectation of scoring the cards although a visual representation of how they are sorted may be kept. Ways of using the AIM cards can be seen in [[AIM Cards]]
In contrast the AIM Questionnaire is a measure which provides the practitioner with a way of developing an overview of the needs of the client and it can be scored and recorded. As with the AIM cards this could be done with the client as well or can be done by the practitioner alone on the basis of what they know about the client. The purpose here is to use this in a standard way in order to be able to compare scores over time and also to put scores together so that teams can develop an overview of the needs of the clients that they see. So scoring has a much higher importance in using the AIM Questionnaire compared with the AIM cards.
[IMG[https://lh5.googleusercontent.com/-onhZyJm5DpU/UcwJ8n3mqcI/AAAAAAAAAGo/awbCKADKXwk/s576/blank%2520ambit%2520wheel.jpg]]
* Family members are invited to describe what they think they share with other members of the family and what //differentiates// them from other members of the family.
* Each person is invited (in turn) to consider //how such distinguishing characteristics developed over time//
** in their life
** in the lives of other family members
* Other family members are invited to comment on each others' perceptions of themselves.
Thanks to Jon Allen
All outcome measures can be used different purposes.
The AIM is a very good example of this. It can be used for having a structured conversation with a young person about her needs and how she rates different aspects of her life experience.
Workers can then use their AIM scores in maintaining an [[Active Planning Stance|Active Planning]] with their client. For example, through broadcasting their perspectives on the issues (in relation to the AIM scores). This might allow some contrasting with the clients' views of the issues.
//ah that's interesting, I had rated this area of life as less of an issue than you said you would rate it....can you tell me a bit more about what you were thinking?//
The intention here is that this contrasting of perspectives opens up mentalizing between worker and client.
''The principal purpose here may be more about helping the client to develop an understanding of their needs'' and scoring the measure may be secondary to that purpose. In this case, the value of the AIM is in how it supports the direct work with the client.
The AIM can also be used to try to develop an overview of the needs of the young person ''and to see whether these needs change over time''. In this use there is a value in scoring the measure as it enables a closer examination of what has changed over time. For this purpose, the measure may be completed by the practitioner on their own and be completed quite quickly like a sketch to go in the case notes to be referred back to at some later date.
It is extremely tempting to believe that it is possible to use the AIM for both purposes. In practice, this does not work so well. If used for a clinical purpose, it will be often be completed infrequently and often not scored so that being able to determine change over time is unreliable. For individual teams, it is usually best to agree what the purpose of using the AIM is going to be and to review this periodically rather than expect both purposes to be automatically met.
This is the //middle// level of the [[Dis-integration grid]], where exploration of the different ideas about ''interventions'' that might help with what is going on may reveal differences ([[Dis-integration]]) across the helping network. The other two levels are:
* [[What's the problem?]] - the level of //explanation//
* What to do?
* [[Who does what?]] - the level of //responsibility// within the system
See <<tag [[Addressing Dis-integration]]>> for more.
This is the top level of the [[Dis-integration grid]], where exploration of the different ''explanations'' for what is going one that might deserve/require/benefit from help may revel differences across the helping network. The other two levels are:
* [[What to do?]]
* [[Who does what?]]
See <<tag [[Addressing Dis-integration]]>> for more.
!!What is crucial is to have an Implementation Plan
We are very aware that training events can easily not lead to much change of practice in experienced teams. There is a big literature on this called [[Implementation Science]] which indicates that changes of practice require a number of key conditions to be in place. It is not wise to consider that individual enthusiasm will suffice (although this is handy). The key conditions are knowing who is responsible for on-going development of practice - the [[Implementation Team]] - and that this team has a plan. For AMBIT the plan should include training events organised by the team making use of of [[Training exercises]] contained in the core content of the manual.
These considerations are more important than the speed of implementation. Teams will inevitably vary about how much and how quickly they wish to implement new practices within the team. In general our view is that the process takes time and should be considered as requiring at months and years rather than weeks and days and that this is entirely dependent on local context.
!Introduction
This is a set of questions that workers might find helpful in identifying where they are in the therapeutic journey with a particular young person.
There are |<<tag [[Phases of AMBIT work]]>>|, but while these may provide a map for clarifying "where are we?" they do not necessarily (or perhaps ever!) unfold in a routinely sequenced [[Intervention timeline]]. Indeed, if they were a rigid, timetabled, programme, they would likely be perceived as [[Non-contingent]] by the client.
So the therapeutic journey may pass back and forth between phases - perhaps returning to the [[INITIAL PHASE]] from the [[INTERVENTION PHASE]] when a new challenge or area of work presents itself. What is very clear in [[Active Planning]] is that the worker should know were he or she IS on this map so that planning can be applied for that stage, and momentum be maintained towards longer term goals and aims.
See also material on considering your client's [[Relationship to help]], which will help in mentalizing their motivational state and therapeutic engagement.
!!Questions to ask
*[[How motivated is my client?]]
*[[How much time have I spent with this client?]]
*[[Is my client showing help-seeking behaviours towards me/the team?]]
*[[Am I guilty or worried about putting increasing demands on my client?]]
! First steps
1. Go to [[Active Planning]] - this describes how to go about developing a rational and safe plan for how to approach a young person and their family's complex difficulties.
2. There is a helpful checklist at [[Starting a NEW CASE - CheckLists]] which lays out all the necessary tasks for you to go through.
3. If you have completed an [[AIM]] assessment, then look at [[AIM suggested interventions]], which is designed to give you a variety of ways of sorting, ranking and sequencing the different [[Specific interventions]] that you might select.
!Still need help?
!1. I am lost!
You may find support in [[I'm stuck: what next?]] or KeepingYourBearings.
The [[Key Worker]] in [[AMBIT]] offers great flexibility - the ability to shift from one intervention to another very quickly, so as //to maintain a sense of momentum//. For instance, it is not necessary to wait for the arrival of the Family Therapist before some family work can take place //if that is what is called for here today.// This is about providing [[Contingent|Contingencies]] care. However, working with so many options immediately at hand requires a systematic approach to sequencing interventions, and structures to assist the key worker in KeepingYourBearings.
!2. Consider Hierarchy of Need
Placing the [[Formulation and Treatment Aims]] within a hierarchy/sequence may also be helped by using a modified version of Maslow's Hierarchy Of Need. the most basic needs MUST be supplied BEFORE trying to work on higher order needs. (If a child is not ''safe'' then no amount of perfectly-delivered and sophisticated psychotherapy will deliver what he or she needs.
!3. Maintaining engagement
This is ALWAYS a Treatment Aim.
Included in the generation of [[Formulation and Treatment Aims]] should be the identification of some achievable "QuickWins" which, although they may not feed into the sequence of interventions directed at major treatment aims, are nonetheless effective as a tool for assisting [[Engagement]], or to instil optimism if work in other areas appears to be "stalling".
Recognise the need for //parallel planning// and the capacity to switch flexibly between different tasks. It is very important to keep a sense of momentum.
!4. A Balancing act:
@@color(green):Sensitivity@@ & @@color(red):Chaos@@ Vs A @@color(green):"Clear Steer"@@ & @@color(red):Rigidity@@
The [[Key Worker]] always tries respond with sensitivity to Service User Feedback in choosing what tasks to focus on, and when. However, ''__an important balance must be struck__'', because //alongside// the valued capacity to provide:
> ''[[Contingent|Contingencies]] Care'' - i.e. to be guided by, and responsive to, a young persons' demands..
...there is often //also// the need to provide:
> ''Clear and authoritative guidance''; a "clear steer" for a young person and family in crisis.
Responding to the latter requirement //avoids// the Key Worker being carried along by the chaos that may characterise the young person's life.
!5. Using the team
The use of the team SupervisoryStructures assists in this latter task, harnessing the reflective meta-position of team members/supervisors to help to provide a reflective stance and to avoid the pitfall of the Key Worker becoming paralysed (for instance by the quite understandable avoidant tendencies within the family and young person as regards very challenging psychological work.)
!5. Direct and Systemic work
There is a balance to be found between Face-to-face work Vs. Liaison/networking.
The [[Key Worker]] will bear in mind the need to balance face-to-face contact with the need to be [[Working with other professionals]]. One of the earliest of the Treatment Aims (see[[Formulation and Treatment Aims]]) will be the development of a strong therapeutic alliance (attachment security) with the young person and family, and this will necessarily require more direct (face-to-face) contact time in the early stages. However, the key worker may calculate an advantage in the opportunity of gaining one of the identified QuickWins if an external agency can be rapidly recruited to provide (for instance) benefits assistance.
See also [[About 'Who does what?']]
This is the //bottom// level of the [[Dis-integration grid]], where exploration of the different ideas about ''individual/agency responsibilities in the system'' may reveal differences ([[Dis-integration]]) across the helping network. The other two levels are:
* [[What's the problem?]] - the level of //explanation//
* [[What to do?]] - the level of //intervention//
* Who does what? - the level of //responsibility// within the system
See <<tag [[Addressing Dis-integration]]>> for more.
This page mainly just works as a tag gathering material that might be of relevance when you are [[Addressing Dis-integration]]. Responsibility across the wider system is one of the key //levels// at which dis-integration across professionals tends to occur. See [[Dis-integration grid]] for a key tool that we use in helping to think about this.
!!''Workers''
The AMBIT TiddlyManual is designed and written with //workers// in mind as the key "audience". We appreciate that many different workers may be involved in the kind of "street level" or outreach approaches that AMBIT seeks to support and foster, and that such workers may come from very different training backgrounds. Some may be extensively and formally trained in one or more therapeutic modality, others may have much less formal therapeutic training, but may have a combination of life experience, and local knowledge to bring.
Some parts of the manual are more "technical" than others - we are trying to weed out jargon, and to use plain English wherever we can. We are also trying to expand the number of video clips to illustrate or explain particular points, as many people find this suits their learning style better than text. We are open to offers of video clips to add to existing content, as it is helpful to have a wide range of "talking heads" available.
!!''Commissioners''
Most services are commissioned in one way or another. Commissioners may be unclear what they are ACTUALLY paying for beyond a limited set of outcomes/outputs that generally fail to portray the richness of a clinical service. A locally-adapted version of the manual (see @tiddlymanuals for examples) is extremely helpful for commissioners as a way of defining in much more operationalised detail what they are paying for.
!!''Clients and Families''
A [[Mentalizing]] approach to therapeutic work fits well with this "[[OpenSource]]" approach to treatment manuals and to "therapy" as a whole - we work hard to make our thinking, beliefs, hopes, fears and intentions, etc, as EXPLICIT as we can, rather than leaving them as IMPLICIT, or undefined. If a young person or family member were interested to browse our practice manual, we would encourage this, and in particular we would be asking:
>//"Are there any aspects of the work in our manual that YOU have spotted, which YOU think would be helpful for us to focus on more than others?"//
As ever, it is always the young person, and those who know them best of all, who are most likely to know what will work best.
!!''Other professionals''
The point of [[TiddlyManual]]s is to help support, develop and share best practice in ways that are efficient, affordable and effective. See [[Other team's AMBIT manuals]] to explore the [[Community of Practice]].
In many ways, the concept of whole systems change strongly overlaps with the idea about creating a learning organisation. However, a whole area of study is now emerging about systems change and how to evaluate systems change that is highly relevant to AMBIT.
In attachment terms, the first aim of the intervention is to foster security. However, if a major deficit or stressor remains //unaddressed// in one functional domain (for instance the family), then in spite of good interventions in //other// domains (for instance the neurobiological and/or the individual psychodynamic) any sense of security will remain elusive. The systemic and attachment frameworks not only interact but do so inseparably.
For instance, the young person whose internal world is fragmenting cannot work if the family setting in which she is resident is equally rent by inter-personal conflict. Likewise, the family with firmly negative cognitions about the nature of external helping agencies (such as a school) is unlikely to provide the containment to facilitate a son or daughter to access the available help until the agency in question adjusts its stance to make it more accessible to the family and young person.
In the proposed multimodal approach the argument is that, rather than risking 'confusing' the young person and their family, mobilizing simultaneous interventions across multiple domains radically //increases// the chances of achieving good enough containment to prepare the way for further therapeutic tasks to be undertaken.
Within this framework, the young person and family will have the experience of a variety of different modes of conversation with these key figures, who nonetheless remain consistent as individuals through time. At times, communication will take a highly practical, problem-solving form (for instance in [[Crisis Contingency Planning]]), at other times it will be didactic or conversational (for instance in PsychoEducation, or in [[Cognitive Behavioural]] therapy), at other times it will take the form of [[Family Work]], using circular questioning and other [[Mentalizing Therapy Techniques]], and yet again at other times it will draw more on [[Psychodynamic theory]], addressing the experience of the patient's inner world .
{{$:/images/fa5/brands/youtube}} Watch Peter Fonagy talking about why mentalizing matters:
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/wLaqdY4SLew" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Wilson, G. T. (1998). Manual-based treatment and clinical practice. Clinical Psychology: Science and Practice, 5, 363–375.
https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1468-2850.1998.tb00156.x
It is not appropriate to be overly prescriptive on this subject, but nonetheless, keyworkers will recognise the gravity and responsibility of the work that they are engaged in, and would be expected to 'practice as you preach'; in other words to have some practices built in to their own personal lives that encourage:
#''Anxiety-management'' or relaxation.
#''Recreation'' (Activities that we might call 'play' which foster what is literally "re-creation" )
#''Mindfulness/Mentalizing practice'' - practising the capacity to take up, and sustain, a thoughtful meta-stance in relation to one's own thoughts and emotions. See [[Sensitive attunement]] for an example of an exercise that you can use to attune yourself to... your self!
#[[Self-directed learning]]: Using the manual you should try to monitor material you have covered in the manual and what you have not yet seen (later developments in the manual will facilitate this.) !
This exercise is an example of [[Line-ups - exploring individual differences]]
!!Learning objectives:
*Worker to mentalize themselves and colleagues in terms of their satisfaction with their job and their energy to change/ improve things at work
*Team to notice the differences across the team in job satisfaction and energy to change and consider the relationship between the two
!Requirements
*A space large enough to accommodate all workers on a horizontal and vertical axes
!!Introduction
Within a team it is normal and expected that there will be differences among workers with regards to the extent to which they are satisfied with their work and how much energy or motivation they have to make changes.
!!Exercise
1) Draw an imaginary line down the room, designating one end "Highly satisfied in my work" and the other "Highly unsatisfied in my work"
2) Ask workers to place themselves on the line. They will have to mentalize others to try to position themselves accurately in relation to others.
3) Invite comment on the process and whether there are any surprises as they look at the line up
4) Draw another imaginary line, perpendicular to the first, intersecting in the middle. Designate one end "I have high energy to make changes/ improve things at work" and the other "I have low energy to make changes/ improve things at work"
5) Ensuring that they remain in position in terms of the "x" axis, ask people to move forwards or backwards on the new "y" axis in relation to how much energy they invite have to make changes or improvements at work.
6) Invite comment again on the process and whether there are any surprises as they look at the line up. Encourage people to think about the relationship between the two continua.
7) Finally, ask people to move to where they see themselves sitting on the continua if a team based training was helpful to them
{{energy}}
<center>[img[Stance-Domains.JPG]]</center>
!What is this about?
''Working in multiple domains'' is AMBIT's way of approaching //difference// and //complexity// - where many different factors (or people) are all interacting and are mutually and reciprocally influencing each other. There are many other people with different skills and resources, too.
How do we work from being stuck muddling about ways forward with all of ''"them"'' towards a sense of ''"us"'' that includes our client, all working together towards common goals that make sense to our client? This is the 'paired' principle of [[Taking Responsibility for integration]] that sits alongside ''Working in multiple domains'' in the [[AMBIT Wheel]].
!!Why intervene in multiple domains?
Making deliberate attempts to work in multiple domains is one of the [[Core Features of AMBIT]] and there are a range of [[Training Exercises for Working in multiple domains]] in this manual. This element of the AMBIT stance is increasingly recognised in operational policies in work settings that encourage a broader set of core skills than simply those for a very specific task.
We recognise the complex and 'multifactorial' causes of many of the problems faced by young people - it is rare that problems have a single cause. Practitioners in AMBIT-influenced teams are ready to work across a range of intervention modalities if the client's only trusting relationship is with them. However, this is not to say that AMBIT workers should see their role as //"Do everything!"// There will often be a number (perhaps many) or tasks and specialist roles that require other workers, and other agencies - early work with an AMBIT-influenced worker may be directed at helping a client to engage and use this help, and to use the [[trust|Epistemic Trust]] that has developed in //one// helping relationship to generalise this into //others//.
Intervening in a single domain (such as the domain of individual psychology - beliefs and motivations, etc) ALONE is not AMBIT, unless there are explicit efforts to work in at least one //other domain//.
!!Multiple domains call for multiple interventions... and workers
The kinds of interventions a worker might use will often have been developed in, or may be seen traditionally as the province of separate professional groupings. Having a wider range of "barefoot" skills, equips the [[Key Worker]] for active, flexible, "light-footed", non-clinic-based, “frontline” or “street-level” work, allowing the person of the worker him or herself to act in an integrative role (see [[Taking Responsibility for integration]], one of the [[Core Features of AMBIT]]), rather than exposing the young person to multiple professionals at a time when developing a therapeutic attachment to just one individual may be hard enough. One of the purposes of this approach is precisely to //reduce// the need for a young person to be seen by multiple different specialists and, through a willingness to work across different domains of functioning, thereby investing in the development of a helping relationship with the AMBIT key worker.
>Note: When a worker is delivering basic 'barefoot' interventions in the early [[Phases of AMBIT work]] there is a strong focus on effective practice (see [[Respect for Evidence]]); they use manualized evidence-based treatment modalities as far as possible, albeit in settings that have previously not been seen as ideal for these to be delivered within.
However, as the client journey progresses, it is likely that ''other workers and agencies will inevitably need to become more involved'' (however skilful they may be, a single worker cannot conjure up a placement in supported accommodation or a training course or a brain scan if they don't work in the relevant agency!) and at this point the tension between ''Working in Multiple Domains'' and its paired 'stance-partner', [[Taking Responsibility for integration]] is most clearly encountered. AMBIT is not a //"DIY/Go it Alone"// model of help any more than it is a codified algorithm for a single total managed system; these principles are to some extent mutually contradictory because that is how it is in the field - you are always a little out of balance, and your [[Team|Working with your TEAM]] helps you to cope with this.
<html><iframe title="YouTube video player" width="640" height="390" src="https://www.youtube.com/embed/ym-N1mOzFQs?rel=0" frameborder="0" allowfullscreen></iframe></html>
!!What are "domains"?
''1. Biological''
* Are there physical (health) problems that impact on a client's capacity to adapt and thrive? See [[Screening for biological illness]].
* Are there nutritional issues (poor diet, use of harmful [[substances|Substance Use Disorder]], etc)?
* Is the client taking medications ([[Pharmacological]] treatments)?
*Workers should have an understanding //not// of psychopharmacology (which remains the province of the prescriber) but of:
># Key physical signs that would indicate a need for closer medical assessment ([[Screening for biological illness]])
># The rationale for using medication, and possible side effects to watch out for.
># Tools for developing and sustaining adherence to pharmacological treatment regimes, both addressing the individual and the systemic context (engaging family-members in the task of supporting adherence to a prescription, for instance.)
''2. Individual psychological''
* Is there evidence that a client's ways of thinking, feeling, perceiving, containing or learning about their experiences may be contributing to their difficulties in adapting and thriving?
*Workers should have basic skills in:
># Mentalization-based approaches to therapy
># Basic CBT
># Motivational approaches
># Psychoeducational techniques
''3. Family/care network''
* Is there evidence that the family or care network around the client may through their interactions be contributing to problems in adapting and thriving?
* Workers should have an understanding of:
># Basic SystemsTheory
># Basic [[Family Work]] (Mentalization-Based Family Therapy [[MBT-F]]) which emphasises the value in improving the capacity to mentalize within and between family members, including structural interventions addressing power hierarchies, boundaries, and the promotion of developmentally appropriate responsibilities.
''4. (a) Ethnicity/Race/Culture''
* How does the client experience their ethnicity/race/culture? As a //help// in their life (feeling 'at home', with access to people who understand, care and help, pride, identity, etc)? Or as an additional burden; systemic discrimination, outright racism, feeling (or being made to feel) "outside" or incompetent with peers (what anthropologists refer to as //acculturative stress//)?
* Does the client's ethnicity //in relation to their worker's ethnicity// require specific exploration in order to accommodate differences and minimise misunderstandings?
* Workers should be able to
>#Address the [[Cultural Context]] including assumptions and investigations into how this relates to power as it is experienced by the client
>#Engage in [[Cultural consultation]] as required.
>#Know how to go about [[Mapping social-ecological needs and goals]]
''4. (b) Social-ecological''
*A range of interventions are included, aimed at shifting a young person’s social ecology towards more mainstream and pro-social networks and positive recreational activity.
''5. Education/Vocational/Employment''
*Interventions within this domain are designed to promote the development of links to sustainable, mainstream institutions or employers (which may be referred to as “mainstreaming”) if at all possible. An overarching goal is to establish networks beyond Mental Health or Social Care institutions if at all possible.
''6. Inter-professional network''
*There is a strong emphasis on how to identify and avoid Dis-integratedInterventions amongst the ProfessionalNetworkMembers that tend to collect around young people with complex needs.
!!Mentalization as an organising principle
In [[AMBIT]], the 'oil' which lubricates these different types of intervention together is a pervasive use of mentalization as an organising principle.
!!Training
See [[Training Exercises for Working in multiple domains]]
!Context:
As part of its core [[Stance|Core Features of AMBIT]], AMBIT workers //proactively// address [[Dis-integration]] in and across ''Professional networks''.
In doing this, they try to maintain a stance that balances the need to [[Respect local practice and expertise]] with [[Respect for Evidence]] and the necessity for [[Managing Risk]] whilst simultaneously [[Scaffolding existing relationships]].
!Practical interventions
!!1. What's the problem that calls for this solution?
* This may be obvious! Frequently it is disconnections (failed mentalizing) across a professional network that most upset workers, let alone our clients.
* If not:
** Use the [[AIM Questionnaire - Interactive Version]] to identify which high-scoring item(s) flag recommendations for working with the professional network? It makes intervention recommendations based on a simple algorithm that links item scores to the best evidence for effective interventions
** Use the [[Dis-integration grid]] to identify failures of integration (which are inevitable in complex systems, remember!) and possibilities for fruitful [[Connecting Conversations]]
!!2. I want to improve collaboration with EXISTING professionals/agencies involved with a client?
* See material gathered under <<tag [[Addressing Dis-integration]]>> for ideas about this.
* Have a look at [[Addressing Dis-integration]] for the most practical advice about what to do in the real life dilemmas that trying to work with different professionals and different agencies tends to throw up.
* See the [[Dis-integration grid]] for a way to assess potential breaks in the continuity of the care network that might need addressing. See aso [[Dis-integrative processes in a Multi-Agency context]] for discussion on how things can get into a muddle when trying to coordinate across such networks.
!!3. I want to ENGAGE a NEW professional/agency to help address a client's specific difficulties?
>''Who does what?''
We do not list here all the different kind of problems that all the different kinds of professionals would see themselves as having expertise and authority to work with, but a few are worth highlighting:
* [[Advocates (mental health, exploitation, domestic violence, etc)]] are likely to be a key component of helping clients who have reported experiences of
**''Exploitation''
** ''Domestic Violence'',
** ''Discrimination'',
** ''Bullying'', etc,
** as well as those involved with ''Mental Health Services'', ''Social Care'' (children looked after by the state, etc) or the ''Legal System (Courts)'' including ''Refugees and Asylum Seekers''
* What all these clients share is a relationship to another person or persons in which the ''power balance is significantly (or at least is perceived as) __asymmetric__'' so that their capacity to accurately and effectively communicate their needs and wishes may be severely compromised.
>''How do I engage a new professional worker?''
* Research their 'referral criteria' and 'referral pathways' - this may involve sharing information via a referral form:
** If this is the case ''be sure you have got your client's permission for information sharing''.
* If you are able to discuss the referral, consider using a [[Thinking Together]] framework to help you to help the other professional/agency to help you
** What might [[Marking the Task]] for your interaction with this other professional/agency look like? (How do you succinctly and respectfully offer this as a way of [[Broadcasting Intentions]] - so that the difficulty //you are seeking help with//, and where you want to get to in this consultation or referral discussion, is clearly understood without this being perceived as bullying or unfairly demanding on your part?! Mentalize the other professional!)
** What would efficient [[Stating the Case]] contain if you were to describe the key details they need to know to help them engage effectively with your problem?
*** Key biographical and relevant cultural details
*** Key problems that they might need this specialist help with
*** Other problems that might impact on the work
*** Key risks identified (to self and others)
*** Other key working relationships and why they cannot do the work you are requesting
!!4. General material
* There are [[Interprofessional Boundaries]] that help to preserve effective postive relationships across professional groups and agencies.
* You may wish to use [[How to speak to a...]] to help get the best out of conversations with other ProfessionalNetworkMembers (for instance, this includes material on How to speak to a SOCIAL WORKER, or a DOCTOR, etc...
Interventions that operate principally in or on this [[Domain|Domains]] are included as sub-topics (Listed here: <<tag [[Working with the Family/Carers]]>>)
Under this topic heading all the interventions that involve working with the individual [[domain|Domains]] are tagged. Remember, though, that one of the [[Core Features of AMBIT]] is the need to ensure that we are [[Working in multiple domains]], rather than working just with, say, the individual.
It is reasonable to subdivide the 'individual' domain further into, say, the [[Biology]] alongside the various Psychological aspects of an individual's functioning, but for simplicity and practical reasons all individually-focussed interventions are gathered together here. See all the specific interventions tagged under this topic in 'related information'.
!Why you are here?
* Your [[AIM]] results have suggested ''"Working with the Professional Network"'' on the basis of scores in certain areas.
* If you are not certain, check which [[AIM Questionnaire - Interactive Version]] item is indicating that specific work with the Professional network is indicated. When you have completed the questionnaire, click on the 'suggested interventions' tab and toggle between 'global' and 'focal' ways of ranking these.
!What do I need to know?
!!Underlying theory and practice
''1. Context: Working with the Professional Network'' is just one rather specific element within the broader topic of [[Social-Ecological Work]], but //this element is separated out as it often takes up a lot of workers' time// as they plan and carry out joint or collaborative work with clients, or try to coordinate work ([[Addressing Dis-integration]]).
>It is important to remember that the ''professional networks'' around a client are often (perhaps mostly) //''only one (comparatively small) fraction of their whole social ecology''//. It is easy to forget the much larger influences exerted by the non-formal or non-professional parts of the client's social ecology
''2. Specific inter-professional and inter-agency work:''
>Go to [[Working with other professionals]] for links to:
* Specific //''practices and advice''// on common problems in collaborative working with //specific types of professionals// and //other agencies// who are already involved with your client
* Advice on //''who else to ADD to a professional network''//: what other agencies/workers might have specialist skills and authorities required to work with specific difficulties?
* Advice on //''when adding more workers may actually be part of the problem''// rather than a real solution?
> AMBIT offers a lot of more general theory and practice about working with networks:
* <<tag [[Working with your NETWORKS]]>> is the main introductory page to this area of work, with links to all the various subtopics. Professional networks can be large, and complicated and your time is unlikely to be limitless, so you probably cannot work in detail with every professional in a large network, despite your best intentions (it is rare for all the professionals in a large "team around the client" to be present at multi-agency meetings). This material is about helping you get the best value out of time you spend
** <<tag [[Addressing Dis-integration]]>> lists the key topics for working with existing inter-agency and inter-professional networks
** [[The AMBIT Pro-Gram]] is a tool for mapping the professional network around a young person, focusing on the [[Relationship to help]]
** The [[Dis-integration grid]] is the key TOOL for helping focusing this integrative 'networking work' on the most important parts of the network.
!!What is the "Social Ecology"?
* The ''Social Ecology'' is really the sum of all the social relationships that the young person lives and develops within.
* The ''Social Ecology'' is one of the [[Domains]] in which any [[Key Worker]] might be expected to plan effective work (alongside, for instance the domains of Biology/Physical Wellbeing, Individual Psychology, Family/Carers, Education/Training/Employment, etc). We know that //all these domains interact, intersect, and influence each other// but there are different specific techniques and methods of working that can address specific difficulties that are predominantly situated in each of these.
* Because the ''Social Ecology'' is really a way of describing a whole series of NETWORKS, thinking about working in this domain is closely related to one of the [[Core Features of AMBIT]], namely [[Working with your NETWORKS]].
**The Social Ecology is perhaps the most expansive of our [[Domains]]. It extends into and is influenced by ''large group psychology'', ''culture and cultural biases/discrimination'', and is profoundly impacted upon by'' political policy and rhetoric'' and ''economics and global impacts'' (such as climate change or international relations) to name but a few.
** Its pervasive and many-layered impacts mean that the Social Ecology may often be ''the most powerful influence'', but at the same time this makes it perhaps the least easily 'pinned down' or ''the least amenable to change''.
**AMBIT may have relatively little that is 'new' to say in this field, though our [[Core Features of AMBIT]] stress the need for a [[well-connected team|Key worker well-connected to wider team]] as critical in influencing wider networks as well as working safely with risky clients. The weaving together of a '''team around the client''' that takes the existing [[Relationship to help]] seriously (see [[The AMBIT Pro-Gram]]) and a flexible, adaptive [[Team around the Worker]] to support the sustainability of this, are probably the most distinctive elements of what follows.
!!The ''Social Ecology'' can be sub-divided into:
!!!''1. Explicitly informal social/family networks''
The people around a client who they regularly interact with, or have access to. These may have positive or negative influences on them, or a mixture, and __who__ judges the nature of these influences is likely to make a significant difference in __how__ they are judged. (//The potential impact of cultural, class, race, gender, sexuality-based or other biases if it is a worker evaluating this is essential here//) but examples of negative features in young client's social ecology might include: gangs, criminality, drugs, sub-cultures promoting self injury, etc, etc.
!!!''2. Community resources''
For instance: sports clubs, faith groups, youth groups, arts centres, etc that are more formally organised than family/friends but are not part of 'statutory services' or at least less formally-defined roles and responsibilities. Mostly these parts a local social ecology might be seen as offering positive influences, but at times a community 'resource' may unintentionally have the opposite impact (a youth group that has been targeted and infiltrated by criminal gangs, or local groups that have a radicalising agenda motivated by discrimination, hatred or violence, etc.)
!!! ''3. Formal/professional networks''
This refers to the //specific formal (including statutory) services that are currently operating in a local setting// such as Social services, Education, Health, Police, Probation/Youth Offending Services, etc. Of course these make up part of any client's Social Ecology but the //different skills and practices// required for working with these //formal// relationships and resources are for practical reasons separated off from ''1.'' and ''2.'' above, and can be explored under [[Working with the Professional Network]] where more detail on working with these networks is laid out.
!!What to do?
* Given that the Social Ecology around a young person is a network, or series of networks, involving lots of minds, different intentions, objectives, priorities, ideas and skills, it follows that ''Dis-integration'' is an inevitable feature.
* The work of [[Addressing Dis-integration]] (one of the [[Core Features of AMBIT]]) will be required in this [[Domain|Domains]].
* See [[Social-Ecological Work]] for interventions.
** There are four stages in planning and executing AMBIT social-ecological interventions:
*** 1. ''Mapping needs and goals'' - for the young person and for the family
*** 2. ''Mapping resources'' - in the family, in local community, in the team
*** 3. ''Allocating tasks, identifying gaps, and strategies'' for managing these
*** 4. ''Implementation''.
!!Introduction
One of the [[Core Features of AMBIT]] is using [[Mentalization]] in face to face encounters while working with your clients.
In focusing on what goes on between between client and worker, AMBIT is like pretty much any other therapeutic approach (it is AMBIT's emphasis on the //other three quadrants// of the [[AMBIT Wheel]] that makes AMBIT a bit different.)
The two AMBIT Stance principles that are located around this quadrant are:
* [[Scaffolding existing relationships]] and
* [[Managing Risk]]
...getting one of these "right" often causes the other to go slightly (or more than slightly) out of balance, and this is one way of thinking about the predicament of the worker. We argue that doing this work //should// make you anxious... not all the time, and not too much, we hope, but to remain ice cool in the face of this balancing act in the face of the very significant vulnerabilities that our clients (and we, sometimes) face would suggest either ignorance ([[Pretend mode]]) or psychopathy on our part! The critical question is how we hold our balance, and correct our stance when we are unbalanced, as we surely will if we are engaged in this work.
Aside from [[The Therapist's Mentalizing Stance]], it is [[Active Planning]] (the way mentalizing informs our ''planning'' in work so as to allow for sensitive //adaptation// without a loss of //purposeful direction//) that most centrally captures this sense of navigating through stormy waters, but there are a wide range of other aspects of face to face working that are also gathered under this heading, as sub-topics.
!!Aspects of Working with your Client
The main subtopics to Working with your Client are listed below, click on the tags to see a drop down list of the pages under each sub-topic.
!!!1. Keeping your bearings in crises and chaos
!!!!(a) Working 'on the fly':
*<<tag [[Active Planning]]>> - AMBIT's [[Mentalization]]-based approach to co-producing rationally-sequenced & effective action plans
!!!!(b) A map of where you're going
*<<tag [[Phases of AMBIT work]]>> - Orienting yourself to what should be happening, and when
!!!!(c) Measuring progress
* <<tag [[Evaluating outcomes]]>> - Where ''Working with your Client'' overlaps with the AMBIT quadrant of [[LEARNING at work]] is in the usefulness of defining your goals and measuring your progress towards them.
!!!2. Keeping/Building Connection with your client
*<<tag [[Manage CLIENT RELATIONSHIP]]>> - Making sense of and managing the therapeutic relationship between worker & client.
*<<tag [[Relationship to help]]>> - How different clients respond differently to offers of help, and how to adapt the offer
!!!3. Practical ideas for common issues
*<<tag [[Managing Risk]]>> - Managing risk in general (& its pitfalls) and in relation to specific situations
*<<tag [[Manage CLINICAL PROBLEM]]>> - Lists specific situations in direct face-to-face work (problems, scenarios, etc; not necessarily "clinical" in the technical sense) with suggested responses
*<<tag [[I'm stuck: what next?]]>> - Other material, useful if your efforts to keep the work moving have stalled.
*<<tag [[Interventions (by target group)]]>> - Lists range of "manualized" interventions that might help, organised by the domain you want to work in (individual, family, etc)
*<<tag [[Specific interventions]]>> - Lists links to specific guides ("how to do it" manuals) on a range of simple evidence-based interventions
----
!!!4. Remembering and relearning:
*<<tag [[Training Resources]]>> - Lists all the training resources available to your local team in this manual
---
!!Three other AMBIT Quadrants to remember!
<div class="tc-image-link-row"><<image-link "Working with your TEAM" "josh-calabrese-Ev1XqeVL2wI-unsplash.jpg" "Working with your TEAM" "300">> <<image-link "Working with your NETWORKS" "nn.PNG" "Working with your NETWORKS" "280">> <<image-link "LEARNING at work" "Capture.PNG" "Learning at Work" "260">></div>
!!Introduction
Here we address working with the common problems that arise in working with the professional networks that gather around a young person and their family - particularly if you are keeping to one of [[Core Features of AMBIT]] which is to ensure that you are [[Addressing Dis-integration]].
!!Aspects of Working with your Networks
The yellow (& green) tags below provide you with the key themes which fall under working with your networks. Click on the tags to see a drop down list of the pages under each topic.
*<<tag [[Working with your NETWORKS]]>>Key topics, and local additions to how we work with large complex networks of professionals, families, and social contacts
*<<tag [[Addressing Dis-integration]]>> - The central theme of AMBIT practice with networks
*<<tag [[Working with other professionals]]>> - A collection of activities and advice for working effectively across agencies
*<<tag [[Taking Responsibility for integration]]>> - The AMBIT stance element that underpins this work
*<<tag [[Working with the Social Ecology]]>> - Addresses work with the INFORMAL networks around a young person
!!Reframing expectations - a core feature
In AMBIT we try not to be //surprised// or //disappointed// by ''Dis-integration'' in practice across complicated networks; instead, we ''//expect it//''!
Indeed, working with these //imperfect associations, affiliations and collaborations// (which requires consistent effort by workers in [[Addressing Dis-integration]]) is one of the [[Core Features of AMBIT]].
This answers the AMBIT stance element that promotes [[Taking Responsibility for integration]].
!!Note on definition
Although the [[Family]] is often the most important part of a young person's network, we locate many of the face to face working issues to do with the family under [[Manage CLINICAL PROBLEM]] - this is because the '~Family-As-A-Whole' can in many respects be seen as the client, rather than just the young person (and the "family" is however the young person defines this, which may refer to carers who are not strictly family members).
See also [[Working with the Family/Carers]].
---
!!You may also be interested in:
<div class="tc-image-link-row"><<image-link "Working with your CLIENT" "togimg.PNG" "Working with your CLIENT" "300">> <<image-link "Working with your TEAM" "josh-calabrese-Ev1XqeVL2wI-unsplash.jpg" "Working with your TEAM" "300">><<image-link "LEARNING at work" "Capture.PNG" "Learning at Work" "260">></div>
!!Introduction
Working with your TEAM is one of the [[Core Features of AMBIT]], both as a core practice, and as stance principle [[Key worker well-connected to wider team]]. This page provides you with a brief introduction and links to ideas about [[AMBIT-Teamworking]], and how you can use these in [[YOUR LOCAL TEAM|OUR Team]].
!!Team working in AMBIT - the "well-connected team"
AMBIT is a method of working that involves the team as a whole - and in particular how we try to use [[Mentalization]] to structure and support team working, and in particular to help the team support the individual [[Key Worker]].
Indeed, in earlier versions of AMBIT the SupervisoryStructures in teams were given as the "[[core feature|Core Features of AMBIT]]" of AMBIT, rather than //"Working with your team"// in more general terms.
AMBIT promotes the development of principles and specific practices that support team practice that are underpinned by the use of [[Mentalization]]. These principles and practices (the [[Core Features of AMBIT]]) can be adapted for a wide range of different service structures. AMBIT does not specify the managerial or organisational arrangements for teams which use this approach.
The AMBIT approach aims to enable local expertise to work more effectively by explicitly finding ways to:
* Support practitioners to remain [[well connected|Key worker well-connected to wider team]] to other team members
* Support practitioners to take responsibility for stimulating and sustaining //each others'// [[Mentalization]]
This particularly happens through a key process which we call [[Thinking Together]].
!!Video on AMBIT and Team Working
By [[Liz Cracknell]], one of the senior [[AMBIT Trainers]] - here she is addressing a Training for [[AMBIT Local Facilitators]]:
<html><iframe width="640" height="360" src="https://www.youtube.com/embed/0e_kGvCtOEw" frameborder="0" allowfullscreen></iframe></html>
!! Aspects of Working with your Team
The tags below (yellow pill shapes) provide you with the key themes within working with your team. Click on the tags to see a drop down list of the pages under each topic.
<<tag AMBIT-Teamworking>>
*Material specific to AMBIT's approach to team working
<<tag [[SUSTAIN best practice]]>>
*Supporting teams to work in sustainable ways (beyond mere heroism) is a primary aim
<<tag SupervisoryStructures>>
*Includes boundaries & local rituals/disciplines such as [[Thinking Together]]
<<tag [[Rituals and Disciplines]]>>
* Local rituals and disciplines that define a team culture are what AMBIT training helps teams start to choose
<<tag [[Problems in teams]]>>
*Problems occur in every team & are opportunities to learn
<<tag [[Boundaries]]>>
*Clear, well-marked boundaries help reduce risks and problems in teams
<<tag [[Developing learning organisations]]>>
*AMBIT is about explicitly attending to developing a team culture
!!Diversity, with common core features
Another of the [[Core Features of AMBIT]], is to start with the assumption of respect for local expertise ([[Respect local practice and expertise]]) both in the team, in wider networks, and in the [[Key Worker]]. Thus, developing your LOCAL Teamworking is key!
As part of the development of a local team culture, local teams should ''record'' (learn about this at [[Manualization]], or get doing it guided by [[How to run a team manualizing session]] ) their own expertise and protocols (<<tag [[OUR LOCAL Resources and Practice]]>> and <<tag [[OUR LOCAL Teamwork and Governance]]>>) in their local version of the manual.
---
!!You may also be interested in:
<div class="tc-image-link-row"><<image-link "Working with your CLIENT" "togimg.PNG" "Working with your CLIENT" "300">> <<image-link "Working with your NETWORKS" "nn.PNG" "Working with your NETWORKS" "280">> <<image-link "LEARNING at work" "Capture.PNG" "Learning at Work" "260">></div>
!What is it?
The Young People's Outcome Record (YPOR) is a drug treatment outcome monitoring tool that has been developed by the NTA in partnership with drug treatment providers in over 70 sites across England. It was originally developed as an adult tool (Treatment Outcomes Profile or TOP), applicable for use in all of the structured treatment modalities as defined by Models of Care for Treatment of Adult Drug Misusers: Update 2006. (Reference: The Treatment Outcomes Profile (TOP): A Structured Interview for the Evaluation of Substance Misuse Treatment. Marsden J, Farrell M, Bradbury C, Dale-Perera A, Eastwood B, Roxburgh M & Taylor S (2008). Development of the treatment outcomes profile. //Addiction//, 2008; 103 (9): 1450 -1460)
!When to complete it?
The YPOR should be completed at three key treatment stages:
!!Treatment Start
*The YPOR should be completed within two weeks either side of the date that a client started structured drug treatment.
*If the YPOR is completed in the two weeks after the treatment start date it is important to ensure that the recall period focuses on the 28-days before treatment start and NOT the 28-days from the date that the YPOR is completed.
*The treatment start YPOR provides important information about the clients drug use before treatment and acts as a baseline for comparison with subsequent Review and Exit YPOR’s.
!!Review YPOR (3 months)
*It is good practice to conduct regular care plan reviews that are usually completed in 12 week (3 month) cycles. It is recommended that the YPOR is completed as part of this process.
*However, in the UK where it was developed, the YPOR only needs reporting to the NDTMS (UK's ''National Drug Treatment Monitoring Service'') every 26 weeks (6 months).
!!Treatment Exit
*YPOR should be completed within two weeks either side of the date that the client exits structured treatment.
*If the client is referred on to another structured treatment provider a Treatment Exit YPOR is not required.
!How to complete the YPOR
''Timeline'' - Invite the client to recall the number of days in each of the past four weeks on which they did something; for example, the number of days they used heroin. You then add these to create a total for the past four weeks in the TOTAL box
''Yes and no'' - a simple tick for yes or no, then a "Y" or "N" in the blue NDTMS box
''Rating scale'' - a 20-point scale from 0=poor to 20=good. Together with the client, mark the scale in an appropriate place and then write the equivalent score in the box.
You should aim to ask and complete every question. Do not leave any of the blue boxes blank. Enter N/A if the client refuses to answer a question or, after prompting, cannot recall.
!Do you want to complete a YPOR on your client right now?
Go to https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/872932/NDTMS_YP_community_combined_review_form_CDS-P_Print.pdf
[img width=100% [free-to-use-sounds-W_FHuUQKNP0-unsplash (1).jpg]]
!!Purpose
The purpose of this page is to give teams a clear idea of ''what their own team's LOCAL version of the AMBIT manual is for'' and how to use it. There is a very basic [[User Guide]] for this purpose that you might also find helpful, but everything that you need is here or in the links and sub-topics under this page heading.
!!AMBIT Manuals
* Each team who trains in AMBIT gets their own ''local version'' of the AMBIT manual.
* This automatically includes all of the core AMBIT content, with the additional capacity for teams to locally adapt, edit and add to their manual.
The ''Core manualized content'' is managed centrally by the AMBIT programme using best available evidence, and where evidence is lacking always aiming to be 'evidence-oriented'.
''The use of the wiki technology'' allows us to move away from being a "top-down" resource that dictates singular methods of working from a setting (certainly a cultural milieu, and often an evidence base) that //may greatly vary from the sites where these ideas, and techniques may be implemented//. (''For the technically-curious'', see TiddlyManual for a video on how this wiki software works.)
Before you embark on AMBIT training your team will be set up with a manual, if this is a [[Local Facilitator Training|Local Facilitator Training (LFT)- training model]] those attending will be set up with a login (to allow you to edit). Through editing and adding to your teams local manual you are developing your own //customised// version of this material.
!FUNCTIONS of the AMBIT manual
!!!Reference resource
<<tag [[Using the manual as a REFERENCE tool (looking stuff up)]]>>
!!!Recording tool
<<tag [[Using the manual to RECORD learning (manualization)]]>>
!!!Social network
<<tag [[Using the manual to CONNECT with other AMBIT workers]]>>
!! Manualizing
The rationale for and process of manualizing is set out in the [[Manualization]] page.
Additionally, there are some important [[preconditions |Preconditions for Team Learning]]that teams should try to develop prior to beginning their 'manualizing journey'. The [[AMBIT Training]] is one way to develop this readiness.
!!! Some examples of Manualizing Topics
Local teams are encouraged to browse each [[others' Manuals|Other team's AMBIT manuals]]. Examples of topics that your team could and indeed should manualize include how your teams uses or has adapted AMBIT tools to suit your local practice. Some further examples from local teams are listed below:
*[[Allocations Meetings|https://manuals.annafreud.org/ambit-hertsandbucksld/index.html#Bucks%20CLDHT%20Allocations%20meetings%20manualizing:%5B%5BBucks%20CLDHT%20Allocations%20meetings%20manualizing%5D%5D]] (Herts & Bucks LD)
*[[Using the AIM cards - ideas for workers|https://manuals.annafreud.org/ambit-amass/index.html#Using%20the%20AIM%20cards%20-%20ideas%20for%20workers:%5B%5BUsing%20the%20AIM%20cards%20-%20ideas%20for%20workers%5D%5D]] (AMASS)
* [[Making a Good Social Care referral|https://manuals.annafreud.org/ambit-bexley/index.html#Making%20a%20good%20social%20care%20referral:%5B%5BMaking%20a%20good%20social%20care%20referral%5D%5D]] (Bexley CAMHS)
!!Things to remember
*Multiple trials and meta-analytic evidence suggests that working faithfully to a manualized treatment that offers a clearly structured approach does offer some measurable ''improvement in treatment outcomes'' for our clients.
*''AMBIT's innovation'' is that it invites a ''co-construction'' approach to the manual:
** [[Your Manual]] is (or can become) ''a blend'' of:
*** broadly evidence-based (or evidence-oriented) material from the [[AMBIT programme]]
*** ''locally-attuned'' material that is ''situation-specific'' (or ''"place-based"'' to use the jargon!) - including being attuned to the cultural and service ecologies that only a Local Team (using its own [[Service User Feedback]]) can access.
*Editing and adding to [[Your Manual]] creates a ''customised version'' of the Core approach that is "attuned" for use in your neighbourhood, with your clients.
** You should therefore work as a team to edit it, bit by bit, in brief regular [[manualizing|Manualization]] sessions
**[[Your Manual]] thus comes to define your local team:
*** a record of our developing narrative of ''who we are'' and //"our way of working"//
***Helps in inducting new team members
***Reminds existing team members how to "stay in balance" with work that is by its nature often unbalancing
*** Let's service commissioners know what they are getting for their money.
!!What next?
Get manualizing!! Below are two pages which will provide with some ideas for getting started with manualizing your teams practice:
<center><<image-link "How to edit your team's manual" "luciano-de-sa-ObwMZBdEWdI-unsplash (1).jpg" "How to edit your team's manual" "300">><<image-link "How to run a team manualizing session" "dylan-gillis-KdeqA3aTnBY-unsplash (1).jpg" "How to run a team manualizing session" "310">><center> <<image-link "Preconditions for Team Learning" "john-schnobrich-2FPjlAyMQTA-unsplash (1).jpg" "Preconditions for Team Learning" "310">><center>
UEsDBAoAAAAAAIBuTlkAAAAAAAAAAAAAAAALAAAAdXNlcmFzc2V0cy9QSwMECgAAAAAAgG5OWVStuUPBVQAAwVUAADMAAAB1c2VyYXNzZXRzLzJkNTA1Nzg4LWU1ODQtNDM1ZC1iZmE0LTA3OWQ0Yzk0MDRiOC5wbmeJUE5HDQoaCgAAAA1JSERSAAADwAAAAlgIAgAAACL2GFYAAAABc1JHQgCuzhzpAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAVVZJREFUeF7t3XmUVPW99/vz13m8J3fdm3PO8yTe89x1VtaNijmJDBqHGBNNNNHjFGMGjUzNjCiiiApOGA0CTuAAOOCMoDaTDYqoKKPMjaCMPUE3NA30RA/03H2/VfvL5sevq7t/u+kudle9X+uzWLBr7+qqr+XmU5tdu/6pCQAAAIAzCjQAAAAQAAUaAAAACIACDQAAAARAgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAAAKgQCMsquobsksrdhaVrTpQJFmcXbAgMz8xkpZ10HtS2wqPZpZUlNXU6XMGAABdEAUap1l9Y6P05i/zjlilM7HzRe7h7UVl8p5Bp4COU9vQsK+sUt6JfZ0fedOyJCdx3olJ5I2l92ZMXj/yP05lXb0+bXQCXksAWkKBxukke+0E+zspUOQvMPm7Wd5C6DhwaqTrSBuwhpzwkTefu4vLeRV1LF5LAFpHgcbpUVXfkGxHnVvK0n2HOKnjFBVUVn+Re9gabFJF3ojK21EdB04BryVeS4ALCjROg9LqWmmN1l47mbM4u0D+2tbpIIj6xsaNBSXWPJM2K/YXcl5Qu/FaMsNrqXVLlm+74tZJ46cs0D+3TNbxo4tO9tXanXLTnLR1+udYFizdLOvID9U/n4Kq6lr5WWMnp8rjl6SMmSn3PHH64py8I7pGy9yfdcnRSlktZuSny1OWFXTVk7W0ofzonZn5upIDuZ83U1fJht7T9O5Efq7e3BEo0Ig3ac+J9AHBDkx+RZXOCG74d4zmWZJTIP+L6YDgjNdS8/BaasU1/Z/9px+lnNFtSEtF0Cer+dFFJ7tp6Aty05kXjtI/x3LuleNkHSmC+ud2kYcqvVkes/94rNw6csba9ExdOxb3Zy113Lzn5vl+9xHyYA4eLtUNjmtzQ3kMW7bv07VbMGPWl3L/1oZeel77aEfVaAo04kr+luLYc0tJyzrIX1fuKuvqeS3FjLyQiqpqdExwwGuppfBaiklqn1/Ipry+VJe2wF9TootO9qPLxni3tlTs/E4ppVAXBbczM9//Qa1kwdLNukEzgZ51mz3Yi3Rx67iy44ZSvqta+Ovy7sdnWytbaf1gvzsKNOKnvrGRYzytR/4W559NXfBaaj1Lcgq4qIIjXkuth9dSc+OnLPDbWM9rH9WlLfDXlOgiQ8nRSv9WKYW69GQTpy/21wl0GoNPtop5RFYevPVH3SCWQM/asQdLpNabx7PdNzz3ynGysm52nLwBaL7aFbdO8v8oc2ipeQdFgUb8ZJZUWLtm0jzbCo/qvNCydQeLrbkRK1IKpRrqvNAyXktthteS5cwLR/mFTNL6aQ/mmrrIsGT5Nv9WqZK69GRm/2vf0VPzHiRSf6Vo+rVVfjNj1pfypFo5/CwCPWurB3tNd8v2fV+t3Tnl9aVWcZdq7m0lrA29n+JtKKtZj0Hux2rD5jOV35vvN+ROZEnKmJn651NGgUacyP53SRJfsc49aVkHOQjduvyKKmtoJGZ2F5fryNACXkuO4bXka36Ms/VOZq6piwzm0WVJ81Zqnjghufvx2XqDM+sB3zT0hZiHYFs/Lhv0Wccs0D75WWbTlYekNzTbUJceJ11ffq65gjUQ80B7zM9cdtThZ0GBRpzI/tfaI5OWwkHoVsg7sSS/yph7eDPWOl5L7uG15PM+82em9Q/VmWvqIoN1b83P4ngzdZW5wiV/fEJvcCN90fsAopdr+j+rNwQU9Fm3XqCF+bzMQ++tF2iP+WDkYfifRDTfbMhyb2HnoUAjTviLyj2Lswv4B9OWcCJQoPBmrBW8lgKF15KQiibNzKtoZjGdMetLXaMZfx2JLjJY5yTIfeoNx3kXvvATtBfKAzM3b/P6FTG141m3WaDNQ9rmhyNdCrQ8C//xSMwzT8x5mss7AwUa8VBZV2/ti0nrOXKMT77HtmJ/oTUr0kqW5BTo4NAMr6VA4bUkzDMulizf5te1Vj5U568v0UXHWadneDFP262qrjWbopdAJXj4Q2/7G5pnSgTSjmfdZoEeOznVv9U8rO5SoIX5vsK8JIi5XHp5x1742UKBRjxw/kbQcLAnJt6JtSNchiwmXkvtCK8l/0pw3sUczHraUq/1V5DoouOan1gsMT9RNydtnXWr5M3UVXqzA+mm/oZtXnuuJe141q0XaOsQsvnAHAu0ea06eTy69OQPZXqRNVs51eRUUKARD5sPl1o7YtJ6Vh0o0tnBkF3Kv7kHzvaiMh0fDLyW2pEkfy19tXanX8tuHTlDlph1zaxxJn8FiS46zrwwnB/zLA7rA3NeAn2O0PxQXftOaWjfs7Z6sDxmebJerJNSzrxwlPnBPscCLZ3bX8c6L9zs915kCBOnLzZ/SoegQCMepA5aO2LSepbuO6Szg4F3Yu0Ib8Zi4rXUjiT5a0nqo9/JvMvJSSfzG+oZ3YbErGj+JhJddJz5YTjzym7eWRzmncut/iHbVk6csFiniLTvGtLte9ZWD24pcj/WMWzHAt3SZxCFPB7z/BA/0tSl+utKHYECjXjgE4RBk5Z1UGcHw9f5vBMLHPm/T8cHA6+ldiSZX0vmB+nM1mgeJI75oTr/VokuOs4/mVju0DydY+L0xXKreehXlvgNu6XO2pw0Zv8eJNJN9QZn7X7WLgX6ilsnNT8D5NSPQHvkns0r5fkJdPy+dRRoxIPUQWtHTNqMzg4G3om1I7wZi4nXUjuSzK8ls7F5ZzJ4zPMZYjY5/1aJLooyDw97B5X9Pu3dj3kqgqxsdtaWzjxuzt9E0vpXn8TU7mfdZoH+fvcRMU9NdizQ5jnQUpR1aTPyOM3LhnjpqOPQFGjEg7UXJi7R2cGwOJvv4mlPdHww8FpqX3R8ycc8xcL8OsAq43wGSfNq698k0UVR5iFn70xi88QD6ZH+R/e8izebXbaV68dZzPrYjm8xbPeztnqw/FEWytsAcyt5S+CtbHIs0ObZL20eVDavIiKxzrpuNwo04sHaBROX6OxgsEZEHKPjg8EaEXGMji/JrE3PNBvYkuXbvlq70495qkDzMuffJNFFUeYnCL1CbJ5xYRZEr7maj6Glj+41Z35iT36iLnVzKs86ZoEW1vfCyP14y30uBVrqr3+0XuJyWRLrgicdchCaAo14sHbBxCU6OxisERHH6PhgsEZEHKPjSzIxr4YRM9+PXuhNN4syb9VFUWZF9o/gmkd8vfhnHsuv/kLvlA8X5qkOQY+8nsqzbqlAC7PT/+iyMa1vqEtPZh6Ml5h33gpz4N5Z5qeIAo14sHbBxCU6OxisERHH6PhgsEZEHKPjSyYlRyv9D9K5xDogat6ki6LMTxD6JdKqhhLzPAfzfAzHKizV3N9EIvevN7TlFJ91KwVafm/es3U0vc0CLQ/MPPwstVhvaIs525hnjwRFgUY8WLtg4hKdHQzWiIhjdHwwWCMijtHxJZMZxrdhf7/7iCtundQ8ZrW1PlTnL5foopNronk42bzqhRfzJAfzinLunwg0j7zK429+1oRnTto680yMU3zWrRRoYb1PMJ9L6wVa1vRPDfcS8yQQ/d3JzIPxHIFGl2HtgolLdHYwWCMijtHxwWCNiDhGx5dMzNMqxk5O1aUnsy4YZ36ozlyui+Tl1+wThD7zDIczLxylS6PM3ul+LNk6CC2R+mheAUMap39CdsyTSdrxrFsv0EIKt3+rFHH/gLq1ofRjL1LoZVDWu4vmB5K9dyBS7q03GHIP5rbNa3c7UKARD9YumLhEZweDNSLiGB0fDNaIiGN0fEnDap+tHPc1G6F5KNdfKNFFJ19ww7qkxhzj67ut5rrEuHhcoJMQzEPXfqS2StH8vnFZDIkskfVP/Vm3WaClfJuN1n+m1oatRH508/NYrGPbzY+UewsdT4BpHQUa8WDtgolLdHYwWCMijtHxwWCNiDhGx5c0hhsXY7a+8c5iXivN/Liev1DiLRHmYWbzwK2QDf1SKy1Tl0aVHK30t5JSqEsdyH2aP7GVyGqy8qk/6zYLtDCvQyLx5uBYoFs6KG6d4NE88iAPHi7VtU8NBRrxYO2CiUt0djBYIyKO0fHBYI2IOEbHlxzMLitpqbR5pJb5a0r8qyabC70lwr/bM2J9raDXX62zij1mQTRPw2iT/BQpu9bxZjNyk/dBwA551i4FWn6QeaKI/F6WtF6gpf6mjJkZ896EbH7347Ot0zzMtLJtO1CgEQ/WLpi4RGcHgzUi4hgdHwzWiIhjdHzJYWdm/vgpC/xYx4ObmzHrS39lv0r6SyTeEul5/pKYpzKvTc+84tZJMS9vLAv9bdtxJFU2kQcmPdI7t0Fy68gZclcLlm72761DnrWUe3+hpKWu3/xnWRt6ker/1dqdbT4Sj9yDTFXehPjPUZ6v3EkHVmcPBRrxYO2CiUt0djBYIyKO0fHBYI2IOEbHByQ9CjTiwdoFE5fo7GCwRkQco+ODwRoRcYyOD0h6FGjEg7ULJi7R2cFgjYg4RscHgzUi4hgdH5D0KNCIB2sXTFyis4PBGhFxjI4PBmtExDE6PiDpUaARD9YumLhEZweDNSLiGB0fDNaIiGN0fEDSo0AjHqxdMHGJzg4Ga0TEMTo+GKwREcfo+ICkR4FGPFi7YOISnR0M1oiIY3R8MFgjIo7R8QFJjwKNeLB2wcQlOjsYrBERx+j4YLBGRByj4wOSHgUa8WDtgolLdHYwWCMijtHxwWCNiDhGxwckPQo04sHaBROX6OxgsEZEHKPjg8EaEXGMjg9IehRoxIO1CyYu0dnBYI2IOEbHB4M1IuIYHR+Q9CjQiAdrF0xcorODwRoRcYyODwZrRMQxOj4g6VGgEQ/WLpi4RGcHgzUi4hgdHwzWiIhjdHxA0qNAIx6sXTBxic4OBmtExDE6PhisERHH6PiApEeBRjxYu2DiEp0dDNaIiGN0fDBYIyKO0fEBSY8CjXiwdsHEJTo7GKwREcfo+GCwRkQco+MDkh4FGvFg7YKJS3R2MFgjIo7R8cFgjYg4RscHJD0KNOLB2gUTl+jsYLBGRByj44PBGhFxjI4PSHoUaMSDtQsmLtHZwWCNiDhGxweDNSLiGB0fkPQo0IgHaxdMXKKzg8EaEXGMjg8Ga0TEMTo+IOlRoBEP1i6YuERnB4M1IuIYHR8M1oiIY3R8QNKjQCMerF0wcYnODgZrRMQxOj4YrBERx+j4gKRHgUY8WLtg4hKdHQzWiIhjdHwwWCMijtHxAUmPAo14sHbBxCU6OxisERHH6PhgsEZEHKPjA5IeBRrxYO2CiUt0djBYIyKO0fHBYI2IOEbHByQ9CjTiwdoFE5fo7GCwRkQco+ODwRoRcYyOD0h6FGjEg7ULJi7R2cFgjYg4RscHgzUi4hgdH5D0KNCIB2sXTFyis4PBGhFxjI4PBmtExDE6PiDpUaARD9YumLhEZweDNSLiGB0fDNaIiGN0fEDSo0AjHqxdMHGJzg4Ga0TEMTo+GKwREcfo+ICkR4FGPFi7YOISnR0M1oiIY3R8MFgjIo7R8QFJjwKNeLB2wcQlOjsYrBERx+j4YLBGRByj4wOSHgUa8WDtgolLdHYwWCMijtHxwWCNiDhGxwckPQo04sHaBROX6OxgsEZEHKPjg8EaEXGMjg9IehRoxIO1CyYu0dnBYI2IOEbHB4M1IuIYHR+Q9CjQiAdrF0xcorODwRoRcYyODwZrRMQxOj4g6VGgEQ/WLpi4RGcHgzUi4hgdHwzWiIhjdHxA0qNAIx6sXTBxic4OBmtExDE6PhisERHH6PiApEeBRjxYu2DiEp0dDNaIiGN0fDBYIyKO0fEBSY8CjXiwdsHEJTo7GKwREcfo+GCwRkQco+MDkh4FGvFg7YKJS3R2MFgjIo7R8cFgjYg4RscHJD0KNOLB2gUTl+jsYLBGRByj44PBGhFxjI4PSHoUaMSDtQsmLtHZwWCNiDhGxweDNSLiGB0fkPQo0IgHaxdMXKKzg8EaEXGMjg8Ga0TEMTo+IOlRoBEP1i6YuERnB4M1IuIYHR8M1oiIY3R8QNKjQCMerF0wcYnODgZrRMQxOj4YrBERx+j4gKRHgUY8WLtg4hKdHQzWiIhjdHwwWCMijtHxAUmPAo14sHbBxCU6OxisERHH6PhgsEZEHKPjA5IeBRrxYO2CiUt0djBYIyKO0fHBYI2IOEbHByQ9CjTiwdoFE5fo7GCwRkQco+ODwRoRcYyOD0h6FGjEg7ULJi7R2cFgjYg4RscHgzUi4hgdH5D0KNCIB2sXTFyis4PBGhFxjI4PBmtExDE6PiDpUaARD9YumLhEZweDNSLiGB0fDNaIiGN0fEDSo0AjHqxdMHGJzg4Ga0TEMTo+GKwREcfo+ICkR4FGPFi7YOISnR0M1oiIY3R8MFgjIo7R8QFJjwKNeLB2wcQlOjsYrBERx+j4YLBGRByj4wOSHgUa8WDtgolLdHYwWCMijtHxwWCNiDhGxwckPQo04sHaBROX6OxgsEZEHKPjg8EaEXGMjg9IehRoxIO1CyYu0dnBYI2IOEbHB4M1IuIYHR+Q9CjQiAdrF0xcorODwRoRcYyODwZrRMQxOj4g6VGgEQ/WLpi4RGcHgzUi4hgdHwzWiIhjdHxA0qNAIx6sXTBxic4OBmtExDE6PhisERHH6PiApEeBRjxYu2DiEp0dDNaIiGN0fDBYIyKO0fEBSY8CjXiwdsHEJTo7GKwREcfo+GCwRkQco+MDkh4FGvFg7YKJS3R2MFgjIo7R8cFgjYg4RscHJD0KNOLB2gUTl+jsYLBGRByj44PBGhFxjI4PSHoUaMSDtQsmLtHZwWCNiDhGxweDNSLiGB0fkPQo0IgHaxdMXKKzg8EaEXGMjg8Ga0TEMTo+IOlRoBEP1i6YuERnB4M1IuIYHR8M1oiIY3R8QNKjQCMerF0wcYnODgZrRMQxOj4YrBERx+j4gKRHgUY8WLtg4hKdHQzWiIhjdHwwWCMijtHxAUmPAo14sHbBxCU6OxisERHH6PhgsEZEHKPjA5IeBRrxYO2CiUt0djBYIyKO0fHBYI2IOEbHByQ9CjTiwdoFE5fo7GCwRkQco+ODwRoRcYyOD0h6FGjEg7ULJi7R2cFgjYg4RscHgzUi4hgdH5D0KNCIB2sXTFyis4PBGhFxjI4PBmtExDE6PiDpUaARD9YumLhEZweDNSLiGB0fDNaIiGN0fEDSo0AjHqxdMHGJzg4Ga0TEMTo+GKwREcfo+ICkR4FGPFi7YOISnR0M1oiIY3R8MFgjIo7R8QFJjwKNeLB2wcQlOjsYrBERx+j4YLBGRByj4wOSHgUa8WDtgolLdHYwWCMijtHxwWCNiDhGxwckPQo04sHaBROX6OxgsEZEHKPjg8EaEXGMjg9IehRoxIO1CyYu0dnBYI2IOEbHB4M1IuIYHR+Q9CjQiAdrF0xcorODwRoRcYyODwZrRMQxOj4g6VGgEQ/WLpi4RGcHgzUi4hgdHwzWiIhjdHxA0qNAIx6sXTBxic4OBmtExDE6PhisERHH6PiApEeBRjxYu2DiEp0dDNaIiGN0fDBYIyKO0fEBSY8CjXiwdsHEJTo7GKwREcfo+GCwRkQco+MDkh4FGvFg7YKJS3R2MFgjIo7R8cFgjYg4RscHJD0KNOLB2gUTl+jsYLBGRByj44PBGhFxjI4PSHoUaMSDtQsmLtHZwWCNiDhGxweDNSLiGB0fkPQo0IgHaxdMXKKzg8EaEXGMjg8Ga0TEMTo+IOlRoBEP1i6YuERnB4M1IuIYHR8M1oiIY3R8QNKjQCMerF0wcYnODgZrRMQxOj4YrBERx+j4gKRHgUY8LN13yNoLkzajs4PBGhFxjI4PBmtExDE6PiDpUaARDyv2F1p7YdJ6luQU6OxgSMs6aA2KuETHBwOvpfZFxwckPQo04mFjQYm1FyatR95y6Oxg4J8y2hcdHwy8ltoXHR+Q9CjQiIftRWXWXpi0HnnLobODYdWBImtQpM1IU9TxwcBrqR3htQT4KNCIhyPHaqwdMWk9+8oqdXYw8E8Z7Qj/mhETr6V2hNcS4KNAI04WZxdY+2LSUtKyDtY2NOjgYNjJP2UEz+bDpTo+GHgttSO8lgAfBRpxIntea19MWsqqA0U6NZysqIp/ygic/IoqHR8MvJbaEV5LgI8CjTgpq6njY++OOXKsRqeGZvjsV6DI/3T1jY06O5yM11Kg8FoCTBRoxM+2wqPWHpk0z7qDxTovxMKrKFB4ObWC11Kg8FoCTBRoxE9VfQNnQreetKyDpdW1Oi/EIq8i/inDPbycWsFrKVB4LQEmCjTi6sixGv7GaiVcfMPF7uJya24kZjhk2CZeS47htQRYKNCIt+zSCmvXTLxsKzyqM0Kr6hsbOXu1zcg71bKaOh0ZWsBrySW8loDmKNA4DTJL6NB2vjlCew5A/jrndKDWwwUTHPFaajO8loDmKNA4PY4cq+EvLS9pWQezSyt0LnBWUFltTZL42V1crmOCA15LrYTXEhATBRqnTWVdPV8GtupAER/Nabf8iipOqW8eGk878FqKGV5LQEso0DjNpD4mZ41esb+woLJap4D2ktcP57D6kQrIv7a3G68lM7yWgNZRoBEKtQ0NeeXHpEmvOlBk7ccTKV/mHVl3sDi7tKKqnm/q7jAyTC7oK5GXFp/0OkW8lrzwWgLaRIEGkAgq6+o3Hy5Nzn+F/zq/qKiKb6/sMLyWdBAAWkaBBpA46hsb8yuqpP2sOlCU2AVoxf7CjQUl+8oqaxv414xOwWsJQCso0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAAAKgQAMAAAABUKABAACAACjQAAAAQAAUaAAAACAACjQAAAAQAAUaAAAACIACDQAAAARAgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEEAYC/ToJ+b8049S5qSt0z93Ta9/sEKexfgpC/TPAAAASAinrUDX1dW/M2/N5bdMPFx4VBcdR4EGAABAaJ22Al1VXfufl47+3k+GUqABAADQhVCgOwsFGgAAICGdngK9asNuKZdmzCbtFeh35q0ZNzn1X7uPkN+fd/XD67dkebd66urqZ8z60rtVcvktE7/bvV9va9Wny7ddcP14b6t/PnvQwPtez8k74t3kVV4/5/527KTpiyuPVXu3iuzcw/ITz79u/NGyYyPHv+utJo/Tu3XZmu1X3DLRWygP2FvBL9DygP2nI5EH7G8IAACALiS8BdqKlF2/Q0sZvWHQ1OYrtH7QOuZWEr/jegfFrVtvGvK8d6vwCrSUY78o+4/KKt9+vDuP+aO7+iF2AACA5BTeUzikmy5Yuln+mHug0Ou1fpf1Vuh7zyvewWOppy+8+bksiXlvPutuhdzz9QOntLTJp8u3eev7xd0r0N4P8g54Z+QUyK/++4GHnp7rHbGWe/ZKtlegvQ3NuwIAAEAX1TXOgfYa6vnXjZd66m3o/V5vjmq+lcnbKlCF9Q8b+/cZswf7q1mnO5vnQLfyZAEAANC1dL0C3fz0DzMtFWjzHnRRLPmHSswzla379Aq09ZhjLhTWhwj949nWedUAAADoWpKrQJsnNDfnn6FhxSrQVguPuVA0vwpH7oHCq/s9491n33teoUYDAAB0RV21QLdehZsz70EXncw/E0PW8S/oYT2SVgp0m0egfd5B7tYfDAAAAEKr6xXolgpr67ytWjkHOmY5dinQ3hOxHrBoqUALr6zzmUIAAICu6DQX6JgVs/UCLX/0Vjjv6of9Q8U7M/PveOSd1g/oeltJbTWvwnHvP+Z4LTZmw3Yp0MK/Z//SznLPMT9Z6GmzzQMAACC0TluBFl7v9GNdpa6VAi3l278Ss582+2jMrSR+x7Uejx//gbVUoFu6Z0krd978fgAAABB+p7NA10W/nM8vlAPve90rlG0WaOFtK3XW27b5twbGJFuZ318oW5nfRGg+HqnjctO3u/KkGfvVvKUCLazHc/ktE81vIpRb5Y/WNyDSngEAALqi01mgAQAAgC6HAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABHD6C3TJ0co3U1eNn7Lgmv7PXnHrpDMvHOV933Vi5PvdR8iTkoydnDpj1pf+14YDAACgizqdBVp6szRLq3EmfHpe++jE6Yurqmt1CgAAAOhSTk+BXrJ827lXjrOaZVLlzAtHzZj1pY4DAAAAXUe8C3RVde2tI2dYbTJpc8kfnzh4uFRHAwAAgK4grgVaymLPax+1SmSS58wLR23Zvk8HBAAAgNCLX4HOyTvyo8vGWPWRSM7oNmRteqaOCQAAAOEWpwJdVV3LsedWcuaFo7hABwAAQJcQpwJ909AXrMpIrMgbDC7NAQAAEH7xKNALlm62yiKJmYnTF+vIAAAAEFadXqCrqmuT/Ip17jmj2xAuygEAABBynV6gp7y+1KqJpJXc/fhsHRwAAABCqdML9CV/fMLqiKSVnHnhKB0cAAAAQqlzC3RO3hGrIJI2wyXtAAAAwqxzC/SMWV9a7ZC0mbGTU3V8AAAACJ/OLdApY2Za7ZC0mStunaTjAwAAQPh0boG+pv+zVjskbebcK8fp+AAAABA+nVuguYBdO3JGtyE6PgAAAIRP5xbo73cfYbVD4hIdHwAAAMKncwu01QuJY3R8AAAACB8KdBij4wMAAED4UKDDGB0fAAAAwocCHcbo+AAAABA+FOgwRscHAACA8KFAhzE6PgAAAIQPBTqM0fEBAAAgfCjQYYyODwAAAOFDgQ5jdHwAAAAIHwp0GKPjAwAAQPhQoMMYHR8AAADChwIdxuj4AAAAED4U6DBGxwcAAIDwoUCHMTo+AAAAhA8FOozR8QEAACB8KNBhjI4PAAAA4UOBDmN0fAAAAAgfCnQYo+MDAABA+FCgwxgdHwAAAMKHAh3G6PgAAAAQPhToMEbHBwAAgPChQIcxOj4AAACEDwU6jNHxAQAAIHwo0GGMjg8AAADhQ4EOY3R8AAAACB8KdBij4wMAAED4UKDDGB0fAAAAwocCHcbo+AAAABA+FOgwRscHAACA8KFAhzE6PgAAAIQPBTqM0fEBAAAgfCjQYYyODwAAAOFDgQ5jdHwAAAAIHwp0GKPjAwAAQPhQoMMYHR8AAADChwIdxuj4AAAAED4U6DBGxwcAAIDwoUCHMTo+AAAAhA8FOozR8QEAACB8KNBhjI4PAAAA4UOBDmN0fAAAAAgfCnQYo+MDAABA+FCgwxgdHwAAAMKHAh3G6PgAAAAQPhToMEbHBwAAgPChQIcxOj4AAACEDwU6jNHxAQAAIHwo0GGMjg8AAADhQ4EOY3R8AAAACB8KdBij4wMAAED4UKDDGB0fAAAAwocCHcbo+AAAABA+FOgwRscHAACA8KFAhzE6PgAAAIQPBTqM0fEBAAAgfCjQYYyODwAAAOFDgQ5jdHwAAAAIHwp0GKPjAwAAQPhQoMMYHR8AAADChwIdxuj4AAAAED4U6DBGxwcAAIDwoUCHMTo+AAAAhA8FOozR8QEAACB8KNBhjI4PAAAA4UOBDmN0fAAAAAgfCnQYo+MDAABA+FCgwxgdHwAAAMKHAh3G6PgAAAAQPhToMEbHBwAAgPChQIcxOj4AAACEDwU6jNHxAQAAIHwo0GGMjg8AAADhQ4EOY3R8AAAACB8KdBij4wMAAED4UKDDGB0fAAAAwocCHcbo+AAAABA+FOgwRscHAACA8KFAhzE6PgAAAIQPBTqM0fEBAAAgfCjQYYyODwAAAOFDgQ5jdHwAAAAIHwp0GKPjAwAAQPhQoMMYHR8AAADChwIdxuj4AAAAED4U6DBGxwcAAIDwoUCHMTo+AAAAhA8FOozR8QEAACB8KNBhjI4PAAAA4UOBDmN0fAAAAAgfCnQYo+MDAABA+FCgwxgdHwAAAMKHAh3G6PgAAAAQPhToMEbHBwAAgPChQIcxOj4AAACEDwU6jNHxAQAAIHwo0GGMjg8AAADhQ4EOY3R8AAAACB8KdBij4wMAAED4UKDDGB0fAAAAwocCHcbo+AAAABA+FOgwRscHAACA8KFAhzE6PgAAAIQPBTqM0fEBAAAgfCjQYYyODwAAAOHTuQX6jG5DrGpIXKLjAwAAQPh0boH+0WVjrGpIXKLjAwAAQPh0boG+4tZJVjUkbUbedej4AAAAED6dW6BvHTnDaoekzVzyxyd0fAAAAAifzi3Q46cssNohaTMpY2bq+AAAABA+nVug16ZnWu2QtJkFSzfr+AAAABA+nVugBZ8jDJQzug2pqq7V2QEAACB8Or1A3/34bKsjklZy09AXdHAAAAAIpU4v0AcPl3I1aPds2b5PBwcAAIBQ6vQCLSZOX2zVRBIzHH4GAAAIv3gU6KrqWs6EbjNndBuyMzNfRwYAAICwikeBFlINv999hFUZiRkuvgEAANAlxKlAiyXLt1mVkfiZOH2xjgkAAADhFr8CLRYs3cwHCpuH9gwAANCFxLVAiy3b93E+tB95O8GZGwAAAF1LvAu0OHi4lItDS24a+gKfGgQAAOhyTkOB9uTkHUkZMzM5z+i4pv+za9MzdRAAAADoUk5bgfZUVdcuWLpZmvQVt05K7DJ9yR+fuHXkjDdTV5UcrdQnDwAAgC7oNBdoAAAAoGuhQAMAAAABUKABAACAACjQAAAAQAAUaAAAACAACjQAAAAQAAUaAAAACIACDQAAAARAgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAAAKgQAMAAAABUKABAACAACjQAAAAQAAUaAAAACAACjQAAAAQAAUaAAAACIACDQAAAARAgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAAAKgQAMAAAABUKABAACAACjQAAAAQAAUaAAAACAACjQAAAAQAAUaAAAACIACDQAAAARAgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAQFiMfmLOP/0oZU7aOv1zKFGgAQAA0KK6uvp35q25/JaJhwuP6qLORIEGAABA11ZVXfufl47+3k+GUqB9FGgAAAC0iALdHAUaAAAAsa3asFvqrBmzSWfnHv7X7iPOv2780bJjI8e/663wzrw1r3+wwl9fcu5vx06avrjyWLW3lairqx83OVW29Va4/JaJspV3k1eg5Y/+Cudd/fD6LVnerSFBgQYAAEBsLgVaCu4Vt0z0bv3nswdJ2fUOWvubeLlpyPPeVtKebxg01brVP+TsFWgr3t16K4QBBRoAAAAtauUUDq9AS8GVW7/bvV+WZOQUeDeZPl2+zSzB3lYtdWKvQMutC5Zulj/mHij0urjfv8OAAg0AAIAWtVmg2zw87B9y9g4zt35SdfNzoL2j4OdfN948CeT0okADAACgRW0W6Jg35R8qMc9y9uLXYv+YtHVutKBAAwAAoGtrs0A3r7b+qR1WzFqce6Dw6n7PeMv73vOKfw8UaAAAAHRtQQu0f8KGLPdOjBbNa7HHO1Bt9mMKNAAAALq2oAU65sKWCrTwCrd/IjUFGgAAAF2bV6Clwo6fskAXHddKgbY+WdhKgbbWp0ADAACgy/NKrR//inIxC7Sw1vfjb9h8Bf9OKNAAAADo8rwvDvTL7sD7Xve6bEsF2lz/n88eJOt/uyvvilsmeoeZ5daR49+94Prx5gr+PVCgAQAAgERDgQYAAAACoEADAAAAAVCgAQAAgAAo0AAAAEAAFGgAAAAgAAo0AAAAEAAFGgAAIIk0NDSUlpYWFhbu378/Ly8vKytrdwLJyMiQJyWOHDlSUlJSW1urT7tDUaABAACSgvRmaZbaNJPG3r17i4qKGhsbdQodgQINAACQ4CoqKnJycrRRJqWsrKySkhIdxymjQAMAACSsxsbG/Px8bZFJLzc3t66uTkdzCijQAAAAiUnK4t69e7U8IiorK6u6uloH1F4UaAAAgARUW1ubnZ2ttRGGPXv2HDt2TMfULhRoAACARNPY2Mix51ZkZWWdygU6KNAAAACJ5sCBA1oV0QJ5g9HuS3NQoAEAABJKeXm5lkS0qqioSEcWEAUaAAAgcTQ2Nib5Fevc7dmzp30X5aBAAwAAJI7i4mKth3Bw+PBhHVwQFGgAAIDEkZubq90QDrKysnRwQVCgAQAAEkRtba0WQzhrxyXtKNAAAAAJoqSkRFshnB05ckTH54wCDQAAkCAKCgq0FcJZXl6ejs8ZBRoAACBB7N+/X1shnOXk5Oj4nFGgAQAAEgQXsGuHPXv26PicUaABAAASREZGhrZCBKHjc0aBBgAASBDaBxGQjs8ZBRoAACBBaB9EQDo+ZxRoAACABKF9EAHp+JxRoAEAABKE9kEEpONzRoEGAABIENoHEZCOzxkFGgAAIEFoH0RAOj5nFGgAAIAEoX0QAen4nFGgAQAAEoT2QQSk43NGgQYAAEgQ2gcRkI7PGQUaAAAgQWgfREA6PmcUaAAAgAShfRAB6ficUaABAAAShPZBBKTjc0aBBgAASBDaBxGQjs8ZBRoAACBBaB9EQDo+ZxRoAACABKF9EAHp+JxRoAEAABKE9kEEpONzRoEGAABIENoHEZCOzxkFGgAAIEFoH0RAOj5nFGgAAIAEoX0QAen4nFGgAQAAEoT2QQSk43NGgQYAAEgQ2gcRkI7PGQUaAAAgQWgfREA6PmcUaAAAgAShfRAB6ficUaABAAAShPZBBKTjc0aBBgAASBDaBxGQjs8ZBRoAACBBaB883b799ttly5alpqa+3YLZs2cvWbJE1w4BHZ8zCjQAAECC0D54Wq1bt27q1KnjHchqsrJudlrp+JxRoAEAABKE9sHT59tvv502bZoWZAdPPfWUbnla6ficUaABAAAShPbB02fJkiVajZ2lpaXpxqePjs8ZBRoAACBBaB88fVJTU7UXjx//2muvSZ+OyTxK/fbbb+vGp4+OzxkFGgAAIEFoHzx9pA1rLx4/XoqyLm1m2bJlulK0Z+vS00fH54wCDQAAkCC0D54+FGgAAAB0JdoHTx8KNAAAALoS7YOdYN26da1c19n31FNPaS8eP37atGm6tBnzHGjZRJe2bPbs2enp6fpQOoGOzxkFGgAAIEFoH+xoUl4nTJighff06byLRuv4nFGgAQAAEoT2wY5mXlvjNHq7067XoeNzRoEGAABIENoHO5o0V+2wp1XnnS2t43NGgQYAAEgQ2gc7GgXaQoEGAABIENoHO9qSJUukvJ52qamp+oA6mo7PGQUaAAAgQWgfREA6PmcUaAAAgAShfRAB6ficUaABAAAShPbBzrRkyZLIlZnjJS0tTX9wZ9LxOaNAAwAAJAjtg51JSq1+pi8uXovL9xTq+JxRoAEAABKE9sHORIEWFGgAAIAEoX2wM1GgBQUaAAAgQWgf7EzNC7QsWXLctGnTdKlBb4vSRYapU6fqbUuWzJ49W5ceR4EGAABAJ9I+2JmaF2gpvnpbC8en9bYoXWQwK/KyZct06XEUaAAAAHQi7YOdiQItKNAAAAAJQvtgZ6JACwo0AABAgtA+2Jko0IICDQAAkCC0D3YmCrSgQAMAACQI7YOdiQItKNAAAAAJQvtgZ6JACwo0AABAgtA+2Jko0IICDQAAkCC0D3YmCrSgQAMAACQI7YOdiQItKNAAAAAJQvtgZ6JACwo0AABAgtA+2Jko0IICDQAAkCC0D3YmCrSgQAMAACQI7YOdiQItKNAAAAAJQvtgZ6JACwo0AABAgtA+2Jko0IICDQAAkCC0D3YmCrSgQAMAACQI7YOdiQIt4l2gDx6reXdv4cbCMv0zAAAAOoj2wc5EgRbxK9BSnd/LOnTn2oy7dhRO+CanXhcDAACgY2gf7EwUaBGPAl1cUzd/X+E9GzJHpO8fui5zyJrdwzdkrz10VG8GAABAR9A+2Jko0KJzC/TRmrqP8wof2Jwj1XnYuqzBq3Z6uX3Tvsc2ZdXUN+h6AAAAOGXaBzsTBVp0VoE+Vt/w+YHih9P3jticO3x9tl+dNat33b5x78r8El0bAAAAp0z7YGeiQIuOL9A1DQ0rD5Y8tmXv7Zv2Dd+4V7qy3Z6jkVsf3ZRZxUFoAACADqJ9sDNRoEUHF+jNhWUTtklvzpHqPKSF6uxFbpUO/RUHoQEAADqI9sHORIEWHVyg39mTP2pn0ZDVu6UiD2pWmq1IgX54Y1ZFHRfkAAAA6ADaBzsTBVp0cIE+XFVz99o9kc8Lrtw5dOWOlBU7Bq60e/OJrN51++bcLw4U68YAAAA4BdoHOxMFWnT8OdCp2QXDNufd8/Wut3fkTkzPGrZqZ3+p0VZ1Pp7hG3PGrs+oqOUgNAAAwKnSPtiZKNCi4wt0YXXtqHVZL+w48HFW/qKs/Hd25v59Y8aQlTv6L98+qPnR6NW7RmzOW5JbqBsDAACgvbQPdqbmFVmWSPH1SN/VpQa9LUoXGaZOnaq3LVuWmpqqS49LlgItlu0vWpBX+lFW/oLM/LSs/LTMA2/tyH1kw55BK7f3X7HdOjd6+IacBzZklHMmNAAAwKnRPtiZYh5j7jxJVKBrjjy9Mn/bvMwiKdBeIjU6K//17bkPrZcaHTk3+kSNXr1rRHru4twjujEAAADaRftgZ5o9e7Z227iQH6c/uDPp+Jx1QoGu3ta0939m5Dz0QUaZX6C9LMrK/ygz/5Xv9t6/bvfglSc69LD12WPW7ynlTGgAAIBToH2wM6Wnp2u37XwTJkxYtWqV/uDOpONz1gkFuuCOpkP/WpVxzpKM9LmZxVaHXni8Rj+2cU/Kyh16EHrVzhHp+z/ad+IgdE1NZ5Xp3P2HHnr89TEPvXz/wy/f99DLDzz8yrfbs/W2rq+w6OijT7xx30Mz5Nm1ntHjps9duEI36zoKDhWP/8eb8h9uzEMznn3hA10KAACitA92snXr1s2ePfu1TiY/Qn6Q/shOpuNz1tEFunpL097/bNr3g6asM3Zl3Bc9CH3Q6tDSnj/cc2DU17sGGAV66PrsezdlbtldMG/O5skTPnvskY+ffGLpG69+/c2WvIaGRr3zjvDSy/O7nT/o7B79vcjvxzw4XW/r+vZk5J3Vvc85PVP8J9hSuvUaPPSuZ3SzrmPLtoyzzrvtnJ4Dzu6Z0uuXg3UpAACI0j6IgHR8zjq4QDfmD246dGZT5g+aMr9fnXnWpxkbmx+EXpSV/1R6Vv/l2/32PHD1ziErdzy3+LuJj38+uN/7I4bMv33wvNsHz5ffDBv4wYtTVx4+VK4/4NTU1zfcdMtDZ/Xo9+PzbpOiGfm1R99fXnlHYWGprtHFZe/N737xQO+p/fi83tIyz+k1IGbOvWDokDuf1s26ju07c86LPsGzuve+4r/v1qUAACBK+yAC0vE568gC3XhsXWPO/27aK+05moz/kZFx9weZJx2ETsvKf3/3/jtW7xx4/PDzoNU7B6/c/uKHWz56Y9Ps1zbeOezDAX3eHdz/PS9DUubcMfSjR8YtPnK4Azr0pvRdPzm/31nd+5530YCrbrjXa5nSoRd98rWu0cXt3VfQ65eDowW6908vTLn/4ZcnPzdnwlPvNs+TT8/+ZOk63azr2LFrb/dLBnkF+srrR+tSAAAQpX0QAen4nHVogc7v33Toh9qeowehazJ+9FnGutTMEr9AL8rKn5Se1c84/JyyeueEj7bOn7nxw7c2z393y9NPfN6/99t+gfYiHXrKM1/W1TboT2qvp6e+f3bPFCnQV11/7yefrf/ZhQOkh53ds//osS/pGl1cbt6hCy8fFu2XfS++4vYjiXJk3bdz974ev/AKdJ9rbrpPlwIAgCjtgwhIx+eswwp047HVTdn/T1OO356jyTgjM+OODyMHoaOHnzPzZ+/OGxE5/Hzi5I07v9z+3jub5765WQr03HfS35u54a7bTzoILRmSMmfYwA/TN+XpD2uXqqqaq2+676wefaONeVpDQ8MNfxknf5SuedGvhx0+EqBr1tXVlR6tqKqu0T+7qaisOlpW6XhCd319Q9D7Fwfyj/ziNyO8Av3Lq0buz++siwNWVla1YwLtUF1TW1tbp39oatq1J9cv0Nf9aawuBQAAUdoHEZCOz1lHFejGxgN/O/nws5d/rcn4fz/PWJWaWeodfn5y80lnP6es2fnY4q3zXt8k7dnL/Flbnv3HFwP6vDOo34kCLbl98PyXp63Sn9Yua9Z95xWvs3v0W7gocldPT51zds+UyLnCPfrOi3VJimXL0yc+N/vpF95/7qXU4pIyWfLNt5mPPfnWrSmPX3vzA3+67dExD077ev133soeKXyvvrFo8tQ5k56b/eH8r2RJfX39wsWrR9w95aZbH5at+gya8NyLqQWHirz1LQ0NjZ8t2zjmwRm3DfjHn3o/OmjEU9NeXVhwuFhuWrBolTyYyc/PmTJtbt7+w976lgMHCy/73Z3SnuWNwa+vHlVwKLJh69Zt2D7x2feeeeH9SVPmbPtOL0iy9dvMGTM/uv/hGfc9NGN3Rq63UOzLK5DHM/iOp/5wy0PyXG6+7ZHb757y3gdfFBdHhmPalL5bJhC52+fmyO91qeG7HTmTp8zxVli+aqsuPa64pPyt9z4ddtezf+oz/pZ+j42894UFaavq6urz9h/qdWnkHBXJjX99UNcGAABR2gcRkI7PWQcV6MqvmvaeaR9+1pyRnTHsw8zSj7IOvrcr7/bVuwYeb8+S/mt2Tpm7Zf7rkfM3vMx9J33OzA2jbk+1DkIPHzT30QcX1de1/yyOxye+FTl/o0ffiy4f7hXQteu3d+vVVwr0OT3733nv895qpnvGTjun16DoWR99tn2XNfOtxeddNNC7BIS08LN79D+nZ8q55/ef/tpC3aCp6Uhh6U8vTJF1zuk14C99H5MfNOj2yVLQI5v07B/Zqmdkqyuvv3frt1m6zXEHC4qGj3rurB59oit7dzJQ7uc3197z5fLNKcMmyR9lc+nHX63cotucTKr25VffFTms3qPfVdePLio+qje0bOIz7517/hB5YN16DUpdsLy0tHz0uOnn9pJnJw81RX7iwkWrvTVfe2vxxVeM8J519JOIJ0bxuxvv+/TzDd5qHnmT0C16t3Lnz734oS41vPHOJ+dELofSr9v5gx949BVdGiXvSa754wORcXlziAxhoKw55I6nV67eeokeYu9zc+9HdAMAABClfRAB6ficdUiBrmvc/6emguaHn738W23GfyzL+GpB1tEJmzP7rzhx+FmSsnrHix9umf/GiSPQkvmztjz35LKU3u+cXKBTx45ZWFFerT8zoLKyyiuvuydSCnv0H3r86hPHqmqu+UPkpA5pYxdcNkT6q7fcN3b8q7L+j7v3/tmFKcPvelZWkz7nrR/9Vcp35Doe8pvPv9rsbVJaWnHR5bdHjgF373PdzWP/dNsj0ZYZab2RzXv0O6t7b9lKOqj86JLSE5+MLD1aIYVbmqL8uOjKfX/+q2G/vOqOyMrnD+z5i8G/vnpU5OfKnXTvvWbdSYe9fVLff3vtPV6BvvoPY8z7b8nUl1LlEf74PHlsfae9uiBl2EQpx5FBReq+dOUBi5asldWefHrW8WcRyWW/G3njXx+UtyLRZyTbypp956ed+CeCaa8uPDtyt7fJry+9skCXGt6dszQy28gKKY9PekuXNjWt37ij12XSvOWm3vIsuvXsI+8ffnnlHfJTZDhX/Pfd0SPQMqI+t/T/u24DAACitA8iIB2fsw4o0I0VS5tyWzr87OV/7M8c8M7uwmGrdvsX3/DSf7V3BPqkAp36dvqc1zfec8dJB6GHD5r78Ni02rp2fsHKl8vTpZBJN5XC9/7cZbpUe2H0LI7ufb0zLkyPPP6GV/IkkZrYs/8fbnkodf5X6d/smf3hst9ce7fcm1cBbxv4D++xlZVXXvpbaXuRbh25KdqY73/45eWrvlm3YceEp9/96c9T5GFEzxvp//bsT70fJJ6Y9LY0V28Tqafz01buyzsknX5T+u5hdz0bLa/R6+5173Pu+f3Wb9qpm52suLjsdzeOkQItd3L9n8c2NLR9wP7Fl+dHC7R0+j7n/2qo9zR7XDKo/9AnH3n89Scmv5Obd2jxkrWRa/9FinLfS34zQoqyPLDy8mO5+w9Nf23hTy5IiXwWs0e/npcO2bl7n3e3r76xSN4kRO825eWZH3kLTUaB7j/xmfe8hfIuQnp/9L9I5J3J8FHPfbMt4/CR0vyDhZ98tu7K60Z7/7Gic+jbe+AT3lYAAMCjfRAB6ficnXKBbqhrzLux5cPPXv6tKet/v7T5076r9prtWZKyZufji7fOPblAS+bP2jJ14rIBfU8U6NsHz5/2wkr9ocGNfeQVr4P2unRwzr6DujRyYvS3Z/XoE+l/PfvfPupZXXrcYxPe8gu0/OZvA56Qhqe3RT/QdumV0ROOu/fpftGAPRmRzzhKrfTOQo5u1fvHPfq8+uYib32PtMmze0ZqtzRLacaNjZFPFWZmH/jphZETRSQ//9Xwb77N9Fb21NbWpQyb5D0SWeGnF/bfsnWP3nayo2WV1/1prJRdaZ+XXzNq0Sdff7Zs46efb7Cy5LP1y75KL684JptMf00eT6RAe3cuFVke1Y5de707FPKMIgfve0aONP/swgHWOd9CnpH8OHmy8oxGj5vmLZz59scyUrlPqbyvvbXYW2g6XqAjzfvpqe97C9+a9Wl0q8i7i76DJ9TU1HrLPbsz8i6Onr8Rfah9+w55Um8AAABR2gcRkI7P2SkX6Iq0xrx/b8r5X81Ks5EDP2w6cPn6g3sHrs4esma3WaAHrt45ctl3c97elBq9Coef1LfTP3hz0+iR8wb0iZzIMSRl9vDB89avzdEfGlBh4VHvzGApZ/2HTjS/2rCiour3N46JHieOdOvcvEN6Q9QTk9/xa2vPXwzZsUsPr/rGjX/1eOHrt3zVN7Lk2LHqK665O1ooI527/1C75BWXlEUadvTEj2tvfsBrsdNeXSD34N3PY0+eOJ/Bt2HzznN7yQ+KNOzzLhrQ0tePV1Qc+8MtD0bvKlqIz+sdPdvBztk9+vz4Z7et37hDNnntzcXeEd/oA+43bOSz1dUn1dYln6/37vDsHil3PxDjen+Vx6p/d8O90rzlGf38V8P25RbIwrffkyocPbTfs/+bs5Z4a5pmf/iFX6CnvJgqS6Qu35ryeGSe3aWL91v19TZvTdMzz0cuRBh5aj369h82SZcCAIAo7YMISMfn7BQLdF1j3vVNud0adv9HU2YLHTo7WqDLZ8vaE7/JuX3zPrNAD4peB3rygm8WzNyYahRoyfx3t7ww+auBfd8d1O+9O4YunPSPpdXVJy5nFki0AvaNnr/R94N5X+rS456aMtsvwe998IUujZr43GyvQMuvw+6yj0+LV95Ii9xzdNtFSyLfxnKsqvo312qBll8XRC/3Yfnj3x6R9aVuXn7NqJLSyCHtgSMmeY9B+nHM4lhTU3e1FH3vaPclA/0zJSzRAv2Q13ejj6q/3G2M9Iqcyf31um9lE2m3siTyaLv3Of+yIXuNw/MeKfRSnb3H9t4Hn9fXN8ibBD9VVTUNjY133ffC8V7bb3F0Du/O+cwv0O+8t9S7K9Ps1GXRnxsZ3fPT58mSvfsKelwS+ZZBWXLldfeYB/t9a9dvP7dXv8hp4j369h08QZcCAIAo7YMISMfnLHCBbqyoqdtfXLNtf9VnOysWralY+uHRRZ/Vbbu0Kfv/tKuzl/wfNu67sqmxSrZNLywbvj7LOgg9aPXOoSu3z3g/fcHrG83j0HPfTpdf7x05d+iAeffdszAvt8R7AO0w6v4XpUpKM+vWs8+8hSs2pe/esGmXF/n9yzPT5Cav6g0YPsk7p8LzzAsf+EdJZ7wW40TemW9/HDk5OLqCV6CrqmuuuuFeqXdynz1+MTAra7+3punPfcbL+rLCZVfdWVZ2rKam9ro/jfWWnHfRgMysA7reyUaMnuo9i56XDt4dPV2kOSmd1978gPeQfvrzlBv+Mu4Pf33wxma5/s/jbr7tEe+A+qwPPve6r9z5naOnevdj6jf0yegdRg5RX3rlnVdeP/qK/77bzJU33Nvr0iHRE7sjJ2xMnT5XtoocYPb6cc+UWe9/7t2VyS/QcufTo7Ndu2G7/ofo0b/3wH94q1n25x+56Irh8t5D1uQcaAAALNoHEZCOz5lrga4vLK9I3XR0xlelk5YUjZt/7P4F1eMWVc3eWLrwu+IP91StHdyU9T27Okuyf9C0/4eNZZFGJRoam57auvf29FyzQEsGrN4xfMX2KfO2pL65af7rG+e+uWnum5vl17R3trzy9Iqnn/xi3762r2fckoJDRRdHK1fk+Gj3287t1ffsHr3lN17k9+f0jJxTG721z/m/HJKVk69bNjVNnZYqvTZyvLN7n48W69XcTK+91axAV9Vc/YfIx/jkJ1561Z1Hyyq9NU1/6v2oV5d/9buRFZXVRcVHf+1de657H3moe6OnQDT30N9fk8Yp6/S6dFBmdoxeLoqLy7z6Lvf/3zfff6SwpLKyqrzimJWy8spjx/R6Ju/P/TJaZCPd96VXY1wu40bjnBBZJ3pRuchF+oxELq4n60i69Rp0z9jIadBz/APMPftLmfbuyjRHf27kWPIrb0ROE/946Tp5dt4mQ0c+461mKT1a+curvBNguAoHAAA27YMISMfnzLlA5xZV3L+g8aFPqsZ+VHbf/OK73y966uOSjzaWLthYMve7sqVvNmX+e1PW/7QL9MEfNuZe3dR44tpzW4vKhnydMeTrPVaHHrg6UqMfWPqt1Og330t/9930t2ZtnjZ362NLd3x3xP6SjkDmp62MHkWO9D+vCjePd/Q0UhAjV8Y4cb7B8zPmRbpjdKvFn0T6saV5ga6urr325vsjh0h79L30yjvKKyKH3i1mgZYiW1h09Fe/1wJ94a+H5exrqUDPlGYp6/S6dHBGrAPbInIZu+tGewX6uj89IG1eb2jZnNQvo/OJ1FbzqiC+G//qFWh5jr3/0ufR/kMn9h08oaXcmvLEq29GPjLYZoH2D1HLAGe8HjkC/fHStZH/FtFNBt2hlxq0lJVVXva7kd6s/txnvC4FAABR2gcRkI7PmWuBbqyqLX1mac3YtKJ7Pywa/UHhvR8Wz1pd+tEmKdCl89NL5m+u2fL7ppx/Oak9Z/+gKfcHjeUnvmRENDQ2Prdt34j0PKtAS7zzoQes2jlkxY7hy3cMXbF94KodQ7/Je3HHKX2D9/BRzx4v0N7lz6QN2/FvlabYZ9CJkwemvHTiCPSiT9boUoOURb9Ap0VXkM76+xvHaIG+6o5Wj0BHrqZcXn7s+HeMRyr1uef33bXnxDf/me4cPVWapazT89LBLa1jfpHKNTeddJ3plsya85l3ivPZPVPeePcTXWqQgUQfbZ9zevTZsjVDlsh/RCvemqb3ImeGaIGWMq1LDdGj+1qgp0WPfK9as1V+irfJLf3+bp5L48s/WHjxFXqZ7T/+7WFdCgAAorQPIiAdn7MA50BXpG6qf3BxpECPer/oqU9KvPYcTcm87WVL32jM+J9NWf92okAX/LAx9zrz8LNne0nFsLUxDkJ7kRo9aPXxrNo59Os9Q9fs2VES4/NkLvYfOHLBZUOkbElLu+EvD27cvEsqYPo3e8xs/TZr5Zptl0a/qkNy3sUD/S+vnvzcHK8fy3Lv278tkWvSRU4OiZyH4H1eUNrwldFjwFLyfnHliJifhPvjrQ97BfrSK+8sLol03N6Rkuq1yb6fLdvorWaqra275o/3R++2T/eLB+5sdj0Qj/TLX14VuQq1POyrbri3+TdsN/fmu0ukOkdra8ob78Qo0A//fWbksUXfaSyKdRhe5OYd+uyLjV98tfnLFenexyIjBVoPbMc+B7r3oAnebGUUz0dPm87I3P9fF8g7hEillrcBRwpLvTVNGzbv/K8LIm1ecsNfxulSAAAQpX0QAen4nAUo0LU7Dx69b17JvamF988tfm+NHn7WbCpO/e7YmpFNOf9HU2b0RI6cHzTt+0FTRYxCJl74NvZB6JgZkb7/uW17YxyNdBCtcdGW1jNlykuRa6W15P6HZ0R7ZOR7PV5762Nv4eOTvMvYRQr0vIUrvIWmF1+Z712FQ6qt9z0slceqI8eAI4dI+/7ityNKov3Y1NDQcP2fx3nHdC+6fLhXEyc8PUvrZo9+Yx952VvTtHVb5k8i5TJa8Vu+jN3+A4ejB2gjbxh+e93omB3U4l/GTn71n7hp4aLVx6tw//sfOek7t33DRz0X/bbt/medd9u27yKPbUHaKnkY3uQnPP2ut5ovfeuen100wFtBHupzL0W+67ui4tgN0cl4c/jsy03eyqYXZsyLHtiOnLB+7c0P6FIAABClfRAB6ficBSjQjTV1xU9/WjVmQdEzS8zDz5r5W4rnb6zZ9Jem7DMiHbrgzMa8PzY1xv7iwN2llcO+3jO0hYPQVoas2TNsXea2orbPRrA0NjYOGD7Jq6rnnt9vXfSyxy1ZvOTrH3ePXOrurB79/5byuHf+wKNPeN9EKAU6xvcUCv2UYaTw9fVOVCgvP3apdwxYCvRvRhQV2ceA6+rqr7npPu9RnX/ZkEOHI1cX2Zy+2/s+F1nY/eJBGzfv8lb2NDQ0Rr6MMPJIIsXxpxempH8T+4tUcvMO/Tz6bYJS6C+/elTBobY/fDnjtYXeNxFK0301+mE+S2FR5CrakafZvU+PSwZJ99UbjpNH67VhuYebbnmoqjpy4vWWrRndekWOl0t+/fu7cvMOeyuLouKjf+33mPd0Ij+3R79nX/jAu+npqXO87y+U/wq39HvcuiK1PLvLrhopg43OoffvbrhXbwAAAFHaBxGQjs9ZgAItqpbvqnpoccnsr0vTmhXoyIkcW0vmr69e37tp7/ea8v69sSLGP9z7pm3PHZG+3+rKLeX2zblPbc2pj3VSbCuycg5osevR9/c3jqk++WvtLIVFpb/4ze3eORL/9fP+3oWWH4ycvRDpx7Kw+QWkxdNT3/fPQ5j1/meypLS0/PhJun0vvmL44SP2MWB5GH6B7vmLwV7HrW9oiFTk6Fd5R7vvXQsXrZKHVFlZtXVb5sgxz5/t9lXee/cV9Lp0sKwjP/2XV925/8CJ2toS46u8B7zyepouPVnkUnfeG4kefX9z7ehFS74uKS2vqaktK69c8vl6WRIptdHrNy88fq0S6b7X3fyAHi2OfK/4uPlpK6X3z1244qZbH/aejpRguVV+//SUOd5W3huA6MwjxXrwnU9v2bpHGnlFRdVXK7fInXgPNXKf3Xv/9rrR3lYAAMCjfRAB6ficBSvQjZUNJe+uq/rkO6s6+ymZ903x3C1NG/9enztct2lB5tHK4ZGD0BlWV46ZIWt2D12bmV4Y7HIckZMT9NyDlAlP2WcRNHfP2GnRwhc5V8G76vP9j7wSKXORA8N9Z8f6JNyTz8zyC/RbsyKXsDhSWHJB5BhwpEBfdPlw7wCz6VjkOndaoM+7eOCB/EJveXZO/q9+P+qcXt7x10iPlyJ+2VUjf/rzlHN6DZLf//dN90tJleXn9OizJvodKM3JnZx3kfeV4H0v+c0I70sBWzd12ly/QM947aRPfPoaGhqj37kY+fqVSM7rfemVd/z+D/dd9ruR0WP2kYVy698nnvQdivMWrpD5y4OJPqPovwNET18+J/o+YcDwST+LPNTIf52Jz8zSbWSrj1ac3TNyh7KOTEnezPz66rsuu+pOGfI5vQZKKb/gsqGRKt+9t7zN0G0AAECU9kEEpONzFqxANzWVVG99qGrxd6XzN1vV2Uh6+YLtpS99UfX5zvpDR3W7WF7ekTdiy/7Bq3ZYdTlmbt+cO/GbAAehj1VV/+GvD3Y7f7D0M6lxK6Lfs926hYtXSX+V9budP+jamx+orau/674Xzzl/kCyR6vZmrCtUPPz4zMiP6BHZxOvcBwuKzunZV8roOT0HSvfNP1jkrekrK6+U9il369XWHOOb/7Z+l3XTrY9IfZfiKI85cifRCy3/7sYx6zZsHzryGflZ50SeTr9lyzfrNifbk5EXaaiRnz7gJ+f3y8iMfbU705PPvHfuBUPkx8mv/qkUzdXV178wY94Flw2LPrzoY4vG++MFvxo27ZUF9Q0NunaU/Lea/NxsqfKyjhToyJOKTHLAeRcPemvWkq/XfStLZODdLhjyyBNv6DZRH8z78sJfD4/+h9NNvBOs73ngpfWbdsq7jsiSnim9Lh2sGwAAgCjtgwhIx+csYIEufq6p4N8qvphanLqzWW8+nrRNRTOXH713fvW4tKJHFhx9ZWVl2jdVX2dWb95Xsy6nNuOQ3lVTU05Z1R3rMoaudT0IPXxD9obDrTVyk/TUl16Z/9SU9ydPmfPqG4sqYl2P2VJSWi4t8Kkpc2QrKYvVNbVffLVp8nNznp76/tPPv//djhxdz7ByzdbJU96XFeRX7xJvx45VS5OO3smcl19Pa34l5rq6+jffXeJt9eLL863r3B0tq5iTumz4qGev/dMD19x0X7+hT7725uLDRyKHsdM+Xj3p2dny2KTmtnRuRklJ+fPT58o6kpdnpsm96Q0tW7vhu8nPRR6MbGKde92cNPLpry3sM3jCVdff++trRl153ei+gydMf3VhRmaLlxqUrn/H6Oe97y+8/s9jH5/0jvcpw/yDhfJE5IfKKFau3uqt7MvKOSD/Cf424PGr/zDmhj+Pu/uBlz75bJ0sl/dFMjTv0ca86B4AAMlM+yAC0vE5C1Kg6w835fRqOvB/123vdnTRxyVzvytdsMFuzws3lizYWPj4R4V3v19074fl98+vHbe4emxaxf0Lyu6b3/Twp2Wvn3QxuJk7DwQ6E/of6dn17bseR1dTX99QXx/7I5hhUFNTV15RZX3IrxWyZkVlVcwrRreuTgZx8oFtAADQEu2DCEjH5yxAgW4serap4IdNWT9oyvle7dbLSxeuKZm3zSrQJWmbil9bXnjP+0WjP4xcMTqa4jGpJdHUPri49NmlTfUn+tC+iqo710YusmF15ZgZsmbP8PXZ61o9LQQAACBp7dmzRyshgtDxOXMu0PX5jXt7NO3/oX5JSs6/1Gy+sWTB2pJ5354o0NHDz0WPfVQUPfzcPBUPLCga/1HDkZMuSPfWnvzomdB2XY6Z2zfte3xzdk1DchyFBgAACCI7O1srIYLQ8TlzLdCNhRObDh1vz5H8r6bsf6lJv670oxUlc7efOPz86leRw8/NqrOX0jFzS+6bV5t50vm7+yur7/h6t/NB6N3DN+5dedC+tAUAAADy8vK0EsKZvOvQ8TlzK9B1+xtzftqU67fnEx26btulRz+ZV5y6q3RBesn8DYXjFxbdPcfqzX6K7/2w9sFF1evtR/luRv4dkYPQu6y6HDO3b9r36KasqiQ5FRoAAMBZfn6+tkI4y83N1fE5cyrQjUf+fvLhZyPZ32vc/f9VfvV42aL06plri+/5wCrNVmrGLapMs68oV1BVOzJyEDrL6sqxs3qXdOgv89v+jj0AAICkUlhYqK0QzgoK2v7eDItDga4/1JTTrSmvhQItyfp+097/q3bbzUffWF58z9zacYvK719Q3Kw6e6kem1b22kq9Z8OczIOuZ0Kv3nXntwUPbMgsrw3vRSoAAADi79ixY9oK4ay8/KSP57lou0A3HnmgqbDl9uzl8A8aC4c31tbUfJdf9sbqo4+m1Y5bHDnY/MBCKdNl980rvW9u6Zi58mvtg4tKJnzcWF2n937ckerau9dnDFvf6kHo1buGb8gZsTnvwU2ZXxworjKu5gEAAADB5wgD2bNnT2Pwy+w6FOhDdzXl/EfkAnY5zXqzl9wfNub8uKnmxHdw1B88WvV1ZvmsdcWTPyl+ZGHRA3OLxnxYMmZu8ZjUsrELSv6xuP5wjC/lnpt9qOWD0LukW8ut92/M/CS3sKzW7t8AAAAQhw8f1m4IBwcOHNDBBeH2IcLKFU0H/xYp0FKjs5sV6EM/bDz0gK5pqW9oKCyvzTpc8+3+mi251VvzanYdrM8vbaqLcfC4uKZu9LrIlZ6t9jxsXaZU59EbMhfuPVLs/M0dAAAASaiuro6rQburrq7WwQXhVqBFY2NjxZLG/X+IXIsjP/p1Kl57zv1BY/Y5TXWBL/8Rk1TkEel5fnUeujbjji37R63P/CD70OFm34kNAACA5oqKirQeolXtO/wsnAt0VGNjTWNZamPe75oO/DCS7Ojh58OP6M2nrLi6dsz6jOHrs4d+nSFN+s51me9kFOSVV+nNAAAAaEtjYyNnQrdpz549NTXtPD4brECrhsrGo2835f2qqejMyOHn2r26vCN8nFt41/bDw9dmzNxzMKeM6gwAABCYVMOMjAytioilHRff8LWrQHsaKppKpjcUTdc/dpCS2rr3MguyqM4AAACnoKKiQqsimikqKtIxtcspFGgAAACEWHl5OR8obO4U27OgQAMAACSs6upqzof2yduJUzlzw0eBBgAASGR1dXVcHFocOHCg3Z8atFCgAQAAEl9tbW1BQUFyntGxf//+Y8eO6SA6AgUaAAAgWTQ2NpaXl0uTzsvLS+wynZubm5+fX1pa2tAQ4/v7ThEFGgAAAAiAAg0AAAAEQIEGAAAAAqBAAwAAAAFQoAEAAIAAKNAAAABAABRoAAAAIAAKNAAAABAABRoAAAAIgAINAAAABECBBgAAAAKgQAMAAAABUKABAAAAZ01N/z+YZPvrPad+CwAAAABJRU5ErkJgglBLAwQKAAAAAACAbk5ZBWTOSrlNAAC5TQAADAAAAHdpZGdldHMuanNvblt7InkiOjQxNS45LCJ0eXBlIjoiY2FyZERlY2siLCJvd25lciI6bnVsbCwiYmFja1RlbXBsYXRlIjp7ImluY2x1ZGVCb3JkZXIiOmZhbHNlLCJpbmNsdWRlUmFkaXVzIjp0cnVlLCJvYmplY3RzIjpbeyJ0eXBlIjoiaW1hZ2UiLCJ4IjowLCJ5IjowLCJ3IjoxMDMsImgiOjE2MCwidmFsdWVUeXBlIjoic3RhdGljIiwidmFsdWUiOiJodHRwczovL2kuaW1ndXIuY29tL2NIUGU3M0cuanBnIiwiY29sb3IiOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDApIn1dfSwieiI6MTA2MjYsIngiOjkzLjYsImNhcmRUeXBlcyI6eyJ0eXBlLTllYjQ5NGExLWY5MjctNDRiMC04MzNmLTJmYzJiYTMwMzdiYiI6eyJsYWJlbCI6IjEiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vdVEwU3c4dy5qcGcifSwidHlwZS1lZWFlNGU1OS01OTU4LTRmZWQtOWEwMC1jZmVmN2FhZmY0YjciOnsibGFiZWwiOiIyIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL3M2Y3RkUmouanBnIn0sInR5cGUtMzRmMTk5YjEtMDA1YS00NDZhLTkwYTktYTZjNTFiYzk2NmRhIjp7ImxhYmVsIjoiMyIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9LYkQ1QU5aLmpwZyJ9LCJ0eXBlLTRjODFmYmZmLWE1ZjAtNGZmNy04N2E5LWJhNzg2OWQwMmJhMyI6eyJsYWJlbCI6IjQiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vTUFPcml3VS5qcGcifSwidHlwZS05OGE3MTg5OC1jODMwLTRkN2MtYjliZS00OTc1MWY2NGI4YzAiOnsibGFiZWwiOiI1IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL3hjY2hhVE4uanBnIn0sInR5cGUtZmY3ZTRlMzgtMGJhZC00MmI4LWI4MmEtZTZkYjkwMWRjNzhmIjp7ImxhYmVsIjoiNiIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9XRWRYNktMLmpwZyJ9LCJ0eXBlLTQzMGM1NTg4LWU0NDktNDc3Zi1iZGQwLTc5NTFjZjdhZjk2NiI6eyJsYWJlbCI6IjciLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vZTBGRUI4SS5qcGcifSwidHlwZS1lMjI1OTIyOS04MWIzLTRlOTItYjg1OS04OTA1NzZkYWY4MDgiOnsibGFiZWwiOiI4IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL0lJNG01VU4uanBnIn0sInR5cGUtYmQ1MDVmYjAtNTMyNS00OGZiLTk3YzgtODQwMmNhZDFiMzY2Ijp7ImxhYmVsIjoiOSIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9UenJoWGU0LmpwZyJ9LCJ0eXBlLTcxYmE2YjE2LWViODQtNDMyNC04YTNjLWI0NTQ5OTFjNmJlNCI6eyJsYWJlbCI6IjEwIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tLzkySllSZHIuanBnIn0sInR5cGUtNzM1NDcwMmQtNTdmYi00MWRmLWIyMmEtYTc2MWMwYjgzMzBkIjp7ImxhYmVsIjoiMTEiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vSFJGTzRKSi5qcGcifSwidHlwZS0zM2VkNGE1ZS1mZjUxLTRlMDgtOTE5NC03ZTk0MjM3MTNhNjkiOnsibGFiZWwiOiIxMiIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9DRWV6RUNtLmpwZyJ9LCJ0eXBlLTc3NTIxODRmLTA4NmEtNDA2Zi1iZjUzLTFlOTljZjhhNDAxMyI6eyJsYWJlbCI6IjEzIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL2F4Mktha20uanBnIn0sInR5cGUtMWNkNjFmZTgtZGNiYy00ZDQ0LWFjZjYtNjFmMTAyYzBiODIwIjp7ImxhYmVsIjoiMTQiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vZnhVWURmZS5qcGcifSwidHlwZS1mZjY1MGZkNC1hNzMxLTRjMmYtOWU3Yy1mNjg5MTNmZjU1ZTEiOnsibGFiZWwiOiIxNSIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9tOU5hamdYLmpwZyJ9LCJ0eXBlLThkMzQzYzIzLWNkOWYtNDQxZC1iZGJkLTRkMjYxNmMxM2I5MCI6eyJsYWJlbCI6IjE2IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL1JoaGRtWGMuanBnIn0sInR5cGUtYmZiN2I4YWEtNTc4Yi00YmVkLTkyMDYtNDI1MjhhNTEwNjllIjp7ImxhYmVsIjoiMTciLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vSjZVNkpaYS5qcGcifSwidHlwZS00NTQwNGQ3ZC00MTNhLTRhNGItYWI4MC04YTA5ZTc2MDQ4MzciOnsibGFiZWwiOiIxOCIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9uMjg5cjI0LmpwZyJ9LCJ0eXBlLWU0Y2ExMDkyLWRmMTgtNDlhNi04YzMwLWI3ZjcwMWJiMzFlZiI6eyJsYWJlbCI6IjE5IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL0l1SUlneGYuanBnIn0sInR5cGUtNjFmNzdjN2ItNDY2Zi00MTlkLWIzNDYtYjU2ODAyZTlmMTQ3Ijp7ImxhYmVsIjoiMjAiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vOXQzZ0ZIcC5qcGcifSwidHlwZS05MWYzYzhkZi1kZjkyLTQ4MWItOGM4NC1hNTNjN2E3OWVjNTIiOnsibGFiZWwiOiIyMSIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS92eURueWRkLmpwZyJ9LCJ0eXBlLTk1MTQ4MGYxLTkxYTQtNDJlNC05MjExLWE0OGI1YzZiMTJmMyI6eyJsYWJlbCI6IjIyIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tLzhUWTAxSXQuanBnIn0sInR5cGUtNmE1MjE5MzYtOGEyNy00ZTE4LWIzZTEtMjA0NzQxYzAzMGMwIjp7ImxhYmVsIjoiMjMiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vTlpieENFRC5qcGcifSwidHlwZS1mOWMyYTdhNy01ZTk4LTRhMmMtYjJmNS1iNjFiNzllNDM4ZTAiOnsibGFiZWwiOiIyNCIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS81MEZxUWZoLmpwZyJ9LCJ0eXBlLTJmNDk2YzBlLWI0YjQtNDE1MC1iNTA0LTQzZjBmZGVmOGZhZSI6eyJsYWJlbCI6IjI1IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL3pKWEZZUm4uanBnIn0sInR5cGUtNDgzODM5ZDctZTJhYy00YWM1LWFiNmYtYWFlNTNmMWY5ZjNhIjp7ImxhYmVsIjoiMjYiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20va2dFbmJTUS5qcGcifSwidHlwZS1kM2RkMTFlMi0wYmIxLTRlYTItOTVmNS1lYjQ0YjM0NTAwNmEiOnsibGFiZWwiOiIyNyIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9CU2o0RVJsLmpwZyJ9LCJ0eXBlLWVkYmQ4YTY4LTYyODItNGIzOS05NzQ3LWJkYzY1NDZlNGJjNCI6eyJsYWJlbCI6IjI4IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL01ud2ZTamouanBnIn0sInR5cGUtNjNmMTcyNjItZjlmOS00YTcwLWIwNjUtMmZkZDhkYmI3NGQ1Ijp7ImxhYmVsIjoiMjkiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vT1haMDZLSS5qcGcifSwidHlwZS0yODIxMmJhMS03YmI2LTRhODUtYWQ3Yi00MWY4ZjlmNWNiYjkiOnsibGFiZWwiOiIzMCIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9abEphVlBRLmpwZyJ9LCJ0eXBlLTMyZDIzYmVlLWUwMjctNGY4OS05ZmFmLTliZGNiZDBjM2UzNSI6eyJsYWJlbCI6IjMxIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL0lWTXhNcksuanBnIn0sInR5cGUtZWU3YzI1NjgtNzQ1Ny00MDFhLTllNDQtZTBjOWUxYjA4ZmI0Ijp7ImxhYmVsIjoiMzIiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vT0d0aUlMUS5qcGcifSwidHlwZS1jN2RjNThmMS1kY2VkLTQ1MDktYTUwMy00Zjg0ZmNkNjhkZmQiOnsibGFiZWwiOiIzMyIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9CempSSkdVLmpwZyJ9LCJ0eXBlLTg3OGQyMGU3LWNlZWMtNDgzMC04NmZmLWUyZjEzY2NiZGEwMCI6eyJsYWJlbCI6IjM0IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL2x3MWxicEguanBnIn0sInR5cGUtNGM4NDMxOTItNWVjOS00NzVjLThjOGQtNzc5OWM0MDYwY2U3Ijp7ImxhYmVsIjoiMzUiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20veDRXam1GVS5qcGcifSwidHlwZS0zZGRlNmQzYS1jNmM5LTRlZDctYjk2YS05MWJlMmRjOWMzODAiOnsibGFiZWwiOiIzNiIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9TMENZZlVxLmpwZyJ9LCJ0eXBlLTdmZmI3Yjc1LTIyY2EtNDRlZS05YmU4LWI3NmI2Zjg0OWVhZiI6eyJsYWJlbCI6IjM3IiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL09BRUxiYWsuanBnIn0sInR5cGUtNzgzOWNhY2UtYjE1My00MzBmLTgzZWQtZjhiZTU3MjRkYmMxIjp7ImxhYmVsIjoiMzgiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vM0dwUnlhWS5qcGcifSwidHlwZS1mYjE4ZDViNC0xMzM5LTQ3YzQtOTJhMS1jOWUyODMyZmNlODMiOnsibGFiZWwiOiIzOSIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS9SU0Z4NTc3LmpwZyJ9LCJ0eXBlLWE4MTExNTNlLWU0MTctNDA2MC04Zjg4LWFmNjZmYzFmNjAzMyI6eyJsYWJlbCI6IjQwIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL1ZIYVRaU3ouanBnIn0sInR5cGUtMTQyYzVjYWUtNDVmMi00MjZkLWIzNDktNDg2ZmMxZTZiNzFkIjp7ImxhYmVsIjoiNDEiLCJpbWFnZSI6Imh0dHBzOi8vaS5pbWd1ci5jb20vTk9ENm8xdC5qcGcifSwidHlwZS01YzI2NTMxNS1iMTc0LTRhYTQtYWVkZC1mZTNjZDg1Y2JlZjMiOnsibGFiZWwiOiI0MiIsImltYWdlIjoiaHR0cHM6Ly9pLmltZ3VyLmNvbS96eU9qRXhSLmpwZyJ9LCJ0eXBlLTFjNTk5OTQ3LThjNGUtNDA5Ny05YmQ0LWVjYmM5ODc3NGNiMSI6eyJsYWJlbCI6IjQzIiwiaW1hZ2UiOiJodHRwczovL2kuaW1ndXIuY29tL0VMaVB4SlguanBnIn19LCJwYXJlbnQiOiI0ZWY4MmM3ZC1hYjdmLTRjNzgtYTRmNC03NWRkMzg3MTM4MTMiLCJpZCI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsImZhY2VUZW1wbGF0ZSI6eyJpbmNsdWRlQm9yZGVyIjp0cnVlLCJpbmNsdWRlUmFkaXVzIjp0cnVlLCJvYmplY3RzIjpbeyJ0eXBlIjoiaW1hZ2UiLCJ4IjowLCJ5IjowLCJ3IjoxMDMsImgiOjE2MCwiY29sb3IiOiJ3aGl0ZSIsInZhbHVlVHlwZSI6ImR5bmFtaWMiLCJ2YWx1ZSI6ImltYWdlIn1dfSwiZHJhZ2dpbmciOm51bGwsImNhcmRXaWR0aCI6MTAzLCJjYXJkSGVpZ2h0IjoxNjB9LHsiaWQiOiI0ZWY4MmM3ZC1hYjdmLTRjNzgtYTRmNC03NWRkMzg3MTM4MTMiLCJ4Ijo4MS4xLCJ5IjozNzQuOSwieiI6MTA1MjQsInR5cGUiOiJjYXJkUGlsZSIsImhhc1NodWZmbGVCdXR0b24iOnRydWUsImRyYWdnaW5nIjpudWxsLCJkcmFnZ2luZ1R5cGUiOm51bGx9LHsiaWQiOiIwZDdlMWViOS01YzQ2LTRiY2ItYjVhNy1iMWVlNDdkN2QzYzMiLCJ4Ijo3MDAuNSwieSI6NzIsInoiOjEwNTI1LCJ0eXBlIjoiY2FyZFBpbGUiLCJsYWJlbCI6Im5vdCBnb2luZyBzbyB3ZWxsIiwiZHJhZ2dpbmciOm51bGx9LHsiaWQiOiJhNThhOWMwNS0yMDAzLTQ2YTAtYThmNC01ZTM0NTFjMzlmZjEiLCJ4IjoxMDI1LjYsInkiOjczLjEsInoiOjEwNTI2LCJ0eXBlIjoiY2FyZFBpbGUiLCJsYWJlbCI6Im5vdCByZWxldmFudCIsImRyYWdnaW5nIjpudWxsfSx7ImlkIjoiMGIwYTMxMTgtOGY4Mi00NDMwLTlhMzktODU1NmQyNjNjOWVlIiwieCI6MTQzMy4yLCJ5Ijo3ODMuMSwieiI6MTA0NzYsInR5cGUiOiJjYXJkUGlsZSIsImRyYWdnaW5nIjpudWxsfSx7ImlkIjoiNmI0ZDkwNDAtZDkzZC00YWQ0LWEwYzQtMDYzZDI2OGUxMWVhIiwieCI6MzY5LjMsInkiOjcyLCJ6IjoxMDQ4MCwidHlwZSI6ImNhcmRQaWxlIiwibGFiZWwiOiJnb2luZyB3ZWxsIiwiZHJhZ2dpbmciOm51bGx9LHsidHlwZSI6ImJvYXJkIiwieCI6MCwieSI6MCwid2lkdGgiOjE2MDAsImhlaWdodCI6MTAwMCwiaWQiOiJkZjg4MjJkNi0xNGQ4LTQxZTAtYjE4ZC0wY2FhNzBlMDYwYTYiLCJ6IjoxMDY2OCwiYXNwZWN0UmF0aW8iOjEuNiwiYm9hcmRJbWFnZSI6InBhY2thZ2U6Ly91c2VyYXNzZXRzLzJkNTA1Nzg4LWU1ODQtNDM1ZC1iZmE0LTA3OWQ0Yzk0MDRiOC5wbmciLCJkcmFnZ2luZyI6bnVsbCwiZHJhZ2dpbmdUeXBlIjpudWxsfSx7ImlkIjoiNWZiZmE4ZmQtMWM4NC00Y2U2LWI3ODQtZDM1YjdjMTYwZWMzIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtOWViNDk0YTEtZjkyNy00NGIwLTgzM2YtMmZjMmJhMzAzN2JiIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcyMiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNjg3MDc4OTItZGZhYS00MDJjLThjZDctY2VjMTA1MmZkNmJmIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZWVhZTRlNTktNTk1OC00ZmVkLTlhMDAtY2ZlZjdhYWZmNGI3IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5NywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZWVlNmI2NTEtZTZjZS00OWVhLTljMGMtYjAwNjRmMzhlN2Y5IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMzRmMTk5YjEtMDA1YS00NDZhLTkwYTktYTZjNTFiYzk2NmRhIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxOSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiOGQ4NDhjODktZjliZS00YzdkLTg5NTYtOGM0MDRjMmI0ZGQ3IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNGM4MWZiZmYtYTVmMC00ZmY3LTg3YTktYmE3ODY5ZDAyYmEzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwOCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMjA1OWY1ZDYtODdhYi00YWM4LWIwNzUtYzIzZGQ4N2Y3MjQ5IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtOThhNzE4OTgtYzgzMC00ZDdjLWI5YmUtNDk3NTFmNjRiOGMwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxNywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMTE0ZjE0OTUtNWFjMC00YTE0LWI0OTQtZTJlM2UzNDRiNGYzIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZmY3ZTRlMzgtMGJhZC00MmI4LWI4MmEtZTZkYjkwMWRjNzhmIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcyMSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNDA3NDY5YmItZWJmYS00MDkwLWFjMmEtMGE1ZDk3NWRkNTllIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNDMwYzU1ODgtZTQ0OS00NzdmLWJkZDAtNzk1MWNmN2FmOTY2IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4MiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYjhjYmRlZDUtNGU0Zi00M2JiLWEzMWEtNjE1MTdlMGI5ZjhhIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZTIyNTkyMjktODFiMy00ZTkyLWI4NTktODkwNTc2ZGFmODA4IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5NCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiOTZhNWEzNjUtMDU1Ny00N2I4LWFmN2YtNjZiMWRkMzRkYjRjIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtYmQ1MDVmYjAtNTMyNS00OGZiLTk3YzgtODQwMmNhZDFiMzY2IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4OSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNjgwYmVkZTgtNjgzYy00ZDNjLWJkM2MtNDEwOWE1YjM0NTVlIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNzFiYTZiMTYtZWI4NC00MzI0LThhM2MtYjQ1NDk5MWM2YmU0IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxOCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYTI3ODE4NDAtMjYxZC00Mjc4LWJhYzgtMGQ5MTllMDU3MjliIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNzM1NDcwMmQtNTdmYi00MWRmLWIyMmEtYTc2MWMwYjgzMzBkIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4MywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMjJlNDEwYmEtNWY0MC00MzdmLWJkMDctZjNiYjI2YzUyZjA3IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMzNlZDRhNWUtZmY1MS00ZTA4LTkxOTQtN2U5NDIzNzEzYTY5IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5OCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZTg5NGZjNjAtMTNjMy00YWEyLWIzYmEtYTY4NWMzNzBiNjE5IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNzc1MjE4NGYtMDg2YS00MDZmLWJmNTMtMWU5OWNmOGE0MDEzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5MSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMTg0MGZiMTItN2NhMy00N2ZhLWE2NTktNGU4NGEzNjU3MGEwIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMWNkNjFmZTgtZGNiYy00ZDQ0LWFjZjYtNjFmMTAyYzBiODIwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxMiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNTg0ZTIxM2YtNmJmMy00N2M0LWJkZTAtMTI3ZDE4NDVhYTc3IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZmY2NTBmZDQtYTczMS00YzJmLTllN2MtZjY4OTEzZmY1NWUxIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5MywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZjE3OWQ1NDAtNmQ5NC00ZDY0LWI5OWUtMWI4Y2QyMzEzYjQxIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtOGQzNDNjMjMtY2Q5Zi00NDFkLWJkYmQtNGQyNjE2YzEzYjkwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4NSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiY2Y0NDZkZWMtNmQ2Mi00YTEyLWFkOGUtOWQwNzhiYmI3NzE5IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtYmZiN2I4YWEtNTc4Yi00YmVkLTkyMDYtNDI1MjhhNTEwNjllIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4MSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZTM1OGI5ZTItMjA2Yi00ZjgyLTkyOGEtMTcwZjQ4MmYwNWQ0IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNDU0MDRkN2QtNDEzYS00YTRiLWFiODAtOGEwOWU3NjA0ODM3IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4NiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYjI3ZGI2MTItNDc4Ni00ZmEzLTljYzYtOWZkZGJlYjkxZGUzIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZTRjYTEwOTItZGYxOC00OWE2LThjMzAtYjdmNzAxYmIzMWVmIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwNCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiODc3ZjlkZmItYTg3NS00NWFlLTgzM2MtYzJiOGEwMGViZDgxIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNjFmNzdjN2ItNDY2Zi00MTlkLWIzNDYtYjU2ODAyZTlmMTQ3IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwNSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNzc1YTUwYjQtMWMxZC00MWViLTg1OTQtNDYwZjBlYzcwMTc2IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtOTFmM2M4ZGYtZGY5Mi00ODFiLThjODQtYTUzYzdhNzllYzUyIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5OSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNzczNzRlYmItYWUxMi00MGMyLWJmZGEtODhlNTA5ZmUyMmU4IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtOTUxNDgwZjEtOTFhNC00MmU0LTkyMTEtYTQ4YjVjNmIxMmYzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwMSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZTFkMzkzNWItMTU3NC00N2Q0LTgxYTQtMDllNmRkNTBlYTMyIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNmE1MjE5MzYtOGEyNy00ZTE4LWIzZTEtMjA0NzQxYzAzMGMwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwMCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMmRkZTlkN2ItODIxOS00YjMxLTlkZjUtNDlmOTQxOTdmZGUyIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZjljMmE3YTctNWU5OC00YTJjLWIyZjUtYjYxYjc5ZTQzOGUwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwMiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNGEyMmEzZTEtMjA3Zi00MTNhLWFhZmYtMjQ5ZDUyNGQxZjI0IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMmY0OTZjMGUtYjRiNC00MTUwLWI1MDQtNDNmMGZkZWY4ZmFlIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxMSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZDNlYTgzNDItZDgyMi00MzE4LWJjZWEtYWZkM2ViYjg1YmRiIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNDgzODM5ZDctZTJhYy00YWM1LWFiNmYtYWFlNTNmMWY5ZjNhIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5MiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNzQ4MWYwNGItNTIwOC00MjZhLWI3N2ItYWYzOGZmNTEwNzdjIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZDNkZDExZTItMGJiMS00ZWEyLTk1ZjUtZWI0NGIzNDUwMDZhIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5NSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZTRiNjVjYzgtN2ZlNy00YjhmLWI3ZDYtMWIwN2Q5OTg1M2YyIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZWRiZDhhNjgtNjI4Mi00YjM5LTk3NDctYmRjNjU0NmU0YmM0IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxNSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMmVjNDhhNmItMDBiMi00ZDY1LWFkM2YtNzQ0Y2EzMTA5NWI3IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNjNmMTcyNjItZjlmOS00YTcwLWIwNjUtMmZkZDhkYmI3NGQ1IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwOSwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiN2U5NmJkMTUtNzIxYy00NWIyLWFkNjYtMDVjMjhlYjY5ZDIxIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMjgyMTJiYTEtN2JiNi00YTg1LWFkN2ItNDFmOGY5ZjVjYmI5IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5NiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiM2FjMjg2NmUtZTU4MC00MmE0LWE4N2UtOTBlOGY5MDlmYWVkIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMzJkMjNiZWUtZTAyNy00Zjg5LTlmYWYtOWJkY2JkMGMzZTM1IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY5MCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNmYyMTkyYmYtMDRhNy00MjZiLWE5NjEtMzA4NTU1YzdlYzA4IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZWU3YzI1NjgtNzQ1Ny00MDFhLTllNDQtZTBjOWUxYjA4ZmI0IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxNiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZDA0NmIzMzUtZjA1Ni00Y2NjLWI5ZTUtNmMyOGZlNjY2MGUxIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtYzdkYzU4ZjEtZGNlZC00NTA5LWE1MDMtNGY4NGZjZDY4ZGZkIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwNiwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYTgzMzAwMDktOWE2Yi00MzBjLWI1ZjktOWI5YTZhZTVhNDY5IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtODc4ZDIwZTctY2VlYy00ODMwLTg2ZmYtZTJmMTNjY2JkYTAwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxMywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYjQ4OWRjOTMtMWNhNS00OWNhLWIwOTAtODE2NjM2YmJiY2JhIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNGM4NDMxOTItNWVjOS00NzVjLThjOGQtNzc5OWM0MDYwY2U3IiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4NywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiYzBiZDc2ZjktYWNlNS00NmFjLTlmNjEtMDQ1Mjk4MjcxYWJhIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtM2RkZTZkM2EtYzZjOS00ZWQ3LWI5NmEtOTFiZTJkYzljMzgwIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4MCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiNmU5MDEzODItYTJiYy00ZDI5LWJlODUtZDYwZTM5MjRjMDMxIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtN2ZmYjdiNzUtMjJjYS00NGVlLTliZTgtYjc2YjZmODQ5ZWFmIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwMywiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZmYwN2ZiMGItNDNiMy00ZmJjLThkZGEtOWQyYzNmOGIxMDVkIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNzgzOWNhY2UtYjE1My00MzBmLTgzZWQtZjhiZTU3MjRkYmMxIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4NCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiMjQyOGVkMDEtN2M5ZS00Y2ZlLThmNmEtZjI2ODE5OTA4NTA1IiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtZmIxOGQ1YjQtMTMzOS00N2M0LTkyYTEtYzllMjgzMmZjZTgzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxMCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiN2JmNmJiOTAtYmQxOC00ODJmLTkwMDEtNmI2ZjE4ZDVhMmZkIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtYTgxMTE1M2UtZTQxNy00MDYwLThmODgtYWY2NmZjMWY2MDMzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcxNCwiZmFjZXVwIjpmYWxzZSwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiY2YyMzdjYTYtMzQ0Yy00NTg3LWFkNTYtMjkyNjg2OGVjNTEzIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMTQyYzVjYWUtNDVmMi00MjZkLWIzNDktNDg2ZmMxZTZiNzFkIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcyMCwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImZhY2V1cCI6ZmFsc2UsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiN2RiODk2ZjYtN2I1OC00OGY0LTkyOGMtZDE5ZTc2OWJkMzhhIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtNWMyNjUzMTUtYjE3NC00YWE0LWFlZGQtZmUzY2Q4NWNiZWYzIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDY4OCwiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwib3duZXIiOm51bGwsImZhY2V1cCI6ZmFsc2UsImxheW91dFN0YWNrUGFyZW50IjpudWxsfSx7ImlkIjoiZDAyMWY1N2YtY2NkZS00NGJiLTg1NTItZGE2NGQ2Mzc5OWUyIiwidHlwZSI6ImNhcmQiLCJjYXJkVHlwZSI6InR5cGUtMWM1OTk5NDctOGM0ZS00MDk3LTliZDQtZWNiYzk4Nzc0Y2IxIiwiZGVjayI6IjRiYWU3MmViLWRiNjYtNDEwMi04NzI0LWI4YTNmZThiN2I1NiIsInBhcmVudCI6IjRlZjgyYzdkLWFiN2YtNGM3OC1hNGY0LTc1ZGQzODcxMzgxMyIsIngiOjg1LjEsInkiOjM3OC45LCJ6IjoxMDcwNywiZHJhZ2dpbmciOm51bGwsImRyYWdnaW5nVHlwZSI6bnVsbCwiZmFjZXVwIjpmYWxzZSwib3duZXIiOm51bGwsImxheW91dFN0YWNrUGFyZW50IjpudWxsfV1QSwECFAAKAAAAAACAbk5ZAAAAAAAAAAAAAAAACwAAAAAAAAAAABAAAAAAAAAAdXNlcmFzc2V0cy9QSwECFAAKAAAAAACAbk5ZVK25Q8FVAADBVQAAMwAAAAAAAAAAAAAAAAApAAAAdXNlcmFzc2V0cy8yZDUwNTc4OC1lNTg0LTQzNWQtYmZhNC0wNzlkNGM5NDA0YjgucG5nUEsBAhQACgAAAAAAgG5OWQVkzkq5TQAAuU0AAAwAAAAAAAAAAAAAAAAAO1YAAHdpZGdldHMuanNvblBLBQYAAAAAAwADANQAAAAepAAAAAA=
!!Follow AMBIT
<a href="https://www.youtube.com/user/ambitafc" class="tc-btn-big-green" style="border-radius:4px;background-color:#e52d27;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/video}} ~YouTube
</a>
<a href="https://twitter.com/afcambit" class="tc-btn-big-green" style="border-radius:4px;background-color:#5E9FCA;" target="_blank" rel="noopener noreferrer">
{{$:/core/images/twitter}} Twitter
</a>
<a href="mailto:ambit@annafreud.org" class="tc-btn-big-green" style="border-radius:4px;background-color:#green;" target="_blank" rel="noopener noreferrer">
{{$:/images/fa5/solid/mail-bulk}} Email
</a>
!!Join our [[mailing list|https://manuals.annafreud.org/ambit/#AMBIT%20Newsletter]]
!! iFRAMES - a whole "web-page-within-a-page"!
An iFrame simply opens a "port-hole" onto another part of the web from within a Tiddler. If you want to 'embed' a ''whole web-page'' inside a page of your manual, you can easily make one of these 'windows', using a similar little bit of code (called an "iFrame").
You can see an example in [[Other team's AMBIT manuals]] in which the whole signposting site is displayed as a working web-page within a page of this wiki.
To create this yourself, you can use the iframe code when you are editing a page, which looks like this (cut and paste this code directly from this page. Then stick it in the new page you want to create, and paste the URL address for the web page you want to include to replace the capitalised instructions [ADD YOUR WEBSITE...] in this code):
```
<html><iframe src="ADD YOUR WEBSITE URL BETWEEN THESE SPEECH MARKS"height="900" width="100%"></iframe></html>
```
<svg width="30pt" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-alt-circle-left" class="svg-inline--fa fa-arrow-alt-circle-left fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm116-292H256v-70.9c0-10.7-13-16.1-20.5-8.5L121.2 247.5c-4.7 4.7-4.7 12.2 0 16.9l114.3 114.9c7.6 7.6 20.5 2.2 20.5-8.5V300h116c6.6 0 12-5.4 12-12v-64c0-6.6-5.4-12-12-12z"></path></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100px" height="100px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->
<title>page-background</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Tweaked-Copy-5" transform="translate(-20.000000, -20.000000)">
<path d="M56.522216,75.44304 C65.54921,76.565568 74.297912,74.592408 81.660798,70.32811 C81.574974,61.227264 78.40097,52.652664 73.007424,45.800068 C75.933236,42.838624 77.740356,38.769508 77.740356,34.281254 C77.740356,25.23068 70.395706,17.888306 61.347588,17.888306 C60.075326,17.888306 58.836692,18.033398 57.647514,18.3081112 C54.17176,10.9127274 48.492626,4.652008 41.317916,0.5001412 C34.255702,4.5835228 28.466614,10.7737046 24.92714,18.361376 C23.669878,18.052208 22.355672,17.888306 21.003474,17.888306 C11.955349,17.888306 4.6107026,25.23068 4.6107026,34.281254 C4.6107026,38.854474 6.48695,42.992524 9.511086,45.96704 C5.4456214,51.174732 2.6057128,57.45493 1.4999352,64.43795 C1.1841506,66.43077 1.0204048,68.412742 1,70.372222 C5.154114,72.768096 9.8079166,74.45749 14.824454,75.251786 C18.577762,75.846176 22.292677,75.901406 25.890388,75.474854 C28.25254,81.62793 34.219368,85.99986 41.200184,85.99986 C48.193028,85.99986 54.168374,81.612876 56.522216,75.44304 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M21.147398,35.839458 C21.328394,55.169746 35.44587,72.128518 55.168988,75.251816 C64.672692,76.756774 73.930512,74.805192 81.660798,70.328094 C81.478408,50.996772 67.362694,34.039848 47.637478,30.916684 C38.134358,29.411728 28.877198,31.363128 21.147398,35.83955 L21.147398,35.839458 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M21.147398,35.839458 C21.328394,55.169746 35.44587,72.128518 55.168988,75.251816 C64.672692,76.756774 73.930512,74.805192 81.660798,70.328094 C81.478408,50.996772 67.362694,34.039848 47.637478,30.916684 C38.134358,29.411728 28.877198,31.363128 21.147398,35.83955 L21.147398,35.839458 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M41.200184,85.99987 C32.15203,85.99987 24.8074,78.655082 24.8074,69.60688 C24.8074,60.556298 32.15203,53.213872 41.200184,53.213872 C50.248336,53.213872 57.593002,60.556298 57.593002,69.60688 C57.593002,78.655082 50.248336,85.99987 41.200184,85.99987 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M41.200184,85.99987 C32.15203,85.99987 24.8074,78.655082 24.8074,69.60688 C24.8074,60.556298 32.15203,53.213872 41.200184,53.213872 C50.248336,53.213872 57.593002,60.556298 57.593002,69.60688 C57.593002,78.655082 50.248336,85.99987 41.200184,85.99987 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
<g id="Tweaked-Copy-9" transform="translate(80.000000, 80.000000)">
<path d="M56.522216,75.44304 C65.54921,76.565568 74.297912,74.592408 81.660798,70.32811 C81.574974,61.227264 78.40097,52.652664 73.007424,45.800068 C75.933236,42.838624 77.740356,38.769508 77.740356,34.281254 C77.740356,25.23068 70.395706,17.888306 61.347588,17.888306 C60.075326,17.888306 58.836692,18.033398 57.647514,18.3081112 C54.17176,10.9127274 48.492626,4.652008 41.317916,0.5001412 C34.255702,4.5835228 28.466614,10.7737046 24.92714,18.361376 C23.669878,18.052208 22.355672,17.888306 21.003474,17.888306 C11.955349,17.888306 4.6107026,25.23068 4.6107026,34.281254 C4.6107026,38.854474 6.48695,42.992524 9.511086,45.96704 C5.4456214,51.174732 2.6057128,57.45493 1.4999352,64.43795 C1.1841506,66.43077 1.0204048,68.412742 1,70.372222 C5.154114,72.768096 9.8079166,74.45749 14.824454,75.251786 C18.577762,75.846176 22.292677,75.901406 25.890388,75.474854 C28.25254,81.62793 34.219368,85.99986 41.200184,85.99986 C48.193028,85.99986 54.168374,81.612876 56.522216,75.44304 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M21.147398,35.839458 C21.328394,55.169746 35.44587,72.128518 55.168988,75.251816 C64.672692,76.756774 73.930512,74.805192 81.660798,70.328094 C81.478408,50.996772 67.362694,34.039848 47.637478,30.916684 C38.134358,29.411728 28.877198,31.363128 21.147398,35.83955 L21.147398,35.839458 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M21.147398,35.839458 C21.328394,55.169746 35.44587,72.128518 55.168988,75.251816 C64.672692,76.756774 73.930512,74.805192 81.660798,70.328094 C81.478408,50.996772 67.362694,34.039848 47.637478,30.916684 C38.134358,29.411728 28.877198,31.363128 21.147398,35.83955 L21.147398,35.839458 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M41.200184,85.99987 C32.15203,85.99987 24.8074,78.655082 24.8074,69.60688 C24.8074,60.556298 32.15203,53.213872 41.200184,53.213872 C50.248336,53.213872 57.593002,60.556298 57.593002,69.60688 C57.593002,78.655082 50.248336,85.99987 41.200184,85.99987 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M41.200184,85.99987 C32.15203,85.99987 24.8074,78.655082 24.8074,69.60688 C24.8074,60.556298 32.15203,53.213872 41.200184,53.213872 C50.248336,53.213872 57.593002,60.556298 57.593002,69.60688 C57.593002,78.655082 50.248336,85.99987 41.200184,85.99987 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
<g id="Tweaked-Copy-6" transform="translate(180.000000, -20.000000)">
<path d="M56.522216,75.44304 C65.54921,76.565568 74.297912,74.592408 81.660798,70.32811 C81.574974,61.227264 78.40097,52.652664 73.007424,45.800068 C75.933236,42.838624 77.740356,38.769508 77.740356,34.281254 C77.740356,25.23068 70.395706,17.888306 61.347588,17.888306 C60.075326,17.888306 58.836692,18.033398 57.647514,18.3081112 C54.17176,10.9127274 48.492626,4.652008 41.317916,0.5001412 C34.255702,4.5835228 28.466614,10.7737046 24.92714,18.361376 C23.669878,18.052208 22.355672,17.888306 21.003474,17.888306 C11.955349,17.888306 4.6107026,25.23068 4.6107026,34.281254 C4.6107026,38.854474 6.48695,42.992524 9.511086,45.96704 C5.4456214,51.174732 2.6057128,57.45493 1.4999352,64.43795 C1.1841506,66.43077 1.0204048,68.412742 1,70.372222 C5.154114,72.768096 9.8079166,74.45749 14.824454,75.251786 C18.577762,75.846176 22.292677,75.901406 25.890388,75.474854 C28.25254,81.62793 34.219368,85.99986 41.200184,85.99986 C48.193028,85.99986 54.168374,81.612876 56.522216,75.44304 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M0.999998,70.372254 C5.1541214,72.768104 9.8079128,74.45745 14.8244248,75.251816 C36.80984,78.733428 57.480126,63.715972 60.963952,41.730388 C61.27951,39.737636 61.443,37.755768 61.463196,35.796478 C57.30877,33.400582 52.654374,31.711052 47.637078,30.916684 C25.65186,27.435072 4.9813194,42.452804 1.4999084,64.43798 C1.18417,66.43077 1.0204334,68.412734 0.999998,70.372208 L0.999998,70.372254 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
<g id="Tweaked-Copy-7" transform="translate(180.000000, 180.000000)">
<path d="M56.522216,75.44304 C65.54921,76.565568 74.297912,74.592408 81.660798,70.32811 C81.574974,61.227264 78.40097,52.652664 73.007424,45.800068 C75.933236,42.838624 77.740356,38.769508 77.740356,34.281254 C77.740356,25.23068 70.395706,17.888306 61.347588,17.888306 C60.075326,17.888306 58.836692,18.033398 57.647514,18.3081112 C54.17176,10.9127274 48.492626,4.652008 41.317916,0.5001412 C34.255702,4.5835228 28.466614,10.7737046 24.92714,18.361376 C23.669878,18.052208 22.355672,17.888306 21.003474,17.888306 C11.955349,17.888306 4.6107026,25.23068 4.6107026,34.281254 C4.6107026,38.854474 6.48695,42.992524 9.511086,45.96704 C5.4456214,51.174732 2.6057128,57.45493 1.4999352,64.43795 C1.1841506,66.43077 1.0204048,68.412742 1,70.372222 C5.154114,72.768096 9.8079166,74.45749 14.824454,75.251786 C18.577762,75.846176 22.292677,75.901406 25.890388,75.474854 C28.25254,81.62793 34.219368,85.99986 41.200184,85.99986 C48.193028,85.99986 54.168374,81.612876 56.522216,75.44304 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
<g id="Tweaked-Copy-8" transform="translate(-20.000000, 180.000000)">
<path d="M56.522216,75.44304 C65.54921,76.565568 74.297912,74.592408 81.660798,70.32811 C81.574974,61.227264 78.40097,52.652664 73.007424,45.800068 C75.933236,42.838624 77.740356,38.769508 77.740356,34.281254 C77.740356,25.23068 70.395706,17.888306 61.347588,17.888306 C60.075326,17.888306 58.836692,18.033398 57.647514,18.3081112 C54.17176,10.9127274 48.492626,4.652008 41.317916,0.5001412 C34.255702,4.5835228 28.466614,10.7737046 24.92714,18.361376 C23.669878,18.052208 22.355672,17.888306 21.003474,17.888306 C11.955349,17.888306 4.6107026,25.23068 4.6107026,34.281254 C4.6107026,38.854474 6.48695,42.992524 9.511086,45.96704 C5.4456214,51.174732 2.6057128,57.45493 1.4999352,64.43795 C1.1841506,66.43077 1.0204048,68.412742 1,70.372222 C5.154114,72.768096 9.8079166,74.45749 14.824454,75.251786 C18.577762,75.846176 22.292677,75.901406 25.890388,75.474854 C28.25254,81.62793 34.219368,85.99986 41.200184,85.99986 C48.193028,85.99986 54.168374,81.612876 56.522216,75.44304 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" fill-opacity="0.51999998" fill="#C1E6FD" fill-rule="nonzero"></path>
<path d="M41.292072,70.341736 C51.45672,64.464004 58.98446,54.22174 60.96382,41.729996 C63.647812,24.780571 55.338546,8.6135692 41.317914,0.5001412 C31.152794,6.37759 23.625378,16.619999 21.647226,29.11187 C18.961578,46.059768 27.271736,62.227616 41.29192,70.341736 L41.292072,70.341736 Z" id="Shape" stroke="#AAC9DD" stroke-width="2"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M61.34758,50.674266 C52.299428,50.674266 44.954796,43.329484 44.954796,34.281272 C44.954796,25.230694 52.299428,17.888268 61.34758,17.888268 C70.39573,17.888268 77.740394,25.230694 77.740394,34.281272 C77.740394,43.329484 70.39573,50.674266 61.34758,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" fill-opacity="0.5" fill="#F4C4E2" fill-rule="nonzero"></path>
<path d="M21.003504,50.674266 C11.955349,50.674266 4.61072,43.329484 4.61072,34.281272 C4.61072,25.230694 11.955349,17.888268 21.003504,17.888268 C30.051654,17.888268 37.396316,25.230694 37.396316,34.281272 C37.396316,43.329484 30.051654,50.674266 21.003504,50.674266 Z" id="Shape" stroke="#E3B1CF" stroke-width="2" stroke-linejoin="bevel"></path>
</g>
</g>
</svg>
<$button>remove review tag
<$list filter='[list[$:/StoryList]]'>
<$fieldmangler tiddler=<<currentTiddler>>>
<$action-sendmessage $message='tm-remove-tag' $param="Review" />
</$fieldmangler>
</$list>
</$button>
<svg width="30pt" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-alt-circle-right" class="svg-inline--fa fa-arrow-alt-circle-right fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zM140 300h116v70.9c0 10.7 13 16.1 20.5 8.5l114.3-114.9c4.7-4.7 4.7-12.2 0-16.9l-114.3-115c-7.6-7.6-20.5-2.2-20.5 8.5V212H140c-6.6 0-12 5.4-12 12v64c0 6.6 5.4 12 12 12z"></path></svg>
{"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|https://jasmine.github.io/]]\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-2024, 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"},"$:/core/images/bold":{"title":"$:/core/images/bold","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/discord":{"title":"$:/core/images/discord","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-discord tc-image-button\" viewBox=\"0 -28.5 256 256\"><path d=\"M216.856 16.597A208.502 208.502 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046-19.692-2.961-39.203-2.961-58.533 0-1.832-4.4-4.55-9.933-6.846-14.046a207.809 207.809 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161.094 161.094 0 0 0 79.735 175.3a136.413 136.413 0 0 1-21.846-10.632 108.636 108.636 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a131.66 131.66 0 0 0 5.355 4.237 136.07 136.07 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848 21.142-6.58 42.646-16.637 64.815-33.213 5.316-56.288-9.08-105.09-38.056-148.36ZM85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2c12.867 0 23.236 11.804 23.015 26.2.02 14.375-10.148 26.18-23.015 26.18Zm85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2 0 14.375-10.148 26.18-23.015 26.18Z\"/></svg>"},"$:/core/images/done-button":{"title":"$:/core/images/done-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/input-button":{"title":"$:/core/images/input-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-input-button tc-image-button\" viewBox=\"0 0 22 22\"><path d=\"M1.375 22h19.249c.365 0 .716-.145.973-.404v.001c.258-.257.404-.607.403-.972v-11a1.376 1.376 0 0 0-2.75 0v9.625H2.75V9.625a1.376 1.376 0 0 0-2.75 0v11C0 21.384.617 22 1.375 22Z\"/><path d=\"m9.732 11.904-1.541-1.541a1.375 1.375 0 1 0-1.944 1.944l3.887 3.888c.258.258.608.402.973.402h-.001c.353 0 .705-.134.974-.402l3.888-3.889a1.376 1.376 0 0 0 .001-1.944 1.377 1.377 0 0 0-1.946 0l-1.541 1.542V1.376a1.375 1.375 0 1 0-2.75 0v10.528Z\"/></svg>"},"$:/core/images/italic":{"title":"$:/core/images/italic","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/layout-button":{"title":"$:/core/images/layout-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-layout-button tc-image-button\" viewBox=\"0 0 24 24\" stroke-width=\"1\" stroke=\"none\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><rect x=\"2\" y=\"2\" width=\"7\" height=\"7\" rx=\"2\"/><rect x=\"2\" y=\"13\" width=\"7\" height=\"9\" rx=\"2\"/><rect x=\"12\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\"/></svg>"},"$:/core/images/left-arrow":{"title":"$:/core/images/left-arrow","created":"20150315234410875","modified":"20150315235324760","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/mastodon":{"title":"$:/core/images/mastodon","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-mastodon tc-image-button\" viewBox=\"0 0 128 128\">\n <path d=\"M112.716,76.735C111.231,85.764 99.411,95.646 85.836,97.561C78.757,98.559 71.787,99.476 64.355,99.073C52.201,98.415 42.61,95.646 42.61,95.646C42.61,97.044 42.683,98.374 42.829,99.619C44.409,113.79 54.723,114.639 64.493,115.035C74.354,115.434 83.134,112.163 83.134,112.163L83.539,122.695C83.539,122.695 76.642,127.071 64.355,127.875C57.58,128.315 49.167,127.674 39.369,124.61C18.118,117.965 14.463,91.202 13.904,64.048C13.733,55.985 13.839,48.383 13.839,42.024C13.839,14.257 29.238,6.118 29.238,6.118C37.002,1.905 50.326,0.134 64.177,-0L64.517,-0C78.369,0.134 91.701,1.905 99.465,6.118C99.465,6.118 114.864,14.257 114.864,42.024C114.864,42.024 115.057,62.511 112.716,76.735ZM96.7,44.179C96.7,37.307 95.219,31.847 92.245,27.807C89.177,23.767 85.16,21.696 80.174,21.696C74.403,21.696 70.034,24.316 67.146,29.556L64.337,35.118L61.529,29.556C58.64,24.316 54.271,21.696 48.501,21.696C43.514,21.696 39.497,23.767 36.43,27.807C33.455,31.847 31.974,37.307 31.974,44.179L31.974,77.8L43.249,77.8L43.249,45.167C43.249,38.288 45.699,34.796 50.599,34.796C56.017,34.796 58.733,38.938 58.733,47.128L58.733,64.99L69.941,64.99L69.941,47.128C69.941,38.938 72.657,34.796 78.075,34.796C82.975,34.796 85.425,38.288 85.425,45.167L85.425,77.8L96.7,77.8L96.7,44.179Z\"/>\n</svg>\n"},"$:/core/images/menu-button":{"title":"$:/core/images/menu-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/minus-button":{"title":"$:/core/images/minus-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-minus-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64 0c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64C0 28.654 28.654 0 64 0zm.332 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/><rect width=\"80\" height=\"16\" x=\"24\" y=\"56\" rx=\"8\"/></svg>"},"$:/core/images/mono-block":{"title":"$:/core/images/mono-block","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/network-activity":{"title":"$:/core/images/network-activity","tags":"$:/tags/Image","text":"<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-network-activity tc-image-button\" viewBox=\"0 0 128 128\"><g class={{{ [{$:/state/http-requests}match[0]then[]else[tc-network-activity-background]] }}}>\n<$list filter=\"[{$:/state/http-requests}match[0]]\" variable=\"ignore\">\n<path d=\"M64.043 45.153a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.899a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.171l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.166l-.204.005a3.987 3.987 0 0 1-2.829-1.171l-8.899-8.9-3.102 7.491a4 4 0 1 1-7.391-3.062l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.008Zm13.636 56.74-8.023 8.024 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.008-7.019 7.019 8.016 8.016 7.019-7.02-8.016-8.015Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971-4.687 11.315 8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.607l-5.666 13.68c.096.072.188.15.278.232l.133.126 5.261 5.262 5.262-5.262c.128-.127.261-.244.4-.35L64 57.607Zm0-34.69a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\"/>\n</$list>\n<$list filter=\"[{$:/state/http-requests}!match[0]]\" variable=\"ignore\">\n<path d=\"M109.395.952a4.002 4.002 0 0 1 3.787 2.708C117.529 11.62 120 20.753 120 30.462c0 15.186-6.044 28.96-15.858 39.047a4 4 0 1 1-6.47-4.626l-.12-.094C106.466 56.074 112 43.914 112 30.462c0-8.492-2.205-16.469-6.074-23.39l.054-.036a4 4 0 0 1 3.415-6.084Zm-90.762 0a4 4 0 0 1 3.072 6.562l.093.06A47.786 47.786 0 0 0 16 30.463c0 13.315 5.42 25.363 14.176 34.058l-.01.007a4 4 0 1 1-6.312 4.863l-.063.05C14.017 59.359 8 45.613 8 30.462c0-9.77 2.502-18.956 6.9-26.952A4.002 4.002 0 0 1 18.634.952Z\"/><path d=\"M64.043 44.698a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.9a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.172l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.167l-.204.005a3.987 3.987 0 0 1-2.829-1.172l-8.899-8.899-3.102 7.49a4 4 0 0 1-7.391-3.061l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.009ZM77.68 101.44l-8.023 8.023 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.007-7.019 7.019 8.016 8.016 7.019-7.019-8.016-8.016Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971L50.348 90.11l8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.152l-5.666 13.68c.096.073.188.15.278.232l.133.127 5.261 5.261 5.262-5.261c.128-.128.261-.244.4-.351L64 57.152ZM38.503 1.058a4 4 0 0 1 2.7 6.952l.17-.175C35.582 13.625 32 21.625 32 30.462c0 8.838 3.582 16.838 9.374 22.629a4 4 0 0 1-5.659 5.658l-.01.01C28.473 51.52 24 41.526 24 30.485 24 19.567 28.374 9.67 35.466 2.453a3.995 3.995 0 0 1 3.037-1.395ZM89.369.952c1.14 0 2.17.478 2.899 1.244l.005-.006C99.518 9.43 104 19.434 104 30.485c0 10.826-4.3 20.648-11.287 27.85a4 4 0 1 1-6.054-5.213l-.032-.032C92.418 47.299 96 39.299 96 30.462c0-8.73-3.496-16.643-9.164-22.416A4 4 0 0 1 89.368.952Zm-39.282 11.14a4 4 0 0 1 2.59 7.048l.01.009A15.95 15.95 0 0 0 48 30.462a15.95 15.95 0 0 0 4.687 11.315l-.01.01a4 4 0 1 1-5.82 5.47l.173.177A23.925 23.925 0 0 1 40 30.462a23.925 23.925 0 0 1 7.03-16.97l.01.01a3.991 3.991 0 0 1 3.047-1.41Zm27.895.07a3.99 3.99 0 0 1 2.984 1.336l.006-.005A23.925 23.925 0 0 1 88 30.463a23.92 23.92 0 0 1-6.707 16.642l-.3.305a4 4 0 1 1-5.679-5.632v-.002A15.95 15.95 0 0 0 80 30.462a15.95 15.95 0 0 0-4.685-11.312 4.012 4.012 0 0 1-1.333-2.987 4 4 0 0 1 4-4ZM64 22.463a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\"/>\n</$list>\n</g></svg>"},"$:/core/images/new-button":{"title":"$:/core/images/new-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"<$parameters size=\"22pt\" day=<<now \"DD\">>><svg width=<<size>> height=<<size>> 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\"><$text text=<<day>>/></tspan></text></g></svg></$parameters>"},"$:/core/images/opacity":{"title":"$:/core/images/opacity","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-language tc-image-button\"><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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-plugin tc-image-button\"><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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> viewBox=\"0 0 128 128\" class=\"tc-image-plugin-generic-theme tc-image-button\"><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/plus-button":{"title":"$:/core/images/plus-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-plus-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64-.333c35.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-64zM64 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/><rect width=\"80\" height=\"16\" x=\"24\" y=\"56\" rx=\"8\"/><rect width=\"16\" height=\"80\" x=\"56\" y=\"24\" rx=\"8\"/></svg>"},"$:/core/images/preview-closed":{"title":"$:/core/images/preview-closed","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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-dynamic":{"title":"$:/core/images/save-button-dynamic","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-save-button-dynamic tc-image-button\" viewBox=\"0 0 128 128\">\n<g class=\"tc-image-save-button-dynamic-clean\">\n<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\"/>\n</g>\n<g class=\"tc-image-save-button-dynamic-dirty\">\n<path d=\"M64.856912,0 C100.203136,0 128.856912,28.653776 128.856912,64 C128.856912,99.346224 100.203136,128 64.856912,128 C29.510688,128 0.856911958,99.346224 0.856911958,64 C0.856911958,28.653776 29.510688,0 64.856912,0 Z M64.856912,16 C38.347244,16 16.856912,37.490332 16.856912,64 C16.856912,90.509668 38.347244,112 64.856912,112 C91.3665799,112 112.856912,90.509668 112.856912,64 C112.856912,37.490332 91.3665799,16 64.856912,16 Z\"></path>\n<circle cx=\"65\" cy=\"64\" r=\"32\"></circle>\n</g>\n</svg>"},"$:/core/images/save-button":{"title":"$:/core/images/save-button","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/standard-layout":{"title":"$:/core/images/standard-layout","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> class=\"tc-image-standard-layout tc-image-button\" viewBox=\"0 0 128 128\">\n <path d=\"M71.93 72A8.07 8.07 0 0 1 80 80.07v7.86A8.071 8.071 0 0 1 71.93 96H8.07A8.067 8.067 0 0 1 0 87.93v-7.86A8.072 8.072 0 0 1 8.07 72h63.86Zm0 32a8.07 8.07 0 0 1 8.07 8.07v7.86a8.071 8.071 0 0 1-8.07 8.07H8.07A8.067 8.067 0 0 1 0 119.93v-7.86A8.072 8.072 0 0 1 8.07 104h63.86Zm0-104A8.068 8.068 0 0 1 80 8.07v47.86A8.073 8.073 0 0 1 71.93 64H8.07A8.07 8.07 0 0 1 0 55.93V8.07A8.072 8.072 0 0 1 8.07 0h63.86Zm48 0c2.14 0 4.193.85 5.706 2.364A8.067 8.067 0 0 1 128 8.07v111.86c0 2.14-.85 4.193-2.364 5.706A8.067 8.067 0 0 1 119.93 128H96.07c-2.14 0-4.193-.85-5.706-2.364A8.067 8.067 0 0 1 88 119.93V8.07c0-2.14.85-4.193 2.364-5.706A8.067 8.067 0 0 1 96.07 0h23.86ZM116 24h-16a3.995 3.995 0 0 0-2.828 1.172 3.995 3.995 0 0 0 0 5.656A3.995 3.995 0 0 0 100 32h16a3.995 3.995 0 0 0 2.828-1.172 3.995 3.995 0 0 0 0-5.656A3.995 3.995 0 0 0 116 24Z\"/>\n</svg>"},"$:/core/images/star-filled":{"title":"$:/core/images/star-filled","tags":"$:/tags/Image","text":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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":"\\parameters (size:\"22pt\")\n<svg width=<<size>> height=<<size>> 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/DeleteTiddlers/Caption":{"title":"$:/language/Buttons/DeleteTiddlers/Caption","text":"delete tiddlers"},"$:/language/Buttons/DeleteTiddlers/Hint":{"title":"$:/language/Buttons/DeleteTiddlers/Hint","text":"Delete tiddlers"},"$:/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/EmergencyDownload/Caption":{"title":"$:/language/Buttons/EmergencyDownload/Caption","text":"download tiddlers as json"},"$:/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/LayoutSwitcher/Hint":{"title":"$:/language/Buttons/LayoutSwitcher/Hint","text":"Open layout switcher"},"$:/language/Buttons/LayoutSwitcher/Caption":{"title":"$:/language/Buttons/LayoutSwitcher/Caption","text":"layout"},"$:/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/NetworkActivity/Caption":{"title":"$:/language/Buttons/NetworkActivity/Caption","text":"network activity"},"$:/language/Buttons/NetworkActivity/Hint":{"title":"$:/language/Buttons/NetworkActivity/Hint","text":"Cancel all network activity"},"$:/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/OpenControlPanel/Hint":{"title":"$:/language/Buttons/OpenControlPanel/Hint","text":"Open control panel"},"$:/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/TestCaseImport/Caption":{"title":"$:/language/Buttons/TestCaseImport/Caption","text":"import tiddlers"},"$:/language/Buttons/TestCaseImport/Hint":{"title":"$:/language/Buttons/TestCaseImport/Hint","text":"Import tiddlers"},"$:/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/DefaultTitle":{"title":"$:/language/Buttons/Excise/DefaultTitle","text":"New Excision"},"$:/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 {{retain story ordering||$:/snippets/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/RemoveTags":{"title":"$:/language/ControlPanel/Basics/RemoveTags","text":"Update to current format"},"$:/language/ControlPanel/Basics/RemoveTags/Hint":{"title":"$:/language/ControlPanel/Basics/RemoveTags/Hint","text":"Update the tags configuration to the latest format"},"$:/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/Cascades/Caption":{"title":"$:/language/ControlPanel/Cascades/Caption","text":"Cascades"},"$:/language/ControlPanel/Cascades/Hint":{"title":"$:/language/ControlPanel/Cascades/Hint","text":"These global rules are used to dynamically choose certain templates. The result of the cascade is the result of the first filter in the sequence that returns a result"},"$:/language/ControlPanel/Cascades/TagPrompt":{"title":"$:/language/ControlPanel/Cascades/TagPrompt","text":"Filters tagged <$macrocall $name=\"tag\" tag=<<currentTiddler>>/>"},"$:/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/EditTemplateBody/Caption":{"title":"$:/language/ControlPanel/EditTemplateBody/Caption","text":"Edit Template Body"},"$:/language/ControlPanel/EditTemplateBody/Hint":{"title":"$:/language/ControlPanel/EditTemplateBody/Hint","text":"This rule cascade is used by the default edit template to dynamically choose the template for editing the body of a tiddler."},"$:/language/ControlPanel/FieldEditor/Caption":{"title":"$:/language/ControlPanel/FieldEditor/Caption","text":"Field Editor"},"$:/language/ControlPanel/FieldEditor/Hint":{"title":"$:/language/ControlPanel/FieldEditor/Hint","text":"This rules cascade is used to dynamically choose the template for rendering a tiddler field based on its name. It is used within the Edit Template."},"$:/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/LayoutSwitcher/Caption":{"title":"$:/language/ControlPanel/LayoutSwitcher/Caption","text":"Layout"},"$:/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/Stability/Deprecated":{"title":"$:/language/ControlPanel/Plugins/Stability/Deprecated","text":"DEPRECATED"},"$:/language/ControlPanel/Plugins/Stability/Experimental":{"title":"$:/language/ControlPanel/Plugins/Stability/Experimental","text":"EXPERIMENTAL"},"$:/language/ControlPanel/Plugins/Stability/Legacy":{"title":"$:/language/ControlPanel/Plugins/Stability/Legacy","text":"LEGACY"},"$:/language/ControlPanel/Plugins/Stability/Stable":{"title":"$:/language/ControlPanel/Plugins/Stability/Stable","text":"STABLE"},"$:/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/ControlPanel":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel","text":"~TiddlySpot Control Panel"},"$:/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 [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], or a compatible remote server. See [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] for information on ~TiddlySpot and ~TiddlyHost saving configuration."},"$:/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/ReadOnly":{"title":"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly","text":"Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites, you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service that replaces ~TiddlySpot."},"$:/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/RecentLimit/Caption":{"title":"$:/language/ControlPanel/Settings/RecentLimit/Caption","text":"Recent Tab Limit"},"$:/language/ControlPanel/Settings/RecentLimit/Hint":{"title":"$:/language/ControlPanel/Settings/RecentLimit/Hint","text":"Maximum number of tiddlers to be displayed under the sidebar \"Recent\" tab"},"$:/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/SocialCard/Caption":{"title":"$:/language/ControlPanel/SocialCard/Caption","text":"Social Media Card"},"$:/language/ControlPanel/SocialCard/Domain/Prompt":{"title":"$:/language/ControlPanel/SocialCard/Domain/Prompt","text":"Domain name to display for the link (for example, ''tiddlywiki.com'')"},"$:/language/ControlPanel/SocialCard/Hint":{"title":"$:/language/ControlPanel/SocialCard/Hint","text":"This information is used by social and messaging services to display a preview card for links to this TiddlyWiki when hosted online"},"$:/language/ControlPanel/SocialCard/PreviewUrl/Prompt":{"title":"$:/language/ControlPanel/SocialCard/PreviewUrl/Prompt","text":"Full URL to preview image for this TiddlyWiki"},"$:/language/ControlPanel/SocialCard/PreviewUrl/Preview":{"title":"$:/language/ControlPanel/SocialCard/PreviewUrl/Preview","text":"Preview image:"},"$:/language/ControlPanel/SocialCard/Url/Prompt":{"title":"$:/language/ControlPanel/SocialCard/Url/Prompt","text":"Full URL of this TiddlyWiki"},"$:/language/ControlPanel/StoryTiddler/Caption":{"title":"$:/language/ControlPanel/StoryTiddler/Caption","text":"Story Tiddler"},"$:/language/ControlPanel/StoryTiddler/Hint":{"title":"$:/language/ControlPanel/StoryTiddler/Hint","text":"This rule cascade is used to dynamically choose the template for displaying a tiddler in the story river."},"$:/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/TestCases/Caption":{"title":"$:/language/ControlPanel/TestCases/Caption","text":"Test Cases"},"$:/language/ControlPanel/TestCases/Hint":{"title":"$:/language/ControlPanel/TestCases/Hint","text":"Test cases are self contained examples for testing and learning"},"$:/language/ControlPanel/TestCases/All/Caption":{"title":"$:/language/ControlPanel/TestCases/All/Caption","text":"All Test Cases"},"$:/language/ControlPanel/TestCases/All/Hint":{"title":"$:/language/ControlPanel/TestCases/All/Hint","text":"All Test Cases"},"$:/language/ControlPanel/TestCases/Failed/Caption":{"title":"$:/language/ControlPanel/TestCases/Failed/Caption","text":"Failed Test Cases"},"$:/language/ControlPanel/TestCases/Failed/Hint":{"title":"$:/language/ControlPanel/TestCases/Failed/Hint","text":"Only Failed Test Cases"},"$:/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/TiddlerColour/Caption":{"title":"$:/language/ControlPanel/TiddlerColour/Caption","text":"Tiddler Colour"},"$:/language/ControlPanel/TiddlerColour/Hint":{"title":"$:/language/ControlPanel/TiddlerColour/Hint","text":"This rules cascade is used to dynamically choose the colour for a tiddler (used for the icon and the associated tag pill)."},"$:/language/ControlPanel/TiddlerIcon/Caption":{"title":"$:/language/ControlPanel/TiddlerIcon/Caption","text":"Tiddler Icon"},"$:/language/ControlPanel/TiddlerIcon/Hint":{"title":"$:/language/ControlPanel/TiddlerIcon/Hint","text":"This rules cascade is used to dynamically choose the icon for a tiddler."},"$:/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/ControlPanel/ViewTemplateBody/Caption":{"title":"$:/language/ControlPanel/ViewTemplateBody/Caption","text":"View Template Body"},"$:/language/ControlPanel/ViewTemplateBody/Hint":{"title":"$:/language/ControlPanel/ViewTemplateBody/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the body of a tiddler."},"$:/language/ControlPanel/ViewTemplateTitle/Caption":{"title":"$:/language/ControlPanel/ViewTemplateTitle/Caption","text":"View Template Title"},"$:/language/ControlPanel/ViewTemplateTitle/Hint":{"title":"$:/language/ControlPanel/ViewTemplateTitle/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the title of a tiddler."},"$:/language/ControlPanel/ViewTemplateSubtitle/Caption":{"title":"$:/language/ControlPanel/ViewTemplateSubtitle/Caption","text":"View Template Subtitle"},"$:/language/ControlPanel/ViewTemplateSubtitle/Hint":{"title":"$:/language/ControlPanel/ViewTemplateSubtitle/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the subtitle of a tiddler."},"$:/language/ControlPanel/ViewTemplateTags/Caption":{"title":"$:/language/ControlPanel/ViewTemplateTags/Caption","text":"View Template Tags"},"$:/language/ControlPanel/ViewTemplateTags/Hint":{"title":"$:/language/ControlPanel/ViewTemplateTags/Hint","text":"This rule cascade is used by the default view template to dynamically choose the template for displaying the tags area of a tiddler."},"$:/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":"Parameters 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-browser":{"title":"$:/language/Docs/ModuleTypes/utils-browser","text":"Adds browser-specific 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/stability-stable":{"title":"$:/language/Docs/PaletteColours/stability-stable","text":"Badge for stability level \"stable\""},"$:/language/Docs/PaletteColours/stability-experimental":{"title":"$:/language/Docs/PaletteColours/stability-experimental","text":"Badge for stability level \"experimental\""},"$:/language/Docs/PaletteColours/stability-deprecated":{"title":"$:/language/Docs/PaletteColours/stability-deprecated","text":"Badge for stability level \"deprecated\""},"$:/language/Docs/PaletteColours/stability-legacy":{"title":"$:/language/Docs/PaletteColours/stability-legacy","text":"Badge for stability level \"legacy\""},"$:/language/Docs/PaletteColours/testcase-accent-level-1":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-1","text":"Test case accent colour with no nesting"},"$:/language/Docs/PaletteColours/testcase-accent-level-2":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-2","text":"Test case accent colour with 2nd level nesting"},"$:/language/Docs/PaletteColours/testcase-accent-level-3":{"title":"$:/language/Docs/PaletteColours/testcase-accent-level-3","text":"Test case accent colour with 3rd level nesting or higher"},"$:/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/Caption":{"title":"$:/language/EditTemplate/Caption","text":"Editor"},"$:/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/Body/Preview/Type/DiffShadow":{"title":"$:/language/EditTemplate/Body/Preview/Type/DiffShadow","text":"differences from shadow (if any)"},"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent":{"title":"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent","text":"differences from current"},"$:/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/ClearInput/Caption":{"title":"$:/language/EditTemplate/Tags/ClearInput/Caption","text":"clear input"},"$:/language/EditTemplate/Tags/ClearInput/Hint":{"title":"$:/language/EditTemplate/Tags/ClearInput/Hint","text":"Clear tag input"},"$:/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/Tags/EmptyMessage":{"title":"$:/language/EditTemplate/Tags/EmptyMessage","text":"No tags found"},"$:/language/EditTemplate/Tags/EmptyMessage/System":{"title":"$:/language/EditTemplate/Tags/EmptyMessage/System","text":"No system tags found"},"$:/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 text file"},"$:/language/Docs/Fields/_canonical_uri":{"title":"$:/language/Docs/Fields/_canonical_uri","text":"The full URI of an external image tiddler"},"$:/language/Docs/Fields/author":{"title":"$:/language/Docs/Fields/author","text":"Name of the author of a plugin"},"$:/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/class":{"title":"$:/language/Docs/Fields/class","text":"The CSS class applied to a tiddler when rendering it - see [[Custom styles by user-class]]. Also used for [[Modals]]"},"$:/language/Docs/Fields/code-body":{"title":"$:/language/Docs/Fields/code-body","text":"The view template will display the tiddler as code if set to ''yes''"},"$:/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/core-version":{"title":"$:/language/Docs/Fields/core-version","text":"For a plugin, indicates what version of TiddlyWiki with which it is compatible"},"$:/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 modal"},"$:/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/module-type":{"title":"$:/language/Docs/Fields/module-type","text":"For javascript tiddlers, specifies what kind of module it is"},"$:/language/Docs/Fields/name":{"title":"$:/language/Docs/Fields/name","text":"The human readable name associated with a plugin tiddler"},"$:/language/Docs/Fields/parent-plugin":{"title":"$:/language/Docs/Fields/parent-plugin","text":"For a plugin, specifies which plugin of which it is a sub-plugin"},"$:/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/stability":{"title":"$:/language/Docs/Fields/stability","text":"The development status of a plugin: deprecated, experimental, stable, or legacy"},"$:/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 modal"},"$:/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|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k\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><br><<lingo DefaultTiddlers/TopHint>>|<$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/commands":{"title":"$:/language/Help/commands","description":"Run commands returned from a filter","text":"Sequentially run the command tokens returned from a filter\n\n```\n--commands <filter>\n```\n\nExamples\n\n```\n--commands \"[enlist:raw{$:/build-commands-as-text}]\"\n```\n\n```\n--commands \"[{$:/build-commands-as-json}jsonindexes[]] :map[{$:/build-commands-as-json}jsonget<currentTiddler>]\"\n```\n"},"$:/language/Help/default":{"title":"$:/language/Help/default","text":"\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n\\whitespace trim\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>:\n \n<$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 request 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* ''use-browser-cache'' - set to \"yes\" to allow the browser to cache responses to save bandwidth (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 variables\n* ''value'': Value of optional variables\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* Multiple ''name''/''value'' pairs can be used to pass more than one variable\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* `--render '.' 'tiddlers.json' 'text/plain' '$:/core/templates/exporters/JsonFile' 'exportFilter' '[tag[HelloThere]]'` -- renders the tiddlers tagged \"HelloThere\" to a JSON file named \"tiddlers.json\"\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>] [ [<name>=<value>] ]*\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\nThe following options are supported:\n\n* ''filter'': a filter expression that defines the tiddlers to include in the output.\n* ''explodePlugins'': defaults to \"yes\"\n** ''yes'' will \"explode\" plugins into separate tiddler files and save them to the plugin directory within the wiki folder\n** ''no'' will suppress exploding plugins into their constituent tiddler files. It will save the plugin as a single JSON tiddler in the tiddlers folder\n\nNote that both ''explodePlugins'' options will produce wiki folders that build the exact same original wiki. The difference lies in how plugins are represented in the wiki 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\nSave the plugin to the tiddlers directory of the target wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder explodePlugins=no\n```\n"},"$:/language/Help/server":{"title":"$:/language/Help/server","description":"(deprecated: see 'listen' command) Provides an HTTP server interface to TiddlyWiki","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/Editor/Import/Heading":{"title":"$:/language/Import/Editor/Import/Heading","text":"Import images and insert them into the editor."},"$:/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/Cancel/Warning":{"title":"$:/language/Import/Listing/Cancel/Warning","text":"Do you wish to cancel the import?"},"$:/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/Listing/Rename/Tooltip":{"title":"$:/language/Import/Listing/Rename/Tooltip","text":"Rename tiddler before importing"},"$:/language/Import/Listing/Rename/Prompt":{"title":"$:/language/Import/Listing/Rename/Prompt","text":"Rename to:"},"$:/language/Import/Listing/Rename/ConfirmRename":{"title":"$:/language/Import/Listing/Rename/ConfirmRename","text":"Rename tiddler"},"$:/language/Import/Listing/Rename/CancelRename":{"title":"$:/language/Import/Listing/Rename/CancelRename","text":"Cancel"},"$:/language/Import/Listing/Rename/OverwriteWarning":{"title":"$:/language/Import/Listing/Rename/OverwriteWarning","text":"A tiddler with this title already exists."},"$:/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>> not being newer 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/Disabled":{"title":"$:/language/Import/Upgrader/System/Disabled","text":"Disabled system 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/Import/Upgrader/Tiddler/Disabled":{"title":"$:/language/Import/Upgrader/Tiddler/Disabled","text":"Disabled tiddler."},"$:/language/Import/Upgrader/Tiddler/Selected":{"title":"$:/language/Import/Upgrader/Tiddler/Selected","text":"Selected tiddler."},"$:/language/Import/Upgrader/Tiddler/Unselected":{"title":"$:/language/Import/Upgrader/Tiddler/Unselected","text":"Unselected tiddler."},"$:/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/ConfirmDeleteTiddlers":{"title":"$:/language/ConfirmDeleteTiddlers","text":"Are you sure you wish to delete <<resultCount>> tiddler(s)?"},"$:/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/ConfirmAction":{"title":"$:/language/ConfirmAction","text":"Do you wish to proceed?"},"$:/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 now (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/DeserializeOperator/MissingOperand":{"title":"$:/language/Error/DeserializeOperator/MissingOperand","text":"Filter Error: Missing operand for 'deserialize' operator"},"$:/language/Error/DeserializeOperator/UnknownDeserializer":{"title":"$:/language/Error/DeserializeOperator/UnknownDeserializer","text":"Filter Error: Unknown deserializer provided as operand for the 'deserialize' operator"},"$:/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/FilterRunPrefix":{"title":"$:/language/Error/FilterRunPrefix","text":"Filter Error: Unknown prefix for filter run"},"$:/language/Error/IsFilterOperator":{"title":"$:/language/Error/IsFilterOperator","text":"Filter Error: Unknown parameter for the 'is' filter operator"},"$:/language/Error/FormatFilterOperator":{"title":"$:/language/Error/FormatFilterOperator","text":"Filter Error: Unknown suffix for the 'format' 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/PutEditConflict":{"title":"$:/language/Error/PutEditConflict","text":"File changed on server"},"$:/language/Error/PutForbidden":{"title":"$:/language/Error/PutForbidden","text":"Permission denied"},"$:/language/Error/PutUnauthorized":{"title":"$:/language/Error/PutUnauthorized","text":"Authentication required"},"$:/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/Error/ZoominTextNode":{"title":"$:/language/Error/ZoominTextNode","text":"Story View Error: It appears you tried to interact with a tiddler that displays in a custom container. This is most likely caused by using `$:/tags/StoryTiddlerTemplateFilter` with a template that contains text or whitespace at the start. Please use the pragma `\\whitespace trim` and ensure the whole contents of the tiddler is wrapped in a single HTML element. The text that caused this issue:"},"$:/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/LayoutSwitcher/Description":{"title":"$:/language/LayoutSwitcher/Description","text":"Open the layout switcher"},"$:/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/PageTemplate/Description":{"title":"$:/language/PageTemplate/Description","text":"the default ~TiddlyWiki layout"},"$:/language/PageTemplate/Name":{"title":"$:/language/PageTemplate/Name","text":"Standard Layout"},"$:/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/Shortcuts/Input/AdvancedSearch/Hint":{"title":"$:/language/Shortcuts/Input/AdvancedSearch/Hint","text":"Open the ~AdvancedSearch panel from within the sidebar search field"},"$:/language/Shortcuts/Input/Accept/Hint":{"title":"$:/language/Shortcuts/Input/Accept/Hint","text":"Accept the selected item"},"$:/language/Shortcuts/Input/AcceptVariant/Hint":{"title":"$:/language/Shortcuts/Input/AcceptVariant/Hint","text":"Accept the selected item (variant)"},"$:/language/Shortcuts/Input/Cancel/Hint":{"title":"$:/language/Shortcuts/Input/Cancel/Hint","text":"Clear the input field"},"$:/language/Shortcuts/Input/Down/Hint":{"title":"$:/language/Shortcuts/Input/Down/Hint","text":"Select the next item"},"$:/language/Shortcuts/Input/Tab-Left/Hint":{"title":"$:/language/Shortcuts/Input/Tab-Left/Hint","text":"Select the previous Tab"},"$:/language/Shortcuts/Input/Tab-Right/Hint":{"title":"$:/language/Shortcuts/Input/Tab-Right/Hint","text":"Select the next Tab"},"$:/language/Shortcuts/Input/Up/Hint":{"title":"$:/language/Shortcuts/Input/Up/Hint","text":"Select the previous item"},"$:/language/Shortcuts/SidebarLayout/Hint":{"title":"$:/language/Shortcuts/SidebarLayout/Hint","text":"Change the sidebar layout"},"$:/language/Switcher/Subtitle/theme":{"title":"$:/language/Switcher/Subtitle/theme","text":"Switch Theme"},"$:/language/Switcher/Subtitle/layout":{"title":"$:/language/Switcher/Subtitle/layout","text":"Switch Layout"},"$:/language/Switcher/Subtitle/language":{"title":"$:/language/Switcher/Subtitle/language","text":"Switch Language"},"$:/language/Switcher/Subtitle/palette":{"title":"$:/language/Switcher/Subtitle/palette","text":"Switch Palette"},"$:/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"},"$:/config/NewJournal/Title":{"title":"$:/config/NewJournal/Title","text":"DDth MMM YYYY"},"$:/config/NewJournal/Text":{"title":"$:/config/NewJournal/Text","text":""},"$:/config/NewJournal/Tags":{"title":"$:/config/NewJournal/Tags","text":"Journal\n"},"$:/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/NoMatch":{"title":"$:/language/Search/Matches/NoMatch","text":"//No match//"},"$:/language/Search/Matches/NoResult":{"title":"$:/language/Search/Matches/NoResult","text":"//No search result//"},"$:/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/Caption":{"title":"$:/language/SideBar/Caption","text":"Sidebar"},"$:/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/FunctionDefinition":{"title":"$:/language/Snippets/FunctionDefinition","tags":"$:/tags/TextEditor/Snippet","caption":"Function definition","text":"\\function f.name(param1,param2:\"default value\") [<param1>!is[blank]else<param2>]\n\n<<f.name>>\n"},"$:/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/ProcedureDefinition":{"title":"$:/language/Snippets/ProcedureDefinition","tags":"$:/tags/TextEditor/Snippet","caption":"Procedure definition","text":"\\procedure procName(param1:\"default value\",param2)\nYour text comes here.\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":"Backlinks"},"$:/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":"SVG image","name":"image/svg+xml","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/vnd.tiddlywiki-multiple":{"title":"$:/language/Docs/Types/text/vnd.tiddlywiki-multiple","description":"Compound tiddler","name":"text/vnd.tiddlywiki-multiple","group":"Developer","group-sort":"2"},"$:/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;\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 && $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/commands.js":{"title":"$:/core/modules/commands/commands.js","text":"/*\\\ntitle: $:/core/modules/commands/commands.js\ntype: application/javascript\nmodule-type: command\n\nRuns the commands returned from a filter\n\n\\*/\n\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"commands\",\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// Parse the filter\n\tvar filter = this.params[0];\n\tif(!filter) {\n\t\treturn \"No filter specified\";\n\t}\n\tvar commands = this.commander.wiki.filterTiddlers(filter)\n\tif(commands.length === 0) {\n\t\treturn \"No tiddlers found for filter '\" + filter + \"'\";\n\t}\n\tthis.commander.addCommandTokens(commands);\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 = this.commander.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)\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 = $tw.utils.parseJSONSafe(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\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = $tw.utils.getAllPlugins();\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\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\t\n\tvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\t\n\texports.info = {\n\t\tname: \"render\",\n\t\tsynchronous: true\n\t};\n\t\n\tvar Command = function(params,commander,callback) {\n\t\tthis.params = params;\n\t\tthis.commander = commander;\n\t\tthis.callback = callback;\n\t};\n\t\n\tCommand.prototype.execute = function() {\n\t\tif(this.params.length < 1) {\n\t\t\treturn \"Missing tiddler filter\";\n\t\t}\n\t\tvar self = this,\n\t\t\tfs = require(\"fs\"),\n\t\t\tpath = require(\"path\"),\n\t\t\twiki = this.commander.wiki,\n\t\t\ttiddlerFilter = this.params[0],\n\t\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\t\ttype = this.params[2] || \"text/html\",\n\t\t\ttemplate = this.params[3],\n\t\t\tvariableList = this.params.slice(4),\n\t\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter),\n\t\t\tvariables = Object.create(null);\n\t\t\twhile(variableList.length >= 2) {\n\t\t\t\tvariables[variableList[0]] = variableList[1];\n\t\t\t\tvariableList = variableList.slice(2);\n\t\t\t}\n\t\t$tw.utils.each(tiddlers,function(title) {\n\t\t\tvar filenameResults = wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]));\n\t\t\tif(filenameResults.length > 0) {\n\t\t\t\tvar filepath = path.resolve(self.commander.outputPath,filenameResults[0]);\n\t\t\t\tif(self.commander.verbose) {\n\t\t\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t\t\t}\n\t\t\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\t\t\twidgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),\n\t\t\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\t\t\twidgetNode.render(container,null);\n\t\t\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t\t\t$tw.utils.createFileDirectories(filepath);\n\t\t\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Not rendering \\\"\" + title + \"\\\" because the filename filter returned an empty result\");\n\t\t\t}\n\t\t});\n\t\treturn null;\n\t};\n\t\n\texports.Command = Command;\n\t\n\t})();\n\t","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\tvariables.storyTiddler = 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]),\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, storyTiddler: 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,$tw.utils.encodeURIComponentExtended(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\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\t\n\texports.info = {\n\t\tname: \"save\",\n\t\tsynchronous: true\n\t};\n\t\n\tvar Command = function(params,commander,callback) {\n\t\tthis.params = params;\n\t\tthis.commander = commander;\n\t\tthis.callback = callback;\n\t};\n\t\n\tCommand.prototype.execute = function() {\n\t\tif(this.params.length < 1) {\n\t\t\treturn \"Missing filename filter\";\n\t\t}\n\t\tvar self = this,\n\t\t\tfs = require(\"fs\"),\n\t\t\tpath = require(\"path\"),\n\t\t\tresult = null,\n\t\t\twiki = this.commander.wiki,\n\t\t\ttiddlerFilter = this.params[0],\n\t\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t\t$tw.utils.each(tiddlers,function(title) {\n\t\t\tif(!result) {\n\t\t\t\tvar tiddler = self.commander.wiki.getTiddler(title);\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\t\t\t\t\tdirectory: path.resolve(self.commander.outputPath),\n\t\t\t\t\t\tpathFilters: [filenameFilter],\n\t\t\t\t\t\twiki: wiki,\n\t\t\t\t\t\tfileInfo: {\n\t\t\t\t\t\t\toverwrite: true\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(self.commander.verbose) {\n\t\t\t\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + fileInfo.filepath + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tresult = \"Error saving tiddler \\\"\" + title + \"\\\", to file: \\\"\" + fileInfo.filepath + \"\\\"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult = \"Tiddler '\" + title + \"' not found\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t};\n\t\n\texports.Command = Command;\n\t\n\t})();\n\t","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> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\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 + $tw.utils.encodeURIComponentExtended(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 = $tw.utils.parseJSONSafe(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.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,$tw.utils.encodeURIComponentExtended(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> [ [<name>=<value>] ]*\n\nThe following options are supported:\n\n* ''filter'': a filter expression defining the tiddlers to be included in the output\n* ''explodePlugins'': set to \"no\" to suppress exploding plugins into their constituent shadow tiddlers (defaults to \"yes\")\n\nSupports backward compatibility with --savewikifolder <wikifolderpath> [<filter>] [ [<name>=<value>] ]*\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 regFilter = /^[a-zA-Z0-9\\.\\-_]+=/g, // dynamic parameters\n\t\tnamedParames,\n\t\ttiddlerFilter,\n\t\toptions = {};\n\tif (regFilter.test(this.params[1])) { \n\t\tnamedParames = this.commander.extractNamedParameters(this.params.slice(1));\n\t\ttiddlerFilter = namedParames.filter || \"[all[tiddlers]]\";\n\t} else {\n\t\tnamedParames = this.commander.extractNamedParameters(this.params.slice(2));\n\t\ttiddlerFilter = this.params[1];\n\t}\n\ttiddlerFilter = tiddlerFilter || \"[all[tiddlers]]\";\n\toptions.explodePlugins = namedParames.explodePlugins || \"yes\";\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],tiddlerFilter,this.commander,options);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander,options) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter;\n\tthis.commander = commander;\n\tthis.explodePlugins = options.explodePlugins;\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 if(self.explodePlugins !== \"no\") {\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} else if(self.explodePlugins === \"no\") {\n\t\t\t\t\t\tself.log(\"Processing custom plugin to tiddlders folder: \" + title);\n\t\t\t\t\t\tself.saveTiddler(\"tiddlers\", tiddler);\n\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 = $tw.utils.parseJSONSafe(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler,title) {\n\t\tif(!tiddler.title) {\n\t\t\ttiddler.title = title;\n\t\t }\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar title = tiddler.fields.title, fileInfo, pathFilters, extFilters;\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemPaths\")) {\n\t\tpathFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemPaths\",\"\").split(\"\\n\");\n\t}\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemExtensions\")) {\n\t\textFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemExtensions\",\"\").split(\"\\n\");\n\t}\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\tpathFilters: pathFilters,\n\t\textFilters: extFilters,\n\t\twiki: this.wiki,\n\t\tfileInfo: {}\n\t});\n\ttry {\n\t\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n\t} catch (err) {\n\t\tconsole.log(\"SaveWikiFolder: Error saving file '\" + fileInfo.filepath + \"', tiddler: '\" + tiddler.fields.title);\n\t}\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, dollar:36, 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, nobreak:8288, NoBreak:8288, 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,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,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\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [deserializeTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar results = [],\n\t\tincoming = $tw.utils.parseJSONSafe(text,function(err) {\n\t\t\treturn [{\n\t\t\t\ttitle: \"JSON error: \" + err,\n\t\t\t\ttext: \"\"\n\t\t\t}];\n\t\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\tvar results = [];\n\t// Check if we've got an old-style store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tstoreAreaMatch = storeAreaMarkerRegExp.exec(text);\n\tif(storeAreaMatch) {\n\t\t// If so, we've got tiddlers in classic TiddlyWiki format or unencrypted old-style TW5 format\n\t\tresults.push.apply(results,deserializeStoreArea(text,storeAreaMarkerRegExp.lastIndex,!!storeAreaMatch[1],fields));\n\t}\n\t// Check for new-style store areas\n\tvar newStoreAreaMarkerRegExp = /<script class=\"tiddlywiki-tiddler-store\" type=\"([^\"]*)\">/gi,\n\t\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text),\n\t\thaveHadNewStoreArea = !!newStoreAreaMatch;\n\twhile(newStoreAreaMatch) {\n\t\tresults.push.apply(results,deserializeNewStoreArea(text,newStoreAreaMarkerRegExp.lastIndex,newStoreAreaMatch[1],fields));\n\t\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text);\n\t}\n\t// Return if we had either an old-style or a new-style store area\n\tif(storeAreaMatch || haveHadNewStoreArea) {\n\t\treturn results;\n\t}\n\t// Otherwise, check whether we've got an encrypted file\n\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\tif(encryptedStoreArea) {\n\t\t// If so, attempt to decrypt it using the current password\n\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t} else {\n\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\treturn deserializeHtmlFile(text,fields);\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 deserializeNewStoreArea(text,storeAreaEnd,type,fields) {\n\tvar endOfScriptRegExp = /<\\/script>/gi;\n\tendOfScriptRegExp.lastIndex = storeAreaEnd;\n\tvar match = endOfScriptRegExp.exec(text);\n\tif(match) {\n\t\tvar scriptContent = text.substring(storeAreaEnd,match.index);\n\t\treturn $tw.wiki.deserializeTiddlers(type,scriptContent);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nfunction deserializeStoreArea(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 = deserializeTiddlerDiv(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/*\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 deserializeTiddlerDiv = 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\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\tvar paletteTitle = this.widget.wiki.getTiddlerText(\"$:/palette\");\n\tvar colorScheme = (this.widget.wiki.getTiddler(paletteTitle) || {fields: {}}).fields[\"color-scheme\"] || \"light\";\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"<meta name='color-scheme' content='\" + colorScheme + \"'>\");\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 && this.widget.editTag !== \"textarea\") {\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\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\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,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Add drag and drop event listeners if fileDrop is enabled\n\tif(this.widget.isFileDropEnabled) {\n\t\t$tw.utils.addEventListeners(this.domNode,[\n\t\t\t{name: \"dragenter\",handlerObject: this.widget,handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\",handlerObject: this.widget,handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\",handlerObject: this.widget,handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"dragend\",handlerObject: this.widget,handlerMethod: \"handleDragEndEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this.widget,handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this.widget,handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"click\",handlerObject: this.widget,handlerMethod: \"handleClickEvent\"}\n\t\t]);\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\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n\t// Ensure we don't force text direction to LTR\n\tthis.domNode.style.removeProperty(\"direction\");\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.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\ttry {\n\t\tthis.domNode.value = text;\n\t} catch(e) {\n\t\t// Ignore\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 + \"px\";\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 + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus) {\n\t\tthis.domNode.focus();\n\t}\n\tif(this.domNode.select) {\n\t\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n};\n\n/*\nHandle a keydown event\n */\nFramedEngine.prototype.handleKeydownEvent = function(event) {\n\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\n\t\treturn true;\n\t}\n\n\treturn this.widget.handleKeydownEvent(event);\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\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\n\t}\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 && this.widget.editTag !== \"textarea\") {\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\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\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.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\ttry {\n\t\tthis.domNode.value = text;\n\t} catch(e) {\n\t\t// Ignore\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) {\n\t\tthis.domNode.focus();\n\t}\n\tif(this.domNode.select) {\n\t\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\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\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\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\tif(tiddler.hasField(this.editField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = this.editDefault || \"\";\n\t\t\t\t}\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 = \"\";\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.editFocusSelectFromStart = $tw.utils.parseNumber(this.getAttribute(\"focusSelectFromStart\",\"0\"));\n\t\tthis.editFocusSelectFromEnd = $tw.utils.parseNumber(this.getAttribute(\"focusSelectFromEnd\",\"0\"));\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\tthis.isFileDropEnabled = this.getAttribute(\"fileDrop\",\"no\") === \"yes\";\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 || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedTiddlers[\"$:/palette\"] || changedAttributes.disabled || changedAttributes.fileDrop) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\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.cloneEvent(event,[\"keyCode\",\"code\",\"which\",\"key\",\"metaKey\",\"ctrlKey\",\"altKey\",\"shiftKey\"]);\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\tEditTextWidget.prototype.cloneEvent = function(event,propertiesToCopy) {\n\t\tvar propertiesToCopy = propertiesToCopy || [],\n\t\t\tnewEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(event.type, true, true);\n\t\t}\n\t\t$tw.utils.each(propertiesToCopy,function(prop){\n\t\t\tnewEvent[prop] = event[prop];\n\t\t});\n\t\treturn newEvent;\n\t};\n\n\tEditTextWidget.prototype.dispatchDOMEvent = function(newEvent) {\n\t\tvar dispatchNode = this.engine.iframeNode || this.engine.parentNode;\n\t\treturn dispatchNode.dispatchEvent(newEvent);\n\t};\n\n\t/*\n\tPropogate drag and drop events with File data to our container for the dropzone widgets benefit.\n\tIf there are no Files, let the browser handle it.\n\t*/\n\tEditTextWidget.prototype.handleDropEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t} \n\t};\n\n\tEditTextWidget.prototype.handlePasteEvent = function(event) {\n\t\tif(event.clipboardData && event.clipboardData.files && event.clipboardData.files.length) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"clipboardData\"]));\n\t\t}\n\t};\n\n\tEditTextWidget.prototype.handleDragEnterEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\n\t\t\tif( event.relatedTarget && (event.relatedTarget.nodeType === 3 || event.target === event.relatedTarget)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t}\n\t\treturn true;\n\t};\n\n\tEditTextWidget.prototype.handleDragOverEvent = function(event) {\n\t\tif($tw.utils.dragEventContainsFiles(event)) {\n\t\t\t// Call preventDefault() in browsers that default to not allowing drop events on textarea\n\t\t\tif($tw.browser.isFirefox || $tw.browser.isIE) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tevent.dataTransfer.dropEffect = \"copy\";\n\t\t\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t\t}\n\t\treturn true;\n\t};\n\n\tEditTextWidget.prototype.handleDragLeaveEvent = function(event) {\n\t\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\n\t\tif(event.relatedTarget && ((event.relatedTarget.nodeType === 3) || (event.target === event.relatedTarget))) {\n\t\t\treturn true;\n\t\t}\n\t\tevent.preventDefault();\n\t\tthis.dispatchDOMEvent(this.cloneEvent(event,[\"dataTransfer\"]));\n\t};\n\n\tEditTextWidget.prototype.handleDragEndEvent = function(event) {\n\t\tthis.dispatchDOMEvent(this.cloneEvent(event));\n\t};\n\n\tEditTextWidget.prototype.handleClickEvent = function(event) {\n\t\treturn !this.dispatchDOMEvent(this.cloneEvent(event));\n\t};\n\n\treturn EditTextWidget;\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\nfunction isMarkdown(mediaType) {\n\treturn mediaType === 'text/markdown' || mediaType === 'text/x-markdown';\n}\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle,\n\t\twikiLinks = !isMarkdown(editTiddler.fields.type),\n\t\texcisionBaseTitle = $tw.language.getString(\"Buttons/Excise/DefaultTitle\");\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(excisionBaseTitle);\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\ttype: editTiddler.fields.type\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 = wikiLinks ? \"[[\" + operation.replacement+ \"]]\"\n\t\t\t\t: (\"[\" + operation.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/focus-editor.js":{"title":"$:/core/modules/editor/operations/text/focus-editor.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/focus-editor.js\ntype: application/javascript\nmodule-type: texteditoroperation\nSimply focus the Text editor\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"focus-editor\"] = function(event,operation) {\n\toperation = null;\n};\n\n})();","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/editor/operations/text/insert-text.js":{"title":"$:/core/modules/editor/operations/text/insert-text.js","text":"/*\\\ntitle: $:/core/modules/editor/operations/text/insert-text.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation insert text at the caret position. If there is a selection it is replaced.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"insert-text\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\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/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($tw.utils.startsWith(line,event.paramObject.character)) {\n\t\t\tline = line.substring(event.paramObject.character.length);\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\tvar prefix = event.paramObject.prefix || \"\",\n\t\tsuffix = event.paramObject.suffix || \"\";\n\tif($tw.utils.endsWith(operation.text.substring(0,operation.selStart), prefix + \"\\n\") &&\n\t\t\t$tw.utils.startsWith(operation.text.substring(operation.selEnd), \"\\n\" + suffix)) {\n\t\t// Selected text is already surrounded by prefix and suffix: Remove them\n\t\t// Cut selected text plus prefix and suffix\n\t\toperation.cutStart = operation.selStart - (prefix.length + 1);\n\t\toperation.cutEnd = operation.selEnd + suffix.length + 1;\n\t\t// Also cut the following newline (if there is any)\n\t\tif (operation.text[operation.cutEnd] === \"\\n\") {\n\t\t\toperation.cutEnd++;\n\t\t}\n\t\t// Replace with selection\n\t\toperation.replacement = operation.text.substring(operation.selStart,operation.selEnd);\n\t\t// Select text that was in between prefix and suffix\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.selEnd - (prefix.length + 1);\n\t} else {\n\t\t// Cut just past the preceding line break, or the start of the text\n\t\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t\t// Cut to just past the following line break, or to the end of the text\n\t\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t\t// Add the prefix and suffix\n\t\toperation.replacement = prefix + \"\\n\" +\n\t\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\t\tsuffix + \"\\n\";\n\t\toperation.newSelStart = operation.cutStart + prefix.length + 1;\n\t\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n\t}\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\tvar o = operation,\n\t\tprefix = event.paramObject.prefix,\n\t\tsuffix = event.paramObject.suffix,\n\t\ttrimSelection = event.paramObject.trimSelection || \"no\",\n\t\tselLength = o.selEnd - o.selStart;\n\n\t// This function detects, if trailing spaces are part of the selection __and__ if the user wants to handle them\n\t// Returns \"yes\", \"start\", \"end\", \"no\" (default)\n\t//\tyes .. there are trailing spaces at both ends\n\t//\tstart .. there are trailing spaces at the start\n\t//\tend .. there are trailing spaces at the end\n\t//\tno .. no trailing spaces are taken into account\n\tvar trailingSpaceAt = function(sel) {\n\t\tvar _start,\n\t\t\t_end,\n\t\t\tresult;\n\t\t// trimSelection is a user parameter, which this evaluations takes into account\n\t\tswitch(trimSelection) {\n\t\t\tcase \"end\":\n\t\t\t\tresult = (sel.trimEnd().length !== selLength) ? \"end\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tcase \"yes\":\n\t\t\t\t_start = sel.trimStart().length !== selLength;\n\t\t\t\t_end = sel.trimEnd().length !== selLength;\n\t\t\t\tresult = (_start && _end) ? \"yes\" : (_start) ? \"start\" : (_end) ? \"end\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tcase \"start\":\n\t\t\t\tresult = (sel.trimStart().length !== selLength) ? \"start\" : \"no\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tresult = \"no\";\n\t\t\t\tbreak;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction togglePrefixSuffix() {\n\t\tif(o.text.substring(o.selStart - prefix.length, o.selStart + suffix.length) === prefix + suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\to.cutStart = o.selStart - prefix.length;\n\t\t\to.cutEnd = o.selEnd + suffix.length;\n\t\t\to.replacement = \"\";\n\t\t\to.newSelStart = o.cutStart;\n\t\t\to.newSelEnd = o.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\to.cutStart = o.selStart;\n\t\t\to.cutEnd = o.selEnd;\n\t\t\to.replacement = prefix + suffix;\n\t\t\to.newSelStart = o.selStart + prefix.length;\n\t\t\to.newSelEnd = o.newSelStart;\n\t\t}\n\t}\n\n\t// options: lenPrefix, lenSuffix\n\tfunction removePrefixSuffix(options) {\n\t\toptions = options || {};\n\t\tvar _lenPrefix = options.lenPrefix || 0;\n\t\tvar _lenSuffix = options.lenSuffix || 0;\n\n\t\to.cutStart = o.selStart - _lenPrefix;\n\t\to.cutEnd = o.selEnd + _lenSuffix;\n\t\to.replacement = (_lenPrefix || _lenSuffix) ? o.selection : o.selection.substring(prefix.length, o.selection.length - suffix.length);\n\t\to.newSelStart = o.cutStart;\n\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t}\n\n\tfunction addPrefixSuffix() {\n\t\t// remove trailing space if requested\n\t\tswitch(trailingSpaceAt(o.selection)) {\n\t\t\tcase \"no\":\n\t\t\t\t// has no trailing spaces\n\t\t\t\to.cutStart = o.selStart;\n\t\t\t\to.cutEnd = o.selEnd;\n\t\t\t\to.replacement = prefix + o.selection + suffix;\n\t\t\t\to.newSelStart = o.selStart;\n\t\t\t\to.newSelEnd = o.selStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"yes\":\n\t\t\t\t// handle both ends\n\t\t\t\to.cutStart = o.selEnd - (o.selection.trimStart().length);\n\t\t\t\to.cutEnd = o.selection.trimEnd().length + o.selStart;\n\t\t\t\to.replacement = prefix + o.selection.trim() + suffix;\n\t\t\t\to.newSelStart = o.cutStart;\n\t\t\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"start\":\n\t\t\t\t// handle leading\n\t\t\t\to.cutStart = o.selEnd - (o.selection.trimStart().length);\n\t\t\t\to.cutEnd = o.selEnd;\n\t\t\t\to.replacement = prefix + o.selection.trimStart() + suffix;\n\t\t\t\to.newSelStart = o.cutStart;\n\t\t\t\to.newSelEnd = o.cutStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t\tcase \"end\":\n\t\t\t\t// handle trailing\n\t\t\t\to.cutStart = o.selStart;\n\t\t\t\to.cutEnd = o.selection.trimEnd().length + o.selStart;\n\t\t\t\to.replacement = prefix + o.selection.trimEnd() + suffix;\n\t\t\t\to.newSelStart = o.selStart;\n\t\t\t\to.newSelEnd = o.selStart + o.replacement.length;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(o.selStart === o.selEnd) {\n\t\t// No selection; Create prefix and suffix. Set cursor in between them: \"\"|\"\"\n\t\ttogglePrefixSuffix();\n\t} else if(o.text.substring(o.selStart, o.selStart + prefix.length) === prefix &&\n\t\t\t\to.text.substring(o.selEnd - suffix.length,o.selEnd) === suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\tremovePrefixSuffix();\n\t} else if(o.text.substring(o.selStart - prefix.length, o.selStart) === prefix &&\n\t\t\t\to.text.substring(o.selEnd, o.selEnd + suffix.length) === suffix) {\n\t\t// Prefix and suffix are present BUT not selected -> remove them\n\t\tremovePrefixSuffix({\"lenPrefix\": prefix.length, \"lenSuffix\": suffix.length});\n\t} else {\n\t\t// Add the prefix and suffix\n\t\taddPrefixSuffix();\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"texteditoroperation"},"$:/core/modules/filterrunprefixes/all.js":{"title":"$:/core/modules/filterrunprefixes/all.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/and.js":{"title":"$:/core/modules/filterrunprefixes/and.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/cascade.js":{"title":"$:/core/modules/filterrunprefixes/cascade.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/cascade.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.cascade = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar filterList = operationSubFunction(source,widget),\n\t\t\t\tfilterFnList = [];\n\t\t\tvar inputResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(inputResults,function(title) {\n\t\t\t\tvar result = \"\"; // If no filter matches, we return an empty string\n\t\t\t\t$tw.utils.each(filterList,function(filter,index) {\n\t\t\t\t\tif(!filterFnList[index]) {\n\t\t\t\t\t\tfilterFnList[index] = options.wiki.compileFilter(filter);\n\t\t\t\t\t}\n\t\t\t\t\tvar output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\")\n\t\t\t\t\t}));\n\t\t\t\t\tif(output.length !== 0) {\n\t\t\t\t\t\tresult = output[0];\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults.push(result);\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/else.js":{"title":"$:/core/modules/filterrunprefixes/else.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/except.js":{"title":"$:/core/modules/filterrunprefixes/except.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/filter.js":{"title":"$:/core/modules/filterrunprefixes/filter.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\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.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [],\n\t\t\t\tindex = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" + (results.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + results.length\n\t\t\t\t}));\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(title);\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/intersection.js":{"title":"$:/core/modules/filterrunprefixes/intersection.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/map.js":{"title":"$:/core/modules/filterrunprefixes/map.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/map.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.map = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar inputTitles = results.toArray(),\n\t\t\t\tindex = 0,\n\t\t\t\tsuffixes = options.suffixes,\n\t\t\t\tflatten = (suffixes[0] && suffixes[0][0] === \"flat\") ? true : false;\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(inputTitles,function(title) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\",\"\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" + (inputTitles.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + inputTitles.length\n\t\t\t\t}));\n\t\t\t\tif(filtered.length && flatten) {\n\t\t\t\t\t$tw.utils.each(filtered,function(value) {\n\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(filtered[0]||\"\");\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/or.js":{"title":"$:/core/modules/filterrunprefixes/or.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/reduce.js":{"title":"$:/core/modules/filterrunprefixes/reduce.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\",\n\t\t\t\tindex = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\"),\n\t\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\t\"revIndex\": \"\" + (results.length - 1 - index),\n\t\t\t\t\t\"length\": \"\" + results.length,\n\t\t\t\t\t\"accumulator\": \"\" + accumulator\n\t\t\t\t}));\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\n\t\t}\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/sort.js":{"title":"$:/core/modules/filterrunprefixes/sort.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/sort.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.sort = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar suffixes = options.suffixes,\n\t\t\t\tsortType = (suffixes[0] && suffixes[0][0]) ? suffixes[0][0] : \"string\",\n\t\t\t\tinvert = suffixes[1] ? (suffixes[1].indexOf(\"reverse\") !== -1) : false,\n\t\t\t\tisCaseSensitive = suffixes[1] ? (suffixes[1].indexOf(\"casesensitive\") !== -1) : false,\n\t\t\t\tinputTitles = results.toArray(),\n\t\t\t\tsortKeys = [],\n\t\t\t\tindexes = new Array(inputTitles.length),\n\t\t\t\tcompareFn;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\n\t\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\t\"..currentTiddler\": widget.getVariable(\"currentTiddler\")\n\t\t\t\t}));\n\t\t\t\tsortKeys.push(key[0] || \"\");\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\t// Prepare an array of indexes to sort\n\t\t\tfor(var t=0; t<inputTitles.length; t++) {\n\t\t\t\tindexes[t] = t;\n\t\t\t}\n\t\t\t// Sort the indexes\n\t\t\tcompareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: \"string\", invert:invert, isCaseSensitive:isCaseSensitive});\n\t\t\tindexes = indexes.sort(function(a,b) {\n\t\t\t\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t\t\t});\n\t\t\t// Add to results in correct order\n\t\t\t$tw.utils.each(indexes,function(index) {\n\t\t\t\tresults.push(inputTitles[index]);\n\t\t\t});\n\t\t}\n\t}\n};\n\n})();","type":"application/javascript","module-type":"filterrunprefix"},"$:/core/modules/filterrunprefixes/then.js":{"title":"$:/core/modules/filterrunprefixes/then.js","text":"/*\\\ntitle: $:/core/modules/filterrunprefixes/then.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nReplace results of previous runs unless empty\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.then = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\t// Only run if previous run(s) produced results\n\t\t\tvar thisRunResult = operationSubFunction(source,widget);\n\t\t\tif(thisRunResult.length !== 0) {\n\t\t\t\t// Replace results only if this run actually produces a result\n\t\t\t\tresults.clear();\n\t\t\t\tresults.pushTop(thisRunResult);\n\t\t\t}\n\t\t}\n\t};\n};\n\n})();\n","type":"application/javascript","module-type":"filterrunprefix"},"$:/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// Check for common optimisations\n\tvar subops = operator.operand.split(\"+\");\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\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = new $tw.utils.LinkedList();\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\tresults.pushTop(subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results.makeTiddlerIterator(options.wiki);\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 = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/backtranscludes.js":{"title":"$:/core/modules/filters/backtranscludes.js","text":"/*\\\ntitle: $:/core/modules/filters/backtranscludes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backtranscludes 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.backtranscludes = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerBacktranscludes(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\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 = $tw.utils.makeCompareFunction(type,{defaultType: \"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 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\";\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/crypto.js":{"title":"$:/core/modules/filters/crypto.js","text":"/*\\\ntitle: $:/core/modules/filters/crypto.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for cryptography, using the Stanford JavaScript library\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.sha256 = function(source,operator,options) {\n\tvar results = [],\n\t\tlength = parseInt(operator.operand,10) || 20;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.sha256(title,{length: length}));\n\t});\n\treturn results;\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/deserialize.js":{"title":"$:/core/modules/filters/deserialize.js","text":"/*\\\ntitle: $:/core/modules/filters/deserialize.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for deserializing string data into JSON representing tiddlers\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"deserialize\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tdeserializer;\n\tif(operator.operand) {\n\t\t// Get the deserializer identified by the operand\n\t\tdeserializer = $tw.Wiki.tiddlerDeserializerModules[operator.operand];\n\t\tif(deserializer) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tvar tiddlers;\n\t\t\t\ttry {\n\t\t\t\t\ttiddlers = deserializer(title);\n\t\t\t\t} catch(e) {\n\t\t\t\t\t// Return an empty array if we could not extract any tiddlers\n\t\t\t\t\ttiddlers = [];\n\t\t\t\t}\n\t\t\t\tresults.push(JSON.stringify(tiddlers));\n\t\t\t});\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/DeserializeOperator/UnknownDeserializer\")];\n\t\t}\n\t} else {\n\t\treturn [$tw.language.getString(\"Error/DeserializeOperator/MissingOperand\")];\n\t}\n\treturn results;\n}\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/deserializers.js":{"title":"$:/core/modules/filters/deserializers.js","text":"/*\\\ntitle: $:/core/modules/filters/deserializers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the deserializers 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.deserializers = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/duplicateslugs.js":{"title":"$:/core/modules/filters/duplicateslugs.js","text":"/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\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.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\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\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\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/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\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\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.decodebase64 = function(source,operator,options) {\n\tvar results = [];\n\tvar binary = operator.suffixes && operator.suffixes[0].indexOf(\"binary\") !== -1;\n\tvar urlsafe = operator.suffixes && operator.suffixes[0].indexOf(\"urlsafe\") !== -1;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.base64Decode(title,binary,urlsafe));\n\t});\n\treturn results;\n};\n\nexports.encodebase64 = function(source,operator,options) {\n\tvar results = [];\n\tvar binary = operator.suffixes && operator.suffixes[0].indexOf(\"binary\") !== -1;\n\tvar urlsafe = operator.suffixes && operator.suffixes[0].indexOf(\"urlsafe\") !== -1;\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.base64Encode(title,binary,urlsafe));\n\t});\n\treturn results;\n};\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.decodeURIComponentSafe(title));\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($tw.utils.encodeURIComponentExtended(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.decodeURISafe(title));\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,(operator.suffix === \"rawunicode\")));\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,(operator.suffix === \"rawunicode\")));\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($tw.utils.escapeCSS(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\";\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\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/filter.js":{"title":"$:/core/modules/filters/filter.js","text":"/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\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.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\n\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\",\"\")\n\t\t}));\n\t\tif((list.length > 0) === target) {\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/format/date.js":{"title":"$:/core/modules/filters/format/date.js","text":"/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.date = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/json.js":{"title":"$:/core/modules/filters/format/json.js","text":"/*\\\ntitle: $:/core/modules/filters/format/json.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.json = function(source,operand,options) {\n\tvar results = [],\n\t\tspaces = null;\n\tif(operand) {\n\t\tspaces = /^\\d+$/.test(operand) ? parseInt(operand,10) : operand;\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title);\n\t\ttry {\n\t\t\tdata = JSON.parse(title);\n\t\t} catch(e) {\n\t\t\tdata = undefined;\n\t\t}\n\t\tif(data !== undefined) {\n\t\t\tresults.push(JSON.stringify(data,null,spaces));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/relativedate.js":{"title":"$:/core/modules/filters/format/relativedate.js","text":"/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.relativedate = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/timestamp.js":{"title":"$:/core/modules/filters/format/timestamp.js","text":"/*\\\ntitle: $:/core/modules/filters/format/timestamp.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.timestamp = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif (title.match(/^-?\\d+$/)) {\n\t\t\tvar value = new Date(Number(title));\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"[UTC]YYYY0MM0DD0hh0mm0ss0XXX\"));\n\t\t}\n\t});\n\treturn results;\n};\n})();","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format/titlelist.js":{"title":"$:/core/modules/filters/format/titlelist.js","text":"/*\\\ntitle: $:/core/modules/filters/format/titlelist.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.titlelist = function(source,operand,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tresults.push($tw.utils.stringifyList([title]));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","type":"application/javascript","module-type":"formatfilteroperator"},"$:/core/modules/filters/format.js":{"title":"$:/core/modules/filters/format.js","text":"/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix 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/function.js":{"title":"$:/core/modules/filters/function.js","text":"/*\\\ntitle: $:/core/modules/filters/function.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that are returned from a function\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.function = function(source,operator,options) {\n\tvar functionName = operator.operands[0],\n\t\tparams = [];\n\t$tw.utils.each(operator.operands.slice(1),function(param) {\n\t\tparams.push({value: param});\n\t});\n\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(functionName,{params: params, source: source});\n\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition) {\n\t\treturn variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\n\t}\n\t// Return the input list if the function wasn't found\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/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(options.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(options.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].length === 0)) {\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].length !== 0)) {\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/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/insertafter.js":{"title":"$:/core/modules/filters/insertafter.js","text":"/*\\\ntitle: $:/core/modules/filters/insertafter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item after 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.insertafter = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = operator.operands[1] || (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 after the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos+1,0,operator.operand);\n\t\t} else {\n\t\t\tvar suffix = operator.operands.length > 1 ? operator.suffix : \"\";\n\t\t\tif(suffix === \"start\") {\n\t\t\t\tresults.splice(0,0,operator.operand);\n\t\t\t} else {\n\t\t\t\tresults.push(operator.operand);\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/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 = operator.operands[1] || (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\tvar suffix = operator.operands.length > 1 ? operator.suffix : \"\";\n\t\t\tif(suffix == \"start\") {\n\t\t\t\tresults.splice(0,0,operator.operand);\n\t\t\t} else {\n\t\t\t\tresults.push(operator.operand);\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/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/draft.js":{"title":"$:/core/modules/filters/is/draft.js","text":"/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\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.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.isDraft()) {\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 && tiddler.isDraft()) {\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(options.widget.getVariable(title) === undefined) {\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.widget.getVariable(title) !== undefined) {\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/json-ops.js":{"title":"$:/core/modules/filters/json-ops.js","text":"/*\\\ntitle: $:/core/modules/filters/json-ops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for JSON operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"jsonget\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar items = getDataItemValueAsStrings(data,operator.operands);\n\t\t\tif(items !== undefined) {\n\t\t\t\tresults.push.apply(results,items);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonextract\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar item = getDataItem(data,operator.operands);\n\t\t\tif(item !== undefined) {\n\t\t\t\tresults.push(JSON.stringify(item));\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonindexes\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar items = getDataItemKeysAsStrings(data,operator.operands);\n\t\t\tif(items !== undefined) {\n\t\t\t\tresults.push.apply(results,items);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsontype\"] = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tvar item = getDataItemType(data,operator.operands);\n\t\t\tif(item !== undefined) {\n\t\t\t\tresults.push(item);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\nexports[\"jsonset\"] = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = suffixes[0] && suffixes[0][0],\n\t\tindexes = operator.operands.slice(0,-1),\n\t\tvalue = operator.operands[operator.operands.length - 1],\n\t\tresults = [];\n\tif(operator.operands.length === 1 && operator.operands[0] === \"\") {\n\t\tvalue = undefined; // Prevents the value from being assigned\n\t}\n\tswitch(type) {\n\t\tcase \"string\":\n\t\t\t// Use value unchanged\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tvalue = (value === \"true\" ? true : (value === \"false\" ? false : undefined));\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tvalue = $tw.utils.parseNumber(value);\n\t\t\tbreak;\n\t\tcase \"array\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = [];\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = {};\n\t\t\tbreak;\n\t\tcase \"null\":\n\t\t\tindexes = operator.operands;\n\t\t\tvalue = null;\n\t\t\tbreak;\n\t\tcase \"json\":\n\t\t\tvalue = $tw.utils.parseJSONSafe(value,function() {return undefined;});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// Use value unchanged\n\t\t\tbreak;\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar data = $tw.utils.parseJSONSafe(title,title);\n\t\tif(data) {\n\t\t\tdata = setDataItem(data,indexes,value);\n\t\t\tresults.push(JSON.stringify(data));\n\t\t}\n\t});\n\treturn results;\n};\n\n/*\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the values at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItemValueAsStrings(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item as a string list\n\treturn convertDataItemValueToStrings(item);\n}\n\n/*\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the keys of the item at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItemKeysAsStrings(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item keys as a string\n\treturn convertDataItemKeysToStrings(item);\n}\n\n/*\nReturn an array of the string representation of the values of a data item, or \"undefined\" if the item is undefined\n*/\nfunction convertDataItemValueToStrings(item) {\n\t// Return the item as a string\n\tif(item === undefined) {\n\t\treturn undefined;\n\t} else if(item === null) {\n\t\treturn [\"null\"]\n\t} else if(typeof item === \"object\") {\n\t\tvar results = [],i,t;\n\t\tif($tw.utils.isArray(item)) {\n\t\t\t// Return all the items in arrays recursively\n\t\t\tfor(i=0; i<item.length; i++) {\n\t\t\t\tt = convertDataItemValueToStrings(item[i])\n\t\t\t\tif(t !== undefined) {\n\t\t\t\t\tresults.push.apply(results,t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Return all the values in objects recursively\n\t\t\t$tw.utils.each(Object.keys(item).sort(),function(key) {\n\t\t\t\tt = convertDataItemValueToStrings(item[key]);\n\t\t\t\tif(t !== undefined) {\n\t\t\t\t\tresults.push.apply(results,t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn results;\n\t}\n\treturn [item.toString()];\n}\n\n/*\nReturn an array of the string representation of the keys of a data item, or \"undefined\" if the item is undefined\n*/\nfunction convertDataItemKeysToStrings(item) {\n\t// Return the item as a string\n\tif(item === undefined) {\n\t\treturn item;\n\t} else if(typeof item === \"object\") {\n\t\tif(item === null) {\n\t\t\treturn [];\n\t\t}\n\t\tvar results = [];\n\t\tif($tw.utils.isArray(item)) {\n\t\t\tfor(var i=0; i<item.length; i++) {\n\t\t\t\tresults.push(i.toString());\n\t\t\t}\n\t\t\treturn results;\n\t\t} else {\n\t\t\t$tw.utils.each(Object.keys(item).sort(),function(key) {\n\t\t\t\tresults.push(key);\n\t\t\t});\n\t\t\treturn results;\n\t\t}\n\t}\n\treturn [];\n}\n\nfunction getDataItemType(data,indexes) {\n\t// Get the item\n\tvar item = getDataItem(data,indexes);\n\t// Return the item type\n\tif(item === undefined) {\n\t\treturn item;\n\t} else if(item === null) {\n\t\treturn \"null\";\n\t} else if($tw.utils.isArray(item)) {\n\t\treturn \"array\";\n\t} else if(typeof item === \"object\") {\n\t\treturn \"object\";\n\t} else {\n\t\treturn typeof item;\n\t}\n}\n\nfunction getItemAtIndex(item,index) {\n\tif($tw.utils.hop(item,index)) {\n\t\treturn item[index];\n\t} else if($tw.utils.isArray(item)) {\n\t\tindex = $tw.utils.parseInt(index);\n\t\tif(index < 0) { index = index + item.length };\n\t\treturn item[index]; // Will be undefined if index was out-of-bounds\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\n/*\nGiven a JSON data structure and an array of index strings, return the value at the end of the index chain, or \"undefined\" if any of the index strings are invalid\n*/\nfunction getDataItem(data,indexes) {\n\tif(indexes.length === 0 || (indexes.length === 1 && indexes[0] === \"\")) {\n\t\treturn data;\n\t}\n\t// Get the item\n\tvar item = data;\n\tfor(var i=0; i<indexes.length; i++) {\n\t\tif(item !== undefined) {\n\t\t\tif(item !== null && [\"number\",\"string\",\"boolean\"].indexOf(typeof item) === -1) {\n\t\t\t\titem = getItemAtIndex(item,indexes[i]);\n\t\t\t} else {\n\t\t\t\titem = undefined;\n\t\t\t}\n\t\t}\n\t}\n\treturn item;\n}\n\n/*\nGiven a JSON data structure, an array of index strings and a value, return the data structure with the value added at the end of the index chain. If any of the index strings are invalid then the JSON data structure is returned unmodified. If the root item is targetted then a different data object will be returned\n*/\nfunction setDataItem(data,indexes,value) {\n\t// Ignore attempts to assign undefined\n\tif(value === undefined) {\n\t\treturn data;\n\t}\n\t// Check for the root item\n\tif(indexes.length === 0 || (indexes.length === 1 && indexes[0] === \"\")) {\n\t\treturn value;\n\t}\n\t// Traverse the JSON data structure using the index chain\n\tvar current = data;\n\tfor(var i = 0; i < indexes.length - 1; i++) {\n\t\tcurrent = getItemAtIndex(current,indexes[i]);\n\t\tif(current === undefined) {\n\t\t\t// Return the original JSON data structure if any of the index strings are invalid\n\t\t\treturn data;\n\t\t}\n\t}\n\t// Add the value to the end of the index chain\n\tvar lastIndex = indexes[indexes.length - 1];\n\tif($tw.utils.isArray(current)) {\n\t\tlastIndex = $tw.utils.parseInt(lastIndex);\n\t\tif(lastIndex < 0) { lastIndex = lastIndex + current.length };\n\t}\n\t// Only set indexes on objects and arrays\n\tif(typeof current === \"object\") {\n\t\tcurrent[lastIndex] = value;\n\t}\n\treturn data;\n}\n\n})();\n\t","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 = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\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\tif(count === 0) return results;\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\tvar index = count === 0 ? results.length : -count;\n\treturn results.slice(0,index);\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/*\nThe zero based nth member of the list\n*/\nexports.zth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,0),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count,count + 1);\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:<defaultvalue>:<field OR index>[<prefix>],[<field-name OR index-name>]]\n\nPrepends the prefix to the selected items and returns the specified \nfield or index value. If the 2nd suffix does not exist, it defaults to field.\nIf the second operand is missing it defaults to \"text\" for fields, and \"0\" for indexes\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\t\tsuffixes = operator.suffixes || [],\n\t\tdefaultSuffix = suffixes[0] ? (suffixes[0][0] || \"\") : \"\",\n\t\tindexSuffix = (suffixes[1] && suffixes[1][0] === \"index\") ? true : false,\n\t\ttarget;\n\tif(operator.operands.length == 2) {\n\t\ttarget = operator.operands[1]\n\t} else {\n\t\ttarget = indexSuffix ? \"0\": \"text\";\n\t}\n\tif(indexSuffix) {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar data = options.wiki.extractTiddlerDataItem(operator.operands[0]+title,target,defaultSuffix);\n\t\t\tresults.push(data);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar value = defaultSuffix;\n\t\t\tvar targetTiddler = options.wiki.getTiddler(operator.operands[0]+title);\n\t\t\tif(targetTiddler && targetTiddler.getFieldString(target)) {\n\t\t\t\tvalue = targetTiddler.getFieldString(target);\n\t\t\t}\n\t\t\tresults.push(value);\n\t\t});\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.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\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\nexports.median = makeNumericArrayOperator(\n\tfunction(values) {\n\t\tvar len = values.length, median;\n\t\tvalues.sort();\n\t\tif(len % 2) { \n\t\t\t// Odd, return the middle number\n\t\t\tmedian = values[(len - 1) / 2];\n\t\t} else {\n\t\t\t// Even, return average of two middle numbers\n\t\t\tmedian = (values[len / 2 - 1] + values[len / 2]) / 2;\n\t\t}\n\t\treturn [median];\n\t}\n);\n\nexports.average = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0, // Initial value\n\tfunction(finalValue,numberOfValues) {\n\t\treturn finalValue/numberOfValues;\n\t}\n);\n\nexports.variance = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0,\n\tfunction(finalValue,numberOfValues,originalValues) {\n\t\treturn getVarianceFromArray(originalValues,finalValue/numberOfValues);\n\t}\n);\n\nexports[\"standard-deviation\"] = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0,\n\tfunction(finalValue,numberOfValues,originalValues) {\n\t\tvar variance = getVarianceFromArray(originalValues,finalValue/numberOfValues);\n\t\treturn Math.sqrt(variance);\n\t}\n);\n\n//trigonometry\nexports.cos = makeNumericBinaryOperator(\n\tfunction(a) {return Math.cos(a)}\n);\n\nexports.sin = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sin(a)}\n);\n\nexports.tan = makeNumericBinaryOperator(\n\tfunction(a) {return Math.tan(a)}\n);\n\nexports.acos = makeNumericBinaryOperator(\n\tfunction(a) {return Math.acos(a)}\n);\n\nexports.asin = makeNumericBinaryOperator(\n\tfunction(a) {return Math.asin(a)}\n);\n\nexports.atan = makeNumericBinaryOperator(\n\tfunction(a) {return Math.atan(a)}\n);\n\nexports.atan2 = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.atan2(a,b)}\n);\n\n//Calculate the variance of a population of numbers in an array given its mean\nfunction getVarianceFromArray(values,mean) {\n\tvar deviationTotal = values.reduce(function(accumulator,value) {\n\t\treturn accumulator + Math.pow(value - mean, 2);\n\t},0);\n\treturn deviationTotal/values.length;\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,fnFinal) {\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($tw.utils.parseNumber(title));\n\t\t});\n\t\tvar value = result.reduce(function(accumulator,currentValue) {\n\t\t\t\treturn fnCalc(accumulator,currentValue);\n\t\t\t},initialValue);\n\t\tif(fnFinal) {\n\t\t\tvalue = fnFinal(value,result.length,result);\n\t\t}\n\t\treturn [$tw.utils.stringifyNumber(value)];\n\t};\n};\n\nfunction makeNumericArrayOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push($tw.utils.parseNumber(title));\n\t\t});\n\t\tresults = fnCalc(results);\n\t\t$tw.utils.each(results,function(value,index) {\n\t\t\tresults[index] = $tw.utils.stringifyNumber(value);\n\t\t});\n\t\treturn results;\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/moduleproperty.js":{"title":"$:/core/modules/filters/moduleproperty.js","text":"/*\\\ntitle: $:/core/modules/filters/moduleproperty.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter [[module-name]moduleproperty[name]] retrieve a module property\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.moduleproperty = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = require(title)[operator.operand || \"\"];\n\t\tif(value !== undefined) {\n\t\t\tresults.push(value);\n\t\t}\n\t});\n\tresults.sort();\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\tif(operator.operands.length >= 2) {\n\t\t// Return the modules that have the module property specified in the first operand with the value in the second operand\n\t\tsource(function(tiddler,title) {\n\t\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\t\tif(require(moduleName)[operator.operands[0]] === operator.operands[1]) {\n\t\t\t\t\tresults.push(moduleName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// Return all the module names without filtering\n\t\tsource(function(tiddler,title) {\n\t\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\t\tresults.push(moduleName);\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/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\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(0,operand.length) !== 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.toLowerCase().substr(0,operand.length) === operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(0,operator.operand.length) !== 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.substr(0,operator.operand.length) === 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/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// For backwards compatibility, if there is only one operand, try to split it using one of the delimiters\n\tvar parts = operator.operands || [];\n\tif(parts.length === 1) {\n\t\tparts = operator.operand.split(/[,:;]/g);\n\t}\n\t// Process the parts\n\tvar beg, 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/reduce.js":{"title":"$:/core/modules/filters/reduce.js","text":"/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `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.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\n\t\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\"),\n\t\t\t\t\"accumulator\": \"\" + accumulator,\n\t\t\t\t\"index\": \"\" + index,\n\t\t\t\t\"revIndex\": \"\" + (results.length - 1 - index),\n\t\t\t\t\"length\": \"\" + results.length\n\t\t\t}));\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" + list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\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\",\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\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.toLowerCase().substr(0,operand.length) === operand) {\n\t\t\t\tresults.push(title.substr(operand.length));\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.substr(operator.operand.length));\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/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\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif (!operator.operand) {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else if(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title && title.toLowerCase().substr(-operand.length) === operand) {\n\t\t\t\tresults.push(title.substr(0,title.length - operand.length));\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\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/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\tsome: hasFlag(\"some\"),\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/slugify.js":{"title":"$:/core/modules/filters/slugify.js","text":"/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\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/sortsub.js":{"title":"$:/core/modules/filters/sortsub.js","text":"/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\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.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},options.widget.makeFakeWidgetWithVariables({\n\t\t\t\"currentTiddler\": \"\" + title,\n\t\t\t\"..currentTiddler\": options.widget.getVariable(\"currentTiddler\")\n\t\t}));\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\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 = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\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\nvar dmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nexports.levenshtein = makeStringBinaryOperator(\n\tfunction(a,b) {\n\t\tvar dmpObject = new dmp.diff_match_patch(),\n\t\t\tdiffs = dmpObject.diff_main(a,b);\n\t\treturn [dmpObject.diff_levenshtein(diffs) + \"\"];\n\t}\n);\n\n// these two functions are adapted from https://github.com/google/diff-match-patch/wiki/Line-or-Word-Diffs\nfunction diffLineWordMode(text1,text2,mode) {\n\tvar dmpObject = new dmp.diff_match_patch();\n\tvar a = diffPartsToChars(text1,text2,mode);\n\tvar lineText1 = a.chars1;\n\tvar lineText2 = a.chars2;\n\tvar lineArray = a.lineArray;\n\tvar diffs = dmpObject.diff_main(lineText1,lineText2,false);\n\tdmpObject.diff_charsToLines_(diffs,lineArray);\n\treturn diffs;\n}\n\nfunction diffPartsToChars(text1,text2,mode) {\n\tvar lineArray = [];\n\tvar lineHash = {};\n\tlineArray[0] = '';\n\n function diff_linesToPartsMunge_(text,mode) {\n var chars = '';\n var lineStart = 0;\n var lineEnd = -1;\n var lineArrayLength = lineArray.length,\n regexpResult;\n var searchRegexp = /\\W+/g;\n while(lineEnd < text.length - 1) {\n\t if(mode === \"words\") {\n regexpResult = searchRegexp.exec(text);\n lineEnd = searchRegexp.lastIndex;\n if(regexpResult === null) {\n lineEnd = text.length;\n }\n lineEnd = --lineEnd;\n } else {\n lineEnd = text.indexOf('\\n', lineStart);\n if(lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if(lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : (lineHash[line] !== undefined)) {\n\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n } else {\n if(lineArrayLength == maxLines) {\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n var maxLines = 40000;\n var chars1 = diff_linesToPartsMunge_(text1,mode);\n maxLines = 65535;\n var chars2 = diff_linesToPartsMunge_(text2,mode);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\nexports.makepatches = function(source,operator,options) {\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tsuffix = operator.suffix || \"\",\n\t\tresult = [];\n\t\t\n\t\tsource(function(tiddler,title) {\n\t\t\tvar diffs, patches;\n\t\t\tif(suffix === \"lines\" || suffix === \"words\") {\n\t\t\t\tdiffs = diffLineWordMode(title,operator.operand,suffix);\n\t\t\t\tpatches = dmpObject.patch_make(title,diffs);\n\t\t\t} else {\n\t\t\t\tpatches = dmpObject.patch_make(title,operator.operand);\n\t\t\t}\n\t\t\tArray.prototype.push.apply(result,[dmpObject.patch_toText(patches)]);\n\t\t});\n\n\treturn result;\n};\n\nexports.applypatches = makeStringBinaryOperator(\n\tfunction(a,b) {\n\t\tvar dmpObject = new dmp.diff_match_patch(),\n\t\t\tpatches;\n\t\ttry {\n\t\t\tpatches = dmpObject.patch_fromText(b);\n\t\t} catch(e) {\n\t\t}\n\t\tif(patches) {\n\t\t\treturn [dmpObject.patch_apply(patches,a)[0]];\n\t\t} else {\n\t\t\treturn [a];\n\t\t}\n\t}\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 || \"\",operator.suffix || \"\"));\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\tif(result.length === 0) {\n\t\t\treturn [];\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);\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(regExp).map(function(part){\n\t\t\treturn part || \"\";\t// make sure it's a string\n\t\t});\n\t\tArray.prototype.push.apply(result,parts);\n\t});\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\") + (flagSuffix.indexOf(\"m\") !== -1 ? \"m\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\t//Escape regexp characters if the operand is not a regular expression\n\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand),\n\t\t//Escape $ character in replacement string if not in regular expression mode\n\t\treplacement = isRegExp ? operator.operands[1] : (operator.operands[1]||\"\").replace(/\\$/g,\"$$$$\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(searchTerm,flags);\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,replacement)\n\t\t\t);\n\t\t\tregExp.lastIndex = 0;\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile(padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\nexports.charcode = function(source,operator,options) {\n\tvar chars = [];\n\t$tw.utils.each(operator.operands,function(operand) {\n\t\tif(operand !== \"\") {\n\t\t\tchars.push(String.fromCharCode($tw.utils.parseInt(operand)));\n\t\t}\n\t});\n\treturn [chars.join(\"\")];\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/substitute.js":{"title":"$:/core/modules/filters/substitute.js","text":"/*\\\ntitle: $:/core/modules/filters/substitute.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for substituting variables and embedded filter expressions with their corresponding 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.substitute = function(source,operator,options) {\n\tvar results = [],\n\t\toperands = [];\n\t$tw.utils.each(operator.operands,function(operand,index){\n\t\toperands.push({\n\t\t\tname: (index + 1).toString(),\n\t\t\tvalue: operand\n\t\t});\n\t});\n\tsource(function(tiddler,title) {\n\t\tif(title) {\n\t\t\tresults.push(options.wiki.getSubstitutedText(title,options.widget,{substitutions:operands}));\n\t\t}\n\t});\n\treturn results;\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\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif (!operator.operand) {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else if(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tvar operand = operator.operand.toLowerCase();\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase().substr(-operand.length) !== 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.toLowerCase().substr(-operand.length) === operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.substr(-operator.operand.length) !== 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.substr(-operator.operand.length) === 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/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}\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/transcludes.js":{"title":"$:/core/modules/filters/transcludes.js","text":"/*\\\ntitle: $:/core/modules/filters/transcludes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the transcludes 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.transcludes = function(source,operator,options) {\n\tvar results = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerTranscludes(title));\n\t});\n\treturn results.makeTiddlerIterator(options.wiki);\n};\n\n})();\n","type":"application/javascript","module-type":"filteroperator"},"$:/core/modules/filters/unknown.js":{"title":"$:/core/modules/filters/unknown.js","text":"/*\\\ntitle: $:/core/modules/filters/unknown.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for handling unknown filter operators.\n\nNot intended to be used directly by end users, hence the square brackets around the name.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fieldFilterOperatorFn = require(\"$:/core/modules/filters/field.js\").field;\n\n/*\nExport our filter function\n*/\nexports[\"[unknown]\"] = function(source,operator,options) {\n\t// Check for a user defined filter operator\n\tif(operator.operator.indexOf(\".\") !== -1) {\n\t\tvar params = [];\n\t\t$tw.utils.each(operator.operands,function(param) {\n\t\t\tparams.push({value: param});\n\t\t});\t\n\t\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(operator.operator,{params: params, source: source});\n\t\tif(variableInfo && variableInfo.srcVariable) {\n\t\t\tvar list = variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\n\t\t\tif(operator.prefix === \"!\") {\n\t\t\t\tvar results = [];\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(list.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\treturn results;\n\t\t\t} else {\n\t\t\t\treturn list;\n\t\t\t}\n\t\t}\n\t}\n\t// Otherwise, use the \"field\" operator\n\treturn fieldFilterOperatorFn(source,operator,options);\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\t\texpected = (operator.prefix === \"!\");\n\tsource(function(tiddler,title) {\n\t\tif(((tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) === expected) || (!tiddler && !expected)) {\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/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\t\twidget = options.widget;\n\twhile(widget && !widget.hasOwnProperty(\"variables\")) {\n\t\twidget = widget.parentWidget;\n\t}\n\tif(widget && widget.variables) {\n\t\tfor(var variable in widget.variables) {\n\t\t\tnames.push(variable);\n\t\t}\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\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\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\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset = (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i % opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\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\nvar widgetClass = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/* Maximum permitted filter recursion depth */\nvar MAX_FILTER_DEPTH = 300;\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\t\toperator.operands = [];\n\t\tvar parseOperand = function(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(operator.regexp) {\n\t\t\t\toperand.text = \"\";\n\t\t\t} else {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t}\n\t\t\toperator.operands.push(operand);\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\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 = /((?:\\+|\\-|~|=|\\:(\\w+)(?:\\:([\\w\\:, ]*))?)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\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 = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t\tif(match[3]) {\n\t\t\t\t\toperation.suffixes = [];\n\t\t\t\t\t $tw.utils.each(match[3].split(\":\"),function(subsuffix) {\n\t\t\t\t\t\toperation.suffixes.push([]);\n\t\t\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\t\t\tif(entry) {\n\t\t\t\t\t\t\t\toperation.suffixes[operation.suffixes.length -1].push(entry);\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\t\t\t}\n\t\t\tif(match[4]) { // 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[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[5] || match[6] || match[7]}]}\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.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\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\tif(!this.filterCache) {\n\t\tthis.filterCache = Object.create(null);\n\t\tthis.filterCacheCount = 0;\n\t}\n\tif(this.filterCache[filterString] !== undefined) {\n\t\treturn this.filterCache[filterString];\n\t}\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\t// We do not cache this result, so it adjusts along with localization changes\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 operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\t// Use the \"title\" operator if no operator is specified\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\t// Unknown operators treated as \"[unknown]\" - at run time we can distinguish between a custom operator and falling back to the default \"field\" operator\n\t\t\t\t\toperatorFunction = filterOperators[\"[unknown]\"];\n\t\t\t\t} else {\n\t\t\t\t\t// Use the operator function\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\tvar varTree = $tw.utils.parseFilterVariable(operand.text);\n\t\t\t\t\t\toperand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || \"\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\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: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\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\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self, suffixes: operation.suffixes || []};\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 filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\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 filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\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\tvar fnMeasured = $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\tif(!widget) {\n\t\t\twidget = $tw.rootWidget;\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\tself.filterRecursionCount = (self.filterRecursionCount || 0) + 1;\n\t\tif(self.filterRecursionCount < MAX_FILTER_DEPTH) {\n\t\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\t\toperationFunction(results,source,widget);\n\t\t\t});\n\t\t} else {\n\t\t\tresults.push(\"/**-- Excessive filter recursion --**/\");\n\t\t}\n\t\tself.filterRecursionCount = self.filterRecursionCount - 1;\n\t\treturn results.toArray();\n\t});\n\tif(this.filterCacheCount >= 2000) {\n\t\t// To prevent memory leak, we maintain an upper limit for cache size.\n\t\t// Reset if exceeded. This should give us 95% of the benefit\n\t\t// that no cache limit would give us.\n\t\tthis.filterCache = Object.create(null);\n\t\tthis.filterCacheCount = 0;\n\t}\n\tthis.filterCache[filterString] = fnMeasured;\n\tthis.filterCacheCount++;\n\treturn fnMeasured;\n};\n\n})();\n","type":"application/javascript","module-type":"wikimethod"},"$:/core/modules/indexers/back-indexer.js":{"title":"$:/core/modules/indexers/back-indexer.js","text":"/*\\\ntitle: $:/core/modules/indexers/back-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nBy parsing the tiddler text, indexes the tiddlers' back links, back transclusions, block level back links.\n\n\\*/\nfunction BackIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBackIndexer.prototype.init = function() {\n\tthis.subIndexers = {\n\t\tlink: new BackSubIndexer(this,\"extractLinks\"),\n\t\ttransclude: new BackSubIndexer(this,\"extractTranscludes\"),\n\t};\n};\n\nBackIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nBackIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\nfunction BackSubIndexer(indexer,extractor) {\n\tthis.wiki = indexer.wiki;\n\tthis.indexer = indexer;\n\tthis.extractor = extractor;\n\t/**\n\t * {\n\t * [target title, e.g. tiddler title being linked to]:\n\t * {\n\t * \t\t [source title, e.g. tiddler title that has link syntax in its text]: true\n\t * \t }\n\t * }\n\t */\n\tthis.index = null;\n}\n\nBackSubIndexer.prototype.init = function() {\n\t// lazy init until first lookup\n\tthis.index = null;\n}\n\nBackSubIndexer.prototype._init = function() {\n\tthis.index = Object.create(null);\n\tvar self = this;\n\tthis.wiki.forEachTiddler(function(sourceTitle,tiddler) {\n\t\tvar newTargets = self._getTarget(tiddler);\n\t\t$tw.utils.each(newTargets, function(target) {\n\t\t\tif(!self.index[target]) {\n\t\t\t\tself.index[target] = Object.create(null);\n\t\t\t}\n\t\t\tself.index[target][sourceTitle] = true;\n\t\t});\n\t});\n}\n\nBackSubIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\n/*\n* Get things that is being referenced in the text, e.g. tiddler names in the link syntax.\n*/\nBackSubIndexer.prototype._getTarget = function(tiddler) {\n\tif(this.wiki.isBinaryTiddler(tiddler.fields.text)) {\n\t\treturn [];\n\t}\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki[this.extractor](parser.tree, tiddler.fields.title);\n\t}\n\treturn [];\n}\n\nBackSubIndexer.prototype.update = function(updateDescriptor) {\n\t// lazy init/update until first lookup\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newTargets = [],\n\t oldTargets = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldTargets = this._getTarget(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewTargets = this._getTarget(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldTargets,function(target) {\n\t\tif(self.index[target]) {\n\t\t\tdelete self.index[target][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newTargets,function(target) {\n\t\tif(!self.index[target]) {\n\t\t\tself.index[target] = Object.create(null);\n\t\t}\n\t\tself.index[target][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBackSubIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis._init();\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.BackIndexer = BackIndexer;\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\t// get all tiddlers, including those overwrite shadow tiddlers\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn self.wiki.tiddlerExists(title)\n\t\t});\n\t};\n\t// get shadow tiddlers, including shadow tiddlers that is overwritten\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn self.wiki.isShadowTiddler(title)\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});\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});\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}\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(updateInfoTiddlersCallback) {\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\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\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});\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// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\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.shortcutPriorityList = []; // Stores the parsed shortcut priority\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,options) {\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(options.keyDescriptor) {\n\t\tinfo.keyDescriptor = options.keyDescriptor;\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\toptions.keyDescriptor = keyDescriptor;\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,options));\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\treturn (this.getMatchingKeyDescriptor(event,keyInfoArray) !== null);\n};\n\nKeyboardManager.prototype.getMatchingKeyDescriptor = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn keyInfoArray[t];\n\t\t}\n\t}\n\treturn null;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey\t&& !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\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\tthis.shortcutPriorityList[i] = tiddlerFields.priority === \"yes\" ? true : false;\n\t}\n};\n\n/*\nevent: the keyboard event object\noptions:\n\tonlyPriority: true if only priority global shortcuts should be invoked\n*/\nKeyboardManager.prototype.handleKeydownEvent = function(event, options) {\n\toptions = options || {};\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(options.onlyPriority && this.shortcutPriorityList[i] !== true) {\n\t\t\tcontinue;\n\t\t}\n\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,event);\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\tif(tiddler) {\n\t\t\tfor(f in tiddler.fields) {\n\t\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\t\tfields.push(f);\n\t\t\t\t}\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\tif(tiddler) {\n\t\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t\t}\t\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\n\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\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"separator\"},\n\t{name: \"template\"},\n\t{name: \"startCount\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName,separator,template,startCount) {\n\tseparator = separator || \" \";\n\tstartCount = startCount || 0;\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\t// $tw.wiki.generateNewTitle = function(baseTitle,options)\n\t// options.prefix must be a string!\n\treturn this.wiki.generateNewTitle(baseName, {\"prefix\": separator, \"template\": template, \"startCount\": startCount});\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\tthis.source = text;\n\tthis.type = type;\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\t\"$tiddler\": {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\t\"$tiddler\": {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\tthis.source = text;\n\tthis.type = type;\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// Special handler for tab-delimited files\n\tif (type === 'text/tab-delimited-values' && !options.separator) {\n\t\toptions.separator = \"\\t\";\n\t}\n\t\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 = $tw.utils.parseCsvString(text, options),\n\t\ttag = \"th\";\n\tvar maxColumns = 0;\n\t$tw.utils.each(lines, function(columns) {\n\t\tmaxColumns = Math.max(columns.length, maxColumns);\n\t});\n\t\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar columns = lines[line];\n\t\tvar row = {\n\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t};\n\t\tfor(var column=0; column<maxColumns; column++) {\n\t\t\trow.children.push({\n\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"text\": columns[column] || ''\n\t\t\t\t}]\n\t\t\t});\n\t\t}\n\t\ttag = \"td\";\n\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t}\n\tthis.source = text;\n\tthis.type = type;\n};\n\nexports[\"text/csv\"] = CsvParser;\nexports[\"text/tab-delimited-values\"] = 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}\n\t}];\n\tif($tw.wiki.getTiddlerText(\"$:/config/HtmlParser/DisableSandbox\",\"no\") !== \"yes\") {\n\t\tthis.tree[0].attributes.sandbox = {type: \"string\", value: $tw.wiki.getTiddlerText(\"$:/config/HtmlParser/SandboxTokens\",\"\")};\n\t}\n\tthis.source = text;\n\tthis.type = type;\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\tthis.source = text;\n\tthis.type = type;\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;\nexports[\"image/vnd.microsoft.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/*\nReturns an array of {name:} with an optional \"default\" property. Options include:\nrequireParenthesis: require the parameter definition to be wrapped in parenthesis\n*/\nexports.parseParameterDefinition = function(paramString,options) {\n\toptions = options || {};\n\tif(options.requireParenthesis) {\n\t\tvar parenMatch = /^\\s*\\((.*)\\)\\s*$/g.exec(paramString);\n\t\tif(!parenMatch) {\n\t\t\treturn [];\n\t\t}\n\t\tparamString = parenMatch[1];\n\t}\n\tvar params = [],\n\t\treParam = /\\s*([^:),\\s]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|([^,\"'\\s]+)))?/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Save the parameter details\n\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5];\n\t\tif(defaultValue !== undefined) {\n\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Look for the next parameter\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn params;\n};\n\nexports.parseMacroParameters = function(node,source,pos) {\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\tnode.end = pos;\n\treturn node;\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: \"transclude\", attributes:, start:, end:}\n*/\nexports.parseMacroInvocationAsTransclusion = function(source,pos) {\n\tvar node = $tw.utils.parseMacroInvocation(source,pos);\n\tif(node) {\n\t\tvar positionalName = 0,\n\t\t\ttransclusion = {\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tstart: node.start,\n\t\t\t\tend: node.end\n\t\t\t};\n\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,\"$variable\",node.name);\n\t\t$tw.utils.each(node.params,function(param) {\n\t\t\tvar name = param.name;\n\t\t\tif(name) {\n\t\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\t\tname = \"$\" + name;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: name,type: \"string\", value: param.value, start: param.start, end: param.end});\n\t\t\t} else {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: (positionalName++) + \"\",type: \"string\", value: param.value, start: param.start, end: param.end});\n\t\t\t}\n\t\t});\n\t\treturn transclusion;\n\t}\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, params:, 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\tnode = $tw.utils.parseMacroParameters(node,source,pos);\n\tpos = node.end;\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\nexports.parseFilterVariable = function(source) {\n\tvar node = {\n\t\t\tname: \"\",\n\t\t\tparams: [],\n\t\t},\n\t\tpos = 0,\n\t\treName = /([^\\s\"']+)/g;\n\t// If there is no whitespace or it is an empty string then there are no macro parameters\n\tif(/^\\S*$/.test(source)) {\n\t\tnode.name = source;\n\t\treturn node;\n\t}\n\t// Get the variable name\n\tvar nameMatch = $tw.utils.parseTokenRegExp(source,pos,reName);\n\tif(nameMatch) {\n\t\tnode.name = nameMatch.match[1];\n\t\tpos = nameMatch.end;\n\t\tnode = $tw.utils.parseMacroParameters(node,source,pos);\n\t\tdelete node.end;\n\t}\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, type: \"filtered|string|indirect|macro\", value|filter|textReference:, 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 = /\\{\\{\\{([\\S\\s]+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g,\n\t\treSubstitutedValue = /(?:```([\\s\\S]*?)```|`([^`]|[\\S\\s]*?)`)/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\tvar substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);\n\t\t\t\t\t\t\tif(substitutedValue) {\n\t\t\t\t\t\t\t\tpos = substitutedValue.end;\n\t\t\t\t\t\t\t\tnode.type = \"substituted\";\n\t\t\t\t\t\t\t\tnode.rawValue = substitutedValue.match[1] || substitutedValue.match[2];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\t\tnode.value = \"true\";\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\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: \"iframe\",\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\tthis.source = text;\n\tthis.type = type;\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: \"genesis\",\n\t\tattributes: {\n\t\t\t$type: {name: \"$type\", type: \"string\", value: \"$codeblock\"},\n\t\t\tcode: {name: \"code\", type: \"string\", value: text},\n\t\t\tlanguage: {name: \"language\", type: \"string\", value: type},\n\t\t\t$remappable: {name: \"$remappable\", type:\"string\", value: \"no\"}\n\t\t}\n\t}];\n\tthis.source = text;\n\tthis.type = type;\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","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\tthis.source = text;\n\tthis.type = type;\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\tvar languageStart = this.parser.pos + 3,\n\t\tlanguageEnd = languageStart + this.match[1].length;\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\tcodeStart = this.parser.pos;\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, start: codeStart, end: this.parser.pos},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1], start: languageStart, end: languageEnd}\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\tstart = this.parser.pos;\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\tstart: start,\n\t\t\tend: this.parser.pos\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\\define macroX()\n<!-- This is a comment -->\nxxxx\n\\end\n<!-- This is a comment -->\n\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, pragma: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 = this.match.index + 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 = this.match.index + 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/conditional.js":{"title":"$:/core/modules/parsers/wikiparser/rules/conditional.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/conditional.js\ntype: application/javascript\nmodule-type: wikirule\n\nConditional shortcut syntax\n\n```\nThis is a <%if [{something}] %>Elephant<%elseif [{else}] %>Pelican<%else%>Crocodile<%endif%>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"conditional\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\<\\%\\s*if\\s+/mg;\n\tthis.terminateIfRegExp = /\\%\\>/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Look for the next <%if shortcut\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t// If not found then return no match\n\tif(!this.match) {\n\t\treturn undefined;\n\t}\n\t// Check for the next %>\n\tthis.terminateIfRegExp.lastIndex = this.match.index;\n\tthis.terminateIfMatch = this.terminateIfRegExp.exec(this.parser.source);\n\t// If not found then return no match\n\tif(!this.terminateIfMatch) {\n\t\treturn undefined;\n\t}\n\t// Return the position at which the construction was found\n\treturn this.match.index;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the filter condition\n\tvar filterCondition = this.parser.source.substring(this.match.index + this.match[0].length,this.terminateIfMatch.index);\n\t// Advance the parser position to past the %>\n\tthis.parser.pos = this.terminateIfMatch.index + this.terminateIfMatch[0].length;\n\t// Parse the if clause\n\treturn this.parseIfClause(filterCondition);\n};\n\nexports.parseIfClause = function(filterCondition) {\n\t// Create the list widget\n\tvar listWidget = {\n\t\ttype: \"list\",\n\t\ttag: \"$list\",\n\t\tisBlock: this.is.block,\n\t\tchildren: [\n\t\t\t{\n\t\t\t\ttype: \"list-template\",\n\t\t\t\ttag: \"$list-template\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"list-empty\",\n\t\t\t\ttag: \"$list-empty\"\n\t\t\t}\n\t\t]\n\t};\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"filter\",filterCondition);\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"variable\",\"condition\");\n\t$tw.utils.addAttributeToParseTreeNode(listWidget,\"limit\",\"1\");\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Parse the body looking for else or endif\n\tvar reEndString = \"\\\\<\\\\%\\\\s*(endif)\\\\s*\\\\%\\\\>|\\\\<\\\\%\\\\s*(else)\\\\s*\\\\%\\\\>|\\\\<\\\\%\\\\s*(elseif)\\\\s+([\\\\s\\\\S]+?)\\\\%\\\\>\",\n\t\tex;\n\tif(hasLineBreak) {\n\t\tex = this.parser.parseBlocksTerminatedExtended(reEndString);\n\t} else {\n\t\tvar reEnd = new RegExp(reEndString,\"mg\");\n\t\tex = this.parser.parseInlineRunTerminatedExtended(reEnd,{eatTerminator: true});\n\t}\n\t// Put the body into the list template\n\tlistWidget.children[0].children = ex.tree;\n\t// Check for an else or elseif\n\tif(ex.match) {\n\t\tif(ex.match[1] === \"endif\") {\n\t\t\t// Nothing to do if we just found an endif\n\t\t} else if(ex.match[2] === \"else\") {\n\t\t\t// Check for an immediately following double linebreak\n\t\t\thasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\t\t// If we found an else then we need to parse the body looking for the endif\n\t\t\tvar reEndString = \"\\\\<\\\\%\\\\s*(endif)\\\\s*\\\\%\\\\>\",\n\t\t\tex;\n\t\t\tif(hasLineBreak) {\n\t\t\t\tex = this.parser.parseBlocksTerminatedExtended(reEndString);\n\t\t\t} else {\n\t\t\t\tvar reEnd = new RegExp(reEndString,\"mg\");\n\t\t\t\tex = this.parser.parseInlineRunTerminatedExtended(reEnd,{eatTerminator: true});\n\t\t\t}\n\t\t\t// Put the parsed content inside the list empty template\n\t\t\tlistWidget.children[1].children = ex.tree;\n\t\t} else if(ex.match[3] === \"elseif\") {\n\t\t\t// Parse the elseif clause by reusing this parser, passing the new filter condition\n\t\t\tlistWidget.children[1].children = this.parseIfClause(ex.match[4]);\n\t\t}\n\t}\n\t// Return the parse tree node\n\treturn [listWidget];\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 var start = this.parser.pos;\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], start: start, end: this.parser.pos\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\tvar filterStart = this.parser.pos + 3;\n\tvar filterEnd = filterStart + this.match[1].length;\n\tvar toolTipStart = filterEnd + 1;\n\tvar toolTipEnd = toolTipStart + (this.match[2] ? this.match[2].length : 0);\n\tvar templateStart = toolTipEnd + 2;\n\tvar templateEnd = templateStart + (this.match[3] ? this.match[3].length : 0);\n\tvar styleStart = templateEnd + 2;\n\tvar styleEnd = styleStart + (this.match[4] ? this.match[4].length : 0);\n\tvar classesStart = styleEnd + 1;\n\tvar classesEnd = classesStart + (this.match[5] ? this.match[5].length : 0);\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, start: filterStart, end: filterEnd},\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip, start: toolTipStart, end: toolTipEnd};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template, start: templateStart, end: templateEnd};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style, start: styleStart, end: styleEnd};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \"), start: classesStart, end: classesEnd};\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\tvar filterStart = this.parser.pos + 3;\n\tvar filterEnd = filterStart + this.match[1].length;\n\tvar toolTipStart = filterEnd + 1;\n\tvar toolTipEnd = toolTipStart + (this.match[2] ? this.match[2].length : 0);\n\tvar templateStart = toolTipEnd + 2;\n\tvar templateEnd = templateStart + (this.match[3] ? this.match[3].length : 0);\n\tvar styleStart = templateEnd + 2;\n\tvar styleEnd = styleStart + (this.match[4] ? this.match[4].length : 0);\n\tvar classesStart = styleEnd + 1;\n\tvar classesEnd = classesStart + (this.match[5] ? this.match[5].length : 0);\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, start: filterStart, end: filterEnd},\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip, start: toolTipStart, end: toolTipEnd};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template, start: templateStart, end: templateEnd};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style, start: styleStart, end: styleEnd};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \"), start: classesStart, end: classesEnd};\n\t}\n\treturn [node];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js":{"title":"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/fnprocdef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for function, procedure and widget definitions\n\n```\n\\function name(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n\n\\procedure name(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n\n\\widget $mywidget(param:defaultvalue,param2:defaultvalue)\ndefinition text\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"fnprocdef\";\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 = /\\\\(function|procedure|widget)\\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 params = [];\n\tif(this.match[3]) {\n\t\tparams = $tw.utils.parseParameterDefinition(this.match[4]);\n\t}\n\t// Is the remainder of the line blank after the parameter close paren?\n\tvar reEnd;\n\tif(this.match[5]) {\n\t\t// If so, it is a multiline definition and the end of the body is marked with \\end\n\t\treEnd = new RegExp(\"((:?^|\\\\r?\\\\n)[^\\\\S\\\\n\\\\r]*\\\\\\\\end[^\\\\S\\\\n\\\\r]*(?:\" + $tw.utils.escapeRegExp(this.match[2]) + \")?(?:$|\\\\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\tvar parseTreeNodes = [{\n\t\ttype: \"set\",\n\t\tattributes: {},\n\t\tchildren: [],\n\t\tparams: params\n\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"name\",this.match[2]);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"value\",text);\n\tif(this.match[1] === \"function\") {\n\t\tparseTreeNodes[0].isFunctionDefinition = true;\n\t} else if(this.match[1] === \"procedure\") {\n\t\tparseTreeNodes[0].isProcedureDefinition = true;\n\t} else if(this.match[1] === \"widget\") {\n\t\tparseTreeNodes[0].isWidgetDefinition = true;\n\t}\n\tif(this.parser.configTrimWhiteSpace) {\n\t\tparseTreeNodes[0].configTrimWhiteSpace = true;\n\t}\n\treturn parseTreeNodes;\n};\n\n})();\n\t","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\tvar start = this.parser.pos;\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\", start: start, end: this.parser.pos});\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 classStart = this.parser.pos;\n\tvar classes = this.parser.parseClasses();\n\tvar classEnd = this.parser.pos;\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(\" \"), start: classStart, end: classEnd}\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\tif (!tag.isSelfClosing) {\n\t\ttag.openTagStart = tag.start;\n\t\ttag.openTagEnd = tag.end;\n\t}\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\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\";\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\tvar reEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t\t}\n\t\ttag.end = this.parser.pos;\n\t\ttag.closeTagEnd = tag.end;\n\t\tif (tag.closeTagEnd === tag.openTagEnd || this.parser.source[tag.closeTagEnd - 1] !== '>') {\n\t\t\ttag.closeTagStart = tag.end;\n\t\t} else {\n\t\t\ttag.closeTagStart = tag.closeTagEnd - 2;\n\t\t\tvar closeTagMinPos = tag.children.length > 0 ? tag.children[tag.children.length-1].end : tag.openTagEnd;\n\t\t\tif (!Number.isSafeInteger(closeTagMinPos)) closeTagMinPos = tag.openTagEnd;\n\t\t\twhile (tag.closeTagStart >= closeTagMinPos) {\n\t\t\t\tvar char = this.parser.source[tag.closeTagStart];\n\t\t\t\tif (char === '>') {\n\t\t\t\t\ttag.closeTagStart = -1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (char === '<') break;\n\t\t\t\ttag.closeTagStart -= 1;\n\t\t\t}\n\t\t\tif (tag.closeTagStart < closeTagMinPos) {\n\t\t\t\ttag.closeTagStart = tag.end;\n\t\t\t}\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: {}, orderedAttributes: [], 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\torderedAttributes: []\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.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.orderedAttributes.push(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(),start: token.start,end:token.start + token.match[1].length - 1};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim(), start: token.start + (token.match[1] ? token.match[1].length : 0), end: token.end - 2};\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 filterStart = this.parser.source;\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], start: filterStart, end: this.parser.pos}\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 start = 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 = {\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: listInfo.listTag,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\t\ttag: listInfo.itemTag,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\t\tend: this.parser.pos,\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: this.parser.pos,\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({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: listInfo.itemTag,\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: this.parser.pos,\n\t\t\t\t});\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 classStart = this.parser.pos;\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\tvar classEnd = this.parser.pos;\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\tlastListItem.end = this.parser.pos;\n\t\tlistStack[listStack.length-1].end = this.parser.pos;\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t\tlastListItem.attributes.class.start = classStart;\n\t\t\tlastListItem.attributes.class.end = classEnd;\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};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tvar nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\n\t\tif(nextCall) {\n\t\t\tvar c = this.parser.source.charAt(nextCall.end);\n\t\t\t// Ensure EOL after parsed macro\n\t\t\t// If we didn't need to support IE, we'd just use /(?:\\r?\\n|$)/ym\n\t\t\tif ((c === \"\") || (c === \"\\n\") || ((c === \"\\r\") && this.parser.source.charAt(nextCall.end+1) === \"\\n\")) {\n\t\t\t\tthis.nextCall = nextCall;\n\t\t\t\treturn nextStart;\n\t\t\t}\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tcall.isBlock = true;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\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};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tthis.nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\n\t\tif(this.nextCall) {\n\t\t\treturn nextStart;\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\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 the remainder of the \\define line blank after the parameter close paren?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, it is a multiline definition and the end of the body is marked with \\end\n\t\treEnd = new RegExp(\"((?:^|\\\\r?\\\\n)[^\\\\S\\\\n\\\\r]*\\\\\\\\end[^\\\\S\\\\n\\\\r]*(?:\" + $tw.utils.escapeRegExp(this.match[1]) + \")?(?:$|\\\\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\tvar parseTreeNodes = [{\n\t\ttype: \"set\",\n\t\tattributes: {},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"name\",this.match[1]);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"value\",text);\n\treturn parseTreeNodes;\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/parameters.js":{"title":"$:/core/modules/parsers/wikiparser/rules/parameters.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parameters.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for parameter definitions\n\n```\n\\parameters(param:defaultvalue,param2:defaultvalue)\ndefinition text\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"parameters\";\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 = /\\\\parameters\\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 params = $tw.utils.parseParameterDefinition(this.match[1]);\n\tvar attributes = Object.create(null),\n\t\torderedAttributes = [];\n\t$tw.utils.each(params,function(param) {\n\t\tvar name = param.name;\n\t\t// Parameter names starting with dollar must be escaped to double dollars for the parameters widget\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tname = \"$\" + name;\n\t\t}\n\t\tvar attribute = {name: name, type: \"string\", value: param[\"default\"] || \"\"};\n\t\tattributes[name] = attribute;\n\t\torderedAttributes.push(attribute);\n\t});\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"parameters\",\n\t\tattributes: attributes,\n\t\torderedAttributes: orderedAttributes\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/parsermode.js":{"title":"$:/core/modules/parsers/wikiparser/rules/parsermode.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parsermode.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for parser mode specifications\n\n```\n\\parsermode block\n\\parsermode inline\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"parsermode\";\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 = /\\\\parsermode[^\\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\tparserMode = undefined;\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\tparserMode = 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(parserMode !== undefined) {\n\t\tif(parserMode === \"block\") {\n\t\t\tthis.parser.parseAsInline = false;\n\t\t} else if(parserMode === \"inline\") {\n\t\t\tthis.parser.parseAsInline = true;\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/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, urlStart;\n\ttextNode.start = pos;\n\tif(splitPos) {\n\t\turlStart = splitPos + 1;\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t\ttextNode.end = splitPos;\n\t} else {\n\t\turlStart = pos;\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t\ttextNode.end = closePos;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL, start: urlStart, end: closePos};\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\tvar start = this.parser.pos + 2;\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\t\ttextEndPos = this.parser.source.indexOf(\"|\", start);\n\tif (textEndPos < 0 || textEndPos > this.matchRegExp.lastIndex) {\n\t\ttextEndPos = this.matchRegExp.lastIndex - 2;\n\t}\n\tvar linkStart = this.match[2] ? (start + this.match[1].length + 1) : start;\n\tvar linkEnd = linkStart + link.length;\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, start: linkStart, end: linkEnd},\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, start: start, end: textEndPos\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, start: linkStart, end: linkEnd}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text, start: start, end: textEndPos\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.\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 = \"^\\\\s*\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the optional cite itself\n\tvar classStart = this.parser.pos;\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tvar classEnd = this.parser.pos;\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar citeStart = this.parser.pos;\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\tvar citeEnd = this.parser.pos;\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\tstart: citeStart,\n\t\t\tend: citeEnd\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tciteStart = this.parser.pos;\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\tciteEnd = this.parser.pos;\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\tstart: citeStart,\n\t\t\tend: citeEnd\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(\" \"), start: classStart, end: classEnd },\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\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\tif(!classString && !stylesString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,\"tc-inline-style\");\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\tvar start = this.parser.pos;\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), start: start+1, end: this.parser.pos}];\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\tstart: start,\n\t\t\t\tend: this.parser.pos\n\t\t\t}]\n\t\t}];\n\t}\n};\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\tvar start = this.parser.pos;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", start: start, children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", start: start, 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\tcell.end = this.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: [], start: this.parser.pos, end: this.parser.pos};\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\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: [], start: rowMatch.index};\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\ttheRow.end = this.parser.pos;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t\trowContainer.end = this.parser.pos;\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\tparams = this.match[3] ? this.match[3].split(\"|\") : [];\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$tw.utils.each(params,function(paramValue,index) {\n\t\tvar name = \"\" + index;\n\t\ttranscludeNode.attributes[name] = {\n\t\t\tname: name,\n\t\t\ttype: \"string\",\n\t\t\tvalue: paramValue\n\t\t}\n\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: {name: \"tiddler\", 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\"] = {name: \"$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\"] = {name: \"$tiddler\", type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes[\"$field\"] = {name: \"$field\", type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes[\"$index\"] = {name: \"$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\tparams = this.match[3] ? this.match[3].split(\"|\") : [];\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t$tw.utils.each(params,function(paramValue,index) {\n\t\tvar name = \"\" + index;\n\t\ttranscludeNode.attributes[name] = {\n\t\t\tname: name,\n\t\t\ttype: \"string\",\n\t\t\tvalue: paramValue\n\t\t}\n\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: {name: \"tiddler\", 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\"] = {name: \"$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\"] = {name: \"$tiddler\", type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes[\"$field\"] = {name: \"$field\", type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes[\"$index\"] = {name: \"$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\tvar start = this.parser.pos;\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\tstart: start,\n\t\t\t\tend: this.parser.pos\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\tvar start = this.parser.pos;\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\tstart: start,\n\t\t\tend: this.parser.pos\n\t\t}]\n\t}];\n};\n\n})();\n","type":"application/javascript","module-type":"wikirule"},"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js":{"title":"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js","text":"/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for suppressed wiki links. For example:\n\n```\n~SuppressedLink\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilinkprefix\";\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 wikilink\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the link without unwikilink character as plain text\n\treturn [{type: \"text\", text: linkText.substr(1)}];\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\n/*\ntype: content type of text\ntext: text to be parsed\noptions: see below:\n\tparseAsInline: true to parse text as inline instead of block\n\twiki: reference to wiki to use\n\t_canonical_uri: optional URI of content if text is missing or empty\n\tconfigTrimWhiteSpace: true to trim whitespace\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// 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 = options.configTrimWhiteSpace !== undefined ? options.configTrimWhiteSpace : false;\n\t// Parser mode\n\tthis.parseAsInline = options.parseAsInline;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Start with empty output\n\tthis.tree = [];\n\t// Assemble the rule classes we're going to use\n\tvar pragmaRuleClasses, blockRuleClasses, inlineRuleClasses;\n\tif(options.rules) {\n\t\tpragmaRuleClasses = options.rules.pragma;\n\t\tblockRuleClasses = options.rules.block;\n\t\tinlineRuleClasses = options.rules.inline;\n\t} else {\n\t\t// Setup the rule classes if we don't have them already\n\t\tif(!this.pragmaRuleClasses) {\n\t\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t\t}\n\t\tpragmaRuleClasses = this.pragmaRuleClasses;\n\t\tif(!this.blockRuleClasses) {\n\t\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t\t}\n\t\tblockRuleClasses = this.blockRuleClasses;\n\t\tif(!this.inlineRuleClasses) {\n\t\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t\t}\n\t\tinlineRuleClasses = this.inlineRuleClasses;\n\t}\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(this.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Build rules' name map\n\tthis.usingRuleMap = {};\n\t$tw.utils.each(this.pragmaRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\n\t$tw.utils.each(this.blockRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\n\t$tw.utils.each(this.inlineRules, function (ruleInfo) { self.usingRuleMap[ruleInfo.rule.name] = Object.getPrototypeOf(ruleInfo.rule); });\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\tvar savedPos = this.pos;\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\tthis.pos = savedPos;\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Set the start and end positions of the pragma rule if\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\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\t// Skip whitespace after the pragma\n\t\tthis.skipWhitespace();\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\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\t// Set the start and end positions of the first and last blocks if they're not already set\n\t\tif (subTree.length > 0) {\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t}\n\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\n\t\treturn subTree;\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\tvar start = this.pos;\n\tvar children = this.parseInlineRun(terminatorRegExp);\n\tvar end = this.pos;\n\treturn [{type: \"element\", tag: \"p\", children: children, start: start, end: end }];\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. Wrapper for parseBlocksTerminatedExtended that just returns the parse tree\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar ex = this.parseBlocksTerminatedExtended(terminatorRegExpString);\n\treturn ex.tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminatedExtended = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(terminatorRegExpString,\"mg\"),\n\t\tresult = {\n\t\t\ttree: []\n\t\t};\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\tresult.tree.push.apply(result.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\tresult.match = match;\n\t}\n\treturn result;\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),this.pos,nextMatch.matchIndex);\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\tvar start = this.pos;\n\t\tvar subTree = nextMatch.rule.parse();\n\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\tif (subTree.length > 0) {\n\t\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t}\n\t\t$tw.utils.each(subTree, function (node) { node.rule = nextMatch.rule.name; });\n\t\ttree.push.apply(tree,subTree);\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),this.pos,this.sourceLength);\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\tvar ex = this.parseInlineRunTerminatedExtended(terminatorRegExp,options);\n\treturn ex.tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminatedExtended = 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),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 {\n\t\t\t\t\tmatch: terminatorMatch,\n\t\t\t\t\ttree: tree\n\t\t\t\t};\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),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\tvar start = this.pos;\n\t\t\tvar subTree = inlineRuleMatch.rule.parse();\n\t\t\t// Set the start and end positions of the first and last child if they're not already set\n\t\t\tif (subTree.length > 0) {\n\t\t\t\tif (subTree[0].start === undefined) subTree[0].start = start;\n\t\t\t\tif (subTree[subTree.length - 1].end === undefined) subTree[subTree.length - 1].end = this.pos;\n\t\t\t}\n\t\t\t$tw.utils.each(subTree, function (node) { node.rule = inlineRuleMatch.rule.name; });\n\t\t\ttree.push.apply(tree,subTree);\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),this.pos,this.sourceLength);\n\t}\n\tthis.pos = this.sourceLength;\n\treturn {\n\t\ttree: tree\n\t};\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text,start,end) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text, start: start, end: end});\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 target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\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((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\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","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 = $tw.utils.parseJSONSafe(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\twiki: event.widget.wiki,\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\twiki: event.widget.wiki,\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\twiki: optional wiki, overriding the default wiki specified in the constructor\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\twiki = options.wiki || this.wiki,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = (options.template || \n\t\t wiki.getTiddlerText(\"$:/config/SaveWikiButton/Template\",\"$:/core/save/all\")).trim(),\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = 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\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\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 = $tw.utils.decodeURIComponentSafe(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/custom.js":{"title":"$:/core/modules/savers/custom.js","text":"/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t// Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\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 !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\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 = $tw.utils.decodeURIComponentSafe(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\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !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 = $tw.utils.parseJSONSafe(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.getString(\"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 = $tw.utils.parseJSONSafe(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\") || \"main\",\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 \" + $tw.utils.base64Encode(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !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 = $tw.utils.parseJSONSafe(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.getString(\"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 = $tw.utils.parseJSONSafe(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 || !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 = $tw.utils.parseJSONSafe(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.getString(\"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 = $tw.utils.parseJSONSafe(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: \"*/*\"\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/TiddlyWiki/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.status < 300 && !!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.notifier.display(\"$:/language/Notifications/Save/Starting\");\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\tvar status = xhr.status,\n\t\t\t\t\terrorMsg = err;\n\t\t\t\tif(status === 412) { // file changed on server\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutEditConflict\");\n\t\t\t\t} else if(status === 401) { // authentication required\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutUnauthorized\");\n\t\t\t\t} else if(status === 403) { // permission denied\n\t\t\t\t\terrorMsg = $tw.language.getString(\"Error/PutForbidden\");\n\t\t\t\t}\n\t\t\t\tif (xhr.responseText) {\n\t\t\t\t\t// treat any server response like a plain text error explanation\n\t\t\t\t\terrorMsg = errorMsg + \"\\n\\n\" + xhr.responseText;\n\t\t\t\t}\n\t\t\t\tcallback(errorMsg); // fail\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\",$tw.utils.decodeURIComponentSafe(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 = $tw.utils.decodeURIComponentSafe(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\tuploadWithUrlOnly = this.wiki.getTextReference(\"$:/UploadWithUrlOnly\") || \"no\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif (uploadWithUrlOnly === \"yes\") {\n\t\t// The url is good enough. No need for a username and password.\n\t\t// Assume the server uses some other kind of auth mechanism.\n\t\tif(!url || url.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\t// Require username and password to be present.\n\t\t// Assume the server uses the standard UploadPlugin username/password.\n\t\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\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\";\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\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\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\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(this.server.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\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\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\tif(username) {\n\t\t\tstate.authenticatedUsername = $tw.utils.decodeURIComponentSafe(username);\n\t\t}\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 = $tw.utils.decodeURIComponentSafe(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\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tstate.sendResponse(200,{\"Content-Type\": \"image/x-icon\"},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 = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\t\tbaseFilename = path.resolve(state.boot.wikiPath,\"files\"),\n\t\tfilename = path.resolve(baseFilename,suppliedFilename),\n\t\textension = path.extname(filename);\n\t// Check that the filename is inside the wiki files folder\n\tif(path.relative(baseFilename,filename).indexOf(\"..\") !== 0) {\n\t\t// Send the file\n\t\tfs.readFile(filename,function(err,content) {\n\t\t\tvar status,content,type = \"text/plain\";\n\t\t\tif(err) {\n\t\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\t\tstatus = 404;\n\t\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t\t} else {\n\t\t\t\tstatus = 200;\n\t\t\t\tcontent = content;\n\t\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t\t}\n\t\t\tstate.sendResponse(status,{\"Content-Type\": type},content);\n\t\t});\n\t} else {\n\t\tstate.sendResponse(404,{\"Content-Type\": \"text/plain\"},\"File '\" + suppliedFilename + \"' not found\");\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\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\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\tstate.sendResponse(200,responseHeaders,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();\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tvar location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: \"/\";\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: location\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\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\tlogout_is_available: false,\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},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 = $tw.utils.decodeURIComponentSafe(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\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\tstate.sendResponse(200,{},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 = $tw.utils.decodeURIComponentSafe(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\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},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.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(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/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\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\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\tstate.sendResponse(200,{\"Content-Type\": \"application/json\"},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 = $tw.utils.decodeURIComponentSafe(state.params[0]),\n\tfields = $tw.utils.parseJSONSafe(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\t// If this is a skinny tiddler, it means the client never got the full\n\t// version of the tiddler to edit. So we must preserve whatever text\n\t// already exists on the server, or else we'll inadvertently delete it.\n\tif(fields._is_skinny !== undefined) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tfields.text = tiddler.fields.text;\n\t\t}\n\t\tdelete fields._is_skinny;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(fields,{title: title}));\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\t\tcrypto = require(\"crypto\"),\n\t\tzlib = require(\"zlib\");\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.boot = options.boot || $tw.boot;\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}\n\t}\n\t// Setup the default required plugins\n\tthis.requiredPlugins = this.get(\"required-plugins\").split(',');\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// Initialize browser-caching\n\tthis.enableBrowserCache = this.get(\"use-browser-cache\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName;\n\tif(this.get(\"username\") && this.get(\"password\")) {\n\t\tauthorizedUserName = this.get(\"username\");\n\t} else if(this.get(\"credentials\")) {\n\t\tauthorizedUserName = \"(authenticated)\";\n\t} else {\n\t\tauthorizedUserName = \"(anon)\";\n\t}\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\tif(this.get(\"admin\") || authorizedUserName !== \"(anon)\") {\n\t\tthis.authorizationPrincipals[\"admin\"] = (this.get(\"admin\") || 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 authenticator \" + 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\t\ttlsPassphrase = this.get(\"tls-passphrase\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\"),\n\t\t\tpassphrase: tlsPassphrase || ''\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n\t// Name the server and init the boot state\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.get(\"server-name\") || this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\tthis.boot.origin = this.get(\"origin\")? this.get(\"origin\"): this.protocol+\"://\"+this.get(\"host\")+\":\"+this.get(\"port\");\n\tthis.boot.pathPrefix = this.get(\"path-prefix\") || \"\";\n}\n\n/*\nSend a response to the client. This method checks if the response must be sent\nor if the client alrady has the data cached. If that's the case only a 304\nresponse will be transmitted and the browser will use the cached data.\nOnly requests with status code 200 are considdered for caching.\nrequest: request instance passed to the handler\nresponse: response instance passed to the handler\nstatusCode: stauts code to send to the browser\nheaders: response headers (they will be augmented with an `Etag` header)\ndata: the data to send (passed to the end method of the response instance)\nencoding: the encoding of the data to send (passed to the end method of the response instance)\n*/\nfunction sendResponse(request,response,statusCode,headers,data,encoding) {\n\tif(this.enableBrowserCache && (statusCode == 200)) {\n\t\tvar hash = crypto.createHash('md5');\n\t\t// Put everything into the hash that could change and invalidate the data that\n\t\t// the browser already stored. The headers the data and the encoding.\n\t\thash.update(data);\n\t\thash.update(JSON.stringify(headers));\n\t\tif(encoding) {\n\t\t\thash.update(encoding);\n\t\t}\n\t\tvar contentDigest = hash.digest(\"hex\");\n\t\t// RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes\n\t\theaders[\"Etag\"] = '\"' + contentDigest + '\"';\n\t\theaders[\"Cache-Control\"] = \"max-age=0, must-revalidate\";\n\t\t// Check if any of the hashes contained within the if-none-match header\n\t\t// matches the current hash.\n\t\t// If one matches, do not send the data but tell the browser to use the\n\t\t// cached data.\n\t\t// We do not implement \"*\" as it makes no sense here.\n\t\tvar ifNoneMatch = request.headers[\"if-none-match\"];\n\t\tif(ifNoneMatch) {\n\t\t\tvar matchParts = ifNoneMatch.split(\",\").map(function(etag) {\n\t\t\t\treturn etag.replace(/^[ \"]+|[ \"]+$/g, \"\");\n\t\t\t});\n\t\t\tif(matchParts.indexOf(contentDigest) != -1) {\n\t\t\t\tresponse.writeHead(304,headers);\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// RFC 7231, 6.1. Overview of Status Codes:\n\t\t// Browser clients may cache 200, 203, 204, 206, 300, 301, \n\t\t// 404, 405, 410, 414, and 501 unless given explicit cache controls\n\t\theaders[\"Cache-Control\"] = headers[\"Cache-Control\"] || \"no-store\";\n\t}\n\t/*\n\tIf the gzip=yes is set, check if the user agent permits compression. If so,\n\tcompress our response if the raw data is bigger than 2k. Compressing less\n\tdata is inefficient. Note that we use the synchronous functions from zlib\n\tto stay in the imperative style. The current `Server` doesn't depend on\n\tthis, and we may just as well use the async versions.\n\t*/\n\tif(this.enableGzip && (data.length > 2048)) {\n\t\tvar acceptEncoding = request.headers[\"accept-encoding\"] || \"\";\n\t\tif(/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\theaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\tdata = zlib.deflateSync(data);\n\t\t} else if(/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\theaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\tdata = zlib.gzipSync(data);\n\t\t}\n\t}\n\n\tresponse.writeHead(statusCode,headers);\n\tresponse.end(data,encoding);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"required-plugins\": \"$:/plugins/tiddlywiki/filesystem,$:/plugins/tiddlywiki/tiddlyweb\",\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\t\"use-browser-cache\": \"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\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(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.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,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\tstate.sendResponse = sendResponse.bind(self,request,response);\n\t// Get the principals authorized to access this resource\n\tstate.authorizationType = options.authorizationType || this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && state.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;\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(state.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}\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(state.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\tvar missing = [];\n\tfor (var index=0; index<this.requiredPlugins.length; index++) {\n\t\tif (!this.wiki.getTiddler(this.requiredPlugins[index])) {\n\t\t\tmissing.push(this.requiredPlugins[index]);\n\t\t}\n\t}\n\tif(missing.length > 0) {\n\t\tvar error = \"Warning: Plugin(s) required for client-server operation are missing.\\n\"+\n\t\t\t\"\\\"\"+ missing.join(\"\\\", \\\"\")+\"\\\"\";\n\t\t$tw.utils.warning(error);\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\turl = self.protocol + \"://\" + (address.family === \"IPv6\" ? \"[\" + address.address + \"]\" : address.address) + \":\" + address.port + prefix;\n\t\t$tw.utils.log(\"Serving on \" + url,\"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\tvar iframes = document.getElementsByTagName('iframe');\n\tfor(var t=iframes.length-1; t--; t>=0) {\n\t\tvar iframe = iframes[t];\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 = $tw.utils.parseJSONSafe(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 = $tw.utils.parseJSONSafe(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/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\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\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\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// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\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\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\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\tif($tw.browser) {\n\t\t$tw.modules.applyMethods(\"utils-browser\",$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.before = [\"startup\"];\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\t// Work out which of the changed tiddlers are plugins that we need to reregister\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\t// Issue warning if any of the tiddlers require a reload\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\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\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\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\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/RootTemplate\";\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, {\n\t\tdocument: $tw.fakeDocument,\n\t\tparseAsInline: true,\n\t\timportPageMacros: true,\n\t});\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.styleWidgetNode.assignedStyles = $tw.styleContainer.textContent;\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\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\tvar newStyles = $tw.styleContainer.textContent;\n\t\t\tif(newStyles !== $tw.styleWidgetNode.assignedStyles) {\n\t\t\t\t$tw.styleWidgetNode.assignedStyles = newStyles;\n\t\t\t\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\n\t\t\t}\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, recursionMarker: \"no\"});\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\tvar throttledRefresh = $tw.perf.report(\"throttledRefresh\",refresh);\n\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(!$tw.wiki.isVolatileTiddler(title) && (!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(throttledRefresh,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\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\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 HTTP client event handler\n\t$tw.httpClient = new $tw.utils.HttpClient();\n\tvar getPropertiesWithPrefix = function(properties,prefix) {\n\t\tvar result = Object.create(null);\n\t\t$tw.utils.each(properties,function(value,name) {\n\t\t\tif(name.indexOf(prefix) === 0) {\n\t\t\t\tresult[name.substring(prefix.length)] = properties[name];\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t};\n\t$tw.rootWidget.addEventListener(\"tm-http-request\",function(event) {\n\t\tvar params = event.paramObject || {};\n\t\t$tw.httpClient.initiateHttpRequest({\n\t\t\twiki: event.widget.wiki,\n\t\t\turl: params.url,\n\t\t\tmethod: params.method,\n\t\t\tbody: params.body,\n\t\t\tbinary: params.binary,\n\t\t\tuseDefaultHeaders: params.useDefaultHeaders,\n\t\t\toncompletion: params.oncompletion,\n\t\t\tonprogress: params.onprogress,\n\t\t\tbindStatus: params[\"bind-status\"],\n\t\t\tbindProgress: params[\"bind-progress\"],\n\t\t\tvariables: getPropertiesWithPrefix(params,\"var-\"),\n\t\t\theaders: getPropertiesWithPrefix(params,\"header-\"),\n\t\t\tpasswordHeaders: getPropertiesWithPrefix(params,\"password-header-\"),\n\t\t\tqueryStrings: getPropertiesWithPrefix(params,\"query-\"),\n\t\t\tpasswordQueryStrings: getPropertiesWithPrefix(params,\"password-query-\"),\n\t\t\tbasicAuthUsername: params[\"basic-auth-username\"],\n\t\t\tbasicAuthUsernameFromStore: params[\"basic-auth-username-from-store\"],\n\t\t\tbasicAuthPassword: params[\"basic-auth-password\"],\n\t\t\tbasicAuthPasswordFromStore: params[\"basic-auth-password-from-store\"],\n\t\t\tbearerAuthToken: params[\"bearer-auth-token\"],\n\t\t\tbearerAuthTokenFromStore: params[\"bearer-auth-token-from-store\"]\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-http-cancel-all-requests\",function(event) {\n\t\t$tw.httpClient.cancelAllHttpRequests();\n\t});\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$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{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\t\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\n\t\t});\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\t \tbaseElement = event.event && event.event.target ? event.event.target.ownerDocument : document;\n\t\telement = $tw.utils.querySelectorSafe(selector,baseElement);\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the tm-rename-tiddler and tm-relink-tiddler messages\n\tvar makeRenameHandler = function(method) {\n\t\treturn function(event) {\n\t\t\tvar options = {},\n\t\t\t\tparamObject = event.paramObject || {},\n\t\t\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\t\t\tto = paramObject.to;\n\t\t\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\t\t\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\t\t\t$tw.wiki[method](from,to,options);\n\t\t};\n\t};\n\t$tw.rootWidget.addEventListener(\"tm-rename-tiddler\",makeRenameHandler(\"renameTiddler\"));\n\t$tw.rootWidget.addEventListener(\"tm-relink-tiddler\",makeRenameHandler(\"relinkTiddler\"));\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}\n\t\t\t}\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\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\t// 2023-07-21 Edge returns UA below. So we use \"isChromeLike\"\n\t\t//'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/114.0.0.0 safari/537.36 edg/114.0.1823.82'\n\t\t$tw.browser.isChromeLike = navigator.userAgent.toLowerCase().indexOf(\"chrome\") > -1;\n\t\t$tw.browser.hasTouch = !!window.matchMedia && window.matchMedia(\"(pointer: coarse)\").matches;\n\t\t$tw.browser.isMobileChrome = $tw.browser.isChromeLike && $tw.browser.hasTouch;\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\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\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({\n\t\t\twiki: $tw.wiki,\n\t\t\tsyncadaptor: $tw.syncadaptor,\n\t\t\tlogging: $tw.wiki.getTiddlerText('$:/config/SyncLogging', \"yes\") === \"yes\"\n\t\t});\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\tif(hash !== \"#\") {\n\t\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t\t}\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\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\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\tsuccessNotification: event.paramObject && event.paramObject.successNotification,\n\t\t\t\tfailureNotification: event.paramObject && event.paramObject.failureNotification\n\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 = $tw.utils.decodeURIComponentSafe(hash.trim());\n\t\t} else {\n\t\t\ttarget = $tw.utils.decodeURIComponentSafe(hash.substr(0,split).trim());\n\t\t\tstoryFilter = $tw.utils.decodeURIComponentSafe(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\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\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\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\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\noptions.successNotification: optional title of tiddler to use as the notification in case of success\noptions.failureNotification: optional title of tiddler to use as the notification in case of failure\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\tvar url = \"\";\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\turl = $tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\turl = $tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\tif(url) {\n\t\t$tw.utils.copyToClipboard(url,{successNotification: options.successNotification, failureNotification: options.failureNotification});\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)\n$tw.windows = {};\n// Default template to use for new windows\nvar DEFAULT_WINDOW_TEMPLATE = \"$:/core/templates/single.tiddler.window\";\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\twindowID = paramObject.windowID || title,\n\t\t\ttemplate = paramObject.template || DEFAULT_WINDOW_TEMPLATE,\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\ttop = paramObject.top,\n\t\t\tleft = paramObject.left,\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title, \"tv-window-id\": windowID});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t\tsrcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + windowID,\"scrollbars,width=\" + width + \",height=\" + height + (top ? \",top=\" + top : \"\" ) + (left ? \",left=\" + left : \"\" )),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[windowID] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\tsrcWindow.focus();\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<!DOCTYPE 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 $tw.windows[windowID];\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\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-close-window\",function(event) {\n\t\tvar windowID = event.param,\n\t\t\twin = $tw.windows[windowID];\n\t\t\tif(win) {\n\t\t\t\twin.close();\n\t\t\t}\n\t});\n\tvar closeAllWindows = function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t}\n\t$tw.rootWidget.addEventListener(\"tm-close-all-windows\",closeAllWindows);\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(closeAllWindows);\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 || targetElement.nodeType === Node.TEXT_NODE) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\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 || targetElement.nodeType === Node.TEXT_NODE) {\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// Blur the focus if it is within the descendents of the node we are removing\n\t\tif($tw.utils.domContains(targetElement,targetElement.ownerDocument.activeElement)) {\n\t\t\ttargetElement.ownerDocument.activeElement.blur();\n\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 || targetElement.nodeType === Node.TEXT_NODE) {\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})();\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 || targetElement.nodeType === Node.TEXT_NODE) {\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 || targetElement.nodeType === Node.TEXT_NODE) {\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 || targetElement.nodeType === Node.TEXT_NODE) {\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\tthis.textNodeLogger = new $tw.utils.Logger(\"zoomin story river view\", {\n\t\tenable: true,\n\t\tcolour: 'red'\n\t});\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) {\n\t\treturn;\n\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\n\t\tthis.logTextNodeRoot(targetElement);\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 $tw.utils.querySelectorSafe(\".\" + targetClass,domNode);\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) {\n\t\treturn;\n\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\n\t\tthis.logTextNodeRoot(targetElement);\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 || targetElement.nodeType === Node.TEXT_NODE) {\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\tif (toWidgetDomNode.nodeType === Node.TEXT_NODE) {\n\t\t\tthis.logTextNodeRoot(toWidgetDomNode);\n\t\t\ttoWidgetDomNode = null;\n\t\t} else {\n\t\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t\t{display: \"block\"},\n\t\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t\t{opacity: \"0\"},\n\t\t\t\t{zIndex: \"500\"}\n\t\t\t]);\n\t\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t\t}\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\nZoominListView.prototype.logTextNodeRoot = function(node) {\n\tthis.textNodeLogger.log($tw.language.getString(\"Error/ZoominTextNode\") + \" \" + node.textContent);\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 = 0.25 * 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\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// True when we want to force an immediate sync from the server\n\tthis.forceSyncFromServer = false;\n\tthis.timestampLastSyncFromServer = new Date();\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(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\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 && this.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.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\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\tvar self = this;\n\tfunction checkIsDirty() {\n\t\t// Check tiddlers that are in the store and included in the filter function\n\t\tvar titles = self.getSyncedTiddlers();\n\t\tfor(var index=0; index<titles.length; index++) {\n\t\t\tvar title = titles[index],\n\t\t\t\ttiddlerInfo = self.tiddlerInfo[title];\n\t\t\tif(self.wiki.tiddlerExists(title)) {\n\t\t\t\tif(tiddlerInfo) {\n\t\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\t\tif(self.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\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\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Check tiddlers that are known from the server but not currently in the store\n\t\ttitles = Object.keys(self.tiddlerInfo);\n\t\tfor(index=0; index<titles.length; index++) {\n\t\t\tif(!self.wiki.tiddlerExists(titles[index])) {\n\t\t\t\t// There must be a pending delete\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tvar dirtyStatus = checkIsDirty();\n\treturn dirtyStatus;\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.displayError(\"Get Status Error\",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\tif(this.canSyncFromServer()) {\n\t\tthis.forceSyncFromServer = true;\n\t\tthis.processTaskQueue();\t\n\t}\n};\n\nSyncer.prototype.canSyncFromServer = function() {\n\treturn !!this.syncadaptor.getUpdatedTiddlers || !!this.syncadaptor.getSkinnyTiddlers;\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\tthis.processTaskQueue();\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\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\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.displayError(\"Logout Error\",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);\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(this.taskTimerInterval);\n\t\t\t} else if(this.canSyncFromServer()) {\n\t\t\t\tthis.triggerTimeout(this.pollTimerInterval);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\n\t\tthis.triggerTimeout(this.taskTimerInterval);\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(this.taskTimerId) {\n\t\tclearTimeout(this.taskTimerId);\n\t}\n\tthis.taskTimerId = setTimeout(function() {\n\t\tself.taskTimerId = null;\n\t\tself.processTaskQueue.call(self);\n\t},interval || self.taskTimerInterval);\n};\n\n/*\nChoose the next sync task. We prioritise saves to the server, then getting updates from the server, then deletes to the server, then loads from the server\n\nReturns either:\n* a task object\n* the boolean true if there are pending sync tasks that aren't yet due\n* null if there's no pending sync tasks (just the next poll)\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar now = new Date(),\n\t\tthresholdLastSaved = now - 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 || this.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);\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 for an outstanding sync from server\n\tif(this.forceSyncFromServer || (this.timestampLastSyncFromServer && (now.valueOf() >= (this.timestampLastSyncFromServer.valueOf() + this.pollTimerInterval)))) {\n\t\treturn new SyncFromServerTask(this);\n\t}\n\t// Third, 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// Finally, 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 now, but might be in the future\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.toString = function() {\n\treturn \"SAVE \" + this.title;\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\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\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.toString = function() {\n\treturn \"DELETE \" + this.title;\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.toString = function() {\n\treturn \"LOAD \" + this.title;\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\nfunction SyncFromServerTask(syncer) {\n\tthis.syncer = syncer;\n\tthis.type = \"syncfromserver\";\n}\n\nSyncFromServerTask.prototype.toString = function() {\n\treturn \"SYNCFROMSERVER\";\n}\n\nSyncFromServerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tvar syncSystemFromServer = (self.syncer.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tvar successCallback = function() {\n\t\tself.syncer.forceSyncFromServer = false;\n\t\tself.syncer.timestampLastSyncFromServer = new Date();\n\t\tcallback(null);\n\t};\n\tif(this.syncer.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.syncer.syncadaptor.getUpdatedTiddlers(self.syncer,function(err,updates) {\n\t\t\tif(err) {\n\t\t\t\tself.syncer.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn callback(err);\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.syncer.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\tif(syncSystemFromServer || !self.syncer.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.syncer.tiddlerInfo[title];\n\t\t\t\t\t\tself.syncer.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.syncer.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn successCallback();\n\t\t});\n\t} else if(this.syncer.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.syncer.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.syncer.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn callback(err);\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.syncer.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.syncer.wiki.tiddlerExists(tiddlerFields.title) && self.syncer.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.syncer.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.syncer.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.syncer.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\tif(syncSystemFromServer || !self.syncer.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.syncer.tiddlerInfo[title];\n\t\t\t\t\tself.syncer.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.syncer.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.syncer.forceSyncFromServer = false;\n\t\t\tself.syncer.timestampLastSyncFromServer = new Date();\n\t\t\treturn successCallback();\n\t\t});\n\t} else {\n\t\treturn successCallback();\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,defaultValue) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn defaultValue || \"\";\n\t}\n\t// Stringify the field with the associated tiddler field 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 = wiki.doesPluginInfoRequireReload($tw.utils.parseJSONSafe(incomingTiddler.text)) ? (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] = $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 = [\"$:/Import\", \"$:/build\"],\n\tUNSELECT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/StoryList\",\"$:/HistoryList\"],\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<UNSELECT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = UNSELECT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Tiddler/Unselected\");\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++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else 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;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);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,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(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,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));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));\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 = $tw.utils.parseJSONSafe(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\nvar QUOTE = '\"';\n\nvar getCellInfo = function(text, start, length, SEPARATOR) {\n\tvar isCellQuoted = text.charAt(start) === QUOTE;\n\tvar cellStart = isCellQuoted ? start + 1 : start;\n\t\n\tif (text.charAt(i) === SEPARATOR) {\n\t\treturn [cellStart, cellStart, false];\n\t}\n\t\n\tfor (var i = cellStart; i < length; i++) {\n\t\tvar cellCharacter = text.charAt(i);\n\t\tvar isEOL = cellCharacter === \"\\n\" || cellCharacter === \"\\r\";\n\t\t\n\t\tif (isEOL && !isCellQuoted) {\n\t\t\treturn [cellStart, i, false];\n\t\t\t\n\t\t} else if (cellCharacter === SEPARATOR && !isCellQuoted) {\n\t\t\treturn [cellStart, i, false];\n\t\t\t\n\t\t} else if (cellCharacter === QUOTE && isCellQuoted) {\n\t\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\tif (nextCharacter !== QUOTE) {\n\t\t\t\treturn [cellStart, i, true];\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn [cellStart, i, isCellQuoted];\n}\n\t\nexports.parseCsvString = function(text, options) {\n\tif (!text) {\n\t\treturn [];\n\t}\n\t\n\toptions = options || {};\n\tvar SEPARATOR = options.separator || \",\",\n\t\tlength = text.length,\n\t\trows = [],\n\t\tnextRow = [];\n\t\t\n\tfor (var i = 0; i < length; i++) {\n\t\tvar cellInfo = getCellInfo(text, i, length, SEPARATOR);\n\t\tvar cellText = text.substring(cellInfo[0], cellInfo[1]);\n\t\tif (cellInfo[2]) {\n\t\t\tcellText = cellText.replace(/\"\"/g, '\"');\n\t\t\tcellInfo[1]++;\n\t\t}\n\t\tnextRow.push(cellText);\n\t\t\n\t\ti = cellInfo[1];\n\t\t\n\t\tvar character = text.charAt(i);\n\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\n\t\tif (character === \"\\r\" || character === \"\\n\") {\n\t\t\t// Edge case for empty rows\n\t\t\tif (nextRow.length === 1 && nextRow[0] === '') {\n\t\t\t\tnextRow.length = 0;\n\t\t\t}\n\t\t\trows.push(nextRow);\n\t\t\tnextRow = [];\n\t\t\t\n\t\t\tif (character === \"\\r\") {\n\t\t\t\tvar nextCharacter = i + 1 < length ? text.charAt(i + 1) : '';\n\t\t\t\t\n\t\t\t\tif (nextCharacter === \"\\n\") {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Special case if last cell in last row is an empty cell\n\tif (text.charAt(length - 1) === SEPARATOR) {\n\t\tnextRow.push(\"\");\n\t}\n\t\n\trows.push(nextRow);\n\t\n\treturn rows;\n}\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\tvar csv = $tw.utils.parseCsvString(text, options);\n\tvar headers = csv[0];\n\t\n\tcsv = csv.slice(1);\n\tfor (var i = 0; i < csv.length; i++) {\n\t\tvar row = csv[i];\n\t\tvar rowObject = Object.create(null);\n\n\t\tfor(var columnIndex=0; columnIndex<headers.length; columnIndex++) {\n\t\t\tvar columnName = headers[columnIndex];\n\t\t\tif (columnName) {\n\t\t\t\trowObject[columnName] = $tw.utils.trim(row[columnIndex] || \"\");\n\t\t\t}\n\t\t}\n\t\tcsv[i] = rowObject;\n\t}\n\treturn csv;\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\nvar Popup = require(\"$:/core/modules/utils/dom/popup.js\");\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.domMatchesSelector = function(node,selector) {\n\treturn node.matches ? node.matches(selector) : node.msMatchesSelector(selector);\n};\n\n/*\nSelect text in a an input or textarea (setSelectionRange crashes on certain input types)\n*/\nexports.setSelectionRangeSafe = function(node,start,end,direction) {\n\ttry {\n\t\tnode.setSelectionRange(start,end,direction);\n\t} catch(e) {\n\t\tnode.select();\n\t}\n};\n\n/*\nSelect the text in an input or textarea by position\n*/\nexports.setSelectionByPosition = function(node,selectFromStart,selectFromEnd) {\n\t$tw.utils.setSelectionRangeSafe(node,selectFromStart,node.value.length - selectFromEnd);\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.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",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) {\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};\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\ttext = text || \"\";\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\tvar successNotification = options.successNotification || \"$:/language/Notifications/CopiedToClipboard/Succeeded\",\n\t\t\tfailureNotification = options.failureNotification || \"$:/language/Notifications/CopiedToClipboard/Failed\"\n\t\t$tw.notifier.display(succeeded ? successNotification : failureNotification);\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n/*\nCollect DOM variables\n*/\nexports.collectDOMVariables = function(selectedNode,domNode,event) {\n\tvar variables = {},\n\t selectedNodeRect,\n\t domNodeRect;\n\tif(selectedNode) {\n\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t});\n\t\t\n\t\tif(\"offsetLeft\" in selectedNode) {\n\t\t\t// Add variables with a (relative and absolute) popup coordinate string for the selected node\n\t\t\tvar nodeRect = {\n\t\t\t\tleft: selectedNode.offsetLeft,\n\t\t\t\ttop: selectedNode.offsetTop,\n\t\t\t\twidth: selectedNode.offsetWidth,\n\t\t\t\theight: selectedNode.offsetHeight\n\t\t\t};\n\t\t\tvariables[\"tv-popup-coords\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csOffsetParent,nodeRect);\n\n\t\t\tvar absRect = $tw.utils.extend({}, nodeRect);\n\t\t\tfor(var currentNode = selectedNode.offsetParent; currentNode; currentNode = currentNode.offsetParent) {\n\t\t\t\tabsRect.left += currentNode.offsetLeft;\n\t\t\t\tabsRect.top += currentNode.offsetTop;\n\t\t\t}\n\t\t\tvariables[\"tv-popup-abs-coords\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csAbsolute,absRect);\n\n\t\t\t// Add variables for offset of selected node\n\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\t\t}\n\t}\n\t\n\tif(domNode && (\"offsetWidth\" in domNode)) {\n\t\tvariables[\"tv-widgetnode-width\"] = domNode.offsetWidth.toString();\n\t\tvariables[\"tv-widgetnode-height\"] = domNode.offsetHeight.toString();\n\t}\n\n\tif(event && (\"clientX\" in event) && (\"clientY\" in event)) {\n\t\tif(selectedNode) {\n\t\t\t// Add variables for event X and Y position relative to selected node\n\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\n\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\t\t}\n\t\t\n\t\tif(domNode) {\n\t\t\t// Add variables for event X and Y position relative to event catcher node\n\t\t\tdomNodeRect = domNode.getBoundingClientRect();\n\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - domNodeRect.left).toString();\n\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - domNodeRect.top).toString();\n\t\t}\n\n\t\t// Add variables for event X and Y position relative to the viewport\n\t\tvariables[\"event-fromviewport-posx\"] = event.clientX.toString();\n\t\tvariables[\"event-fromviewport-posy\"] = event.clientY.toString();\n\t}\n\treturn variables;\n};\n\n/*\nMake sure the CSS selector is not invalid\n*/\nexports.querySelectorSafe = function(selector,baseElement) {\n\tbaseElement = baseElement || document;\n\ttry {\n\t\treturn baseElement.querySelector(selector);\n\t} catch(e) {\n\t\tconsole.log(\"Invalid selector: \",selector);\n\t}\n};\n\nexports.querySelectorAllSafe = function(selector,baseElement) {\n\tbaseElement = baseElement || document;\n\ttry {\n\t\treturn baseElement.querySelectorAll(selector);\n\t} catch(e) {\n\t\tconsole.log(\"Invalid selector: \",selector);\n\t}\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\nselector: CSS selector to identify element within domNode to be used as drag handle (optional)\ndragImageType: \"pill\", \"blank\" or \"dom\" (the default)\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 context 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(!options.selector && ((domNode.tagName || \"\").toLowerCase() !== \"a\")) {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\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\t\tvariables,\n\t\t\t\tdomNodeRect;\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 && (options.selector && $tw.utils.domMatchesSelector(event.target,options.selector) || 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(domNode,\"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\t// Collect our variables\n\t\t\t\t\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\n\t\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t\tvariables[\"actionTiddler\"] = titleString;\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,variables);\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 if(dragImageType === \"blank\") {\n\t\t\t\t\t\tdragImage.removeChild(dragImage.firstChild);\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage,0,0);\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();\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\t// If browser is Chrome-like and has a touch-input device do NOT .setData\n\t\t\t\tif(!($tw.browser.isMobileChrome)) {\n\t\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\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((options.selector && $tw.utils.domMatchesSelector(event.target,options.selector)) || 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\t\tvariables;\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\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\n\t\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t\tvariables[\"actionTiddler\"] = titleString;\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,variables);\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(domNode,\"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\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\nexports.importPaste = function(item,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(item.type === importDataTypes[t].type) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\n\t\t\titem.getAsString(function(data){\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});\n\t\t\treturn;\n\t\t}\n\t}\n};\n\nexports.itemHasValidDataType = function(item) {\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\tif(item.type === importDataTypes[t].type) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\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 = $tw.utils.decodeURIComponentSafe(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 = $tw.utils.decodeURIComponentSafe(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\t// Check for tiddler data URI\n\t\tvar match = $tw.utils.decodeURIComponentSafe(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];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = $tw.utils.parseJSONSafe(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\nfunction dragEventContainsType(event,targetType) {\n\tif(event.dataTransfer.types) {\n\t\tfor(var i=0; i<event.dataTransfer.types.length; i++) {\n\t\t\tif(event.dataTransfer.types[i] === targetType) {\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nexports.dragEventContainsFiles = function(event) {\n\treturn (dragEventContainsType(event,\"Files\") && !dragEventContainsType(event,\"text/plain\"));\n};\n\nexports.dragEventContainsType = dragEventContainsType;\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\nHTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nManage tm-http-request events. Options include:\nwiki: Reference to the wiki to be used for state tiddler tracking\nstateTrackerTitle: Title of tiddler to be used for state tiddler tracking\n*/\nfunction HttpClient(options) {\n\toptions = options || {};\n\tthis.nextId = 1;\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.stateTrackerTitle = options.stateTrackerTitle || \"$:/state/http-requests\";\n\tthis.requests = []; // Array of {id: string,request: HttpClientRequest}\n\tthis.updateRequestTracker();\n}\n\n/*\nReturn the index into this.requests[] corresponding to a given ID. Returns null if not found\n*/\nHttpClient.prototype.getRequestIndex = function(targetId) {\n\tvar targetIndex = null;\n\t$tw.utils.each(this.requests,function(requestInfo,index) {\n\t\tif(requestInfo.id === targetId) {\n\t\t\ttargetIndex = index;\n\t\t}\n\t});\n\treturn targetIndex;\n};\n\n/*\nUpdate the state tiddler that is tracking the outstanding requests\n*/\nHttpClient.prototype.updateRequestTracker = function() {\n\tthis.wiki.addTiddler({title: this.stateTrackerTitle, text: \"\" + this.requests.length});\n};\n\nHttpClient.prototype.initiateHttpRequest = function(options) {\n\tvar self = this,\n\t\tid = this.nextId,\n\t\trequest = new HttpClientRequest(options);\n\tthis.nextId += 1;\n\tthis.requests.push({id: id, request: request});\n\tthis.updateRequestTracker();\n\trequest.send(function(err) {\n\t\tvar targetIndex = self.getRequestIndex(id);\n\t\tif(targetIndex !== null) {\n\t\t\tself.requests.splice(targetIndex,1);\n\t\t\tself.updateRequestTracker();\n\t\t}\n\t});\n\treturn id;\n};\n\nHttpClient.prototype.cancelAllHttpRequests = function() {\n\tvar self = this;\n\tif(this.requests.length > 0) {\n\t\tfor(var t=this.requests.length - 1; t--; t>=0) {\n\t\t\tvar requestInfo = this.requests[t];\n\t\t\trequestInfo.request.cancel();\n\t\t}\n\t}\n\tthis.requests = [];\n\tthis.updateRequestTracker();\n};\n\nHttpClient.prototype.cancelHttpRequest = function(targetId) {\n\tvar targetIndex = this.getRequestIndex(targetId);\n\tif(targetIndex !== null) {\n\t\tthis.requests[targetIndex].request.cancel();\n\t\tthis.requests.splice(targetIndex,1);\n\t\tthis.updateRequestTracker();\n\t}\n};\n\n/*\nInitiate an HTTP request. Options:\nwiki: wiki to be used for executing action strings\nurl: URL for request\nmethod: method eg GET, POST\nbody: text of request body\nbinary: set to \"yes\" to force binary processing of response payload\noncompletion: action string to be invoked on completion\nonprogress: action string to be invoked on progress updates\nbindStatus: optional title of tiddler to which status (\"pending\", \"complete\", \"error\") should be written\nbindProgress: optional title of tiddler to which the progress of the request (0 to 100) should be bound\nvariables: hashmap of variable name to string value passed to action strings\nheaders: hashmap of header name to header value to be sent with the request\npasswordHeaders: hashmap of header name to password store name to be sent with the request\nqueryStrings: hashmap of query string parameter name to parameter value to be sent with the request\npasswordQueryStrings: hashmap of query string parameter name to password store name to be sent with the request\nbasicAuthUsername: plain username for basic authentication\nbasicAuthUsernameFromStore: name of password store entry containing username\nbasicAuthPassword: plain password for basic authentication\nbasicAuthPasswordFromStore: name of password store entry containing password\nbearerAuthToken: plain text token for bearer authentication\nbearerAuthTokenFromStore: name of password store entry contain bear authorization token\n*/\nfunction HttpClientRequest(options) {\n\tvar self = this;\n\tconsole.log(\"Initiating an HTTP request\",options)\n\tthis.wiki = options.wiki;\n\tthis.completionActions = options.oncompletion;\n\tthis.progressActions = options.onprogress;\n\tthis.bindStatus = options[\"bindStatus\"];\n\tthis.bindProgress = options[\"bindProgress\"];\n\tthis.method = options.method || \"GET\";\n\tthis.body = options.body || \"\";\n\tthis.binary = options.binary || \"\";\n\tthis.useDefaultHeaders = options.useDefaultHeaders !== \"false\" ? true : false,\n\tthis.variables = options.variables;\n\tvar url = options.url;\n\t$tw.utils.each(options.queryStrings,function(value,name) {\n\t\turl = $tw.utils.setQueryStringParameter(url,name,value);\n\t});\n\t$tw.utils.each(options.passwordQueryStrings,function(value,name) {\n\t\turl = $tw.utils.setQueryStringParameter(url,name,$tw.utils.getPassword(value) || \"\");\n\t});\n\tthis.url = url;\n\tthis.requestHeaders = {};\n\t$tw.utils.each(options.headers,function(value,name) {\n\t\tself.requestHeaders[name] = value;\n\t});\n\t$tw.utils.each(options.passwordHeaders,function(value,name) {\n\t\tself.requestHeaders[name] = $tw.utils.getPassword(value) || \"\";\n\t});\n\tthis.basicAuthUsername = options.basicAuthUsername || (options.basicAuthUsernameFromStore && $tw.utils.getPassword(options.basicAuthUsernameFromStore)) || \"\";\n\tthis.basicAuthPassword = options.basicAuthPassword || (options.basicAuthPasswordFromStore && $tw.utils.getPassword(options.basicAuthPasswordFromStore)) || \"\";\n\tthis.bearerAuthToken = options.bearerAuthToken || (options.bearerAuthTokenFromStore && $tw.utils.getPassword(options.bearerAuthTokenFromStore)) || \"\";\n\tif(this.basicAuthUsername && this.basicAuthPassword) {\n\t\tthis.requestHeaders.Authorization = \"Basic \" + $tw.utils.base64Encode(this.basicAuthUsername + \":\" + this.basicAuthPassword);\n\t} else if(this.bearerAuthToken) {\n\t\tthis.requestHeaders.Authorization = \"Bearer \" + this.bearerAuthToken;\n\t}\n}\n\nHttpClientRequest.prototype.send = function(callback) {\n\tvar self = this,\n\t\tsetBinding = function(title,text) {\n\t\t\tif(title) {\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler({title: title, text: text}));\n\t\t\t}\n\t\t};\n\tif(this.url) {\n\t\tsetBinding(this.bindStatus,\"pending\");\n\t\tsetBinding(this.bindProgress,\"0\");\n\t\t// Set the request tracker tiddler\n\t\tvar requestTrackerTitle = this.wiki.generateNewTitle(\"$:/temp/HttpRequest\");\n\t\tthis.wiki.addTiddler({\n\t\t\ttitle: requestTrackerTitle,\n\t\t\ttags: \"$:/tags/HttpRequest\",\n\t\t\ttext: JSON.stringify({\n\t\t\t\turl: this.url,\n\t\t\t\ttype: this.method,\n\t\t\t\tstatus: \"inprogress\",\n\t\t\t\theaders: this.requestHeaders,\n\t\t\t\tdata: this.body\n\t\t\t})\n\t\t});\n\t\tthis.xhr = $tw.utils.httpRequest({\n\t\t\turl: this.url,\n\t\t\ttype: this.method,\n\t\t\tuseDefaultHeaders: this.useDefaultHeaders,\n\t\t\theaders: this.requestHeaders,\n\t\t\tdata: this.body,\n\t\t\treturnProp: this.binary === \"\" ? \"responseText\" : \"response\",\n\t\t\tresponseType: this.binary === \"\" ? \"text\" : \"arraybuffer\",\n\t\t\tcallback: function(err,data,xhr) {\n\t\t\t\tvar hasSucceeded = xhr.status >= 200 && xhr.status < 300,\n\t\t\t\t\tcompletionCode = hasSucceeded ? \"complete\" : \"error\",\n\t\t\t\t\theaders = {};\n\t\t\t\t$tw.utils.each(xhr.getAllResponseHeaders().split(\"\\r\\n\"),function(line) {\n\t\t\t\t\tvar pos = line.indexOf(\":\");\n\t\t\t\t\tif(pos !== -1) {\n\t\t\t\t\t\theaders[line.substr(0,pos)] = line.substr(pos + 1).trim();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsetBinding(self.bindStatus,completionCode);\n\t\t\t\tsetBinding(self.bindProgress,\"100\");\n\t\t\t\tvar resultVariables = {\n\t\t\t\t\tstatus: xhr.status.toString(),\n\t\t\t\t\tstatusText: xhr.statusText,\n\t\t\t\t\terror: (err || \"\").toString(),\n\t\t\t\t\tdata: (data || \"\").toString(),\n\t\t\t\t\theaders: JSON.stringify(headers)\n\t\t\t\t};\n\t\t\t\t/* Convert data from binary to base64 */\n\t\t\t\tif (xhr.responseType === \"arraybuffer\") {\n\t\t\t\t\tvar binary = \"\",\n\t\t\t\t\t\tbytes = new Uint8Array(data),\n\t\t\t\t\t\tlen = bytes.byteLength;\n\t\t\t\t\tfor (var i=0; i<len; i++) {\n\t\t\t\t\t\tbinary += String.fromCharCode(bytes[i]);\n\t\t\t\t\t}\n\t\t\t\t\tresultVariables.data = $tw.utils.base64Encode(binary,true);\n\t\t\t\t}\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getTiddler(requestTrackerTitle),{\n\t\t\t\t\tstatus: completionCode,\n\t\t\t\t}));\n\t\t\t\tself.wiki.invokeActionString(self.completionActions,undefined,$tw.utils.extend({},self.variables,resultVariables),{parentWidget: $tw.rootWidget});\n\t\t\t\tcallback(hasSucceeded ? null : xhr.statusText);\n\t\t\t\t// console.log(\"Back!\",err,data,xhr);\n\t\t\t},\n\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\tif(lengthComputable) {\n\t\t\t\t\tsetBinding(self.bindProgress,\"\" + Math.floor((loaded/total) * 100))\n\t\t\t\t}\n\t\t\t\tself.wiki.invokeActionString(self.progressActions,undefined,{\n\t\t\t\t\tlengthComputable: lengthComputable ? \"yes\" : \"no\",\n\t\t\t\t\tloaded: loaded,\n\t\t\t\t\ttotal: total\n\t\t\t\t},{parentWidget: $tw.rootWidget});\n\t\t\t}\n\t\t});\n\t}\n};\n\nHttpClientRequest.prototype.cancel = function() {\n\tif(this.xhr) {\n\t\tthis.xhr.abort();\n\t}\n};\n\nexports.HttpClient = HttpClient;\n\n/*\nMake an HTTP request. 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\tprogress: optional function invoked with (lengthComputable,loaded,total)\n\treturnProp: string name of the property to return as first argument of callback\n\tresponseType: \"text\" or \"arraybuffer\"\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\tuseDefaultHeaders = options.useDefaultHeaders !== false ? true : false,\n\t\theaders = options.headers || (useDefaultHeaders ? {accept: \"application/json\"} : {}),\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\tgetHeader = function(targetHeader) {\n\t\t\treturn headers[targetHeader] || headers[targetHeader.toLowerCase()];\n\t\t},\n\t\tisSimpleRequest = function(type,headers) {\n\t\t\tif([\"GET\",\"HEAD\",\"POST\"].indexOf(type) === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor(var header in headers) {\n\t\t\t\tif([\"accept\",\"accept-language\",\"content-language\",\"content-type\"].indexOf(header.toLowerCase()) === -1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(hasHeader(\"Content-Type\") && [\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"text/plain\"].indexOf(getHeader[\"Content-Type\"]) === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\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\trequest.responseType = options.responseType || \"text\";\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 < 300) {\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,this[returnProp],this);\n\t\t}\n\t};\n\t// Handle progress\n\tif(options.progress) {\n\t\trequest.onprogress = function(event) {\n\t\t\tconsole.log(\"Progress event\",event)\n\t\t\toptions.progress(event.lengthComputable,event.loaded,event.total);\n\t\t};\n\t}\n\t// Make the request\n\trequest.open(type,url,true);\n\t// Headers\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 && !hasHeader(\"Content-Type\") && useDefaultHeaders) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\") && !isSimpleRequest(type,headers) && useDefaultHeaders) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\t// Send data\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\nexports.setQueryStringParameter = function(url,paramName,paramValue) {\n\tvar URL = $tw.browser ? window.URL : require(\"url\").URL,\n\t\tnewUrl;\n\ttry {\n\t\tnewUrl = new URL(url);\n\t} catch(e) {\n\t}\n\tif(newUrl && paramName) {\n\t\tnewUrl.searchParams.set(paramName,paramValue || \"\");\n\t\treturn newUrl.toString();\n\t} else {\n\t\treturn url;\n\t}\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\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.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\tevent: widget event\n\tvariables: from event.paramObject\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 && 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({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\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\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\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: navigatorWidgetNode,\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: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\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: navigatorWidgetNode,\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// Whether to close the modal dialog when the mask (area outside the modal) is clicked\n\tif(tiddler.fields && (tiddler.fields[\"mask-closable\"] === \"yes\" || tiddler.fields[\"mask-closable\"] === \"true\")) {\n\t\tmodalBackdrop.addEventListener(\"click\",closeHandler,false);\n\t}\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\t$tw.utils.toggleClass(this.srcDocument.body,\"tc-modal-prevent-scroll\",this.modalCount > 0);\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 and roles\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\tnotification.setAttribute(\"role\",\"alert\");\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/*\nGlobal regular expression for parsing the location of a popup.\nThis is also used by the Reveal widget.\n*/\nexports.popupLocationRegExp = /^(@?)\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/\n\n/*\nObjekt containing the available prefixes for coordinates build with the `buildCoordinates` function:\n - csOffsetParent: Uses a coordinate system based on the offset parent (no prefix).\n - csAbsolute: Use an absolute coordinate system (prefix \"@\").\n*/\nexports.coordinatePrefix = { csOffsetParent: \"\", csAbsolute: \"@\" }\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\tif(options.absolute && options.domNode) {\n\t\t// Walk the offsetParent chain and add the position of the offsetParents to make\n\t\t// the position absolute to the root node of the page.\n\t\tvar currentNode = options.domNode.offsetParent;\n\t\twhile(currentNode) {\n\t\t\trect.left += currentNode.offsetLeft;\n\t\t\trect.top += currentNode.offsetTop;\n\t\t\tcurrentNode = currentNode.offsetParent;\n\t\t}\n\t}\n\tvar popupRect = exports.buildCoordinates(options.absolute?exports.coordinatePrefix.csAbsolute:exports.coordinatePrefix.csOffsetParent,rect);\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);\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.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.readPopupState = function(text) {\n\treturn exports.popupLocationRegExp.test(text);\n};\n\n/*\nParses a coordinate string in the format `(x,y,w,h)` or `@(x,y,z,h)` and returns\nan object containing the position, width and height. The absolute-Mark is boolean\nvalue that indicates the coordinate system of the coordinates. If they start with\nan `@`, `absolute` is set to true and the coordinates are relative to the root\nelement. If the initial `@` is missing, they are relative to the offset parent\nelement and `absoute` is false.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.parseCoordinates = function(coordinates) {\n\tvar match = exports.popupLocationRegExp.exec(coordinates);\n\tif(match) {\n\t\treturn {\n\t\t\tabsolute: (match[1] === \"@\"),\n\t\t\tleft: parseFloat(match[2]),\n\t\t\ttop: parseFloat(match[3]),\n\t\t\twidth: parseFloat(match[4]),\n\t\t\theight: parseFloat(match[5])\n\t\t};\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/*\nBuilds a coordinate string from a coordinate system identifier and an object\ncontaining the left, top, width and height values.\nUse constants defined in coordinatePrefix to specify a coordinate system.\nIf one of the parameters is invalid for building a coordinate string `(0,0,0,0)`\nwill be returned.\nThis function is safe to call, even if the popup class was not initialized.\n*/\nexports.buildCoordinates = function(prefix,position) {\n\tvar coord = prefix + \"(\" + position.left + \",\" + position.top + \",\" + position.width + \",\" + position.height + \")\";\n\tif (exports.popupLocationRegExp.test(coord)) {\n\t\treturn coord;\n\t} else {\n\t\treturn \"(0,0,0,0)\";\n\t}\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\tvar options = {};\n\t\tif($tw.utils.hop(event.paramObject,\"animationDuration\")) {\n\t\t\toptions.animationDuration = event.paramObject.animationDuration;\n\t\t}\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target,null,options);\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback,options) {\n\tvar self = this,\n\t\tduration = $tw.utils.hop(options,\"animationDuration\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\n\t\tsrcWindow = 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;\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\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\n\tbaseElement = baseElement || document;\n\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback,options);\n\t}\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\t// Check if the entry is a hidden directory\n\t\t\t\tif((entry.charAt(0) !== \".\") && !editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar file=path.resolve(editionPath,entry,\"tiddlywiki.info\");\n\t\t\t\t\tif(fs.existsSync(file)) {\n\t\t\t\t\t\tvar info = $tw.utils.parseJSONSafe(fs.readFileSync(file,\"utf8\"),null);\n\t\t\t\t\t\tif(info) {\n\t\t\t\t\t\t\teditionInfo[entry] = info;\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 editionInfo;\n};\n\n})();","type":"application/javascript","module-type":"utils-node"},"$:/core/modules/utils/errors.js":{"title":"$:/core/modules/utils/errors.js","text":"/*\\\ntitle: $:/core/modules/utils/errors.js\ntype: application/javascript\nmodule-type: utils\n\nCustom errors for TiddlyWiki.\n\n\\*/\n(function(){\n\nfunction TranscludeRecursionError() {\n\tError.apply(this,arguments);\n\tthis.signatures = Object.create(null);\n};\n\n/* Maximum permitted depth of the widget tree for recursion detection */\nTranscludeRecursionError.MAX_WIDGET_TREE_DEPTH = 1000;\n\nTranscludeRecursionError.prototype = Object.create(Error);\n\nexports.TranscludeRecursionError = TranscludeRecursionError;\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/utils/escapecss.js":{"title":"$:/core/modules/utils/escapecss.js","text":"/*\\\ntitle: $:/core/modules/utils/escapecss.js\ntype: application/javascript\nmodule-type: utils\n\nProvides CSS.escape() functionality.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, window: false */\n\"use strict\";\n\nexports.escapeCSS = (function() {\n\t// use browser's native CSS.escape() function if available\n\tif ($tw.browser && window.CSS && window.CSS.escape) {\n\t\treturn window.CSS.escape;\n\t}\n\n\t// otherwise, a utility method is provided\n\t// see also https://drafts.csswg.org/cssom/#serialize-an-identifier\n\n\t/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n\treturn 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\n})();\n","type":"application/javascript","module-type":"utils"},"$:/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_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.setPrototypeOf(TW_TextNode.prototype,TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\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_Style = function(el) {\n\t// Define the internal style object\n\tvar styleObject = {\n\t\t// Method to get the entire style object\n\t\tget: function() {\n\t\t\treturn el._style;\n\t\t},\n\t\t// Method to set styles using a string (e.g. \"color:red; background-color:blue;\")\n\t\tset: function(str) {\n\t\t\tvar self = this;\n\t\t\tstr = str || \"\";\n\t\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\t\tif(name && value) {\n\t\t\t\t\tel._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t// Method to set a specific property without transforming the property name, such as a custom property\n\t\tsetProperty: function(name, value) {\n\t\t\tel._style[name] = value;\n\t\t}\n\t};\n\n\t// Return a Proxy to handle direct access to individual style properties\n\treturn new Proxy(styleObject, {\n\t\tget: function(target, property) {\n\t\t\t// If the property exists on styleObject, return it (get, set, setProperty methods)\n\t\t\tif (property in target) {\n\t\t\t\treturn target[property];\n\t\t\t}\n\t\t\t// Otherwise, return the corresponding property from _style\n\t\t\treturn el._style[$tw.utils.convertStyleNameToPropertyName(property)] || \"\";\n\t\t},\n\t\tset: function(target, property, value) {\n\t\t\t// Set the property in _style\n\t\t\tel._style[$tw.utils.convertStyleNameToPropertyName(property)] = value;\n\t\t\treturn true;\n\t\t}\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 = {}; // Internal style object\n\tthis.style = new TW_Style(this); // Proxy for style management\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\n\nObject.setPrototypeOf(TW_Element.prototype,TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\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\tif(name === \"style\") {\n\t\tthis.style.set(value);\n\t} else {\n\t\tthis.attributes[name] = value + \"\";\n\t}\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.htmlTextEncode(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/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\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 = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\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 on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\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\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo && !!options.fileInfo.isEditableFile) {\n\t\tfileInfo.isEditableFile = true;\n\t\tfileInfo.originalpath = options.fileInfo.originalpath;\n\t}\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\thasUnsafeFields = hasUnsafeFields || /:|#/mg.test(fieldName);\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\" || tiddlerType === \"text/vnd.tiddlywiki-multiple\" || tiddler.hasField(\"_canonical_uri\")) {\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\tif(options.extFilters) {\n\t\t\t// Check for extension overrides\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt) {\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\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: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar extension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\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\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\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\tfileInfo: an existing fileInfo object to check against\n\tfileInfo.overwrite: if true, turns off filename clash numbers (defaults to false)\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar directory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = (options.fileInfo && options.fileInfo.originalpath) ? options.fileInfo.originalpath : \"\",\n\t\toverwrite = options.fileInfo && options.fileInfo.overwrite || false,\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\tif(!filepath && !!originalpath) {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\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// Replace any Windows control codes\n\tfilepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,\"_$1_\");\n\t// Replace any leading spaces with the same number of underscores\n\tfilepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, \"_\")});\n\t//If the path does not start with \".\" or \"..\" && a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,function (u) { return u.replace(/\\./g, \"_\")});\n\t}\n\t// Replace any Unicode control codes\n\tfilepath = filepath.replace(/[\\x00-\\x1f\\x80-\\x9f]/g,\"_\");\n\t// Replace any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Replace any dots or spaces at the end of the extension with the same number of underscores\n\textension = extension.replace(/[\\. ]+$/, function (u) { return u.replace(/[\\. ]/g, \"_\")});\n\t// Truncate the extension if it is too long\n\tif(extension.length > 32) {\n\t\textension = extension.substr(0,32);\n\t}\n\t// If the filepath already ends in the extension then remove it\n\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t}\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)\n\tif(!filepath || /^_+$/g.test(filepath)) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\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 (default)\n\tvar fullPath = path.resolve(directory, filepath + extension);\n\tif (!overwrite) {\n\t\tvar oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\t\tdo {\n\t\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\t\tif(oldPath && oldPath == fullPath) break;\n\t\t\tcount++;\n\t\t} while(fs.existsSync(fullPath));\n\t}\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, the wikiTiddlersPath directory, \n\t//\tor the 'originalpath' directory, then $tw.utils.encodeURIComponentExtended() and resolve to options.directory.\n\tvar writePath = $tw.hooks.invokeHook(\"th-make-tiddler-path\",fullPath,fullPath),\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode) {\n\t\tencode = !(writePath.indexOf($tw.boot.wikiTiddlersPath) == 0 ||\n\t\t\twritePath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\twritePath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\twritePath.indexOf(path.resolve($tw.boot.wikiTiddlersPath,originalpath)) == 0 );\n\t\t}\n\tif(encode) {\n\t\twritePath = path.resolve(directory,$tw.utils.encodeURIComponentExtended(fullPath));\n\t}\n\t// Return the full path to the file\n\treturn writePath;\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\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\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\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\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\treturn fileInfo;\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo,callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\t//For some reason, the tiddler is only in memory or we can't modify the file at this path\n\t\t$tw.syncer.displayError(\"Server deleteTiddlerFile task failed for filepath: \"+fileInfo.filepath);\n\t\treturn callback(null,fileInfo);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\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\treturn callback(null,fileInfo);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options,callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\t$tw.utils.deleteTiddlerFile(adaptorInfo,function(err) {\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \\\"\"+title+\"\\\"\",err);\n\t\t\t\t\treturn callback(null,bootInfo);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null,bootInfo);\n\t\t});\n\t} else {\n\t\treturn callback(null,bootInfo);\n\t}\n};\n\n})();\n","type":"application/javascript","module-type":"utils-node"},"$:/core/modules/utils/linkedlist.js":{"title":"$:/core/modules/utils/linkedlist.js","text":"/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = new LLMap();\n\tthis.prev = new LLMap();\n\t// Linked list head initially points to itself\n\tthis.next.set(null, null);\n\tthis.prev.set(null, null);\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t}\n};\n\n/*\nPush behaves like array.push and accepts multiple string arguments. But it also\naccepts a single array argument too, to be consistent with its other methods.\n*/\nLinkedList.prototype.push = function(/* values */) {\n\tvar i, values = arguments;\n\tif($tw.utils.isArray(values[0])) {\n\t\tvalues = values[0];\n\t}\n\tfor(i = 0; i < values.length; i++) {\n\t\t_assertString(values[i]);\n\t}\n\tfor(i = 0; i < values.length; i++) {\n\t\t_linkToEnd(this,values[i]);\n\t}\n\treturn this.length;\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tvar t;\n\tif($tw.utils.isArray(value)) {\n\t\tfor (t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\t_linkToEnd(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t\t_linkToEnd(this,value);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tvar visits = Object.create(null),\n\t\tvalue = this.next.get(null);\n\twhile(value !== null) {\n\t\tcallback(value);\n\t\tvar next = this.next.get(value);\n\t\tif(Array.isArray(next)) {\n\t\t\tvar i = visits[value] || 0;\n\t\t\tvisits[value] = i+1;\n\t\t\tvalue = next[i];\n\t\t} else {\n\t\t\tvalue = next;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = new Array(this.length),\n\t\tindex = 0;\n\tthis.each(function(value) { output[index++] = value; });\n\treturn output;\n};\n\nLinkedList.prototype.makeTiddlerIterator = function(wiki) {\n\tvar self = this;\n\treturn function(callback) {\n\t\tself.each(function(title) {\n\t\t\tcallback(wiki.getTiddler(title),title);\n\t\t});\n\t};\n};\n\nfunction _removeOne(list,value) {\n\tvar nextEntry = list.next.get(value);\n\tif(nextEntry === undefined) {\n\t\treturn;\n\t}\n\tvar prevEntry = list.prev.get(value),\n\t\tprev = prevEntry,\n\t\tnext = nextEntry,\n\t\tref;\n\tif(Array.isArray(nextEntry)) {\n\t\tnext = nextEntry[0];\n\t\tprev = prevEntry[0];\n\t}\n\t// Relink preceding element.\n\tref = list.next.get(prev);\n\tif(Array.isArray(ref)) {\n\t\tvar i = ref.indexOf(value);\n\t\tref[i] = next;\n\t} else {\n\t\tlist.next.set(prev,next);\n\t}\n\n\t// Now relink following element\n\tref = list.prev.get(next);\n\tif(Array.isArray(ref)) {\n\t\tvar i = ref.indexOf(value);\n\t\tref[i] = prev;\n\t} else {\n\t\tlist.prev.set(next,prev);\n\t}\n\n\t// Delink actual value. If it uses arrays, just remove first entries.\n\tif(Array.isArray(nextEntry) && nextEntry.length > 1) {\n\t\tnextEntry.shift();\n\t\tprevEntry.shift();\n\t} else {\n\t\tlist.next.set(value,undefined);\n\t\tlist.prev.set(value,undefined);\n\t}\n\tlist.length -= 1;\n};\n\n// Sticks the given node onto the end of the list.\nfunction _linkToEnd(list,value) {\n\tvar old = list.next.get(value);\n\tvar last = list.prev.get(null);\n\t// Does it already exists?\n\tif(old !== undefined) {\n\t\tif(!Array.isArray(old)) {\n\t\t\told = [old];\n\t\t\tlist.next.set(value,old);\n\t\t\tlist.prev.set(value,[list.prev.get(value)]);\n\t\t}\n\t\told.push(null);\n\t\tlist.prev.get(value).push(last);\n\t} else {\n\t\tlist.next.set(value,null);\n\t\tlist.prev.set(value,last);\n\t}\n\t// Make the old last point to this new one.\n\tif(value !== last) {\n\t\tvar array = list.next.get(last);\n\t\tif(Array.isArray(array)) {\n\t\t\tarray[array.length-1] = value;\n\t\t} else {\n\t\t\tlist.next.set(last,value);\n\t\t}\n\t\tlist.prev.set(null,value);\n\t} else {\n\t\t// Edge case, the pushed value was already the last value.\n\t\t// The second-to-last nextPtr for that value must point to itself now.\n\t\tvar array = list.next.get(last);\n\t\tarray[array.length-2] = value;\n\t}\n\tlist.length += 1;\n};\n\nfunction _assertString(value) {\n\tif(typeof value !== \"string\") {\n\t\tthrow \"Linked List only accepts string values, not \" + value;\n\t}\n};\n\nvar LLMap = function() {\n\tthis.map = Object.create(null);\n};\n\n// Just a wrapper so our object map can also accept null.\nLLMap.prototype = {\n\tset: function(key,val) {\n\t\t(key === null) ? (this.null = val) : (this.map[key] = val);\n\t},\n\tget: function(key) {\n\t\treturn (key === null) ? this.null : this.map[key];\n\t}\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n","module-type":"utils","type":"application/javascript"},"$:/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);\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\tvar logMessage = [$tw.utils.terminalColour(this.colour) + this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0));\n\t\t\tlogMessage[logMessage.length-1] += $tw.utils.terminalColour();\n\t\t\treturn Function.apply.call(console.log, console, logMessage);\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}\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\n/*\nAdd attribute to parse tree node\nCan be invoked as (node,name,value) or (node,attr)\n*/\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tvar attribute = typeof name === \"object\" ? name : {name: name, type: \"string\", value: value};\n\tname = attribute.name;\n\tnode.attributes = node.attributes || {};\n\tnode.orderedAttributes = node.orderedAttributes || [];\n\tnode.attributes[name] = attribute;\n\tvar foundIndex = -1;\n\t$tw.utils.each(node.orderedAttributes,function(attr,index) {\n\t\tif(attr.name === name) {\n\t\t\tfoundIndex = index;\n\t\t}\n\t});\n\tif(foundIndex === -1) {\n\t\tnode.orderedAttributes.push(attribute);\n\t} else {\n\t\tnode.orderedAttributes[foundIndex] = attribute;\n\t}\n};\n\nexports.getOrderedAttributesFromParseTreeNode = function(node) {\n\tif(node.orderedAttributes) {\n\t\treturn node.orderedAttributes;\n\t} else {\n\t\tvar attributes = [];\n\t\t$tw.utils.each(node.attributes,function(attribute) {\n\t\t\tattributes.push(attribute);\n\t\t});\n\t\treturn attributes.sort(function(a,b) {\n\t\t\treturn a.name < b.name ? -1 : (a.name > b.name ? 1 : 0);\n\t\t});\n\t}\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\t\tattribute;\n\tnode.attributes = node.attributes || {};\n\tattribute = node.attributes[\"class\"];\n\tif(!attribute) {\n\t\t// If the class attribute does not exist, we must create it first.\n\t\tattribute = {name: \"class\", type: \"string\", value: \"\"};\n\t\tnode.attributes[\"class\"] = attribute;\n\t\tnode.orderedAttributes = node.orderedAttributes || [];\n\t\tnode.orderedAttributes.push(attribute);\n\t}\n\tif(attribute.type === \"string\") {\n\t\tif(attribute.value !== \"\") {\n\t\t\tclasses = attribute.value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tattribute.value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\tvar attribute;\n\tnode.attributes = node.attributes || {};\n\tattribute = node.attributes.style;\n\tif(!attribute) {\n\t\tattribute = {name: \"style\", type: \"string\", value: \"\"};\n\t\tnode.attributes.style = attribute;\n\t\tnode.orderedAttributes = node.orderedAttributes || [];\n\t\tnode.orderedAttributes.push(attribute);\n\t}\n\tif(attribute.type === \"string\") {\n\t\tattribute.value += name + \":\" + value + \";\";\n\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\");\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 = $tw.utils.parseJSONSafe(pluginTiddler.fields.text,null);\n\tif(!jsonPluginTiddler) {\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/repository.js":{"title":"$:/core/modules/utils/repository.js","text":"/*\\\ntitle: $:/core/modules/utils/repository.js\ntype: application/javascript\nmodule-type: utils\n\nUtilities for working with the TiddlyWiki repository file structure\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nGet an object containing all the plugins as a hashmap by title of the JSON representation of the plugin\nOptions:\n\nignoreEnvironmentVariables: defaults to false\n*/\nexports.getAllPlugins = function(options) {\n\toptions = options || {};\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(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\tvar pluginFields = $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 = $tw.utils.getSubdirectories(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,options.ignoreEnvironmentVariables ? undefined : $tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.languagesEnvVar),collectPlugins);\n\treturn tiddlers;\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\"ð\":\"d\",\n\t\"Ð\":\"D\",\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\"ß\":\"ss\",\n\t\"ẞ\":\"SS\",\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\"þ\": \"th\",\n\t\"Þ\": \"TH\",\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\t\"…\":\"...\"\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(/[^\\x20-\\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/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\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/*\nCheck if a string starts with another string\n*/\nexports.startsWith = function(str,search) {\n\treturn str.substring(0, search.length) === search;\n};\n\n/*\nCheck if a string ends with another string\n*/\nexports.endsWith = function(str,search) {\n\treturn str.substring(str.length - search.length) === search;\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\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\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\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\treturn array;\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.formatTitleString = function(template,options) {\n\tvar base = options.base || \"\",\n\t\tseparator = options.separator || \"\",\n\t\tcounter = options.counter || \"\";\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^\\$basename\\$/i, function() {\n\t\t\t\treturn base;\n\t\t\t}],\n\t\t\t[/^\\$count:(\\d+)\\$/i, function(match) {\n\t\t\t\treturn $tw.utils.pad(counter,match[1]);\n\t\t\t}],\n\t\t\t[/^\\$separator\\$/i, function() {\n\t\t\t\treturn separator;\n\t\t\t}],\n\t\t\t[/^\\$count\\$/i, function() {\n\t\t\t\treturn counter + \"\";\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\",\n\t\t\tfound = false;\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\tfound = true;\n\t\t\t\tmatchString = m[1].call(null,match);\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(found) {\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.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^TIMESTAMP/, function() {\n\t\t\t\treturn date.getTime();\n\t\t\t}],\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.pad($tw.utils.getYearForWeekNo(date),4);\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 $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\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[/^0ddddd/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24),3);\n\t\t\t}],\n\t\t\t[/^ddddd/, function() {\n\t\t\t\treturn Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);\n\t\t\t}],\n\t\t\t[/^dddd/, function() {\n\t\t\t\treturn [7,1,2,3,4,5,6][date.getDay()];\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(date || 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(null,match);\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 like htmlEncode, but forgets the double quote for brevity\nexports.htmlTextEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().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, rawUnicode) {\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\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\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(regex, 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, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\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(regex,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/*\nExtended version of encodeURIComponent that encodes additional characters including\nthose that are illegal within filepaths on various platforms including Windows\n*/\nexports.encodeURIComponentExtended = function(s) {\n\treturn encodeURIComponent(s).replace(/[!'()*]/g,function(c) {\n\t\treturn \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n\t});\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|obsidian|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,0);\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\t// Since v5.2.x, there are no restrictions on characters in field names\n\treturn 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/*\nCryptographic hash function as used by sha256 filter operator\noptions.length .. number of characters returned defaults to 64\n*/\nexports.sha256 = function(str, options) {\n\toptions = options || {}\n\treturn $tw.sjcl.codec.hex.fromBits($tw.sjcl.hash.sha256.hash(str)).substr(0,options.length || 64);\n}\n\n/*\nBase64 utility functions that work in either browser or Node.js\n*/\nif(typeof window !== 'undefined') {\n\texports.btoa = function(binstr) { return window.btoa(binstr); }\n\texports.atob = function(b64) { return window.atob(b64); }\n} else {\n\texports.btoa = function(binstr) {\n\t\treturn Buffer.from(binstr, 'binary').toString('base64');\n\t}\n\texports.atob = function(b64) {\n\t\treturn Buffer.from(b64, 'base64').toString('binary');\n\t}\n}\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64,binary,urlsafe) {\n\tvar encoded = urlsafe ? string64.replace(/_/g,'/').replace(/-/g,'+') : string64;\n\tif(binary) return exports.atob(encoded)\n\telse return base64utf8.base64.decode.call(base64utf8,encoded);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64,binary,urlsafe) {\n\tvar encoded;\n\tif(binary) encoded = exports.btoa(string64);\n\telse encoded = base64utf8.base64.encode.call(base64utf8,string64);\n\tif(urlsafe) {\n\t\tencoded = encoded.replace(/\\+/g,'-').replace(/\\//g,'_');\n\t}\n\treturn encoded;\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));\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\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\t// set isCaseSensitive to true if not defined in options\n\tvar isCaseSensitive = (options.isCaseSensitive === false) ? false : true,\n\t\tgt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn compare(\"\" + a,\"\" + b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t},\n\t\t\t\"alphanumeric\": function(a,b) {\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn options.invert ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n","type":"application/javascript","module-type":"utils"},"$:/core/modules/widgets/action-confirm.js":{"title":"$:/core/modules/widgets/action-confirm.js","text":"/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: 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 ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\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*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true,\n\t \twin = event && event.event && event.event.view ? event.event.view : window;\n\tif(this.prompt) {\n\t\tinvokeActions = win.confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/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.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Render children\n\tthis.renderChildren(parent,nextSibling);\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\t// Construct the child widgets\n\tthis.makeChildWidgets();\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 then use initial title\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tthis.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tvar draftTitle = this.wiki.generateDraftTitle(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,draftTitle,this.getVariable(\"currentTiddler\"));\n\t}\n\tthis.setVariable(\"createTiddler-title\",title);\n\tthis.setVariable(\"createTiddler-draftTitle\",draftTitle);\n\tthis.refreshChildren();\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\",null);\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\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 !== null) && 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\tif(name in tiddler.fields) {\n\t\t\t\t\thasChanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tvar creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : {};\n\t\t\tvar modificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : {};\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,removeFields,modificationFields));\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($tw.utils.count(changedAttributes) > 0) {\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\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\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 inputList = this.wiki.getTiddlerList(this.target,field,index),\n\t\t\tsubfilter = \"[all[]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(subfilter,this,this.wiki.makeTiddlerIterator(inputList))));\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 = $tw.utils.stringifyList(oldtags) + \" \" + 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));\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-log.js":{"title":"$:/core/modules/widgets/action-log.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\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 LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\n\t});\n\n\tfor(var v in this.variables) {\n\t\tvar variable = this.parentWidget && this.parentWidget.variables[v];\n\t\tif(variable && variable.isFunctionDefinition) {\n\t\t\tallVars[v] = variable.value;\n\t\t} else {\n\t\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t\t}\n\t}\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\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\tnavigateFromClientTop: bounds && bounds.top,\n\t\tnavigateFromClientLeft: bounds && bounds.left,\n\t\tnavigateFromClientWidth: bounds && bounds.width,\n\t\tnavigateFromClientRight: bounds && bounds.right,\n\t\tnavigateFromClientBottom: bounds && bounds.bottom,\n\t\tnavigateFromClientHeight: bounds && bounds.height,\n\t\tnavigateSuppressNavigation: suppressNavigation,\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\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 Popup = require(\"$:/core/modules/utils/dom/popup.js\");\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\tthis.floating = this.getAttribute(\"$floating\",\"no\") === \"yes\";\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 coordinates = Popup.parseCoordinates(this.actionCoords || \"\");\n\tif(coordinates) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: coordinates.left,\n\t\t\t\ttop: coordinates.top,\n\t\t\t\twidth: coordinates.width,\n\t\t\t\theight: coordinates.height\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki,\n\t\t\tfloating: this.floating,\n\t\t\tabsolute: coordinates.absolute\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\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\tthis.actionNames = this.getAttribute(\"$names\");\n\tthis.actionValues = this.getAttribute(\"$values\");\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 parameters as a hashmap\n\tvar paramObject = Object.create(null);\n\t// Add names/values pairs if present\n\tif(this.actionNames && this.actionValues) {\n\t\tvar names = this.wiki.filterTiddlers(this.actionNames,this),\n\t\t\tvalues = this.wiki.filterTiddlers(this.actionValues,this);\n\t\t$tw.utils.each(names,function(name,index) {\n\t\t\tparamObject[name] = values[index] || \"\";\n\t\t});\n\t}\n\t// Add raw parameters\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}\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\tvar params = {\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\tevent: event,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\")\n\t};\n\tthis.dispatchEvent(params);\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.hasParseTreeNodeAttribute(\"$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\t// Nothing to refresh\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\tif(this.actionTiddler) {\n\t\toptions.suppressTimestamp = !this.actionTimestamp;\n\t\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t\t}\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\") {\n\t\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t\t}\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/action-setmultiplefields.js":{"title":"$:/core/modules/widgets/action-setmultiplefields.js","text":"/*\\\ntitle: $:/core/modules/widgets/action-setmultiplefields.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set multiple fields or indexes 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 SetMultipleFieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetMultipleFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetMultipleFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetMultipleFieldsWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionFields = this.getAttribute(\"$fields\");\n\tthis.actionIndexes = this.getAttribute(\"$indexes\");\n\tthis.actionValues = this.getAttribute(\"$values\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetMultipleFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$fields\"] || changedAttributes[\"$indexes\"] || changedAttributes[\"$values\"] || changedAttributes[\"$timestamp\"]) {\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*/\nSetMultipleFieldsWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddler = this.wiki.getTiddler(this.actionTiddler),\n\t\tnames, values = this.wiki.filterTiddlers(this.actionValues,this);\n\tif(this.actionFields) {\n\t\tvar additions = {};\n\t\tnames = this.wiki.filterTiddlers(this.actionFields,this);\n\t\t$tw.utils.each(names,function(fieldname,index) {\n\t\t\tadditions[fieldname] = values[index] || \"\";\n\t\t});\n\t\tvar creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : undefined,\n\t\t\tmodificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : undefined;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,{title: this.actionTiddler},modificationFields,additions));\n\t} else if(this.actionIndexes) {\n\t\tvar data = this.wiki.getTiddlerData(this.actionTiddler,Object.create(null));\n\t\tnames = this.wiki.filterTiddlers(this.actionIndexes,this);\n\t\t$tw.utils.each(names,function(name,index) {\n\t\t\tdata[name] = values[index] || \"\";\n\t\t});\n\t\tthis.wiki.setTiddlerData(this.actionTiddler,data,{},{suppressTimestamp: !this.actionTimestamp});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setmultiplefields\"] = SetMultipleFieldsWidget;\n\n})();\n\t","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\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\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// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\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.accept = this.getAttribute(\"accept\");\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\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\t\n\t}\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 Popup = require(\"$:/core/modules/utils/dom/popup.js\");\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\ttag = \"button\",\n\t\tdomNode;\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\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\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\tdomNode.setAttribute(\"aria-checked\", \"true\");\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 data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\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\tif (this.role) {\n\t\tdomNode.setAttribute(\"role\", this.role);\n\t}\n\tif(this.popup || this.popupTitle) {\n\t\tdomNode.setAttribute(\"aria-expanded\",isPoppedUp ? \"true\" : \"false\");\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\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 ? 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\tabsolute: (this.popupAbsCoords === \"yes\"),\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\tabsolute: (this.popupAbsCoords === \"yes\"),\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[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.role = this.getAttribute(\"role\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\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.popupAbsCoords = this.getAttribute(\"popupAbsCoords\", \"no\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\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.tooltip || changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.popupAbsCoords || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled || changedAttributes[\"default\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.updateDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\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\tvar isChecked;\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\",\"tc-checkbox \" + this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tisChecked = this.getValue();\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t\t$tw.utils.addClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t}\n\tif(isChecked === undefined && this.checkboxIndeterminate === \"yes\") {\n\t\tthis.inputDomNode.indeterminate = true;\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Assign data- attributes\n\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\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 || this.checkboxFilter) {\n\t\tif(tiddler && this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag === \"yes\") {\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(tiddler && (this.checkboxField || this.checkboxIndex)) {\n\t\t\t// Same logic applies to fields and indexes\n\t\t\tvar value;\n\t\t\tif(this.checkboxField) {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,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\t// Neither value found: were both specified?\n\t\t\tif(this.checkboxChecked && !this.checkboxUnchecked) {\n\t\t\t\treturn false; // Absence of checked value\n\t\t\t}\n\t\t\tif(this.checkboxUnchecked && !this.checkboxChecked) {\n\t\t\t\treturn true; // Absence of unchecked value\n\t\t\t}\n\t\t\tif(this.checkboxChecked && this.checkboxUnchecked) {\n\t\t\t\t// Both specified but neither found: indeterminate or false, depending\n\t\t\t\tif(this.checkboxIndeterminate === \"yes\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxListField || this.checkboxListIndex || this.checkboxFilter) {\n\t\t\t// Same logic applies to lists and filters\n\t\t\tvar list;\n\t\t\tif(this.checkboxListField) {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxListField)) {\n\t\t\t\t\tlist = tiddler.getFieldList(this.checkboxListField) || [];\n\t\t\t\t} else {\n\t\t\t\t\tlist = $tw.utils.parseStringArray(this.checkboxDefault || \"\") || [];\n\t\t\t\t}\n\t\t\t} else if(this.checkboxListIndex) {\n\t\t\t\tlist = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(tiddler,this.checkboxListIndex,this.checkboxDefault || \"\")) || [];\n\t\t\t} else {\n\t\t\t\tlist = this.wiki.filterTiddlers(this.checkboxFilter,this) || [];\n\t\t\t}\n\t\t\tif(list.indexOf(this.checkboxChecked) !== -1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(list.indexOf(this.checkboxUnchecked) !== -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Neither one present\n\t\t\tif(this.checkboxChecked && !this.checkboxUnchecked) {\n\t\t\t\treturn false; // Absence of checked value\n\t\t\t}\n\t\t\tif(this.checkboxUnchecked && !this.checkboxChecked) {\n\t\t\t\treturn true; // Absence of unchecked value\n\t\t\t}\n\t\t\tif(this.checkboxChecked && this.checkboxUnchecked) {\n\t\t\t\t// Both specified but neither found: indeterminate or false, depending\n\t\t\t\tif(this.checkboxIndeterminate === \"yes\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Neither specified, so empty list is false, non-empty is true\n\t\t\treturn !!list.length;\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\t\tnotValue = checked ? this.checkboxUnchecked : this.checkboxChecked;\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\t// Set the list field (or index) if specified\n\tif(this.checkboxListField || this.checkboxListIndex) {\n\t\tvar fieldContents, listContents, oldPos, newPos;\n\t\tif(this.checkboxListField) {\n\t\t\tfieldContents = (tiddler ? tiddler.fields[this.checkboxListField] : undefined) || [];\n\t\t} else {\n\t\t\tfieldContents = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex);\n\t\t}\n\t\tif($tw.utils.isArray(fieldContents)) {\n\t\t\t// Make a copy so we can modify it without changing original that's refrenced elsewhere\n\t\t\tlistContents = fieldContents.slice(0);\n\t\t} else if(fieldContents === undefined) {\n\t\t\tlistContents = [];\n\t\t} else if(typeof fieldContents === \"string\") {\n\t\t\tlistContents = $tw.utils.parseStringArray(fieldContents);\n\t\t\t// No need to copy since parseStringArray returns a fresh array, not refrenced elsewhere\n\t\t} else {\n\t\t\t// Field was neither an array nor a string; it's probably something that shouldn't become\n\t\t\t// an array (such as a date field), so bail out *without* triggering actions\n\t\t\treturn;\n\t\t}\n\t\toldPos = notValue ? listContents.indexOf(notValue) : -1;\n\t\tnewPos = value ? listContents.indexOf(value) : -1;\n\t\tif(oldPos === -1 && newPos !== -1) {\n\t\t\t// old value absent, new value present: no change needed\n\t\t} else if(oldPos === -1) {\n\t\t\t// neither one was present\n\t\t\tif(value) {\n\t\t\t\tlistContents.push(value);\n\t\t\t\thasChanged = true;\n\t\t\t} else {\n\t\t\t\t// value unspecified? then leave list unchanged\n\t\t\t}\n\t\t} else if(newPos === -1) {\n\t\t\t// old value present, new value absent\n\t\t\tif(value) {\n\t\t\t\tlistContents[oldPos] = value;\n\t\t\t\thasChanged = true;\n\t\t\t} else {\n\t\t\t\tlistContents.splice(oldPos, 1)\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// both were present: just remove the old one, leave new alone\n\t\t\tlistContents.splice(oldPos, 1)\n\t\t\thasChanged = true;\n\t\t}\n\t\tif(this.checkboxListField) {\n\t\t\tnewFields[this.checkboxListField] = $tw.utils.stringifyList(listContents);\n\t\t}\n\t\t// The listIndex case will be handled in the if(hasChanged) block below\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 if(this.checkboxListIndex) {\n\t\t\tvar listIndexValue = (listContents && listContents.length) ? $tw.utils.stringifyList(listContents) : undefined;\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxListIndex,listIndexValue);\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.checkboxListField = this.getAttribute(\"listField\");\n\tthis.checkboxListIndex = this.getAttribute(\"listIndex\");\n\tthis.checkboxFilter = this.getAttribute(\"filter\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxIndeterminate = this.getAttribute(\"indeterminate\",\"no\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\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.listField || changedAttributes.listIndex || changedAttributes.filter || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes.indeterminate || changedAttributes[\"class\"] || changedAttributes.disabled) {\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\tvar isChecked = this.getValue();\n\t\t\tthis.inputDomNode.checked = !!isChecked;\n\t\t\tthis.inputDomNode.indeterminate = (isChecked === undefined);\n\t\t\trefreshed = true;\n\t\t\tif(isChecked) {\n\t\t\t\t$tw.utils.addClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t\t\t} else {\n\t\t\t\t$tw.utils.removeClass(this.labelDomNode,\"tc-checkbox-checked\");\n\t\t\t}\n\t\t}\n\t\tthis.assignAttributes(this.inputDomNode,{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n\t","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\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.code || changedAttributes.language) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\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/data.js":{"title":"$:/core/modules/widgets/data.js","text":"/*\\\ntitle: $:/core/modules/widgets/data.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to dynamically represent one or more 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 DataWidget = function(parseTreeNode,options) {\n\tthis.dataWidgetTag = parseTreeNode.type;\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDataWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDataWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.dataPayload = this.computeDataTiddlerValues(); // Array of $tw.Tiddler objects\n\tthis.domNode = this.document.createTextNode(this.readDataTiddlerValuesAsJson());\n\tparent.insertBefore(this.domNode,nextSibling);\n\tthis.domNodes.push(this.domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDataWidget.prototype.execute = function() {\n\t// Nothing to do here\n};\n\n/*\nRead the tiddler value(s) from a data widget as an array of tiddler field objects (not $tw.Tiddler objects)\n*/\nDataWidget.prototype.readDataTiddlerValues = function() {\n\tvar results = [];\n\t$tw.utils.each(this.dataPayload,function(tiddler,index) {\n\t\tresults.push(tiddler.getFieldStrings());\n\t});\n\treturn results;\n};\n\n/*\nRead the tiddler value(s) from a data widget as an array of tiddler field objects (not $tw.Tiddler objects)\n*/\nDataWidget.prototype.readDataTiddlerValuesAsJson = function() {\n\treturn JSON.stringify(this.readDataTiddlerValues(),null,4);\n};\n\n/*\nCompute list of tiddlers from a data widget\n*/\nDataWidget.prototype.computeDataTiddlerValues = function() {\n\tvar self = this;\n\t// Read any attributes not prefixed with $\n\tvar item = Object.create(null);\n\t$tw.utils.each(this.attributes,function(value,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\titem[name] = value;\t\n\t\t}\n\t});\n\t// Deal with $tiddler, $filter or $compound-tiddler attributes\n\tvar tiddlers = [],\n\t\tcompoundTiddlers,\n\t\ttitle;\n\tif(this.hasAttribute(\"$tiddler\")) {\n\t\ttitle = this.getAttribute(\"$tiddler\");\n\t\tif(title) {\n\t\t\tvar tiddler = this.wiki.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$filter\")) {\n\t\tvar filter = this.getAttribute(\"$filter\");\n\t\tif(filter) {\n\t\t\tvar titles = this.wiki.filterTiddlers(filter);\n\t\t\t$tw.utils.each(titles,function(title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tif(tiddler) {\n\t\t\t\t\ttiddlers.push(tiddler);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$compound-tiddler\")) {\n\t\ttitle = this.getAttribute(\"$compound-tiddler\");\n\t\tif(title) {\n\t\t\ttiddlers.push.apply(tiddlers,this.extractCompoundTiddler(title));\n\t\t}\n\t}\n\tif(this.hasAttribute(\"$compound-filter\")) {\n\t\tfilter = this.getAttribute(\"$compound-filter\");\n\t\tif(filter) {\n\t\t\tcompoundTiddlers = this.wiki.filterTiddlers(filter);\n\t\t\t$tw.utils.each(compoundTiddlers, function(title){\n\t\t\t\ttiddlers.push.apply(tiddlers,self.extractCompoundTiddler(title));\n\t\t\t});\n\t\t}\n\t}\n\t// Return the literal item if none of the special attributes were used\n\tif(!this.hasAttribute(\"$tiddler\") && !this.hasAttribute(\"$filter\") && !this.hasAttribute(\"$compound-tiddler\") && !this.hasAttribute(\"$compound-filter\")) {\n\t\tif(Object.keys(item).length > 0 && !!item.title) {\n\t\t\treturn [new $tw.Tiddler(item)];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t} else {\n\t\t// Apply the item fields to each of the tiddlers\n\t\tif(Object.keys(item).length > 0) {\n\t\t\t$tw.utils.each(tiddlers,function(tiddler,index) {\n\t\t\t\ttiddlers[index] = new $tw.Tiddler(tiddler,item);\n\t\t\t});\n\t\t}\n\t\treturn tiddlers;\n\t}\n};\n\n/*\nHelper to extract tiddlers from text/vnd.tiddlywiki-multiple tiddlers\n*/\nDataWidget.prototype.extractCompoundTiddler = function(title) {\n\tvar tiddler = this.wiki.getTiddler(title);\n\tif(tiddler && tiddler.fields.type === \"text/vnd.tiddlywiki-multiple\") {\n\t\tvar text = tiddler.fields.text || \"\",\n\t\t\trawTiddlers = text.split(/\\r?\\n\\+\\r?\\n/),\n\t\t\ttiddlers = [];\n\t\t$tw.utils.each(rawTiddlers,function(rawTiddler) {\n\t\t\tvar fields = Object.create(null),\n\t\t\t\tsplit = rawTiddler.split(/\\r?\\n\\r?\\n/mg);\n\t\t\tif(split.length >= 1) {\n\t\t\t\tfields = $tw.utils.parseFields(split[0],fields);\n\t\t\t}\n\t\t\tif(split.length >= 2) {\n\t\t\t\tfields.text = split.slice(1).join(\"\\n\\n\");\n\t\t\t}\n\t\t\ttiddlers.push(new $tw.Tiddler(fields));\n\t\t});\n\t\treturn tiddlers;\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*/\nDataWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tvar newPayload = this.computeDataTiddlerValues();\n\tif(hasPayloadChanged(this.dataPayload,newPayload)) {\n\t\tthis.dataPayload = newPayload;\n\t\tthis.domNode.textContent = this.readDataTiddlerValuesAsJson();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nCompare two arrays of tiddlers and return true if they are different\n*/\nfunction hasPayloadChanged(a,b) {\n\tif(a.length === b.length) {\n\t\tfor(var t=0; t<a.length; t++) {\n\t\t\tif(!(a[t].isEqual(b[t]))) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\nexports.data = DataWidget;\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\ttag,\n\t\tdomNode,\n\t\tclasses = [];\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\ttag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tdomNode = this.document.createElement(tag);\n\t// Assign classes\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tif(!this.dragHandleSelector && this.dragEnable) {\n\t\tclasses.push(\"tc-draggable\");\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Assign data- attributes and style. attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Insert the node into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\t// Add event handlers\n\tif(this.dragEnable) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\t\tstartActions: self.startActions,\n\t\t\tendActions: self.endActions,\n\t\t\tdragImageType: self.dragImageType,\n\t\t\twidget: this,\n\t\t\tselector: self.dragHandleSelector\n\t\t});\n\t}\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\tthis.dragImageType = this.getAttribute(\"dragimagetype\");\n\tthis.dragHandleSelector = this.getAttribute(\"selector\");\n\tthis.dragEnable = this.getAttribute(\"enable\",\"yes\") === \"yes\";\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n\nDraggableWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNodes[0].className.split(\" \"),\n\t\toldClasses = this.draggableClasses.split(\" \");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,this.draggableClasses);\n\tthis.domNodes[0].setAttribute(\"class\",domNodeClasses.join(\" \"))\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.selector || changedAttributes.dragimagetype || changedAttributes.enable || changedAttributes.startactions || changedAttributes.endactions) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.updateDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\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\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\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\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Assign data- attributes and style. attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\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]);\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\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\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\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\tif(this.droppableActions) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\t\tfieldsArray.forEach(function(fields) {\n\t\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t\t});\n\t\t});\n\t}\n\t// Send a TitleList to performListActions\n\tif(this.droppableListActions) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\t\tvar titleList = [];\n\t\t\tfieldsArray.forEach(function(fields) {\n\t\t\t\ttitleList.push(fields.title || fields.text);\n\t\t\t});\n\t\t\tself.performListActions($tw.utils.stringifyList(titleList),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.performListActions = function(titleList,event) {\n\tif(this.droppableListActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableListActions,this,event,{actionTiddlerList: titleList, modifier: modifierKey});\n\t}\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\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.droppableListActions = this.getAttribute(\"listActions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\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.tag || changedAttributes.enable || changedAttributes.disabledClass ||\n\t\tchangedAttributes.actions|| changedAttributes.listActions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\n\t\tthis.assignAttributes(this.domNodes[0],{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\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 IMPORT_TITLE = \"$:/Import\";\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\tthis.domNode = domNode;\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]);\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\n// Handler for transient event listeners added when the dropzone has an active drag in progress\nDropZoneWidget.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\tif(this.currentlyEntered.length) {\n\t\t\tthis.resetState();\n\t\t}\n\t} else if(event.type === \"dragenter\") {\n\t\tif(event.target && event.target !== this.domNode && !$tw.utils.domContains(this.domNode,event.target)) {\n\t\t\tthis.resetState();\n\t\t}\n\t} else if(event.type === \"dragleave\") {\n\t\t// Check if drag left the window\n\t\tif(event.relatedTarget === null || (event.relatedTarget && event.relatedTarget.nodeName === \"HTML\")) {\n\t\t\tthis.resetState();\n\t\t}\n\t}\n};\n\n// Reset the state of the dropzone after a drag has ended\nDropZoneWidget.prototype.resetState = function() {\n\t$tw.utils.removeClass(this.domNode,\"tc-dragover\");\n\tthis.currentlyEntered = [];\n\tthis.document.body.removeEventListener(\"click\",this,true);\n\tthis.document.body.removeEventListener(\"dragenter\",this,true);\n\tthis.document.body.removeEventListener(\"dragleave\",this,true);\n\tthis.dragInProgress = false;\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\tif(!this.dragInProgress) {\n\t\tthis.dragInProgress = true;\n\t\t// If we're entering for the first time we need to apply highlighting\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t\tthis.document.body.addEventListener(\"click\",this,true);\n\t\tthis.document.body.addEventListener(\"dragenter\",this,true);\n\t\tthis.document.body.addEventListener(\"dragleave\",this,true);\n\t}\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\tthis.resetState();\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tif(this.filesOnly && !$tw.utils.dragEventContainsFiles(event)) {\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\t// Check if this is a synthetic event, IE does not allow accessing dropEffect outside of original event handler\n\tif(event.isTrusted) {\n\t\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n\t}\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\tthis.resetState();\n};\n\nDropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) {\n\tvar filteredTypes,\n\t\tfiltered = [],\n\t\ttypes = [];\n\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\n\t\ttypes.push(tiddlerFields.type || \"\");\n\t});\n\tfilteredTypes = this.wiki.filterTiddlers(this.contentTypesFilter,this,this.wiki.makeTiddlerIterator(types));\n\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\n\t\tif(filteredTypes.indexOf(tiddlerFields.type) !== -1) {\n\t\t\tfiltered.push(tiddlerFields);\n\t\t}\n\t});\n\treturn filtered;\n};\n\nDropZoneWidget.prototype.readFileCallback = function(tiddlerFieldsArray) {\n\tif(this.contentTypesFilter) {\n\t\ttiddlerFieldsArray = this.filterByContentTypes(tiddlerFieldsArray);\n\t}\n\tif(tiddlerFieldsArray.length) {\n\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: this.autoOpenOnImport, importTitle: this.importTitle});\n\t\tif(this.actions) {\n\t\t\tthis.invokeActionString(this.actions,this,event,{importTitle: this.importTitle});\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.readFileCallback(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\tthis.resetState();\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\t// If we have type text/vnd.tiddlywiki then skip trying to import files\n\tif(dataTransfer.files && !$tw.utils.dragEventContainsType(event,\"text/vnd.tiddler\")) {\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\tvar fallbackTitle = self.wiki.generateNewTitle(\"Untitled\");\n\t\t//Use the deserializer specified if any\n\t\tif(this.dropzoneDeserializer) {\n\t\t\tfor(var t= 0; t<dataTransfer.items.length; t++) {\n\t\t\t\tvar item = dataTransfer.items[t];\n\t\t\t\tif(item.kind === \"string\") {\n\t\t\t\t\titem.getAsString(function(str){\n\t\t\t\t\t\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\t\treadFileCallback(tiddlerFields);\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} else {\n\t\t\t$tw.utils.importDataTransfer(dataTransfer,fallbackTitle,readFileCallback);\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};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this;\n\tvar\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.readFileCallback(tiddlerFieldsArray);\n\t\t};\n\tvar getItem = function(type) {\n\t\t\ttype = type || \"text/plain\";\n\t\t\treturn function(str) {\n\t\t\t\t// Use the deserializer specified if any\n\t\t\t\tif(self.dropzoneDeserializer) {\n\t\t\t\t\ttiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: self.wiki.generateNewTitle(\"Untitled \" + type)},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\treadFileCallback(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled \" + type),\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\treadFileCallback([tiddlerFields]);\n\t\t\t\t}\n\t\t\t}\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 && !event.twEditor) {\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\" && ![\"text/html\", \"text/plain\", \"Text\"].includes(item.type) && $tw.utils.itemHasValidDataType(item)) {\n\t\t\t\t// Try to import the various data types we understand\n\t\t\t\tvar fallbackTitle = self.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t//Use the deserializer specified if any\n\t\t\t\tif(this.dropzoneDeserializer) {\n\t\t\t\t\titem.getAsString(function(str){\n\t\t\t\t\t\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\n\t\t\t\t\t\tif(tiddlerFields && tiddlerFields.length) {\n\t\t\t\t\t\t\treadFileCallback(tiddlerFields);\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$tw.utils.importPaste(item,fallbackTitle,readFileCallback);\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 tiddlerFields;\n\t\t\t\t// It's important to give getAsString a closure with the right type\n\t\t\t\t// So it can be added to the import queue\n\t\t\t\titem.getAsString(getItem(item.type));\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\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\",IMPORT_TITLE);\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.contentTypesFilter = this.getAttribute(\"contentTypesFilter\");\n\tthis.filesOnly = this.getAttribute(\"filesOnly\",\"no\") === \"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($tw.utils.count(changedAttributes) > 0) {\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\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// 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\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;\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;\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;\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;\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\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\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: this.parseTreeNode.attributes,\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 || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (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\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Restrict tag name to digits, letts and dashes\n\tthis.tag = this.tag.replace(/[^0-9a-zA-Z\\-]/mg,\"\");\n\t// Default to a span\n\tthis.tag = this.tag || \"span\";\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.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\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar XHTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\",\n\t\ttagNamespaces = {\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: XHTML_NAMESPACE\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tif(this.hasAttribute(\"xmlns\")) {\n\t\t\tthis.namespace = this.getAttribute(\"xmlns\");\n\t\t\tthis.setVariable(\"namespace\",this.namespace);\n\t\t} else {\n\t\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: XHTML_NAMESPACE});\n\t\t}\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.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/*\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\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\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.computeAttributes();\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;\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/error.js":{"title":"$:/core/modules/widgets/error.js","text":"/*\\\ntitle: $:/core/modules/widgets/error.js\ntype: application/javascript\nmodule-type: widget\n\nError 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 ErrorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nErrorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nErrorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar message = this.getAttribute(\"$message\",\"Unknown error\"),\n\t\tdomNode = this.document.createElement(\"span\");\n\tdomNode.appendChild(this.document.createTextNode(message));\n\tdomNode.className = \"tc-error\";\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nErrorWidget.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*/\nErrorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.error = ErrorWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/eventcatcher.js":{"title":"$:/core/modules/widgets/eventcatcher.js","text":"/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler 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 EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.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 = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tmatchSelector = self.getAttribute(\"matchSelector\"),\n\t\t\t\tactions = self.getAttribute(\"$\"+type) || self.getAttribute(\"actions-\"+type),\n\t\t\t\tstopPropagation = self.getAttribute(\"stopPropagation\",\"onaction\"),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\t// Firefox can fire dragover and dragenter events on text nodes instead of their parents\n\t\t\tif(selectedNode.nodeType === 3) {\n\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t}\n\t\t\t// Check that the selected node matches any matchSelector\n\t\t\tif(matchSelector && !$tw.utils.domMatchesSelector(selectedNode,matchSelector)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!$tw.utils.domMatchesSelector(selectedNode,selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// Exit if we didn't find one\n\t\t\t\tif(selectedNode === domNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Only set up variables if we have actions to invoke\n\t\t\t\tif(actions) {\n\t\t\t\t\tvariables = $tw.utils.collectDOMVariables(selectedNode,self.domNode,event);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t}\n\t\t\tif((actions && stopPropagation === \"onaction\") || stopPropagation === \"always\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\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*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = [];\n\t$tw.utils.each(this.attributes,function(value,key) {\n\t\tif(key.charAt(0) === \"$\") {\n\t\t\tself.types.push(key.slice(1));\n\t\t}\n\t});\n\tif(!this.types.length) {\n\t\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\t}\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tchangedAttributesCount = $tw.utils.count(changedAttributes);\n\tif(changedAttributesCount === 1 && changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t} else if(changedAttributesCount > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\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};\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.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\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);\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 false;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.trim();\n\t\t\tif(!value && tiddler) {\n\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t}\n\t\t\taddition[trimmedName] = value || \"\";\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 false;\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 false;\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));\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 false;\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/fill.js":{"title":"$:/core/modules/widgets/fill.js","text":"/*\\\ntitle: $:/core/modules/widgets/fill.js\ntype: application/javascript\nmodule-type: widget\n\nSub-widget used by the transclude widget for specifying values for slots within transcluded content. It doesn't do anything by itself because the transclude widget only ever deals with the parse tree nodes, and doesn't instantiate the widget itself\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 FillWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFillWidget.prototype = new Widget();\n\nexports.fill = FillWidget;\n\n})();\n\t","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/genesis.js":{"title":"$:/core/modules/widgets/genesis.js","text":"/*\\\ntitle: $:/core/modules/widgets/genesis.js\ntype: application/javascript\nmodule-type: widget\n\nGenesis widget for dynamically creating 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\nvar GenesisWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nGenesisWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nGenesisWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes({filterFn: function(name) {\n\t\t// Only compute our own attributes which start with a single dollar\n\t\treturn name.charAt(0) === \"$\" && name.charAt(1) !== \"$\";\n\t}});\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nGenesisWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Collect attributes\n\tthis.genesisType = this.getAttribute(\"$type\");\n\tthis.genesisRemappable = this.getAttribute(\"$remappable\",\"yes\") === \"yes\";\n\tthis.genesisNames = this.getAttribute(\"$names\",\"\");\n\tthis.genesisValues = this.getAttribute(\"$values\",\"\");\n\tthis.genesisIsBlock = this.getAttribute(\"$mode\",this.parseTreeNode.isBlock && \"block\") === \"block\";\n\t// Do not create a child widget if the $type attribute is missing or blank\n\tif(!this.genesisType) {\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\treturn;\n\t}\n\t// Construct parse tree\n\tvar isElementWidget = this.genesisType.charAt(0) !== \"$\",\n\t\tnodeType = isElementWidget ? \"element\" : this.genesisType.substr(1),\n\t\tnodeTag = isElementWidget ? this.genesisType : undefined;\n\tvar parseTreeNodes = [{\n\t\ttype: nodeType,\n\t\ttag: nodeTag,\n\t\tattributes: {},\n\t\torderedAttributes: [],\n\t\tisBlock: this.genesisIsBlock,\n\t\tchildren: this.parseTreeNode.children || [],\n\t\tisNotRemappable: !this.genesisRemappable\n\t}];\n\t// Apply attributes in $names/$values\n\tthis.attributeNames = [];\n\tthis.attributeValues = [];\n\tif(this.genesisNames && this.genesisValues) {\n\t\tthis.attributeNames = this.wiki.filterTiddlers(self.genesisNames,this);\n\t\tthis.attributeValues = this.wiki.filterTiddlers(self.genesisValues,this);\n\t\t$tw.utils.each(this.attributeNames,function(varname,index) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],varname,self.attributeValues[index] || \"\");\n\t\t});\n\t}\n\t// Apply explicit attributes\n\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\n\t\tvar name = attribute.name;\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tif(name.charAt(1) === \"$\") {\n\t\t\t\t// Double $$ is changed to a single $\n\t\t\t\tname = name.substr(1);\n\t\t\t} else {\n\t\t\t\t// Single dollar is ignored\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],$tw.utils.extend({},attribute,{name: name}));\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*/\nGenesisWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tfilterNames = this.getAttribute(\"$names\",\"\"),\n\t\tfilterValues = this.getAttribute(\"$values\",\"\"),\n\t\tattributeNames = this.wiki.filterTiddlers(filterNames,this),\n\t\tattributeValues = this.wiki.filterTiddlers(filterValues,this);\n\tif($tw.utils.count(changedAttributes) > 0 || !$tw.utils.isArrayEqual(this.attributeNames,attributeNames) || !$tw.utils.isArrayEqual(this.attributeValues,attributeValues)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.genesis = GenesisWidget;\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\ttypeInfo = $tw.config.contentTypeInfo[type] || {},\n\t\t\t\tdeserializerType = typeInfo.deserializerType || type;\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 by looking up the encoding in the content type info\n\t\t\t\tvar encoding = typeInfo.encoding || \"utf8\";\n\t\t\t\tif (encoding === \"base64\") {\n\t\t\t\t\t// .pdf .png .jpg etc.\n\t\t\t\t\tsrc = \"data:\" + deserializerType + \";base64,\" + text;\n\t\t\t\t\tif (deserializerType === \"application/pdf\") {\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// .svg .tid .xml etc.\n\t\t\t\t\tsrc = \"data:\" + deserializerType + \",\" + encodeURIComponent(text);\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(deserializerType) {\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}\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);\n\t}\n\tif(this.imageUsemap) {\n\t \tdomNode.setAttribute(\"usemap\",this.imageUsemap);\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);\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\n\t}\n\tif(this.lazyLoading && tag === \"img\") {\n\t\tdomNode.setAttribute(\"loading\",this.lazyLoading);\n\t}\n\t// Add classes when the image loads or fails\n\t$tw.utils.addClass(domNode,\"tc-image-loading\");\n\tdomNode.addEventListener(\"load\",function() {\n\t\t$tw.utils.removeClass(domNode,\"tc-image-loading\");\n\t\t$tw.utils.addClass(domNode,\"tc-image-loaded\");\n\t},false);\n\tdomNode.addEventListener(\"error\",function() {\n\t\t$tw.utils.removeClass(domNode,\"tc-image-loading\");\n\t\t$tw.utils.addClass(domNode,\"tc-image-error\");\n\t},false);\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.imageUsemap = this.getAttribute(\"usemap\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n\tthis.lazyLoading = this.getAttribute(\"loading\");\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.usemap || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\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// Got to flush all the accumulated variables\n\tthis.variables = Object.create(null);\n\tif(this.parentWidget) {\n\t\tObject.setPrototypeOf(this.variables,this.parentWidget.variables);\n\t}\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,{parseAsInline:true, configTrimWhiteSpace:false});\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && [\"setvariable\",\"set\",\"parameters\"].indexOf(parseTreeNode.type) !== -1) {\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\tisFunctionDefinition: parseTreeNode.isFunctionDefinition,\n\t\t\t\t\tisProcedureDefinition: parseTreeNode.isProcedureDefinition,\n\t\t\t\t\tisWidgetDefinition: parseTreeNode.isWidgetDefinition,\n\t\t\t\t\tconfigTrimWhiteSpace: parseTreeNode.configTrimWhiteSpace\n\t\t\t\t};\n\t\t\t\tif(parseTreeNode.type === \"set\" || parseTreeNode.type === \"setvariable\") {\n\t\t\t\t\tif(parseTreeNode.isMacroDefinition || parseTreeNode.isProcedureDefinition || parseTreeNode.isWidgetDefinition || parseTreeNode.isFunctionDefinition) {\n\t\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t\t// another link to the chain.\n\t\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\t\twidget.execute();\n\t\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t\t// don't want.\n\t\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t\t// importvariable tree.\n\t\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidgetPointer = widgetPointer.children[0];\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\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);\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/jsontiddler.js":{"title":"$:/core/modules/widgets/jsontiddler.js","text":"/*\\\ntitle: $:/core/modules/widgets/jsontiddler.js\ntype: application/javascript\nmodule-type: widget\n\nRender a tiddler as JSON text\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 JSONTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nJSONTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nJSONTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Collect the fields from the optional base tiddler\n\tvar fields = this.getTiddlerFields();\n\t// Add custom fields specified in attributes starting with $\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tfields[name.slice(1)] = attribute;\n\t\t}\n\t});\n\t// JSONify\n\tvar json = JSON.stringify(fields);\n\t// Escape unsafe script characters\n\tif(this.attEscapeUnsafeScriptChars) {\n\t\tjson = json.replace(/</g,\"\\\\u003C\");\n\t}\n\t// Update the DOM\n\tvar textNode = this.document.createTextNode(json);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nJSONTiddlerWidget.prototype.execute = function() {\n\tthis.attTiddler = this.getAttribute(\"tiddler\");\n\tthis.attExclude = this.getAttribute(\"exclude\",\"\");\n\tthis.attEscapeUnsafeScriptChars = this.getAttribute(\"escapeUnsafeScriptChars\",\"no\") === \"yes\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nJSONTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0 || (this.attTiddler && changedTiddlers[this.attTiddler])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nJSONTiddlerWidget.prototype.getTiddlerFields = function() {\n\tvar fields = {};\n\tif(this.attTiddler) {\n\t\tvar tiddler = this.wiki.getTiddler(this.attTiddler);\n\t\tif(tiddler) {\n\t\t\tfields = tiddler.getFieldStrings({exclude: this.attExclude.split(\" \")});\n\t\t} else {\n\t\t\tfields = {title: this.attTiddler};\n\t\t}\n\t}\n\treturn fields;\n};\n\nexports.jsontiddler = JSONTiddlerWidget;\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\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add a keyboard event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.handleChangeEvent = function(event) {\n\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\n\t\treturn true;\n\t}\n\n\tvar keyInfo = $tw.keyboardManager.getMatchingKeyDescriptor(event,this.keyInfoArray);\n\tif(keyInfo) {\n\t\tvar handled = this.invokeActions(this,event);\n\t\tif(this.actions) {\n\t\t\tvar variables = {\n\t\t\t\t\t\"event-key\": event.key,\n\t\t\t\t\t\"event-code\": event.code,\n\t\t\t\t\t\"modifier\": $tw.keyboardManager.getEventModifierKeyDescriptor(event)\n\t\t\t\t};\n\t\t\tif(keyInfo.keyDescriptor) {\n\t\t\t\tvariables[\"event-key-descriptor\"] = keyInfo.keyDescriptor;\n\t\t\t}\n\t\t\tthis.invokeActionString(this.actions,this,event,variables);\n\t\t}\n\t\tthis.dispatchMessage(event);\n\t\tif(handled || this.actions || this.message) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\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\tif($tw.keyboardManager) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\t\tthis.shortcutTiddlers = [];\n\t\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t\t});\n\t\t}\t\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nKeyboardWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tthis.domNode.className = classes.join(\" \");\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.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\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) && $tw.keyboardManager) {\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/let.js":{"title":"$:/core/modules/widgets/let.js","text":"/*\\\ntitle: $:/core/modules/widgets/let.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows defining multiple variables at once, while allowing\nthe later variables to depend upon the earlier ones.\n\n```\n\\define helloworld() Hello world!\n<$let currentTiddler=\"target\" value={{!!value}} currentTiddler=\"different\">\n {{!!value}} will be different from <<value>>\n</$let>\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 LetWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\nLetWidget.prototype.computeAttributes = function() {\n\t// Before computing attributes, we must make clear that none of the\n\t// existing attributes are staged for lookup, even on a refresh\n\tvar changedAttributes = {},\n\t\tself = this;\n\tthis.currentValueFor = Object.create(null);\n\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\n\t\tvar value = self.computeAttribute(attribute),\n\t\t\tname = attribute.name;\n\t\t// Now that it's prepped, we're allowed to look this variable up\n\t\t// when defining later variables\n\t\tif(value !== undefined) {\n\t\t\tself.currentValueFor[name] = value;\n\t\t}\n\t});\n\t// Run through again, setting variables and looking for differences\n\t$tw.utils.each(this.currentValueFor,function(value,name) {\n\t\tif (self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tself.setVariable(name,value);\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\nLetWidget.prototype.getVariableInfo = function(name,options) {\n\t// Special handling: If this variable exists in this very $let, we can\n\t// use it, but only if it's been staged.\n\tif ($tw.utils.hop(this.currentValueFor,name)) {\n\t\treturn {\n\t\t\ttext: this.currentValueFor[name]\n\t\t};\n\t}\n\treturn Widget.prototype.getVariableInfo.call(this,name,options);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLetWidget.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\nexports[\"let\"] = LetWidget;\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\t// Assign data- attributes\n\t\tthis.assignAttributes(domNode,{\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\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 namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,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);\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$\",$tw.utils.encodeURIComponentExtended(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",$tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(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\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"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// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\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\tnavigateFromClientTop: bounds.top,\n\t\tnavigateFromClientLeft: bounds.left,\n\t\tnavigateFromClientWidth: bounds.width,\n\t\tnavigateFromClientRight: bounds.right,\n\t\tnavigateFromClientBottom: bounds.bottom,\n\t\tnavigateFromClientHeight: bounds.height,\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\tevent: event\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($tw.utils.count(changedAttributes) > 0 || changedTiddlers[this.to]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n\t","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};\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.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\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);\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\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t\t// This is a navigate event generated by the actions of this linkcatcher,\n\t\t\t// so we don't trap it again, but just pass it to the parent\n\t\t\tthis.parentWidget.dispatchEvent(event);\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// 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\nListWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the ListWidget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\t// First call parent constructor to set everything else up\n\tWidget.prototype.initialise.call(this,parseTreeNode,options);\n\t// Now look for <$list-template> and <$list-empty> widgets as immediate child widgets\n\t// This is safe to do during initialization because parse trees never change after creation\n\tthis.findExplicitTemplates();\n}\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\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\tthis.parentDomNode = parent;\n\tvar changedAttributes = this.computeAttributes();\n\tthis.execute(changedAttributes);\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\tif(this.storyview && this.storyview.renderEnd) {\n\t\tthis.storyview.renderEnd();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function(changedAttributes) {\n\tvar self = this;\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.counterName = this.getAttribute(\"counter\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Create join template only if needed\n\tif(this.join === undefined || (changedAttributes && changedAttributes.join)) {\n\t\tthis.join = this.makeJoinTemplate();\n\t}\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,index));\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.findExplicitTemplates = function() {\n\tvar self = this;\n\tthis.explicitListTemplate = null;\n\tthis.explicitEmptyTemplate = null;\n\tthis.explicitJoinTemplate = null;\n\tthis.hasTemplateInBody = false;\n\tvar searchChildren = function(childNodes) {\n\t\tvar foundInlineTemplate = false;\n\t\t$tw.utils.each(childNodes,function(node) {\n\t\t\tif(node.type === \"list-template\") {\n\t\t\t\tself.explicitListTemplate = node.children;\n\t\t\t} else if(node.type === \"list-empty\") {\n\t\t\t\tself.explicitEmptyTemplate = node.children;\n\t\t\t} else if(node.type === \"list-join\") {\n\t\t\t\tself.explicitJoinTemplate = node.children;\n\t\t\t} else if(node.type === \"element\" && node.tag === \"p\") {\n\t\t\t\tsearchChildren(node.children);\n\t\t\t\tfoundInlineTemplate = true;\n\t\t\t} else {\n\t\t\t\tfoundInlineTemplate = true;\n\t\t\t}\n\t\t});\n\t\treturn foundInlineTemplate;\n\t};\n\tthis.hasTemplateInBody = searchChildren(this.parseTreeNode.children);\n}\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar limit = $tw.utils.getInt(this.getAttribute(\"limit\",\"\"),undefined);\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\tvar results = this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n\tif(limit !== undefined) {\n\t\tif(limit >= 0) {\n\t\t\tresults = results.slice(0,limit);\n\t\t} else {\n\t\t\tresults = results.slice(limit);\n\t\t}\n\t}\n\treturn results;\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\");\n\t// If emptyMessage attribute is not present or empty then look for an explicit empty template\n\tif(!emptyMessage) {\n\t\tif(this.explicitEmptyTemplate) {\n\t\t\treturn this.explicitEmptyTemplate;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\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 join between list items\n*/\nListWidget.prototype.makeJoinTemplate = function() {\n\tvar parser,\n\t\tjoin = this.getAttribute(\"join\",\"\");\n\tif(join) {\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",join,{parseAsInline:true})\n\t\tif(parser) {\n\t\t\treturn parser.tree;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t} else {\n\t\treturn this.explicitJoinTemplate; // May be null, and that's fine\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title,index) {\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\tjoin = this.join,\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\t// Check for child nodes of the list widget\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\t// Check for a <$list-item> widget\n\t\t\tif(this.explicitListTemplate) {\n\t\t\t\ttemplateTree = this.explicitListTemplate;\n\t\t\t} else if(this.hasTemplateInBody) {\n\t\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t\t}\n\t\t}\n\t\tif(!templateTree || templateTree.length === 0) {\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{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\tvar parseTreeNode = {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree, join: join};\n\tparseTreeNode.isLast = index === this.list.length - 1;\n\tif(this.counterName) {\n\t\tparseTreeNode.counter = (index + 1).toString();\n\t\tparseTreeNode.counterName = this.counterName;\n\t\tparseTreeNode.isFirst = index === 0;\n\t}\n\treturn parseTreeNode;\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.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.join || 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// If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them\n\t\tvar hasRefreshed = false,t;\n\t\tif(this.counterName) {\n\t\t\tvar mustRefreshOldLast = false;\n\t\t\tvar oldLength = this.children.length;\n\t\t\t// Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items\n\t\t\tfor(t=0; t<this.list.length; t++) {\n\t\t\t\tif(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {\n\t\t\t\t\tif(this.children[t]) {\n\t\t\t\t\t\tthis.removeListItem(t);\n\t\t\t\t\t}\n\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\tif(!hasRefreshed && t === oldLength) {\n\t\t\t\t\t\tmustRefreshOldLast = true;\n\t\t\t\t\t}\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Refresh the item we're reusing\n\t\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If items were inserted then we must recreate the item that used to be at the last position as it is no longer last\n\t\t\tif(mustRefreshOldLast && oldLength > 0) {\n\t\t\t\tvar oldLastIdx = oldLength-1;\n\t\t\t\tthis.removeListItem(oldLastIdx);\n\t\t\t\tthis.insertListItem(oldLastIdx,this.list[oldLastIdx]);\n\t\t\t}\n\t\t\t// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position\n\t\t\tif(!hasRefreshed && this.children.length > this.list.length) {\n\t\t\t\tthis.removeListItem(this.list.length-1);\n\t\t\t\tthis.insertListItem(this.list.length-1,this.list[this.list.length-1]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Cycle through the list, inserting and removing list items as needed\n\t\t\tvar mustRecreateLastItem = false;\n\t\t\tif(this.join && this.join.length) {\n\t\t\t\tif(this.children.length !== this.list.length) {\n\t\t\t\t\t\tmustRecreateLastItem = true;\n\t\t\t\t} else if(prevList[prevList.length-1] !== this.list[this.list.length-1]) {\n\t\t\t\t\t\tmustRecreateLastItem = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar isLast = false, wasLast = false;\n\t\t\tfor(t=0; t<this.list.length; t++) {\n\t\t\t\tisLast = t === this.list.length-1;\n\t\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\t\twasLast = index === this.children.length-1;\n\t\t\t\tif(wasLast && (index !== t || this.children.length !== this.list.length)) {\n\t\t\t\t\tmustRecreateLastItem = !!(this.join && this.join.length);\n\t\t\t\t}\n\t\t\t\tif(index === undefined) {\n\t\t\t\t\t// The list item must be inserted\n\t\t\t\t\tif(isLast && mustRecreateLastItem && t>0) {\n\t\t\t\t\t\t// First re-create previosly-last item that will no longer be last\n\t\t\t\t\t\tthis.removeListItem(t-1);\n\t\t\t\t\t\tthis.insertListItem(t-1,this.list[t-1]);\n\t\t\t\t\t}\n\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t} else {\n\t\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\t\thasRefreshed = true;\n\t\t\t\t\t}\n\t\t\t\t\t// Refresh the item we're reusing, or recreate if necessary\n\t\t\t\t\tif(mustRecreateLastItem && (isLast || wasLast)) {\n\t\t\t\t\t\tthis.removeListItem(t);\n\t\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\t\t\thasRefreshed = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t\t\t}\n\t\t\t\t}\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,index));\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\tif(this.parseTreeNode.counterName) {\n\t\tthis.setVariable(this.parseTreeNode.counterName,this.parseTreeNode.counter);\n\t\tthis.setVariable(this.parseTreeNode.counterName + \"-first\",this.parseTreeNode.isFirst ? \"yes\" : \"no\");\n\t\tthis.setVariable(this.parseTreeNode.counterName + \"-last\",this.parseTreeNode.isLast ? \"yes\" : \"no\");\n\t}\n\t// Add join if needed\n\tvar children = this.parseTreeNode.children,\n\t\tjoin = this.parseTreeNode.join;\n\tif(join && join.length && !this.parseTreeNode.isLast) {\n\t\tchildren = children.slice(0);\n\t\t$tw.utils.each(join,function(joinNode) {\n\t\t\tchildren.push(joinNode);\n\t\t})\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(children);\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/*\nMake <$list-template> and <$list-empty> widgets that do nothing\n*/\nvar ListTemplateWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListTemplateWidget.prototype = new Widget();\nListTemplateWidget.prototype.render = function() {}\nListTemplateWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-template\"] = ListTemplateWidget;\n\nvar ListEmptyWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListEmptyWidget.prototype = new Widget();\nListEmptyWidget.prototype.render = function() {}\nListEmptyWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-empty\"] = ListEmptyWidget;\n\nvar ListJoinWidget = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\nListJoinWidget.prototype = new Widget();\nListJoinWidget.prototype.render = function() {}\nListJoinWidget.prototype.refresh = function() { return false; }\n\nexports[\"list-join\"] = ListJoinWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/log.js":{"title":"$:/core/modules/widgets/log.js","text":"/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();","type":"application/javascript","module-type":"widget-subclass"},"$:/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\tthis.macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\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});\n\t\t}\n\t});\n\t// Make a transclude widget\n\tvar positionalName = 0,\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tisBlock: this.parseTreeNode.isBlock,\n\t\t\tchildren: this.parseTreeNode.children\n\t\t}];\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$variable\",this.macroName);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$type\",this.parseType);\n\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\"$output\",this.renderOutput);\n\t$tw.utils.each(params,function(param) {\n\t\tvar name = param.name;\n\t\tif(name) {\n\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\tname = \"$\" + name;\n\t\t\t}\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],name,param.value);\n\t\t} else {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],(positionalName++) + \"\",param.value);\n\t\t}\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/messagecatcher.js":{"title":"$:/core/modules/widgets/messagecatcher.js","text":"/*\\\ntitle: $:/core/modules/widgets/messagecatcher.js\ntype: application/javascript\nmodule-type: widget\n\nMessage catcher 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 MessageCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMessageCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMessageCatcherWidget.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// Helper to add an event handler\n\tvar addEventHandler = function(type,actions) {\n\t\tif(type && actions) {\n\t\t\tvar isActionStringExecuting = false;\n\t\t\tself.addEventListener(\n\t\t\t\ttype,\n\t\t\t\tfunction(event) {\n\t\t\t\t\t// Don't trap the event if it came from one of our action handlers\n\t\t\t\t\tif(isActionStringExecuting) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Collect all the event properties into variables\n\t\t\t\t\tvar collectProps = function(obj,prefix) {\n\t\t\t\t\t\tprefix = prefix || \"\";\n\t\t\t\t\t\tvar props = {},\n\t\t\t\t\t\t\tnames = [];\n\t\t\t\t\t\t$tw.utils.each(obj,function(value,name) {\n\t\t\t\t\t\t\tif([\"string\",\"boolean\",\"number\"].indexOf(typeof value) !== -1) {\n\t\t\t\t\t\t\t\tnames.push(name);\n\t\t\t\t\t\t\t\tprops[prefix + \"-\" + name] = value.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tprops[\"list-\" + prefix] = $tw.utils.stringifyList(names);\n\t\t\t\t\t\treturn props;\n\t\t\t\t\t};\n\t\t\t\t\tvar variables = $tw.utils.extend(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tcollectProps(event.paramObject,\"event-paramObject\"),\n\t\t\t\t\t\tcollectProps(event,\"event\"),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)\n\t\t\t\t\t\t});\n\t\t\t\t\tisActionStringExecuting = true;\n\t\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\t\tisActionStringExecuting = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\t// Add the main event handler\n\taddEventHandler(this.getAttribute(\"type\"),this.getAttribute(\"actions\"));\n\t// Add any other event handlers\n\t$tw.utils.each(this.attributes,function(value,key) {\n\t\tif(key.charAt(0) === \"$\") {\n\t\t\taddEventHandler(key.slice(1),value);\n\t\t}\n\t});\n\t// Render children\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMessageCatcherWidget.prototype.execute = function() {\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*/\nMessageCatcherWidget.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\nexports.messagecatcher = MessageCatcherWidget;\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};\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.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]);\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\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\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*/\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));\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}\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}\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\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.story.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\tevent = $tw.hooks.invokeHook(\"th-closing-tiddler\",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\t\twin = event.event && event.event.view ? event.event.view : window;\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 win.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\t\twin = event.event && event.event.view ? event.event.view : window;\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(((originalTitle && this.wiki.getTiddler(originalTitle)) || (tiddler && ((tiddler.fields.text || \"\") !== \"\"))) && !win.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\tif(tiddler) {\n\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\t\tthis.wiki.deleteTiddler(title);\t\n\t}\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\t\ttext: \"\",\n\t\t\t},\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\twin = event.event && event.event.view ? event.event.view : window;\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 = win.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,tiddler);\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)) {\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\tvar win = event.event && event.event.view ? event.event.view : window;\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 = win.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\ttemplateHasTags = false;\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\tvar additionalFieldsHasTags = !!(additionalFields && (additionalFields.tags === \"\"));\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\ttemplateHasTags = true;\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\t// If template or additionalFields have \"tags\" even if empty a tags field will be created.\n\t\t\ttags: ((mergedTags.length > 0) || templateHasTags || additionalFieldsHasTags) ? mergedTags : undefined\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 = $tw.utils.parseJSONSafe(event.param,[]);\n\t// Get the current $:/Import tiddler\n\tvar paramObject = event.paramObject || {},\n\t\timportTitle = event.importTitle || paramObject.importTitle || IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\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// Deselect any disabled, but _not_ suppressed tiddlers\n\tvar systemMessage = $tw.language.getString(\"Import/Upgrader/Tiddler/Unselected\");\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t\tif(message.indexOf(systemMessage) !== -1) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Deselect suppressed tiddlers ... they have been removed and can't be selected anymore\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\tnewFields[\"suppressed-\" + title] = \"yes\";\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\tvar autoOpenOnImport = event.autoOpenOnImport || paramObject.autoOpenOnImport || this.getVariable(\"tv-auto-open-on-import\");\n\tif(autoOpenOnImport !== \"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(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\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,\n\t\timportReport = [];\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t// If you need to modify the import tiddler payload then consider th-importing-tiddler instead\n\timportTiddler = $tw.hooks.invokeHook(\"th-before-importing\",importTiddler);\n\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\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\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// th-importing-tiddler doesn't allow user interaction by default\n\t\t\t// If you want to use the default UI then use: $:/core/modules/upgraders/ instead\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\t// Add the tiddlers to the store\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.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\nexports.navigator = NavigatorWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/parameters.js":{"title":"$:/core/modules/widgets/parameters.js","text":"/*\\\ntitle: $:/core/modules/widgets/parameters.js\ntype: application/javascript\nmodule-type: widget\n\nWidget for definition of transclusion parameters\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\tTranscludeWidget = require(\"$:/core/modules/widgets/transclude.js\").transclude;\n\nvar ParametersWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nParametersWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nParametersWidget.prototype.render = function(parent,nextSibling) {\n\t// Call the constructor\n\tWidget.call(this);\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*/\nParametersWidget.prototype.execute = function() {\n\tvar self = this;\n\tthis.parametersDepth = Math.max(parseInt(this.getAttribute(\"$depth\",\"1\"),10) || 1,1);\n\t// Find the parent transclusions\n\tvar pointer = this.parentWidget,\n\t\tdepth = this.parametersDepth;\n\twhile(pointer) {\n\t\tif(pointer instanceof TranscludeWidget) {\n\t\t\tdepth--;\n\t\t\tif(depth <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tpointer = pointer.parentWidget;\n\t}\n\t// Process each parameter\n\tif(pointer instanceof TranscludeWidget) {\n\t\t// Get the value for each defined parameter\n\t\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {\n\t\t\tvar name = attr.name;\n\t\t\t// If the attribute name starts with $$ then reduce to a single dollar\n\t\t\tif(name.substr(0,2) === \"$$\") {\n\t\t\t\tname = name.substr(1);\n\t\t\t}\n\t\t\tvar value = pointer.getTransclusionParameter(name,index,self.getAttribute(attr.name,\"\"));\n\t\t\tself.setVariable(name,value);\n\t\t});\n\t\t// Assign any metaparameters\n\t\t$tw.utils.each(pointer.getTransclusionMetaParameters(),function(getValue,name) {\n\t\t\tvar variableName = self.getAttribute(\"$\" + name);\n\t\t\tif(variableName) {\n\t\t\t\tself.setVariable(variableName,getValue(name));\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// There is no parent transclude. i.e. direct rendering.\n\t\t// We use default values only.\n\t\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {\n\t\t\tvar name = attr.name;\n\t\t\t// If the attribute name starts with $$ then reduce to a single dollar\n\t\t\tif(name.substr(0,2) === \"$$\") {\n\t\t\t\tname = name.substr(1);\n\t\t\t}\n\t\t\tvar value = self.getAttribute(attr.name,\"\");\n\t\t\tself.setVariable(name,value);\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*/\nParametersWidget.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.parameters = ParametersWidget;\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;\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\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\tif(isChecked) {\n\t\tthis.inputDomNode.checked = true;\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",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(tiddler) {\n\t\tif(this.radioIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex,this.radioDefault);\n\t\t} else {\n\t\t\tvalue = tiddler.getFieldString(this.radioField,this.radioDefault);\n\t\t}\n\t} else {\n\t\tvalue = this.radioDefault;\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\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\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\tthis.radioDefault = this.getAttribute(\"default\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\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(($tw.utils.count(changedAttributes) > 0)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.radioTitle]) {\n\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t$tw.utils.toggleClass(this.labelDomNode,\"tc-radio-selected\",this.inputDomNode.checked);\n\t\treturn this.refreshChildren(changedTiddlers);\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\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\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\tthis.assignAttributes(this.inputDomNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\", handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\", handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\", handlerObject:this, handlerMethod:\"handleInputEvent\"},\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,\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.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) { // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = 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// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\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\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\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($tw.utils.count(changedAttributes) > 0) {\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;\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);\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 Popup = require(\"$:/core/modules/utils/dom/popup.js\");\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\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\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 \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\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\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\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\tif (this.popup.absolute) {\n\t\t// Traverse the offsetParent chain and correct the offset to make it relative to the parent node.\n\t\tfor (var offsetParentDomNode = domNode.offsetParent; offsetParentDomNode; offsetParentDomNode = offsetParentDomNode.offsetParent) {\n\t\t\tleft -= offsetParentDomNode.offsetLeft;\n\t\t\ttop -= offsetParentDomNode.offsetTop;\n\t\t}\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\t// class attribute handled in assignDomNodeClasses()\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\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\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\tthis.popup = Popup.parseCoordinates(state);\n\t// Check if the state matches the location regexp\n\tif(this.popup) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\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} else if(this.type === \"popup\" && this.isOpen && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\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 DEBOUNCE_INTERVAL = 100; // Delay after last scroll event before updating the bound tiddler\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\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\tvar options = {};\n\tif($tw.utils.hop(event.paramObject,\"animationDuration\")) {\n\t\toptions.animationDuration = event.paramObject.animationDuration;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\n\t} else {\n\t\tthis.scrollIntoView(event.target,null,options);\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element,callback,options) {\n\tvar duration = $tw.utils.hop(options,\"animationDuration\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\n\t\tsrcWindow = element ? element.ownerDocument.defaultView : window;\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;\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(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\n\tbaseElement = baseElement || document;\n\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback,options);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\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\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\t// If the scroll position is bound to a tiddler\n\tif(this.scrollableBind) {\n\t\t// After a delay for rendering, scroll to the bound position\n\t\tthis.updateScrollPositionFromBoundTiddler();\n\t\t// Set up event listener\n\t\tthis.currentListener = this.listenerFunction.bind(this);\n\t\tthis.outerDomNode.addEventListener(\"scroll\", this.currentListener);\n\t}\n};\n\nScrollableWidget.prototype.listenerFunction = function(event) {\n\tself = this;\n\tclearTimeout(this.timeout);\n\tthis.timeout = setTimeout(function() {\n\t\tvar existingTiddler = self.wiki.getTiddler(self.scrollableBind),\n\t\t\tnewTiddlerFields = {\n\t\t\t\ttitle: self.scrollableBind,\n\t\t\t\t\"scroll-left\": self.outerDomNode.scrollLeft.toString(),\n\t\t\t\t\"scroll-top\": self.outerDomNode.scrollTop.toString()\n\t\t\t};\n\t\tif(!existingTiddler || (existingTiddler.fields[\"title\"] !== newTiddlerFields[\"title\"]) || (existingTiddler.fields[\"scroll-left\"] !== newTiddlerFields[\"scroll-left\"] || existingTiddler.fields[\"scroll-top\"] !== newTiddlerFields[\"scroll-top\"])) {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(existingTiddler,newTiddlerFields));\n\t\t}\n\t}, DEBOUNCE_INTERVAL);\n}\n\nScrollableWidget.prototype.updateScrollPositionFromBoundTiddler = function() {\n\t// Bail if we're running on the fakedom\n\tif(!this.outerDomNode.scrollTo) {\n\t\treturn;\n\t}\n\tvar tiddler = this.wiki.getTiddler(this.scrollableBind);\n\tif(tiddler) {\n\t\tvar scrollLeftTo = this.outerDomNode.scrollLeft;\n\t\tif(parseFloat(tiddler.fields[\"scroll-left\"]).toString() === tiddler.fields[\"scroll-left\"]) {\n\t\t\tscrollLeftTo = parseFloat(tiddler.fields[\"scroll-left\"]);\n\t\t}\n\t\tvar scrollTopTo = this.outerDomNode.scrollTop;\n\t\tif(parseFloat(tiddler.fields[\"scroll-top\"]).toString() === tiddler.fields[\"scroll-top\"]) {\n\t\t\tscrollTopTo = parseFloat(tiddler.fields[\"scroll-top\"]);\n\t\t}\n\t\tthis.outerDomNode.scrollTo({\n\t\t\ttop: scrollTopTo,\n\t\t\tleft: scrollLeftTo,\n\t\t\tbehavior: \"instant\"\n\t\t})\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.scrollableBind = this.getAttribute(\"bind\");\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\t// If the bound tiddler has changed, update the eventListener and update scroll position\n\tif(changedAttributes[\"bind\"]) {\n\t\tif(this.currentListener) {\n\t\t\tthis.outerDomNode.removeEventListener(\"scroll\", this.currentListener, false);\n\t\t}\n\t\tthis.scrollableBind = this.getAttribute(\"bind\");\n\t\tthis.currentListener = this.listenerFunction.bind(this);\n\t\tthis.outerDomNode.addEventListener(\"scroll\", this.currentListener);\n\t}\n\t// Refresh children\n\tvar result = this.refreshChildren(changedTiddlers);\n\t// If the bound tiddler has changed, update scroll position\n\tif(changedAttributes[\"bind\"] || changedTiddlers[this.getAttribute(\"bind\")]) {\n\t\tthis.updateScrollPositionFromBoundTiddler();\n\t}\n\treturn result;\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\t//Create element\n\tvar domNode = this.document.createElement(\"select\");\n\tif(this.selectClass) {\n\t\tdomNode.className = this.selectClass;\n\t}\n\t// Assign data- attributes\n\tthis.assignAttributes(domNode,{\n\t\tsourcePrefix: \"data-\",\n\t\tdestPrefix: \"data-\"\n\t});\n\tif(this.selectMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\tdomNode.setAttribute(\"size\",this.selectSize);\n\t}\n\tif(this.selectTabindex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.selectTabindex);\n\t}\n\tif(this.selectTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.selectTooltip);\n\t}\n\tthis.parentDomNode.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\tthis.setSelectValue();\n\tif(this.selectFocus == \"yes\") {\n\t\tthis.getSelectDomNode().focus();\n\t}\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.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.selectTabindex = this.getAttribute(\"tabindex\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\tthis.selectFocus = this.getAttribute(\"focus\");\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*/\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.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tooltip || changedAttributes.tabindex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tif(changedAttributes.class) {\n\t\t\tthis.selectClass = this.getAttribute(\"class\");\n\t\t\tthis.getSelectDomNode().setAttribute(\"class\",this.selectClass); \n\t\t}\n\t\tthis.assignAttributes(this.getSelectDomNode(),{\n\t\t\tchangedAttributes: changedAttributes,\n\t\t\tsourcePrefix: \"data-\",\n\t\t\tdestPrefix: \"data-\"\n\t\t});\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\t// If the target tiddler value has changed, just update setting and refresh the children\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/setmultiplevariables.js":{"title":"$:/core/modules/widgets/setmultiplevariables.js","text":"/*\\\ntitle: $:/core/modules/widgets/setmultiplevariables.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to set multiple variables at once from a list of names and a list of values\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 SetMultipleVariablesWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetMultipleVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetMultipleVariablesWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n this.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetMultipleVariablesWidget.prototype.execute = function() {\n // Setup our variables\n this.setVariables();\n // Construct the child widgets\n this.makeChildWidgets();\n};\n\n\nSetMultipleVariablesWidget.prototype.setVariables = function() {\n // Set the variables\n var self = this,\n filterNames = this.getAttribute(\"$names\",\"\"),\n filterValues = this.getAttribute(\"$values\",\"\");\n this.variableNames = [];\n this.variableValues = [];\n if(filterNames && filterValues) {\n this.variableNames = this.wiki.filterTiddlers(filterNames,this);\n this.variableValues = this.wiki.filterTiddlers(filterValues,this);\n $tw.utils.each(this.variableNames,function(varname,index) {\n self.setVariable(varname,self.variableValues[index]);\n });\n }\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetMultipleVariablesWidget.prototype.refresh = function(changedTiddlers) {\n var filterNames = this.getAttribute(\"$names\",\"\"),\n filterValues = this.getAttribute(\"$values\",\"\"),\n variableNames = this.wiki.filterTiddlers(filterNames,this),\n variableValues = this.wiki.filterTiddlers(filterValues,this);\n if(!$tw.utils.isArrayEqual(this.variableNames,variableNames) || !$tw.utils.isArrayEqual(this.variableValues,variableValues)) {\n this.refreshSelf();\n return true;\n }\n return this.refreshChildren(changedTiddlers);\n};\n\nexports[\"setmultiplevariables\"] = SetMultipleVariablesWidget;\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\tif(this.parseTreeNode.isMacroDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,true);\n\t} else if(this.parseTreeNode.isFunctionDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isFunctionDefinition: true});\n\t} else if(this.parseTreeNode.isProcedureDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isProcedureDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\n\t} else if(this.parseTreeNode.isWidgetDefinition) {\n\t\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isWidgetDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\n\t} else {\n\t\tthis.setVariable(this.setName,this.getValue());\n\t}\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);\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);\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/slot.js":{"title":"$:/core/modules/widgets/slot.js","text":"/*\\\ntitle: $:/core/modules/widgets/slot.js\ntype: application/javascript\nmodule-type: widget\n\nWidget for definition of slots within transcluded content. The values provided by the translusion are passed to the slot.\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\tTranscludeWidget = require(\"$:/core/modules/widgets/transclude.js\").transclude;\n\nvar SlotWidget = function(parseTreeNode,options) {\n\t// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSlotWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSlotWidget.prototype.render = function(parent,nextSibling) {\n\t// Call the constructor\n\tWidget.call(this);\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*/\nSlotWidget.prototype.execute = function() {\n\tvar self = this;\n\tthis.slotName = this.getAttribute(\"$name\");\n\tthis.slotDepth = parseInt(this.getAttribute(\"$depth\",\"1\"),10) || 1;\n\t// Find the parent transclusions\n\tvar pointer = this.parentWidget,\n\t\tdepth = this.slotDepth;\n\twhile(pointer) {\n\t\tif(pointer instanceof TranscludeWidget && pointer.hasVisibleSlots()) {\n\t\t\tdepth--;\n\t\t\tif(depth <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tpointer = pointer.parentWidget;\n\t}\n\tvar parseTreeNodes = [{type: \"text\", attributes: {text: {type: \"string\", value: \"Missing slot reference!\"}}}];\n\tif(pointer instanceof TranscludeWidget) {\n\t\t// Get the parse tree nodes comprising the slot contents\n\t\tparseTreeNodes = pointer.getTransclusionSlotFill(this.slotName,this.parseTreeNode.children);\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSlotWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$name\"] || changedAttributes[\"$depth\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.slot = SlotWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/core/modules/widgets/testcase.js":{"title":"$:/core/modules/widgets/testcase.js","text":"/*\\\ntitle: $:/core/modules/widgets/testcase.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a test case\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 TestCaseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTestCaseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTestCaseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create container DOM node\n\tvar domNode = this.document.createElement(\"div\");\n\tthis.domNodes.push(domNode);\n\tparent.insertBefore(domNode,nextSibling);\n\t// Render the children into a hidden DOM node\n\tvar parser = {\n\t\ttree: [{\n\t\t\ttype: \"widget\",\n\t\t\tattributes: {},\n\t\t\torderedAttributes: [],\n\t\t\tchildren: this.parseTreeNode.children || []\n\t\t}]\n\t};\n\tthis.contentRoot = this.wiki.makeWidget(parser,{\n\t\tdocument: $tw.fakeDocument,\n\t\tparentWidget: this\n\t});\n\tthis.contentContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.contentRoot.render(this.contentContainer,null);\n\t// Create a wiki\n\tthis.testcaseWiki = new $tw.Wiki();\n\t// Always load the core plugin\n\tvar loadTiddler = function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.testcaseWiki.addTiddler(tiddler);\n\t\t}\n\t}\n\tloadTiddler(\"$:/core\");\n\tloadTiddler(\"$:/plugins/tiddlywiki/codemirror\");\n\t// Load tiddlers from child data widgets\n\tvar tiddlers = [];\n\tthis.findChildrenDataWidgets(this.contentRoot.children,\"data\",function(widget) {\n\t\tArray.prototype.push.apply(tiddlers,widget.readDataTiddlerValues());\n\t});\n\tvar jsonPayload = JSON.stringify(tiddlers);\n\tthis.testcaseWiki.addTiddlers(tiddlers);\n\t// Unpack plugin tiddlers\n\tthis.testcaseWiki.readPluginInfo();\n\tthis.testcaseWiki.registerPluginTiddlers(\"plugin\");\n\tthis.testcaseWiki.unpackPluginTiddlers();\n\tthis.testcaseWiki.addIndexersToWiki();\n\t// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers\n\tthis.setVariable(\"transclusion\",$tw.utils.hashString(jsonPayload));\n\t// Generate a `payloadTiddlers` variable that contains the payload in JSON format\n\tthis.setVariable(\"payloadTiddlers\",jsonPayload);\n\t// Only run the tests if the testcase output and expected results were specified, and those tiddlers actually exist in the wiki\n\tvar shouldRunTests = false;\n\tif(this.testcaseTestOutput && this.testcaseWiki.tiddlerExists(this.testcaseTestOutput) && this.testcaseTestExpectedResult && this.testcaseWiki.tiddlerExists(this.testcaseTestExpectedResult)) {\n\t\tshouldRunTests = true;\n\t}\n\t// Render the test rendering if required\n\tif(shouldRunTests) {\n\t\tvar testcaseOutputContainer = $tw.fakeDocument.createElement(\"div\");\n\t\tvar testcaseOutputWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTestOutput,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparseAsInline: false,\n\t\t\tparentWidget: this,\n\t\t\tvariables: {\n\t\t\t\tcurrentTiddler: this.testcaseTestOutput\n\t\t\t}\n\t\t});\n\t\ttestcaseOutputWidget.render(testcaseOutputContainer);\n\t}\n\t// Clear changes queue\n\tthis.testcaseWiki.clearTiddlerEventQueue();\n\t// Run the actions if provided\n\tif(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {\n\t\ttestcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));\n\t\ttestcaseOutputWidget.refresh(this.testcaseWiki.changedTiddlers,testcaseOutputContainer);\n\t}\n\t// Set up the test result variables\n\tvar testResult = \"\",\n\t\toutputHTML = \"\",\n\t\texpectedHTML = \"\";\n\tif(shouldRunTests) {\n\t\toutputHTML = testcaseOutputContainer.children[0].innerHTML;\n\t\texpectedHTML = this.testcaseWiki.getTiddlerText(this.testcaseTestExpectedResult);\n\t\tif(outputHTML === expectedHTML) {\n\t\t\ttestResult = \"pass\";\n\t\t} else {\n\t\t\ttestResult = \"fail\";\n\t\t}\n\t\tthis.setVariable(\"outputHTML\",outputHTML);\n\t\tthis.setVariable(\"expectedHTML\",expectedHTML);\n\t\tthis.setVariable(\"testResult\",testResult);\n\t\tthis.setVariable(\"currentTiddler\",this.testcaseTestOutput);\n\t}\n\t// Don't display anything if testHideIfPass is \"yes\" and the tests have passed\n\tif(this.testcaseHideIfPass === \"yes\" && testResult !== \"fail\") {\n\t\treturn;\n\t}\n\t// Render the page root template of the subwiki\n\tvar rootWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTemplate,{\n\t\tdocument: this.document,\n\t\tparseAsInline: false,\n\t\tparentWidget: this\n\t});\n\trootWidget.render(domNode);\n\t// Trap changes in the wiki and refresh the rendering\n\tthis.testcaseWiki.addEventListener(\"change\",function(changes) {\n\t\trootWidget.refresh(changes,domNode);\n\t});\n};\n\n/*\nCompute the internal state of the widget\n*/\nTestCaseWidget.prototype.execute = function() {\n\tthis.testcaseTemplate = this.getAttribute(\"template\",\"$:/core/ui/testcases/DefaultTemplate\");\n\tthis.testcaseTestOutput = this.getAttribute(\"testOutput\");\n\tthis.testcaseTestActions = this.getAttribute(\"testActions\");\n\tthis.testcaseTestExpectedResult = this.getAttribute(\"testExpectedResult\");\n\tthis.testcaseHideIfPass = this.getAttribute(\"testHideIfPass\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTestCaseWidget.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} else {\n\t\treturn this.contentRoot.refresh(changedTiddlers);\n\t}\n};\n\nexports[\"testcase\"] = TestCaseWidget;\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;\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);\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\ttry {\n\t\tthis.renderChildren(parent,nextSibling);\n\t} catch(error) {\n\t\tif(error instanceof $tw.utils.TranscludeRecursionError) {\n\t\t\t// We were infinite looping.\n\t\t\t// We need to try and abort as much of the loop as we can, so we will keep \"throwing\" upward until we find a transclusion that has a different signature.\n\t\t\t// Hopefully that will land us just outside where the loop began. That's where we want to issue an error.\n\t\t\t// Rendering widgets beneath this point may result in a freezing browser if they explode exponentially.\n\t\t\tvar transcludeSignature = this.getVariable(\"transclusion\");\n\t\t\tif(this.getAncestorCount() > $tw.utils.TranscludeRecursionError.MAX_WIDGET_TREE_DEPTH - 50) {\n\t\t\t\t// For the first fifty transcludes we climb up, we simply collect signatures.\n\t\t\t\t// We're assuming that those first 50 will likely include all transcludes involved in the loop.\n\t\t\t\terror.signatures[transcludeSignature] = true;\n\t\t\t} else if(!error.signatures[transcludeSignature]) {\n\t\t\t\t// Now that we're past the first 50, let's look for the first signature that wasn't in the loop. That'll be where we print the error and resume rendering.\n\t\t\t\tthis.children = [this.makeChildWidget({type: \"error\", attributes: {\n\t\t\t\t\t\"$message\": {type: \"string\", value: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t\t}})];\n\t\t\t\tthis.renderChildren(parent,nextSibling);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthrow error;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our attributes, string parameters, and slot values into properties of the widget object\n\tthis.collectAttributes();\n\tthis.collectStringParameters();\n\tthis.collectSlotFillParameters();\n\t// Determine whether we're being used in inline or block mode\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\t// Set 'thisTiddler'\n\tthis.setVariable(\"thisTiddler\",this.transcludeTitle);\n\tvar parseTreeNodes, target;\n\t// Process the transclusion according to the output type\n\tswitch(this.transcludeOutput || \"text/html\") {\n\t\tcase \"text/html\":\n\t\t\t// Return the parse tree nodes of the target\n\t\t\ttarget = this.parseTransclusionTarget(parseAsInline);\n\t\t\tthis.parseAsInline = target.parseAsInline;\n\t\t\tparseTreeNodes = target.parseTreeNodes;\n\t\t\tbreak;\n\t\tcase \"text/raw\":\n\t\t\t// Just return the raw text\n\t\t\ttarget = this.getTransclusionTarget();\n\t\t\tparseTreeNodes = [{type: \"text\", text: target.text}];\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// \"text/plain\" is the plain text result of wikifying the text\n\t\t\ttarget = this.parseTransclusionTarget(parseAsInline);\n\t\t\tvar widgetNode = this.wiki.makeWidget(target.parser,{\n\t\t\t\tparentWidget: this,\n\t\t\t\tdocument: $tw.fakeDocument\n\t\t\t});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tparseTreeNodes = [{type: \"text\", text: container.textContent}];\n\t\t\tbreak;\n\t}\n\tthis.sourceText = target.text;\n\tthis.parserType = target.type;\n\t// Set the legacy transclusion context variables only if we're not transcluding a variable\n\tif(!this.transcludeVariable) {\n\t\tvar recursionMarker = this.makeRecursionMarker();\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCollect the attributes we need, in the process determining whether we're being used in legacy mode\n*/\nTranscludeWidget.prototype.collectAttributes = function() {\n\tvar self = this;\n\t// Detect legacy mode\n\tthis.legacyMode = true;\n\t$tw.utils.each(this.attributes,function(value,name) {\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tself.legacyMode = false;\n\t\t}\n\t});\n\t// Get the attributes for the appropriate mode\n\tif(this.legacyMode) {\n\t\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\t\tthis.transcludeField = this.getAttribute(\"field\");\n\t\tthis.transcludeIndex = this.getAttribute(\"index\");\n\t\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t} else {\n\t\tthis.transcludeVariable = this.getAttribute(\"$variable\");\n\t\tthis.transcludeVariableIsFunction = false;\n\t\tthis.transcludeType = this.getAttribute(\"$type\");\n\t\tthis.transcludeOutput = this.getAttribute(\"$output\",\"text/html\");\n\t\tthis.transcludeTitle = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.transcludeSubTiddler = this.getAttribute(\"$subtiddler\");\n\t\tthis.transcludeField = this.getAttribute(\"$field\");\n\t\tthis.transcludeIndex = this.getAttribute(\"$index\");\n\t\tthis.transcludeMode = this.getAttribute(\"$mode\");\n\t\tthis.recursionMarker = this.getAttribute(\"$recursionMarker\",\"yes\");\n\t}\n};\n\n/*\nCollect string parameters\n*/\nTranscludeWidget.prototype.collectStringParameters = function() {\n\tvar self = this;\n\tthis.stringParametersByName = Object.create(null);\n\tif(!this.legacyMode) {\n\t\t$tw.utils.each(this.attributes,function(value,name) {\n\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\tif(name.charAt(1) === \"$\") {\n\t\t\t\t\t// Attributes starting $$ represent parameters starting with a single $\n\t\t\t\t\tname = name.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Attributes starting with a single $ are reserved for the widget\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.stringParametersByName[name] = value;\n\t\t});\n\t}\n};\n\n/*\nCollect slot value parameters\n*/\nTranscludeWidget.prototype.collectSlotFillParameters = function() {\n\tvar self = this;\n\tthis.slotFillParseTrees = Object.create(null);\n\tif(this.legacyMode) {\n\t\tthis.slotFillParseTrees[\"ts-missing\"] = this.parseTreeNode.children;\n\t} else {\n\t\tthis.slotFillParseTrees[\"ts-raw\"] = this.parseTreeNode.children;\n\t\tvar noFillWidgetsFound = true,\n\t\t\tsearchParseTreeNodes = function(nodes) {\n\t\t\t\t$tw.utils.each(nodes,function(node) {\n\t\t\t\t\tif(node.type === \"fill\") {\n\t\t\t\t\t\tif(node.attributes[\"$name\"] && node.attributes[\"$name\"].type === \"string\") {\n\t\t\t\t\t\t\tvar slotValueName = node.attributes[\"$name\"].value;\n\t\t\t\t\t\t\tself.slotFillParseTrees[slotValueName] = node.children || [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnoFillWidgetsFound = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsearchParseTreeNodes(node.children);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\tsearchParseTreeNodes(this.parseTreeNode.children);\n\t\tif(noFillWidgetsFound) {\n\t\t\tthis.slotFillParseTrees[\"ts-missing\"] = this.parseTreeNode.children;\n\t\t}\n\t}\n};\n\n/*\nGet transcluded details as an object {text:,type:}\n*/\nTranscludeWidget.prototype.getTransclusionTarget = function() {\n\tvar self = this;\n\tvar text;\n\t// Return the text and type of the target\n\tif(this.hasAttribute(\"$variable\")) {\n\t\tif(this.transcludeVariable) {\n\t\t\t// Transcluding a variable\n\t\t\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()});\n\t\t\tthis.transcludeVariableIsFunction = variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition;\n\t\t\ttext = variableInfo.text;\n\t\t\tthis.transcludeFunctionResult = text;\n\t\t\treturn {\n\t\t\t\ttext: variableInfo.text,\n\t\t\t\ttype: this.transcludeType\n\t\t\t};\n\t\t}\n\t} else {\n\t\t// Transcluding a text reference\n\t\tvar parserInfo = this.wiki.getTextReferenceParserInfo(\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\tsubTiddler: this.transcludeSubTiddler,\n\t\t\t\t\t\t\tdefaultType: this.transcludeType\n\t\t\t\t\t\t});\n\t\treturn {\n\t\t\ttext: parserInfo.text,\n\t\t\ttype: parserInfo.type\n\t\t};\n\t}\n};\n\n/*\nGet transcluded parse tree nodes as an object {text:,type:,parseTreeNodes:,parseAsInline:}\n*/\nTranscludeWidget.prototype.parseTransclusionTarget = function(parseAsInline) {\n\tvar self = this;\n\tvar parser;\n\t// Get the parse tree\n\tif(this.hasAttribute(\"$variable\")) {\n\t\tif(this.transcludeVariable) {\n\t\t\t// Transcluding a variable\n\t\t\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()}),\n\t\t\t\tsrcVariable = variableInfo && variableInfo.srcVariable;\n\t\t\tif(srcVariable && srcVariable.isFunctionDefinition) {\n\t\t\t\tthis.transcludeVariableIsFunction = true;\n\t\t\t\tthis.transcludeFunctionResult = (variableInfo.resultList ? variableInfo.resultList[0] : variableInfo.text) || \"\";\n\t\t\t}\n\t\t\tif(variableInfo.text) {\n\t\t\t\tif(srcVariable && srcVariable.isFunctionDefinition) {\n\t\t\t\t\tparser = {\n\t\t\t\t\t\ttree: [{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\n\t\t\t\t\t\t}],\n\t\t\t\t\t\tsource: this.transcludeFunctionResult,\n\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\"\n\t\t\t\t\t};\n\t\t\t\t\tif(parseAsInline) {\n\t\t\t\t\t\tparser.tree[0] = {\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparser.tree[0] = {\n\t\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\t\ttag: \"p\",\n\t\t\t\t\t\t\tchildren: [{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: this.transcludeFunctionResult\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\tvar cacheKey = (parseAsInline ? \"inlineParser\" : \"blockParser\") + (this.transcludeType || \"\");\n\t\t\t\t\tif(variableInfo.isCacheable && srcVariable[cacheKey]) {\n\t\t\t\t\t\tparser = srcVariable[cacheKey];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparser = this.wiki.parseText(this.transcludeType,variableInfo.text || \"\",{parseAsInline: parseAsInline, configTrimWhiteSpace: srcVariable && srcVariable.configTrimWhiteSpace});\n\t\t\t\t\t\tif(variableInfo.isCacheable) {\n\t\t\t\t\t\t\tsrcVariable[cacheKey] = parser;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parser) {\n\t\t\t\t\t// Add parameters widget for procedures and custom widgets\n\t\t\t\t\tif(srcVariable && (srcVariable.isProcedureDefinition || srcVariable.isWidgetDefinition)) {\n\t\t\t\t\t\tparser = {\n\t\t\t\t\t\t\ttree: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"parameters\",\n\t\t\t\t\t\t\t\t\tchildren: parser.tree\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsource: parser.source,\n\t\t\t\t\t\t\ttype: parser.type\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$tw.utils.each(srcVariable.params,function(param) {\n\t\t\t\t\t\t\tvar name = param.name;\n\t\t\t\t\t\t\t// Parameter names starting with dollar must be escaped to double dollars\n\t\t\t\t\t\t\tif(name.charAt(0) === \"$\") {\n\t\t\t\t\t\t\t\tname = \"$\" + name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],name,param[\"default\"])\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(srcVariable && !srcVariable.isFunctionDefinition) {\n\t\t\t\t\t\t// For macros and ordinary variables, wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\t\t\t\t\tparser = {\n\t\t\t\t\t\t\ttree: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"vars\",\n\t\t\t\t\t\t\t\t\tchildren: parser.tree\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsource: parser.source,\n\t\t\t\t\t\t\ttype: parser.type\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],\"__\" + param.name + \"__\",param.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} else {\n\t\t// Transcluding a text reference\n\t\tparser = 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\tdefaultType: this.transcludeType\n\t\t\t\t\t\t});\n\t}\n\t// Return the parse tree\n\treturn {\n\t\tparser: parser,\n\t\tparseTreeNodes: parser ? parser.tree : (this.slotFillParseTrees[\"ts-missing\"] || []),\n\t\tparseAsInline: parseAsInline,\n\t\ttext: parser && parser.source,\n\t\ttype: parser && parser.type\n\t};\n};\n\n/*\nFetch all the string parameters as an ordered array of {name:, value:} where the name is optional\n*/\nTranscludeWidget.prototype.getOrderedTransclusionParameters = function() {\n\tvar result = [];\n\t// Collect the parameters\n\tfor(var name in this.stringParametersByName) {\n\t\tvar value = this.stringParametersByName[name];\n\t\tresult.push({name: name, value: value});\n\t}\n\t// Sort numerical parameter names first\n\tresult.sort(function(a,b) {\n\t\tvar aIsNumeric = !isNaN(a.name),\n\t\t\tbIsNumeric = !isNaN(b.name);\n\t\tif(aIsNumeric && bIsNumeric) {\n\t\t\treturn a.name - b.name;\n\t\t} else if(aIsNumeric) {\n\t\t\treturn -1;\n\t\t} else if(bIsNumeric) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn a.name === b.name ? 0 : (a.name < b.name ? -1 : 1);\n\t\t}\n\t});\n\t// Remove names from numerical parameters\n\t$tw.utils.each(result,function(param,index) {\n\t\tif(!isNaN(param.name)) {\n\t\t\tdelete param.name;\n\t\t}\n\t});\n\treturn result;\n};\n\n/*\nFetch the value of a parameter\n*/\nTranscludeWidget.prototype.getTransclusionParameter = function(name,index,defaultValue) {\n\tif(name in this.stringParametersByName) {\n\t\treturn this.stringParametersByName[name];\n\t} else {\n\t\tvar name = \"\" + index;\n\t\tif(name in this.stringParametersByName) {\n\t\t\treturn this.stringParametersByName[name];\n\t\t}\n\t}\n\treturn defaultValue;\n};\n\n/*\nGet one of the special parameters to be provided by the parameters widget\n*/\nTranscludeWidget.prototype.getTransclusionMetaParameters = function() {\n\tvar self = this;\n\treturn {\n\t\t\"parseMode\": function() {\n\t\t\treturn self.parseAsInline ? \"inline\" : \"block\";\n\t\t},\n\t\t\"parseTreeNodes\": function() {\n\t\t\treturn JSON.stringify(self.parseTreeNode.children || []);\n\t\t},\n\t\t\"slotFillParseTreeNodes\": function() {\n\t\t\treturn JSON.stringify(self.slotFillParseTrees);\n\t\t},\n\t\t\"params\": function() {\n\t\t\treturn JSON.stringify(self.stringParametersByName);\n\t\t}\n\t};\n};\n\n/*\nFetch the value of a slot\n*/\nTranscludeWidget.prototype.getTransclusionSlotFill = function(name,defaultParseTreeNodes) {\n\tif(name && this.slotFillParseTrees[name] && this.slotFillParseTrees[name].length > 0) {\n\t\treturn this.slotFillParseTrees[name];\n\t} else {\n\t\treturn defaultParseTreeNodes || [];\n\t}\n};\n\n/*\nReturn whether this transclusion should be visible to the slot widget\n*/\nTranscludeWidget.prototype.hasVisibleSlots = function() {\n\treturn this.getAttribute(\"$fillignore\",\"no\") === \"no\";\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\nTranscludeWidget.prototype.parserNeedsRefresh = function() {\n\t// Doesn't need to consider transcluded variables because a parent variable can't change once a widget has been created\n\tvar parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler});\n\treturn (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType)\n};\n\nTranscludeWidget.prototype.functionNeedsRefresh = function() {\n\tvar oldResult = this.transcludeFunctionResult;\n\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()});\n\tvar newResult = (variableInfo.resultList ? variableInfo.resultList[0] : variableInfo.text) || \"\";\n\treturn oldResult !== newResult;\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(($tw.utils.count(changedAttributes) > 0) || (this.transcludeVariableIsFunction && this.functionNeedsRefresh()) || (!this.transcludeVariable && changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\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// Initialise\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = new Widget();\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($tw.utils.count(changedAttributes) > 0) {\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 \"htmltextencoded\":\n\t\t\tthis.text = this.getValueAsHtmlTextEncoded();\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);\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];\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.getValueAsHtmlTextEncoded = function() {\n\treturn $tw.utils.htmlTextEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn $tw.utils.encodeURIComponentExtended(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn $tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(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;\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.variables = Object.create(this.parentWidget ? this.parentWidget.variables : null);\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)\noptions includes:\n\tisProcedureDefinition: true if the variable is set via a \\procedure pragma (and hence should not have variable substitution performed)\n\tisFunctionDefinition: true if the variable is set via a \\function pragma (and hence should not have variable substitution performed)\n\tisWidgetDefinition: true if the variable is set via a \\widget pragma (and hence should not have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition,options) {\n\toptions = options || {};\n\tthis.variables[name] = {\n\t\tvalue: value,\n\t\tparams: params,\n\t\tisMacroDefinition: !!isMacroDefinition,\n\t\tisFunctionDefinition: !!options.isFunctionDefinition,\n\t\tisProcedureDefinition: !!options.isProcedureDefinition,\n\t\tisWidgetDefinition: !!options.isWidgetDefinition,\n\t\tconfigTrimWhiteSpace: !!options.configTrimWhiteSpace\n\t};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\n\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\nsource: optional source iterator for evaluating function invocations\nallowSelfAssigned: if true, includes the current widget in the context chain instead of just the parent\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} or {value:} of parameters to be applied\ntext: text of variable, with parameters properly substituted\nresultList: result of variable evaluation as an array\nsrcVariable: reference to the object defining the variable\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tactualParams = options.params || [],\n\t\tvariable;\n\tif(options.allowSelfAssigned) {\n\t\tvariable = this.variables[name];\n\t} else {\n\t\tvariable = this.parentWidget && this.parentWidget.variables[name];\n\t}\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(variable) {\n\t\tvar originalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = [],\n\t\t\tresultList = [value];\n\t\t// Only substitute parameter and variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tparams = self.resolveVariableParameters(variable.params,actualParams);\n\t\t\t// Substitute any parameters specified in the definition\n\t\t\t$tw.utils.each(params,function(param) {\n\t\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t\t});\n\t\t\tvalue = self.substituteVariableReferences(value,options);\n\t\t\tresultList = [value];\n\t\t} else if(variable.isFunctionDefinition) {\n\t\t\t// Function evaluations\n\t\t\tparams = self.resolveVariableParameters(variable.params,actualParams);\n\t\t\tvar variables = options.variables || Object.create(null);\n\t\t\t// Apply default parameter values\n\t\t\t$tw.utils.each(variable.params,function(param,index) {\n\t\t\t\tif(param[\"default\"]) {\n\t\t\t\t\tvariables[param.name] = param[\"default\"];\n\t\t\t\t}\n\t\t\t});\n\t\t\t// Parameters are an array of {value:} or {name:, value:} pairs\n\t\t\t$tw.utils.each(params,function(param) {\n\t\t\t\tvariables[param.name] = param.value;\n\t\t\t});\n\t\t\tresultList = this.wiki.filterTiddlers(value,this.makeFakeWidgetWithVariables(variables),options.source);\n\t\t\tvalue = resultList[0] || \"\";\n\t\t} else {\n\t\t\tparams = variable.params;\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tresultList: resultList,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\tvar text = this.evaluateMacroModule(name,actualParams);\n\tif(text === undefined) {\n\t\ttext = options.defaultValue;\n\t}\n\treturn {\n\t\ttext: text,\n\t\tresultList: [text]\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\n/*\nMaps actual parameters onto formal parameters, returning an array of {name:,value:} objects\nformalParams - Array of {name:,default:} (default value is optional)\nactualParams - Array of string values or {name:,value:} (name is optional)\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(typeof actualParams[m] !== \"string\" && 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\tvar param = actualParams[nextAnonParameter++];\n\t\t\tparamValue = typeof param === \"string\" ? param : param.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,options) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn options.variables && options.variables[p1] || (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/*\nMake a fake widget with specified variables, suitable for variable lookup in filters\n*/\nWidget.prototype.makeFakeWidgetWithVariables = function(variables) {\n\tvar self = this,\n\t\tvariables = variables || {};\n\treturn {\n\t\tgetVariable: function(name,opts) {\n\t\t\tif($tw.utils.hop(variables,name)) {\n\t\t\t\treturn variables[name];\n\t\t\t} else {\n\t\t\t\topts = opts || {};\n\t\t\t\topts.variables = variables;\n\t\t\t\treturn self.getVariable(name,opts);\n\t\t\t};\n\t\t},\n\t\tgetVariableInfo: function(name,opts) {\n\t\t\tif($tw.utils.hop(variables,name)) {\n\t\t\t\treturn {\n\t\t\t\t\ttext: variables[name]\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\topts = opts || {};\n\t\t\t\topts.variables = $tw.utils.extend({},variables,opts.variables);\n\t\t\t\treturn self.getVariableInfo(name,opts);\n\t\t\t};\n\t\t},\n\t\tmakeFakeWidgetWithVariables: self.makeFakeWidgetWithVariables,\n\t\tresolveVariableParameters: self.resolveVariableParameters,\n\t\twiki: self.wiki\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.\nOptions include:\nfilterFn: only include attributes where filterFn(name) returns true\n*/\nWidget.prototype.computeAttributes = function(options) {\n\toptions = options || {};\n\tvar changedAttributes = {},\n\t\tself = this;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(options.filterFn) {\n\t\t\tif(!options.filterFn(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tvar value = self.computeAttribute(attribute);\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\nWidget.prototype.computeAttribute = function(attribute) {\n\tvar self = this,\n\t\tvalue;\n\tif(attribute.type === \"filtered\") {\n\t\tvalue = this.wiki.filterTiddlers(attribute.filter,this)[0] || \"\";\n\t} else if(attribute.type === \"indirect\") {\n\t\tvalue = this.wiki.getTextReference(attribute.textReference,\"\",this.getVariable(\"currentTiddler\")) || \"\";\n\t} else if(attribute.type === \"macro\") {\n\t\tvar variableInfo = this.getVariableInfo(attribute.value.name,{params: attribute.value.params});\n\t\tvalue = variableInfo.text;\n\t} else if(attribute.type === \"substituted\") {\n\t\tvalue = this.wiki.getSubstitutedText(attribute.rawValue,this) || \"\";\n\t} else { // String attribute\n\t\tvalue = attribute.value;\n\t}\n\treturn value;\n};\n\n/*\nCheck for the presence of an evaluated attribute on the widget. Note that attributes set to a missing variable (ie attr=<<missing>>) will be treated as missing\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nCheck for the presence of a raw attribute on the widget parse tree node. Note that attributes set to a missing variable (ie attr=<<missing>>) will NOT be treated as missing\n*/\nWidget.prototype.hasParseTreeNodeAttribute = function(name) {\n\treturn $tw.utils.hop(this.parseTreeNode.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 common attributes of the widget to a domNode\noptions include:\nsourcePrefix: prefix of attributes that are to be directly assigned (defaults to the empty string meaning all attributes)\ndestPrefix: prefix to be applied to attribute names that are to be directly assigned (defaults to the emtpy string which means no prefix is added)\nchangedAttributes: hashmap by attribute name of attributes to process (if missing, process all attributes)\nexcludeEventAttributes: ignores attributes whose name would begin with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tchangedAttributes = options.changedAttributes || this.attributes,\n\t\tsourcePrefix = options.sourcePrefix || \"\",\n\t\tdestPrefix = options.destPrefix || \"\",\n\t\tEVENT_ATTRIBUTE_PREFIX = \"on\";\n\tvar assignAttribute = function(name,value) {\n\t\t// Process any CSS custom properties\n\t\tif(name.substr(0,2) === \"--\" && name.length > 2) {\n\t\t\tdomNode.style.setProperty(name,value);\n\t\t\treturn;\n\t\t}\n\t\t// Process any style attributes before considering sourcePrefix and destPrefix\n\t\tif(name.substr(0,6) === \"style.\" && name.length > 6) {\n\t\t\tdomNode.style[$tw.utils.unHyphenateCss(name.substr(6))] = value;\n\t\t\treturn;\n\t\t}\n\t\t// Check if the sourcePrefix is a match\n\t\tif(name.substr(0,sourcePrefix.length) === sourcePrefix) {\n\t\t\tname = destPrefix + name.substr(sourcePrefix.length);\n\t\t} else {\n\t\t\tvalue = undefined;\n\t\t}\n\t\t// Check for excluded attribute names\n\t\tif(options.excludeEventAttributes && name.substr(0,2).toLowerCase() === EVENT_ATTRIBUTE_PREFIX) {\n\t\t\tvalue = undefined;\n\t\t}\n\t\tif(value !== undefined) {\n\t\t\t// Handle the xlink: namespace\n\t\t\tvar namespace = null;\n\t\t\tif(name.substr(0,6) === \"xlink:\" && name.length > 6) {\n\t\t\t\tnamespace = \"http://www.w3.org/1999/xlink\";\n\t\t\t\tname = name.substr(6);\n\t\t\t}\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\tdomNode.setAttributeNS(namespace,name,value);\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t};\n\t// If the parse tree node has the orderedAttributes property then use that order\n\tif(this.parseTreeNode.orderedAttributes) {\n\t\t$tw.utils.each(this.parseTreeNode.orderedAttributes,function(attribute,index) {\n\t\t\tif(attribute.name in changedAttributes) {\n\t\t\t\tassignAttribute(attribute.name,self.getAttribute(attribute.name));\n\t\t\t}\n\t\t});\n\t// Otherwise update each changed attribute irrespective of order\n\t} else {\n\t\t$tw.utils.each(changedAttributes,function(value,name) {\n\t\t\tassignAttribute(name,self.getAttribute(name));\n\t\t});\t\n\t}\n};\n\n/*\nGet the number of ancestor widgets for this widget\n*/\nWidget.prototype.getAncestorCount = function() {\n\tif(this.ancestorCount === undefined) {\n\t\tif(this.parentWidget) {\n\t\t\tthis.ancestorCount = this.parentWidget.getAncestorCount() + 1;\n\t\t} else {\n\t\t\tthis.ancestorCount = 0;\n\t\t}\n\t}\n\treturn this.ancestorCount;\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes,options) {\n\toptions = options || {};\n\tthis.children = [];\n\tvar self = this;\n\t// Check for too much recursion\n\tif(this.getAncestorCount() > $tw.utils.TranscludeRecursionError.MAX_WIDGET_TREE_DEPTH) {\n\t\tthrow new $tw.utils.TranscludeRecursionError();\n\t} else {\n\t\t// Create set variable widgets for each variable\n\t\t$tw.utils.each(options.variables,function(value,name) {\n\t\t\tvar setVariableWidget = {\n\t\t\t\ttype: \"set\",\n\t\t\t\tattributes: {\n\t\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t\t},\n\t\t\t\tchildren: parseTreeNodes\n\t\t\t};\n\t\t\tparseTreeNodes = [setVariableWidget];\n\t\t});\n\t\t// Create the child widgets\n\t\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\t\tself.children.push(self.makeChildWidget(childNode));\n\t\t});\n\t}\n};\n\n/*\nConstruct the widget object for a parse tree node\noptions include:\n\tvariables: optional hashmap of variables to wrap around the widget\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode,options) {\n\tvar self = this;\n\toptions = options || {};\n\t// Check whether this node type is defined by a custom widget definition\n\tvar variableDefinitionName = \"$\" + parseTreeNode.type;\n\tif(this.variables[variableDefinitionName]) {\n\t\tvar isOverrideable = function() {\n\t\t\t\t// Widget is overrideable if its name contains a period, or if it is an existing JS widget and we're not in safe mode\n\t\t\t\treturn parseTreeNode.type.indexOf(\".\") !== -1 || (!!self.widgetClasses[parseTreeNode.type] && !$tw.safeMode);\n\t\t\t};\n\t\tif(!parseTreeNode.isNotRemappable && isOverrideable()) { \n\t\t\tvar variableInfo = this.getVariableInfo(variableDefinitionName,{allowSelfAssigned: true});\n\t\t\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.value && variableInfo.srcVariable.isWidgetDefinition) {\n\t\t\t\tvar newParseTreeNode = {\n\t\t\t\t\ttype: \"transclude\",\n\t\t\t\t\tchildren: parseTreeNode.children,\n\t\t\t\t\tisBlock: parseTreeNode.isBlock\n\t\t\t\t};\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,\"$variable\",variableDefinitionName);\n\t\t\t\t$tw.utils.each(parseTreeNode.attributes,function(attr,name) {\n\t\t\t\t\t// If the attribute starts with a dollar then add an extra dollar so that it doesn't clash with the $xxx attributes of transclude\n\t\t\t\t\tname = name.charAt(0) === \"$\" ? \"$\" + name : name;\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,$tw.utils.extend({},attr,{name: name}));\n\t\t\t\t});\n\t\t\t\tparseTreeNode = newParseTreeNode;\n\t\t\t}\n\t\t}\n\t}\n\t// Get the widget class for this node type\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\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\t\tparseTreeNode\n\t\t\t]\n\t\t};\n\t\tparseTreeNode = setVariableWidget;\n\t});\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\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\tevent.widget = event.widget || this;\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\tchildIsActionWidget = !!child.invokeAction,\n\t\t\tactionRefreshPolicy = child.getVariable(\"tv-action-refresh-policy\"); // Default is \"once\"\n\t\t// Refresh the child if required\n\t\tif(childIsActionWidget || actionRefreshPolicy === \"always\") {\n\t\t\tchild.refreshSelf();\n\t\t}\n\t\t// Invoke the child if it is an action widget\n\t\tif(childIsActionWidget) {\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\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\n/*\nFind child <$data> widgets recursively. The tag name allows aliased versions of the widget to be found too\n*/\nWidget.prototype.findChildrenDataWidgets = function(children,tag,callback) {\n\tvar self = this;\n\t$tw.utils.each(children,function(child) {\n\t\tif(child.dataWidgetTag === tag) {\n\t\t\tcallback(child);\n\t\t}\n\t\tif(child.children) {\n\t\t\tself.findChildrenDataWidgets(child.children,tag,callback);\n\t\t}\n\t});\n};\n\n/*\nEvaluate a variable with parameters. This is a static convenience method that attempts to evaluate a variable as a function, returning an array of strings\n*/\nWidget.evaluateVariable = function(widget,name,options) {\n\tvar result;\n\tif(widget.getVariableInfo) {\n\t\tvar variableInfo = widget.getVariableInfo(name,options);\n\t\tresult = variableInfo.resultList || [variableInfo.text];\n\t} else {\n\t\tresult = [widget.getVariable(name)];\n\t}\n\treturn result;\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;\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\t\tprocessList = function(listField) {\n\t\t\t\t\t\tif(listField && listField.indexOf(fromTitle) !== -1) {\n\t\t\t\t\t\t\t// Remove any existing instances of the toTitle\n\t\t\t\t\t\t\tvar p = listField.indexOf(toTitle);\n\t\t\t\t\t\t\twhile(p !== -1) {\n\t\t\t\t\t\t\t\tlistField.splice(p,1);\n\t\t\t\t\t\t\t\tp = listField.indexOf(toTitle);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Replace the fromTitle with toTitle\n\t\t\t\t\t\t\t$tw.utils.each(listField,function (title,index) {\n\t\t\t\t\t\t\t\tif(title === fromTitle) {\n\t\t\t\t\t\t\t\t\tlistField[index] = toTitle;\n\t\t\t\t\t\t\t\t\tisModified = true;\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\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\tprocessList(tags);\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\tprocessList(list);\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 || defaultText;\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,{},{suppressTimestamp: options.suppressTimestamp});\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);\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\noptions.prefix must be a string\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar title = baseTitle,\n\t\ttemplate = options.template || \"\",\n\t\t// test if .startCount is a positive integer. If not set to 0\n\t\tc = (parseInt(options.startCount,10) > 0) ? parseInt(options.startCount,10) : 0,\n\t\tprefix = (typeof(options.prefix) === \"string\") ? options.prefix : \" \";\n\n\tif (template) {\n\t\t// \"count\" is important to avoid an endless loop in while(...)!!\n\t\ttemplate = (/\\$count:?(\\d+)?\\$/i.test(template)) ? template : template + \"$count$\";\n\t\t// .formatTitleString() expects strings as input\n\t\ttitle = $tw.utils.formatTitleString(template,{\"base\":baseTitle,\"separator\":prefix,\"counter\":c+\"\"});\n\t\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\t\ttitle = $tw.utils.formatTitleString(template,{\"base\":baseTitle,\"separator\":prefix,\"counter\":(++c)+\"\"});\n\t\t}\n\t} else {\n\t\tif (c > 0) {\n\t\t\ttitle = baseTitle + prefix + c;\n\t\t}\n\t\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\t\ttitle = baseTitle + prefix + (++c);\n\t\t}\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.isVolatileTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/volatile/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\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) {\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\tif(sortField === \"title\") {\n\t\tif(!isNumeric && !isAlphaNumeric) {\n\t\t\tif(isCaseSensitive) {\n\t\t\t\tif(isDescending) {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn b.localeCompare(a);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn a.localeCompare(b);\n\t\t\t\t\t});\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\tif(isDescending) {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn b.toLowerCase().localeCompare(a.toLowerCase());\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttitles.sort(function(a,b) {\n\t\t\t\t\t\treturn a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t\t\t\t});\n\t\t\t\t}\t\n\t\t\t}\n\t\t} else {\n\t\t\ttitles.sort(function(a,b) {\n\t\t\t\tvar x,y;\n\t\t\t\tif(isNumeric) {\n\t\t\t\t\tx = Number(a);\n\t\t\t\t\ty = Number(b);\n\t\t\t\t\tif(isNaN(x)) {\n\t\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t\t// If neither value is a number then fall through to a textual comparison\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn isDescending ? -1 : 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t\treturn isDescending ? 1 : -1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn isDescending ? y - x : x - y;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(isAlphaNumeric) {\n\t\t\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t\t}\n\t\t\t\tif(!isCaseSensitive) {\n\t\t\t\t\ta = a.toLowerCase();\n\t\t\t\t\tb = b.toLowerCase();\n\t\t\t\t}\n\t\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t\t});\n\t\t}\n\t} else {\n\t\ttitles.sort(function(a,b) {\n\t\t\tvar x,y;\n\t\t\tif(sortField !== \"title\") {\n\t\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\t\tif(tiddlerA) {\n\t\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\ta = \"\";\n\t\t\t\t}\n\t\t\t\tif(tiddlerB) {\n\t\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t\t} else {\n\t\t\t\t\tb = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(isNumeric) {\n\t\t\t\tx = Number(a);\n\t\t\t\ty = Number(b);\n\t\t\t\tif(isNaN(x)) {\n\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\t// If neither value is a number then fall through to a textual comparison\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn isDescending ? -1 : 1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(isNaN(y)) {\n\t\t\t\t\t\treturn isDescending ? 1 : -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn isDescending ? y - x : x - y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(Object.prototype.toString.call(a) === \"[object Date]\" && Object.prototype.toString.call(b) === \"[object Date]\") {\n\t\t\t\treturn isDescending ? b - a : a - b;\n\t\t\t}\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(isAlphaNumeric) {\n\t\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t\t}\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\tbackIndexer = this.getIndexer(\"BackIndexer\"),\n\t\tbacklinks = backIndexer && backIndexer.subIndexers.link.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\n/*\nReturn an array of tiddler titles that are directly transcluded within the given parse tree. `title` is the tiddler being parsed, we will ignore its self-referential transclusions, only return\n */\nexports.extractTranscludes = function(parseTreeRoot, title) {\n\t// Count up the transcludes\n\tvar transcludes = [],\n\t\tcheckParseTree = function(parseTree, parentNode) {\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 === \"transclude\") {\n\t\t\t\t\tif(parseTreeNode.attributes.$tiddler) {\n\t\t\t\t\t\tif(parseTreeNode.attributes.$tiddler.type === \"string\") {\n\t\t\t\t\t\t\tvar value;\n\t\t\t\t\t\t\t// if it is Transclusion with Templates like `{{Index||$:/core/ui/TagTemplate}}`, the `$tiddler` will point to the template. We need to find the actual target tiddler from parent node\n\t\t\t\t\t\t\tif(parentNode && parentNode.type === \"tiddler\" && parentNode.attributes.tiddler && parentNode.attributes.tiddler.type === \"string\") {\n\t\t\t\t\t\t\t\t// Empty value (like `{{!!field}}`) means self-referential transclusion.\n\t\t\t\t\t\t\t\tvalue = parentNode.attributes.tiddler.value || title;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvalue = parseTreeNode.attributes.$tiddler.value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(parseTreeNode.attributes.tiddler) {\n\t\t\t\t\t\tif (parseTreeNode.attributes.tiddler.type === \"string\") {\n\t\t\t\t\t\t\t// Old transclude widget usage\n\t\t\t\t\t\t\tvalue = parseTreeNode.attributes.tiddler.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(parseTreeNode.attributes.$field && parseTreeNode.attributes.$field.type === \"string\") {\n\t\t\t\t\t\t// Empty value (like `<$transclude $field='created'/>`) means self-referential transclusion. \n\t\t\t\t\t\tvalue = title;\n\t\t\t\t\t} else if(parseTreeNode.attributes.field && parseTreeNode.attributes.field.type === \"string\") {\n\t\t\t\t\t\t// Old usage with Empty value (like `<$transclude field='created'/>`)\n\t\t\t\t\t\tvalue = title;\n\t\t\t\t\t}\n\t\t\t\t\t// Deduplicate the result.\n\t\t\t\t\tif(value && transcludes.indexOf(value) === -1) {\n\t\t\t\t\t\t$tw.utils.pushTop(transcludes,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,parseTreeNode);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn transcludes;\n};\n\n\n/*\nReturn an array of tiddler titles that are transcluded from the specified tiddler\n*/\nexports.getTiddlerTranscludes = function(title) {\n\tvar self = this;\n\t// We'll cache the transcludes so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"transcludes\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\t// this will ignore self-referential transclusions from `title`\n\t\t\treturn self.extractTranscludes(parser.tree,title);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that transclude to the specified tiddler\n*/\nexports.getTiddlerBacktranscludes = function(targetTitle) {\n\tvar self = this,\n\t\tbackIndexer = this.getIndexer(\"BackIndexer\"),\n\t\tbacktranscludes = backIndexer && backIndexer.subIndexers.transclude.lookup(targetTitle);\n\n\tif(!backtranscludes) {\n\t\tbacktranscludes = [];\n\t}\n\treturn backtranscludes;\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 wiki = this;\n\tvar listings = this.getGlobalCache(\"listings-\" + fieldName,function() {\n\t\tvar listings = Object.create(null);\n\t\twiki.each(function(tiddler,title) {\n\t\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\t\tif(list) {\n\t\t\t\tfor(var i = 0; i < list.length; i++) {\n\t\t\t\t\tvar listItem = list[i],\n\t\t\t\t\t\tlisting = listings[listItem] || [];\n\t\t\t\t\tif (listing.indexOf(title) === -1) {\n\t\t\t\t\t\tlisting.push(title);\n\t\t\t\t\t}\n\t\t\t\t\tlistings[listItem] = listing;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn listings;\n\t});\n\treturn listings[targetTitle] || [];\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);\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);\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\treturn $tw.utils.parseJSONSafe(tiddler.fields.text,defaultData);\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\noptions: optional hashmap of options including:\n\tsuppressTimestamp: if true, don't set the creation/modification timestamps\n*/\nexports.setTiddlerData = function(title,data,fields,options) {\n\toptions = options || {};\n\tvar existingTiddler = this.getTiddler(title),\n\t\tcreationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields(),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t\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(creationFields,existingTiddler,fields,newFields,modificationFields));\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] !== undefined) {\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});\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\tconfigTrimWhiteSpace: options.configTrimWhiteSpace\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,\n\t\ttext,\n\t\tparserInfo;\n\tif(!options.subTiddler) {\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\tparserInfo = this.getTextReferenceParserInfo(title,field,index,options);\n\tif(parserInfo.sourceText !== null) {\n\t\treturn this.parseText(parserInfo.parserType,parserInfo.sourceText,options);\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.getTextReferenceParserInfo = function(title,field,index,options) {\n\tvar defaultType = options.defaultType || \"text/vnd.tiddlywiki\",\n\t\ttiddler,\n\t\tparserInfo = {\n\t\t\tsourceText : null,\n\t\t\tparserType : defaultType\n\t\t};\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\tparserInfo.sourceText = tiddler.fields.text || \"\";\n\t\t\tif(tiddler.fields.type) {\n\t\t\t\tparserInfo.parserType = tiddler.fields.type;\n\t\t\t}\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\tparserInfo.sourceText = title;\n\t\t} else if(tiddler && tiddler.fields) {\n\t\t\tparserInfo.sourceText = tiddler.hasField(field) ? tiddler.fields[field].toString() : null;\n\t\t}\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\tparserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null);\n\t}\n\tif(parserInfo.sourceText === null) {\n\t\tparserInfo.parserType = null;\n\t}\n\treturn parserInfo;\n}\n\n/*\nParse a block of text of a specified MIME type\n\ttext: text on which to perform substitutions\n\twidget\n\toptions: see below\nOptions include:\n\tsubstitutions: an optional array of substitutions\n*/\nexports.getSubstitutedText = function(text,widget,options) {\n\toptions = options || {};\n\ttext = text || \"\";\n\tvar self = this,\n\t\tsubstitutions = options.substitutions || [],\n\t\toutput;\n\t// Evaluate embedded filters and substitute with first result\n\toutput = text.replace(/\\$\\{([\\S\\s]+?)\\}\\$/g, function(match,filter) {\n\t\treturn self.filterTiddlers(filter,widget)[0] || \"\";\n\t});\n\t// Process any substitutions provided in options\n\t$tw.utils.each(substitutions,function(substitute) {\n\t\toutput = $tw.utils.replaceString(output,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(substitute.name) + \"\\\\$\",\"mg\"),substitute.value);\n\t});\n\t// Substitute any variable references with their values\n\treturn output.replace(/\\$\\(([^\\)\\$]+)\\)\\$/g, function(match,varname) {\n\t\treturn widget.getVariable(varname,{defaultValue: \"\"})\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 let variable widget for variables\n\tif($tw.utils.count(options.variables) > 0) {\n\t\tvar letVariableWidget = {\n\t\t\ttype: \"let\",\n\t\t\tattributes: {\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\t$tw.utils.each(options.variables,function(value,name) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(letVariableWidget,name,\"\" + value);\n\t\t});\n\t\tcurrWidgetNode.children = [letVariableWidget];\n\t\tcurrWidgetNode = letVariableWidget;\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.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\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\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\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\t\t}\n\t\t\t},\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 = this.getTiddlerText(\"$:/core/config/GlobalImportFilter\");\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 this.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),\n\t\twhere 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\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, \n\t\t\tregardless of adjacency or ordering\n\t\tsome: treats search string as a list of tokens, and matches if at least ONE token is found\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tregExpStr=\"\",\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)];\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 if(options.some) {\n\t\tterms = text.trim().split(/[^\\S\\xA0]+/);\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\tregExpStr += (t===0) ? anchor + $tw.utils.escapeRegExp(terms[t]) : \"|\" + anchor + $tw.utils.escapeRegExp(terms[t]);\n\t\t\t}\n\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + regExpStr + \")\",flags));\n\t\t}\n\t} else { // default: words\n\t\tterms = text.split(/[^\\S\\xA0]+/);\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// 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);\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) !== 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/*\nExecute an action string without an associated context widget\n*/\nexports.invokeActionString = function(actions,event,variables,options) {\n\tvar widget = this.makeWidget(null,{parentWidget: options.parentWidget});\n\twidget.invokeActionString(actions,null,event,variables);\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\"};\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);\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\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);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\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\tvar tiddler = this.getTiddler(title);\n\tif(tiddler && tiddler.fields.type === \"application/json\" && tiddler.fields[\"plugin-type\"]) {\n\t\tif(tiddler.fields[\"plugin-type\"] === \"import\") {\n\t\t\t// The import plugin never requires reloading\n\t\t\treturn false;\n\t\t}\n\t}\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\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\") // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\") // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\") // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\") // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\"); // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n","type":"application/javascript","module-type":"wikimethod"},"$:/palettes/Blanca":{"title":"$:/palettes/Blanca","name":"Blanca","color-scheme":"light","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\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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","color-scheme":"light","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\nfootnote-target-background: #ecf2ff\nforeground: #333353\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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","color-scheme":"light","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\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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/ContrastDark":{"title":"$:/palettes/ContrastDark","name":"Contrast (Dark)","color-scheme":"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\nfootnote-target-background: #4c4c4c\nforeground: #fff\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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/ContrastLight":{"title":"$:/palettes/ContrastLight","name":"Contrast (Light)","color-scheme":"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\nfootnote-target-background: #e5e5e5\nforeground: #000\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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/CupertinoDark":{"title":"$:/palettes/CupertinoDark","tags":"$:/tags/Palette","color-scheme":"dark","name":"Cupertino Dark","description":"A macOS inspired dark palette","type":"application/x-tiddler-dictionary","text":"alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour foreground>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nfootnote-target-background: #747474\nforeground: #FFFFFF\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmenubar-background: #464646\nmenubar-foreground: #ffffff\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: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\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: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\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: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: <<colour background>>\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: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\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: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\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","color-scheme":"light","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\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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/DesertSand":{"title":"$:/palettes/DesertSand","tags":"$:/tags/Palette","color-scheme":"light","name":"Desert Sand","description":"A desert sand palette","type":"application/x-tiddler-dictionary","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\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: #E9E0C7\ndropdown-tab-background: #BAB29C\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: #313163\nexternal-link-foreground: #555592\nfootnote-target-background: #fff7d9\nforeground: #2D2A23\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\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: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"},"$:/palettes/GruvboxDark":{"title":"$:/palettes/GruvboxDark","name":"Gruvbox Dark","color-scheme":"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-foreground: <<colour foreground>>\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\nfootnote-target-background: #665c54\nforeground: #fbf1c7\nhighlight-background: #ffff79\nhighlight-foreground: #000000\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>>\nselection-background: #458588\nselection-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>>\nstability-deprecated: #cc241d\nstability-experimental: #d79921\nstability-legacy: #458588\nstability-stable: #98971a\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: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\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: #acacac\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>>\n"},"$:/palettes/Nord":{"title":"$:/palettes/Nord","name":"Nord","color-scheme":"dark","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-foreground: <<colour foreground>>\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\nfootnote-target-background: #2E3440\nforeground: #d8dee9\nhighlight-background: #ffff78\nhighlight-foreground: #000000\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>>\nselection-background: #5E81AC\nselection-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>>\nstability-deprecated: #bf616a\nstability-experimental: #d08770\nstability-legacy: #88c0d0\nstability-stable: #a3be8c\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: #3b4252\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\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"},"$:/palettes/Rocker":{"title":"$:/palettes/Rocker","name":"Rocker","color-scheme":"dark","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\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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","color-scheme":"light","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\nfootnote-target-background: #ded8c5\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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:\nstability-deprecated: <<colour red>>\nstability-experimental: <<colour yellow>>\nstability-legacy: <<colour blue>>\nstability-stable: <<colour green>>\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/SolarizedDark":{"title":"$:/palettes/SolarizedDark","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","description":"Precision dark colors for machines and people","license":"MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE","name":"SolarizedDark","color-scheme":"dark","text":"alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: #dc322f\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nfootnote-target-background: #073642\nforeground: #839496\nhighlight-background: #ffff78\nhighlight-foreground: #000000\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstability-deprecated: #dc322f\nstability-experimental: #b58900\nstability-legacy: #268bd2\nstability-stable: #859900\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\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","color-scheme":"light","text":"alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: #dc322f\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nfootnote-target-background: #eee8d5\nforeground: #657b83\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstability-deprecated: #dc322f\nstability-experimental: #b58900\nstability-legacy: #268bd2\nstability-stable: #859900\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\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","color-scheme":"light","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: \nfootnote-target-background: #ececec\nforeground: rgba(0, 0, 0, 0.87)\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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","color-scheme":"dark","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\nfootnote-target-background: #494949\nforeground: rgba(255, 255, 255, 0.7)\nhighlight-background: #ffff78\nhighlight-foreground: #000000\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.","color-scheme":"dark","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)\nfootnote-target-background: <<colour tag-foreground>>\nforeground: rgb(179, 179, 179)\nhighlight-background: #ffff78\nhighlight-foreground: #000000\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","color-scheme":"light","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: #ffffff\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\nfootnote-target-background: #ecf2ff\nforeground: #333333\nhighlight-background: #ffff00\nhighlight-foreground: #000000\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: #bbbbbb\nnetwork-activity-foreground: #448844\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\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>>\nstability-stable: #008000\nstability-experimental: #c07c00\nstability-deprecated: #ff0000\nstability-legacy: #0000ff\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: #eecc66\ntag-foreground: #ffffff\ntestcase-accent-level-1: #c1eaff\ntestcase-accent-level-2: #E3B740\ntestcase-accent-level-3: #5FD564\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: #ffffff\nwikilist-info: #000000\nwikilist-title: #666666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaaaaa\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: #888888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000000\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":"<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"},"$:/core/templates/exporters/JsonFile":{"title":"$:/core/templates/exporters/JsonFile","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/JsonFile}}","extension":".json","text":"<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"},"$:/core/templates/exporters/StaticRiver":{"title":"$:/core/templates/exporters/StaticRiver","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/StaticRiver}}","extension":".html","text":"\\define tv-config-static() yes\n\\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=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\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 tc-static-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 [subfilter{$:/core/config/GlobalImportFilter}]\n<<renderContent>>\n"},"$:/core/templates/exporters/TidFile":{"title":"$:/core/templates/exporters/TidFile","tags":"$:/tags/Exporter","description":"{{$:/language/Exporters/TidFile}}","extension":".tid","condition":"[<count>compare:lte[1]]","text":"\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n<<renderContent>>"},"$:/core/save/all-external-js":{"title":"$:/core/save/all-external-js","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n\n<!-- Important: core library is provided by serving URI encoded $:/core/templates/tiddlywiki5.js -->\n\\define defaultCoreURL() %24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\n\n<$let coreURL={{{ [[coreURL]is[variable]then<coreURL>else<defaultCoreURL>] }}}>\n\t{{$:/core/templates/tiddlywiki5-external-js.html}}\n</$let>\n"},"$:/core/save/offline-external-js":{"title":"$:/core/save/offline-external-js","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[[$:/boot/boot.css]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n\\define defaultCoreURL() tiddlywikicore-$(version)$.js\n<$let coreURL={{{ [[coreURL]is[variable]then<coreURL>else<defaultCoreURL>] }}}>\n\t{{$:/core/templates/tiddlywiki5-external-js.html}}\n</$let>\n"},"$:/core/templates/tiddlywiki.js/load-tiddler":{"title":"$:/core/templates/tiddlywiki.js/load-tiddler","text":"_load(window,<$macrocall $name=\"jsontiddler\" $output=\"text/raw\"/>);"},"$:/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\n$tw = (typeof $tw === 'undefined') ? Object.create(null) : $tw;\n\n$tw.preloadTiddlers = $tw.preloadTiddlers || [];\n\n_load = function(window,tiddler) {\n\t\"use strict\";\n\tvar f;\n\t$tw.preloadTiddlers.push(tiddler);\n\tif(tiddler.library === \"yes\") {\n\t\tvar module = { exports:{} };\n\t\tvar moduleName = function moduleName(path) {\n\t\t\tvar word = path.split(\"/\").pop();\n\t\t\tword = word.substring(0,word.indexOf(\".\")) || word;\n\t\t\treturn word;\n\t\t}\n\t\tf = new Function(\"module\",tiddler.text);\n\t\tf(module);\n\t\twindow[moduleName(tiddler.title)] = module.exports;\n\t} else {\n\t\tf = new Function(\"window\",tiddler.text);\n\t\tf(window);\n\t}\n}\n\n/* ~~ Library modules ~~ */\n\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/tiddlywiki.js/load-tiddler}}}`\n\n/* ~~ Boot kernel prologue ~~ */\n\n`{{ $:/boot/bootprefix.js ||$:/core/templates/tiddlywiki.js/load-tiddler}}`\n\n/* ~~ Core tiddlers ~~ */\n\n`{{$:/core/templates/tiddlywiki5.js/tiddlers}}`\n\n/* ~~ Boot kernel ~~ */\n\n`{{ $:/boot/boot.js ||$:/core/templates/tiddlywiki.js/load-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/offline-external-js\"\n}]);\n`\n"},"$:/core/templates/tiddlywiki5-external-js.html":{"title":"$:/core/templates/tiddlywiki5-external-js.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`{{{ [enlist<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<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Load external JavaScripts ~~-->\n<script src=\"`{{{ [<coreURL>] }}}`\" onerror=\"alert('Error: Cannot load `{{{ [<coreURL>] }}}`');\"></script>\n</body>\n</html>`\n</$set>"},"$:/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=\"htmltextencoded\" />`</pre>\n</div>`\n"},"$:/core/templates/html-json-skinny-tiddler":{"title":"$:/core/templates/html-json-skinny-tiddler","text":"<$text text=<<join>>/><$jsontiddler tiddler=<<currentTiddler>> exclude=\"text\" escapeUnsafeScriptChars=\"yes\"/>\n"},"$:/core/templates/html-json-tiddler":{"title":"$:/core/templates/html-json-tiddler","text":"<$jsontiddler tiddler=<<currentTiddler>> escapeUnsafeScriptChars=\"yes\"/>"},"$:/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 [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[is[system]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]] -[is[system]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]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] [is[tiddler]type[application/javascript]] +[sort[title]]\n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]] -[type[application/javascript]]\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]] -[is[system]type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]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;\" role=\"region\" aria-label={{$:/language/SideBar/Caption}}>\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-config-static() yes\n\\define tv-wikilink-template() $uri_encoded$\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\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\" role=\"main\">\n<div class=\"tc-tiddler-frame\" role=\"article\">\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 tc-clearfix\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle tc-clearfix\">\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\" tc-clearfix>\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 tc-clearfix\">\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 [subfilter{$:/core/config/GlobalImportFilter}]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude tiddler=\"$:/core/ui/ViewTemplate/body\" mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"},"$:/core/templates/social-metadata":{"title":"$:/core/templates/social-metadata","tags":"$:/tags/RawMarkupWikified","text":"\\procedure meta-plain(name,source,name-attribute:\"name\")\n\\whitespace trim\n<%if [<source>has[text]] %>\n\t<meta <$text text=<<name-attribute>>/>=\"<$text text=<<name>>/>\" content=\"<$text text={{{ [<source>get[text]encodehtml[]] }}}/>\">\n\t<$text text={{{ [charcode[10]] }}}/>\n<%endif%>\n\\end meta-plain\n\n\\procedure meta-wikified(name,source,name-attribute:\"name\")\n\\whitespace trim\n<%if [<source>has[text]] %>\n\t<$wikify name=\"html\" text={{{ [<source>get[text]] }}} output=\"text\">\n\t\t<meta <$text text=<<name-attribute>>/>=\"<$text text=<<name>>/>\" content=\"<$text text={{{ [<html>encodehtml[]] }}}/>\">\n\t\t<$text text={{{ [charcode[10]] }}}/>\n\t</$wikify>\n<%endif%>\n\\end meta-wikified\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock conditional commentinline commentblock\n<<meta-wikified \"description\" \"$:/SiteSubtitle\">>\n\n<!-- Facebook Meta Tags -->\n<<meta-plain \"og:url\" \"$:/SiteUrl\" \"property\">>\n<<meta-plain \"og:type\" \"website\" \"property\">>\n<<meta-wikified \"og:title\" \"$:/SiteTitle\" \"property\">>\n<<meta-wikified \"og:description\" \"$:/SiteSubtitle\" \"property\">>\n<<meta-plain \"og:image\" \"$:/SitePreviewUrl\" \"property\">>\n\n<!-- Twitter Meta Tags -->\n<<meta-plain \"twitter:card\" \"summary_large_image\">>\n<<meta-plain \"twitter:domain\" \"$:/SiteDomain\" \"property\">>\n<<meta-plain \"twitter:url\" \"$:/SiteUrl\" \"property\">>\n<<meta-wikified \"twitter:title\" \"$:/SiteTitle\">>\n<<meta-wikified \"twitter:description\" \"$:/SiteSubtitle\">>\n<<meta-plain \"twitter:image\" \"$:/SitePreviewUrl\">>\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-config-static() yes\n\\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-static() yes\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 [subfilter{$:/core/config/GlobalImportFilter}]\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 tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"},"$:/core/templates/store.area.template.html":{"title":"$:/core/templates/store.area.template.html","text":"\\whitespace trim\n<!-- Unencrypted -->\n<$list filter=\"[[$:/isEncrypted]get[text]else[no]match[no]]\">\n <$list filter=\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[json]]\">\n <!-- New-style JSON store area, with an old-style store area for compatibility with v5.1.x tooling -->\n `<script class=\"tiddlywiki-tiddler-store\" type=\"application/json\">[`\n <$let newline={{{ [charcode[10]] }}} join=`,$(newline)$`>\n <$text text=<<newline>>/>\n <$list filter=<<saveTiddlerFilter>> join=<<join>> template=\"$:/core/templates/html-json-tiddler\"/>\n <$list filter=\"[subfilter<skinnySaveTiddlerFilter>]\" template=\"$:/core/templates/html-json-skinny-tiddler\"/>\n <$text text=<<newline>>/>\n </$let>\n `]</script>`\n `<div id=\"storeArea\" style=\"display:none;\">`\n `</div>`\n </$list>\n <$list filter=\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[div]]\">\n <!-- Old-style DIV/PRE-based store area -->\n <$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=\"[subfilter<skinnySaveTiddlerFilter>]\" template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n `</div>`\n </$reveal>\n </$list>\n</$list>\n<!-- Encrypted -->\n<$list filter=\"[[$:/isEncrypted]get[text]else[no]match[yes]]\">\n `<!--~~ Encrypted tiddlers ~~-->`\n `<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n <$encrypt filter=<<saveTiddlerFilter>>/>\n `</pre>`\n</$list>"},"$:/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`{{{ [enlist<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</$set>\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":"\\whitespace trim\n<$action-sendmessage $message=\"tm-new-tiddler\" type={{{ [{$:/config/NewImageType}addprefix[image/]] }}}/>\n"},"$:/core/ui/Actions/new-journal":{"title":"$:/core/ui/Actions/new-journal","tags":"$:/tags/Actions","description":"create a new journal tiddler","text":"\\whitespace trim\n\\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]\n<$let journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"<$transclude $variable='now' format=<<journalTitleTemplate>>/>\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$let>\n"},"$:/core/ui/Actions/new-tiddler":{"title":"$:/core/ui/Actions/new-tiddler","tags":"$:/tags/Actions","description":"create a new empty tiddler","text":"\\whitespace trim\n\\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]\n<$let textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$let>\n"},"$:/core/ui/AdvancedSearch/Filter":{"title":"$:/core/ui/AdvancedSearch/Filter","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/Filter/Caption}}","text":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"\n/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"\n/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\">\n\t<$list-empty>\n\t\t<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\"/>\n\t</$list-empty>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\">\n\t<$list-empty>\n\t\t<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\">\n\t\t\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n\t\t</$list>\n\t<$/list-empty>\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\">\n\t<$list-empty>\n\t\t<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\">\n\t\t\t<$list filter=\"[<__tiddler__>get[text]minlength[1]]\">\n\t\t\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list-empty>\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/>\n\t</$list>\n</$list>\n\\end\n\n\\whitespace trim\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n\t<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>> class=\"tc-small-gap-right\">\n\t\t<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n\t\t\t<$transclude $variable=\"keyboard-driven-input\"\n\t\t\t\ttiddler=\"$:/temp/advancedsearch/input\"\n\t\t\t\tstoreTitle=\"$:/temp/advancedsearch\"\n\t\t\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\t\t\t\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\t\t\ttype=\"search\"\n\t\t\t\ttag=\"input\"\n\t\t\t\tfocus={{$:/config/Search/AutoFocus}}\n\t\t\t\tconfigTiddlerFilter=\"[[$:/temp/advancedsearch]]\"\n\t\t\t\tfirstSearchFilterField=\"text\"\n\t\t\t\tinputAcceptActions=<<input-accept-actions>>\n\t\t\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\t\t\t\tinputCancelActions=<<cancel-search-actions>>\n\t\t\t/>\n\t\t</$keyboard>\n\t</$keyboard>\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\">\n\t\t<$transclude/>\n\t</$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\" tag=\"div\" class=\"tc-search-results\">\n\t<$set name=\"resultCount\" value=\"<$count filter={{$:/temp/advancedsearch}}/>\">\n\t\t<p><<lingo Filter/Matches>></p>\n\t\t<$list filter={{$:/temp/advancedsearch}}>\n\t\t\t<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n\t\t\t\t<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n\t\t\t</span>\n\t\t</$list>\n\t</$set>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear":{"title":"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear","tags":"$:/tags/AdvancedSearch/FilterButton","text":"\\whitespace trim\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\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":"\\whitespace trim\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/DeleteTiddlers/Hint}} 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}}/>\"\"\">\n{{$:/language/ConfirmDeleteTiddlers}}\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\n{{$:/language/Buttons/DeleteTiddlers/Hint}}\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":"\\whitespace trim\n\n<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 actions=\"<$action-setfield $tiddler='$:/temp/advancedsearch' text=<<navigateTo>>/><$action-setfield $tiddler='$:/temp/advancedsearch/input' text=<<navigateTo>>/><$action-setfield $tiddler='$:/temp/advancedsearch/refresh' text='yes'/><$action-sendmessage $message='tm-focus-selector' $param='.tc-advanced-search input' />\">\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]!is[draft]]\">\n<$link to={{!!filter}}><$let tv-wikilinks=\"no\"><$transclude field=\"description\"/></$let></$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":"\\whitespace trim\n<$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}}","first-search-filter":"[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]","text":"\\procedure lingo-base() $:/language/Search/\n\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\"\n\temptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\">\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\">\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/>\n</$list></$list>\n\\end\n\n\\whitespace trim\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tconfigTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n \n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\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={{{ [all[shadows]search{$:/temp/advancedsearch}] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :and[count[]]}}}>\n\n<div class=\"tc-search-results\">\n\n<%if [<resultCount>match[0]] %>\n\t{{$:/language/Search/Matches/NoMatch}}\n<%else%>\n\t<<lingo Shadows/Matches>>\n<%endif%>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] :else[[$:/temp/advancedsearch]] :else[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] :else[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\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":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"after\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"before\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure next-search-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"after\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure previous-search-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"before\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\n\\procedure input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\n\n\\procedure input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\n\n\\whitespace trim\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<previous-search-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\"\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n \n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\"\n\temptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\"\n\tvariable=\"listItem\">\n<$vars\n\tuserInput={{{ [[$:/temp/advancedsearch]get[text]] }}}\n\tconfigTiddler={{{ [[$:/state/advancedsearch/standard/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}\n\tsearchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\">\n<$list-empty>\n<$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'><$transclude mode=\"block\"/></$list>\n</$list-empty>\n<$transclude $variable=\"tabs\"\n\ttabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\"\n\tdefault={{$:/config/SearchResults/Default}}\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=<<currentTab>>/>\"\n\texplicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"},"$:/core/ui/AdvancedSearch/System":{"title":"$:/core/ui/AdvancedSearch/System","tags":"$:/tags/AdvancedSearch","caption":"{{$:/language/Search/System/Caption}}","first-search-filter":"[is[system]search<userInput>sort[title]limit[250]] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]]","text":"\\procedure lingo-base() $:/language/Search/\n\\procedure set-next-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"after\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure set-previous-input-tab()\n<$transclude $variable=\"change-input-tab\"\n\tstateTitle=\"$:/state/tab--1498284803\"\n\ttag=\"$:/tags/AdvancedSearch\"\n\tbeforeafter=\"before\"\n\tdefaultState=\"$:/core/ui/AdvancedSearch/System\"\n\tactions=\"<$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=<<nextTab>>/>\"/>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\"\n\temptyMessage=\"<$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n</$list>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\\end\n\n\\procedure input-accept-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\">\n\t<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>\n</$list>\n\\end\n\n\\procedure input-accept-variant-actions()\n\\whitespace trim\n<$list\n\tfilter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\"\n\temptyMessage=\"<$list filter='[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]'><$list filter='[<tiddler>get[text]minlength[1]]'><$action-sendmessage $message='tm-edit-tiddler' $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\">\n\t<$list filter=\"[<tiddler>get[text]minlength[1]]\">\n\t\t<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/>\n</$list></$list>\n\\end\n\n\\whitespace trim\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$transclude $variable=\"keyboard-driven-input\"\n\ttiddler=\"$:/temp/advancedsearch/input\"\n\tstoreTitle=\"$:/temp/advancedsearch\"\n\trefreshTitle=\"$:/temp/advancedsearch/refresh\"\n\tselectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\ttype=\"search\"\n\ttag=\"input\"\n\tfocus={{$:/config/Search/AutoFocus}}\n\tconfigTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\tinputCancelActions=<<cancel-search-actions>>\n\tinputAcceptActions=<<input-accept-actions>>\n\tinputAcceptVariantActions=<<input-accept-variant-actions>>\n\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n \n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\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={{{ [is[system]search{$:/temp/advancedsearch}] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]] +[count[]] }}}>\n\n<div class=\"tc-search-results\">\n\n<%if [<resultCount>match[0]] %>\n\t{{$:/language/Search/Matches/NoMatch}}\n<%else%>\n\t<<lingo System/Matches>>\n<%endif%>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] :except[[$:/temp/advancedsearch]] :except[[$:/temp/advancedsearch/input]] :except[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] :except[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\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":"\\whitespace trim\n<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"},"$:/core/ui/AlertTemplate":{"title":"$:/core/ui/AlertTemplate","code-body":"yes","text":"\\whitespace trim\n<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\"/>\n - \n<$view field=\"modified\" format=\"date\" template=<<format>>/>\n \n<$reveal type=\"nomatch\" state=\"!!count\" text=\"\">\n<span class=\"tc-alert-highlight\">\n({{$:/language/Count}}: <$view field=\"count\"/>)\n</span>\n</$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/VisibleTransclude":{"title":"$:/core/ui/VisibleTransclude","text":"<!--\nImport this component to make all the child transclusions visible.\n\nBlock transclusions are shown in red, and inline transclusions are shown in green.\n-->\n\\widget $transclude()\n<!-- Use a parameters widget so that we can access the `$params` data -->\n<$parameters tiddler=\"\" $$tiddler=\"\" mode=\"\" $$mode=\"\" $parseMode=\"@parseMode\" $params=\"@params\">\n\t<!-- Replicate the logic of the transclude widget to determine the output mode, and hence the tag and colour to use for output -->\n\t<$let\n\t\tmode={{{ [[$mode]is[variable]then<$mode>!is[blank]] :else[[mode]is[variable]then<mode>!is[blank]] :else[<@parseMode>] }}}\n\t\toutputTag={{{ [<mode>match[inline]then[span]else[div]] }}}\n\t\toutputColour={{{ [<mode>match[inline]then[green]else[red]] }}}\n\t>\n\t\t<!-- Use divs or spans according to the mode -->\n\t\t<$genesis $type=<<outputTag>> style=\"color:white;padding:4px;\" style.background=<<outputColour>>>\n\t\t\t<$genesis $type=<<outputTag>> style=\"display: inline-block;\">\n\t\t\t\t<div style=\"background:white;color:black;font-size: 12px;line-height:1.2;text-align:left;font-weight:normal;padding:4px;margin:4px;\">\n\t\t\t\t\t<!-- Render the parameters to the transclusion -->\n\t\t\t\t\t<$list filter=\"[<@params>jsonindexes[]]\" emptyMessage=\"(none)\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<$text text=<<currentTiddler>>/><$text text=\": \"/><$text text={{{ [<@params>jsonget<currentTiddler>] }}}/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$list>\n\t\t\t\t</div>\n\t\t\t</$genesis>\n\t\t\t<$genesis $type=<<outputTag>> style=\"background:white;color:black;padding:4px;\">\n\t\t\t\t<!-- Look for a parameter starting with $ to determine if we are in legacy mode -->\n\t\t\t\t<$list filter=\"[<@params>jsonindexes[]] :filter[<currentTiddler>prefix[$]] +[limit[1]]\" variable=\"ignore\" emptyMessage=\"\"\"\n\t\t\t\t\t<!-- Legacy mode: we render the transclusion without a dollar sign for recursionMarker and mode -->\n\t\t\t\t\t<$genesis $type=\"$transclude\" $remappable=\"no\" $names=\"[<@params>jsonindexes[]]\" $values=\"[<@params>jsonindexes[]] :map[<@params>jsonget<currentTiddler>]\" recursionMarker=\"no\" mode=<<mode>> $$fillignore=\"yes\">\n\t\t\t\t\t\t<!-- Reach back up to the grandparent transclusion to get the correct slot value -->\n\t\t\t\t\t\t<$slot $name=\"ts-raw\"/>\n\t\t\t\t\t</$genesis>\n\t\t\t\t\"\"\">\n\t\t\t\t\t<!-- Non-legacy mode: we use dollar signs for the recursionMarker and mode -->\n\t\t\t\t\t<$genesis $type=\"$transclude\" $remappable=\"no\" $names=\"[<@params>jsonindexes[]]\" $values=\"[<@params>jsonindexes[]] :map[<@params>jsonget<currentTiddler>]\" $$recursionMarker=\"no\" $$mode=<<mode>> $$fillignore=\"yes\">\n\t\t\t\t\t\t<!-- Reach back up to the grandparent transclusion to get the correct slot fill value -->\n\t\t\t\t\t\t<$slot $name=\"ts-raw\"/>\n\t\t\t\t\t</$genesis>\n\t\t\t\t</$list>\n\t\t\t</$genesis>\n\t\t</$genesis>\n\t</$let>\n</$parameters>\n\\end\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\\whitespace trim\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n\t<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n\t\t<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n\t\t\t{{$:/core/images/chevron-right}}\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n\t\t<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n\t\t\t{{$:/core/images/chevron-down}}\n\t\t</$button>\n\t</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n\t<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n\t\t<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n\t</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n\t<h1>\n\t\t''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n\t</h1>\n\t<h2>\n\t\t<$view field=\"title\"/>\n\t</h2>\n\t<h2>\n\t\t<div>\n\t\t\t<%if [<currentTiddler>get[stability]match[STABILITY_0_DEPRECATED]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-deprecated\"><<lingo \"Stability/Deprecated\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_1_EXPERIMENTAL]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-experimental\"><<lingo \"Stability/Experimental\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_2_STABLE]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-stable\"><<lingo \"Stability/Stable\">></span>\n\t\t\t<%elseif [<currentTiddler>get[stability]match[STABILITY_3_LEGACY]] %>\n\t\t\t\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-legacy\"><<lingo \"Stability/Legacy\">></span>\n\t\t\t<%endif%>\n\t\t\t<em><$view field=\"version\"/></em></div>\n\t</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n\\whitespace trim\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n\t<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t<$link to={{!!title}} class=\"tc-plugin-info\">\n\t\t\t<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n\t\t</$link>\n\t</$reveal>\n\t<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n\t\t\t<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n\t\t</$link>\n\t</$reveal>\n\t<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n\t\t<div class=\"tc-plugin-info-dropdown\">\n\t\t\t<div class=\"tc-plugin-info-dropdown-body\">\n\t\t\t\t<$list filter=\"[all[current]] -[[$:/core]]\">\n\t\t\t\t\t<div style=\"float:right;\">\n\t\t\t\t\t\t<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t\t\t\t\t\t<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n\t\t\t\t\t\t\t\t<<lingo Disable/Caption>>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t\t<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n\t\t\t\t\t\t\t<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n\t\t\t\t\t\t\t\t<<lingo Enable/Caption>>\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t</div>\n\t\t\t\t</$list>\n\t\t\t\t<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n\t\t\t\t\t<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n\t\t\t\t</$set>\n\t\t\t</div>\n\t\t</div>\n\t</$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":"\\whitespace trim\n<$link>\n<$set name=\"backgroundColor\" value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\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":"\\whitespace trim\n{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"},"$:/core/ui/ControlPanel/Appearance":{"title":"$:/core/ui/ControlPanel/Appearance","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Appearance/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"},"$:/snippets/retain-story-ordering-button":{"title":"$:/snippets/retain-story-ordering-button","text":"<$button set=\"$:/DefaultTiddlers\" setTo={{$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory}} ><<currentTiddler>></$button>"},"$:/core/ui/ControlPanel/Basics":{"title":"$:/core/ui/ControlPanel/Basics","tags":"$:/tags/ControlPanel/Info","caption":"{{$:/language/ControlPanel/Basics/Caption}}","text":"\\procedure lingo-base() $:/language/ControlPanel/Basics/\n\\whitespace trim\n\n|tc-max-width tc-edit-max-width|k\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\" type=\"number\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit class=\"tc-edit-texteditor\" tiddler=\"$:/DefaultTiddlers\" autoHeight=\"yes\"/><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\" class=\"tc-edit-texteditor\" default=\"\" autoHeight=\"yes\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\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/EditTemplateBody":{"title":"$:/core/ui/ControlPanel/EditTemplateBody","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/EditTemplateBody/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/EditTemplateBody/\n\n<<lingo Hint>>\n\n{{$:/tags/EditTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/FieldEditor":{"title":"$:/core/ui/ControlPanel/FieldEditor","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/FieldEditor/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/FieldEditor/\n\n<<lingo Hint>>\n\n{{$:/tags/FieldEditorFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/StoryTiddler":{"title":"$:/core/ui/ControlPanel/StoryTiddler","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/StoryTiddler/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/StoryTiddler/\n\n<<lingo Hint>>\n\n{{$:/tags/StoryTiddlerTemplateFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/TiddlerColour":{"title":"$:/core/ui/ControlPanel/TiddlerColour","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/TiddlerColour/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/TiddlerColour/\n\n<<lingo Hint>>\n\n{{$:/tags/TiddlerColourFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/TiddlerIcon":{"title":"$:/core/ui/ControlPanel/TiddlerIcon","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/TiddlerIcon/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/TiddlerIcon/\n\n<<lingo Hint>>\n\n{{$:/tags/TiddlerIconFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateBody":{"title":"$:/core/ui/ControlPanel/ViewTemplateBody","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateBody/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateBody/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateSubtitle":{"title":"$:/core/ui/ControlPanel/ViewTemplateSubtitle","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateSubtitle/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateSubtitle/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateSubtitleFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateTags":{"title":"$:/core/ui/ControlPanel/ViewTemplateTags","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateTags/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateTags/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateTagsFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/ViewTemplateTitle":{"title":"$:/core/ui/ControlPanel/ViewTemplateTitle","tags":"$:/tags/ControlPanel/Cascades","caption":"{{$:/language/ControlPanel/ViewTemplateTitle/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/ViewTemplateTitle/\n\n<<lingo Hint>>\n\n{{$:/tags/ViewTemplateTitleFilter||$:/snippets/ListTaggedCascade}}\n"},"$:/core/ui/ControlPanel/Cascades":{"title":"$:/core/ui/ControlPanel/Cascades","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/Cascades/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Cascades/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Cascades]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/StoryTiddler\"/>\n</div>\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\\whitespace trim\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":"\\whitespace trim\n{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\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\\whitespace trim\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/>\n \n<$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\\whitespace trim\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 \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\n\tfilter=\"[list[$(shortcutTitle)$!!text]sort[title]]\"\n\tvariable=\"shortcut\"\n\temptyMessage=\"<div class='tc-dropdown-item-plain'>//<<lingo NoShortcuts/Caption>>//</div>\">\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 \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\\whitespace trim\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\\whitespace trim\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\\whitespace trim\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 \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\\whitespace trim\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\\whitespace trim\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\\whitespace trim\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[name]]\" 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\\whitespace trim\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 \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\\whitespace trim\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\\whitespace trim\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>:\n \n<$view tiddler=<<assetInfo>> field=\"description\"/>\n</h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div>\n<%if [<assetInfo>get[stability]match[STABILITY_0_DEPRECATED]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-deprecated\">{{$:/language/ControlPanel/Plugins/Stability/Deprecated}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_1_EXPERIMENTAL]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-experimental\">{{$:/language/ControlPanel/Plugins/Stability/Experimental}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_2_STABLE]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-stable\">{{$:/language/ControlPanel/Plugins/Stability/Stable}}</span>\n<%elseif [<assetInfo>get[stability]match[STABILITY_3_LEGACY]] %>\n\t<span class=\"tc-plugin-info-stability tc-plugin-info-stability-legacy\">{{$:/language/ControlPanel/Plugins/Stability/Legacy}}</span>\n<%endif%>\n<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[name]]\" 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[name]]\" 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\\whitespace trim\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\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</$list>\n\\end\n\n\\define display-server-assets(type)\n\\whitespace trim\n{{$:/language/Search/Search}}:\n \n<$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n \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[name]]\" 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\\whitespace trim\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\\whitespace trim\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\\whitespace trim\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 \n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\whitespace trim\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\\whitespace trim\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<span class=\"tc-small-gap-left\"><<rule>></span>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n\\whitespace trim\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\\whitespace trim\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\\whitespace trim\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\\whitespace trim\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}}\n \n{{||$:/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\\whitespace trim\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}}\n \n<<lingo Add/Caption>>\n</$button>\n"},"$:/core/ui/ControlPanel/Plugins/Installed/Languages":{"title":"$:/core/ui/ControlPanel/Plugins/Installed/Languages","tags":"$:/tags/ControlPanel/Plugins","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","tags":"$:/tags/ControlPanel/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","tags":"$:/tags/ControlPanel/Plugins","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\\whitespace trim\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[name]]\" 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<$macrocall $name=\"tabs\" tabsList=\"[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Plugins]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"},"$:/core/ui/ControlPanel/Saving/DownloadSaver":{"title":"$:/core/ui/ControlPanel/Saving/DownloadSaver","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<div class=\"tc-control-panel-saving\" data-setting-title=<<currentTab>>>\n\n<<lingo Hint>>\n\n!!.tc-control-panel-accent <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Description>></span>\n</$checkbox>\n</div>"},"$:/core/ui/ControlPanel/Saving/General":{"title":"$:/core/ui/ControlPanel/Saving/General","tags":"$:/tags/ControlPanel/Saving","caption":"{{$:/language/ControlPanel/Saving/General/Caption}}","list-before":"","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<div class=\"tc-control-panel-saving\" data-setting-title=<<currentTab>>>\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!!.tc-control-panel-accent <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Enabled/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo AutoSave/Disabled/Description>></span>\n</$radio>\n</div>"},"$:/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=\"main\" 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\" type=\"url\"/> |"},"$:/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\" type=\"url\"/> |"},"$:/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 siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\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<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\" type=\"url\"/> |\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>>\n"},"$:/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\" type=\"url\"/> |\n"},"$:/core/ui/ControlPanel/Saving":{"title":"$:/core/ui/ControlPanel/Saving","tags":"$:/tags/ControlPanel","caption":"{{$:/language/ControlPanel/Saving/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\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":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\"\n\tfield=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/WikiParserRules/Inline/wikilink\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab":{"title":"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab","caption":"{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}","tags":"$:/tags/ControlPanel/Settings","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n\t\t<option value=<<currentTiddler>>><$transclude field=\"caption\">\n\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t</$transclude>\n\t\t</option>\n\t</$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\\whitespace trim\n\n<$link to=\"$:/config/DefaultSidebarTab\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$transclude field=\"caption\">\n\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t</$transclude>\n\t\t</option>\n\t</$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":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/TextEditor/EnableToolbar\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/InfoPanelMode":{"title":"$:/core/ui/ControlPanel/Settings/InfoPanelMode","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n\n<$link to=\"$:/config/TiddlerInfo/Mode\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Popup/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Sticky/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/LinkToBehaviour":{"title":"$:/core/ui/ControlPanel/Settings/LinkToBehaviour","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\" class=\"tc-control-panel-item\">\n\t<<lingo \"InsideRiver/Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\" class=\"tc-select\">\n\t<option value=\"above\"><<lingo \"OpenAbove\">></option>\n\t<option value=\"below\"><<lingo \"OpenBelow\">></option>\n\t<option value=\"top\"><<lingo \"OpenAtTop\">></option>\n\t<option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\" class=\"tc-control-panel-item\">\n\t<<lingo \"OutsideRiver/Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\" class=\"tc-select\">\n\t<option value=\"top\"><<lingo \"OpenAtTop\">></option>\n\t<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":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\">\n\t<$link to=\"$:/config/MissingLinks\" class=\"tc-control-panel-item\">\n\t\t<span class=\"tc-tiny-gap-left\"><<lingo Description>></span>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/NavigationAddressBar":{"title":"$:/core/ui/ControlPanel/Settings/NavigationAddressBar","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Permaview/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Permalink/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/NavigationHistory":{"title":"$:/core/ui/ControlPanel/Settings/NavigationHistory","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n\n<$link to=\"$:/config/Navigation/UpdateHistory\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Yes/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode":{"title":"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo CopyToClipboard/Description>>\n\t</$link>\n</$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo UpdateAddressBar/Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation":{"title":"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Performance/Instrumentation\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Description>>\n\t</$link>\n</$checkbox>\n"},"$:/core/ui/ControlPanel/Settings/RecentLimit":{"title":"$:/core/ui/ControlPanel/Settings/RecentLimit","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/RecentLimit/Caption}}","text":"\\whitespace trim\n\\procedure lingo-base() $:/language/ControlPanel/Settings/RecentLimit/\n<<lingo Hint>>\n\n|tc-table-no-border|k\n|<$link to=\"$:/config/RecentLimit\"><<lingo Caption>></$link> |<$edit-text tiddler=\"$:/config/RecentLimit\" tag=\"input\" type=\"number\"/> |\n"},"$:/core/ui/ControlPanel/Settings/TitleLinks":{"title":"$:/core/ui/ControlPanel/Settings/TitleLinks","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n\n<$link to=\"$:/config/Tiddlers/TitleLinks\" class=\"tc-control-panel-item\">\n\t<<lingo Hint>>\n</$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo Yes/Description>></span>\n</$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\">\n\t<span class=\"tc-tiny-gap-left\"><<lingo No/Description>></span>\n</$radio>\n"},"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle":{"title":"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle","tags":"$:/tags/ControlPanel/Settings","caption":"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}","text":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n\n<$link to=\"$:/config/Toolbar/ButtonClass\" class=\"tc-control-panel-item\">\n\t<<lingo \"Hint\">>\n</$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\" class=\"tc-select\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n\t\t<option value={{!!text}}>{{!!caption}}</option>\n\t</$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":"\\whitespace trim\n\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Toolbar/Icons\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Icons/Description>>\n\t</$link>\n</$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\"\n\tfield=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"\n\tclass=\"tc-control-panel-item\"\n>\n\t<$link to=\"$:/config/Toolbar/Text\" class=\"tc-tiny-gap-left\">\n\t\t<<lingo Text/Description>>\n\t</$link>\n</$checkbox>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\" explicitState=\"$:/state/tab--697582678\"/>\n</div>"},"$:/core/ui/ControlPanel/SocialCard":{"title":"$:/core/ui/ControlPanel/SocialCard","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/SocialCard/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo SocialCard/Hint>>\n\n|<$link to=\"$:/SiteTitle\"><<lingo Basics/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Basics/Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteDomain\"><<lingo SocialCard/Domain/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteDomain\" default=\"\" tag=\"input\" type=\"url\"/> |\n|<$link to=\"$:/SiteUrl\"><<lingo SocialCard/Url/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteUrl\" default=\"\" tag=\"input\" type=\"url\"/> |\n|<$link to=\"$:/SitePreviewUrl\"><<lingo SocialCard/PreviewUrl/Prompt>></$link> |<$edit-text tiddler=\"$:/SitePreviewUrl\" default=\"\" tag=\"input\" type=\"url\"/> |\n\n<%if [[$:/SitePreviewUrl]get[text]else[]!is[blank]] %>\n<div>\n<div>\n<<lingo SocialCard/PreviewUrl/Preview>>\n</div>\n<img src={{$:/SitePreviewUrl}}/>\n</div>\n<%endif%>"},"$:/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/TestCases":{"title":"$:/core/ui/ControlPanel/TestCases","tags":"$:/tags/ControlPanel/Advanced","caption":"{{$:/language/ControlPanel/TestCases/Caption}}","text":"\\whitespace trim\n{{$:/language/ControlPanel/TestCases/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/TestCases]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TestCases/All\"/>\n</div>\n"},"$:/core/ui/ControlPanel/TestCases/All":{"title":"$:/core/ui/ControlPanel/TestCases/All","tags":"$:/tags/ControlPanel/TestCases","caption":"{{$:/language/ControlPanel/TestCases/All/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n<<lingo TestCases/All/Hint>>\n\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [all[tiddlers+shadows]tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]]\">\n\n<h2>\n\n<$link>\n\n<$text text=<<currentTiddler>>/>\n\n</$link>\n\n</h2>\n\n<$transclude\n\t$tiddler=\"$:/core/ui/TestCaseTemplate\"\n/>\n\n</$list>\n"},"$:/core/ui/ControlPanel/TestCases/Failed":{"title":"$:/core/ui/ControlPanel/TestCases/Failed","tags":"$:/tags/ControlPanel/TestCases","caption":"{{$:/language/ControlPanel/TestCases/Failed/Caption}}","text":"\\define lingo-base() $:/language/ControlPanel/\n<<lingo TestCases/Failed/Hint>>\n\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [all[tiddlers+shadows]tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]]\">\n\n<$transclude\n\t$tiddler=\"$:/core/ui/TestCaseTemplate\"\n\thideIfPass=\"yes\"\n/>\n\n</$list>\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/Settings/TiddlyWiki":{"title":"$:/core/ui/ControlPanel/Settings/TiddlyWiki","tags":"$:/tags/ControlPanel/SettingsTab","caption":"TiddlyWiki","list-before":"","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 class=\"tc-control-panel-setting\" data-setting-title=<<currentTiddler>> >\n\n!!.tc-control-panel-accent <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"},"$:/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\\whitespace trim\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/>\n \n<span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span>\n \n<$transclude field=\"caption\"/>\n -- \n<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\\whitespace trim\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/>\n \n<span class=\"tc-icon-wrapper\">\n \n<$transclude field=\"caption\"/>\n \n<i class=\"tc-muted\">\n-- \n<$transclude field=\"description\"/>\n</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":"\\whitespace trim\n{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"},"$:/ControlPanel":{"title":"$:/ControlPanel","icon":"$:/core/images/options-button","color":"#bbb","text":"\\whitespace trim\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"},"$:/core/ui/DefaultSearchResultList":{"title":"$:/core/ui/DefaultSearchResultList","tags":"$:/tags/SearchResults","caption":"{{$:/language/Search/DefaultResults/Caption}}","first-search-filter":"[!is[system]search:title<userInput>sort[title]limit[250]]","second-search-filter":"[!is[system]search<userInput>sort[title]limit[250]]","text":"\\define searchResultList()\n\\whitespace trim\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}} emptyMessage={{$:/language/Search/Matches/NoResult}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}} emptyMessage={{$:/language/Search/Matches/NoResult}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"},"$:/core/ui/DownloadFullWiki":{"title":"$:/core/ui/DownloadFullWiki","text":"\\whitespace trim\n\\rules except wikilink\n\nTo download the standard single-file version of your wiki:\n\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$let publishFilter=\"\"\"-[[$:/config/SaveWikiButton/Template]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]]\"\"\">\n<$button tooltip=\"Download fully standalone wiki\" aria-label=\"download full wiki\" class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" publishFilter=<<publishFilter>> filename=<<site-title>>/>\n{{$:/core/images/download-button}}\n<span class=\"tc-tiny-gap-left\">\nDownload full wiki\n</span>\n</$button>\n</$let>\n</$wikify>"},"$:/core/ui/EditTemplate/body/preview/diffs-current":{"title":"$:/core/ui/EditTemplate/body/preview/diffs-current","tags":"$:/tags/EditPreview","caption":"{{$:/language/EditTemplate/Body/Preview/Type/DiffCurrent}}","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":"{{$:/language/EditTemplate/Body/Preview/Type/DiffShadow}}","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]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\n\n</$set>\n"},"$:/state/showeditpreview":{"title":"$:/state/showeditpreview","text":"no"},"$:/core/ui/EditTemplate/body/canonical-uri":{"title":"$:/core/ui/EditTemplate/body/canonical-uri","text":"\\define lingo-base() $:/language/EditTemplate/Body/\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}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n"},"$:/core/ui/EditTemplate/body/default":{"title":"$:/core/ui/EditTemplate/body/default","text":"\\function edit-preview-state()\n[{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualified-preview-state>] +[get[text]] :else[[no]]\n\\end\n\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n\n\\define importFileActions()\n<$action-popup $state=<<importState>> $coords=\"(0,0,0,0)\" $floating=\"yes\"/>\n\\end\n\n\\whitespace trim\n<$let\n\tqualified-preview-state=<<qualify \"$:/state/showeditpreview\">>\n\teditPreviewStateTiddler={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualified-preview-state>] }}}\n\timportTitle=<<qualify $:/ImportImage>>\n\timportState=<<qualify $:/state/ImportImage>> >\n<$dropzone importTitle=<<importTitle>> autoOpenOnImport=\"no\" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class=\"tc-dropzone-editor\" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly=\"yes\" actions=<<importFileActions>> >\n<div>\n<div class={{{ [<edit-preview-state>match[yes]then[tc-tiddler-preview]else[tc-tiddler-preview-hidden]] [[tc-tiddler-editor]] +[join[ ]] }}}>\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<$list filter=\"[<editPreviewStateTiddler>get[text]match[yes]]\" variable=\"ignore\">\n\n<div class=\"tc-tiddler-preview-preview\" data-tiddler-title={{!!draft.title}} data-tags={{!!tags}}>\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</$list>\n\n</div>\n\n</div>\n\n</$dropzone>\n\n</$let>\n"},"$:/core/ui/EditTemplate/body/editor":{"title":"$:/core/ui/EditTemplate/body/editor","text":"\\whitespace trim\n\n<$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 cancelPopups=\"yes\"\n fileDrop={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}}\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><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorTools]!has[draft.of]]\"\n\n><$list\n\tfilter={{!!condition}}\n\tvariable=\"list-condition\"\n><$transclude/>\n</$list></$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><$set name=disabled filter={{!!condition-disabled}}><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n disabled=<<disabled>>\n\n><span\n\n data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$set></$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><$set name=disabled filter={{!!condition-disabled}}><$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 disabled=<<disabled>>\n\n><span\n\n data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$set><$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":"<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/EditTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/EditTemplate/body/default]] }}} />\n"},"$:/core/ui/EditTemplate/controls":{"title":"$:/core/ui/EditTemplate/controls","tags":"$:/tags/EditTemplate","text":"\\define config-title() $:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\whitespace trim\n<div class=\"tc-tiddler-title tc-tiddler-edit-title tc-clearfix\">\n\t<$view field=\"title\"/>\n\t<span class=\"tc-tiddler-controls tc-titlebar\">\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t<$let tv-config-toolbar-class={{{ [enlist<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]] +[join[ ]] }}}>\n\t\t\t\t<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n\t\t\t\t\t<$transclude $tiddler=<<listItem>>/>\n\t\t\t\t</$reveal>\n\t\t\t</$let>\n\t\t</$list>\n\t</span>\n</div>\n"},"$:/core/ui/EditTemplate/fieldEditor/default":{"title":"$:/core/ui/EditTemplate/fieldEditor/default","text":"<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> tag=\"input\" default=\"\" class=\"tc-edit-texteditor tc-edit-fieldeditor\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>"},"$:/core/ui/EditTemplate/fields":{"title":"$:/core/ui/EditTemplate/fields","tags":"$:/tags/EditTemplate","text":"\\procedure lingo-base() $:/language/EditTemplate/\n\\function tf.config-title() [[$:/config/EditTemplateFields/Visibility/]addsuffix[$(currentField)$]substitute[]get[text]]\n\n\\function tf.config-filter() [[hide]] :except[title<tf.config-title>]\n\n<!-- Beware this is duplicated from EditTemplate.tid. For details see bug #7054 -->\n\\procedure get-field-value-tiddler-filter() [subfilter<get-field-editor-filter>sha256[16]addprefix[/]addprefix<newFieldValueTiddlerPrefix>]\n\\procedure get-field-editor-filter() [<newFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}]\n\n\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.current-tiddler-new-field-selector() [[data-tiddler-title=]addprefix[$(prefix.bracket)$]substitute[]addsuffix<currentTiddlerCSSescaped>addsuffix[$(suffix.bracket)$]substitute[]] .tc-edit-field-add-name-wrapper input :and[join[ ]]\n\n\\procedure new-field-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldNameTiddler>get[text]] :map[subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]\"/>\n</$set>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.current-tiddler-new-field-selector>>/>\n\\end\n\n\\procedure delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\procedure cancel-search-actions-inner()\n\\whitespace trim\n<$list\n\tfilter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\"\n\tvariable=\"ignore\"\n\temptyMessage=\"<<cancel-delete-tiddler-actions 'cancel'>>\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\procedure cancel-search-actions()\n\\whitespace trim\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list\n\tfilter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\"\n\temptyMessage=\"<<cancel-search-actions-inner>>\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\procedure new-field()\n\\whitespace trim\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip={{$:/language/EditTemplate/Fields/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<storeTitle>] [<searchListState>]\"/>\n</$set>\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<$set name=\"newFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] :and[count[]!match[0]] :and[then[tc-edit-fields]] :else[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] :and[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<tf.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<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$transclude tiddler={{{ [<currentField>] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}] }}} />\n</$keyboard>\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 tc-small-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] :else[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" 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={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] :except[[created]] :except[[creator]] :except[[draft.of]] :except[[draft.title]] :except[[modified]] :except[[modifier]] :except[[tags]] :except[[text]] :except[[title]] :except[[type]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] :except[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] :except[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] :except[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<$let currentTiddlerCSSescaped={{{ [<currentTiddler>escapecss[]] }}} currentTiddler={{{ [subfilter<get-field-value-tiddler-filter>] }}} currentField=\"text\" currentFieldName={{{ [<newFieldNameTiddler>get[text]] }}}>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$transclude tiddler={{{ [subfilter<get-field-editor-filter>] }}} />\n</$keyboard>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$transclude $variable=\"new-field\"/>\n</span>\n</$let>\n</$vars>\n</div>\n</$fieldmangler>\n</$set>"},"$:/core/ui/EditTemplate/shadow":{"title":"$:/core/ui/EditTemplate/shadow","tags":"$:/tags/EditTemplate","text":"\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n\\whitespace trim\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n\\whitespace trim\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\\procedure lingo-base() $:/language/EditTemplate/\n\n\\procedure tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n<$wikify name=\"foregroundColor\"\n\ttext=\"\"\"<$macrocall $name=\"contrastcolour\"\n\t\ttarget=<<colour>>\n\t\tfallbackTarget=<<fallbackTarget>>\n\t\tcolourA=<<colourA>>\n\t\tcolourB=<<colourB>>/>\n\t\"\"\"\n>\n\t<$let backgroundColor=<<colour>> >\n\t\t<span class=\"tc-tag-label tc-tag-list-item tc-small-gap-right\"\n\t\t\tdata-tag-title=<<currentTiddler>>\n\t\t\tstyle.color=<<foregroundColor>>\n\t\t\tstyle.fill=<<foregroundColor>>\n\t\t\tstyle.background-color=<<backgroundColor>>\n\t\t>\n\t\t\t<$transclude tiddler=<<icon>>/>\n\t\t\t<$view field=\"title\" format=\"text\"/>\n\t\t\t<$button class=\"tc-btn-invisible tc-remove-tag-button\"\n\t\t\t\tstyle.fill=<<foregroundColor>>\n\t\t\t>\n\t\t\t\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"-[{!!title}]\"/>\n\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t</$button>\n\t\t</span>\n\t</$let>\n</$wikify>\n\\end\n\n\\procedure tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\"\n\tcolour=`$(colour)$`\n\tcolourA={{{ [<palette>getindex[foreground]] }}}\n\tcolourB={{{ [<palette>getindex[background]] }}}\n\tfallbackTarget={{{ [<palette>getindex[tag-background]] }}}\n\ticon=<<icon>>\n\ttagField=<<tagField>>\n/>\n\\end\n\n\\procedure edit-tags-template(tagField:\"tags\")\n<div class=\"tc-edit-tags\">\n\t<$list filter=\"[<currentTiddler>get<tagField>enlist-input[]sort[title]]\" storyview=\"pop\">\n\t\t<$macrocall $name=\"tag-body\"\n\t\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\t\tpalette={{$:/palette}}\n\t\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\t\ttagField=<<tagField>>\n\t\t/>\n\t</$list>\n\t<$let tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n\t\t<$macrocall $name=\"tag-picker\" tagField=<<tagField>>/>\n\t</$let>\n</div>\n\\end\n<$let saveTiddler=<<currentTiddler>>>\n\t<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$let>\n"},"$:/core/ui/EditTemplate/title":{"title":"$:/core/ui/EditTemplate/title","tags":"$:/tags/EditTemplate","text":"\\whitespace trim\n<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\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}}: <$link to={{!!draft.title}} />\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\">\n{{$:/core/images/right-arrow}}\n \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\">\n{{$:/core/images/down-arrow}}\n \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","first-search-filter":"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]","text":"\\procedure lingo-base() $:/language/EditTemplate/\n\\procedure input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] :and[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-small-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> 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]] :else[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" 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}}<$action-deletetiddler $filter=\"[<typeInputTiddler>] [<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$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<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] :and[sort[description]] :and[removeprefix[$:/language/Docs/Types/]] :and[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] :except[<typeSelectionTiddler>get[text]] :and[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/><$text text=\" \"/>(<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"},"$:/core/ui/EditTemplate":{"title":"$:/core/ui/EditTemplate","code-body":"yes","text":"\\define delete-edittemplate-state-tiddlers()\n<$set name=\"safeNewFieldValueTiddlerPrefix\" value=<<newFieldValueTiddlerPrefix>> emptyValue=<<qualify \"$:/temp/NewFieldValue\">> >\n\t<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix<safeNewFieldValueTiddlerPrefix>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n</$set>\n\\end\n\n<!-- Beware this is duplicated from fields.tid. For details see bug #7054 -->\n\\define get-field-value-tiddler-filter() [subfilter<get-field-editor-filter>sha256[16]addprefix[/]addprefix<newFieldValueTiddlerPrefix>]\n\\define get-field-editor-filter() [<newFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}]\n\n\\define save-tiddler-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldNameTiddler>get[text]] :map[subfilter<get-field-value-tiddler-filter>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\n\\define cancel-delete-tiddler-actions(message)\n\\whitespace trim\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n\n\\whitespace trim\n<div\n\tdata-tiddler-title=<<currentTiddler>>\n\tdata-tags={{!!tags}}\n\tclass={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] 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\trole=\"region\"\n\taria-label={{$:/language/EditTemplate/Caption}}>\n<$fieldmangler>\n<$vars\n\tstoryTiddler=<<currentTiddler>>\n\tnewTagNameTiddler=<<qualify \"$:/temp/NewTagName\">>\n\tnewFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">>\n\tnewFieldValueTiddlerPrefix=<<qualify \"$:/temp/NewFieldValue\">>\n\tnewFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">>\n\tnewFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">>\n\tnewTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">>\n\tnewTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">>\n\ttypeInputTiddler=<<qualify \"$:/temp/Type/input\">>\n\ttypeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">> tag=\"div\">\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>> tag=\"div\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\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":"\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">>\n\ttooltip={{$:/language/Buttons/Cancel/Hint}}\n\taria-label={{$:/language/Buttons/Cancel/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/cancel-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n\t<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">>\n\ttooltip={{$:/language/Buttons/Delete/Hint}}\n\taria-label={{$:/language/Buttons/Delete/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/delete-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n\t<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n\\procedure save-tiddler-button()\n<$fieldmangler>\n\t<$button\n\t\ttooltip={{$:/language/Buttons/Save/Hint}}\n\t\taria-label={{$:/language/Buttons/Save/Hint}}\n\t\tclass=<<tv-config-toolbar-class>>\n\t>\n\t\t<<save-tiddler-actions>>\n\t\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t\t{{$:/core/images/done-button}}\n\t\t<%endif%>\n\t\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t\t<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n\t\t<%endif%>\n\t</$button>\n</$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>get[type]prefix[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\ttrimSelection=\"yes\"\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]] -[<targetTiddler>type[image/svg+xml]]","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/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]","dropdown":"$:/core/ui/EditorToolbar/editor-height-dropdown","text":"\\whitespace trim\n<$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\\whitespace trim\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]] [<targetTiddler>type[text/markdown]] [<targetTiddler>type[text/x-markdown]] +[first[]]","shortcuts":"((excise))","dropdown":"$:/core/ui/EditorToolbar/excise-dropdown","text":""},"$:/core/ui/EditorToolbar/file-import":{"title":"$:/core/ui/EditorToolbar/file-import","tags":"$:/tags/EditorTools","condition":"[<targetTiddler>filter{$:/config/Editor/EnableImportFilter}]","text":"\\procedure lingo-base() $:/language/Import/\n\n\\procedure closePopupActions()\n<$action-deletetiddler $filter=\"[title<importState>] [title<importTitle>]\"/>\n\\end closePopupActions\n\n\\procedure tw5-ImageTemplate() [img[$(currentTiddler)$]]\n\\procedure tw5-FileTemplate() [[$(currentTiddler)$]]\n\n<!-- The following characters must be escaped in markdown: <>()\\ -->\n\\function escape.title() [search-replace:g:regexp[\\(|\\)|<|>|\\\\],[\\$&]]\n\\procedure markdown-ImageTemplate() ![](<#${ [<currentTiddler>escape.title[]] }$>)\n\\procedure markdown-FileTemplate() [](<#${ [<currentTiddler>escape.title[]] }$>)\n\n\\function is.markdown.tiddler() [all[]type[text/x-markdown]] [all[]type[text/markdown]]\n\\function is.image() [get[type]prefix[image]]\n\\function get.markdown.link() [is.image[]then<markdown-ImageTemplate>else<markdown-FileTemplate>]\n\\function get.tw5.link() [is.image[]then<tw5-ImageTemplate>else<tw5-FileTemplate>] \n\\function get.link.template() [<storyTiddler>is.markdown.tiddler[]then<get.markdown.link>else<get.tw5.link>]\n\n\\procedure postImportActions()\n\\whitespace trim\n<$list filter=\"[<importTitle>links[]] :reduce[get.link.template[]substitute[]addprefix<accumulator>]\" variable=\"imageTitle\">\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"insert-text\"\n\ttext=<<imageTitle>>\n/>\n</$list>\n<<closePopupActions>>\n\\end postImportActions\n\n\\procedure buttons()\n\\whitespace trim\n<$button class=\"tc-btn-invisible\" actions=<<closePopupActions>> ><<lingo Listing/Cancel/Caption>></$button>\n \n<$button class=\"tc-btn-invisible\" message=\"tm-perform-import\" param=<<importTitle>> actions=<<postImportActions>> ><<lingo Listing/Import/Caption>></$button>\n\\end buttons\n\n\\whitespace trim\n<$reveal type=\"popup\" state=<<importState>> tag=\"div\" class=\"tc-editor-importpopup\">\n<div class=\"tc-editor-import\">\n<$list filter=\"[<importTitle>field:plugin-type[import]]\">\n<h2><<lingo Editor/Import/Heading>></h2>\n<$tiddler tiddler=<<importTitle>>>\n{{||$:/core/ui/ImportListing}}\n<<buttons>>\n</$tiddler>\n</$list>\n</div>\n</$reveal>"},"$:/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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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\ttrimSelection=\"yes\"\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]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/line-width-dropdown","text":"<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"},"$:/core/ui/EditorToolbar/link-dropdown":{"title":"$:/core/ui/EditorToolbar/link-dropdown","text":"\\procedure lingo-base() $:/language/Buttons/Link/\n\n\\procedure add-link-actions()\n\\whitespace trim\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{{ [<linkTiddler>get[text]] }}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.get-focus-selector() [[data-tiddler-title=]addprefix[$(prefix.bracket)$]substitute[]addsuffix<cssEscapedTitle>addsuffix[$(suffix.bracket)$]substitute[]] .tc-create-wikitext-link input :and[join[ ]]\n\n\\procedure cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"<$action-deletetiddler $filter='[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]'/>\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\procedure cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] :and[<searchTiddler>!has[text]]\" emptyMessage=\"<<cancel-search-actions-inner>>\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"focus-editor\"/></$list>\n\n\\procedure external-link()\n\\whitespace trim\n<$button class=\"tc-btn-invisible tc-btn-mini\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab-after\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab-before\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" defaultState={{$:/config/SearchResults/Default}} actions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<nextTab>>/>\"/>\n\n\\procedure body(config-title)\n\\whitespace trim\n''<<lingo Hint>>''\n\n<$vars searchTiddler={{{ [<config-title>addsuffix[/search]] }}} linkTiddler={{{ [<config-title>addsuffix[/link]] }}} linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>> class=\"tc-create-wikitext-link\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>>\n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\"\n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n \n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n \n<$button class=\"tc-btn-invisible tc-btn-mini\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$transclude $variable=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"},"$:/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>get[type]prefix[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>get[type]prefix[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\ttrimSelection=\"yes\"\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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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>get[type]prefix[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\ttrimSelection=\"yes\"\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\\whitespace trim\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/>\n \n<$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\\whitespace trim\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]] -[<targetTiddler>type[image/svg+xml]]","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]] -[<targetTiddler>type[image/svg+xml]]","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\\whitespace trim\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>get[type]prefix[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":"\\whitespace trim\n<span>\n\t<$transclude $tiddler={{{ [<edit-preview-state>match[yes]then[$:/core/images/preview-open]else[$:/core/images/preview-closed]] }}} />\n</span>\n<$action-setfield $tiddler=<<editPreviewStateTiddler>> $value={{{ [<editPreviewStateTiddler>get[text]toggle[yes],[no]] }}} />\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"focus-editor\"/>\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>get[type]prefix[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]] -[<targetTiddler>type[image/svg+xml]]","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\\whitespace trim\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\"/>\n \n<<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/>\n \n<$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]] -[<targetTiddler>type[image/svg+xml]]","dropdown":"$:/core/ui/EditorToolbar/size-dropdown","text":""},"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate":{"title":"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate","text":"<$linkcatcher actions=\"\"\"\n\n<$list filter=\"[<modifier>!match[ctrl]]\" variable=\"ignore\">\n\n<$list filter=\"[<currentTiddler>addsuffix[/prefix]!is[tiddler]!is[shadow]removesuffix[/prefix]addsuffix[/suffix]!is[tiddler]!is[shadow]]\" variable=\"ignore\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{{ [<currentTiddler>get[text]] }}}\n/>\n\n</$list>\n\n\n<$list filter=\"[<currentTiddler>addsuffix[/prefix]] [<currentTiddler>addsuffix[/suffix]] +[is[shadow]] :else[is[tiddler]] +[limit[1]]\" variable=\"ignore\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [<currentTiddler>addsuffix[/prefix]get[text]] }}}\n\tsuffix={{{ [<currentTiddler>addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n</$list>\n\n<$list filter=\"[<modifier>match[ctrl]]\" variable=\"ignore\">\n\n<$action-sendmessage $message=\"tm-edit-tiddler\"/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\">\n\n<$link tooltip={{{ [<currentTiddler>get[description]] }}}>\n\n<$transclude tiddler=<<currentTiddler>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<currentTiddler>> field=\"title\" />\n\n</$transclude>\n\n</$link>\n\n</$linkcatcher>\n"},"$:/core/ui/EditorToolbar/stamp-dropdown":{"title":"$:/core/ui/EditorToolbar/stamp-dropdown","text":"<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/TextEditor/Snippet\" subFilter=\"!is[draft]\" itemTemplate=\"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate\"/>\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/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]","shortcuts":"((stamp))","dropdown":"$:/core/ui/EditorToolbar/stamp-dropdown","button-classes":"tc-editortoolbar-stamp-button","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>get[type]prefix[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\ttrimSelection=\"yes\"\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>get[type]prefix[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\ttrimSelection=\"yes\"\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>get[type]prefix[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\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/EditorToolbar/transcludify":{"title":"$:/core/ui/EditorToolbar/transcludify","caption":"{{$:/language/Buttons/Transcludify/Caption}}","condition":"[<targetTiddler>!has[type]] [<targetTiddler>get[type]prefix[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\ttrimSelection=\"yes\"\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>get[type]prefix[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\ttrimSelection=\"yes\"\n/>\n"},"$:/core/ui/ExportTiddlyWikiCore":{"title":"$:/core/ui/ExportTiddlyWikiCore","text":"\\define jsFileName() tiddlywikicore-$(version)$.js\n\\define noExportMsg()\nIt appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.\n<p>You will need to view the page source in your browser. Then go to the very bottom the the source, find the last `<script>` \nelement, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>\n\\end\n\n''For advanced users''\n\nExport the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:\n\n<$button tooltip=\"Export the ~TiddlyWiki core code for running with external ~JavaScript\" aria-label=\"export TiddlyWiki core\" class=\"tc-btn-big-green\">\n<$list filter=\"[[$:/boot/boot.js]is[missing]]\" variable=\"ignore\" emptyMessage=\"\"\"<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/templates/tiddlywiki5.js\" filename=<<jsFileName>>/>\"\"\" >\n<$action-setfield $tiddler=<<qualify \"$:/temp/alert\">> text=<<noExportMsg>> subtitle=\"Export ~TiddllyWiki Core\"/>\n<$action-sendmessage $message=\"tm-modal\" $param=<<qualify \"$:/temp/alert\">>/>\n</$list>\n{{$:/core/images/download-button}} Download ~TiddlyWiki core\n</$button>\n\n[[Further information|https://tiddlywiki.com/#Using%20the%20external%20JavaScript%20template]]\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() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n\\whitespace trim\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionInfo()\n\\whitespace trim\n<$set name=\"escUnselected\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\n\t<$list filter=\"[all[current]get<messageField>regexp<escUnselected>]\" variable=\"ignore\">\n\t\t<$text text={{{[all[current]get<selectionField>match[checked]then{$:/language/Import/Upgrader/Tiddler/Selected}else[]]}}}/>\n\t</$list>\n</$set>\n\\end\n\n\\define libraryInfo()\n\\whitespace trim\n<$set name=\"escUnselected\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\n\t<$list filter=\"[all[current]get<messageField>!regexp<escUnselected>]\" variable=\"ignore\">\n\t\t<$text text={{{[all[current]get<messageField>]}}}/>\n\t</$list>\n</$set>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n\\whitespace trim\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\\whitespace trim\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n \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 class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<<selectionInfo>>\n \n<<libraryInfo>>\n \n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n\t<td colspan=\"3\">\n\t\t<div class=\"tc-flex\">\n\t\t\t<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/>\n\t\t\t<span class=\"tc-small-gap-left\">\n\t\t\t\t<$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>\n\t\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t\t\t<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/>\n\t\t\t\t</$button>\n\t\t\t\t<span class=\"tc-small-gap-right\"/>\n\t\t\t</span>\n\t\t\t<$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>\n\t\t\t\t{{$:/core/images/done-button}}\n\t\t\t\t<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} />\n\t\t\t\t<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/>\n\t\t\t</$button>\n\t\t</div>\n\t</td>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"tr\">\n<td colspan=\"3\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n\t<div>\n\t\t<$transclude tiddler={{$:/state/importpreviewtype}}/>\n\t</div>\n</$list>\n</td>\n</$reveal>\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":"\\whitespace trim\n<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}}","code-body":"yes","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":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\" $scroll=\"yes\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/change-sidebar-layout":{"title":"$:/core/ui/KeyboardShortcuts/change-sidebar-layout","tags":"$:/tags/KeyboardShortcut","key":"((change-sidebar-layout))","text":"\\whitespace trim\n<$list\n\tfilter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\"\n\temptyMessage=\"<$action-setfield $tiddler='$:/themes/tiddlywiki/vanilla/options/sidebarlayout' text='fixed-fluid'/>\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"},"$:/core/ui/KeyboardShortcuts/new-image":{"title":"$:/core/ui/KeyboardShortcuts/new-image","tags":"$:/tags/KeyboardShortcut","key":"((new-image))","text":"\\whitespace trim\n<$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":"\\whitespace trim\n<$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":"\\whitespace trim\n<$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/open-control-panel":{"title":"$:/core/ui/KeyboardShortcuts/open-control-panel","tags":"$:/tags/KeyboardShortcut","key":"((open-control-panel))","text":"\\whitespace trim\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/ControlPanel\" $scroll=\"yes\"/>\n</$navigator>\n"},"$:/core/ui/KeyboardShortcuts/refresh":{"title":"$:/core/ui/KeyboardShortcuts/refresh","tags":"$:/tags/KeyboardShortcut","key":"((refresh))","text":"<$action-sendmessage $message=\"tm-browser-refresh\"/>\n"},"$:/core/ui/KeyboardShortcuts/save-wiki":{"title":"$:/core/ui/KeyboardShortcuts/save-wiki","tags":"$:/tags/KeyboardShortcut","key":"((save-wiki))","text":"\\whitespace trim\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"},"$:/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/KeyboardShortcuts/switcher":{"title":"$:/core/ui/KeyboardShortcuts/switcher","tags":"$:/tags/KeyboardShortcut","key":"((layout-switcher))","text":"<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"},"$:/core/ui/KeyboardShortcuts/toggle-sidebar":{"title":"$:/core/ui/KeyboardShortcuts/toggle-sidebar","tags":"$:/tags/KeyboardShortcut","key":"((toggle-sidebar))","text":"\\whitespace trim\n<$list\n\tfilter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\"\n\temptyMessage=\"<$action-setfield $tiddler='$:/state/sidebar' text='yes'/>\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"},"$:/snippets/LayoutSwitcher":{"title":"$:/snippets/LayoutSwitcher","tags":"$:/tags/ControlPanel/Appearance","caption":"{{$:/language/ControlPanel/LayoutSwitcher/Caption}}","text":"\\whitespace trim\n<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list\n\tfilter=\"[{$:/layout}!has[text]]\"\n\tvariable=\"ignore\"\n\temptyMessage=\"\"\"\\whitespace trim\n\t\t<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n\t\t<div class=<<cls>>>\n\t\t<$link to={{!!title}}>\n\t\t''<$transclude tiddler={{{ [<currentTiddler>get[icon]] }}}/><$transclude field=\"name\"/>'' - <$transclude field=\"description\"/>\n\t\t</$link></div></$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n<div class=<<cls>>>\n<$link to={{!!title}}>\n''<$transclude tiddler={{{ [<currentTiddler>get[icon]] }}}/><$transclude field=\"name\"/>'' - <$transclude field=\"description\"/>\n</$link>\n</div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"},"$:/core/ui/ListItemTemplate":{"title":"$:/core/ui/ListItemTemplate","text":"<div class=\"tc-menu-list-item\"><$link /></div>"},"$:/snippets/ListTaggedCascade":{"title":"$:/snippets/ListTaggedCascade","text":"\\whitespace trim\n{{||$:/language/ControlPanel/Cascades/TagPrompt}}\n\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag<currentTiddler>]\">\n<li>\n<div>\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n<$codeblock code={{!!text}}/>\n</li>\n</$list>\n</ol>\n"},"$:/Manager/ItemMain/Fields":{"title":"$:/Manager/ItemMain/Fields","tags":"$:/tags/Manager/ItemMain","caption":"{{$:/language/Manager/Item/Fields}}","text":"\\whitespace trim\n<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\\whitespace trim\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/>\n / \n<$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":"\\whitespace trim\n<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\n\t$name=\"image-picker-include-tagged-images\"\n\tactions=\"<$action-setfield $field='icon' $value=<<imageTitle>>/><$action-deletetiddler $tiddler=<<qualify '$:/state/popup/image-picker'>>/>\"/>\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":"\\whitespace trim\n\\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\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\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<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"},"$:/Manager/ItemSidebar/Tools":{"title":"$:/Manager/ItemSidebar/Tools","tags":"$:/tags/Manager/ItemSidebar","caption":"{{$:/language/Manager/Item/Tools}}","text":"\\whitespace trim\n<p>\n<$button to=<<currentTiddler>>>\n{{$:/core/images/link}} open\n</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>\n{{$:/core/images/edit-button}} edit\n</$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\\whitespace trim\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\\whitespace trim\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 \n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t \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 \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":"\\whitespace trim\n<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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\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":"\\whitespace trim\n<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"\">\n\t<div class=\"tc-tiny-v-gap-bottom\">\n\t\t{{$:/core/ui/Buttons/tag-manager}}\n\t</div>\n</$let>\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\t<div class=\"tc-tiny-v-gap-bottom\">\n\t\t<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\t</div>\n</$list>\n<hr class=\"tc-untagged-separator\">\n{{$:/core/ui/UntaggedTemplate}}\n"},"$:/core/ui/MoreSideBar/Types":{"title":"$:/core/ui/MoreSideBar/Types","tags":"$:/tags/MoreSideBar","caption":"{{$:/language/SideBar/Types/Caption}}","text":"\\whitespace trim\n<$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[name]]\" 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[name]]\" 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[name]]\" 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\\procedure advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/advanced-search-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-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":"\\whitespace trim\n<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/close-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/CloseAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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\\procedure 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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/options-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n<%endif%>\n</$button>\n\\end\n\n<$list filter=\"[list<tv-story-list>] +[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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/locked-padlock}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unlocked-padlock}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/>\n</span>\n<%endif%>\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":"<$transclude $variable=\"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":"\\whitespace trim\n<$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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FoldAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/full-screen-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FullScreen/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/home-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Home/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n<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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/import-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Import/Caption}}/>\n</span>\n<%endif%>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>\n"},"$:/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<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<%if [<tv-config-toolbar-icons>match[yes]] %>\n <span class=\"tc-image-button\">\n <$set name=\"languagePluginTitle\" value={{$:/language}}>\n <$image source=`$(languagePluginTitle)$/icon`/>\n </$set>\n </span>\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n<%endif%>\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/layout":{"title":"$:/core/ui/Buttons/layout","tags":"$:/tags/PageControls","caption":"{{$:/core/images/layout-button}} {{$:/language/Buttons/LayoutSwitcher/Caption}}","description":"{{$:/language/LayoutSwitcher/Description}}","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/LayoutSwitcher/Hint}} aria-label={{$:/language/Buttons/LayoutSwitcher/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/layout-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/LayoutSwitcher/Caption}}/></span>\n<%endif%>\n</$button>\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\\procedure 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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/list}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Manager/Caption}}/>\n</span>\n<%endif%>\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":"\\whitespace trim\n\\define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$\n\n<$button popup=<<qualify \"$:/state/popup/more\">>\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n\tselectedClass=\"tc-selected\"\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/down-arrow}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/More/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"tc-btn-invisible\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\t\t\t\t\t<$set name=\"tv-config-toolbar-class\"\n\t\t\t\t\t\tfilter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t\t\t</$set>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$let>\n\t</div>\n</$reveal>\n"},"$:/core/ui/Buttons/network-activity":{"title":"$:/core/ui/Buttons/network-activity","tags":"$:/tags/PageControls","caption":"{{$:/core/images/network-activity}} {{$:/language/Buttons/NetworkActivity/Caption}}","description":"{{$:/language/Buttons/NetworkActivity/Hint}}","text":"\\whitespace trim\n<$button message=\"tm-http-cancel-all-requests\" tooltip={{$:/language/Buttons/NetworkActivity/Hint}} aria-label={{$:/language/Buttons/NetworkActivity/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/network-activity}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NetworkActivity/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-image-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewImage/Caption}}/>\n</span>\n<%endif%>\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\\procedure 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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-journal-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournal/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewTiddler/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/palette}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n<%endif%>\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":"\\whitespace trim\n<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/print-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Print/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/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":"\\whitespace trim\n<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/refresh-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Refresh/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/Buttons/save-wiki":{"title":"$:/core/ui/Buttons/save-wiki","tags":"$:/tags/PageControls","caption":"{{$:/core/images/save-button-dynamic}} {{$:/language/Buttons/SaveWiki/Caption}}","description":"{{$:/language/Buttons/SaveWiki/Hint}}","text":"\\whitespace trim\n<$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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/save-button-dynamic}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/SaveWiki/Caption}}/>\n</span>\n<%endif%>\n</span>\n</$button>\n"},"$:/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<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<%if [<tv-config-toolbar-icons>match[yes]] %>\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=`$:/core/images/storyview-$(storyview)$`/>\n</$set>\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n<%endif%>\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\\procedure 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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/tag-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/TagManager/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/theme-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/timestamp-on}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Timestamp/On/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/timestamp-off}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/>\n</span>\n<%endif%>\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":"\\whitespace trim\n<$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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unfold-all-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/UnfoldAll/Caption}}/>\n</span>\n<%endif%>\n</$button>\n"},"$:/core/ui/PageTemplate/pagecontrols":{"title":"$:/core/ui/PageTemplate/pagecontrols","text":"\\whitespace trim\n\\function config-title() [[$:/config/PageControlButtons/Visibility/$(listItem)$]substitute[]]\n\n<div class=\"tc-page-controls\">\n\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\t\t<$list filter=\"[<config-title>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n\t\t\t<$let tv-config-toolbar-class={{{ [enlist<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]] +[join[ ]] }}}>\n\t\t\t\t<$transclude $tiddler=<<listItem>> $mode=\"inline\"/>\n\t\t\t</$let>\n\t\t</$list>\n\t</$list>\n</div>"},"$:/core/ui/PageStylesheet":{"title":"$:/core/ui/PageStylesheet","code-body":"yes","text":"\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\whitespace trim\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\" role=\"main\">\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=\"$:/core/ui/StoryTiddlerTemplate\" 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"},"$:/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\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\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>> class=\"tc-small-gap-left\"/></$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>> class=\"tc-small-gap-left\"/></$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\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label={{$:/language/ControlPanel/Palette/Editor/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\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$set name=\"colorList\" filter=\"[{$:/state/palettemanager/showexternal}match[yes]]\"\n value=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" emptyValue=\"[<currentTiddler>indexes[]]\">\n<$list filter=<<colorList>> variable=\"colourName\"> <<palette-manager-colour-row>> </$list>\n</$set>\n</tbody>\n</table>\n\\end\n\\whitespace trim\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 \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\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$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\\whitespace trim\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\\whitespace trim\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":"\\whitespace trim\n<$link to={{!!title}} class=\"tc-plugin-info\">\n\t<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n\t\t<$transclude tiddler=<<currentTiddler>> subtiddler={{{ [<currentTiddler>addsuffix[/icon]] }}}>\n\t\t\t<$transclude tiddler={{{ [<currentTiddler>get[plugin-type]addprefix[$:/core/images/plugin-generic-]] }}}/>\n\t\t</$transclude>\n\t</div>\n\t<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n\t\t<h1>\n\t\t\t''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view>\n\t\t</h1>\n\t</div>\n</$link>\n"},"$:/core/ui/RootTemplate":{"title":"$:/core/ui/RootTemplate","code-body":"yes","text":"<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"},"$:/core/ui/SearchResults":{"title":"$:/core/ui/SearchResults","text":"<div class=\"tc-search-results\">\n\n<$list\n\tfilter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\"\n\temptyMessage=\"<$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'><$transclude mode='block'/></$list>\">\n\n<$macrocall $name=\"tabs\"\n\ttabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\"\n\tdefault={{$:/config/SearchResults/Default}}\n\tactions=\"<$action-setfield $tiddler='$:/state/search/currentTab' text=<<currentTab>>/>\"\n\texplicitState=\"$:/state/tab/search-results/sidebar\"/>\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":"\\whitespace trim\n<div class={{{ [{$:/config/ui/SideBar/More/horizontal}match[yes]then[tc-sidebar-tabs]else[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={{{ [{$:/config/ui/SideBar/More/horizontal}match[yes]then[tc-sidebar-tabs-more]else[tc-vertical tc-sidebar-tabs-more]] }}} explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"},"$:/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<actionTiddler>,<currentTiddler>]\"/>\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>> tag=\"div\">\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 tc-small-gap-right'>{{$:/core/images/close-button}}</$button><$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":"<$transclude $variable=\"timeline\" format={{$:/language/RecentChanges/DateFormat}} limit={{$:/config/RecentLimit}}/>\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\n\\procedure count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\procedure search-results-list()\n\\whitespace trim\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\procedure cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\procedure input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<tiddler>get[text]] }}}/></$list>\n\n\\procedure input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<tiddler>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<tiddler>get[text]] }}}/></$list></$list>\n\n\\procedure set-next-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"after\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\procedure set-previous-input-tab() <$transclude $variable=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"before\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\procedure advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-previous-input-tab>>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<form class=\"tc-form-inline\">\n<$transclude $variable=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-tiny-gap-right tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]\"/>\n</form>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> 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=<<searchTiddler>> 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<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\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\" role=\"region\" aria-label={{$:/language/SideBar/Caption}}>\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\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"},"$:/core/ui/PageTemplate":{"title":"$:/core/ui/PageTemplate","name":"{{$:/language/PageTemplate/Name}}","description":"{{$:/language/PageTemplate/Description}}","icon":"$:/core/images/standard-layout","code-body":"yes","text":"\\whitespace trim\n\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/PageTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-page-container [[tc-page-view-]addsuffix<storyviewTitle>] [[tc-language-]addsuffix<languageTitle>] :and[unique[]join[ ]] }}} >\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>> class=\"tc-dropzone tc-page-container-inner\">\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</$vars>\n"},"$:/core/ui/StoryTiddlerTemplate":{"title":"$:/core/ui/StoryTiddlerTemplate","code-body":"yes","text":"<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/StoryTiddlerTemplateFilter]!is[draft]get[text]] :and[has[title]else[$:/core/ui/ViewTemplate]] }}} />\n"},"$:/core/ui/SwitcherModal":{"title":"$:/core/ui/SwitcherModal","subtitle":"<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>","class":"tc-modal-centered","mask-closable":"yes","text":"<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"},"$:/TagManager":{"title":"$:/TagManager","icon":"$:/core/images/tag-button","color":"#bbb","text":"\\define lingo-base() $:/language/TagManager/\n\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\t<$link to={{!!title}}>\n\t\t<$transclude/> <$view field=\"title\"/>\n\t</$link>\n</$list>\n\\end\n\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n\t<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">\n\t\t{{$:/core/images/down-arrow}}\n\t</$button>\n\t<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n\t\t<div class=\"tc-drop-down\">\n\t\t\t<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n\t\t\t\t<<iconEditorTab type:\"!\">>\n\t\t\t\t<hr/>\n\t\t\t\t<<iconEditorTab type:\"\">>\n\t\t\t</$linkcatcher>\n\t\t</div>\n\t</$reveal>\n</div>\n\\end\n\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n\t<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n\t\t{{$:/core/images/info-button}}\n\t</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n\t<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n\t\t{{$:/core/images/info-button}}\n\t</$button>\n</$reveal>\n\\end\n\n\\procedure color-picker-actions()\n\\whitespace trim\n<$action-setfield $tiddler=<<currentTiddler>> color=<<colour-picker-value>>/>\n\\end\n\n\\procedure color-picker-button()\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button class=\"tc-btn-invisible\" popup={{{ [[$:/state/tag-manager/color/]addsuffix<currentTiddler>] }}}>{{$:/core/images/palette}}</$button>\n<$reveal type=\"popup\" tag=\"div\" class=\"tc-drop-down tc-popup-keep\" state={{{ [[$:/state/tag-manager/color/]addsuffix<currentTiddler>] }}}>\n<$transclude $variable=\"colour-picker\" actions=<<color-picker-actions>>/>\n</$reveal>\n</div>\n\\end\n\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n\t<tr>\n\t\t<th><<lingo Colour/Heading>></th>\n\t\t<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n\t\t<th><<lingo Count/Heading>></th>\n\t\t<th><<lingo Icon/Heading>></th>\n\t\t<th><<lingo Info/Heading>></th>\n\t</tr>\n\t<$list filter=\"[tags[]!is[system]sort[title]]\">\n\t\t<tr>\n\t\t\t<td><$transclude $variable=\"color-picker-button\"/></td>\n\t\t\t<td>{{||$:/core/ui/TagTemplate}}</td>\n\t\t\t<td><$count filter=\"[all[current]tagging[]]\"/></td>\n\t\t\t<td>\n\t\t\t\t<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} />\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td></td>\n\t\t\t<td colspan=\"4\">\n\t\t\t\t<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td><<lingo Colour/Heading>></td>\n\t\t\t\t\t\t\t\t<td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td><<lingo Icon/Heading>></td>\n\t\t\t\t\t\t\t\t<td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</$reveal>\n\t\t\t</td>\n\t\t</tr>\n\t</$list>\n\t<tr>\n\t\t<td></td>\n\t\t<td style=\"position:relative;\">\n\t\t\t{{$:/core/ui/UntaggedTemplate}}\n\t\t</td>\n\t\t<td>\n\t\t\t<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n\t\t</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</tbody>\n</table>"},"$:/core/ui/TagPickerTagTemplate":{"title":"$:/core/ui/TagPickerTagTemplate","text":"\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n\t<$list filter=\"[<saveTiddler>minlength[1]]\">\n\t\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n\t</$list>\n\t<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n\t\t<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n\t</$set>\n\t<<delete-tag-state-tiddlers>>\n\t<$list filter=\"[<refreshTitle>minlength[1]]\">\n\t\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\t</$list>\n\t<<actions>>\n\t<$set name=\"backgroundColor\"\n\t\tvalue={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t>\n\t\t<$wikify name=\"foregroundColor\"\n\t\t\ttext=\"\"\"<$macrocall $name=\"contrastcolour\" target=<<backgroundColor>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\"\n\t\t>\n\t\t\t<span class=\"tc-tag-label tc-btn-invisible\"\n\t\t\t\tstyle=<<tag-pill-styles>>\n\t\t\t\tdata-tag-title=<<currentTiddler>>\n\t\t\t>\n\t\t\t\t{{||$:/core/ui/TiddlerIcon}}<$view field=\"title\" format=\"text\"/>\n\t\t\t</span>\n\t\t</$wikify>\n\t</$set>\n</$button>\n"},"$:/core/ui/TagTemplate":{"title":"$:/core/ui/TagTemplate","text":"\\whitespace trim\n<span class=\"tc-tag-list-item\" data-tag-title=<<currentTiddler>>>\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n\t<$macrocall $name=\"tag-pill-body\"\n\t\ttag=<<currentTiddler>>\n\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\tpalette={{$:/palette}}\n\t\telement-tag=\"$button\"\n\t\telement-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter=\"[subfilter{$:/core/config/TagPillDragFilter}]\" tag='span'\"\"\"\n\t/>\n\t<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n\t\t<$set name=\"tv-show-missing-links\" value=\"yes\">\n\t\t\t<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n\t\t</$set>\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n\t\t\t<$transclude tiddler=<<listItem>>/> \n\t\t</$list>\n\t\t<hr>\n\t\t<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n\t</$reveal>\n</$set>\n</span>\n"},"$:/core/ui/TestCaseTemplate":{"title":"$:/core/ui/TestCaseTemplate","text":"\\parameters (hideIfPass:\"no\")\n\\whitespace trim\n<$let\n\tlinkTarget=\"yes\"\n\tdisplayFormat={{!!display-format}}\n\ttestcaseTiddler=<<currentTiddler>>\n>\n\t<$testcase\n\t\ttestOutput=\"Output\"\n\t\ttestExpectedResult=\"ExpectedResult\"\n\t\ttestActions=\"Actions\"\n\t\ttestHideIfPass=<<hideIfPass>>\n\t>\n\t\t<$data $filter={{!!import}}/>\n\t\t<$data $compound-filter={{!!import-compound}}/>\n\t\t<$data $compound-tiddler=<<currentTiddler>>/>\n\t\t<%if [{!!description}!is[blank]] %><$data title=\"Description\" text={{!!description}}/><%endif%>\n\t</$testcase>\n</$let>\n"},"$:/core/ui/testcases/DefaultTemplate":{"title":"$:/core/ui/testcases/DefaultTemplate","code-body":"yes","text":"\\whitespace trim\n\n\\function tf.state() \"$:/state/testcase\"\n\n\\procedure linkcatcherActions()\n<%if [<navigateTo>has[title]] %>\n\t<$action-setfield $tiddler=<<tf.state>> text=<<navigateTo>>/>\n<%endif%>\n\\end\n\n\\procedure testcase-header()\n<div class=\"tc-test-case-header\">\n\t<h2>\n\t\t<$genesis $type={{{ [<linkTarget>!match[]then[$link]else[span]] }}} to=<<testcaseTiddler>>>\n\t\t\t<%if [<testResult>!match[]] %>\n\t\t\t\t<span class={{{ tc-test-case-result-icon\n\t\t\t\t\t[<testResult>!match[fail]then[tc-test-case-result-icon-pass]]\n\t\t\t\t\t[<testResult>match[fail]then[tc-test-case-result-icon-fail]]\n\t\t\t\t\t+[join[ ]] }}}\n\t\t\t\t>\n\t\t\t\t\t<%if [<testResult>!match[fail]] %>\n\t\t\t\t\t\t{{$:/core/images/done-button}}\n\t\t\t\t\t<%else%>\n\t\t\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t\t\t<%endif%>\n\t\t\t\t</span>\n\t\t\t<%endif%>\n\t\t\t<$view tiddler=\"Description\" mode=\"inline\"/>\n\t\t</$genesis>\n\t\t<span class=\"tc-test-case-toolbar\">\n\t\t\t<<testcase-toolbar>>\n\t\t</span>\n\t</h2>\n</div>\n\\end\n\n\\procedure testcase-toolbar()\n<$button popup=`$(tf.state)$-more`\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=\"tc-btn-invisible\"\n\tselectedClass=\"tc-selected\"\n>\n\t{{$:/core/images/down-arrow}}\n</$button>\n<$let\n\ttv-config-toolbar-icons=\"yes\"\n\ttv-config-toolbar-text=\"yes\"\n\ttv-config-toolbar-class=\"tc-btn-invisible\"\n>\n\t<$reveal state=`$(tf.state)$-more` type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\t\t<div class=\"tc-drop-down\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TestCase/Actions]!has[draft.of]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$transclude $tiddler=<<listItem>> $mode=\"inline\"/>\n\t\t\t</$list>\n\t\t</div>\n\t</$reveal>\n</$let>\n\\end\n\n\\procedure testcase-narrative()\n<div class=\"tc-test-case-narrative\">\n\t<$transclude $tiddler=\"Narrative\" $mode=\"block\"/>\n</div>\n\\end\n\n\\procedure testcase-fail()\n<div class=\"tc-test-case-result-fail\">\n\t<div class=\"tc-test-case-result-fail-header\">\n\t\tTEST FAILED\n\t</div>\n\t<div class=\"tc-test-case-result-fail-body\">\n\t\t<$diff-text source=<<expectedHTML>> dest=<<outputHTML>>/>\n\t</div>\n</div>\n\\end\n\n\\procedure testcase-output-wikified()\n<$linkcatcher actions=<<linkcatcherActions>>>\n\t<$tiddler tiddler=\"Output\">\n\t\t<$transclude $tiddler=\"Output\" $mode=\"block\"/>\n\t</$tiddler>\n</$linkcatcher>\n\\end\n\n\\procedure testcase-output()\n<div class=\"tc-test-case-output\">\n\t<%if [<displayFormat>!match[]else[wikitext]match[plaintext]] %>\n\t\t<pre><$view tiddler=\"Output\" format=\"plainwikified\" mode=\"block\"/></pre>\n\t<%else%>\n\t\t<<testcase-output-wikified>>\n\t<%endif%>\n</div>\n\\end\n\n\\procedure testcase-tabsList()\n[all[tiddlers]sort[]] Output +[putfirst[]]\n-Description\n-Narrative\n-[[$:/temp/testcase/draft-title]]\n-[has[plugin-type]]\n-[prefix<tf.state>]\n-[prefix[$:/state/popup/export]]\n-[prefix[$:/HistoryList]]\n-[prefix[$:/StoryList]]\n\\end\n\n\\procedure testcase-source()\n<div class=\"tc-test-case-source\">\n\t<$macrocall $name=\"tabs\"\n\t\ttabsList=<<testcase-tabsList>>\n\t\texplicitState=<<tf.state>>\n\t\tdefault=\"Output\"\n\t\ttemplate=\"$:/core/ui/testcases/DefaultTemplate/SourceTabs\"\n\t/>\n</div>\n\\end\n\n\\procedure testcase-panes()\n<div class=\"tc-test-case-panes\">\n\t<<testcase-source>>\n\t<div class=\"tc-test-case-divider\"></div>\n\t<<testcase-output>>\n</div>\n\\end\n\n\\procedure testcase-body()\n<div class=\"tc-test-case-wrapper\">\n\t<<testcase-header>>\n\t<$let testcase-source-state = <<tf.state>>>\n\t\t<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\t\t\t<%if [[Narrative]is[tiddler]] %>\n\t\t\t\t<<testcase-narrative>>\n\t\t\t<%endif%>\n\t\t\t<%if [<testResult>match[fail]] %>\n\t\t\t\t<<testcase-fail>>\n\t\t\t<%endif%>\n\t\t\t<<testcase-panes>>\n\t\t</$navigator>\n\t</$let>\n</div>\n\\end\n\n<<testcase-body>>"},"$:/core/ui/testcases/DefaultTemplate/SourceTabs":{"title":"$:/core/ui/testcases/DefaultTemplate/SourceTabs","text":"\\whitespace trim\n\n\\procedure testcaseNewTitle() $:/temp/testcase/draft-title\n\n\\procedure saveActions()\n<$action-setfield $tiddler=<<currentTab>> $field=\"draft.title\" $value=<<newTitle>>/>\n<$action-sendmessage $message=\"tm-save-tiddler\" $param=<<title>> />\n<$action-setfield $tiddler=<<testcase-source-state>> text=<<newTitle>>/>\n<$action-deletetiddler $tiddler=<<testcaseNewTitle>>/>\n\\end\n\n\\procedure saveButton(title, newTitle)\n<$button class=\"tc-btn-invisible tc-test-case-save-button tc-small-gap-left\" actions=<<saveActions>> disabled={{{ [<testcaseNewTitle>!has[text]then[yes]] }}}>\n{{$:/core/images/done-button}}\n</$button>\n\\end\n\n\\procedure body()\n<$list filter=\"[<currentTab>fields[]] -text +[limit[1]]\" variable=\"ignore\">\n\t<table class=\"tc-field-table\">\n\t\t<tbody>\n\t\t\t<$list filter=\"[<currentTab>fields[]sort[]] -text -title title +[putfirst[]]\" variable=\"fieldName\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<$text text=<<fieldName>>/>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<%if [<fieldName>match[draft.title]] %>\n\t\t\t\t\t\t\t<$edit-text class=\"tc-edit-texteditor tc-max-width-80\" tiddler=<<testcaseNewTitle>> focus=\"yes\" tag=\"input\"/>\n\t\t\t\t\t\t\t<$macrocall $name=\"saveButton\" newTitle={{{ [<testcaseNewTitle>get[text]] }}} title=<<currentTab>>/>\n\t\t\t\t\t\t<%else%>\n\t\t\t\t\t\t\t<$view tiddler=<<currentTab>> field=<<fieldName>>/>\n\t\t\t\t\t\t<%endif%>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</$list>\n\t\t</tbody>\n\t</table>\n</$list>\n<$edit class=\"tc-edit-texteditor\" tiddler=<<currentTab>>/>\n<div class=\"tc-test-case-footer-toolbar\">\n<$macrocall $name=\"copy-to-clipboard\" src={{{ [<currentTab>get[text]] }}}/>\n</div>\n\\end\n\n<$transclude $variable=\"body\" $mode=\"inline\"/>\n"},"$:/core/ui/testcases/RawJSONTemplate":{"title":"$:/core/ui/testcases/RawJSONTemplate","text":"\\whitespace trim\n<$text text=<<payloadTiddlers>>/>\n"},"$:/core/ui/testcases/actions/Export":{"title":"$:/core/ui/testcases/actions/Export","tags":"$:/tags/TestCase/Actions","text":"<$macrocall $name=\"exportButton\" exportFilter=\"[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[has[plugin-type]]\" lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>"},"$:/core/ui/testcases/actions/Import":{"title":"$:/core/ui/testcases/actions/Import","tags":"$:/tags/TestCase/Actions","text":"\\whitespace trim\n<$button tooltip={{$:/language/Buttons/TestCaseImport/Hint}} aria-label={{$:/language/Buttons/TestCaseImport/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-import-tiddlers\" $param=<<payloadTiddlers>>/>\n{{$:/core/images/input-button}}\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/TestCaseImport/Caption}}/>\n</span>\n</$button>\n"},"$:/core/ui/TiddlerFieldTemplate":{"title":"$:/core/ui/TiddlerFieldTemplate","text":"\\whitespace trim\n<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":"\\whitespace trim\n<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/TiddlerIcon":{"title":"$:/core/ui/TiddlerIcon","text":"\\whitespace trim\n<$let tiddlerIcon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}>\n<$list filter=\"[<tiddlerIcon>!is[blank]]\" variable=\"ignore\">\n<$transclude tiddler=<<tiddlerIcon>>/>\n</$list>\n</$let>\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\\whitespace trim\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\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\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\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":"\\whitespace trim\n<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}}/>\n"},"$:/core/ui/TopBar/menu":{"title":"$:/core/ui/TopBar/menu","tags":"$:/tags/TopRightBar","text":"\\whitespace trim\n<$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 tc-hide-sidebar-btn\">{{$:/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 tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"},"$:/core/ui/UntaggedTemplate":{"title":"$:/core/ui/UntaggedTemplate","text":"\\define lingo-base() $:/language/SideBar/\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n\t<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal class=\"tc-drop-down\" tag=\"div\" state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n\t<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/body/blank":{"title":"$:/core/ui/ViewTemplate/body/blank","text":"<!-- Intentionally blank -->\n"},"$:/core/ui/ViewTemplate/body/code":{"title":"$:/core/ui/ViewTemplate/body/code","text":"<%if [<currentTiddler>is[missing]] :and[!is[shadow]] %>\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n<%else%>\n<$transclude $variable=\"copy-to-clipboard-above-right\" src={{{ [<currentTiddler>get[text]] }}} />\n<$codeblock code={{{ [<currentTiddler>get[text]] }}} language={{{ [<currentTiddler>get[type]else[text/vnd.tiddlywiki]] }}}/>\n<%endif%>"},"$:/core/ui/ViewTemplate/body/default":{"title":"$:/core/ui/ViewTemplate/body/default","code-body":"yes","text":"<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n"},"$:/core/ui/ViewTemplate/body/import":{"title":"$:/core/ui/ViewTemplate/body/import","text":"\\define lingo-base() $:/language/Import/\n\n\\define confirmCancel()\n\\whitespace trim\n<$action-confirm $message={{$:/language/Import/Listing/Cancel/Warning}} >\n<$action-deletetiddler $tiddler=<<currentTiddler>>/>\n<$action-deletetiddler $tiddler=\"$:/state/import/select-all\"/>\n<$action-sendmessage $message=\"tm-close-tiddler\" title=<<currentTiddler>>/>\n</$action-confirm>\n\\end\n\n\\define buttons()\n\\whitespace trim\n<$button actions=<<confirmCancel>> ><<lingo Listing/Cancel/Caption>></$button>\n \n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n \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\\whitespace trim\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/body/plugin":{"title":"$:/core/ui/ViewTemplate/body/plugin","text":"\\whitespace trim\n<div class=\"tc-tiddler-plugin-info\">\n<$let plugin-type={{!!plugin-type}}\n\tdefault-popup-state=\"yes\"\n\tqualified-state=<<qualify \"$:/state/plugin-info\">>\n>\n{{||$:/core/ui/Components/plugin-info}}\n</$let>\n</div>"},"$:/core/ui/ViewTemplate/body/rendered-plain-text":{"title":"$:/core/ui/ViewTemplate/body/rendered-plain-text","code-body":"yes","text":"\\whitespace trim\n<$wikify name=\"text\" text={{!!text}} type={{!!type}}>\n<$codeblock code=<<text>> language=\"css\"/>\n</$wikify>\n"},"$:/core/ui/ViewTemplate/body":{"title":"$:/core/ui/ViewTemplate/body","tags":"$:/tags/ViewTemplate","text":"\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\n\n<$reveal tag=\"div\" class=\"tc-tiddler-body tc-clearfix\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\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\\whitespace trim\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/lazy-loading":{"title":"$:/core/ui/ViewTemplate/lazy-loading","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<%if [<currentTiddler>has:field[_is_skinny]] %>\n <!-- Render the text to trigger lazy-loading -->\n {{||$:/core/ui/ViewTemplate/body/default}}\n <!-- Indicator of loading state -->\n <div class=\"tc-tiddler-lazy-loading\" />\n<%endif%>\n"},"$:/core/ui/ViewTemplate/subtitle/default":{"title":"$:/core/ui/ViewTemplate/subtitle/default","text":"\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle tc-clearfix\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Subtitle]!has[draft.of]]\" variable=\"subtitleTiddler\">\n<$transclude tiddler=<<subtitleTiddler>> mode=\"inline\"/>\n</$list>\n</div>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/subtitle/modified":{"title":"$:/core/ui/ViewTemplate/subtitle/modified","tags":"$:/tags/ViewTemplate/Subtitle","text":"<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>"},"$:/core/ui/ViewTemplate/subtitle/modifier":{"title":"$:/core/ui/ViewTemplate/subtitle/modifier","tags":"$:/tags/ViewTemplate/Subtitle","text":"<%if [{!!modifier}!is[blank]] %><$link to={{!!modifier}}/><%endif%>"},"$:/core/ui/ViewTemplate/subtitle":{"title":"$:/core/ui/ViewTemplate/subtitle","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateSubtitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/subtitle/default]] }}} />"},"$:/core/ui/ViewTemplate/tags/default":{"title":"$:/core/ui/ViewTemplate/tags/default","text":"\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n <div class=\"tc-tags-wrapper\">\n <$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/>\n <$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Tags]!has[draft.of]]\">\n <$transclude mode=\"inline\"/>\n </$list>\n </div>\n</$reveal>\n"},"$:/core/ui/ViewTemplate/tags":{"title":"$:/core/ui/ViewTemplate/tags","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTagsFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/tags/default]] }}} />"},"$:/core/ui/ViewTemplate/title/default":{"title":"$:/core/ui/ViewTemplate/title/default","text":"\\whitespace trim\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n"},"$:/core/ui/ViewTemplate/title/system":{"title":"$:/core/ui/ViewTemplate/title/system","text":"\\whitespace trim\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text={{{ [<currentTiddler>removeprefix[$:/]] }}}/>\n</h2>"},"$:/core/ui/ViewTemplate/title":{"title":"$:/core/ui/ViewTemplate/title","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n\\define title-styles() fill:$(foregroundColor)$;\n\n<div class=\"tc-tiddler-title tc-clearfix\">\n\t<div class=\"tc-titlebar\">\n\t\t<span class=\"tc-tiddler-controls\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] :filter[lookup[$:/config/ViewToolbarButtons/Visibility/]!match[hide]]\"\n\t\t\t\tstoryview=\"pop\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\t\t\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t\t\t</$set>\n\t\t\t</$list>\n\t\t</span>\n\t\t<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n\t\t\t<$link>\n\t\t\t\t<$list filter=\"[<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] +[!is[blank]]\"\n\t\t\t\t\tvariable=\"ignore\"\n\t\t\t\t>\n\t\t\t\t\t<$let foregroundColor={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\n\t\t\t\t\t\t<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n\t\t\t\t\t\t\t{{||$:/core/ui/TiddlerIcon}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</$let>\n\t\t\t\t</$list>\n\t\t\t\t<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/title/default]] }}} />\n\t\t\t</$link>\n\t\t</$set>\n\t</div>\n\t<$reveal tag=\"div\" type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\">\n\t\t\t<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\t\t</$list>\n\t</$reveal>\n</div>\n"},"$:/core/ui/ViewTemplate/unfold":{"title":"$:/core/ui/ViewTemplate/unfold","tags":"$:/tags/ViewTemplate","text":"\\whitespace trim\n<div class=\"tc-reveal\">\n<$list filter=\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]]\" variable=\"ignore\">\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</$list>\n<$list filter=\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]] :else[<folded-state>get[text]match[hide]]\" variable=\"ignore\">\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</$list>\n</div>"},"$:/core/ui/ViewTemplate":{"title":"$:/core/ui/ViewTemplate","code-body":"yes","text":"\\whitespace trim\n\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>>\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] 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[ ]] }}} role=\"article\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!is[draft]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$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\"\n\tparam=<<currentTiddler>>\n\ttooltip={{$:/language/Buttons/Clone/Hint}}\n\taria-label={{$:/language/Buttons/Clone/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/clone-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/Clone/Caption}}/>\n\t\t</span>\n\t<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/close-others-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n<%endif%>\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\"\n\ttooltip={{$:/language/Buttons/Close/Hint}}\n\taria-label={{$:/language/Buttons/Close/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/close-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/Close/Caption}}/>\n\t\t</span>\n\t<%endif%>\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\"\n\ttooltip={{$:/language/Buttons/Edit/Hint}}\n\taria-label={{$:/language/Buttons/Edit/Hint}}\n\tclass=<<tv-config-toolbar-class>>\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/edit-button}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t<$text text={{$:/language/Buttons/Edit/Caption}}/>\n\t</span>\n\t<%endif%>\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":"<$transclude $variable=\"exportButton\" exportFilter=`[[$(currentTiddler)$]]` 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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-others-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/fold-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/unfold-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n<%endif%>\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\\procedure button-content()\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/info-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n<%endif%>\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<$transclude $variable=\"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<$transclude $variable=\"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<$transclude $variable=\"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\n<$button popup=<<qualify \"$:/state/popup/more\">>\n\ttooltip={{$:/language/Buttons/More/Hint}}\n\taria-label={{$:/language/Buttons/More/Caption}}\n\tclass=<<tv-config-toolbar-class>>\n\tselectedClass=\"tc-selected\"\n>\n\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t{{$:/core/images/down-arrow}}\n\t<%endif%>\n\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t<span class=\"tc-btn-text\">\n\t\t\t<$text text={{$:/language/Buttons/More/Caption}}/>\n\t\t</span>\n\t<%endif%>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$let tv-config-toolbar-icons=\"yes\" tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"tc-btn-invisible\">\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\"\n\t\t\t\tvariable=\"listItem\"\n\t\t\t>\n\t\t\t\t<$reveal type=\"match\" state=`$:/config/ViewToolbarButtons/Visibility/$(listItem)$` text=\"hide\">\n\t\t\t\t\t<$set name=\"tv-config-toolbar-class\"\n\t\t\t\t\t\tfilter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\t\t\t\t\t</$set>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$let>\n\t</div>\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\\procedure newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [enlist{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\procedure newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-here-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n<%endif%>\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\\procedure journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$transclude $variable=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=`[[$(currentTiddlerTag)$]] $(journalTags)$`/>\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/new-journal-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n<%endif%>\n</$wikify>\n</$button>\n\\end\n<$let journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} currentTiddlerTag=<<currentTiddler>>>\n<<journalButton>>\n</$let>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/open-window}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/permalink-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n<%endif%>\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<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/core/images/permaview-button}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n<%endif%>\n</$button>"},"$:/DefaultTiddlers":{"title":"$:/DefaultTiddlers","text":"GettingStarted\n"},"$:/temp/advancedsearch":{"title":"$:/temp/advancedsearch","text":""},"$:/snippets/allfields":{"title":"$:/snippets/allfields","text":"\\whitespace trim\n\n\\procedure lingo-base() $:/language/Docs/Fields/\n\n\\function tf.getLingoText() [<lingo-base>] [<title>] +[join[]get[text]]\n\n\\procedure renderfield(title)\n<tr class=\"tc-view-field\">\n\t<td class=\"tc-view-field-name\">\n\t\t''<$text text=<<title>>/>'':\n\t</td>\n\t<td class=\"tc-view-field-value\">\n\t\t//<<tf.getLingoText>>//\n\t</td>\n\t<td class=\"tc-view-field-list\">\n\t\t<$macrocall $name=\"show-filter-count\" filter=`[has[$(title)$]sort[]]`>>\n\t</td>\n</tr>\n\\end\n\n<table class=\"tc-view-field-table\">\n\t<tbody>\n\t\t<!-- <<renderfieldHeader>> -->\n\t\t<$list filter=\"[fields[]sort[title]]\" variable=\"listItem\">\n\t\t\t<$macrocall $name=\"renderfield\" title=<<listItem>>/>\n\t\t</$list>\n\t</tbody>\n</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/ControlPanel/Basics/DefaultTiddlers/RetainStory":{"title":"$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory","text":"[list[$:/StoryList]]"},"$:/config/DownloadSaver/AutoSave":{"title":"$:/config/DownloadSaver/AutoSave","text":"no"},"$:/config/Drafts/TypingTimeout":{"title":"$:/config/Drafts/TypingTimeout","text":"400"},"$:/config/EditMode/fieldname-filter":{"title":"$:/config/EditMode/fieldname-filter","first-search-filter":"[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type","second-search-filter":"[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"},"$:/config/EditTabIndex":{"title":"$:/config/EditTabIndex","text":"1"},"$:/config/EditTemplateBodyFilters/canonical-uri":{"title":"$:/config/EditTemplateBodyFilters/canonical-uri","tags":"$:/tags/EditTemplateBodyFilter","text":"[has[_canonical_uri]then[$:/core/ui/EditTemplate/body/canonical-uri]]"},"$:/config/EditTemplateBodyFilters/default":{"title":"$:/config/EditTemplateBodyFilters/default","tags":"$:/tags/EditTemplateBodyFilter","text":"[[$:/core/ui/EditTemplate/body/default]]"},"$:/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/Editor/EnableImportFilter":{"title":"$:/config/Editor/EnableImportFilter","type":"text/vnd.tiddlywiki","text":"[all[current]type[text/vnd.tiddlywiki]] [all[current]!has[type]] [all[current]type[text/markdown]] [all[current]type[text/x-markdown]]"},"$:/config/Editor/ImportContentTypesFilter":{"title":"$:/config/Editor/ImportContentTypesFilter","type":"text/vnd.tiddlywiki","text":"[prefix[image/]]"},"$:/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/FieldEditorFilters/default":{"title":"$:/config/FieldEditorFilters/default","tags":"$:/tags/FieldEditorFilter","text":"[[$:/core/ui/EditTemplate/fieldEditor/default]]"},"$:/core/config/GlobalImportFilter":{"title":"$:/core/config/GlobalImportFilter","text":"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global]!is[draft]]"},"$:/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.3.6/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/network-activity":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/network-activity","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/layout":{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/layout","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/RecentLimit":{"title":"$:/config/RecentLimit","text":"100"},"$:/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":"yes"},"$:/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[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"},"$:/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/advanced-search-sidebar":{"title":"$:/config/ShortcutInfo/advanced-search-sidebar","text":"{{$:/language/Shortcuts/Input/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/change-sidebar-layout":{"title":"$:/config/ShortcutInfo/change-sidebar-layout","text":"{{$:/language/Shortcuts/SidebarLayout/Hint}}"},"$:/config/ShortcutInfo/delete-field":{"title":"$:/config/ShortcutInfo/delete-field","text":"{{$:/language/EditTemplate/Field/Remove/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/input-accept":{"title":"$:/config/ShortcutInfo/input-accept","text":"{{$:/language/Shortcuts/Input/Accept/Hint}}"},"$:/config/ShortcutInfo/input-accept-variant":{"title":"$:/config/ShortcutInfo/input-accept-variant","text":"{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"},"$:/config/ShortcutInfo/input-cancel":{"title":"$:/config/ShortcutInfo/input-cancel","text":"{{$:/language/Shortcuts/Input/Cancel/Hint}}"},"$:/config/ShortcutInfo/input-down":{"title":"$:/config/ShortcutInfo/input-down","text":"{{$:/language/Shortcuts/Input/Down/Hint}}"},"$:/config/ShortcutInfo/input-tab-left":{"title":"$:/config/ShortcutInfo/input-tab-left","text":"{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"},"$:/config/ShortcutInfo/input-tab-right":{"title":"$:/config/ShortcutInfo/input-tab-right","text":"{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"},"$:/config/ShortcutInfo/input-up":{"title":"$:/config/ShortcutInfo/input-up","text":"{{$:/language/Shortcuts/Input/Up/Hint}}"},"$:/config/ShortcutInfo/italic":{"title":"$:/config/ShortcutInfo/italic","text":"{{$:/language/Buttons/Italic/Hint}}"},"$:/config/ShortcutInfo/layout-switcher":{"title":"$:/config/ShortcutInfo/layout-switcher","text":"{{$:/language/LayoutSwitcher/Description}}"},"$:/config/ShortcutInfo/link":{"title":"$:/config/ShortcutInfo/link","text":"{{$:/language/Buttons/Link/Hint}}"},"$:/config/ShortcutInfo/linkify":{"title":"$:/config/ShortcutInfo/linkify","text":"{{$:/language/Buttons/Linkify/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/open-control-panel":{"title":"$:/config/ShortcutInfo/open-control-panel","text":"{{$:/language/Buttons/OpenControlPanel/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/refresh":{"title":"$:/config/ShortcutInfo/refresh","text":"{{$:/language/Buttons/Refresh/Hint}}"},"$:/config/ShortcutInfo/save-tiddler":{"title":"$:/config/ShortcutInfo/save-tiddler","text":"{{$:/language/Buttons/Save/Hint}}"},"$:/config/ShortcutInfo/save-wiki":{"title":"$:/config/ShortcutInfo/save-wiki","text":"{{$:/language/Buttons/SaveWiki/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/transcludify":{"title":"$:/config/ShortcutInfo/transcludify","text":"{{$:/language/Buttons/Transcludify/Hint}}"},"$:/config/ShortcutInfo/underline":{"title":"$:/config/ShortcutInfo/underline","text":"{{$:/language/Buttons/Underline/Hint}}"},"$:/config/StoryTiddlerTemplateFilters/draft":{"title":"$:/config/StoryTiddlerTemplateFilters/draft","tags":"$:/tags/StoryTiddlerTemplateFilter","text":"[is[draft]then{$:/config/ui/EditTemplate}]"},"$:/config/StoryTiddlerTemplateFilters/default":{"title":"$:/config/StoryTiddlerTemplateFilters/default","tags":"$:/tags/StoryTiddlerTemplateFilter","text":"[{$:/config/ui/ViewTemplate}]"},"$:/config/SwitcherTargets/layout":{"title":"$:/config/SwitcherTargets/layout","text":"$:/snippets/LayoutSwitcher"},"$:/config/SwitcherTargets/language":{"title":"$:/config/SwitcherTargets/language","text":"$:/snippets/languageswitcher"},"$:/config/SwitcherTargets/palette":{"title":"$:/config/SwitcherTargets/palette","text":"$:/core/ui/ControlPanel/Palette"},"$:/config/SwitcherTargets/theme":{"title":"$:/config/SwitcherTargets/theme","text":"$:/core/ui/ControlPanel/Theme"},"$:/config/SyncFilter":{"title":"$:/config/SyncFilter","text":"[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"},"$:/config/SyncSystemTiddlersFromServer":{"title":"$:/config/SyncSystemTiddlersFromServer","text":"no"},"$:/core/config/TagPillDragFilter":{"title":"$:/core/config/TagPillDragFilter","text":"[all[current]tagging[]] +[!is[draft]]"},"$:/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/TiddlerColourFilters/color-field":{"title":"$:/config/TiddlerColourFilters/color-field","tags":"$:/tags/TiddlerColourFilter","text":"[has[color]then{!!color}]"},"$:/config/TiddlerColourFilters/default":{"title":"$:/config/TiddlerColourFilters/default","tags":"$:/tags/TiddlerColourFilter","text":"[[$:/config/DefaultTiddlerColour]has[text]get[text]trim[]]"},"$:/config/TiddlerIconFilters/icon-field":{"title":"$:/config/TiddlerIconFilters/icon-field","tags":"$:/tags/TiddlerIconFilter","text":"[has[icon]then{!!icon}]"},"$:/config/TiddlerIconFilters/default":{"title":"$:/config/TiddlerIconFilters/default","tags":"$:/tags/TiddlerIconFilter","text":"[{$:/config/DefaultTiddlerIcon}has[text]]"},"$:/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/ViewTemplateBodyFilters/testcase":{"title":"$:/config/ViewTemplateBodyFilters/testcase","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/wiki-test-spec]type[text/vnd.tiddlywiki-multiple]] [tag[$:/tags/wiki-test-spec-failing]type[text/vnd.tiddlywiki-multiple]] :then[[$:/core/ui/TestCaseTemplate]]"},"$:/config/ViewTemplateBodyFilters/stylesheet":{"title":"$:/config/ViewTemplateBodyFilters/stylesheet","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/Stylesheet]then[$:/core/ui/ViewTemplate/body/rendered-plain-text]]"},"$:/config/ViewTemplateBodyFilters/core-ui-tags":{"title":"$:/config/ViewTemplateBodyFilters/core-ui-tags","tags":"$:/tags/ViewTemplateBodyFilter","text":"[tag[$:/tags/PageTemplate]] [tag[$:/tags/EditTemplate]] [tag[$:/tags/ViewTemplate]] [tag[$:/tags/KeyboardShortcut]] [tag[$:/tags/ImportPreview]] [tag[$:/tags/EditPreview]] [tag[$:/tags/EditorToolbar]] [tag[$:/EditorTools]] [tag[$:/tags/Actions]] [tag[$:/tags/ToolbarButtonStyle]] :then[[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/system":{"title":"$:/config/ViewTemplateBodyFilters/system","tags":"$:/tags/ViewTemplateBodyFilter","text":"[prefix[$:/boot/]] [prefix[$:/core/macros]] [prefix[$:/core/save/]] [prefix[$:/core/templates/]] [prefix[$:/config/]] [prefix[$:/core/config/]] [prefix[$:/info/]] [prefix[$:/language/]] [prefix[$:/languages/]] [prefix[$:/snippets/]] [prefix[$:/info/]] [prefix[$:/state/]] [prefix[$:/status/]] [prefix[$:/temp/]] :and[!is[image]] :then[[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/code-body":{"title":"$:/config/ViewTemplateBodyFilters/code-body","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:code-body[yes]then[$:/core/ui/ViewTemplate/body/code]]"},"$:/config/ViewTemplateBodyFilters/import":{"title":"$:/config/ViewTemplateBodyFilters/import","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:plugin-type[import]then[$:/core/ui/ViewTemplate/body/import]]"},"$:/config/ViewTemplateBodyFilters/plugin":{"title":"$:/config/ViewTemplateBodyFilters/plugin","tags":"$:/tags/ViewTemplateBodyFilter","text":"[has[plugin-type]then[$:/core/ui/ViewTemplate/body/plugin]]"},"$:/config/ViewTemplateBodyFilters/hide-body":{"title":"$:/config/ViewTemplateBodyFilters/hide-body","tags":"$:/tags/ViewTemplateBodyFilter","text":"[field:hide-body[yes]then[$:/core/ui/ViewTemplate/body/blank]]"},"$:/config/ViewTemplateBodyFilters/default":{"title":"$:/config/ViewTemplateBodyFilters/default","tags":"$:/tags/ViewTemplateBodyFilter","text":"[[$:/core/ui/ViewTemplate/body/default]]"},"$:/config/ViewTemplateSubtitleFilters/default":{"title":"$:/config/ViewTemplateSubtitleFilters/default","tags":"$:/tags/ViewTemplateSubtitleFilter","text":"[[$:/core/ui/ViewTemplate/subtitle/default]]"},"$:/config/ViewTemplateTagsFilters/default":{"title":"$:/config/ViewTemplateTagsFilters/default","tags":"$:/tags/ViewTemplateTagsFilter","text":"[[$:/core/ui/ViewTemplate/tags/default]]"},"$:/config/ViewTemplateTitleFilters/system":{"title":"$:/config/ViewTemplateTitleFilters/system","tags":"$:/tags/ViewTemplateTitleFilter","text":"[prefix[$:/]then[$:/core/ui/ViewTemplate/title/system]]"},"$:/config/ViewTemplateTitleFilters/default":{"title":"$:/config/ViewTemplateTitleFilters/default","tags":"$:/tags/ViewTemplateTitleFilter","text":"[[$:/core/ui/ViewTemplate/title/default]]"},"$:/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-mac/refresh":{"title":"$:/config/shortcuts-mac/refresh","text":"meta-R"},"$:/config/shortcuts-mac/save-wiki":{"title":"$:/config/shortcuts-mac/save-wiki","text":"meta-S"},"$:/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-not-mac/refresh":{"title":"$:/config/shortcuts-not-mac/refresh","text":"ctrl-R"},"$:/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/advanced-search-sidebar":{"title":"$:/config/shortcuts/advanced-search-sidebar","text":"alt-Enter"},"$:/config/shortcuts/cancel-edit-tiddler":{"title":"$:/config/shortcuts/cancel-edit-tiddler","text":"escape"},"$:/config/shortcuts/change-sidebar-layout":{"title":"$:/config/shortcuts/change-sidebar-layout","text":"shift-alt-Down"},"$:/config/shortcuts/delete-field":{"title":"$:/config/shortcuts/delete-field","text":"shift-alt-D"},"$:/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/input-accept":{"title":"$:/config/shortcuts/input-accept","text":"Enter"},"$:/config/shortcuts/input-accept-variant":{"title":"$:/config/shortcuts/input-accept-variant","text":"ctrl-Enter"},"$:/config/shortcuts/input-cancel":{"title":"$:/config/shortcuts/input-cancel","text":"Escape"},"$:/config/shortcuts/input-down":{"title":"$:/config/shortcuts/input-down","text":"Down"},"$:/config/shortcuts/input-tab-left":{"title":"$:/config/shortcuts/input-tab-left","text":"alt-ctrl-Left"},"$:/config/shortcuts/input-tab-right":{"title":"$:/config/shortcuts/input-tab-right","text":"alt-ctrl-Right"},"$:/config/shortcuts/input-up":{"title":"$:/config/shortcuts/input-up","text":"Up"},"$:/config/shortcuts/layout-switcher":{"title":"$:/config/shortcuts/layout-switcher","text":"ctrl-shift-L"},"$:/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/open-control-panel":{"title":"$:/config/shortcuts/open-control-panel","text":"ctrl-alt-C"},"$:/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/save-wiki":{"title":"$:/config/shortcuts/save-wiki","text":"ctrl-S"},"$:/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":"disable"},"$:/snippets/currpalettepreview":{"title":"$:/snippets/currpalettepreview","text":"\\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 swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n\\whitespace trim\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n \n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"<$macrocall $name='resolve-colour' macrocall=<<swatchColour>>/>\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n\\whitespace trim\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n \n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"<$macrocall $name='resolve-colour' macrocall=<<swatchColour>>/>\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n\\whitespace trim\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>\n"},"$:/snippets/DebugStylesheets":{"title":"$:/snippets/DebugStylesheets","text":"\\whitespace trim\n<style>[test]{list-style:'❌'}</style>\n<ul>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]has[modified]]\" counter=\"n\">\n<style>{{!!text}}[test=\"<<n>>\"]{list-style:disc;}</style>\n<li test=<<n>>><$link/></li>\n</$list>\n</ul>\n"},"$:/snippets/download-wiki-button":{"title":"$:/snippets/download-wiki-button","text":"\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n\\whitespace trim\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-dynamic}}\n</$button>"},"$:/language":{"title":"$:/language","text":"$:/languages/en-GB"},"$:/snippets/languageswitcher":{"title":"$:/snippets/languageswitcher","text":"\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\\whitespace trim\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 \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":"<!-- Needs to stay that way for backwards compatibility. See GH issue: #8326 -->\n\\define colour(name)\n\\whitespace trim\n<$transclude tiddler={{$:/palette}} index=\"$name$\">\n\t<$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\">\n\t\t<$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/>\n\t</$transclude>\n</$transclude>\n\\end\n\n\\define color(name) <<colour $name$>>\n\n\\define box-shadow(shadow)\n``\n-webkit-box-shadow: $shadow$;\n\t-moz-box-shadow: $shadow$;\n\t\tbox-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n-webkit-filter: $filter$;\n\t-moz-filter: $filter$;\n\t\tfilter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n-webkit-transition: $transition$;\n\t-moz-transition: $transition$;\n\t\ttransition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n-webkit-transform-origin: $origin$;\n\t-moz-transform-origin: $origin$;\n\t\ttransform-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\\procedure datauri(title)\n<$macrocall $name=\"makedatauri\" type={{{ [<title>get[type]] }}} text={{{ [<title>get[text]] }}} _canonical_uri={{{ [<title>get[_canonical_uri]] }}}/>\n\\end\n\n\\procedure if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\"><<text>></$reveal>\n\\end\n\n\\procedure if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\"><<text>></$reveal>\n\\end\n\n\\procedure 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$(colour-picker-update-recent)$\n<$transclude $variable=\"__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\\whitespace trim\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\\whitespace trim\n{{$:/language/ColourPicker/Recent}}<$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n \n<$macrocall $name=\"colour-picker-recent-inner\" actions=<<__actions__>>/>\n</$list>\n\\end\n\n\\define colour-picker(actions)\n\\whitespace trim\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 \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 \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":"\\whitespace trim\n\n\\procedure copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button message=\"tm-copy-to-clipboard\"\n\tparam=<<src>>\n\tclass=<<class>>\n\tstyle=<<style>>\n\ttooltip={{$:/language/Buttons/CopyToClipboard/Hint}}\n>\n\t{{$:/core/images/copy-clipboard}}\n\t<span class=\"tc-tiny-gap-left\">\n\t\t<$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n\t</span>\n</$button>\n\\end\n\n\\procedure copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n\t<div style=\"position: absolute; bottom: 0; right: 0;\">\n\t\t<$macrocall $name=\"copy-to-clipboard\" src=<<src>> class=<<class>> style=<<style>>/>\n\t</div>\n</div>\n\\end\n"},"$:/core/macros/diff":{"title":"$:/core/macros/diff","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<sourceTiddlerTitle>> subtiddler=<<sourceSubTiddlerTitle>>>\n\t<$set name=\"dest\" tiddler=<<destTiddlerTitle>> subtiddler=<<destSubTiddlerTitle>>>\n\t\t<$diff-text source=<<source>> dest=<<dest>>/>\n\t</$set>\n</$set>\n\\end\n\n\\procedure compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n\t<tbody>\n\t\t<$set name=\"sourceFields\" filter=\"[<sourceTiddlerTitle>fields[]sort[]]\">\n\t\t\t<$set name=\"destFields\" filter=\"[<destSubTiddlerTitle>subtiddlerfields<destTiddlerTitle>sort[]]\">\n\t\t\t<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<exclude>] +[sort[]]\" variable=\"fieldName\">\n\t\t\t\t<tr>\n\t\t\t\t\t<th>\n\t\t\t\t\t\t<$text text=<<fieldName>>/>\n\t\t\t\t\t</th>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<$set name=\"source\" tiddler=<<sourceTiddlerTitle>> subtiddler=<<sourceSubTiddlerTitle>> field=<<fieldName>>>\n\t\t\t\t\t\t\t<$set name=\"dest\" tiddler=<<destTiddlerTitle>> subtiddler=<<destSubTiddlerTitle>> field=<<fieldName>>>\n\t\t\t\t\t\t\t\t<$diff-text source=<<source>> dest=<<dest>>> </$diff-text>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</$list>\n\t\t\t</$set>\n\t\t</$set>\n\t</tbody>\n</table>\n\\end\n"},"$:/core/macros/dumpvariables":{"title":"$:/core/macros/dumpvariables","tags":"$:/tags/Macro","text":"\\define dumpvariables()\n\\whitespace trim\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":"\\function exportButtonFilename(baseFilename)\n[<baseFilename>] [<extension>] +[join[]]\n\\end\n\n\\procedure exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n\\whitespace trim\n<$let hint={{{ [<lingoBase>addsuffix[Hint]get[text]] }}}\n\tcaption={{{ [<lingoBase>addsuffix[Caption]get[text]] }}}\n>\n\t<span class=\"tc-popup-keep\">\n\t\t<$button popup=<<qualify \"$:/state/popup/export\">>\n\t\t\ttooltip=<<hint>>\n\t\t\taria-label=<<caption>>\n\t\t\tclass=<<tv-config-toolbar-class>>\n\t\t\tselectedClass=\"tc-selected\"\n\t\t\tdragFilter=<<exportFilter>>\n\t\t>\n\t\t\t<%if [<tv-config-toolbar-icons>match[yes]] %>\n\t\t\t\t{{$:/core/images/export-button}}\n\t\t\t<%endif%>\n\t\t\t<%if [<tv-config-toolbar-text>match[yes]] %>\n\t\t\t\t<span class=\"tc-btn-text\"><$text text=<<caption>>/></span>\n\t\t\t<%endif%>\n\t\t</$button>\n\t</span>\n</$let>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\t<div class=\"tc-drop-down\">\n\t\t<$set name=\"count\" value={{{ [subfilter<exportFilter>count[]] }}}>\n\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n\t\t\t\t<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\"\n\t\t\t\t\tvariable=\"ignore\"\n\t\t\t\t>\n\t\t\t\t\t<$button class=\"tc-btn-invisible\">\n\t\t\t\t\t\t<$action-sendmessage $message=\"tm-download-file\"\n\t\t\t\t\t\t\t$param=<<currentTiddler>>\n\t\t\t\t\t\t\texportFilter=<<exportFilter>>\n\t\t\t\t\t\t\tfilename={{{ [<baseFilename>addsuffix{!!extension}] }}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n\t\t\t\t\t\t<$transclude field=\"description\"/>\n\t\t\t\t\t</$button>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$set>\n\t</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)$\"\"\"><$transclude $variable=\"__actions__\"/><$transclude tiddler=<<imageTitle>>/></$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n\\whitespace trim\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=<<__actions__>>/>\n \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\\whitespace trim\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 \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/keyboard-driven-input":{"title":"$:/core/macros/keyboard-driven-input","tags":"$:/tags/Macro","text":"\\procedure prefix.bracket() [\n\\procedure suffix.bracket() ]\n\n\\function tf.change-input-tab.next-tab() [[all]addprefix<prefix.bracket>addsuffix<prefix.bracket>addsuffix[shadows+tiddlers]addsuffix<suffix.bracket>addsuffix[tag<tag>!has]addsuffix<prefix.bracket>addsuffix[draft.of]addsuffix<suffix.bracket>addsuffix<beforeafter>addsuffix[<currentState>]addsuffix<suffix.bracket>addsuffix[ :else]addsuffix<prefix.bracket>addsuffix<prefix.bracket>addsuffix<beforeafter>addsuffix<suffix.bracket>addsuffix[match]addsuffix<prefix.bracket>addsuffix[after]addsuffix<suffix.bracket>addsuffix[then<firstTab>]addsuffix<suffix.bracket>addsuffix[ :else]addsuffix<prefix.bracket>addsuffix<prefix.bracket>addsuffix<beforeafter>addsuffix<suffix.bracket>addsuffix[match]addsuffix<prefix.bracket>addsuffix[before]addsuffix<suffix.bracket>addsuffix[then<lastTab>]addsuffix<suffix.bracket>]\n\n\\procedure change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n\\whitespace trim\n<$set name=\"tabsList\" filter=\"[<explicitTabList>!is[blank]enlist-input[]] :else[all[shadows+tiddlers]tag<tag>!has[draft.of]]\">\n\t<$let\n\t\tcurrentState={{{ [<stateTitle>!is[missing]get[text]] :else[<defaultState>] }}}\n\t\tfirstTab={{{ [enlist<tabsList>nth[1]] }}}\n\t\tlastTab={{{ [enlist<tabsList>last[]] }}}\n\t\tnextTabSubFilter=<<tf.change-input-tab.next-tab>>\n\t\tnextTab={{{ [subfilter<nextTabSubFilter>] }}}\n\t>\n\t\t<$action-setfield $tiddler=<<stateTitle>> text=<<nextTab>>/>\n\t\t<<actions>>\n\t</$let>\n</$set>\n\\end\n\n\\procedure keyboard-input-actions()\n\\whitespace trim\n<%if [<index>match[]] %>\n\t<$action-setfield $tiddler=<<storeTitle>> text={{{ [<tiddler>get<field>] }}}/>\n<% endif %>\n<%if [<index>!match[]] %>\n\t<$action-setfield $tiddler=<<storeTitle>> text={{{ [<tiddler>getindex<index>] }}}/>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-inner()\n\\whitespace trim\n<%if [<nextItem>minlength[1]] %>\n\t<$action-setfield $tiddler=<<selectionStateTitle>> text=<<nextItem>>/>\n\t<%if [<index>match[]] %>\n\t\t<$action-setfield $tiddler=<<tiddler>> $field=<<field>> $value={{{ [<nextItem>] :and[splitregexp[(?:.(?!-))+$]] }}}/>\n\t<% endif %>\n\t<%if [<index>!match[]] %>\n\t\t<$action-setfield $tiddler=<<tiddler>> $index=<<index>> $value={{{ [<nextItem>] :and[splitregexp[(?:.(?!-))+$]] }}}/>\n\t<% endif %>\n\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-after()\n\\whitespace trim\n<%if [<storeTitle>get[text]minlength<filterMinLength>] [<filterMinLength>match[0]] %>\n\t<$let\n\t\tuserInput={{{ [<storeTitle>get[text]] }}}\n\t\tselectedItem={{{ [<selectionStateTitle>get[text]] }}}\n\t\tconfigTiddler={{{ [subfilter<configTiddlerFilter>] }}}\n\t\tprimaryListFilter={{{ [<configTiddler>get<firstSearchFilterField>] }}}\n\t\tsecondaryListFilter={{{ [<configTiddler>get<secondSearchFilterField>] }}}\n\t>\n\t\t<$set\n\t\t\tname=\"filteredList\"\n\t\t\tfilter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] :all[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\"\n\t\t>\n\t\t\t<$let\n\t\t\t\tnextItem={{{ [enlist<filteredList>after<selectedItem>] :else[enlist<filteredList>nth[1]] }}}\n\t\t\t\tfirstItem={{{ [enlist<filteredList>nth[1]] }}}\n\t\t\t\tlastItem={{{ [enlist<filteredList>last[]] }}}\n\t\t\t>\n\t\t\t\t<%if [<selectedItem>match<firstItem>!match<lastItem>] [<selectedItem>!match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t<%elseif [<selectedItem>match<lastItem>!match<firstItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<%elseif [<selectedItem>match<firstItem>match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<% endif %>\n\t\t\t</$let>\n\t\t</$set>\n\t</$let>\n<% endif %>\n\\end\n\n\\procedure input-next-actions-before()\n\\whitespace trim\n<%if [<storeTitle>get[text]minlength<filterMinLength>] [<filterMinLength>match[0]] %>\n\t<$let\n\t\tuserInput={{{ [<storeTitle>get[text]] }}}\n\t\tselectedItem={{{ [<selectionStateTitle>get[text]] }}}\n\t\tconfigTiddler={{{ [subfilter<configTiddlerFilter>] }}}\n\t\tprimaryListFilter={{{ [<configTiddler>get<firstSearchFilterField>] }}}\n\t\tsecondaryListFilter={{{ [<configTiddler>get<secondSearchFilterField>] }}}\n\t>\n\t\t<$set\n\t\t\tname=\"filteredList\"\n\t\t\tfilter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] :all[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\"\n\t\t>\n\t\t\t<$let\n\t\t\t\tnextItem={{{ [enlist<filteredList>before<selectedItem>] :else[enlist<filteredList>reverse[]nth[1]] }}}\n\t\t\t\tfirstItem={{{ [enlist<filteredList>nth[1]] }}}\n\t\t\t\tlastItem={{{ [enlist<filteredList>last[]] }}}\n\t\t\t>\n\t\t\t\t<%if [<selectedItem>match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<%elseif [<selectedItem>match<lastItem>!match<firstItem>] [<selectedItem>!match<firstItem>!match<lastItem>] %>\n\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t<%elseif [<selectedItem>match<firstItem>match<lastItem>] %>\n\t\t\t\t\t<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n\t\t\t\t\t\t<<input-next-actions-inner>>\n\t\t\t\t\t</$set>\n\t\t\t\t<% endif %>\n\t\t\t</$let>\n\t\t</$set>\n\t</$let>\n<% endif %>\n\\end\n\n\\procedure keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<inputAcceptActions>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<inputAcceptVariantActions>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions-before>>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions-after>>>\n<$keyboard key=\"((input-cancel))\" actions=<<inputCancelActions>>>\n\t<$edit-text\n\t\ttiddler=<<tiddler>> field=<<field>> index=<<index>>\n\t\tinputActions=<<keyboard-input-actions>> tag=<<tag>> class=<<class>>\n\t\tplaceholder=<<placeholder>> default=<<default>> focusPopup=<<focusPopup>>\n\t\tfocus=<<focus>> type=<<type>> rows=<<rows>> minHeight=<<minHeight>>\n\t\ttabindex=<<tabindex>> size=<<size>> autoHeight=<<autoHeight>>\n\t\trefreshTitle=<<refreshTitle>> cancelPopups=<<cancelPopups>>\n\t/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\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,field:\"caption\")\n\\whitespace trim\n<$genesis $type=<<__type__>> class=<<__class__>>>\n\t<$list filter=<<__filter__>> emptyMessage=<<__emptyMessage__>>>\n\t\t<$genesis $type=<<__subtype__>>>\n\t\t\t<$link to={{!!title}}>\n\t\t\t\t<$let tv-wikilinks=\"no\">\n\t\t\t\t\t<$transclude field=<<__field__>>>\n\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t</$transclude>\n\t\t\t\t</$let>\n\t\t\t</$link>\n\t\t</$genesis>\n\t</$list>\n</$genesis>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore<actionTiddler>,<currentTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",emptyMessage,type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n\t<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n\t\t<$genesis $type=<<__type__>> class=\"$class$\">\n\t\t\t<$list filter=\"[list[$tiddler$!!$field$]]\" emptyMessage=<<__emptyMessage__>>>\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=<<list-links-draggable-drop-actions>>\n\t\t\t\t\ttag=\"\"\"$subtype$\"\"\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<div class=\"tc-droppable-placeholder\"/>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n\t\t\t\t\t\t\t<$link to={{!!title}}>\n\t\t\t\t\t\t\t\t<$let tv-wikilinks=\"no\">\n\t\t\t\t\t\t\t\t\t<$transclude field=\"caption\">\n\t\t\t\t\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t\t\t\t</$let>\n\t\t\t\t\t\t\t</$link>\n\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t</div>\n\t\t\t\t</$droppable>\n\t\t\t</$list>\n\t\t\t<$tiddler tiddler=\"\">\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=<<list-links-draggable-drop-actions>> \n\t\t\t\t\ttag=\"div\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<div class=\"tc-droppable-placeholder\">\n\t\t\t\t\t\t{{$:/core/images/blank}}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style=\"height:0.5em;\"/>\n\t\t\t\t</$droppable>\n\t\t\t</$tiddler>\n\t\t</$genesis>\n\t</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n\\whitespace trim\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n\t<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n\t<$list filter=\"[<__tag__>tagging[]]\">\n\t\t<$action-deletefield $field=\"list-before\"/>\n\t\t<$action-deletefield $field=\"list-after\"/>\n\t</$list>\n\t<!-- Save the new order to the Tag Tiddler -->\n\t<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore<actionTiddler>,<currentTiddler>]\"/>\n\t<!-- Make sure the newly added item has the right tag -->\n\t<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n\t<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n\t<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n\t<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n\t\t<$fieldmangler tiddler=<<actionTiddler>>>\n\t\t\t<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n\t\t</$fieldmangler>\n\t</$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\t<$set name=\"tag\" value=<<__tag__>>>\n\t\t<$list\n\t\t\tfilter=\"[<__tag__>tagging[]$subFilter$]\"\n\t\t\temptyMessage=<<__emptyMessage__>>\n\t\t\tstoryview=<<__storyview__>>\n\t\t>\n\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-menu-list-item\">\n\t\t\t\t<$droppable\n\t\t\t\t\tactions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\"\n\t\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t\t>\n\t\t\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-droppable-placeholder\"/>\n\t\t\t\t\t<$genesis $type=<<__elementTag__>>>\n\t\t\t\t\t\t<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n\t\t\t\t\t\t\t<$link to={{!!title}}>\n\t\t\t\t\t\t\t\t<$view field=\"title\"/>\n\t\t\t\t\t\t\t</$link>\n\t\t\t\t\t\t</$transclude>\n\t\t\t\t\t</$genesis>\n\t\t\t\t</$droppable>\n\t\t\t</$genesis>\n\t\t</$list>\n\t\t<$tiddler tiddler=\"\">\n\t\t\t<$droppable\n\t\t\t\tactions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\"\n\t\t\t\tenable=<<tv-enable-drag-and-drop>>\n\t\t\t>\n\t\t\t\t<$genesis $type=<<__elementTag__>> class=\"tc-droppable-placeholder\"/>\n\t\t\t\t<$genesis $type=<<__elementTag__>> style=\"height:0.5em;\"/>\n\t\t\t</$droppable>\n\t\t</$tiddler>\n\t</$set>\n</span>\n\\end\n"},"$:/core/macros/show-filter-count":{"title":"$:/core/macros/show-filter-count","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=<<filter>>/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=<<filter>>/>\n\t<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n\t<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n\t<$action-navigate $to=\"$:/AdvancedSearch\"/>\n\t<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n\t<span class=\"tc-small-gap-right\">''<$count filter=<<filter>>/>''</span>\n\t{{$:/core/images/advanced-search-button}}\n</$button>\n\\end"},"$:/core/macros/tabs":{"title":"$:/core/macros/tabs","tags":"$:/tags/Macro","code-body":"yes","text":"\\define tabs-button()\n\\whitespace trim\n<$button\n\tset=<<tabsState>>\n\tsetTo=<<currentTab>>\n\tdefault=<<__default__>>\n\tselectedClass=\"tc-tab-selected\"\n\ttooltip={{!!tooltip}}\n\trole=\"switch\"\n\tdata-tab-title=<<currentTab>>\n>\n\t<$tiddler tiddler=<<save-currentTiddler>>>\n\t\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t\t\t<$transclude tiddler=<<__buttonTemplate__>> mode=\"inline\">\n\t\t\t\t<$transclude tiddler=<<currentTab>> field=\"caption\">\n\t\t\t\t\t<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n\t\t\t\t</$transclude>\n\t\t\t</$transclude>\n\t\t</$set>\n\t</$tiddler>\n\t<<__actions__>>\n</$button>\n\\end\n\n\\define tabs-tab()\n\\whitespace trim\n<$set name=\"save-currentTiddler\" value=<<currentTiddler>>>\n\t<$tiddler tiddler=<<currentTab>>>\n\t\t<<tabs-button>>\n\t</$tiddler>\n</$set>\n\\end\n\n\\define tabs-tab-list()\n\\whitespace trim\n<$list filter=<<__tabsList__>> variable=\"currentTab\" storyview=\"pop\">\n\t<<tabs-tab>>\n</$list>\n\\end\n\n\\define tabs-tab-body()\n\\whitespace trim\n<$list filter=<<__tabsList__>> variable=\"currentTab\">\n\t<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=<<__default__>> retain=<<__retain__>> tag=\"div\">\n\t\t<$transclude tiddler=<<__template__>> mode=\"block\">\n\t\t\t<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\t\t</$transclude>\n\t</$reveal>\n</$list>\n\\end\n\n\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n\\whitespace trim\n<$qualify title=<<__state__>> name=\"qualifiedState\">\n\t<$let tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n\t\t<div class={{{ [[tc-tab-set]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t<div class={{{ [[tc-tab-buttons]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t\t<<tabs-tab-list>>\n\t\t\t</div>\n\t\t\t<div class={{{ [[tc-tab-divider]addsuffix[ ]addsuffix<__class__>] }}}/>\n\t\t\t<div class={{{ [[tc-tab-content]addsuffix[ ]addsuffix<__class__>] }}}>\n\t\t\t\t<<tabs-tab-body>>\n\t\t\t</div>\n\t\t</div>\n\t</$let>\n</$qualify>\n\\end"},"$:/core/macros/tag-picker":{"title":"$:/core/macros/tag-picker","tags":"$:/tags/Macro","first-search-filter":"[subfilter<tagListFilter>!is[system]search:title<userInput>]","second-search-filter":"[subfilter<tagListFilter>is[system]search:title<userInput>]","text":"<!--\n\tFields: \"first-search-filter\", \"second-search-filter\" are assigned to the keyboard-driven input macro with parameter: \"configTiddlerFilter\"\n\tThey __need to be the same__ as used for variables: \"nonSystemTagsFilter\" and \"systemTagsFilter\". See code below!\n-->\n\n\\whitespace trim\n\n<!-- tf.tagpicker-dropdown-id is needed if several tap-pickers are shown in one tiddler -->\n\\function tf.tagpicker-dropdown-id()\n\t[<qualify $:/state/popup/tags-auto-complete>]\n\t[[$(saveTiddler)$-[$(tagField)$-$(tagListFilter)$]substitute[]sha256[]] :and[join[/]]\n\\end\n\n\\function tf.tagpicker-dropdown-class() [<tf.tagpicker-dropdown-id>sha256[]addprefix[tc-]]\n\\function tf.get-tagpicker-focus-selector() [<tf.tagpicker-dropdown-class>addprefix[.]] .tc-popup-handle :and[join[ ]]\n\n<!-- clean up temporary tiddlers, so the next \"pick\" starts with a clean input -->\n<!-- This could probably be optimized / removed if we would use different temp-tiddlers\n\t(future improvement because keeping track is comlex for humans)\n-->\n\\procedure delete-tag-state-tiddlers()\n<$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\\end\n\n<!-- trigger __toggle tag__ by keyboard -->\n\\procedure add-tag-actions()\n<$let tag=<<_tf.getTag>> >\n\t<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=':and[toggle<tag>trim[]]'/>\n\t<%if [<tag>] :intersection[<saveTiddler>get<tagField>enlist-input[]] %>\n\t\t<!-- tag has been removed - do nothing -->\n\t<%else%>\n\t\t<<actions>>\n\t<%endif%>\n\t<<delete-tag-state-tiddlers>>\n\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$let>\n\\end\n<!-- <$action-log /> -->\n\n<!-- ESC key removes the text from the input\nThe second ESC tries to close the \"draft tiddler\"\n-->\n\\procedure clear-tags-actions-inner()\n<%if [<storeTitle>has[text]] :else[<newTagNameTiddler>has[text]] %>\n\t<<delete-tag-state-tiddlers>>\n<%else%>\n\t\t<<cancel-delete-tiddler-actions \"cancel\">>\n<%endif%>\n\\end\n\n<!-- triggered by keyboard only -->\n\\procedure clear-tags-actions()\n<$let userInput=<<_tf.getUserInput>> >\n\t<!-- this list __cannot__ be transformed to conditional IF. The list variable is used! -->\n\t<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" >\n\t\t<$list-empty>\n\t\t\t<<clear-tags-actions-inner>>\n\t\t</$list-empty>\n\t\t<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/>\n\t\t<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\t</$list>\n</$let>\n\\end\n\n<!-- similar to add-tag-actions __but__ add-only -->\n\\procedure add-button-actions()\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>trim[]]\"/>\n<<actions>>\n<<delete-tag-state-tiddlers>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<tf.get-tagpicker-focus-selector>>/>\n\\end\n<!-- <$action-log /> -->\n\n<!-- create dropdown list -->\n\\procedure tag-picker-listTags(filter, suffix, empty)\n<$let userInput=<<_tf.getUserInput>> >\n\t<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\"\n\t\temptyMessage=\"<div class='tc-search-results'>{{$:/language/Search/Search/TooShort}}</div>\" variable=\"listItem\"\n\t>\n\t\t<$list filter=<<filter>> variable=\"tag\">\n\t\t\t<$list-empty>\n\t\t\t\t<span class=\"tc-small-gap-left\"><<empty>></span>\n\t\t\t</$list-empty>\n\t\t\t<!-- The buttonClasses filter is used to define tc-tag-button-selected state -->\n\t\t\t<!-- tf.get-tagpicker-focus-selector has to be resolved for $:/core/ui/TagPickerTagTemplate,\n\t\t\t\tothwerwise qualify in tf.tagpicker-dropdown-id causes problems -->\n\t\t\t<$let currentTiddler=<<tag>>\n\t\t\t\tbutton-classes=`tc-btn-invisible ${[<tag>addsuffix<suffix>] :except[<tagSelectionState>get[text]] :then[[]] ~tc-tag-button-selected }$`\n\t\t\t\tget-tagpicker-focus-selector=`${[<tf.get-tagpicker-focus-selector>]}$`\n\t\t\t>\n\t\t\t\t{{||$:/core/ui/TagPickerTagTemplate}}\n\t\t\t</$let>\n\t\t</$list>\n\t</$list>\n</$let>\n\\end\n\n<!-- tag-picker-inner is the main function -->\n\\procedure tag-picker-inner()\n<div class={{{ [[tc-edit-add-tag]] [<tf.tagpicker-dropdown-class>] :and[join[ ]] }}}>\n\t<div class=\"tc-edit-add-tag-ui\">\n\t\t<span class=\"tc-add-tag-name tc-small-gap-right\">\n\t\t\t<$transclude $variable=\"keyboard-driven-input\"\n\t\t\t\ttiddler=<<newTagNameTiddler>>\n\t\t\t\tstoreTitle=<<storeTitle>>\n\t\t\t\trefreshTitle=<<refreshTitle>>\n\t\t\t\tselectionStateTitle=<<tagSelectionState>>\n\t\t\t\tinputAcceptActions=<<add-tag-actions>>\n\t\t\t\tinputCancelActions=<<clear-tags-actions>>\n\t\t\t\ttag=\"input\"\n\t\t\t\tplaceholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\t\t\tfocusPopup=<<tf.tagpicker-dropdown-id>>\n\t\t\t\tclass=\"tc-edit-texteditor tc-popup-handle\"\n\t\t\t\ttabindex=<<tabIndex>>\n\t\t\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] :else[[false]] }}}\n\t\t\t\tfilterMinLength={{$:/config/Tags/MinLength}}\n\t\t\t\tcancelPopups=<<cancelPopups>>\n\t\t\t\tconfigTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"\n\t\t\t/>\n\t\t</span>\n\t\t<$button popup=<<tf.tagpicker-dropdown-id>> class=\"tc-btn-invisible tc-btn-dropdown\"\n\t\t\ttooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}\n\t\t>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</$button>\n\t\t<%if [<storeTitle>has[text]] %>\n\t\t\t<$button actions=<<delete-tag-state-tiddlers>> class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\"\n\t\t\t\ttooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}\n\t\t\t>\n\t\t\t\t{{$:/core/images/close-button}}\n\t\t\t</$button>\n\t\t<%endif%>\n\t\t<span class=\"tc-add-tag-button tc-small-gap-left\">\n\t\t\t<$let tag=<<_tf.getTag>>>\n\t\t\t\t<$button set=<<newTagNameTiddler>> actions=<<add-button-actions>> >\n\t\t\t\t\t{{$:/language/EditTemplate/Tags/Add/Button}}\n\t\t\t\t</$button>\n\t\t\t</$let>\n\t\t</span>\n\t</div>\n\t<div class=\"tc-block-dropdown-wrapper\">\n\t\t<%if [<tf.tagpicker-dropdown-id>has[text]] %>\n\t\t\t<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n\t\t\t\t<$transclude $variable=\"tag-picker-listTags\" filter=<<nonSystemTagsFilter>> suffix=\"-primaryList\" empty={{$:/language/EditTemplate/Tags/EmptyMessage}}/>\n\t\t\t\t<hr>\n\t\t\t\t<$transclude $variable=\"tag-picker-listTags\" filter=<<systemTagsFilter>> suffix=\"-secondaryList\" empty={{$:/language/EditTemplate/Tags/EmptyMessage/System}}/>\n\t\t\t</div>\n\t\t<%endif%>\n\t</div>\n</div>\n\\end\n\n<!-- prepare all variables for tag-picker keyboard handling -->\n\\procedure tag-picker(actions, tagField:\"tags\", tiddler, tagListFilter:\"[tags[]sort[]]\")\n\n\\function _tf.getUserInput() [<storeTitle>get[text]]\n\\function _tf.getTag() [<newTagNameTiddler>get[text]]\n<!-- Use this function if tag-picker is a stand alone macro. Otherwise use \"newTagNameTiddler\" defined for fieldmangler in EditTemplate -->\n\\function _tf.makeTagNameTiddler() [[$:/temp/NewTagName]] [<tagField>!match[tags]] :and[join[/]] [<qualify>] :and[join[]]\n\n<!-- keep those variables because they may \"bleed\" into macros using old syntax -->\n<!-- \"nonSystemTagsFilter\", \"systemTagsFilter\" __need to be the same__ as fields: \"first-search-filter\", \"second-search-filter\" -->\n<$let\n\tpalette={{$:/palette}}\n\tcolourA={{{ [<palette>getindex[foreground]] }}}\n\tcolourB={{{ [<palette>getindex[background]] }}}\n\tfallbackTarget={{{ [<palette>getindex[tag-background]] }}}\n\n\tsaveTiddler={{{ [<tiddler>is[blank]then<currentTiddler>else<tiddler>] }}}\n\n\tnewTagNameTiddler={{{ [[newTagNameTiddler]is[variable]then<newTagNameTiddler>] :else[<_tf.makeTagNameTiddler>] }}}\n\tstoreTitle={{{ [[$:/temp/NewTagName/input]] [<tagField>!match[tags]] :and[join[/]] [<qualify>] :and[join[]] }}}\n\n\tnewTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">>\n\ttagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] :else[<newTagNameSelectionTiddlerQualified>] }}}\n\n\trefreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">>\n\n\tnonSystemTagsFilter=\"[subfilter<tagListFilter>!is[system]search:title<userInput>]\"\n\tsystemTagsFilter=\"[subfilter<tagListFilter>is[system]search:title<userInput>]\"\n\n\tcancelPopups=\"yes\"\n>\n\t<$transclude $variable=\"tag-picker-inner\"/>\n</$let>\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<!-- This has no whitespace trim to avoid modifying $actions$ -->\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n\\whitespace trim\n<$let\n\tforegroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>\n\tbackgroundColor=<<__colour__>>\n>\n<$element-tag$\n\t$element-attributes$\n\tclass=\"tc-tag-label tc-btn-invisible\"\n\tstyle=<<tag-pill-styles>>\n>\n\t<<__actions__>>\n\t<$transclude tiddler=<<__icon__>>/>\n\t<span class={{{ [<__tag__>is[missing]then[tc-tag-missing]else[tc-tag-exists]] }}}>\n\t\t<$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n\t</span>\n</$element-tag$>\n</$let>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n\\whitespace trim\n<$macrocall $name=\"tag-pill-inner\"\n\ttag=<<__tag__>>\n\ticon=<<__icon__>>\n\tcolour=<<__colour__>>\n\tfallbackTarget={{$palette$##tag-background}}\n\tcolourA={{$palette$##foreground}}\n\tcolourB={{$palette$##background}}\n\telement-tag=<<__element-tag__>>\n\telement-attributes=<<__element-attributes__>>\n\tactions=<<__actions__>>\n/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n\\whitespace trim\n<span class=\"tc-tag-list-item\" data-tag-title=<<__tag__>>>\n\t<$let currentTiddler=<<__tag__>>>\n\t\t<$macrocall $name=\"tag-pill-body\"\n\t\t\ttag=<<__tag__>>\n\t\t\ticon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\n\t\t\tcolour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\n\t\t\tpalette={{$:/palette}}\n\t\t\telement-tag=<<__element-tag__>>\n\t\t\telement-attributes=<<__element-attributes__>>\n\t\t\tactions=<<__actions__>>/>\n\t</$let>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"},"$:/core/macros/testcase":{"title":"$:/core/macros/testcase","tags":"$:/tags/Macro","text":"\\whitespace trim\n\n\\procedure testcase(tiddler)\n<$tiddler tiddler=<<tiddler>>>\n<$transclude $tiddler=\"$:/core/ui/TestCaseTemplate\">\n</$tiddler>\n\\end\n"},"$:/core/macros/thumbnails":{"title":"$:/core/macros/thumbnails","tags":"$:/tags/Macro","text":"<!-- This macro does not use \\whitespace trim because it could affect the caption -->\n\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\"\n><div\n\tclass=\"tc-thumbnail-image\"\n\tstyle=\"width:$width$px;height:$height$px;\"><$reveal\n\ttype=\"nomatch\"\n\ttext=\"\"\n\tdefault=\"\"\"$image$\"\"\"\n\ttag=\"div\"\n\tstyle=\"width:$width$px;height:$height$px;\"\n>[img[$image$]]</$reveal><$reveal\n\ttype=\"match\"\n\ttext=\"\"\n\tdefault=\"\"\"$image$\"\"\"\n\ttag=\"div\"\n\tclass=\"tc-thumbnail-background\"\n\tstyle=\"width:$width$px;height:$height$px;background-color:$background-color$;\"\n></$reveal></div><div\n\tclass=\"tc-thumbnail-icon\"\n\tstyle=\"fill:$color$;color:$color$;\"\n>$icon$</div><div class=\"tc-thumbnail-caption\">$caption$</div></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","tags":"$:/tags/Macro","text":"<!-- Override one or both of the following two macros with a global or local macro of the same name \nif you need to change how titles are displayed on a timeline -->\n\n\\procedure timeline-title() <$view field=\"title\"/>\n\\procedure timeline-link() <$link to={{!!title}}><<timeline-title>></$link>\n\\procedure timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n\\whitespace trim\n<div class=\"tc-timeline\">\n<$set name=\"tv-tids\" filter=`[!is[system]$(subfilter)$has<dateField>!sort<dateField>limit<limit>]`>\n<$list filter=\"[enlist<tv-tids>eachday<dateField>]\">\n<div class=\"tc-menu-list-item\">\n<$view field=<<dateField>> format=\"date\" template=<<format>>/>\n<$list filter=`[enlist<tv-tids>sameday:$(dateField)${!!$(dateField)$}]`>\n<div class=\"tc-menu-list-subitem\">\n<<timeline-link>>\n</div>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n\\end\n"},"$:/core/macros/toc":{"title":"$:/core/macros/toc","tags":"$:/tags/Macro","text":"\n\\define toc-open-icon() $:/core/images/down-arrow\n\\define toc-closed-icon() $:/core/images/right-arrow\n\n\\define toc-caption()\n\\whitespace trim\n<span class=\"tc-toc-caption tc-tiny-gap-left\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n</span>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__exclude__>]\"\"\">\n <$let item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"[subfilter<__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 to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><<toc-caption>></$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 </$let>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\", exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} >\n <$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>>/>\n</$let>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\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 to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n <$transclude tiddler=<<toc-closed-icon>> />\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 <$transclude tiddler=<<toc-open-icon>> />\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\\whitespace trim\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 <$transclude tiddler=<<toc-closed-icon>> />\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 <$transclude tiddler=<<toc-open-icon>> />\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\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"[subfilter<__exclude__>] [<__tag__>]\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__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</$let>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n\\whitespace trim\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 to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]] -[subfilter<__exclude__>]\" 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 <$transclude tiddler=<<toc-closed-icon>> />\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 <$transclude tiddler=<<toc-open-icon>> />\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\\whitespace trim\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]] -[subfilter<__exclude__>]\" variable=\"ignore\" emptyMessage=\"\"\"<$button class=\"tc-btn-invisible\">{{$:/core/images/blank}}</$button><span class=\"toc-item-muted\"><<toc-caption>></span>\"\"\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n <$transclude tiddler=<<toc-closed-icon>> />\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 <$transclude tiddler=<<toc-open-icon>> />\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\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}} tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"[subfilter<__exclude__>] [<__tag__>]\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[subfilter<__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</$let>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\",exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}}>\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]]\" exclude=<<__exclude__>>/>\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</$let>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\",exclude)\n\\whitespace trim\n<$let __tag__={{{ [<__tag__>is[blank]then<currentTiddler>else<__tag__>] }}}>\n <$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>> exclude=<<__exclude__>> />\n </$linkcatcher>\n</$let>\n\\end\n"},"$:/core/macros/translink":{"title":"$:/core/macros/translink","tags":"$:/tags/Macro","text":"\\define translink(title,mode:\"block\")\n\\whitespace trim\n<$list filter=\"[<__mode__>match[block]]\">\n<div class=\"tc-translink\">\n<div>\n<$link to=\"\"\"$title$\"\"\">\n<h1><$text text=\"\"\"$title$\"\"\"/></h1>\n</$link>\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"block\">\n<$set name=\"currentTiddler\" value=\"\"\"$title$\"\"\"><$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/></$set>\n</$transclude>\n</div>\n</div>\n</$list>\n<$list filter=\"[<__mode__>match[inline]]\">\n<span class=\"tc-translink\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n (<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"inline\">\n<$set name=\"currentTiddler\" value=\"\"\"$title$\"\"\"><$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/></$set>\n</$transclude>)\n</span>\n</$list>\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\\whitespace trim\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\\whitespace trim\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 \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\\whitespace trim\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\\whitespace trim\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":"\\whitespace trim\n<$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":"\\whitespace trim\n<$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\\whitespace trim\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\\whitespace trim\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":"\\whitespace trim\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"},"$:/snippets/paletteswitcher":{"title":"$:/snippets/paletteswitcher","text":"\\whitespace trim\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\">\n<$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\">\n<div class=<<cls>>>\n<$link to={{!!title}}>\n''<$view field=\"name\" format=\"text\"/>''\n - \n<$view field=\"description\" format=\"text\"/>\n{{||$:/snippets/currpalettepreview}}\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>\n"},"$:/snippets/peek-stylesheets":{"title":"$:/snippets/peek-stylesheets","text":"\\define expandable-stylesheets-list()\n\\whitespace trim\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<$codeblock code=<<styles>> language=\"css\"/>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n\\whitespace trim\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\\whitespace trim\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/Plugins $:/core/ui/ControlPanel/Plugins/Installed/Themes $:/core/ui/ControlPanel/Plugins/Installed/Languages"},"$:/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/EditTemplateBodyFilter":{"title":"$:/tags/EditTemplateBodyFilter","list":"$:/config/EditTemplateBodyFilters/canonical-uri $:/config/EditTemplateBodyFilters/default"},"$:/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/layout]] [[$:/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/network-activity]] [[$:/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/StoryTiddlerTemplateFilter":{"title":"$:/tags/StoryTiddlerTemplateFilter","list":"$:/config/StoryTiddlerTemplateFilters/draft $:/config/StoryTiddlerTemplateFilters/default"},"$:/tags/TestCase/Actions":{"title":"$:/tags/TestCase/Actions","list":""},"$:/tags/TextEditor/Snippet":{"title":"$:/tags/TextEditor/Snippet","list":"$:/language/Snippets/ProcedureDefinition $:/language/Snippets/FunctionDefinition $:/language/Snippets/ListByTag $:/language/Snippets/Table4x3 $:/language/Snippets/TableOfContents $:/language/Snippets/MacroDefinition"},"$:/tags/TiddlerColourFilter":{"title":"$:/tags/TiddlerColourFilter","list":"$:/config/TiddlerColourFilters/color-field $:/config/TiddlerColourFilters/default","text":""},"$:/tags/TiddlerIconFilter":{"title":"$:/tags/TiddlerIconFilter","list":"$:/config/TiddlerIconFilters/icon-field $:/config/TiddlerIconFilters/default","text":""},"$:/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]] [[$:/core/ui/ViewTemplate/lazy-loading]]"},"$:/tags/ViewTemplateBodyFilter":{"title":"$:/tags/ViewTemplateBodyFilter","list":"$:/config/ViewTemplateBodyFilters/testcase $:/config/ViewTemplateBodyFilters/hide-body $:/config/ViewTemplateBodyFilters/code-body $:/config/ViewTemplateBodyFilters/stylesheet $:/config/ViewTemplateBodyFilters/core-ui-advanced-search $:/config/ViewTemplateBodyFilters/core-ui-tags $:/config/ViewTemplateBodyFilters/import $:/config/ViewTemplateBodyFilters/plugin $:/config/ViewTemplateBodyFilters/system $:/config/ViewTemplateBodyFilters/default"},"$:/tags/ViewTemplate/Subtitle":{"title":"$:/tags/ViewTemplate/Subtitle","list":"$:/core/ui/ViewTemplate/subtitle/modifier $:/core/ui/ViewTemplate/subtitle/modified"},"$:/tags/ViewTemplateTitleFilter":{"title":"$:/tags/ViewTemplateTitleFilter","list":"$:/config/ViewTemplateTitleFilters/system $:/config/ViewTemplateTitleFilters/default","text":""},"$:/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":"\\whitespace trim\n<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<$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\">\n<div class=<<cls>>><$link to={{!!title}}>\n''<$view field=\"name\" format=\"text\"/>''\n \n<$view field=\"description\" format=\"text\"/>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"},"$:/core/wiki/title":{"title":"$:/core/wiki/title","text":"\\whitespace trim\n{{$:/SiteTitle}}\n<$list filter=\"[{$:/SiteSubtitle}trim[]minlength[1]]\" variable=\"ignore\">\n --- {{$:/SiteSubtitle}}\n</$list>"},"$:/view":{"title":"$:/view","text":"classic"},"$:/snippets/viewswitcher":{"title":"$:/snippets/viewswitcher","text":"\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n\\whitespace trim\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<$button tag=\"a\" class=\"tc-tiddlylink tc-btn-invisible\" to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$button>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>\n"}}}
{"tiddlers":{"$:/config/SyncFilter":{"title":"$:/config/SyncFilter","text":"[is[tiddler]] -[[$:/StoryList]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/library/sjcl.js]] -[[$:/core]] -[[$:/plugins/federatial/xememex]] -[[$:/plugins/federatial/xememex/raw-markup]] -[[$:/plugins/tiddlywiki/tw2parser]] -[[$:/themes/tiddlywiki/snowwhite]] -[[$:/themes/tiddlywiki/vanilla]] -[prefix[$:/boot/]] -[prefix[$:/plugins/federatial/xememex/config/]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"},"$:/plugins/federatial/xememex/bag-operator.js":{"title":"$:/plugins/federatial/xememex/bag-operator.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/bag-operator.js\ntype: application/javascript\nmodule-type: filteroperator\n\nSelects those tiddlers that are stored in the bag 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.frombag = 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\tvar bagName = options.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/bag\",title,\"\");\n\t\t\tif(bagName === 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"},"$:/plugins/federatial/xememex/icon":{"title":"$:/plugins/federatial/xememex/icon","tags":"$:/tags/Image","text":"<svg class=\"tc-image-xememex-plugin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M79.7435765,9.49213757 L64.0237949,36.9372695 L48.0705582,9.08454876 L63.5596004,-1.13686838e-13 L79.7435765,9.49213757 Z M90.764123,15.9558486 L118.119201,32 L118.119201,96 L103.155698,104.776312 L71.5125369,49.0659545 L90.764123,15.9558486 Z M91.9243286,111.363674 L63.5596004,128 L35.7919091,111.713845 L64.0152972,61.3155681 L91.9243286,111.363674 Z M24.6598969,105.184758 L9,96 L9,32 L36.9468534,15.6087636 L56.5307941,49.0734527 L24.6598969,105.184758 Z\"></path>\n</svg>"},"$:/plugins/tiddlywiki/tiddlyweb/icon/cloud":{"title":"$:/plugins/tiddlywiki/tiddlyweb/icon/cloud","tags":"$:/tags/Image","text":"<svg class=\"tc-image-cloud tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g><path d=\"M24 103C10.745 103 0 92.255 0 79c0-9.697 5.75-18.05 14.027-21.836A24.787 24.787 0 0114 56c0-13.255 10.745-24 24-24 1.373 0 2.718.115 4.028.337C48.628 24.2 58.707 19 70 19c19.882 0 36 16.118 36 36v.082c12.319 1.016 22 11.336 22 23.918 0 12.239-9.16 22.337-20.999 23.814L107 103H24z\"/><path class=\"tc-image-cloud-idle\" d=\"M57.929 84.698a6 6 0 01-8.485 0L35.302 70.556a6 6 0 118.485-8.485l9.9 9.9L81.97 43.686a6 6 0 018.485 8.486L57.929 84.698z\"/><path class=\"tc-image-cloud-progress tc-animate-rotate-slow\" d=\"M44.8 40a3.6 3.6 0 100 7.2h2.06A23.922 23.922 0 0040 64c0 13.122 10.531 23.785 23.603 23.997L64 88l.001-7.2c-9.171 0-16.626-7.348-16.798-16.477L47.2 64c0-5.165 2.331-9.786 5.999-12.868L53.2 55.6a3.6 3.6 0 107.2 0v-12a3.6 3.6 0 00-3.6-3.6h-12zM64 40v7.2c9.278 0 16.8 7.522 16.8 16.8 0 5.166-2.332 9.787-6 12.869V72.4a3.6 3.6 0 10-7.2 0v12a3.6 3.6 0 003.6 3.6h12a3.6 3.6 0 100-7.2l-2.062.001A23.922 23.922 0 0088 64c0-13.255-10.745-24-24-24z\"/></g></svg>"},"$:/plugins/tiddlywiki/tiddlyweb/save/offline":{"title":"$:/plugins/tiddlywiki/tiddlyweb/save/offline","text":"\\import [subfilter{$:/core/config/GlobalImportFilter}]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[[$:/boot/boot.css]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/core/ui/Buttons/save-wiki":{"title":"$:/core/ui/Buttons/save-wiki","tags":"$:/tags/PageControls","caption":"{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} Server status","description":"Status of synchronisation with server","text":"\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/save-wiki\">> tooltip=\"Status of synchronisation with server\" aria-label=\"Server status\" class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<span class=\"tc-dirty-indicator\">\n<%if [<tv-config-toolbar-icons>match[yes]] %>\n{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}}\n<%endif%>\n<%if [<tv-config-toolbar-text>match[yes]] %>\n<span class=\"tc-btn-text\"><$text text=\"Server status\"/></span>\n<%endif%>\n</span>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/save-wiki\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SyncerDropdown]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</div>\n</$reveal>\n"},"$:/config/SaveWikiButton/Template":{"title":"$:/config/SaveWikiButton/Template","text":"$:/plugins/federatial/xememex/save/offline"},"$:/plugins/tiddlywiki/tiddlyweb/styles":{"title":"$:/plugins/tiddlywiki/tiddlyweb/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\nbody.tc-dirty span.tc-dirty-indicator svg {\n\ttransition: fill 250ms ease-in-out;\n}\n\nbody .tc-image-cloud-idle {\n\tfill: <<colour background>>;\n\ttransition: opacity 250ms ease-in-out;\n\topacity: 1;\n\tdisplay: unset;\n}\n\nbody.tc-dirty .tc-image-cloud-idle {\n\topacity: 0;\n\tdisplay: none;\n}\n\nbody .tc-image-cloud-progress {\n\ttransition: opacity 250ms ease-in-out;\n\ttransform-origin: 50% 50%;\n\ttransform: rotate(359deg);\n\tanimation: animation-rotate-slow 2s infinite linear;\n\tfill: <<colour background>>;\n\tdisplay: none;\n\topacity: 0;\n}\n\nbody.tc-dirty .tc-image-cloud-progress {\n\topacity: 1;\n\tdisplay: unset;\n}\n\n@keyframes animation-rotate-slow {\n\tfrom {\n\t\ttransform: rotate(0deg);\n\t}\n\tto {\n\t\ttransform: scale(359deg);\n\t}\n}\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs","tags":"$:/tags/SyncerDropdown","text":"<$button message=\"tm-copy-syncer-logs-to-clipboard\" class=\"tc-btn-invisible\">\n{{$:/core/images/copy-clipboard}} Copy syncer logs to clipboard\n</$button>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<div class=\"tc-drop-down-info\">\nYou are logged in<$reveal state=\"$:/status/UserName\" type=\"nomatch\" text=\"\" default=\"\"> as <strong><$text text={{$:/status/UserName}}/></strong></$reveal><$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"no\"> (read-only)</$reveal>\n</div>\n<hr/>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\n<$button message=\"tm-login\" class=\"tc-btn-invisible\">\n{{$:/core/images/unlocked-padlock}} Login\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button message=\"tm-logout\" class=\"tc-btn-invisible\">\n{{$:/core/images/cancel-button}} Logout\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh","tags":"$:/tags/SyncerDropdown","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button tooltip=\"Get latest changes from the server\" aria-label=\"Refresh from server\" class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-server-refresh\"/>\n{{$:/core/images/refresh-button}}<span class=\"tc-btn-text\"><$text text=\"Get latest changes from the server\"/></span>\n</$button>\n</$reveal>\n"},"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot":{"title":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot","tags":"$:/tags/SyncerDropdown","text":"<$button class=\"tc-btn-invisible\">\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-download-file\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n{{$:/core/images/download-button}} Save snapshot for offline use\n</$button>\n"},"$:/tags/SyncerDropdown":{"title":"$:/tags/SyncerDropdown","list":"$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs"},"$:/plugins/federatial/xememex/info-segment":{"title":"$:/plugins/federatial/xememex/info-segment","tags":"$:/tags/TiddlerInfoSegment","text":"<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-xememex-tiddler-info tc-subtitle\">\nBag: <$view tiddler=\"$:/state/federatial/xememex/tiddlers/bag\" index=<<currentTiddler>>>(none)</$view>\n</div>\n</$reveal>\n"},"$:/plugins/federatial/xememex/login":{"title":"$:/plugins/federatial/xememex/login","text":"<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\nLog in to Xememex: <$button message=\"tm-login\">Login</$button>\n</$reveal>\n\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\nLogged in as {{$:/status/UserName}} <$button message=\"tm-logout\">Logout</$button> <$button message=\"tm-server-refresh\">Fetch updates from server</$button>\n</$reveal>"},"$:/core/modules/widgets/on-render.js":{"title":"$:/core/modules/widgets/on-render.js","text":"/*\\\ntitle: $:/core/modules/widgets/on-render.js\ntype: application/javascript\nmodule-type: widget\n\nOnRender 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 OnRenderWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nOnRenderWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nOnRenderWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tif(this.isWithinVisibleDocument()) {\n\t\twindow.setTimeout(this.handleTimeoutEvent.bind(this),0);\n\t}\n};\n\nOnRenderWidget.prototype.isWithinVisibleDocument = function() {\n\treturn $tw.browser && !this.document.isTiddlyWikiFakeDom && $tw.utils.domContains(this.document,this.parentDomNode);\n};\n\nOnRenderWidget.prototype.handleTimeoutEvent = function() {\n\tif(this.isWithinVisibleDocument()) {\n\t\t$tw.taskDaemon.invoke({\n\t\t\twidget: this,\n\t\t\tname: this.getAttribute(\"name\"),\n\t\t\tactions: this.getAttribute(\"actions\"),\n\t\t\tminimumInterval: parseInt(this.getAttribute(\"minimumInterval\"),10) || 0\n\t\t});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nOnRenderWidget.prototype.execute = function() {\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*/\nOnRenderWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"on-render\"] = OnRenderWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/DefaultTiddlers":{"title":"$:/DefaultTiddlers","text":"[list[DefaultTiddlers!!text]]"},"$:/core/ui/PageTemplate/drafts":{"title":"$:/core/ui/PageTemplate/drafts","text":"This tiddler is overridden by Xememex to remove the red drafts indicator"},"$:/language/PluginReloadWarning":{"title":"$:/language/PluginReloadWarning","text":"Please refresh this page {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect\n\n"},"$:/SiteSubtitle":{"title":"$:/SiteSubtitle","text":"<$transclude tiddler=\"SiteSubtitle\">A place for thinking</$transclude>"},"$:/SiteTitle":{"title":"$:/SiteTitle","text":"<$transclude tiddler=\"SiteTitle\">Xememex</$transclude>"},"$:/config/SyncPollingInterval":{"title":"$:/config/SyncPollingInterval","text":"30000"},"$:/core/ui/AboveStory/tw2-plugin-check":{"title":"$:/core/ui/AboveStory/tw2-plugin-check","text":"(Disabled TW2 plugin check)\n"},"$:/plugins/federatial/xememex/raw-markup-boot.js":{"title":"$:/plugins/federatial/xememex/raw-markup-boot.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/raw-markup-boot.js\ntype: application/javascript\nmodule-type: library\n\nBoot code that is transcluded by a rawmarkup startup tiddler\n\n\\*/\n\n(function() {\n\nvar MAP_BAG_TITLE = \"$:/state/federatial/xememex/tiddlers/bag\",\n\tMAP_ETAG_TITLE = \"$:/state/federatial/xememex/tiddlers/etag\",\n\tCONFIG_RECIPE_TITLE = \"$:/plugins/federatial/xememex/config/recipe\";\n\nif($xememex && $xememex.server && $xememex.server.addEventListener) {\n\t$xememex.server.addEventListener(\"login-status-change\",handleLoginStatusChange);\n}\n\nvar hasBooted = false;\n\nfunction handleLoginStatusChange(user) {\n\tvar requireLogin = $xememex.config[\"require-login\"];\n\tif(user || (!requireLogin && $xememex.server.isAnonymousAccount())) {\n\t\t$xememex.server.removeEventListener(\"login-status-change\",handleLoginStatusChange);\n\t\t$xememex.pill.showDropdown();\n\t\t$xememex.pill.setProgress(1);\n\t\t$xememex.pill.showProgress();\n\t\t$xememex.pill.hideAuth();\n\t\tif(!hasBooted) {\n\t\t\tbootXememex();\n\t\t}\n\t} else {\n\t\tif(requireLogin) {\n\t\t\t$xememex.pill.showDropdown();\n\t\t} else {\n\t\t\tbootTiddlyWiki();\n\t\t}\n\t}\n}\n\nfunction bootXememex() {\n\thasBooted = true;\n\t// Get the tiddlers we need from within the HTML file\n\tvar tiddlerStoreMap = getTiddlerStoreMap(),\n\t\tbagMap = JSON.parse(getTiddlerText(tiddlerStoreMap[MAP_BAG_TITLE])),\n\t\tetagMap = JSON.parse(getTiddlerText(tiddlerStoreMap[MAP_ETAG_TITLE])),\n\t\trecipeName = getTiddlerText(tiddlerStoreMap[CONFIG_RECIPE_TITLE]),\n\t\tbagsToLoad = null,\n\t\ttiddlersToReload = null;\n\t\ttaskFunctions = {\n\t\t\t// Get the recipe details\n\t\t\tgetRecipeDetails: {\n\t\t\t\tprogressContribution: 1,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName),\n\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\tsetProgressIndicator(startProgress,lengthProgress,lengthComputable,loaded,total);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: function(err,recipeInfo) {\n\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Get the details of the bags to be loaded\n\t\t\t\t\t\t\tbagsToLoad = recipeInfo.recipe.map(function(recipeLine) {\n\t\t\t\t\t\t\t\treturn recipeLine[0];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcallback(null);\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\t// Get the cached content of each bag\n\t\t\tgetCachedBags: {\n\t\t\t\tprogressContribution: 50,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\tasync.eachOfSeries(bagsToLoad,function(bagName,bagIndex,callback) {\n\t\t\t\t\t\tvar startProgressBag = startProgress + (lengthProgress / bagsToLoad.length) * bagIndex,\n\t\t\t\t\t\t\tlengthProgressBag = lengthProgress / bagsToLoad.length,\n\t\t\t\t\t\t\tlengthProgressBagFirst = lengthProgressBag / 20;\n\t\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\t\turl: \"bags/\" + fullyEncodeURIComponent(bagName),\n\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\tsetProgressIndicator(startProgressBag,lengthProgressBagFirst,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallback: function(err,bagInfo) {\n\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Load the tiddlers from the bag\n\t\t\t\t\t\t\t\t$xememex.httpRequest({\n\t\t\t\t\t\t\t\t\turl: bagInfo.cacheUrl,\n\t\t\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\t\t\tsetProgressIndicator(startProgressBag + lengthProgressBagFirst,lengthProgressBag - lengthProgressBagFirst,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcallback: function(err,data) {\n\t\t\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvar tiddlerInfoArray;\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\ttiddlerInfoArray = JSON.parse(data);\n\t\t\t\t\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn handleError(\"JSON parse error reading bag \" + bagName)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif(tiddlerInfoArray) {\n\t\t\t\t\t\t\t\t\t\t\ttiddlerInfoArray.forEach(function(tiddlerInfo) {\n\t\t\t\t\t\t\t\t\t\t\t\t$tw.preloadTiddlers.push(tiddlerInfo.fields);\n\t\t\t\t\t\t\t\t\t\t\t\tbagMap[tiddlerInfo.fields.title] = bagName;\n\t\t\t\t\t\t\t\t\t\t\t\tetagMap[tiddlerInfo.fields.title] = tiddlerInfo.etag;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcallback(null);\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},callback);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Get the skinny recipe tiddlers\n\t\t\tgetSkinnyRecipeTiddlers: {\n\t\t\t\tprogressContribution: 5,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\ttiddlersToReload = [];\n\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName) + \"/tiddlers.json\",\n\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\tsetProgressIndicator(startProgress,lengthProgress,lengthComputable,loaded,total);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: function(err,data) {\n\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Process each incoming tiddler to see if it is newer than any existing one\n\t\t\t\t\t\t\tfor(var t=0; t<data.length; t++) {\n\t\t\t\t\t\t\t\tvar tiddlerDetails = data[t],\n\t\t\t\t\t\t\t\t\tetag = etagMap[tiddlerDetails.title];\n\t\t\t\t\t\t\t\tif(!etag || etag !== tiddlerDetails.etag) {\n\t\t\t\t\t\t\t\t\ttiddlersToReload.push(tiddlerDetails.title);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcallback(null);\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\t// Reload any necessary tiddlers\n\t\t\treloadNewTiddlers: {\n\t\t\t\tprogressContribution: 2,\n\t\t\t\thandler: function(startProgress,lengthProgress,callback) {\n\t\t\t\t\tasync.eachOfSeries(tiddlersToReload,function(title,index,callback) {\n\t\t\t\t\t\t$xememex.server.jsonRequest({\n\t\t\t\t\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(recipeName) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\t\t\t\t\t\tprogress: function(lengthComputable,loaded,total) {\n\t\t\t\t\t\t\t\tsetProgressIndicator(startProgress + (lengthProgress / tiddlersToReload.length) * index,lengthProgress / tiddlersToReload.length,lengthComputable,loaded,total);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallback: function(err,tiddlerInfo) {\n\t\t\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$tw.preloadTiddlers.push(tiddlerInfo.fields);\n\t\t\t\t\t\t\t\tetagMap[title] = tiddlerInfo.etag;\n\t\t\t\t\t\t\t\tbagMap[title] = tiddlerInfo.bag;\n\t\t\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},callback);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Work out which tasks we need to run\n\tvar tasks = [];\n\tif($xememex.config[\"load-cached-bags\"]) {\n\t\ttasks.push(taskFunctions.getRecipeDetails);\n\t\ttasks.push(taskFunctions.getCachedBags);\n\t}\n\ttasks.push(taskFunctions.getSkinnyRecipeTiddlers);\n\ttasks.push(taskFunctions.reloadNewTiddlers);\n\t// Work out the progress contribution\n\tvar totalProgressContribution = 0;\n\ttasks.forEach(function(task) {\n\t\ttotalProgressContribution += task.progressContribution;\n\t});\n\t// Execute them\n\tvar currentProgressMark = 0;\n\tasync.eachOfSeries(tasks,\n\t\tfunction(task,index,callback) {\n\t\t\t// Give each task its proportion of the total progress time\n\t\t\tvar startProgressChunk = (currentProgressMark / totalProgressContribution) * 100,\n\t\t\t\tlengthProgressChunk = (task.progressContribution / totalProgressContribution) * 100;\n\t\t\ttask.handler(startProgressChunk,lengthProgressChunk,function(err) {\n\t\t\t\tcurrentProgressMark += task.progressContribution;\n\t\t\t\tcallback(err);\n\t\t\t});\n\t\t},\n\t\tfunction(err) {\n\t\t// Raise any errors\n\t\tif(err) {\n\t\t\treturn handleError(err);\t\t\t\n\t\t}\n\t\t// Save the bag/etag data and boot TiddlyWiki\n\t\t$tw.preloadTiddlers.push({title: MAP_BAG_TITLE, type: \"application/json\", text: JSON.stringify(bagMap)});\n\t\t$tw.preloadTiddlers.push({title: MAP_ETAG_TITLE, type: \"application/json\", text: JSON.stringify(etagMap)});\n\t\tbootTiddlyWiki();\n\t});\n}\n\nfunction setProgressIndicator(startChunk,lengthChunk,lengthComputable,loaded,total) {\n\tvar p;\n\tif(lengthComputable) {\n\t\tp = startChunk + lengthChunk * (loaded / total);\n\t} else {\n\t\tp = startChunk;\n\t}\n\t$xememex.pill.setProgress(p); // Progress 0-100\n}\n\nfunction bootTiddlyWiki() {\n\t$xememex.pill.hideDropdown();\n\t$tw.boot.boot();\t\n}\n\nfunction handleError(err) {\n\tvar msg;\n\tif(err === 401) {\n\t\tmsg = \"Access Denied\";\n\t} else {\n\t\tmsg = err.toString();\n\t}\n\talert(msg);\n}\n\n/*\nGet an object mapping tiddler titles to the DOM node containing the tiddler\n*/\nfunction getTiddlerStoreMap() {\n\tvar map = Object.create(null);\n\tvar e = document.getElementById(\"storeArea\").firstElementChild;\n\twhile(e) {\n\t\tmap[e.getAttribute(\"title\") || \"\"] = e;\n\t\te = e.nextElementSibling;\n\t}\n\treturn map;\n}\n\n/*\nGet the text of a tiddler identified by its DIV\n*/\nfunction getTiddlerText(e) {\n\tif(e) {\n\t\treturn e.firstElementChild.textContent;\t\t\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\n/*\nWe also encode single quote because it is not URL safe for API Gateway (see http://stackoverflow.com/questions/18251399/why-doesnt-encodeuricomponent-encode-single-quotes-apostrophes)\n*/\nfunction fullyEncodeURIComponent(str) {\n\treturn encodeURIComponent(str).replace(/'/g,\"%27\");\n}\n\n})();\n","type":"application/javascript","module-type":"library"},"$:/plugins/federatial/xememex/readme":{"title":"$:/plugins/federatial/xememex/readme","text":"This plugin contains Xememex client utilities for TiddlyWiki.\n"},"$:/plugins/federatial/xememex/readonly":{"title":"$:/plugins/federatial/xememex/readonly","tags":"[[$:/tags/Stylesheet]]","text":"\\define button-selector(title)\nbutton.$title$, .tc-drop-down button.$title$, div.$title$\n\\end\n\n\\define hide-edit-controls()\n<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"yes\">\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fclone>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fdelete>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fedit>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fimport>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fmanager>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-image>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-tiddler>> `{\n\tdisplay: none;\n}`\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n<<hide-edit-controls>>\n"},"$:/plugins/federatial/xememex/startup.js":{"title":"$:/plugins/federatial/xememex/startup.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/startup.js\ntype: application/javascript\nmodule-type: startup\n\nSetup Xememex components\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 = \"xememex-startup\";\nexports.platforms = [\"browser\"];\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar STATE_USERNAME_TITLE = \"$:/state/xememex/username\", // Blank if not logged in\n\tSTATE_EMAIL_TITLE = \"$:/state/xememex/email\",\n\tSTATE_GROUPS_TITLE = \"$:/state/xememex/groups\",\n\tSTATE_STATUS_TITLE = \"$:/state/xememex/status\"; // Status: WAITING, LOGGEDIN, LOGGEDOUT\n\nexports.startup = function() {\n\t// Check dependencies\n\tif(!window.$xememex) {\n\t\tconsole.log(\"Xememex is disabled because xememex.js is missing\");\n\t\treturn;\t\t\n\t}\n\tif(!window.AWSCognito) {\n\t\tconsole.log(\"Xememex is disabled because AWSCognito is missing\");\n\t\treturn;\n\t}\n\t// Initialise state tiddlers\n\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"WAITING\"});\n\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: \"\"});\n\t// Listen for login/logout events\n\t$xememex.server.addEventListener(\"login-status-change\",function(user) {\n\t\tupdateUserStatus(user);\n\t});\n\t// Initialise user status tiddlers\n\tupdateUserStatus($xememex.server.user);\n};\n\nfunction updateUserStatus(user) {\n\tif(user) {\n\t\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"LOGGEDIN\"});\n\t\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: user.name});\n\t\t$tw.wiki.addTiddler({title: STATE_EMAIL_TITLE, text: user.email});\n\t\t$tw.wiki.addTiddler({title: STATE_GROUPS_TITLE, text: user.groups.map(function(t){return \"* \" + t;}).join(\"\\n\"), list: user.groups});\n\t} else {\n\t\t$tw.wiki.addTiddler({title: STATE_STATUS_TITLE, text: \"LOGGEDOUT\"});\n\t\t$tw.wiki.addTiddler({title: STATE_USERNAME_TITLE, text: \"\"});\n\t\t$tw.wiki.addTiddler({title: STATE_EMAIL_TITLE, text: \"\"});\n\t\t$tw.wiki.addTiddler({title: STATE_GROUPS_TITLE, list: []});\n\t}\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/federatial/xememex/status-button":{"title":"$:/plugins/federatial/xememex/status-button","tags":"$:/tags/TopRightBar","list-before":"$:/core/ui/TopBar/menu","text":"<span class=\"tc-popup-keep\">\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\n<$button message=\"tm-login\" tooltip=\"Login to Xememex\" class=\"tc-btn-invisible tc-status-button tc-status-button-logged-out\" selectedClass=\"tc-selected\">\n{{$:/plugins/federatial/xememex/icon}} Log in\n</$button>\n</$reveal>\n<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button popup=<<qualify \"$:/state/popup/xememex-status-button\">> tooltip=\"Xememex login status\" class=\"tc-btn-invisible tc-status-button tc-status-button-logged-in\" selectedClass=\"tc-selected\">\n{{$:/plugins/federatial/xememex/icon}} Logged in as ''{{$:/status/UserName}}''\n</$button>\n</$reveal>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/xememex-status-button\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<p>\nLogged in as {{$:/status/UserName}} ({{$:/state/xememex/email}})\n<$list filter=\"[list[$:/state/xememex/groups!!list]sort[]]\">\n//<$text text=<<currentTiddler>>/>//\n</$list>\n</p>\n<$button message=\"tm-logout\" tag=\"a\">Logout</$button> <$button message=\"tm-server-refresh\" tag=\"a\">Fetch updates from server</$button>\n</div>\n</$reveal>"},"$:/plugins/federatial/xememex/styles":{"title":"$:/plugins/federatial/xememex/styles","tags":"[[$:/tags/Stylesheet]]","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Background\n*/\n\nhtml body.tc-body {\n\tdisabled-background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill-opacity='0.82' fill-rule='nonzero'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n}\n\n/*\n** Hide irrelevant toolbar buttons\n*/\n\nbutton.tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fencryption, div.tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fencryption {\n\tdisplay: none;\t\n}\n\n\n/*\n** Login status button\n*/\n\nbutton.tc-btn-invisible.tc-status-button {\n\tcolor: white;\n\tborder-radius:4px;\n\tpadding: 3px 5px;\n\tfont-size: 0.85em;\n}\n\nbutton.tc-btn-invisible.tc-status-button svg {\n\tfill: white;\n}\n\nbutton.tc-btn-invisible.tc-status-button:hover {\n\tcolor: white;\n\tfill: white;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in {\n\tbackground: green;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out {\n\tbackground: blue;\t\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in:hover,\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out:hover {\n\tbackground: black;\n}\n\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-in:hover svg,\nbutton.tc-btn-invisible.tc-status-button.tc-status-button-logged-out:hover svg {\n\tcolor: white;\n\tfill: white;\n}\n\n/*\n** Syncer stus\n*/\n\n.tc-syncer-status {\n}\n\n.tc-syncer-status-queued-out {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n line-height: 0;\n}\n\n.tc-syncer-status-in-progress {\n\tposition: fixed;\n\ttext-align: center;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n line-height: 0;\n}\n\n.tc-syncer-status-queued-in {\n\tposition: fixed;\n\ttext-align: right;\n\ttop: 0;\n\tright: 0;\n line-height: 0;\n}\n\n.tc-syncer-status-item {\n\tdisplay: inline-block;\n\tmargin: 1px;\n\twidth: 3px;\n\theight: 3px;\n}\n\n.tc-syncer-status-queued-out .tc-syncer-status-item {\n\tbackground: red;\n}\n\n.tc-syncer-status-in-progress .tc-syncer-status-item {\n\tbackground: blue;\n}\n\n.tc-syncer-status-queued-in .tc-syncer-status-item {\n\tbackground: green;\n}\n\n"},"$:/plugins/federatial/xememex/syncadaptor.js":{"title":"$:/plugins/federatial/xememex/syncadaptor.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/syncadaptor.js\ntype: application/javascript\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with Xememex servers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CONFIG_HOST_TIDDLER = \"$:/config/tiddlyweb/host\",\n\tCONFIG_SYNC_DISABLE_LOAD_FROM_SERVER = \"$:/config/SyncDisableLoadFromServer\",\n\tDEFAULT_HOST_TIDDLER = \"$protocol$//$host$/\",\n\tLOGIN_MODAL_TITLE = \"$:/plugins/federatial/xememex/login-modal\";\n\nfunction XememexAdaptor(options) {\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"XememexAdaptor\");\n\tthis.recipe = $tw.wiki.getTiddlerText(\"$:/plugins/federatial/xememex/config/recipe\");\n\tthis.isReadOnly = true;\n\tif($xememex && $xememex.server) {\n\t\t$xememex.server.addEventListener(\"login-status-change\",function(user) {\n\t\t\tif($tw.syncer) {\n\t\t\t\t$tw.syncer.getStatus();\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n}\n\nXememexAdaptor.prototype.name = \"xememex\";\n\nXememexAdaptor.prototype.setLoggerSaveBuffer = function(loggerForSaving) {\n\tthis.logger.setSaveBuffer(loggerForSaving);\n};\n\nXememexAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nXememexAdaptor.prototype.getTiddlerInfo = function(tiddlerOrTitle) {\n\tvar title = tiddlerOrTitle;\n\tif(title instanceof $tw.Tiddler) {\n\t\ttitle = tiddlerOrTitle.fields.title;\n\t}\n\tvar etag = this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/etag\",title),\n\t\tbag = this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/bag\",title);\n\tif(etag && bag) {\n\t\treturn {\n\t\t\ttitle: title,\n\t\t\tetag: etag,\n\t\t\tbag: bag\n\t\t};\n\t} else {\n\t\treturn undefined;\n\t}\n};\n\nXememexAdaptor.prototype.getTiddlerRevision = function(title) {\n\treturn this.wiki.extractTiddlerDataItem(\"$:/state/federatial/xememex/tiddlers/etag\",title);\n};\n\nXememexAdaptor.prototype.setTiddlerInfo = function(title,etag,bag) {\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/etag\",null,title,etag,{suppressTimestamp: true});\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/bag\",null,title,bag,{suppressTimestamp: true});\n};\n\nXememexAdaptor.prototype.removeTiddlerInfo = function(title) {\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/etag\",null,title,undefined,{suppressTimestamp: true});\n\tthis.wiki.setText(\"$:/state/federatial/xememex/tiddlers/bag\",null,title,undefined,{suppressTimestamp: true});\n};\n\n/*\nGet the current status of the TiddlyWeb connection\nReturns err,isLoggedIn,username,isReadOnly via callback\n*/\nXememexAdaptor.prototype.getStatus = function(callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(null,false,null,true);\n\t}\n\t$xememex.server.getSession(function(err,user) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t$xememex.server.jsonRequest({\n\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(self.recipe),\n\t\t\tcallback: function(err,recipeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(null,false,null,true);\n\t\t\t\t}\n\t\t\t\tif(user) {\n\t\t\t\t\t$xememex.pill.hideDropdown();\n\t\t\t\t}\n\t\t\t\tself.isReadOnly = !recipeInfo[\"topmost-user-writable-bag\"];\n\t\t\t\tself.shouldRefreshFromServer = !!recipeInfo[\"refresh-from-server\"];\n\t\t\t\tcallback(null,!!user,user && user.name,self.isReadOnly);\n\t\t\t}\n\t\t});\n\t});\n};\n\n/*\nAttempt to login and invoke the callback(err)\n*/\nXememexAdaptor.prototype.login = function(username,password,callback) {\n\tvar self = this;\n\t$xememex.server.login(username,password,null,null,function(err) {\n\t\tif(err) {\n\t\t\tself.logger.log(\"login error: \" + err);\n\t\t\tif(err.code) {\n\t\t\t\tswitch(err.code) {\n\t\t\t\t\tcase \"UserNotFoundException\":\n\t\t\t\t\t\terr = \"Username `\" + username + \"` not found. Please check that you have typed your username correctly\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"NotAuthorizedException\":\n\t\t\t\t\t\terr = \"User `\" + username + \"` is not authorised. Please check that you have typed your password correctly\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terr = \"<pre><code>\" + err + \"</code></pre>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.logger.alert(err);\n\t\t}\n\t\tcallback(err);\n\t});\n};\n\n/*\nDisplay our custom login prompt\n*/\nXememexAdaptor.prototype.displayLoginPrompt = function() {\n\t$xememex.pill.hideProgress();\n\t$xememex.pill.showLogin();\n\t$xememex.pill.showDropdown();\n};\n\n/*\nHandle forgotten password link\n*/\nXememexAdaptor.prototype.forgotPassword = function() {\n\t$xememex.server.forgotPassword(data.email,function(err,result) {\n\t\tif(err) {\n\t\t\tself.logger.log(\"Error handling forgotten password\",err);\n\t\t\tvar msg = err;\n\t\t\tswitch(err.code) {\n\t\t\t\tcase \"UserNotFoundException\":\n\t\t\t\t\tmsg = \"Email address not found\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn alert(msg);\n\t\t}\n\t\tif(result) {\n\t\t\talert(\"Please check your email for your new temporary password\");\n\t\t}\n\t});\n};\n\n/*\n*/\nXememexAdaptor.prototype.logout = function(callback) {\n\t$xememex.server.logout();\n};\n\n/*\nGet metadata for any new tiddlers from the server\n*/\nXememexAdaptor.prototype.getUpdatedTiddlers = function(syncer,callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(null,null);\n\t}\n\tif($tw.wiki.getTiddlerText(CONFIG_SYNC_DISABLE_LOAD_FROM_SERVER) === \"yes\") {\n\t\treturn callback(null,null);\n\t}\n\tif(!self.shouldRefreshFromServer) {\n\t\treturn callback(null,null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers.json\",\n\t\tcallback: function(err,data) {\n\t\t\tif(err) {\n\t\t\t\tif(err.toString() === \"Error: Not logged in\") {\n\t\t\t\t\treturn callback(null,null);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Error retrieving skinny tiddler: \" + err);\n\t\t\t\treturn callback(null,null);\n\t\t\t}\n\t\t\t// Prepare results\n\t\t\tvar result = {\n\t\t\t\tmodifications: [],\n\t\t\t\tdeletions: []\n\t\t\t};\n\t\t\t// Process each incoming tiddler to see if it is newer than any existing one, keeping track of which tiddlers are found\n\t\t\tvar currentTitles = syncer.getSyncedTiddlers();\n\t\t\tfor(var t=0; t<data.length; t++) {\n\t\t\t\tvar tiddlerDetails = data[t],\n\t\t\t\t\tpos = currentTitles.indexOf(tiddlerDetails.title);\n\t\t\t\tif(pos != -1) {\n\t\t\t\t\tcurrentTitles.splice(pos,1);\n\t\t\t\t}\n\t\t\t\tvar tiddlerInfo = syncer.tiddlerInfo[tiddlerDetails.title];\n\t\t\t\tif(!tiddlerInfo || tiddlerDetails.etag !== tiddlerInfo.revision) {\n\t\t\t\t\tresult.modifications.push(tiddlerDetails.title);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers we've got that were not listed in the incoming\n\t\t\t$tw.utils.each(currentTitles,function(title) {\n\t\t\t\tresult.deletions.push(title);\n\t\t\t});\n\t\t\tcallback(null,result);\n\t\t}\n\t});\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nXememexAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tif(this.isReadOnly) {\n\t\treturn callback(null,{bag: \"default\"},\"\");\n\t}\n\tvar self = this,\n\t\ttitle = tiddler.fields.title;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\ttype: \"PUT\",\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\theaders: {\n\t\t\t\"Content-type\": \"application/json\"\n\t\t},\n\t\tdata: JSON.stringify(tiddler.getFieldStrings(),null,$tw.config.preferences.jsonSpaces),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from saveTiddler\",err,data);\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(data && data.errorMessage) {\n\t\t\t\treturn callback(data.errorMessage)\n\t\t\t}\n\t\t\tself.setTiddlerInfo(title,data.etag,data.bag);\n\t\t\tcallback(err,{bag: data.bag},data.etag);\n\t\t}\n\t});\n};\n\n/*\nLoad a tiddler and invoke the callback with (err,tiddlerFields)\n\nIf the tiddler is not found, err and tiddlerFields are both null\n*/\nXememexAdaptor.prototype.loadTiddler = function(title,callback) {\n\tvar self = this;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from loadTiddler\",err,data);\n\t\t\tif(!err) {\n\t\t\t\tself.setTiddlerInfo(title,data.etag,data.bag);\n\t\t\t\treturn callback(null,data.fields);\n\t\t\t} else if(err === 404) {\n\t\t\t\treturn callback(null,null);\n\t\t\t} else {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nLoad one or more tiddlers and invoke the callback with (err,tiddlerFieldsArray)\n*/\nXememexAdaptor.prototype.batchLoadTiddlers = function(titles,callback) {\n\tvar self = this,\n\t\tpayload = titles.map(function(title) {\n\t\t\treturn {\n\t\t\t\ttype: \"GET\",\n\t\t\t\ttitle: title\n\t\t\t};\n\t\t});\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\t$xememex.server.jsonRequest({\n\t\ttype: \"POST\",\n\t\turl: \"recipes/\" + fullyEncodeURIComponent(this.recipe) + \"/batch\",\n\t\theaders: {\n\t\t\t\"Content-type\": \"application/json\"\n\t\t},\n\t\tdata: JSON.stringify(payload,null,$tw.config.preferences.jsonSpaces),\n\t\tcallback: function(err,data) {\n\t\t\tconsole.log(\"Back from batchLoadTiddlers\",err,data);\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar tiddlers = [];\n\t\t\tdata.forEach(function(tiddlerInfo) {\n\t\t\t\ttiddlers.push(tiddlerInfo.fields);\n\t\t\t\tself.setTiddlerInfo(tiddlerInfo.fields.title,tiddlerInfo.etag,tiddlerInfo.bag);\t\t\t\t\n\t\t\t});\n\t\t\tcallback(err,tiddlers);\n\t\t}\n\t});\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\noptions include:\ntiddlerInfo: the syncer's tiddlerInfo for this tiddler\n*/\nXememexAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.isReadOnly) {\n\t\treturn callback(null);\n\t}\n\tvar self = this,\n\t\ttiddlerInfo = this.getTiddlerInfo(title),\n\t\tbagName = tiddlerInfo && tiddlerInfo.bag;\n\tif(!$xememex || !$xememex.server) {\n\t\treturn callback(\"Not logged in\",null);\n\t}\n\tif(bagName) {\n\t\t$xememex.server.request({\n\t\t\ttype: \"DELETE\",\n\t\t\turl: \"recipes/\" + fullyEncodeURIComponent(self.recipe) + \"/tiddlers/\" + fullyEncodeURIComponent(title),\n\t\t\theaders: {\n\t\t\t\t\"Content-type\": \"application/json\"\n\t\t\t},\n\t\t\tcallback: function(err,data,httpRequest) {\n\t\t\t\tconsole.log(\"Back from deleteTiddler\",err,data,httpRequest.response);\n\t\t\t\tif(data && data.errorMessage) {\n\t\t\t\t\treturn callback(data.errorMessage)\n\t\t\t\t} else if(err === 400 && httpRequest.response === \"ERROR_TIDDLER_IS_NOT_IN_TOP_BAG_IN_RECIPE\") {\n\t\t\t\t\tself.logger.alert(\"'<$text text=\\\"\\\"\\\"\" + title + \"\\\"\\\"\\\"/>' cannot be deleted because it is not from the topmost bag of the recipe '\" + self.recipe + \"'\");\n\t\t\t\t\t$tw.syncer.enqueueLoadTiddler(title);\n\t\t\t\t\tvar story = new $tw.Story();\n\t\t\t\t\tstory.navigateTiddler(title);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else if(err) {\n\t\t\t\t\tcallback(err,data);\n\t\t\t\t} else {\n\t\t\t\t\tself.removeTiddlerInfo(title);\n\t\t\t\t\tcallback(err,data);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t} else {\n\t\t// If we don't have a record of the tiddler then it was never synced to the server so we don't need to delete it\n\t\t$tw.utils.nextTick(function() {\n\t\t\tcallback(null);\n\t\t});\n\t}\n};\n\n/*\nWe also encode single quote because it is not URL safe for API Gateway (see http://stackoverflow.com/questions/18251399/why-doesnt-encodeuricomponent-encode-single-quotes-apostrophes)\n*/\nfunction fullyEncodeURIComponent(str) {\n\treturn encodeURIComponent(str).replace(/'/g,\"%27\");\n}\n\nif($tw.browser) {\n\texports.adaptorClass = XememexAdaptor;\n}\n\n})();\n","type":"application/javascript","module-type":"syncadaptor"},"$:/core/modules/startup/task-daemon.js":{"title":"$:/core/modules/startup/task-daemon.js","text":"/*\\\ntitle: $:/core/modules/startup/task-daemon.js\ntype: application/javascript\nmodule-type: startup\n\nTask daemon for on-render widget\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 = \"task-daemon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\nexports.startup = function() {\n\t$tw.taskDaemon = new TaskDaemon();\n};\n\nfunction TaskDaemon() {\n\tthis.lastInvocationTime = {}; // Hashmap by task name of dates\n}\n\n/*\nOptions include:\n\nwidget: reference to the widget triggering the task\nname: name for this task\nactions: actions comprising the task\nminimumInterval: minimum interval between invocations in milliseconds\n*/\nTaskDaemon.prototype.invoke = function(options) {\n\tvar now = new Date();\n\tif(options.name) {\n\t\tif(options.minimumInterval && this.lastInvocationTime[options.name]) {\n\t\t\tif((now - this.lastInvocationTime[options.name]) < options.minimumInterval) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.lastInvocationTime[options.name] = now;\n\t}\nconsole.log(\"Invoking actions\",options.actions)\n\toptions.widget.invokeActionString(options.actions,options.widget,{});\n}\n\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/federatial/xememex/save/offline":{"title":"$:/plugins/federatial/xememex/save/offline","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/]] -[prefix[$:/status/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/plugins/federatial/xememex]] -[[$:/isEncrypted]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/federatial/xememex/save/all-prefix":{"title":"$:/plugins/federatial/xememex/save/all-prefix","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix}}\n"},"$:/plugins/federatial/xememex/save/all-suffix":{"title":"$:/plugins/federatial/xememex/save/all-suffix","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix}}\n"},"$:/plugins/federatial/xememex/save/empty-prefix":{"title":"$:/plugins/federatial/xememex/save/empty-prefix","text":"\\define saveTiddlerFilter()\n[[$:/core]] [[$:/isEncrypted]] [[$:/themes/tiddlywiki/snowwhite]] [[$:/themes/tiddlywiki/vanilla]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix}}\n"},"$:/plugins/federatial/xememex/save/empty-suffix":{"title":"$:/plugins/federatial/xememex/save/empty-suffix","text":"\\define saveTiddlerFilter()\n[[$:/core]] [[$:/isEncrypted]] [[$:/themes/tiddlywiki/snowwhite]] [[$:/themes/tiddlywiki/vanilla]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix}}\n"},"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix":{"title":"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-prefix","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<div id=\"storeArea\" style=\"display:none;\">\n`\n"},"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix":{"title":"$:/plugins/federatial/xememex/templates/tiddlywiki5.html-suffix","text":"\\define tiddlers()\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n\\end\n<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n<<tiddlers>>\n`</div>\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"},"$:/plugins/federatial/xememex/upgrader.js":{"title":"$:/plugins/federatial/xememex/upgrader.js","text":"/*\\\ntitle: $:/plugins/federatial/xememex/upgrader.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses Xememex-specific system tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_PREFIX_LIST = [\"$:/plugins/federatial/xememex\"];\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\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\tmessages[title] = \"Xememex system tiddler blocked\";\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n","type":"application/javascript","module-type":"upgrader"}}}
```
<script>
window.$tw = window.$tw || {};
$tw.boot = $tw.boot || {};
$tw.preloadTiddlers = $tw.preloadTiddlers || [];
$tw.boot.suppressBoot = true;
window.$xememex = {
config: {
"require-login": false,
"load-cached-bags": false,
"pill-button": false,
"pill-dropdown": "modal",
"show-cancel": true
}
}
</script>
<script src="../~lib/xememex.js" onerror="console.log('Cannot load xememex.js');$tw.boot.suppressBoot = false;"></script>
<script>
```
{{$:/plugins/federatial/xememex/raw-markup-boot.js}}
```
</script>
```
{"tiddlers":{"$:/core/ui/ViewTemplate/classic":{"title":"$:/core/ui/ViewTemplate/classic","tags":"$:/tags/ViewTemplate $:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\n\n"},"$:/core/modules/widgets/classictransclude.js":{"title":"$:/core/modules/widgets/classictransclude.js","text":"/*\\\ntitle: $:/core/modules/widgets/classictransclude.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\";\nvar sliceSeparator = \"::\";\nvar sectionSeparator = \"##\";\n\nfunction getsectionname(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sectionSeparator.length);\n\t}\n\treturn \"\";\n}\nfunction getslicename(title) { \n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sliceSeparator.length);\n\t}\n\treturn \"\";\n};\nfunction gettiddlername(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\tpos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\treturn title;\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.rawTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeTitle = gettiddlername(this.rawTitle);\n\tthis.section = getsectionname(this.rawTitle);\n\tthis.slice = getslicename(this.rawTitle);\n\t// Check for recursion\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\tthis.makeChildWidgets([{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}]);\n\t\treturn;\n\t}\n\t// Check for correct type\n\tvar existingTiddler = this.wiki.getTiddler(this.transcludeTitle);\n\t// Check if we're dealing with a classic tiddler\n\tif(existingTiddler && existingTiddler.hasField(\"type\") && existingTiddler.fields.type !== \"text/x-tiddlywiki\") {\n\t\tthis.makeChildWidgets([{type: \"text\", text: \"Tiddler not of type 'text/x-tiddlywiki'\"}]);\n\t\treturn;\n\t}\n\tif(existingTiddler && !existingTiddler.hasField(\"type\")) {\n\t\tthis.makeChildWidgets([{type: \"text\", text: \"Tiddler not of type 'text/x-tiddlywiki'\"}]);\n\t\treturn;\n\t}\t\t\n\t// Set context variables for recursion detection\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Parse \n\tvar text = this.wiki.getTiddlerText(this.transcludeTitle);\n\tif (!!this.section||!!this.slice) {\n\t\ttext =this.refineTiddlerText(text, this.section, this.slice);\n\t}\n\n\tthis.options ={};\n\tthis.options.parseAsInline = false;\n\tvar parser = this.wiki.parseText(\"text/x-tiddlywiki\",text,{});\n\tvar\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\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.section || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.slice || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\nTranscludeWidget.prototype.slicesRE = /(?:^([\\'\\/]{0,2})~?([\\.\\w]+)\\:\\1[\\t\\x20]*([^\\n]*)[\\t\\x20]*$)|(?:^\\|([\\'\\/]{0,2})~?([\\.\\w]+)\\:?\\4\\|[\\t\\x20]*([^\\|\\n]*)[\\t\\x20]*\\|$)/gm;\n\nTranscludeWidget.prototype.calcAllSlices = function(text)\n{\n\tvar slices = {};\n\tthis.slicesRE.lastIndex = 0;\n\tvar m = this.slicesRE.exec(text);\n\twhile(m) {\n\t\tif(m[2])\n\t\t\tslices[m[2]] = m[3];\n\t\telse\n\t\t\tslices[m[5]] = m[6];\n\t\tm = this.slicesRE.exec(text);\n\t}\n\treturn slices;\n};\n\n// Returns the slice of text of the given name\nTranscludeWidget.prototype.getTextSlice = function(text,sliceName)\n{\n\treturn (this.calcAllSlices(text))[sliceName];\n};\n\nTranscludeWidget.prototype.refineTiddlerText = function(text,section,slice)\n{\n\tvar textsection = null;\n\tif (slice) {\n\t\tvar textslice = this.getTextSlice(text,slice);\n\t\tif(textslice)\n\t\t\treturn textslice;\n\t}\n\tif(!section)\n\t\treturn text;\n\tvar re = new RegExp(\"(^!{1,6}[ \\t]*\" + $tw.utils.escapeRegExp(section) + \"[ \\t]*\\n)\",\"mg\");\n\tre.lastIndex = 0;\n\tvar match = re.exec(text);\n\tif(match) {\n\t\tvar t = text.substr(match.index+match[1].length);\n\t\tvar re2 = /^!/mg;\n\t\tre2.lastIndex = 0;\n\t\tmatch = re2.exec(t); //# search for the next heading\n\t\tif(match)\n\t\t\tt = t.substr(0,match.index-1);//# don't include final \\n\n\t\treturn t;\n\t}\n\treturn \"\";\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 ||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.classictransclude = TranscludeWidget;\n\n})();\n","type":"application/javascript","module-type":"widget"},"$:/macros/tiddlywiki/entry.js":{"title":"$:/macros/tiddlywiki/entry.js","text":"/*\\\ntitle: $:/macros/tiddlywiki/entry.js\ntype: application/javascript\nmodule-type: macro\n\\*/\n(function(){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n/*\nInformation about this macro\nreturns value of key in a data json tiddler\nnote that macros are not connected with the refresh mechanism -use with caution.\n*/\nexports.name = \"entryof\";\n\nexports.params = [\n\t{ name: \"key\" }, { name: \"map\" }\n];\n/*\nRun the macro\n*/\nexports.run = function(key,map) {\n\ttry {\n\t\treturn JSON.parse(map)[key];\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n}\n})();\n","type":"application/javascript","module-type":"macro"},"$:/plugins/tiddlywiki/tw2parser/image-css":{"title":"$:/plugins/tiddlywiki/tw2parser/image-css","tags":"$:/tags/Stylesheet","type":"text/plain","text":".classic-image-left{\n float: left;\n}\n\n.classic-image-right{\n float: right;\n}\n"},"$:/plugins/tiddlywiki/tw2parser/macrodefs":{"title":"$:/plugins/tiddlywiki/tw2parser/macrodefs","text":"\\define tiddler(tiddler)\n<$classictransclude tiddler = \"$tiddler$\"/>\n\\end\n\n\\define slider(chkUniqueCookieName tiddler label tooltip)\n<span title=$tooltip$><$button popup=\"$chkUniqueCookieName$\" class=\"tc-btn-invisible tc-slider\">$label$</$button>\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=\"$chkUniqueCookieName$\" animate=\"yes\">\n<$classictransclude tiddler = \"$tiddler$\"/>\n</$reveal></span>\n\\end\n\n\\define __system_tabinstance(state, currentTab, prompts, labels)\n\t\t<span title=<<entryof \"$currentTab$\" \"\"\"$prompts$\"\"\">> ><$button set=<<qualify \"$state$\">> setTo=\"$currentTab$\" selectedClass=\"tc-tab-selected\">\n\t\t<<entryof \"$currentTab$\" \"\"\"$labels$\"\"\" >>\n\t\t</$button></span>\n\\end\n\n\\define __system_tabs(tabsList,prompts,labels,state:\"$:/state/tab\")\n<div class=\"tc-tab-buttons\">\n\t<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\t\t<$macrocall $name=\"__system_tabinstance\" state=\"$state$\" prompts=\"\"\"$prompts$\"\"\" labels=\"\"\"$labels$\"\"\" currentTab=<<currentTab>>/>\n\t</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n\t<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\t\t<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\t\t\t<$classictransclude tiddler=<<currentTab>> />\n\t\t</$reveal>\n\t</$list>\n</div>\n\\end\n"},"$:/macros/classic/macroadapter.js":{"title":"$:/macros/classic/macroadapter.js","text":"/*\\\ntitle: $:/macros/classic/macroadapter.js\ntype: application/javascript\nmodule-type: module\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n/*\nInformation about this module:\nrename macros and\nre-jig macro params from tw2 to tw5 style\nnew macros created as a result of adapting tw2 should be \nprepended \"__system\" to distinguish them from the actual used name\n*/\nvar sliceSeparator = \"::\";\nvar sectionSeparator = \"##\";\n\nfunction getsectionname(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sectionSeparator.length);\n\t}\n\treturn \"\";\n}\nfunction getslicename(title) { \n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(pos + sliceSeparator.length);\n\t}\n\treturn \"\";\n};\nfunction gettiddlername(title) {\n\tif(!title)\n\t\treturn \"\";\n\tvar pos = title.indexOf(sectionSeparator);\n\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\tpos = title.indexOf(sliceSeparator);\n\tif(pos != -1) {\n\t\treturn title.substr(0,pos);\n\t}\n\treturn title;\n}\n\nvar parserparams = function(paramString) {\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 params;\n}\nvar tabshandler = function(paramstring) {\n\tvar params = parserparams(paramstring);\n\tvar cookie = params[0].value;\n\tvar numTabs = (params.length-1)/3;\n\tvar t;\n\tvar tabslist = \"\";\n\tvar labelarray = {};\n var promptarray = {};\n\tfor(t=0; t<numTabs; t++) {\n\t\tvar contentName = params[t*3+3].value;\n\t\ttabslist = tabslist+\" \" + contentName;\n\t\tlabelarray[contentName] = params[t*3+1].value;\n\t\tpromptarray[contentName] = params[t*3+2].value;\n\t} \n\t//Create a list of names (tiddlers, tiddler/sections, tiddler/slices), and create maps from name -> label and name -> prompt\n\t//Use json to implement maps \n\treturn '\"\"\"'+tabslist +'\"\"\" \"\"\"'+JSON.stringify(promptarray)+'\"\"\" \"\"\"'+JSON.stringify(labelarray)+'\"\"\" \"\"\"'+cookie+'\"\"\"';\n};\nvar namedapter = {tabs:'__system_tabs'};\nvar paramadapter = {\n\ttabs: tabshandler\n}\nexports.name = 'macroadapter';\nexports.namedapter = namedapter;\nexports.paramadapter = paramadapter;\n})();\n","type":"application/javascript","module-type":"module"},"$:/plugins/tiddlywiki/tw2parser/readme":{"title":"$:/plugins/tiddlywiki/tw2parser/readme","text":"This experimental plugin provides support for parsing and rendering tiddlers written in TiddlyWiki Classic format (`text/x-tiddlywiki`).\n\n[[Source code|https://github.com/TiddlyWiki/TiddlyWiki5/blob/master/plugins/tiddlywiki/tw2parser]]\n"},"$:/plugins/tiddlywiki/tw2parser/wikitextparser.js":{"title":"$:/plugins/tiddlywiki/tw2parser/wikitextparser.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/tw2parser/wikitextparser.js\ntype: application/javascript\nmodule-type: parser\n\nParses a block of tiddlywiki-format wiki text into a parse tree object. This is a transliterated version of the old TiddlyWiki code. The plan is to replace it with a new, mostly backwards compatible parser built in PEGJS.\n\nA wikitext parse tree is an array of objects with a `type` field that can be `text`,`macro` or the name of an HTML element.\n\nText nodes are represented as `{type: \"text\", value: \"A string of text\"}`.\n\nMacro nodes look like this:\n`\n{type: \"macro\", name: \"view\", params: {\n\tone: {type: \"eval\", value: \"2+2\"},\n\ttwo: {type: \"string\", value: \"twenty two\"}\n}}\n`\nHTML nodes look like this:\n`\n{type: \"div\", attributes: {\n\tsrc: \"one\"\n\tstyles: {\n\t\t\"background-color\": \"#fff\",\n\t\t\"color\": \"#000\"\n\t}\n}}\n`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a new instance of the wiki text parser with the specified options. The\noptions are a hashmap of mandatory members as follows:\n\n\twiki: The wiki object to use to parse any cascaded content (eg transclusion)\n\nPlanned:\n\n\tenableRules: An array of names of wiki text rules to enable. If not specified, all rules are available\n\textraRules: An array of additional rule handlers to add\n\tenableMacros: An array of names of macros to enable. If not specified, all macros are available\n\textraMacros: An array of additional macro handlers to add\n*/\n\nvar WikiTextParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tthis.autoLinkWikiWords = true;\n\tthis.installRules();\n\ttext = text || \"no text\";\n\tthis.source = text;\n\tthis.nextMatch = 0;\n\tthis.children = [];\n\tthis.tree =[];\n\tthis.output = null;\n\tthis.subWikify(this.children);\n\t// prepend tw2 macros locally to the content\n\tvar parser = this.wiki.parseTiddler(\"$:/plugins/tiddlywiki/tw2parser/macrodefs\",{parseAsInline:false});\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tchildren:this.children\n\t}];\n\t// clone the output of parser \n\tvar root = JSON.parse(JSON.stringify(parser.tree));\n\t// macros are defined in a linear tree; walk down the tree and append the source's parsed content \n\tvar baseroot = root;\n\twhile(root[0] && root[0].children && root[0].children.length !== 0 ){ \n\t\troot = root[0].children;\n\t}\n\troot[0].children[0] = this.tree[0];\n\tthis.tree = baseroot;\n};\n\n\nWikiTextParser.prototype.installRules = function() {\n\tvar rules = require(\"./wikitextrules.js\").rules,\n\t\tpattern = [];\n\tfor(var n=0; n<rules.length; n++) {\n\t\tpattern.push(\"(\" + rules[n].match + \")\");\n\t}\n\tthis.rules = rules;\n\tthis.rulesRegExp = new RegExp(pattern.join(\"|\"),\"mg\");\n};\n\n\nWikiTextParser.prototype.outputText = function(place,startPos,endPos) {\n\tif(startPos < endPos) {\n\t\tplace.push({type: \"text\",text:this.source.substring(startPos,endPos)});\n\t}\n};\n\nWikiTextParser.prototype.subWikify = function(output,terminator) {\n\t// Handle the terminated and unterminated cases separately, this speeds up wikifikation by about 30%\n\tif(terminator)\n\t\tthis.subWikifyTerm(output,new RegExp(\"(\" + terminator + \")\",\"mg\"));\n\telse\n\t\tthis.subWikifyUnterm(output);\n};\n\nWikiTextParser.prototype.subWikifyUnterm = function(output) {\n\t// subWikify can be indirectly recursive, so we need to save the old output pointer\n\tvar oldOutput = this.output;\n\tthis.output = output;\n\t// Get the first match\n\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\tvar ruleMatch = this.rulesRegExp.exec(this.source);\n\twhile(ruleMatch) {\n\t\t// Output any text before the match\n\t\tif(ruleMatch.index > this.nextMatch)\n\t\t\tthis.outputText(this.output,this.nextMatch,ruleMatch.index);\n\t\t// Set the match parameters for the handler\n\t\tthis.matchStart = ruleMatch.index;\n\t\tthis.matchLength = ruleMatch[0].length;\n\t\tthis.matchText = ruleMatch[0];\n\t\tthis.nextMatch = this.rulesRegExp.lastIndex;\n\t\t// Figure out which rule matched and call its handler\n\t\tvar t;\n\t\tfor(t=1; t<ruleMatch.length; t++) {\n\t\t\tif(ruleMatch[t]) {\n\t\t\t\tthis.rules[t-1].handler(this);\n\t\t\t\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Get the next match\n\t\truleMatch = this.rulesRegExp.exec(this.source);\n\t}\n\t// Output any text after the last match\n\tif(this.nextMatch < this.source.length) {\n\t\tthis.outputText(this.output,this.nextMatch,this.source.length);\n\t\tthis.nextMatch = this.source.length;\n\t}\n\t// Restore the output pointer\n\tthis.output = oldOutput;\n};\n\nWikiTextParser.prototype.subWikifyTerm = function(output,terminatorRegExp) {\n\t// subWikify can be indirectly recursive, so we need to save the old output pointer\n\tvar oldOutput = this.output;\n\tthis.output = output;\n\t// Get the first matches for the rule and terminator RegExps\n\tterminatorRegExp.lastIndex = this.nextMatch;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\tvar ruleMatch = this.rulesRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);\n\twhile(terminatorMatch || ruleMatch) {\n\t\t// Check for a terminator match before the next rule match\n\t\tif(terminatorMatch && (!ruleMatch || terminatorMatch.index <= ruleMatch.index)) {\n\t\t\t// Output any text before the match\n\t\t\tif(terminatorMatch.index > this.nextMatch)\n\t\t\t\tthis.outputText(this.output,this.nextMatch,terminatorMatch.index);\n\t\t\t// Set the match parameters\n\t\t\tthis.matchText = terminatorMatch[1];\n\t\t\tthis.matchLength = terminatorMatch[1].length;\n\t\t\tthis.matchStart = terminatorMatch.index;\n\t\t\tthis.nextMatch = this.matchStart + this.matchLength;\n\t\t\t// Restore the output pointer\n\t\t\tthis.output = oldOutput;\n\t\t\treturn;\n\t\t}\n\t\t// It must be a rule match; output any text before the match\n\t\tif(ruleMatch.index > this.nextMatch)\n\t\t\tthis.outputText(this.output,this.nextMatch,ruleMatch.index);\n\t\t// Set the match parameters\n\t\tthis.matchStart = ruleMatch.index;\n\t\tthis.matchLength = ruleMatch[0].length;\n\t\tthis.matchText = ruleMatch[0];\n\t\tthis.nextMatch = this.rulesRegExp.lastIndex;\n\t\t// Figure out which rule matched and call its handler\n\t\tvar t;\n\t\tfor(t=1; t<ruleMatch.length; t++) {\n\t\t\tif(ruleMatch[t]) {\n\t\t\t\tthis.rules[t-1].handler(this);\n\t\t\t\tthis.rulesRegExp.lastIndex = this.nextMatch;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Get the next match\n\t\tterminatorRegExp.lastIndex = this.nextMatch;\n\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\truleMatch = this.rulesRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);\n\t}\n\t// Output any text after the last match\n\tif(this.nextMatch < this.source.length) {\n\t\tthis.outputText(this.output,this.nextMatch,this.source.length);\n\t\tthis.nextMatch = this.source.length;\n\t}\n\t// Restore the output pointer\n\tthis.output = oldOutput;\n};\n\nexports[\"text/x-tiddlywiki\"] = WikiTextParser;\n\n})();\n","type":"application/javascript","module-type":"parser"},"$:/plugins/tiddlywiki/tw2parser/wikitextrules.js":{"title":"$:/plugins/tiddlywiki/tw2parser/wikitextrules.js","text":"/*\\\ntitle: $:/plugins/tiddlywiki/tw2parser/wikitextrules.js\ntype: application/javascript\nmodule-type: module\n\nRule modules for the wikitext parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar macroadapter = require(\"$:/macros/classic/macroadapter.js\");\nvar textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z0-9_\\\\-\\u00df-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9_\\\\-\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tanyLetterStrict: \"[A-Za-z0-9\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tsliceSeparator: \"::\",\n\tsectionSeparator: \"##\",\n\turlPattern: \"(?:file|http|https|mailto|ftp|irc|news|data):[^\\\\s'\\\"]+(?:/|\\\\b)\",\n\tunWikiLink: \"~\",\n\tbrackettedLink: \"\\\\[\\\\[([^\\\\]]+)\\\\]\\\\]\",\n\ttitledBrackettedLink: \"\\\\[\\\\[([^\\\\[\\\\]\\\\|]+)\\\\|([^\\\\[\\\\]\\\\|]+)\\\\]\\\\]\"\n};\n\ntextPrimitives.wikiLink = \"(?:(?:\" + textPrimitives.upperLetter + \"+\" +\n\t\t\t\t\t\t\ttextPrimitives.lowerLetter + \"+\" +\n\t\t\t\t\t\t\ttextPrimitives.upperLetter +\n\t\t\t\t\t\t\ttextPrimitives.anyLetter + \"*)|(?:\" +\n\t\t\t\t\t\t\ttextPrimitives.upperLetter + \"{2,}\" +\n\t\t\t\t\t\t\ttextPrimitives.lowerLetter + \"+))\";\n\ntextPrimitives.cssLookahead = \"(?:(\" + textPrimitives.anyLetter +\n\t\"+)\\\\(([^\\\\)\\\\|\\\\n]+)(?:\\\\):))|(?:(\" + textPrimitives.anyLetter + \"+):([^;\\\\|\\\\n]+);)\";\n\ntextPrimitives.cssLookaheadRegExp = new RegExp(textPrimitives.cssLookahead,\"mg\");\n\ntextPrimitives.tiddlerForcedLinkRegExp = new RegExp(\"(?:\" + textPrimitives.titledBrackettedLink + \")|(?:\" +\n\ttextPrimitives.brackettedLink + \")|(?:\" +\n\ttextPrimitives.urlPattern + \")\",\"mg\");\n\ntextPrimitives.tiddlerAnyLinkRegExp = new RegExp(\"(\"+ textPrimitives.wikiLink + \")|(?:\" +\n\ttextPrimitives.titledBrackettedLink + \")|(?:\" +\n\ttextPrimitives.brackettedLink + \")|(?:\" +\n\ttextPrimitives.urlPattern + \")\",\"mg\");\n\n// Helper to add an attribute to an HTML node\nvar setAttr = function(node,attr,value) {\n\tif(!node.attributes) {\n\t\tnode.attributes = {};\n\t}\n\tnode.attributes[attr] ={type: \"string\", value:value} ;\n};\n\nvar inlineCssHelper = function(w) {\n\tvar styles = [];\n\ttextPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;\n\tvar lookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);\n\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\tvar s,v;\n\t\tif(lookaheadMatch[1]) {\n\t\t\ts = lookaheadMatch[1];\n\t\t\tv = lookaheadMatch[2];\n\t\t} else {\n\t\t\ts = lookaheadMatch[3];\n\t\t\tv = lookaheadMatch[4];\n\t\t}\n\t\tif(s==\"bgcolor\")\n\t\t\ts = \"backgroundColor\";\n\t\tif(s==\"float\")\n\t\t\ts = \"cssFloat\";\n\t\tstyles.push({style: s, value: v});\n\t\tw.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n\t\ttextPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;\n\t\tlookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);\n\t}\n\treturn styles;\n};\n\nvar applyCssHelper = function(e,styles) {\n\n\tif(styles.length > 0) {\n\n\t\tfor(var t=0; t< styles.length; t++) {\n\t\t\t$tw.utils.addStyleToParseTreeNode(e,$tw.utils.roundTripPropertyName(styles[t].style),styles[t].value);\n\t\t}\n\t}\n\t\n};\n\nvar enclosedTextHelper = function(w) {\n\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\tvar text = lookaheadMatch[1];\n\t\tw.output.push({type:\"element\",tag:this.element,\n\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\tw.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n\t}\n};\n\nvar insertMacroCall = function(w,output,macroName,paramString) {\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\toutput.push({\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: false\n\t});\n}\n\n\nvar isLinkExternal = function(to) {\n\tvar externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|obsidian|data|skype):[^\\s'\"]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\nvar rules = [\n{\n\tname: \"table\",\n\tmatch: \"^\\\\|(?:[^\\\\n]*)\\\\|(?:[fhck]?)$\",\n\tlookaheadRegExp: /^\\|([^\\n]*)\\|([fhck]?)$/mg,\n\trowTermRegExp: /(\\|(?:[fhck]?)$\\n?)/mg,\n\tcellRegExp: /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?$\\n?)/mg,\n\tcellTermRegExp: /((?:\\x20*)\\|)/mg,\n\trowTypes: {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\thandler: function(w)\n\t{\n\t\tvar table = {type:\"element\",tag:\"table\",attributes: {\"class\": {type: \"string\", value:\"table\"}},\n\t\t\t\t\tchildren: []};\n\t\t\n\t\tw.output.push(table);\n\t\tvar prevColumns = [];\n\t\tvar currRowType = null;\n\t\tvar rowContainer;\n\t\tvar rowCount = 0;\n\t\tw.nextMatch = w.matchStart;\n\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\t\tvar nextRowType = lookaheadMatch[2];\n\t\t\tif(nextRowType == \"k\") {\n\t\t\t\ttable.attributes[\"class\"] = lookaheadMatch[1];\n\t\t\t\tw.nextMatch += lookaheadMatch[0].length+1;\n\t\t\t} else {\n\t\t\t\tif(nextRowType != currRowType) {\n\t\t\t\t\trowContainer = {type:\"element\",tag:this.rowTypes[nextRowType],children: []};\n\t\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\t\tcurrRowType = nextRowType;\n\t\t\t\t}\n\t\t\t\tif(currRowType == \"c\") {\n\t\t\t\t\t// Caption\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\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\t}\n\t\t\t\t\trowContainer.attributes={};\n\t\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t\tw.subWikifyTerm(rowContainer.children,this.rowTermRegExp);\n\t\t\t\t} else {\n\t\t\t\t\tvar theRow = {type:\"element\",tag:\"tr\",\n\t\t\t\t\t\tattributes: {\"class\": {type: \"string\", value:rowCount%2 ? \"oddRow\" : \"evenRow\"}},\n\t\t\t\t\t\tchildren: []};\n\t\t\t\t\t\n\t\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t\tthis.rowHandler(w,theRow.children,prevColumns);\n\t\t\t\t\trowCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tlookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t}\n\t},\n\trowHandler: function(w,e,prevColumns)\n\t{\n\t\tvar col = 0;\n\t\tvar colSpanCount = 1;\n\t\tvar prevCell = null;\n\t\tthis.cellRegExp.lastIndex = w.nextMatch;\n\t\tvar cellMatch = this.cellRegExp.exec(w.source);\n\t\twhile(cellMatch && cellMatch.index == w.nextMatch) {\n\t\t\tif(cellMatch[1] == \"~\") {\n\t\t\t\t// Rowspan\n\t\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\tvar vAlign = $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\tw.nextMatch = this.cellRegExp.lastIndex-1;\n\t\t\t} else if(cellMatch[1] == \">\") {\n\t\t\t\t// Colspan\n\t\t\t\tcolSpanCount++;\n\t\t\t\tw.nextMatch = this.cellRegExp.lastIndex-1;\n\t\t\t} else if(cellMatch[2]) {\n\t\t\t\t// End of row\n\t\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\t\tprevCell.attributes.colspan = colSpanCount;\n\t\t\t\t}\n\t\t\t\tw.nextMatch = this.cellRegExp.lastIndex;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// Cell\n\t\t\t\tw.nextMatch++;\n\t\t\t\tvar styles = inlineCssHelper(w);\n\t\t\t\tvar spaceLeft = false;\n\t\t\t\tvar chr = w.source.substr(w.nextMatch,1);\n\t\t\t\twhile(chr == \" \") {\n\t\t\t\t\tspaceLeft = true;\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t\tchr = w.source.substr(w.nextMatch,1);\n\t\t\t\t}\n\t\t\t\tvar cell;\n\t\t\t\tif(chr == \"!\") {\n\t\t\t\t\tcell = {type:\"element\",tag:\"th\",children: []};\n\t\t\t\t\te.push(cell);\n\t\t\t\t\tw.nextMatch++;\n\t\t\t\t} else {\n\t\t\t\t\tcell = {type:\"element\",tag:\"td\",children: []};\n\t\t\t\t\te.push(cell);\n\t\t\t\t}\n\t\t\t\tprevCell = cell;\n\t\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t\tapplyCssHelper(cell,styles);\n\t\t\t\tw.subWikifyTerm(cell.children,this.cellTermRegExp);\n\t\t\t\tif(!cell.attributes) cell.attributes ={};\n\t\t\t\tif(w.matchText.substr(w.matchText.length-2,1) == \" \") // spaceRight\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t\telse if(spaceLeft)\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t\tw.nextMatch--;\n\t\t\t}\n\t\t\tcol++;\n\t\t\tthis.cellRegExp.lastIndex = w.nextMatch;\n\t\t\tcellMatch = this.cellRegExp.exec(w.source);\n\t\t}\n\t}\n},\n\n{\n\tname: \"heading\",\n\tmatch: \"^!{1,6}\",\n\ttermRegExp: /(\\n)/mg,\n\thandler: function(w)\n\t{\n\t\tvar e = {type:\"element\",tag:\"h\" + w.matchLength,children: []};\n\t\tw.output.push(e);\n\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t}\n},\n\n{\n\tname: \"list\",\n\tmatch: \"^(?:[\\\\*#;:]+)\",\n\tlookaheadRegExp: /^(?:(?:(\\*)|(#)|(;)|(:))+)/mg,\n\ttermRegExp: /(\\n)/mg,\n\thandler: function(w)\n\t{\n\t\tvar stack = [w.output];\n\t\tvar currLevel = 0, currType = null;\n\t\tvar listLevel, listType, itemType, baseType;\n\t\tw.nextMatch = w.matchStart;\n\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\twhile(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {\n\t\t\tif(lookaheadMatch[1]) {\n\t\t\t\tlistType = \"ul\";\n\t\t\t\titemType = \"li\";\n\t\t\t} else if(lookaheadMatch[2]) {\n\t\t\t\tlistType = \"ol\";\n\t\t\t\titemType = \"li\";\n\t\t\t} else if(lookaheadMatch[3]) {\n\t\t\t\tlistType = \"dl\";\n\t\t\t\titemType = \"dt\";\n\t\t\t} else if(lookaheadMatch[4]) {\n\t\t\t\tlistType = \"dl\";\n\t\t\t\titemType = \"dd\";\n\t\t\t}\n\t\t\tif(!baseType)\n\t\t\t\tbaseType = listType;\n\t\t\tlistLevel = lookaheadMatch[0].length;\n\t\t\tw.nextMatch += lookaheadMatch[0].length;\n\t\t\tvar t,e;\n\t\t\tif(listLevel > currLevel) {\n\t\t\t\tfor(t=currLevel; t<listLevel; t++) {\n\t\t\t\t\tvar target = stack[stack.length-1];\n\t\t\t\t\tif(currLevel !== 0 && target.children) {\n\t\t\t\t\t\ttarget = target.children[target.children.length-1];\n\t\t\t\t\t}\n\t\t\t\t\te = {type:\"element\",tag:listType,children: []};\n\t\t\t\t\ttarget.push(e);\n\t\t\t\t\tstack.push(e.children);\n\t\t\t\t}\n\t\t\t} else if(listType!=baseType && listLevel==1) {\n\t\t\t\tw.nextMatch -= lookaheadMatch[0].length;\n\t\t\t\treturn;\n\t\t\t} else if(listLevel < currLevel) {\n\t\t\t\tfor(t=currLevel; t>listLevel; t--)\n\t\t\t\t\tstack.pop();\n\t\t\t} else if(listLevel == currLevel && listType != currType) {\n\t\t\t\tstack.pop();\n\t\t\t\te = {type:\"element\",tag:listType,children: []};\n\t\t\t\tstack[stack.length-1].push(e);\n\t\t\t\tstack.push(e.children);\n\t\t\t}\n\t\t\tcurrLevel = listLevel;\n\t\t\tcurrType = listType;\n\t\t\te = {type:\"element\",tag:itemType,children: []};\n\t\t\tstack[stack.length-1].push(e);\n\t\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tlookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t}\n\t}\n},\n\n{\n\tname: \"quoteByBlock\",\n\tmatch: \"^<<<\\\\n\",\n\ttermRegExp: /(^<<<(\\n|$))/mg,\n\telement: \"blockquote\",\n\thandler: function(w) {\n\t\tvar e = {type:\"element\",tag:this.element,children: []};\n\t\tw.output.push(e);\n\t\tw.subWikifyTerm(e.children,this.termRegExp);\n\t}\n},\n\n{\n\tname: \"quoteByLine\",\n\tmatch: \"^>+\",\n\tlookaheadRegExp: /^>+/mg,\n\ttermRegExp: /(\\n)/mg,\n\telement: \"blockquote\",\n\thandler: function(w)\n\t{\n\t\tvar stack = [];\n\t\tvar currLevel = 0;\n\t\tvar newLevel = w.matchLength;\n\t\tvar t,matched,e;\n\t\tdo {\n\t\t\tif(newLevel > currLevel) {\n\t\t\t\tfor(t=currLevel; t<newLevel; t++) {\n\t\t\t\t\tvar f = stack[stack.length-1];\n\t\t\t\t\te = {type:\"element\",tag:this.element,children: []};\n\t\t\t\t\tstack.push(e);\n\t\t\t\t\tif(t ===0){\n\t\t\t\t\t\tw.output.push(e);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tf.children.push(e);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(newLevel < currLevel) {\n\t\t\t\tfor(t=currLevel; t>newLevel; t--)\n\t\t\t\t\tstack.pop();\n\t\t\t}\n\t\t\tcurrLevel = newLevel;\n\t\t\tw.subWikifyTerm(stack[stack.length-1].children,this.termRegExp);\n\t\t\tstack[stack.length-1].children.push({type:\"element\",tag:\"br\"});\n\t\t\t//e.push({type:\"element\",tag:\"br\"});\n\n\t\t\tthis.lookaheadRegExp.lastIndex = w.nextMatch;\n\t\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\t\tmatched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;\n\t\t\tif(matched) {\n\t\t\t\tnewLevel = lookaheadMatch[0].length;\n\t\t\t\tw.nextMatch += lookaheadMatch[0].length;\n\t\t\t}\n\t\t} while(matched);\n\t}\n},\n\n{\n\tname: \"rule\",\n\tmatch: \"^----+$\\\\n?|<hr ?/?>\\\\n?\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type:\"element\",tag:\"hr\"});\n\t}\n},\n\n{\n\tname: \"monospacedByLine\",\n\tmatch: \"^(?:/\\\\*\\\\{\\\\{\\\\{\\\\*/|\\\\{\\\\{\\\\{|//\\\\{\\\\{\\\\{|<!--\\\\{\\\\{\\\\{-->)\\\\n\",\n\telement: \"pre\",\n\thandler: function(w)\n\t{\n\t\tswitch(w.matchText) {\n\t\tcase \"/*{{{*/\\n\": // CSS\n\t\t\tthis.lookaheadRegExp = /\\/\\*\\{\\{\\{\\*\\/\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*\\/\\*\\}\\}\\}\\*\\/$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"{{{\\n\": // monospaced block\n\t\t\tthis.lookaheadRegExp = /^\\{\\{\\{\\n((?:^[^\\n]*\\n)+?)(^\\f*\\}\\}\\}$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"//{{{\\n\": // plugin\n\t\t\tthis.lookaheadRegExp = /^\\/\\/\\{\\{\\{\\n\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*\\/\\/\\}\\}\\}$\\n?)/mg;\n\t\t\tbreak;\n\t\tcase \"<!--{{{-->\\n\": //template\n\t\t\tthis.lookaheadRegExp = /<!--\\{\\{\\{-->\\n*((?:^[^\\n]*\\n)+?)(\\n*^\\f*<!--\\}\\}\\}-->$\\n?)/mg;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tenclosedTextHelper.call(this,w);\n\t}\n},\n\n{\n\tname: \"typedBlock\",\n\t\tmatch: \"^\\\\$\\\\$\\\\$(?:[^ >\\\\r\\\\n]*)\\\\r?\\\\n\",\n\tlookaheadRegExp: /^\\$\\$\\$([^ >\\r\\n]*)\\n((?:^[^\\n]*\\r?\\n)+?)(^\\f*\\$\\$\\$\\r?\\n?)/mg,\n\t//match: \"^\\\\$\\\\$\\\\$(?:[^ >\\\\r\\\\n]*)(?: *> *([^ \\\\r\\\\n]+))?\\\\r?\\\\n\",\n\t//lookaheadRegExp: /^\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))\\n((?:^[^\\n]*\\n)+?)(^\\f*\\$\\$\\$$\\n?)/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t// The wikitext parsing infrastructure is horribly unre-entrant\n\t\t\tvar parseType = lookaheadMatch[1],\n\t\t\t\trenderType ,//= this.match[2],\n\t\t\t\ttext = lookaheadMatch[2],\n\t\t\t\toldOutput = w.output,\n\t\t\t\toldSource = w.source,\n\t\t\t\toldNextMatch = w.nextMatch,\n\t\t\t\toldChildren = w.children;\n\t\t\t// Parse the block according to the specified type\n\t\t\tvar parser = $tw.wiki.parseText(parseType,text.toString(),{defaultType: \"text/plain\"});\n\n\t\t\tw.output = oldOutput;\n\t\t\tw.source = oldSource;\n\t\t\tw.nextMatch = oldNextMatch;\n\t\t\tw.children = oldChildren;\n\t\t\tfor(var i=0; i<parser.tree.length; i++) {\n\t\t\t\tw.output.push(parser.tree[i]);\n\t\t\t}\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"wikifyComment\",\n\tmatch: \"^(?:/\\\\*\\\\*\\\\*|<!---)\\\\n\",\n\thandler: function(w)\n\t{\n\t\tvar termRegExp = (w.matchText == \"/***\\n\") ? (/(^\\*\\*\\*\\/\\n)/mg) : (/(^--->\\n)/mg);\n\t\tw.subWikifyTerm(w.output,termRegExp);\n\t}\n},\n\n{\n\tname: \"macro\",\n\tmatch: \"<<\",\n\tlookaheadRegExp: /<<(?:([!@£\\$%\\^\\&\\*\\(\\)`\\~'\"\\|\\\\\\/;\\:\\.\\,\\+\\=\\-\\_\\{\\}])|([^>\\s]+))(?:\\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source),\n\t\t\tname;\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tname = lookaheadMatch[1] || lookaheadMatch[2];\n\t\t\tvar params = lookaheadMatch[3], nameold =name;\n\t\t\tif(name) {\n\t\t\t\tif(!!macroadapter.paramadapter[name]) {\n\t\t\t\t\tparams=macroadapter.paramadapter[name](params);\n\t\t\t\t\t//alert(\"going out as \"+params);\n\t\t\t\t}\n\t\t\t\tif(!!macroadapter.namedapter[name]) {\n\t\t\t\t\tname=macroadapter.namedapter[name];\n\t\t\t\t}\n\t\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t\t\tinsertMacroCall(w,w.output,name,params);\n\t\t\t}\n\t\t}\n\t}\n},\n\n\n{\n\tname: \"prettyLink\",\n\tmatch: \"\\\\[\\\\[\",\n\tlookaheadRegExp: /\\[\\[(.*?)(?:\\|(~)?(.*?))?\\]\\]/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tvar text = lookaheadMatch[1],\n\t\t\t\tlink = text;\n\t\t\tif(lookaheadMatch[3]) {\n\t\t\t\t// Pretty bracketted link\n\t\t\t\tlink = lookaheadMatch[3];\n\t\t\t}\n\tif(isLinkExternal(link)) {\n\t\tw.output.push({\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},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t});\n\t} else {\n\t\tw.output.push({\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\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n{\n\tname: \"wikiLink\",\n\tmatch: textPrimitives.unWikiLink+\"?\"+textPrimitives.wikiLink,\n\thandler: function(w)\n\t{\n\t\tif(w.matchText.substr(0,1) == textPrimitives.unWikiLink) {\n\t\t\tw.outputText(w.output,w.matchStart+1,w.nextMatch);\n\t\t\treturn;\n\t\t}\n\t\tif(w.matchStart > 0) {\n\t\t\tvar preRegExp = new RegExp(textPrimitives.anyLetterStrict,\"mg\");\n\t\t\tpreRegExp.lastIndex = w.matchStart-1;\n\t\t\tvar preMatch = preRegExp.exec(w.source);\n\t\t\tif(preMatch.index == w.matchStart-1) {\n\t\t\t\tw.outputText(w.output,w.matchStart,w.nextMatch);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif(w.autoLinkWikiWords) {\n\t\t\tw.output.push({\n\t\t\t\ttype: \"link\",\n\t\t\t\tattributes: {\n\t\t\t\t\tto: {type: \"string\", value: w.matchText}\n\t\t\t\t},\n\t\t\t\tchildren: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: w.source.substring(w.matchStart,w.nextMatch)\n\t\t\t\t}]\n\t\t\t});\n\t\t} else {\t\n\t\t\tw.outputText(w.output,w.matchStart,w.nextMatch);\n\t\t}\n\t}\n},\n\n{\n\tname: \"urlLink\",\n\tmatch: textPrimitives.urlPattern,\n\thandler: function(w)\n\t{\n\t\t\tw.output.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: w.matchText},\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},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: w.source.substring(w.matchStart,w.nextMatch)\n\t\t\t}]\n\t\t});\n\n\t}\n},\n\n{\n\tname: \"image\",\n\tmatch: \"\\\\[[<>]?[Ii][Mm][Gg]\\\\[\",\n\t// [<] sequence below is to avoid lessThan-questionMark sequence so TiddlyWikis can be included in PHP files\n\tlookaheadRegExp: /\\[([<]?)(>?)[Ii][Mm][Gg]\\[(?:([^\\|\\]]+)\\|)?([^\\[\\]\\|]+)\\](?:\\[([^\\]]*)\\])?\\]/mg,\n\thandler: function(w)\n\t{\n\t\tvar node = {\n\t\t\ttype: \"image\",\n\t\t\tattributes: {}\n\t\t};\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source),\n\t\t\timageParams = {},\n\t\t\tlinkParams = {};\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tif(lookaheadMatch[1]) {\n\t\t\t\tnode.attributes.class = {type: \"string\", value: \"classic-image-left\"};\n\t\t\t} else if(lookaheadMatch[2]) {\n\t\t\t\tnode.attributes.class = {type: \"string\", value: \"classic-image-right\"};\n\t\t\t}\n\t\t\tif(lookaheadMatch[3]) {\n\t\t\t\tnode.attributes.tooltip = {type: \"string\", value: lookaheadMatch[3]};\n\t\t\t}\n\t\t\tnode.attributes.source = {type: \"string\", value: lookaheadMatch[4]};\n\t\t\tif(lookaheadMatch[5]) {\n\t\t\t\tif(isLinkExternal(lookaheadMatch[5])) {\n\t\t\t\t\tw.output.push({\n\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\ttag: \"a\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\thref: {type: \"string\", value:lookaheadMatch[5]},\n\t\t\t\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [node]\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tw.output.push({\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tto: {type: \"string\", value: lookaheadMatch[5]}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [node]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tw.output.push(node);\n\t\t\t}\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"html\",\n\tmatch: \"<[Hh][Tt][Mm][Ll]>\",\n\tlookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\\n)*?)<\\/[Hh][Tt][Mm][Ll]>/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tw.output.push({\ttype:\"raw\", html:lookaheadMatch[1]});\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"commentByBlock\",\n\tmatch: \"/%\",\n\tlookaheadRegExp: /\\/%((?:.|\\n)*?)%\\//mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t}\n},\n\n{\n\tname: \"characterFormat\",\n\tmatch: \"''|//|__|\\\\^\\\\^|~~|--(?!\\\\s|$)|\\\\{\\\\{\\\\{|`\",\n\thandler: function(w)\n\t{\n\t\tvar e,lookaheadRegExp,lookaheadMatch;\n\t\tswitch(w.matchText) {\n\t\tcase \"''\":\n\t\t\te = {type:\"element\",tag:\"strong\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/('')/mg);\n\t\t\tbreak;\n\t\tcase \"//\":\n\t\t\te = {type:\"element\",tag:\"em\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(\\/\\/)/mg);\n\t\t\tbreak;\n\t\tcase \"__\":\n\t\t\te = {type:\"element\",tag:\"u\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(__)/mg);\n\t\t\tbreak;\n\t\tcase \"^^\":\n\t\t\te = {type:\"element\",tag:\"sup\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(\\^\\^)/mg);\n\t\t\tbreak;\n\t\tcase \"~~\":\n\t\t\te = {type:\"element\",tag:\"sub\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(~~)/mg);\n\t\t\tbreak;\n\t\tcase \"--\":\n\t\t\te = {type:\"element\",tag:\"strike\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tw.subWikifyTerm(e.children,/(--)/mg);\n\t\t\tbreak;\n\t\tcase \"`\":\n\t\t\tlookaheadRegExp = /`((?:.|\\n)*?)`/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tlookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t\tw.output.push({type:\"element\",tag:\"code\",\n\t\t\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"{{{\":\n\t\t\tlookaheadRegExp = /\\{\\{\\{((?:.|\\n)*?)\\}\\}\\}/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tlookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\t\tw.output.push({type:\"element\",tag:\"code\",\n\t\t\t\t\tchildren:[{type: \"text\",text: lookaheadMatch[1]}]});\n\t\t\t\tw.nextMatch = lookaheadRegExp.lastIndex;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n},\n\n{\n\tname: \"customFormat\",\n\tmatch: \"@@|\\\\{\\\\{\",\n\thandler: function(w)\n\t{\n\t\tswitch(w.matchText) {\n\t\tcase \"@@\":\n\t\t\tvar e = {type:\"element\",tag:\"span\",children: []};\n\t\t\tw.output.push(e);\n\t\t\tvar styles = inlineCssHelper(w);\n\t\t\tif(styles.length === 0)\n\t\t\t\tsetAttr(e,\"class\",\"marked\");\n\t\t\telse\n\t\t\t\tapplyCssHelper(e,styles);\n\t\t\tw.subWikifyTerm(e.children,/(@@)/mg);\n\t\t\tbreak;\n\t\tcase \"{{\":\n\t\t\tvar lookaheadRegExp = /\\{\\{[\\s]*([\\-\\w]+[\\-\\s\\w]*)[\\s]*\\{(\\n?)/mg;\n\t\t\tlookaheadRegExp.lastIndex = w.matchStart;\n\t\t\tvar lookaheadMatch = lookaheadRegExp.exec(w.source);\n\t\t\tif(lookaheadMatch) {\n\t\t\t\tw.nextMatch = lookaheadRegExp.lastIndex;\n\t\t\t\te = {type:\"element\",tag:lookaheadMatch[2] == \"\\n\" ? \"div\" : \"span\",\n\t\t\t\t\tattributes: {\"class\": {type: \"string\", value:lookaheadMatch[1]}},children: []};\n\t\t\t\tw.output.push(e);\n\t\t\t\tw.subWikifyTerm(e.children,/(\\}\\}\\})/mg);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n},\n\n{\n\tname: \"mdash\",\n\tmatch: \"--\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type: \"entity\", entity: \"—\"});\n\t}\n},\n\n{\n\tname: \"lineBreak\",\n\tmatch: \"\\\\n|<br ?/?>\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type:\"element\",tag:\"br\"});\n\t}\n},\n\n{\n\tname: \"rawText\",\n\tmatch: \"\\\"{3}|<nowiki>\",\n\tlookaheadRegExp: /(?:\\\"{3}|<nowiki>)((?:.|\\n)*?)(?:\\\"{3}|<\\/nowiki>)/mg,\n\thandler: function(w)\n\t{\n\t\tthis.lookaheadRegExp.lastIndex = w.matchStart;\n\t\tvar lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n\t\tif(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n\t\t\tw.output.push({type: \"text\",text: lookaheadMatch[1]\n\t\t\t});\n\t\t\tw.nextMatch = this.lookaheadRegExp.lastIndex;\n\t\t}\n\t}\n},\n\n{\n\tname: \"htmlEntitiesEncoding\",\n\tmatch: \"&#?[a-zA-Z0-9]{2,8};\",\n\thandler: function(w)\n\t{\n\t\tw.output.push({type: \"entity\", entity: w.matchText});\n\t}\n}\n\n];\n\nexports.rules = rules;\n\n})();\n","type":"application/javascript","module-type":"module"}}}
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "no"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "yes"
},
"$:/info/startup-timestamp": {
"title": "$:/info/startup-timestamp",
"text": "20241031093721852"
}
}
}
{"tiddlers":{"$:/themes/tiddlywiki/snowwhite/base":{"title":"$:/themes/tiddlywiki/snowwhite/base","tags":"[[$:/tags/Stylesheet]]","text":"\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\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: <<sidebarbreakpoint-minus-one>>) {\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.tc-tiddler-frame select.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<$set name=\"state\" value=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">>>\n<$button popup=<<state>> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<state>> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\" class=\"tc-popup-keep\">\n<div class=\"tc-drop-down\" style=\"text-align:center;\">\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<$action-deletetiddler $tiddler=<<state>>/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</$set>\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]]","list-before":"","code-body":"yes","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 sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\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\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\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\ninput[type=\"search\"] {\n\toutline-offset: initial;\n}\n\nbutton:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible {\n\toutline: 2px solid <<colour primary>>;\n\toutline-offset: -2px;\n\tborder-radius: 0.25em;\n}\n\nbutton:-moz-focusring, input:-moz-focusring, textarea:-moz-focusring, select:-moz-focusring {\n\toutline: 2px solid <<colour primary>>;\n\toutline-offset: -2px;\n\tborder-radius: 0.25em;\n}\n\n/*\n** Button default styles. Makes them look consistent for all browsers\n*/\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\nbutton:disabled svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\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\tbackground-color: transparent;\n}\n\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\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: normal;\n}\n\npre {\n\tdisplay: block;\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: pre-wrap;\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\tborder-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\tleft: -50px;\n\ttop: 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\tright: -80px;\n\tbottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=number],\ninput[type=password],\ninput[type=email],\ninput[type=tel],\ninput[type=url],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n\tvertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\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::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n.tc-inline-style {\n\tbackground: <<colour highlight-background>>;\n\tcolor: <<colour highlight-foreground>>;\n}\n\n/* Markdown uses mark element to highlight */\n\nmark {\n\tbackground: <<colour highlight-background>>;\n\tcolor: <<colour highlight-foreground>>;\n}\n\nform.tc-form-inline {\n\tdisplay: inline;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tdisplay: block;\n\tpadding: 0.5em;\n\tborder: none;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: inherit;\n\tcolor: inherit;\n\toverflow-x: auto;\n}\n\n/*\nTable defaults\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/*\nTable utility classes\n*/\n\n/* Remove borders from table as used in eg: GettingStarted*/\n.tc-table-no-border,\n.tc-table-no-border th,\n.tc-table-no-border td {\n\tborder: initial;\n}\n\n/* First column in table width will fit to text.*/\n/* This rule makes most sense with tc-first-link-nowrap*/\n.tc-first-col-min-width td:nth-child(1) {\n\twidth: 1%;\n}\n\n/*\n** Utility classes work well with tables but also for other containers\n*/\n\n/* First link A element will not wrap */\n.tc-first-link-nowrap:first-of-type a {\n\twhite-space: nowrap;\n}\n\n/* Move the table to the center of the container */\n.tc-center {\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.tc-max-width {\n\twidth: 100%;\n}\n\n.tc-max-width-80 {\n\tmax-width: 80%;\n}\n\n/* Allow input and textarea to look like the ControlPanel inputs */\n.tc-edit-max-width input,\n.tc-edit-max-width textarea {\n\twidth: 100%;\n\tpadding: 3px;\n}\n\n/*\nCSV parser plugin\n*/\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-csv-table th,\n.tc-csv-table td {\n\twhite-space: pre-line;\n}\n\n/*\nTiddler frame in story river\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:root {\n\tcolor-scheme: {{{ [{$:/palette}get[color-scheme]] ~light }}};\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\t-webkit-touch-callout: none; /* Prevents long presses from bringing up a link preview */\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.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\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-page-container > .tc-dropzone {\n\tmin-height: 100vh;\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\tfill: <<colour foreground>>;\n}\n\nbutton:disabled.tc-btn-invisible {\n\tcursor: default;\n\tcolor: <<colour muted-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\n.tc-btn-text {\n\tmargin-left: 7px;\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\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\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: <<sidebarbreakpoint-minus-one>>) {\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}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-tags-wrapper .tc-tag-list-item {\n\tmargin-right: 7px;\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\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\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: normal;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: break-spaces;\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\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: 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}\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.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\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: normal;\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\tmargin-bottom: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n\tfont-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-sidebar-lists .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: <<sidebarbreakpoint-minus-one>>) {\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\ttransition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<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\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\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\toverflow: hidden;\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\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\twhite-space: nowrap;\n\tvertical-align: top;\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.tc-view-field-value {\n\tword-break: break-all;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<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: normal;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\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-tiddler-title-icon svg {\n\twidth: 0.9em;\n\theight: 0.9em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-tiddler-lazy-loading {\n\theight: 4px;\n\twidth: 100%;\n\tbackground: no-repeat linear-gradient(<<colour background>> 0 0),no-repeat linear-gradient(<<colour background>> 0 0),<<colour primary>>;\n\tbackground-size: 60% 100%;\n\tanimation: animation-loading-progress 3s infinite;\n}\n\n@keyframes animation-loading-progress {\n\t0% {background-position:-150% 0,-150% 0}\n\t66% {background-position: 250% 0,-150% 0}\n\t100% {background-position: 250% 0, 250% 0}\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: normal;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n\tpadding: 3px; /* make space for outline */\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\theight: 1.2em;\n\twidth: 1.2em;\n\tmargin: 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.tc-tiddler-frame select.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\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\t-webkit-appearance: none;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame select.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-edit-fields input.tc-edit-fieldeditor,\n.tc-tiddler-frame .tc-edit-fields select.tc-edit-fieldeditor,\n.tc-tiddler-frame .tc-edit-fields textarea.tc-edit-fieldeditor {\n\tmargin: 0;\n\tpadding: 2px 3px;\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-single-tiddler-window .tc-tiddler-body,\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/TiddlyWiki/TiddlyWiki5/issues/282 */\n}\n\n/*\n* Tiddler in a new window.\n* Also see: .tc-single-tiddler-window .tc-tiddler-body, above\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-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-editor-toolbar,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-editor-toolbar {\n\tgrid-area: toolbar;\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 .tc-drop-down button.tc-btn-mini {\n\tpadding: 2px 4px;\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.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down > p {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down a.tc-tiddlylink {\n\tfont-weight: normal;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<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-page-container.tc-page-view-zoomin .tc-tiddler-frame {\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-page-container.tc-page-view-zoomin .tc-tiddler-frame {\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\tfill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n\tfill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n\tfill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n\tfill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n\tfill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n\tfill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n\tfill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n\tfill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n\tfill: <<colour toolbar-done-button>>;\n}\n\n.tc-page-controls svg.tc-image-layout-button {\n\tfill: <<colour toolbar-options-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: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\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-editor {\n\tdisplay: grid;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview {\n\tgrid-template-areas:\n\t\t\"toolbar toolbar\"\n\t\t\"editor preview\";\n\tgrid-template-columns: repeat(2, minmax(0px, 1fr));\n\tgrid-template-rows: auto 1fr;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden {\n\tgrid-template-areas:\n\t\t\"toolbar\"\n\t\t\"editor\";\n\tgrid-template-columns: 1fr;\n\tgrid-template-rows: auto 1fr;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-tiddler-preview-preview {\n\tgrid-area: preview;\n\toverflow-wrap: anywhere;\n\tword-break: normal;\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-editor.tc-tiddler-preview .tc-edit-texteditor,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-edit-texteditor {\n\tgrid-area: editor;\n}\n\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview canvas.tc-edit-bitmapeditor,\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden canvas.tc-edit-bitmapeditor {\n\tgrid-area: editor;\n\tmax-width: 100%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\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-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n\n/*\n** Tiddler editor dropzone\n*/\n\n.tc-dropzone-editor {\n\tposition:relative;\n}\n\n.tc-dropzone-editor.tc-dragover .tc-editor-toolbar::after{\n\tz-index: 10000;\n\ttop:0;\n\tleft:0;\n\tright:0;\n\theight: 100%;\n\tbackground: <<colour dropzone-background>>;\n\tcontent: \"<<lingo DropMessage>>\";\n\tpointer-events: none;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground-color: <<color background>>;\n\tborder: 4px dashed <<color modal-border>>;\n\tfont-weight: bold;\n\tfont-size: 150%;\n\topacity: 0.8;\n\tcolor: <<color foreground>>;\n}\n\n.tc-editor-importpopup {\n\twidth: 100%;\n\theight: 100%;\n}\n\n.tc-editor-import {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tbackground: <<color pre-background>>;\n\tbox-shadow: 2px 2px 10px <<colour foreground>>;\n\tpadding: 10px;\n\twidth: 96%;\n\tborder: 1px solid <<color tiddler-controls-foreground>>;\n\ttext-align:center;\n}\n\n.tc-editor-import img {\n\tmax-height: 500px;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\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:disabled svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\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\twidth: auto;\n\tmargin-bottom: 0px;\n\tborder-bottom-left-radius: 0;\n\tborder-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.tc-tiddlylink: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/* Make search dropdown visible on small screens. issue #7003 */\n@media (max-width: <<sidebarbreakpoint>>) {\n\n\t.tc-sidebar-search .tc-block-dropdown-wrapper {\n\t\tposition: initial;\n\t}\n\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.tc-modal-prevent-scroll {\n\toverflow: hidden;\n}\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\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: normal;\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\n}\n\n.tc-manager-controls {\n\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-control select {\n\tmax-width: 100%;\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\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\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\tflex: 1 0;\n\tbackground: <<colour tiddler-editor-background>>;\n\tborder-right: 0.5em solid <<colour muted-foreground>>;\n\tborder-bottom: 0.5em solid <<colour muted-foreground>>;\n\twhite-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n\tbackground: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n\tpadding: 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\tflex: 3 1;\n\tborder-left: 0.5em solid <<colour muted-foreground>>;\n\tborder-right: 0.5em solid <<colour muted-foreground>>;\n\tborder-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** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\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\tline-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\tfont-size: 0.8em;\n\tmargin-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: <<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-control-panel-setting {\n\tborder-top: 1px solid <<colour blockquote-bar>>;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\ttext-shadow: none;\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\talign-items: center;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink.tc-plugin-info {\n\tcolor: <<colour tiddler-link-foreground>>;\n}\n\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n\tmargin: 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\tpadding: 2px 7px;\n\tfont-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-chunk > svg {\n\tfill: <<colour background>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk .tc-plugin-info-stability {\n\tborder: 1px solid <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n\tmargin: 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\theight: 2em;\n\twidth: 2em;\n\tdisplay: grid;\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-stability {\n\tmargin-right: 4px;\n\tpadding: 1px 3px;\n\tfont-size: 0.8em;\n\tborder-radius: 4px;\n\tfont-weight: bold;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-stable {\n\tborder: 1px solid <<colour stability-stable>>;\n\tcolor: <<colour stability-stable>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-experimental {\n\tborder: 1px solid <<colour stability-experimental>>;\n\tcolor: <<colour stability-experimental>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-deprecated {\n\tborder: 1px solid <<colour stability-deprecated>>;\n\tcolor: <<colour stability-deprecated>>;\n}\n\n.tc-plugin-info-chunk .tc-plugin-info-stability-legacy {\n\tborder: 1px solid <<colour stability-legacy>>;\n\tcolor: <<colour stability-legacy>>;\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\ttext-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.8em;\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\tmax-width: 2em;\n\tmax-height: 2em;\n\tmargin: auto;\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\tmargin: 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\tvertical-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/* Float tc-clearfix. Needs to be used by elements that allow float:right in their content.\n** So the floating element does not overflow\n*/\n\n.tc-clearfix:after {\n\tcontent: \"\";\n\tclear: both;\n\tdisplay: table;\n}\n\n/* Fix overflow toc, manager and testcase output */\n.tc-tiddler-body .tc-tabbed-table-of-contents, .tc-manager-list-item-content, .tc-test-case-output {\n\toverflow-x: auto;\n}\n\n/* A wrapper to fix table overflow */\n\n.tc-table-wrapper {\n\toverflow-x: auto;\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\tmax-width: 1em;\n\tmax-height: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\tmax-width: 2em;\n\tmax-height: 1em;\n\twidth: auto;\n\theight: auto;\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.tc-table-of-contents .toc-item-muted {\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: normal;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\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\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\n\tvisibility: visible;\n}\n\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\n\tvisibility: hidden;\n}\n\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\n\tvisibility: hidden;\n}\n\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\n\tvisibility: visible;\n}\n\nhtml body.tc-dirty span.tc-dirty-indicator, html 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::-webkit-file-upload-button {\n\tcursor:pointer;\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\tmargin: 0;\n\tpadding: 0;\n\tborder: none;\n\tbackground: 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\tcolor: <<colour select-tag-foreground>>;\n\tbackground: <<colour select-tag-background>>;\n}\n\n/*\n** Translink macro\n*/\n\n.tc-translink {\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px;\n\tborder-radius: 3px;\n}\n\ndiv.tc-translink > div {\n\tmargin: 1em;\n}\n\ndiv.tc-translink > div > a:first-child > h1 {\n\tfont-size: 1.2em;\n\tfont-weight: bold;\n}\n\nspan.tc-translink > a:first-child {\n\tfont-weight: bold;\n}\n\n/*\n** Classes for displaying globals\n*/\n\n.tc-global-tiddler-body {\n\tpadding: 0.25em;\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n}\n\n.tc-global-tiddler-body-heading {\n\tmargin: 0 0 0.25em 0;\n\tfont-weight: normal;\n}\n\n.tc-global-tiddler-body-type {\n\tmargin: 0 0 0.25em 0;\n\tborder-bottom: 1px solid <<colour foreground>>;\n}\n\n.tc-global-tiddler-body-details {\n\tbackground-color: <<colour background>>;\n}\n\n.tc-global-tiddler-body pre {\n\tmargin: 0;\n\tborder: 1px solid <<colour foreground>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n.tc-network-activity-background {\n\tfill: <<colour network-activity-foreground>>;\n}\n\n/*\n** Test Cases\n*/\n\n.tc-test-case-wrapper {\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour muted-foreground>>;\n\tborder-radius: 6px;\n}\n\n.tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-1>>;\n}\n\n.tc-test-case-wrapper .tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-2>>;\n}\n\n.tc-test-case-wrapper .tc-test-case-wrapper .tc-test-case-wrapper {\n\tbackground-color: <<colour testcase-accent-level-3>>;\n}\n\n.tc-test-case-header {\n\tfont-weight: normal;\n\tmargin: 0.5em 0;\n\tpadding: 0 0.5em;\n}\n\n.tc-test-case-divider {\n\tx-background-color: <<colour muted-foreground>>;\n}\n\n.tc-test-case-result-icon {\n\tfill: #fff;\n\tpadding: 0.25em;\n\tdisplay: inline-block;\n\tline-height: 0;\n\tborder-radius: 1em;\n\tvertical-align: text-bottom;\n\tmargin-right: 0.25em;\n}\n\n.tc-test-case-result-icon-pass {\n\tbackground-color: green;\n}\n\n.tc-test-case-result-icon-fail {\n\tbackground-color: red;\n}\n\n.tc-test-case-result-icon svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\n.tc-test-case-header > h2 {\n\tbackground: <<colour background>>;\n\tborder-radius: 4px;\n\tpadding: 0.25em;\n}\n\n.tc-test-case-header > h2,\n.tc-test-case-source > pre {\n\tmargin: 0;\n}\n\n.tc-test-case-header > h2 a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-test-case-toolbar {\n\tfloat: right;\n}\n\n.tc-test-case-toolbar svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-test-case-toolbar .tc-drop-down {\n\tfont-size: 0.8em;\n}\n\n.tc-test-case-result-fail {\n\tborder: 1px solid <<colour foreground>>;\n\tbackground-color: <<colour background>>;\n\tborder-radius: 4px;\n\tmargin: 0 0.5em;\n\tpadding: 0;\n}\n\n.tc-test-case-result-fail-header {\n\tbackground: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tpadding: 4px;\n}\n\n.tc-test-case-result-fail-body {\n\tpadding: 4px;\n}\n\n.tc-test-case-source > pre {\n\theight: 100%;\n}\n\n.tc-test-case-narrative {\n\tpadding: 0.5em;\n}\n\n.tc-test-case-panes {\n\tdisplay: flex;\n\talign-items: stretch;\n\tflex-wrap: wrap;\n\tpadding: 0.5em;\n\tborder-bottom-left-radius: 6px;\n\tborder-bottom-right-radius: 6px;\n}\n\n.tc-test-case-source {\n\tflex: 1 0 49%;\n\tmin-width: 250px;\n}\n\n.tc-test-case-source .tc-tab-content {\n\tbackground: inherit;\n\tmargin: 0;\n}\n\n.tc-test-case-source .tc-tab-content .tc-field-table {\n\tbackground: <<colour background>>;\n}\n\n.tc-test-case-source .tc-field-table {\n\twidth: 100%;\n}\n\n.tc-test-case-source table.tc-field-table {\n\tmargin: 0;\n}\n\n.tc-test-case-source .tc-tiddler-frame .tc-edit-texteditor {\n\tmargin: 0;\n}\n\n.tc-test-case-divider {\n\tflex: 0 0 1.5%;\n}\n\n.tc-test-case-source .tc-tab-buttons {\n\tpadding-top: 0;\n}\n\n.tc-test-case-footer-toolbar {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n.tc-test-case-output {\n\tbox-shadow: inset 2px 2px 10px 0px <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tborder-radius: 4px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tflex: 1 0 49%;\n\tmin-width: 250px;\n\tpadding: 0.25em 1em;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n/* Horizontal gaps */\n\n.tc-tiny-gap {\n\tmargin-left: .25em;\n\tmargin-right: .25em;\n}\n\n.tc-tiny-gap-left {\n\tmargin-left: .25em;\n}\n\n.tc-tiny-gap-right {\n\tmargin-right: .25em;\n}\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n\n/* Vertical gaps */\n\n.tc-tiny-v-gap-bottom {\n\tmargin-bottom: 3px;\n}\n\n"},"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize":{"title":"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize","text":"15px"},"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight":{"title":"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight","text":"22px"},"$:/themes/tiddlywiki/vanilla/metrics/fontsize":{"title":"$:/themes/tiddlywiki/vanilla/metrics/fontsize","text":"14px"},"$:/themes/tiddlywiki/vanilla/metrics/lineheight":{"title":"$:/themes/tiddlywiki/vanilla/metrics/lineheight","text":"20px"},"$:/themes/tiddlywiki/vanilla/metrics/storyleft":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storyleft","text":"0px"},"$:/themes/tiddlywiki/vanilla/metrics/storytop":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storytop","text":"0px"},"$:/themes/tiddlywiki/vanilla/metrics/storyright":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storyright","text":"770px"},"$:/themes/tiddlywiki/vanilla/metrics/storywidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/storywidth","text":"770px"},"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth","text":"686px"},"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint":{"title":"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint","text":"960px"},"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth":{"title":"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth","text":"350px"},"$:/themes/tiddlywiki/vanilla/options/stickytitles":{"title":"$:/themes/tiddlywiki/vanilla/options/stickytitles","text":"no"},"$:/themes/tiddlywiki/vanilla/options/sidebarlayout":{"title":"$:/themes/tiddlywiki/vanilla/options/sidebarlayout","text":"fixed-fluid"},"$:/themes/tiddlywiki/vanilla/options/codewrapping":{"title":"$:/themes/tiddlywiki/vanilla/options/codewrapping","text":"pre-wrap"},"$:/themes/tiddlywiki/vanilla/reset":{"title":"$:/themes/tiddlywiki/vanilla/reset","type":"text/css","text":"/*! modern-normalize v2.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\t/* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) */\n\tfont-family:\n\t\tsystem-ui,\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n\tline-height: 1.15; /* 1. Correct the line height in all browsers. */\n\t-webkit-text-size-adjust: 100%; /* 2. Prevent adjustments of font size after orientation changes in iOS. */\n\t-moz-tab-size: 4; /* 3. Use a more readable tab size (opinionated). */\n\ttab-size: 4; /* 3 */\n}\n\n/*\nSections\n========\n*/\n\nbody {\n\tmargin: 0; /* Remove the margin in all browsers. */\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n"},"$:/themes/tiddlywiki/vanilla/settings/fontfamily":{"title":"$:/themes/tiddlywiki/vanilla/settings/fontfamily","text":"-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""},"$:/themes/tiddlywiki/vanilla/settings/codefontfamily":{"title":"$:/themes/tiddlywiki/vanilla/settings/codefontfamily","text":"ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", 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","code-body":"yes","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"}}}