From 6063256439176566115a87fdb42ff0def8225ddf Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Wed, 20 Mar 2024 09:44:52 +0000 Subject: [PATCH] Create new static index route with ability to create/update bags and recipes Also introduces a new /.system/filename route for stylesheets, scripts etc. --- package.json | 2 +- .../multiwikiserver/admin-ui/AdminLayout.tid | 19 -- .../admin-ui/DefaultTiddlers.tid | 2 - .../MultiWikiServer Administration.tid | 231 ------------------ .../admin-ui/SideBarSegment.tid | 10 - .../multiwikiserver/admin-ui/favicon.png.meta | 2 - .../multiwikiserver/admin-ui/layout.tid | 2 - .../admin-ui/missing-favicon.png.meta | 2 - .../modules/commands/mws-listen.js | 3 +- .../modules/commands/mws-test-server.js | 21 +- .../multiwikiserver/modules/mws-server.js | 9 +- .../modules/routes/handlers/get-system.js | 52 ++++ .../modules/routes/handlers/post-bag.js | 50 ++++ .../modules/routes/handlers/post-recipe.js | 51 ++++ .../missing-favicon.png | Bin .../system-files/missing-favicon.png.meta | 3 + .../system-files/motovun-jack.jpg | Bin 0 -> 24382 bytes .../system-files/motovun-jack.jpg.meta | 3 + .../favicon.png => system-files/mws-icon.png} | Bin .../system-files/mws-icon.png.meta | 3 + .../styles.css.tid} | 23 +- .../multiwikiserver/templates/get-index.tid | 133 +++++++--- .../multiwikiserver/templates/page.tid | 3 + 23 files changed, 305 insertions(+), 319 deletions(-) delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/AdminLayout.tid delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/DefaultTiddlers.tid delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/MultiWikiServer Administration.tid delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/SideBarSegment.tid delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/favicon.png.meta delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/layout.tid delete mode 100644 plugins/tiddlywiki/multiwikiserver/admin-ui/missing-favicon.png.meta create mode 100644 plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-system.js create mode 100644 plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/post-bag.js create mode 100644 plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/post-recipe.js rename plugins/tiddlywiki/multiwikiserver/{admin-ui => system-files}/missing-favicon.png (100%) create mode 100644 plugins/tiddlywiki/multiwikiserver/system-files/missing-favicon.png.meta create mode 100644 plugins/tiddlywiki/multiwikiserver/system-files/motovun-jack.jpg create mode 100644 plugins/tiddlywiki/multiwikiserver/system-files/motovun-jack.jpg.meta rename plugins/tiddlywiki/multiwikiserver/{admin-ui/favicon.png => system-files/mws-icon.png} (100%) create mode 100644 plugins/tiddlywiki/multiwikiserver/system-files/mws-icon.png.meta rename plugins/tiddlywiki/multiwikiserver/{admin-ui/Styles.tid => system-files/styles.css.tid} (88%) diff --git a/package.json b/package.json index b3122e471..be199f4ef 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "scripts": { "start": "node ./tiddlywiki.js ./editions/multiwikiserver --listen", - "test": "node ./tiddlywiki.js ./editions/test --verbose --version --build index && node ./tiddlywiki ./editions/multiwikiserver/ --listen debug-level=full --mws-test-server http://127.0.0.1:8080/ --quit", + "test": "node ./tiddlywiki.js ./editions/test --verbose --version --build index && node ./tiddlywiki ./editions/multiwikiserver/ --mws-listen debug-level=full --mws-test-server http://127.0.0.1:8080/ --quit", "lint:fix": "eslint . --fix", "lint": "eslint ." }, diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/AdminLayout.tid b/plugins/tiddlywiki/multiwikiserver/admin-ui/AdminLayout.tid deleted file mode 100644 index 94f5bff43..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/AdminLayout.tid +++ /dev/null @@ -1,19 +0,0 @@ -title: $:/plugins/multiwikiserver/AdminLayout -tags: $:/tags/Layout -name: MultiWikiServer -description: Admin Layout -icon: $:/favicon.ico - -\import [subfilter{$:/core/config/GlobalImportFilter}] - -
- -
TiddlyWiki5
- {{MultiWikiServer Administration}} -
- <$button> - <$action-setfield $tiddler="$:/layout" text="$:/core/ui/PageTemplate"/> - Switch to TiddlyWiki default user interface - -
-
diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/DefaultTiddlers.tid b/plugins/tiddlywiki/multiwikiserver/admin-ui/DefaultTiddlers.tid deleted file mode 100644 index 243895326..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/DefaultTiddlers.tid +++ /dev/null @@ -1,2 +0,0 @@ -title: $:/DefaultTiddlers -text: [[MultiWikiServer Administration]] diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/MultiWikiServer Administration.tid b/plugins/tiddlywiki/multiwikiserver/admin-ui/MultiWikiServer Administration.tid deleted file mode 100644 index 4b076166f..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/MultiWikiServer Administration.tid +++ /dev/null @@ -1,231 +0,0 @@ -title: MultiWikiServer Administration - -\procedure createBag(name,description,errorTiddler) - \procedure completion-createBag() - \import [subfilter{$:/core/config/GlobalImportFilter}] - <$action-log - status=<> - statusText=<> - error=<> - data=<> - headers=<> - /> - <%if [match[]] %> - <$action-setfield $tiddler=<> text=""/> - <$action-sendmessage $message="tm-server-refresh"/> - <%else%> - <$action-setfield $tiddler=<> text=<>/> - <%endif%> - \end completion-createBag - <$action-sendmessage - $message="tm-http-request" - url=`/wiki/${ [encodeuricomponent[]] }$/bags/${ [encodeuricomponent[]] }$` - method="PUT" - body=`{"description":"${ [] }$"}` - oncompletion=<> - var-errorTiddler=<> - /> -\end createBag - -\procedure createBagButton(name) - \whitespace trim -
-
- <$text text="Create a new bag"/> -
-
-
- - <$edit-text tiddler="$:/temp/NewBagName" tag="input" placeholder="(bag name)" class="mws-form-field-input"/> -
-
- - <$edit-text tiddler="$:/temp/NewBagDescription" tag="input" placeholder="(description)" class="mws-form-field-input"/> -
-
-
- <%if [[$:/temp/NewBagError]get[text]else[]!match[]] %> -
- <$text text={{$:/temp/NewBagError}}/> -
- <%endif%> -
-
- <$button class="mws-form-button"> - <$transclude - $variable="createBag" - name={{$:/temp/NewBagName}} - description={{$:/temp/NewBagDescription}} - errorTiddler="$:/temp/NewBagError" - /> - Create Bag - -
-
-\end createBagButton - -\procedure createRecipe(name,bag_names,description,errorTiddler) - \procedure completion-createRecipe() - \import [subfilter{$:/core/config/GlobalImportFilter}] - <%if [match[]] %> - <$action-setfield $tiddler=<> text=""/> - <$action-sendmessage $message="tm-server-refresh"/> - <%else%> - <$action-setfield $tiddler=<> text=<>/> - <%endif%> - \end completion-createRecipe - \procedure emptyArray() [] - \function createRecipeJson() - [enlist-input[]] :reduce[!match[]elsejsonset,] - \end createRecipeJson - <$action-sendmessage - $message="tm-http-request" - url=`/wiki/${ [encodeuricomponent[]] }$/recipes/${ [encodeuricomponent[]] }$` - method="PUT" - body=`{"bag_names":${ [] }$,"description":"${ [] }$"}` - oncompletion=<> - var-errorTiddler=<> - /> -\end createRecipe - -\procedure createRecipeButton() - \whitespace trim -
-
- <$text text="Create a new recipe"/> -
-
-
- - <$edit-text tiddler="$:/temp/NewRecipeName" tag="input" placeholder="(recipe name)" class="mws-form-field-input"/> -
-
- - <$edit-text tiddler="$:/temp/NewRecipeBagNames" tag="input" placeholder="(space separated list of bags)"/> -
-
- - <$edit-text tiddler="$:/temp/NewRecipeDescription" tag="input" placeholder="(description)" class="mws-form-field-input"/> -
-
-
- <%if [[$:/temp/NewRecipeError]get[text]else[]!match[]] %> -
- <$text text={{$:/temp/NewRecipeError}}/> -
- <%endif%> -
-
- <$button class="mws-form-button"> - <$transclude - $variable="createRecipe" - name={{$:/temp/NewRecipeName}} - bag_names={{$:/temp/NewRecipeBagNames}} - description={{$:/temp/NewRecipeDescription}} - errorTiddler="$:/temp/NewRecipeError" - /> - Create Recipe - -
-
-\end createRecipeButton - - -\procedure bagPill(element-tag:"span",is-topmost:"no") - \whitespace trim - <$genesis $type=<> class={{{ mws-bag-pill [match[yes]then[mws-bag-pill-topmost]] +[join[ ]] }}}> - - <$image - source=`/wiki/${ [{!!bag-name}encodeuricomponent[]] }$/bags/${ [{!!bag-name}encodeuricomponent[]] }$/tiddlers/%24%3A%2Ffavicon.ico` - class="mws-favicon-small" - > - <$image - source="$:/plugins/multiwikiserver/images/missing-favicon.png" - class="mws-favicon-small" - /> - - - <$text text={{!!bag-name}}/> - - - -\end - - -\procedure wikiCard() - \whitespace trim - -
- <$image - source=`/wiki/${ [{!!recipe-name}encodeuricomponent[]] }$/recipes/${ [{!!recipe-name}encodeuricomponent[]] }$/tiddlers/%24%3A%2Ffavicon.ico` - class="mws-favicon" - > - <$image - source="$:/plugins/multiwikiserver/images/missing-favicon.png" - class="mws-favicon" - /> - -
-
-
- <$text text={{!!recipe-name}}/> -
-
- <%if [list] %> -
    - <$list filter="[list]" counter="counter"> - <$transclude $variable="bagPill" is-topmost={{{ [match[yes]] }}} element-tag="li"/> - -
- <%else%> - (no bags defined) - <%endif%> -
-
- <$text text={{!!text}}/> -
-
-
-\end - -
-

Wikis

-

- These are the wikis available on this server. Click on a wiki to visit it in a new browser tab. -

-
    - <$list filter="[prefix[$:/state/MultiWikiServer/recipes/]]"> -
  • - <> -
  • - -
-
- <> -
-
- Higher numbered bags take priority if a tiddler with the same title is in more than one bag -
-

Bags

-
    - <$list filter="[prefix[$:/state/MultiWikiServer/bags/]]"> -
  • - <> - <$text text={{!!text}}/> -
  • - -
-
- <> -
-
diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/SideBarSegment.tid b/plugins/tiddlywiki/multiwikiserver/admin-ui/SideBarSegment.tid deleted file mode 100644 index d79b41aa4..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/SideBarSegment.tid +++ /dev/null @@ -1,10 +0,0 @@ -title: $:/plugins/multiwikiserver/SideBarSegment -tags: $:/tags/SideBarSegment -list-before: $:/core/ui/SideBarSegments/page-controls - -
-<$button> -<$action-setfield $tiddler="$:/layout" text="$:/plugins/multiwikiserver/AdminLayout"/> -Switch back to ~MultiWikiServer administration user interface - -
diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/favicon.png.meta b/plugins/tiddlywiki/multiwikiserver/admin-ui/favicon.png.meta deleted file mode 100644 index 76d0be1a8..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/favicon.png.meta +++ /dev/null @@ -1,2 +0,0 @@ -title: $:/favicon.ico -type: image/png diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/layout.tid b/plugins/tiddlywiki/multiwikiserver/admin-ui/layout.tid deleted file mode 100644 index beff36af1..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/layout.tid +++ /dev/null @@ -1,2 +0,0 @@ -title: $:/layout -text: $:/plugins/multiwikiserver/AdminLayout diff --git a/plugins/tiddlywiki/multiwikiserver/admin-ui/missing-favicon.png.meta b/plugins/tiddlywiki/multiwikiserver/admin-ui/missing-favicon.png.meta deleted file mode 100644 index a86d72be1..000000000 --- a/plugins/tiddlywiki/multiwikiserver/admin-ui/missing-favicon.png.meta +++ /dev/null @@ -1,2 +0,0 @@ -title: $:/plugins/multiwikiserver/images/missing-favicon.png -type: image/png diff --git a/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-listen.js b/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-listen.js index 486817596..0ee10f9be 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-listen.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-listen.js @@ -33,7 +33,8 @@ Command.prototype.execute = function() { } // Set up server this.server = $tw.mws.serverManager.createServer({ - wiki: $tw.wiki + wiki: $tw.wiki, + variables: self.params }); this.server.listen(null,null,null,{ callback: function() { diff --git a/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-test-server.js b/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-test-server.js index a0320e5a4..ea7184e54 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-test-server.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/commands/mws-test-server.js @@ -74,6 +74,7 @@ TestRunner.prototype.runTests = function(callback) { }; TestRunner.prototype.runTest = function(testSpec,callback) { + const self = this; console.log(`Running Server Test: ${testSpec.description}`) if(testSpec.method === "GET" || testSpec.method === "POST") { const request = this.httpLibrary.request({ @@ -84,8 +85,8 @@ TestRunner.prototype.runTest = function(testSpec,callback) { method: testSpec.method, headers: testSpec.headers }, function(response) { - if (response.statusCode < 200 || response.statusCode >= 300) { - return callback(`Request failed to ${response.url} with status code ${response.statusCode} and ${JSON.stringify(response.headers)}`); + if (response.statusCode < 200 || response.statusCode >= 400) { + return callback(`Request failed to ${self.urlServerParsed.toString()} with status code ${response.statusCode} and ${JSON.stringify(response.headers)}`); } response.setEncoding("utf8"); let buffer = ""; @@ -94,7 +95,7 @@ TestRunner.prototype.runTest = function(testSpec,callback) { }); response.on("end", () => { const jsonData = $tw.utils.parseJSONSafe(buffer,function() {return undefined;}); - const testResult = testSpec.expectedResult(jsonData,buffer); + const testResult = testSpec.expectedResult(jsonData,buffer,response.headers); callback(testResult ? null : "Test failed"); }); }); @@ -135,6 +136,20 @@ const testSpecs = [ expectedResult: (jsonData,data) => { return jsonData["imported-tiddlers"] && $tw.utils.isArray(jsonData["imported-tiddlers"]) && jsonData["imported-tiddlers"][0] === "One White Pixel"; } + }, + { + description: "Create a recipe", + method: "POST", + path: "/recipes", + headers: { + "Accept": '*/*', + "Content-Type": 'application/x-www-form-urlencoded', + "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36' + }, + data: "recipe_name=Elephants3214234&bag_names=one%20two%20three&description=A%20bag%20of%20elephants", + expectedResult: (jsonData,data,headers) => { + return headers.location === "/"; + } } ]; diff --git a/plugins/tiddlywiki/multiwikiserver/modules/mws-server.js b/plugins/tiddlywiki/multiwikiserver/modules/mws-server.js index ec2bb1b8f..39e1492a9 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/mws-server.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/mws-server.js @@ -316,7 +316,8 @@ Server.prototype.findMatchingRoute = function(request,state) { } else { match = potentialRoute.path.exec(pathname); } - if(match && request.method === potentialRoute.method) { + // Allow POST as a synonym for PUT because HTML doesn't allow PUT forms + if(match && (request.method === potentialRoute.method || (request.method === "POST" && potentialRoute.method === "PUT"))) { state.params = []; for(var p=1; peYe^>r)0T}Yqa?$_@1OjAVKfvD|6kRz9iFc~%D$;U_ zQm+O8K#^6nb#jKm002iP4>xrgaWY*!eKPoI00uw=-~e_2Fg15~QPPms1YSi>N`lP& z)#)Gpw>&HXuU7(qd1hHvGO~Z`|349?xr>_z0Dx3qy*Vu`-OXP){FNQNJzW0LU%fJp znf*Tu1Nn#DUITn(ynopGU(EDhKL29Tf7rs&$>P=LpO{@N94-Fgp;!LsT;lDlq*YF?hvHa8Cf9H-&($dP*)4_x6pQM^QJ2-o~k-58=np=`F|Id^7 z|GMITg!LbBFsWNwS-M#|y*8!&I?HUGtY3%Q$->sd*4c^7*6DvW!vB}m{v(Ee@L%)# z6|hVG066bh0E`(N0DL|PK(LVkuwmY-1@zzJriiEw{B!5&kRJYP-oNsz{lCipp@2zv z{R!i4Yfbi#T0&iu%-qw>>mPo-C;lm50VDt&zya_95`Yq*1DF90;4L5khyqf8JfH$- z0(yWkU=G*-j({8B4Fmw8KqL?YBm!wbHjodL0F^);&;+yrUx0pK7?=RQ0gJ#Ium$V` zr@$5P0Q`D=kimmcLD(RC5GjZn#0cU5@q&awQXoZ;I!F&>0Ea*FE8*~i10sVvl!=S+6z!1aGz_7yb!id2rz-Yo4!C1q%!uY|2 z!^Fd6!W6;Oz_h~j!%V;|!fe5u!rX%aFfteyOb%uS^MWP7DqwxE71#|N1dax$gNwj* z;7;%ecpkh3J_A2P;2_u#G6*w703r*~f|x^GAwiH>NH(Mb(h3=Z%tN*zSCBujsIWw^ zjIjK$a_nVF+(-O{go#9pB!r}iWQP=rl!;V_^c86x z=@uConF5&)Sq<41IRrTqxdC|;c^ml|1q+1%MFPbT#S@sswk>H zst0O3Y9;C*>JQW>G;A~$G&wX2v|zMPXsu{-Xcy>+=+x+9=*H-N=;`R6(Pz-lFc2|l zFeETcF@i8YVRT?DW87n6W3pqaU^-&PVpd^}VIE<@W6@wqVOd~>V-;f!V(nssu_>`7 zu+6dGW0zom#oot(!=c5I!?DAO!KuZW#<_xGLAjvXP#@?gXg72V7mQ1TD~IcVn}FMd zyM+7m4e=YXH}4Nj5}wMNUL6OYTWtNIp&ei-MLyiz1Aoo??R% ziISJniZYdQfbxopluC&zfU25ml^T(nm)eFpgL;Jek%pE=hvoxK8_f|d9<3a$A8j@5 zIvpyV2%Rfk5#0hk96c|+J$)|yHwG96ZU!5MPYg4RFpNBmwv4%qvrMo|d`wPEMNG@g zD9mEaUd+|Z+bp;&iY#F)Z7dh8RIK`}NvtERf7rO$9N0?O*4VMw<=Mm7JK1kI7&y#1 zK5;B?qH;=e26MJ^UUM;WS#srZt#D&=D{+6|9^iiAdCTL*Q^#}smg=p^+nl${yg0n7 zys^Bae6W1te8GHQ_@4QB_&xZW_%8*R1?&Z?1dar01uX?j1b2lfgiM7Bg|>vrgiVAC zgttV+O<*wx4$_L61DWE85C}b<_C^9Iz zDRwHsD9J0OD6K0~D?2H-sQ@Z+Dk&-(sPYG&>ul+=>IUjg=n?4I>b2{`>uc+m>E9bj8KfEP z8*&>)8ZH^p8u=KF850;g7_IkOzID{~3+4D(Y9 zQHxZIV@n~+WXnS9ZpzI_D)02B+fq0vo4G-kuF=V{H|%PS8fV!W$qw%BlmU>oY%$Fq$izcgy*)G zu-7NACvR=<&pwzwPCk>q48Bpmhknw2rT!3qbN_(=@_^8Q?Le`>!XQwPSq3bG7;60XpwG_%O30Igg8AutP8C#i(neACrS&3P{vu&~$KZ$>;&mqc*%6ZJS$eqg*&8y2N z&X39eSzueRQYcf{T0~QnUJO_4ReVsQT{2S2TUuF0P!?16Qtni~RiR!nRQa~DvWloG zp&F*zv--Hku;yE>WNmvLb6sIQZhcGx(BRo{(rD7S)TGcf@R|2>T{CraP78KRbStRU zxAm&crfsWTuYI;dzGI+MptGfmrK|i4`Ik@K(C&mDq@M7ezrB9F_kAvXXZ_awy94hA z)&_M47lzb^roSqD9UYb)9vl%H=^Ygs{W8Ws)-ldI-ZsHA(K^XJ*)qjF)iTX9-8%Dj zru`e=x6WC?*`7I(x&C>{`QZh*g^5Mw#n~mTrIlsF<*gNqm80(t->+A_R)4L9ti!HH zZ(wYs{~-ENv`N2Nzs0lFy)C&txudbOwrjq7y63+4dq4aD^&tI_^sw@X{A_ITv&n&6lE=lUKS|``2#Qe{W)M@o&rTxb6n-Rqua1I6nM(jDEs@ zs(9vo9{H*B^YEAVZ}{JtFZ3^+e-!?#|8@NP_wO1Y0f1p%U#u|TSAo2KVG&?qArM$3 zcz8Gj6eJWBWF%x{R5UCMR5VO9WMm9n3`}esC=`l<{ss>h2M-Geiu2D!K;YLp5LiT5 zSVSCDWK^90-}1K)z(fE(09RlTCIEv80%L;y4gtikYZn;sKYxV&Ux9^#z{7wMKmg*a zSr`L=0fE6Vkk`gxAaLN<6%fp84=~}d$N_eEYzi?195quYC5J1nxO!+|QX^IW>=iYq zSy=M+8!ork`h+0hf4n*XhJavT0XXb`!6IiDQ-j5( zFm(-0D!jsJ?4RY>ro4uVQ*o-pHT_)$P{6N#m|#pm1fZ2L@8lvYQXE(2eS944Kdj&w z<}HP&V;0CbrW+Jj(P=4KXXQJIwE7;QrG?@*d`TTtX`NRObEc3sjU4pCKcfD+E9J6Y z-W*r{(N(Wv|5TUG4_MK! zwoTJU{zmGGjlCINiy;EHYs7}8nOt<%7|Nri_3yO45=7zfk`#$;S+7+Ip#4BP|CA{` zTyIwac&@!Aj7IMj!%&kt6`$e`xSpIy9PGf`b6xzIsO9&S#b9B6s7F(|2|KKB553or zk`Vg+DLiP%(oS`*ok807L5Ss`nE)XqnW-oohLvYhq+e_r-TC2Xd?cldB#W)SbzKBu znt;&smW%5jbVv$O@%pxeAR+}x_tqPX~Ye~{HT2Qx3tSfSSwArzKGGxqK-v=hSGy`5lsd%kTuiJ;f zQa_Ty6HRXf)Kbzk<62S?50J=NeT-Oz3syV-^~>|?V*|OUqbscYatI0C^3(aQRjoyF zS=sy@+hypQS3ic86!Xl9n>R}EL|N%y0L5HOxt<*ow=5_8A&j>v3N($dGD7MQpMm$m zyD&$;S6)>KeUW&6Y@#Jfh?Jtbx2 z_s@D=Uq(+8CpAVzHEC%YEb~}zwMB~0#3vdeqE*sQg{bZVBT=oq{y{NfqU;Hgi7|B=Mv!(YHzEt7uS zr{1(YX%B!=0UyC%sI+OZXoIu&{sK5bnS6-DYGuR3>`HxWGwGKL{g3o?okXX!4?TZ|(0|P+!b9SqxAO?zk$g-lurBN~ zLSCNVRrNbXCzH9N@!Z$$;(h)C$~C0x1<^ZI-Ojr_`3)!hLX4KTE!qvWx%3pRYfsVm zIUz;9&zk*v5h(p)yu_N5gq>_3JNUIU=EY!24I4Cm$ClV2|*qGhh`o1);Rpf z2I6)KG6aoQAZ1>@-Tca*fBtN^ydxCO6!M2keN3SS=Si%JRn;% z>WE;cDU=1EEG)LJ79MiJK&)5)PZxeeJqa$H6{?D) z7^%}$4#A~ekskh*&`x6PrZxGNWVqWCO%5zsH!-ltmU-PIFRWqRj`ny6!5S)85w3wUJ|nUM{$gd~Iq zj~6U8a#?(eE6N(4{DZ6CJ7@?|rCxRA1UY=vdUK(y;=H+5a*dAJ@K{TP66kP7yj4GO zf1-rm&liKw0VX&kSmw%4oO-@Ms#1pTN%eX~P7FYc42 zBqyfJij%g`Z|!FbBg0`G86NucgKJkWWup+7-oi>cr-U@U(>rS4f%P1Q^@UM*^P13w zl-)?m|JhF$gDKHS$2Jb~u?e;BYCXLlUO?_)MB1V$85}*6f*v`pV9@qa>G&E|tK!HB zC()2OaihXm)`+4;Q;$l#Kb3vo4f7L~Kid}I*L9dx;N`vhE*#h7>g!00r=NZi!xxu@ zKjd1P`X{H^GYVAaM8j~wywd1qU)yK?nH`0#Da1y$IGUFMv=-y`?t>!^iKJ{l}|lNlB5jjIlVIL^FP(xEbwiYJqP89=5)|Xd zV5#baAIv7-?nzZmckkHu7tmM?-7AQ&8QmHs9sehhDb$b+VfzDdgV(QLyLnNF6aGD0zo7MPnRkGyDRyDT<-$fzu0Xu)_9p{ zgz-frSy;L`K^FwJi9qoES{om*^%tn)T>Q-4JEqIlWs=bw%bJ?THOJN1oY`lKQPudc z-g7b{_!pq3vQAk*G-r5GXp`ExcAn5JscZUz$w`-nlYD*HVHnG%E<;)YM-=EIRBlao zVl>7^)7ARSw8=`D7BfYGuEBAe{HC|fDY#d%(E|z76y{i^?VSzFr|fjk3>y>|G_Sm= zgfeOLZ;vC|;>?0chzI&U>Due&LeXKb<5aEUPyxwr)$?L$pmT= zQkA9^*=FO*j>DP|xxVnhKk)s$hhR2^q2rjzJ9c%q-ivpp!CsqJY^5G`lXKYO3RzBDv29HE6AWHBI~U5pwHG2((W~=>298^lmE;xf zl-pOL;V%-W~TcnZI;c&(VsT4Q%P@ zEsNv#Xv)-XybQYdBO7Ob6Ro1P=t+J`wid>W(7Q~YHqCj&%m2<%)%S(Jc%x7P` z8#f!~p_fa~6zMJCPfy)L-lCEjgNnlG$V7usj4#wU(r{|gH@;{Z^}~niTxa)3Q@a*4 zUb7%Bau!45uAl09wm39x3h`DjPmcb#)?$6BFU z>*WpPv>Wtpi{(pwH2uOFErlIl+4|8{B?=D5O@t_NzBW%Kn26Y?kwQ&bBEYg};A95= z4<&PFa(v!e4Nd&4UzC^N#n#ZuT1##}S){h~?HdMfm^Jt0k`-&N1FP{`&!bMHkogvo zER-=pe{bigK^76$q_xJ!V?u@@`t+Z8gVG?(H~0t$_rc4Rj>HT6OP*~6jQmQ}mg?dm zHx@!YBS*nOv2e{Fs^k~=52p6NG*njKIWo(i<3tO@hHUOt{@K8Q*|^h&xkJtq6uaKZ zo}1;Sy3tmlNZA{PH1Y2pp2^ULjR@V2XyfjtH!H%yAq!OfsooL4=gG}u(5Vq$iMP`- zG4w{z3>_Qhg%G*E?>n+0_e=HaF3@$V#H#;lzyD*kn%G4RI~MA=0&yBc8HeK>cg%?0F8NofhbL#x4r$3RBzL(@|H;Sw*LqWd*BRP$$%C zChGCwJEUwfCe5Ot+nl8ep3$l{4_*^_qMhj8oofu~mVDaN-3xJ|oxGXYpA9`9JrvyA zmKmW69vf?g6MPT{RrZiqqBQ8w+4)&x!P#+T5+71sD0{;Z-{?9D1|nwe`nR;qus6&S zl;!g6NVc8cGov+Xr1_gUadHY`okrrZAH5$!u5jOOA)*z+N8q|#v~`KASS#fvRWzW%q-f>&U0sV%Dq zlKpC2dAKjf`@Kb2)j_gHRcRUC(U}0090|iQBI5FWr>&5&vM*_b_UV1h?(;v);{9`K zW|Sjyf;n=}`bbFET=uT-W@Ja7!F9~-wI7S)CMUS{dh_VSu2yBqBHz#-G&MwWk`rO~ z=H!s@_K|r_iyo)%+!D%*6i-Nzw}~KLc=~DIsy+Ec_Ry6i6_u|m&N_nU;PDl$k>lTb zA0O<5_&XdIO$VWVM+CQ2>0N6mE!ft+En;C~dybxPtCh6O{1exsN80*s^GLwFtU-fE zM|RnTpSrQZlR0ki|A!Um><_`kS#^8A%%fBKu=x@;M5wm5MLd;gVI~_HR4~DG=}<=6FUi#R zM^Ylb+)h>WizOT-x#rq*PCb+9SefW7r#Js{O9d zhLBv30X*>LSx)1QD88m_DU~b~?<3r_1W9Muer!de49N+%7}@w)qR`z7}5!D@gt-(NO2kH&6UTH*(8eBGF8OMm40!K+>c* z`Z}mp?}tEy!u)h;xDr>ba`iEr4%@7fxkklQpuR_(z3Kg2>H7DerG-T71j1X=(R7a=L z`Q$*@PKzjGQ$SGVH$RNC70ez#@8l+d(KbRa27oM>*~2+H}Bx5rBuGJ41x znsm2Y)QIM6iB;IRxOR_9njz)hI#ffIy(__65nYQWkJT7^(@w^@hbC|jr`qq}S#dH( z#>=QbQapYFQKP0=eO+7a;AmPJrAyukRA@9e@S5L~w&G+!9SLZP28mWnKHWV=|7yNl zz?ko*W;x?B#Vl9M?KcvmwCP`+43--q@?>wvT}!jD|D4_ywkG`EfV)h7{4i08M?EzQ z0XFn5jD48%XVf&pE@e`VsC!f6n_~sN+@rvvya%j(rp0qDDbOuN85P3>K`e~y^c=!4 zQbL#4P^SxEvQwDIKQV*u5oe@fN!Y5gKc;d>i?deo$tlHr=NTnhNxG?T|bdFJ6B zU0;eiSrvqHmaIM*|8RDb)UkMj=L9PDnU*#ib-0~zjrE`}v#3EEY%I>K4OkdNNg6%a zF?OmToMk#CMy};55?WeR@~k(oXO_7p?v%M9Vs&Q~NNuO28zdeP#4i0XWV+91;R5^x z7UBZhZKtdzB8Rp&vI?@7MkcP2=C76IRWO;e8E%nf6x-zaeQ6>&G9$7&@E*WkBCcy| zH8ypKRMw0J*q=`*<9?(1&&hsUZM_e83i-VBoq>UQ0mF#c_S;2#7I`>EV^Um`ZxkAP zm|R-C58e+8b`GKhm?`g1B6h|>awP$EK3uawIM`n=4Q4m(4=Sr$R5haX^6d%&_HvR! z5Xkago-db+6HuNawZGI;Go7a<>to#y)J-v|;H2LDF-FvWPxsv4M@w6l{aw1?B=yWu z&hzxVNKi`loZykhSmo)cyT`86O~T5K6TvH9DsW}BPKDICL&Ia$tlN;?wB-@gmzH@@w_!UjVc7_>&f}f~zJ&*; z-Tq8EusnE|8h+qHVt$kPX>bPhu)SMnM@JsXrKd`b%kA9FXL`FGZ3TY8XB3~?j$Z=JraSDn$DIVDAnzRJf;98}q7GuIE0IgPY~pRcnp(1Oze-S0uBItF)Qvyn zLPv=5L(d>cm_fMv+e58@MXcJ;-6G=i+@%#uua_2{R3C5uG@lSkTQxt9&mQOdOpttO zp?%u(s{Bi}0(O)nJK6BJ!B(_0^VsWzyQ52gO5&s{Z2jlnq*+1r&1Pal%}7<0Z^W6p zAF`A7{M_0Z$HNfuXTEt92bHAgzbjPEF!iXlU!Zykw5pn0tz-NezbaK!8{0J9uScNr z!rX^4+Gmo8*ax39-|qe4GvkIbB9UgGVb;ozu{+fk*vNUK{jMO{q(kv43vR2;>rcN z7hQN*ARPevXQ#UA18(P?cTk?ux^MV`ui-Kms`RS;;g6Q@mpa+{=qb-WBzo|u*dMpe zYp{L~ub8HH))dmY1qzIqPX8_4}U!#2wfmVKkK!hJ@OXS=k7azq&X#p{yHCDL5@>$bi- zBn42cZ~E%ba^k7ekR*9zf(|2<{TjQsJpM!|K`Tc-Uf9m4y>mSDTS+7)LV;NDQQTTQ zot@+840(RCTT#@dElrv9h`g&`qdaKIwgUZ8?tb7GzI?tMxl-pX$HgW|GeG@NSK*af zUDkR+t>;+Ld>xK0*EaVfw=45A82|9~1j6pF5LEzd)N#8uc9G{o>xb zhVR$@1=!BIdMlAHse)E`PwIzc2Z)qSr$5|Z6nw@0l*-opNV-CwcUa`)r;Je3%#HMI zk##~-2~{HNcToxUdpvdbFfi#Fv2{iiqI(DD0yWxeEdINu%pr z<_g~KD$Ex?hKoyQt`@A(Fiwc`KF81?I~IsRGk2YMFp)jJyNlEhy8UB(5vjrwf;H%} z#VRGPMw1&IGMXoU8=+`^`RiW14&#^sF-e_@L)fLDp075rp!W$a-nAAx4%cE)fZhEviDM4a%%SSdZ?%;-k~3TOe@WZNl9whw(dSF zhCi&;vt=f7)V;MGEu1%GyoZstNG}+u5LcoB$XpYy=Ow5NsEu-e)h-p-;ze2}(`!~0 zI8GwIZeB>!+)GqRrG4Z7%IO>b#_sbC#-HciUPD8~f)bc~E?C^W7R~I5u$n2foxAx& zkh8bC3T;AA6T1YIdIYoXzA?fAGp|X>KFqYsC!**w#lZFm$~-qT#dP!Wn)3bdoIjN6 za4y)vBbC=sllnmC9gDGCmi556!D945rl;0$hL+7|ZYa5K5i))#)8o`&FS&T4BN4Eby>lpmB_>=lE}>#3!JXAfYzZ zGx;SO$)jb}Clf?h9JAnX6pbogzEfd3?Mie>3eCw~2dxLy`EhkO@eePT@3Z1Fe~En2 zS}qn8f3K!T);b2|=HiB}tS-qGVd3|9H#g~Rf#EuK9)d7RY@rhF;WUkUV}N0{M(L)L zK&}6d%ZTRFHCl4Nu5|}<&>?mc9&VNa!+s2mB2x`V2PG|~=`a^X*4%)FQ&y1Q??r1l zuz4!`>So(rajB+POet<*LAgTsf;%--*4yTXV%S~s2daw=JjM~wtZQt1l;zg&u1>}8 z1fu{bN2F$mE&*x(-6LZBm`6dA9YeOwc6KX1A?NR^{fx7A6g=h;$8Qh z?i9tO#&Lbv&3)-beHtTH9p}2%rIzfxmLwV|S{1;8z{1`r_5e?H;{rNuxNTLi2s^cO zkc49hu&QISN3R(+;}||#D)3ZyzjI&lT#!cqhfjE#i1fPDoI|tFkg8^ zB=8rojoqGq19Boj#~$e#NiJYyu&v`CXhJIH7F1z5sZ1)hW^RuNEWhUyjO61ZGmmcr zn8PtEx0?oh(NYiQrn~C%A{Tzv*&N%I_>>8}4d`lB4*ta2?jG+$_I?Eag!x63%I*zr z!-Nt)O*S)&ttXT*+m>;PhNLjt6UiK(C8j<3Of}{GF{%3;OC~O+r@!rObYQ#Nceo6L z)4>ei(g-ETz@BXd%hoAoYK&XP$x?f5OUWXEZ_6RRs92e;(8c?i~4?v z_nF&-N~p4eUybxz?~EL^`gd!&E~Rws*oXvhQ=urIN+8zcjqz_N@pfyXz|tYBYvCOO z>vYvJU!4(Jz78XEOQ-bAt(9g$?s2~py`7W^k!C;9=Iv)($MTQ=fW7lU@4LzQBzd5m z|Dair`h4w~f4%4HX6n-?&9%FYK&Mi9BN0@=#z6`3G^{1fb+jD|whN!7#Fg_<^7r7@j+t7{{{PIdE#0(V@hC?Y$4fWO`|Pi3aU}p zyuLIgrJ*1nsitVm+aSS}SZ&4`nm3zj{E|}ZQwrNEKbn?Xh3Lu*y%(4LQcquuPazhj z@-6TueNrv3ieTGW!c$sZkwQnMIvDpQzKhea02Vh;##MFz5eXx>0Q_x&u(O?7TDpA^ zBcPa))6W3UEGYkU!9Y6Nmavlhrim#nk&6uXri`(j$2~T9zNV*%yeV+|@EONyg?@l4 zjZ0Hw9x9NGHR|SnSlFqI>e|BW)T)nQaB{c7xuhZG(7{YGDY(%x)a+XEFiLvFpT3hr zps;pSMt#RM*@|7p6k7Xs)gWTPChu+KtvV!5*W_H{gzAv!uGf&(Q+5u;Dx z=3s*kA~Uv<98GF!B~m&?ugp5!EZ}a2UgjhOMILgU$@30Ojrvs^D4c#|#%;IJE~E|o zy23T+HM?Gwuh#d_hev!n`Ze#3&=Op=9fhe48hyR0&%577B^C=@shhOYRdd-{6lR2* zE@oaiFJiy$Bgj0^CcUo>8Wh)Mo@TzgPbtSlF1kDC)cDC~d-@hisxW^XDJ0FE=~@8< z_R@%L+psJgEgMq3h@>y~t9(k>v^2h{I5y185Ki8u#<128~>Cd9=^k&kK3KqBR$T)HEF=*?s%a%IK!7-3<*HHPS=4b+otD z*7o%%$@OkxsL~JV8az<_Bk3Q%W!Tb_-@@k%YIv6wT%HfM7xNfw)Rjvp1XfhbS4Hz@ ze6EfTEK`bbDg016AwAI%ZQ<)XLtEG#kM%Kx4D-`q@aVjzHZNZ1vQ`}Y%&|kSg8$+h zJHi00Y<+waLczn0HZmtsdF%sNL8viOB6=ePj`vm|nukn*Mf>V^QQN9bt#^$0S7yDi zO}NoYdQsF90SUom*F?_K5uxq`@sA(4_ZKUlMJW~MmK!+kNSRVg-4~%ezeoy-n+){x z^mFGXT(XN~hJ1(b@qrF9)7FT`voEbHYm_U-4sP{%wr}N+R<4FGhhKjCG91e5pI&IG z*H)$5iYr=**R3Q{fTHB6+W7h|e|9_&w0~%fgZScMFT7Dqi$Xn#S4e~9*Ku-~ zo9mWuf+rf)#R^1%a~oXFL3!j0&)i6sFr0FE$+s*6QazJm_E-~0$uIk@RZKc{)~YIx ztIX<)B1_9!i^IaQ3vkUi$3ShZnlHXb(q1r}NK|T<2(^Qw2N;7UgwC#iE-f8?3)^-} z1@)xX7R7I>?3e2K<(Y~jz^XL#$D02I&U=arrp>tUPV1Y}dt@_>IPLxd%MYyqnm(Ul z>-822JSs|~vrNm{pzO~oA5^#v!nOnPf!rF^_wSdQbwzc*>kAnF1x`DBo)6rKL>Jv_ zNnSzLRXox)3UE>M1R& z?N$@>lt9&AkQ7{y!_U@eMoCtIgovDZMy?0Zpn$;yXMKy={NP>=ggbqwetuj2Eiv0I zK@5Sql12lk1rP5m$0lFbuY^%}6$m^bpkajFl$GnexViQk$um;X!w;?ZPD?%{fnz>J z@$_yx97#p`z3)6qJHKmD6H~rR@6nO>Pga}_Xl59^N9{mChve*`y%2ePkX7I!BMN=r zJjcp+zZT~%9`pufm~V4}XNYu1;MamZTIMI!%>Aat5sJmJCi?I_2+6M|p3T zq;;@ntkrMVRzwrmks~J9%M+qxUfpJVVsj8rp!z+j3KFx|lqi2Yz5Z}Wl$Y%--*?8F z6*@?`}V;Nq_ynUAVu{AtuE&Psq1lu154#mnr-(I{m1yxE=(4@=2pu4 zcwGMsbIkdu(-QPeWcTJXYksFgeZ%@vT~T_{F83{6d1*2i((Hc10iZnF;&mH3O5Efp zm-5!V4QF@TQ&r!|&+*Kq-!4|kt0D=qj9e?>{S!1g@JJgs62b-&!agA+XXV!pVc+zNEt8lv>b$nsG#QqG* z6GoNHTFs{_v{PazMV`0EiV}oAYa^v@aBoQ4HWvg%w-mm- z?Zjul%P5P`PkmUhg*g7;g)t@1cN*OVUH1blXDPAt`>f}x?^YZnRb}TSV%FQs5j?~m zGu}-LMzxKK5q1Cu+1?Xg`YMVJKC;j<9cGh^;=B34M@jPQ$}10xE%9H&7BtM?7z zuUpyf9U1V(t|7K@^8C`dkrrI8eMQ@k+BAbfiWgK4jB1?x6i4-bG zU@m@3pTuThj60bddQ{ztwonpsx9KhEq>k_6>_loqN!M;TzBVN0QHd0RhBkSC}}V`@(}Q>>XK{(LU=LlC$qS|<0Z&(MWuB~ zPRl{eUl3?}#W+FzI&1miicjX=0;AGB7pUZja)pom`n0Z?{Zl~jzz>IC+*qDB)6gcW6kiS)diVrQW#haxiC1N0(dN)9l65*s( zoXYe{>`$5nFu&^KWgl#uj(J!|+-Mja=XIW{5u+uSYq@hZPU2eoL z(Jd6|5FQamVZ9G}VhiWE}x#%Mp+c zeC8L|R<-@659|2{t}x?Zb3%4UJ$Z5tLm8d%e2^0jUXZlR&+>)fK$YN{0bX8KY|@rB zA1^?lLrZJTm_g14KyS(;8&<`DjSbq5R52lh#}^WLJ^cvg#MG+y6ZNRRwfQB|jQtg< zmT#vlwWdvNOy#M0j&r`mqHYeaVzqKZrc!$Qee+AFcRj(=op(Qd}#FJjB*Nn-P>EK={y>r!~n6<`pQgviW;^>B`2RDwp!D~nkc0A=|)|I zUSjK$uJbOQiSh(fpssoOTEsm^s>4>%AlJ2S-=I$6@``yc-NX7$1qn&IlA5|yIn6vZ z8VJx<0uexWJtn3yTw;I9cnJO@E08~`<3l|ai)Ft+I>3ll^<}O4LMuf^$w+l}K1!Cl zq|m|yJb)8ntO_$kf_E3{;Kp5RALCsI9FI&`x>Ciu=SZFJZ>2f~QEP6Turv)ftzV`g zQz6rl{^`WgwLc@8d(4Z7|?B{5}9Cd7*QA|Nylf-?*Gavk{5ORs?xL0k9 z1bXSC&udSLio4Wh?;Z(Ob$7yY$zvw6ttfAU*<26EM@oWKbgw)DEU!nu=`Uj`eFCTF zBydjIPJIk8T@s@R`TZO(#%vS#+5NvPB78GutQ#uTk$YTP;P6DivpV7E$r3H^ zts1$qhdZ{H8^OE@y@JQL3sMXt+4fzrN?Ouwi z2ag4sWKbO6#A}<~si8Om2fLSucO~sh%($2n(muQLPK3&gd5BZ3C+Ew;yPaw}dk0m` zk#}-N6iPaf)Vkz(Hl`l6fbCFtTALAYsWO&Bf{U|_aob_}Lk@>D(bAE0wmN2|RXpLj z6m_RhVW<#Ng%I9InTcFf(*iLB73c1FVOs$(l*GL6-Hf-m;&DjDS&<7h>y z$P8F;`%ECvh}9~Z1QueH571bw-@Jr_@`L_yxE_n5dqK*+ps2kruZ?4hT9WJRfP8F? z_4UoFc6dAtZ!C=4Bd%=1YN8@c9tcmRYX!GY6*o%MPQ}lRZ1H7KrIPFSJ(l*^hqxa` zH~gXR6Q#jKSKX2PU5!|Se}M#+!NY+%wpnH2A_~XA9hQRb?)XKfJIzZuEyXitw`A&y z)ZS9+83CNo(BaFqum{9O=|ip)-z#v}L(}zTvgjNvnxUi2tS}R@lKDPIrBZ=p_vwuF5w+J~D~hQ7C;@ zt;NC*muyVCN()PL1lSd>8w5;9YGVfv`Z|VT9^aaHp>}@_Y|~8|ha-E-Ya_6Xy%~IL zphJqy>=(A?$?vtVpr(VnYGYmr1F25}CS`K_pSG^>FyAjH42s1cJ?{i;PeCh*i5av*Je> zOdq@9pE5ER*Zz_D^8CNRv0l_EVYri>V+^z&@I~H$VTo}PJx0?AxGVV!6jt7~T`MtL zMRL!pt7O1sYK-yC0=NG~5^EWb)!GHKZ zHm6o(dy#zMKh63T@tykzo9c-OqDSd;UYQ+!6#J6Qn?Jgi^gSej(-P7v{rhel2m>)l z4~P^{&qA7tQ<;ZiLOTEOFX#hM=#EVELW@^4zhsTi(WxDQOU2im_ZPePdkF`JHHPp~ z(`OO~8O;wNthsJ$Vd4P_MtE_Np^Fsu6KTLtmtT zPv`H~a3HvdM%8dn7H}yk&%>3E7R1N45iUT$hlGg=MP3vsQk@NQcU$K98~yI3Qm_hY zZjnZ5aI5}obM<%kh^_d80B9DivP%$)zo8aOR`M>zxnxi5&6eCBc9(F&z^)7c4 z_Vz5(HTeFp7H#?YDaL03$7PI(i+#f?%;x*?rnTh&jO>^($Nv)=9OdHx&u+5j=*Tdy zA+B~nM*Zhs?PbWy^dI3Hp3>(XJc zoq*Gz7vxXP)_dg7ZX1=pZF5mrr5=`wom*^hO(JA(ehUw7KEt86qu9+uiRL?p1%Id~ zOrz7?EY(+CTgr*CD#en#cOUfYb*_%A6rNV>>t0jWT_Ty5o)H@#Uc_8y@6SXoj0oW>vWZ1{`#!CPTr@yy7QO^x&HACmJ;})7HDKE4de&bqg z^VVBxCbi8;JmR5b6)?9A85?%15sc&Mk=9H4*VPLaE12=_O|i{o<EPD+Y2Kn5xNA{_!Y5RGuLNz~+;g9|OEVVeK`(yiVmYQvS-=ctoA13SaqO0=2r6o+ z;-f|K+9x9+Ka`F#TdjKyZe{~#RH@4M0P~>J$pNX<@Mx=@y5mIeQ&R;}&XUGBjpJa; z!*F{JJ^FQ}&)g+h7;~woWzzRSP55+|Iw@qQr_^){T^lO0sumrU8#p81zo%~}uM3N3 zRWW0A0O{fLMfEO^m|`H$#EL#3Z|AxP@Xe(quJIbGhOVAzsn!`8C65UkI>uTyDh_*q zGCOVuk<$}poH3;Cv%!-H*&f~+T2S!Yk1M}L;Ad;b7Spnf9l)R1^rp>LL`qx>RDd7`L-qBHXH zs~zM@iU|WBrLcL&Zb+;UHTYLpImaVL?}xXN$HvIxJFctRl?CA~%SYU+D{ZtEt6Vnu zXoxLiRh^7B%Q7_{&c1Y>4?JlOT&4qAjk>qLY_08l5f^@q!i*v11q$$ zc;9gcim+}U3npW}{HwdZ`6tT;p}TmKbgQ}2P~EQWy%P{c^F~6^h6MRwo!H|CZZVFs zpM#nveLD@4zWPzB*F@_iY@MN?{=1foZ-%;`#5t}k+B)@fp`@tTWxANH(MvAuG;zGL zC}jf~E0LT7*7GoUoHJSU#j%pwI^UV^<;g1J6plS$E(2{TTz(w8vgeb1|0`@b^^%T8|4A`9pR_vn(y4c6-pjiB{9} zl@~kp(v|AzDEzppe9B`Xh!+ES9m&fB`wqvc23cn6;WSC-OVeR`xUk{)fC#S@$T#l~ zs;yV^aMQGQ)wNVdx=LmYtx=p7!si&r*eKoB$=8l|S+t!bQ&Bj9f z?PX=K4|jjg^`hJG6pSbQM_*5Jt603V@|JWGmIRzQdWHyaaoGL3shOnH8$$LAJLtvR zoxgI`argd@ea0t2Z@pytP0~R?m(zfjy|7$h{@w@T~nE3UOMaKrPx5{Sa81t ziKspRwIp?|_-3`S$j;BUT8m9xGrNAGhi>)cA7V%PblWk}v{RZ$@?6{tzxo6%wVwdG z*7YW7j(4Drc4cj}Ph;)R`91p0A97&!oyRc~A~G&Q3nP8az}@bEJ|mTzJsB^F%l)19AhWe>A_Ueir;kvx;kd zQPX#Nc%mL%RkH9{q7=qVK3d97N#q0X)G)x;nHWeXQ=sS0=>*|sdqa6Ddid44QkiVG zIbet)BDc=1R2UikKurQ1eKXUI!!}tA%?9<_zXdMnUe3#p-}Htii<0SZN4H)rHL((` z@k1?S*}>;66)^+*9<&<#tfztxIvi^pO&a%%j~|Advn-zk}*wbIa+JU zHtvmkw{Y}PSK)HwHB1$s#kLdVNC^T8;ke`Uk|H1h(GE4Cj%HJ@f`;^bjnFuIsT2G- zYBshk6c^np^+bcdnAamndu;>ddaQV;gNb+~dj3$|(bAe4daU61Th>AtU-3&FG|L&m zscPgxbAobdah`qphhm^{H+A9tsyCyj8&|5CLGZ(R(&DM7mrl<#vHnzxsgf}Z7W~gk zqV5L+jtS^9Vw*4;`yw|5Gj7G68tkN0_%C%4G!eCc)GT0!I)abNkeuTlvPK9w$?7A; zJ%Wy&zombnGKiA%fLb?5H7x*3z^n0T~2_^&In(e%a^_p5*HbtoiUZ(hXZF{VB4ztq@OD&62Q&O#U6Urkt%ZfG{W%QlMP?j0?Vx)oF zZcItUVdHZKtvcT&;~K|cr*m9)_gwwrhlY}AZCca## zAcM!ybQ3-{mJN>&(OMHn9K=Y|r$5+Nzk!<0#p2$Jo5Nj2UMP|nPvQ4VVl^a`+qNkE zOmYcd(sBqL`YQ|Y#2taX=#YP0)^;U=U|!wy+d<{tm9;m)-L}iBt?zZ3-3<+{+Z7c> z6gG+Ta9~&pqchG!O4-R_$Jlh1Cl!f~C&br~@@zXw@U9^a91L^0vH~*k8sDEHrc!ue zru4ja_^!Gu_|iHoy)|%JhN*)iI5hPVq!Pvnz#eB{I6lFOMgrp37ME4n6npFgT=q>n z082nE4zB%u4Sm(2Nvo|C`gTfcx&dmnfN?`nVUphzE0568LlYx_Iml+lKbxt@=R2}& z_Yi+bxmy_8hl0x6ceqts=Y12ZYv#4lqKG4~2xMD&XK;yO5oJ{1jfa7ekOu*b?_)6qpqQ%KluAIpp*smc|6D-T|C$44`; zftN$=<$8p>@VP95W8eE+@qRSA(^Tp!JKUamZWON#QD$jX8Gswc@|DsYvllT-oG<0V9l$rUzb@K9Y)l)Ug6j z73bx^$p(#i_x-Mw_#o6*Dr#*}VZPqOP{l;EJcu$;k? z;PoV)3QTM|2JVS}7FE%?WR*L{+>ZXDF~`uG3*8K{g6-cu78fl~ zaf;l2X=0^h!$gTRv0+ECD$3{ixEy2Ox#~dF6;RfaYwUsDFEBmIN`$$+1!Baz-rnz5 zwQzXdu(%^2o!KWo;{&VZH(+SFq-6oxrRuAdDpOR;bJV8q4$vN!?{A&pj~tRwV?sM} z4+A9Ocr%-G&HA7mpd zIjI(#?Z)XtT~9$*StVF;60&L095Jo}`GNen*oNVWcP9he1REBCzui+c>K2MCLemBF zZ&w<3ETG3BmNUjU^u#{d$^QNFm?Z21dD%vmkJ4ITsQmB5YwHf(q{!7Sg-PrS6$kr$ z4^?p>>MPMyZP`C{I-VPSJa05~wO&%4vS-azU)%FGmOLI$Vbukbrm9J;&3x}rCe~VF zmZ4*NV^4?LB~=nAKl+r0AakC__v&&u^7ULvtF!2iTQAR2uqCv4&=N>knEDPl;v^&! z!Oj7|9SDPF{{H~lwF=h#5n1&O$09i^=fjf87@@0|XvQ*gh2tZRI*hJ6eh}@0ebky- zi{({hc&4bUrYcILw$_Dr06P;aHwQn;I^$qoo}o}=`D;zvSX?Z~O=W(WxA{45GNz_j z09+G>%zIRJ#hcUNIdu+^<$-_ho~8kWZs)?>bfbZ`EJ^G-+p^| zE_Sr)YHLQgte}<&t@kT?8Vb63y)vfP&dg&N$OGwuG4<)f$zzSOH0X8F3_d5wSmE5d zgGc;fE}PMD)7>a)^)$%4l9n1`#u7L?PV!0MpGe6Ij*l=B>s_9L<_t|8O-vCc>7a&L=9wJs+Da_vAe@|I11Fv_*L^!LF+Zh$sF8!S z`28Yv8W&B=POUwzs-{h$Bx;IUhHayU!ZVZGu`E>X;2welSnV|P{V8;kylY3uEtHlm zKcuPWmd|Sznv{-Yp;;=Y@=LU2DUl;$amX#{;1kA2Rx%sPU3~fak@-RmF4ny&m*=II zTxvZdtmL#^>7}H(+bcd^rCMbnW=7gb-~u^v3GO-Lf!2)JSh}$I&WF41oQoLqCRsHq z(D6c^i&3$>(n%dv4M}4R>Pr-0z%+OOev$_{ImyTv$5`-(LhQD+rpq${Aqe*=k%L3`cPV}{sRMv=4Lm|Ndh6x}8fPk@Wrz0F|VjmHQKmCTnj;jrkO6M5I@$&Lr zMOgRx{WoyBXzf#7t!ZeaXD%}q4-t)%ud`f;lg4(ldeOtvX1O z9qKRvQU)`~=R6E?&4e)x)pNXUqFlRc8=VYQR8dqxK<$vAYieE~&j%cF&QsXET#R}70=NvNr6Xk>pg@)**}R|71vDk93b+6OJ3_#hL~joyxl z%CVq8t@_sUevxV3@YV9hM8%Qfosr!UT~xJF%{8_bh$!;vDIr80FYnMXJv=eaM^K+{<-#Gl$2o$l8*zDsg=qkXtV5-nb# z)X+%A8H7@{K^$!X0349VCm#K}8HORqeD6nWkJBj3K5|>_dV;#niuFDcMO(C%4_>iV z;TUH*e#G!T+3nRF8tta9WKdsSsES~v@#d1-BosEU2<_CBp$=k73PnhcNp2&91o4xD zpRw=NOi~bYOJmIo{B{FlHl{=I5#l{nO*>F%t4%#JOe12HqjW^~-?=?F_rm-BuH6h_ z;$hY5{kLq-bjKHpellv6N0Pfs+mW0N)7I3I1~5+5i;R6Uo`hM4W`Lg{5d>0ilieeD zso;L9@qE!%-1TOMpt;fRjUJMgt|^i;jI5I|!!CKj2a}P>$4p`Ikzs*oYn%^1(iE6! zWZVJsnn;h~uUH8l1n~nzMDQ~R>KeAJw)G$oR6~GNum?S|Gttf~3%O&x5ZeYLKsa}+ zQ@~FJwTFe;iW{|dqOjj+qoWW3K`l&$uBGr zwFE0HwJ%W|&k~V=!H5hn!R#1u(~QHjH)#8RXc7~a>u&!5!k{%3y4$ZjK)c>=nzB1Y z^}trwT0cB zR=>OI(;4$=Rx3d*Tf9{SV3^m#ArMa$n=!AzbxW z%`ENmlSw?0{#I&dTaM zt)XVDtVfr~t84R9PfiXPD!fj_F9RU386CMJtoCAD%j(Tvb%bKb+yHsoy(&`pN3OK- zkW(zy+9-EOwD$|5S3{iSmE6(FB*E^|?HS`38E@;Dba?dB_7J|D9aw)W3d+4j%CvPgiat7lUr~)8AE71dJd7=#{P7*57myOp(R5x;^0)(7N{5HD^RxM?VWr*L^8VVz*RRKCQIeYe7-uQ8d*P zNXH;A>%d>B+A=ebVbH_D6bIQ&IGZ6RTx;lQ?KIU_2qs#Ll#V%FsnG%C9i{gHkA6M9 z&sL&M1#6*bI!k4-+h(bn;Y(+QrQFO6&Sc|)7k3N-x#ymF$8L#o6U|VDG;&E5o;zDK z>@s}3Epamk5I)sV@sM#K2uR5|?~n7*#4mRAmUQfI@wB5)F~ zlG%@I5>E#M1KX(jL#AT8>&FJtgInTus=ClTD{-xac~PkOimy~-x{M{WB{C;aoA&l^!@rUjjb94v6;_3rxaR!RJ5;{ zs-&o?iQ{QjSVrtHQWP;H4mRYE@zpw}ozXs^jX_hJRl!kPUn|?`gDgT4wKP+DfV5AjvRz1|TJuiDTO5w?(@F?=7LF;Q%%93wN3=I@uN_dt>aEd6C6{MU z3;Ze4c&lx?)Fjll%BfJPVpW53O`UYgTMSzQf9;^|9I3EKrd8*X;s<7B0jpeH_pFh0EX z8OEAwtVpsm8u`UXrmnbLs%aA013p4s5_&T|?&Q~>V& zm0I#^AtathknS?6KJ2Wgfwz^%Cm@^=2E|sqQ5z#1O^`Tz z(M7lEOMPisk>Qc$DLSx=$c%oY!bTKr^$>Ck5<7w4ojZo=jE*O256>mK8tq9%AzDk! zwY26EDkF-rYHW-U0N{*d41?bX1Yu89A}0%TYsnDFBTkRMQR$*FU#Ydf%a|(f)iU|S zDpNH}5_lO5>$DO2dxOw}Alx@@G>O(q1s8d1`b)x~QBP4UlrlXsNg?^Fh#`^UW#IF? zyntk2vEw`p06JpBs9)VL*D<8tz9Z$O%ayPH02zU4#BMjNbG1%G0AwX(U6|Slbp!%i z{NaYbvP+6p?q+e2_iN&{)9JeU>Z+-Wej^e)B}8c>DLGHl3$QuJ2PM0Xq|DF&*;TE~ zNxSt=o*(L+BVwp4deVtkDJ-j5B#kuDzTgY0J2C<};cz|p;Do1S&()9e+vl3lf^0i< zb7=G5{dq2p(VCLMf743T@cf(*N~S2Pqjn^pP7c;R@Hox~`(nr($5GX3hlkUecTNjE z#-69;Y*iHWl*l(AsFrm`WBkDrI5{9-kUjbB&~H^z_{(kP)VUW^2lF2BPRf96K|Mhk z9l$NPkM0|{evOsqpRx#(54C$QFV_uC64O;wQ9&dRAc_g$t4CnO;ad$75XAA{3NwuR z*}=d9<iM;x)GgEGh&ur5KEAoH4XQ>r;TKi2%LzyhiSq#YgPUc1Oe4u&yVEr@CTG782K+`bqulBR#Fbktcy44Y= zylPzyb4pDaSta_+M)a=K6e^WYcO35s=PE`Dl_|mXCgGE{4iru^zp{A^zH{~|PpBYM z4fusVv&TyN)ipoi)D)BzwOcaO(D^tgC5vq%c0EiEbCNULko`VFbDO0{VolJ{s=l%7 zZ#M?0tf-o{H(|1OkN}5*#~tu^?a0SYhc%6+=u&0bw<> class={{{ mws-bag-pill [match[yes]then[mws-bag-pill-topmost]] +[join[ ]] }}}> + encodeuricomponent[]] }$/bags/${ [encodeuricomponent[]] }$` rel="noopener noreferrer" target="_blank"> + encodeuricomponent[]] }$/bags/${ [encodeuricomponent[]] }$/tiddlers/%24%3A%2Ffavicon.ico` + class="mws-favicon-small" + /> + + <$text text=<>/> + + + +\end + ! Wikis Available Here -