From b735be4dcbb759aa3f5444357d8cbd86adfad251 Mon Sep 17 00:00:00 2001 From: Ken Cation Date: Mon, 3 Aug 2020 19:43:38 -0500 Subject: [PATCH] Version 1.0 Documentation added --- FingerPassSetup/Product.wxs | 32 +++--- README.md | 96 +++++++++++++++- docs/.gitkeep | 1 + docs/_config.yml | 18 +++ docs/about.png | Bin 0 -> 24344 bytes docs/button.png | Bin 0 -> 3934 bytes docs/database.png | Bin 0 -> 44610 bytes docs/index.md | 93 ++++++++++++++++ docs/settings.png | Bin 0 -> 11362 bytes docs/tray1.png | Bin 0 -> 13304 bytes docs/tray2.png | Bin 0 -> 11565 bytes docs/tray3.png | Bin 0 -> 11652 bytes fingerpass/App.config | 4 +- fingerpass/DatabaseForm.Designer.cs | 103 ++++++++++-------- fingerpass/DatabaseForm.cs | 2 +- fingerpass/KeyDatabase.cs | 3 + .../MasterPasswordPromptForm.Designer.cs | 6 +- fingerpass/SetMasterPasswordForm.Designer.cs | 18 +-- fingerpass/SettingsForm.Designer.cs | 24 ++-- fingerpass/TrayIcon.cs | 88 ++++++++++++--- 20 files changed, 385 insertions(+), 103 deletions(-) create mode 100644 docs/.gitkeep create mode 100644 docs/_config.yml create mode 100644 docs/about.png create mode 100644 docs/button.png create mode 100644 docs/database.png create mode 100644 docs/index.md create mode 100644 docs/settings.png create mode 100644 docs/tray1.png create mode 100644 docs/tray2.png create mode 100644 docs/tray3.png diff --git a/FingerPassSetup/Product.wxs b/FingerPassSetup/Product.wxs index 4b33202..6ac5851 100644 --- a/FingerPassSetup/Product.wxs +++ b/FingerPassSetup/Product.wxs @@ -1,7 +1,7 @@ - + @@ -49,16 +49,6 @@ WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx472MinRelease)" - - - - - - - - - - @@ -67,13 +57,27 @@ - - - + + + + + + + + + + + + + diff --git a/README.md b/README.md index c7281b0..06ffbc8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,93 @@ -# fingerpass -Windows tray app to paste a password when scanning fingerprint +# FingerPass -Fingerprints cannot be used to encrypt data. they are only for convenience. you need a password. see... -https://hackaday.com/2015/11/10/your-unhashable-fingerprints-secure-nothing \ No newline at end of file +[](https://github.com/gazugafan/fingerpass/releases/latest) + + + +### A fingerprint-enabled Windows password manager + +FingerPass is a Windows password manager that fills in your password when you scan your fingerprint. You can finally put that fingerprint reader to use! + +It sits quietly in your tray watching your fingerprint scanner. Once a fingerprint is read, it verifies that the fingerprint belongs to you. If it does, FingerPass checks to see if your currently focused window matches any of your saved passwords. If a matching password is found, it types it in for you and optionally presses ENTER. Easy peasy! + +This isn't necessarily meant to replace any existing password managers--especially browser-based ones. Instead, it's intended to be used alongside them, and to fill in some of their gaps. You could use FingerPass to manage the passwords used in all of your other Windows programs, and you could even use FingerPass to fill in your browser-based password manager's master password. If you do this, you could set your browser-based password manager to lock your database quickly--essentially adding a missing fingerprint feature to your browser-based password manager (relying on FingerPass's locking mechanism instead). + +## Install [![Github All Releases](https://img.shields.io/github/downloads/gazugafan/fingerpass/total.svg)](https://github.com/gazugafan/fingerpass/releases/latest) + +[Download the latest Windows release here](https://github.com/gazugafan/fingerpass/releases/latest) + +...click "FingerPassSetup.msi" and run/open it. + +## Setup Your Fingerprints + +FingerPass uses Window's built-in local fingerprint database, so you'll need to register your fingerprint(s) with Windows Hello if you haven't done so already. However, keep in mind that FingerPass normally takes full control of your fingerprint scanner while it's running. This means Windows Hello won't be able to access your fingerprint scanner and register new fingerprints. To get around this, right-click the FingerPass tray icon and select "Pause Fingerprinting". This frees up your fingerprint scanner so it can be used by other programs. + +To register fingerprints with Windows Hello, press Start/Windows, type in "fingerprint", and select "Set up fingerprint sign-in". Then, select "Windows Hello Fingerprint" and follow the instructions. Add as many fingerprints as you like--they'll all be linked to your Windows user account and work with FingerPass. Each user on your computer has their own set of fingerprints and their own password database in FingerPass. + +If you paused FingerPass, be sure to unpause it after registering your fingerprints. To do this, right-click the FingerPass tray icon again and select "Resume Fingerprinting". + +## Usage + +FingerPass sits in your tray. It looks like a fingerprint! + + + +If it's having trouble communicating with your fingerprint scanner, it will turn red. Hover over it to see what's going wrong. + + + +Otherwise, when you scan your fingerprint it will flash green for a moment (if the fingerprint is one that you registered), or red for a moment (if the fingerprint is unrecognized or belongs to a different user). + + + +If it looks greyed out, that just means the password database is currently locked. If that's the case, you'll be prompted to enter your master password the next time you try to fill in a password with your fingerprint. Having to enter your master password occassionally is what keeps your password database truly secure. By default, you'll need to enter it at least once per hour, but you can increase this timeout in the settings if you'd like. + +Right-click the tray icon and select "Settings" to get to the settings. There's not much to configure besides the timeout... + + + +More importantly, select "Manage Passwords" from the settings or tray-icon to manage your password database... + + + +This is where you'll save all the passwords that FingerPass will type in for you later. Each password includes a Program Name and a Window Title. Later, when you scan your fingerprint, FingerPass will look through your password database for a password with a Program Name and Window Title that matches the window you're currently working in. If a match is found, the password is typed into your program for you. If you checked the "Press Enter?" box, FingerPass will even press ENTER after typing in the password for you. + +The Program Name and Window Title don't need to be exact matches. You can use wildcard characters * or ? to match any number of characters or any single character. For example, if you enter "\*something\*" for the Window Title (without the quotes), this would match any window title containing the word "something". Matches are also always case-INsensitive. + +FingerPass looks through your password database from top-to-bottom and will use the first matching Program Name and Window Title it finds. You can drag-and-drop passwords to re-order them how you like. If no match is found, it will ask you if you'd like to create a new password. Alternatively, you could put one final password at the bottom of your database with a * for the Program Name and Window Title as a last default password to use when there are no other matches found. + +Finally, to make it easy to figure out what to enter for the Program Name and Window Title, you can click around to other windows you have open. The password manager will stay on top and show you exactly what FingerPass reads as that window's Program Name and Window Title. If you already have a password that FingerPass would match, it also gets listed and highlighted in green. + +Oh, you can also change your master password from the database manager, export your entire password database (decrypted in plaintext), or import a password database that you had previously exported. + +## How It Works + +FingerPass has two main components: a Windows service and a tray icon. The Windows service is necessary to take ongoing focus of the fingerprint scanner. Without it, Windows only allows a program to acquire and maintain focus of a fingerprint scanner while the program itself has a UI window with focus. + +The tray icon acts as the UI for FingerPass, and communication between the tray icon and the service is handled via a named pipe. The service keeps the tray icon up-to-date on the status of the fingerprint scanner and sends over a user ID whenever an identified fingerprint is scanned. The tray icon lets the service know when it should aquire focus of the fingerprint scanner (when the tray icon starts or resumes) or when it should let it go (when the tray icon stops or pauses). This way, the service won't have focus of the fingerprint scanner when you might need it to login to Windows. + +## Is It Secure? + +Pretty secure! It shares the same benefits and shortcomings as most other password managers. + +However, keep in mind that **fingerprints themselves cannot be used for encryption**. That's why FingerPass asks you for a master password occassionally. This is what is used to encrypt your passwords, and it's the ONLY thing that keeps your database truly secure. + +Requiring you to scan your fingerprint adds a small amount of protection on top of this, as it makes it difficult for someone else to simply walk up to your computer and get at your passwords while your database is unlocked. However, your fingerprint is NOT used, in any way, to lock or unlock your database. It should only be viewed as a convenient way to trigger that you want to fill in a password while also providing some level of assurance that it really is you (and not a passerby). It provides absolutely no cryptographic security. + +More security details are at the end of this README if you're interested! + +## Why, though? + +Fingerprint scanners have shockingly little use in Windows. They essentially just let you login when starting your computer or switching accounts. I got tired of looking at my useless fingerprint scanner, wondering why it couldn't do more, and decided to start developing something that would let me at least scan my fingerprint to fill in a password. What started as a weekend-long project exploded into this full-blown password manager for the rest of Windows! + +## Security nitty gritty + +The first time you run it, FingerPass generates two different random salts used to generate two SHA256 hashes of your master password for different purposes. The first is stored with the application's settings, and is simply used to check that your master password is correct when you enter it later. The second is never stored, and is used as entropy to encrypt/decrypt the passwords in your password database. Passwords are encrypted using Microsoft's ProtectedData class, which encrypts data using the currently logged in Windows user's credentials (and supplied entropy). So, in addition to being encrypted using your master password hash, your password database is also tied to your Windows account. + +Your password database is only ever stored on disk with the passwords encrypted, and in fact is only ever kept in memory with the passwords encrypted. The rest of the database (the program names and window titles) is never encrypted and should be considered public data. When you unlock your password database, your master password is hashed and the result is kept in memory. This is used to decrypt individual passwords when necessary. + +Unfortunately, one of the shortcomings of FingerPass (and most other password managers) is memory management... There's really no good way to clear your passwords from RAM once they've been decrypted. Even your master password will likely be left in RAM as soon as you enter it into the password textbox. To make matters worse: if you run short on RAM, Windows could end up moving those decrypted passwords onto the hard drive's swap file. + +There are some possible approaches to mitigating this, but they're difficult to implement and the actual benefits are questionable. FingerPass doesn't employ any of them for now. In any case, if someone steals your computer while it's running, or can otherwise dump your RAM, you should probably consider your password database to be in jeopardy. If your computer is stolen while powered off, the risk should be lower but might still be possible due to RAM paging. None of these exploits would be *easy*, of course, so you would likely have time on your side in a scenario like this. + +FingerPass types in passwords for you using .NET's SendKeys--the updated SendInput version introduced in .NET 3.0 (not the JournalHook version). It doesn't use the clipboard. \ No newline at end of file diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/.gitkeep @@ -0,0 +1 @@ + diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..af93a35 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,18 @@ +theme: jekyll-theme-midnight +encoding: UTF-8 +show_downloads: false +avatar: https://raw.githubusercontent.com/gazugafan/fingerpass/master/docs/about.png +footer-links: + dribbble: + email: + facebook: + flickr: + github: gazugafan/fingerpass + instagram: + linkedin: + pinterest: + rss: # just type anything here for a working RSS icon + twitter: gazugafan + stackoverflow: # your stackoverflow profile, e.g. "users/50476/bart-kiers" + youtube: # channel/ or user/ + googleplus: # anything in your profile username that comes after plus.google.com/ \ No newline at end of file diff --git a/docs/about.png b/docs/about.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4f14de73f2e1f797172e14a6c728e8a784d136 GIT binary patch literal 24344 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 g|Mdk|cS^F*`S+K`4;z;t>K;#9T~Do2#X9VN0JE zd30RWeaAoV&YL$gnoXn8ZdV3h$YfyqEV!+~K8OExLK5}X98f%PD*-My?z z2ao{DwiIU?LjOQ_$7ULe4st&YM;fHGl%1wHgDN3K1yWG1kTkJq_p<6{sccKJFogcO zmKm9eWnk$_gEZ2VGfi<08i;14Lej+5GO$W_#|CVmz*pZB4z?#qk$hw@JnBp-psW%G ztTYsTq$QVqoNp zkyel*#icMEYTVtAQnx?kd|k_ZhEW{uNK%iH_SHB%tAU60+FI(L3 zWtF1;44Wr4bBhtyg6M{xI2U`iC)FV)6m;vrEob+P+H>~l=tT4|CnCrBD7b}njW5t? zbPhO=kz)5uvust}m3*iAmJwD1>n3lc*ghSA>ng?%Ngl&H1tns1=^?s}PQqtz`dORN zNtYf3p(ZzL1PdBGrG2V3hl<1KT50lE&aefTmj&3&CYg>#uZVII?Vl~O%z|6ocsvW&JV&ZO%x zdW=-+v6UodU}#3-lDKXlSyduN2M7a+KF~sU4OIn0^jfJ9XZ~ES2#~B2 z_Hnj^-7iG`jXBH(;9FNL=gCv$*z%P4@shNwxHs!Tu6C8-7A~69W_ATXVa@61I2Ak5 zo6f}7D0R)^RP-db9=;*I|H*OBa&yM*06b807yCQ+0x;Ke6F)C{8GwJO|1rO7d6PX? z9s{5%T*+Vl=`J45`#YBTZo?zI9F0`7rs0=--0{JMikHx2m#g~>Io4dhm-{%gJah5M zeqwrz6OlSL2Hs*_(@PjXhqU9-qj@=4q3r)yyg0Hv;3@oOhm&19GLQ*1d3vt2g=pzAtszW5euNjF?+o+pQF zJeRqiE3>YSUpvh)lhxz@i@*BpZVsgFxoDaCqZ`0&ar4ro-;k&DKDr?bnMsaf{?_pm zoB!Ghv>ES|D}CDRtL zbjkuIq!$sfbPyH6-pyieF-s7&XJ0q%l;&N<(y8XP%cd-(v}guyuS%pPIhE3=H2{#G zo{!pW4$`KiO^Y{lI2z{Pw>-l`zrLSe?^uJb>$nv+&rJLkwiYJ<+d8(!)04a}?tGqn|DSnu-9sFzuK++u zf?I9NiJXdFuq^%64W?0_G0->4*Yn^j_py4@Q}N^9$iI#DJz)S=WZoAy(E7k}e)#5N z{P4}k=!%5#E7|?2_5qQ&EILqM-6!sjMWD5|k$u*UO!dzq&0F1W{U2N!H!xzRe>ce%6brf*pxyO(dq*d?G>-y%5diNU+=SI{!Qx1K(tO49e@<24Fs>3C$B+Dpx5t_{K|$ttI=4l! z?^{*K zovZHLmm*9r7Sm%GnyI|ZJqLi6Pz!%J_zu2#F1%N#;T&&cqkTg>y;+5G=&X(+0oy}n zyf|mlT+{}GQrGnWY(4xwx~}82xhPgjnC+eyzy6Pvn{gB<2}&E7l4eYXg%qNb`eEW_SJbBmCyuEBIMc#>Kp0a}0ts@~(vBaHqBMdIP5VzGY%2fvT#`)*d+yr zYQVJ3kZIZ@sjD%OKO51Hj2Z zeLU!KSv&wV22UdtL0Vz2=W0=#;_uU)=|mbdm;oQRzt7!S_v5yED6w5dsk01#O$Xm4 zCnJ~XIVF@8&Z5j_4y@_}^&D=fB>P%Vf}TKE0AUv>8D^8jj6PwFcHy!NM7Kxw@JNhYDvZ> zNw{V>@LiQdL!ClXjYhf@rCI-ycCCp{t&Ol2Bw~coj3|b#A|bHhz+*|rX?5YS$xM)a zG*lS`8q>&KoQZv`wO8xKw!ZW^USykyQM2oi*Di4{Qfu?iDvN+h-c-dzBl_hW5z`p@^ob zSnP>;p2G$94Mg{k#{7(%yo=EdogcjMHx&P4AxoaRiPIe?&#AjkH3Wd)=|?D1LS1?- z=@+f*L2nH4EWTrsf_GLnCy!aFs|heenns2t7oVJi-q2%Bd zS!B!k6vxI>bEJ)?Q%?MgljlJJzMK7U{QZW#8&G;?3o1hU0Pwr~EGfD<;hNk1%j55N z)@(zzoAIQE#%Dp(81F1y0hnF)vF4+EuI>h4@zkYw6fa=LqxP}ME6YH2-{@Tkz{%F* zyteCAY^5+^Wj^Dw3eQQurn?G&9B&@e{a42Km!w@umNK+n6oz5#Udgv2?Ad%--hyJQ zWd4*TVD;h#)?#NsT zKvS@ZS9iXGQqrqwd+-Am`))?`%;A1^bO*vNIH>JLH}v@aV0Q;Qk8Z=apr3=kOE3`K zQ9Xu3KtW~^KfU8$X&6__UH*IHJq&T6 z$patI6=W2!X2rVm9;C=UL5$`2B*X%Dxt zYVAt8q!77R^mcRG+df1er^iRwJ8HIL%aIA`A*#Cmm#NMY06sdh6|I_k1OC8_hnyfPN)AM;E{b{ofJB|_# zg(=7wpVad7<^0`!-x%{!Tt=KKoPxADKB}s{Y^hyOBw9zlbrL>HE@%`@|+Jrq%F<06y z7I*eDCLM_GUmSmm7Y{r~Q^#o{YJ@$t<*a!AcAnk5I-c~RsY}p0H4FnDtG}OD_P#`G zXDgvd2fx|-2Dd!3lwc%uVg1S20O`6d#fIUJ^`vi{zcMaqEB!Dg)gb(Nh#AE#+%f$j zX1TtHA!%%E`3K%D-^v%kEF9D9NP~=)>tAg>?|xwci^m)RyQZcg$(*rhoLkZ_dF*26_eZy(8?=AkMc1(?dQ3<0%XqFzLyzdReqtJ*ugr;avN^gpRA}GV zN!J%q(7`@V#(Ry6=J(r)wVBfoW544+Z`}+O(P|w5BL&b6x({_Rb9@sEr!A&SZ)Wq3 zgVbr+*e5BMzCPKEwudxQ#1XC5VSea2p0k9#B#nyd972JQ=nM&(ygAs5k~`{6@&5zU zNOdmm42QzgND}s92X%owB%g%hl2RYzNO4}|k^YJq*=J#-HKZ8L^nC8#z%U;`?%m%% zQbv|y2uaSDLwwagb^LX|$3}Vko%J<4XD06k!YD80B}rN7XhvXuPkD+Iqm`2asJ_@^ zU@20J7^YoT%fNb6X@0^2X}R5@r%C|pg(OL9rEXD?nxjlHs?b5|78Me# z73E8-bV-*M5fT+dQxobbMi?E4N=P9~g``W1%9mE@@s7Q0OR+EvW0fQg^N)><@W|2_ swSC=iF{(!P@gEzLU~TzQ^T)>i4*=(Hfb%?{?*IS*07*qoM6N<$fzB0v&?2NEE-L$F{$g40-#ZW?!Yr_lrn4nZ1shsFs`V+jyE1R9qF zcXw!*BKO^U*LrJaz4vC#{ODEH-Boq!?6c24``h1F75Y(0<{35_HU_LuQLud?n?oM9{oP;opf3@VUI=fL0MVs;e`DU)BM=qLg|VUanzr=eb)UYS2p`z z`OoLY%)MxGMPx3+=4~m}Rd(%Y#cRJKag^J<&oX=|Sil=KKNPOeZG64Vz~I*iE93x zU(=e5F%Q4Tr+G@D6erQT6a3Z_i}8Ss;-Pqa_Lhs>GhAE>@3eVX&yv_GJML>y*kn@5 zNgr;U=9YX%_#Zu$yLKb9-+tF}ECRu$5D^aoWY+WqJdf`Si?}%LugB;U-)|N!)EBs1 zefazK&$^HC)h%DZ=Ru^xJ@u$XT-Y0*SS!C2mLPFBw(wu8ZnkX+)E{5(7;+vla zY}wgCA?hUQ7bAydWTlilZ^1Y6aMRZ$`bcaqFRIm8AL~z3ax3@l{y{F#2+-_N?3MN` z*S6Zf8+&F5&t`t8iPcUn;`{rLZ?cY%k81SXJZ$S*_s#}2wdeJp&*EGoLd8{QIH{sH zwckx(8)c)@p96x>O06q`KIiAZ4!+M`?I9&d<`t4(>3AH;?2Tp=HS!zSL6rU06rCTK zgP2In*067n-+x7ui=-k&&APvl%)f_e3GJh3=5Fi_xwf_c!$etc>$MIjm>c`U3?FF< z3ZIAVW;dR(_NqCP?NCwY^x#sw*=;|F3ufD63amcW#dDvWRpKtROrE)@6`;<+X-gZ6 z!p(ROt8|Eq=cWtUU8l$qZ{Ku!GrZ)D87vb^vgQncT0r}t(vWj-6JTYE)jJrT{E z)rLYiuANkuo>TG${OAb|8@_1UUyYt$drry0`guo$i;yvaC;6VvSxjzF_(n9YrpDON zpq_)=!35wLaRHC#DQgByn#g6%!zGY>EF#ah4zfEQOmEcBAHc%7zaz>Rfu=rP?k7u> zy)h^o1YtDouO4Wu!QTXUcyU5?FWEOqY!|GoALE}Ds1bjkYqklNF4yJ&?0x8=E{k_FrtM%I1nLv2U`QTE*z zj1H6q-KUk{i zl>gPt{~T#6o}CO~;2pH^zn$c8(4mqVB{aQOhd{QH5X^s;zW2UdI|aoNR$_9-#9~rY zv+)VW)+W||AT!!$CE}7^EDcIOu`a%l#wf~el0g_5LGdR;qLwg~@Qu)a`SY#BINr#x zImJ3wb(~Aay`#e@rCNLaNhAdunH)3zQt6(Ss!uLhMDGchmyX*F1OXeDfbkoCJr-ES zglyQmow9jw#>8V%?JZ+gK>)dq9o7>9$nosCVFBkV--J+W&5x$p{ZP(=yAl} zPc1taS~kSxWNwL*rwLCX9-d>>y(-@e1Rhw)oDiKE!>GT|QcCp!#G|i$zdhye68iGG zU3R)U0tBzws7jNjJvIuwX8}1$(PV8{phBzWr^gcU@IhXIStqJe-!7iYx7lx7N}wti zD#iZDXrk3po4D%krwIq>-&1(5p0-*;k9zv57m2yY(W(6#-DZzW1V!ibkF$J7O`G% z?QTePb9^R&(eF2EzSUcR;OG?{a=wTVb-Aa8mEtkXh5 zen_f@5p5+O3F0lw1(i-bJ;wOXwUwWF+LyPLNW3ucRyUBqh*NuFg0HebGqq_kqO4q! z?qM0!OsN0MX5eCy2BFu(iWpRV0=8v`r&PXB;`Yu<7loZ=zz0*Ys%=-MXq-b+l#8@h z1dr`z4ZLu)%KOd|6gU-WW#v|nxp@|zv@=)K`6%zlg2{{6w4}(_AVQIPiJ4`GBoF(y zQU;;Z>z%-L+KL%^YHOAi7#KRfF)Ay&AIH8t53>amg3`J)m}`>u#PFN#uEBsGsV z8P40;@7n836Odsd&ecQvbkVi7qNwRryIHO6)NfPF5+VsM&r7ZP;}iNLOw9!&^Xpcl zlm=Z=!o$<;9jOYrkxX*?Y5Hue*u`cEKLQD}vTd#3YpZ6P?;Cl43~Q_{!b2yWRjvD| ztP{z(VeQg>c!_RaF}W-f-~jLbaj%g zEzEUq+X>5KWXC&aw8YXsetT(d`)tpkR-FxQ_r!YeZSwNc_YdxNmfe!7_<=Y49EmBM zzjH(TL^;w-`JyOZy{Op`e>$*bZ48e%tKlkv21}YbH}bK==TrTBlipER)n6mK9_J?+ zFGIL;%O_ANHkd^%aoW@4KFh3{sLwMwygUm>klM6KnT9P<4I9OFiY-D3o=@iFxF1c(-cal`K0SZ= zsIEpIe$xFeO4qR)qL!oT4=GKfAR}WY&QOPODX)I~F;squiJ-HVBPrD=HCjtBQ!tO` z6(HBGmMIb0hi*3W#kgqWF1BTY$FuF15@xl3T|*!8kCb}#N0|_sUF!9Eu-~(8#cR)* zojw)lkcYVbs z<-Awkoxyy6pX2n|F%I64>t9L5$yE)R^lUqLje7JKJ1r|W9X#64;c~r6>Wi=rPlg>L zxdb7BsBg1BFtIp&lmc>Mz&iaWUb(*Tq{v^#mNL1;EJM&8kUFI6&}eq)x^lSulJ&up zkMeMY%i1NwhmBlB4UF2(HIpQNJRQqlZ22}@J@syWsanNQo*_PeK(t;+f2xi$^2;B? z+Eqi*@mW+wR|pQ3l>nz%ocJ0@kNe_zSOV?Bw2TX`mp-<#Pz2t4vz~_??y~^ z_Q;5W(g=@_RMpyHF{$FHwZ=A)tQx(#tN2I=!KH_fcy4UaW;$w}gvh*B)?A3V&kdtJJKZQQeA0bs zp;OOorocP|WdoUriiL)uCS0u>2POkA@gF3>Ux^-(w@UDu`{H`Z#O;*?O^a2Xlh&wAiY3 z>=9c*`4(hFO~BaFh*co%1q|uvp~u?IbZSbgV<%|D%-!rb-nixik_oyxA;Pt1hy2IQ3g-E%0-L zg{3spzD}j%-lsRu7_hzGEDq+La|pWhQXCjj!$DPQx>jxj=D^D0y1vlhdw-STPmlV6 zWQ|6pJTH7&UM&)1#m(u6HhC+gPM9D)9#oTp#kZUCVo#$6-Qz8 zq&I0vr&4&R@t++MR4>#^Ih&RV@h1mg9_CTYRlStSi|~@R{cKfi6GZiPa!7!R9&4O) zu=+!2W>w;7?#N%0fvU&-mFvCD+l3~pPAOCD4~)heN3ABZMJ_M+$}3bTS5zce(K7TGU}ZR2+>TC~|F&9nBS( zdA5+EI?uKd6|mVaTiWB&ti0gPQRsyDDX}qE7_7rAUA3w*81**QA_XES@8ro7XN;{M z^z<=9VdMfc!Zo2}^j8+&*IEkRF1`l7jCF(LZ7#DWmR6XaC{>twS^-mX1d^m!6Iol9 zJn*)$l;60P5iiEROY3nG)(l1wQ)9$Y@A_(2Aii3}J*(oh>lx_|F`)@3QZJzdR~Mil z@HC=hc%7@ST>rtLhnP$4)?2ZqOXiqNF41E3(_9%umWLwmef3|xY{{pj0zgN>(>a=@ zTN@k2?i5*JR`q{KFgn?e+syThRtYiMCFa&3*-a%*YqS_V87SdPBA~po*=$Dy$$cBC zbzO@%&)N}T#jwC@xfyliKe(4gN~LA16XZ4g`pmF)o!aJ8g1YxSo{~3)g;EIQRdO0d z{<&D&8z}p&HE8Il#{nbD(sEwZ78m2!q(kDr+DstHZuK47`TwA3W3{fYw*qrCs9ZR$ z$xX@Ox!j9N5xp#1k!EYl{n-;7#~Jl{BPjEU2A728)NEg?;tK2|m&69|#oWOnN4gjG z$95~CHms1)c-paIifb~pJr!?ne$rgex>zp?UPYDe--_d|$2B?IYK_>oW7Ke)r$XiC z+QP%%r;m2Ec2`bIn2@=Q$=SyPR$jV6NTfo(NJSVWgx$3Gc6}m?%-s&G@RT7gmKR7E zqX>*txp-f%ZNbY>aSTM%)Qf?wMoi}-9jryd!ek@2*$U-y>R7*i@GFJTz4AP^z!=o( z)v>9(zy>qHR1HN+iq4rX9^z{2k{oAhLlFA<+R5m?pl z%lvRmm-HlM?I`hTax6eh#bnz=I_ncSc@{wlMAY&W?oD_7zO zdv#q*lB}F~5Q8QT*h!7JMEtT4dXO6yq0FMFBKsn3qgw_lEB!?^EmMQtIUgk$(EcmQ z8L=of@C59fOJk{t5(+Kp+lU!Slg^8Nb<)4ESws*fEh#Bpq4`B=hOnAjchqd0)eB<~ z2stY}TUd`!6M67bM(mh3bSVgRqEXQ$X4st5FJ@G|%xMqsLA(Osb zf|Ha>{LB$wz29>dwe^fVQHtAmnos)y6jFUApt55Vzs}qdt=D0>zOMD|vM}iaPrAD> zi3?E@&*2*wbHHTg8(8LK;?S=;CnIqB)X7@`J`qxez*~cmb85jS6Wg2U!$J+$v^1&c z8(F_EvW`&UIr_&xy{^?xAADuMxl{}_pyRemi-=)VPH@Gzn8GLen@Y+V0|K2+kPE%7 zGbF*1?=|!hT{Y6CG4DG078Mu^D=XldMvyvI<>i|K7)TQ`esJ(NkFe$&V7TK`p6MuT z-7+(1v1}6^0qLZ+~F?dH=U&5sLWLm6eCO)5>rqC2XF@!@7R99;uGPX0VevQJ6Q+OevB z=f{td-d>=X&1pW?b8M}frhieGFeIb1>gTda#%_ zCL|=BPL0!C#HsMupjM-j0#)>8sbxf8or~u3rmW(kWf^>I)D24L;?tnpD)Db28sbKt z{E#eZ5kA*&swAsC9r%szXjJC>t6>@RKA9#fNfvaU;YrtD_6*r>&{&*`X0qPi1^Bj( zh40npW*<$NifbMhNOvAJQ9{w7&wZJ`1_hH+OWreWC)(n}pC3^w>@QZIR{JQxXF}M@ z0ApKA_BZPMs;1W>ev?;osig@XEa-`VR}c6^fy^uq`Xtp z8SQgS54y(WPi^5gW{bCpms5(KDK8|fC*?gAFG-{5eferbUkWFh>yKb^YG>sYav<=cOVtp{!O%iD@jw7hDk*smY80ndLd4 zmEkpo@r$T$osY(=O=P&RYiyKyqh-6ya#BF)4M?^mYbUm-h{&elIyQs4$5p+uum0>tCNO^vfrz<73f9^>A%D zB&HuXuiLKhwP~SjFn3N($$f|lv%^UhYfcoLZA%2REmnQyqi7Knq~bh%0`YVIVYflA zRW^B}aq+)ebyp_$ruO`F=$tp0N#yBI2#x0gF8tr*4{QvfSe0>|KF?dfau!5cgc#L? z_|$RCru|}wtx7O_7J%Zlt&q-Lm~3ay=M+rTawEU55I7MqGNnJR)=UNZ~#ou*3)wDpN2kvPhU$-$6AKv0zS$w`GX3 zC8}UDb>or59X}1;YE_PSbYsR787LdiP^IyPjW4^z#QR*~s{wkum<>%+*vVJ1$|860 zSU{(D125S_Z~N6c31$=lzg)=4CRNk0JR&O*m<0DWtxjMF#f|%jJkfZIKC7A^h&b2Y zFV^+?b0aK*&rXWQTAmjXnhT9-qLo-gn!;jCz%&6&w7F^F2^mU`sE`pWM{r@k(MTtg z=81VKQK#gBum+ofY0mG(QWHavT746$IVkr$&`xiLFhkwIB>P2q%9**+Pl7Rftj39V zmCwiZ*g%<2%-eQJHHKIxwv0H-)s``xf4x%`w0suqnE05lso0ZcE4p{oDY**kh!i%Y zU#SAtRP5K}A|}-$xp'U2$?Mzfz4vDKT+3Aqj$RMqZApV?EU4nhUtOHVcY~Yg9u$$1Y5XJqi+I| zcKVV5-=~$0HMkNN7x(isdDaGdiE9^+y<;joxbupzPy9Uxy=w7TiG3L=zEehMI2^ee zz#bBfE7bHAa+v?yAKt|RgfuHKEL`#eyh{}lD_mpZxBo}evevLvpJ);{wZt?x$4>uZ zgr(FCKw$VroKfh!lo0?oSD{#+KI7*KG>>=oRX{myTZudqs0Zbl$#Bh9!qhxf4Tyb! zvL3oQ4448&v0{?`@h+NVsuTk08{`R?Lpw<+TzaQ8zZ;-jL`Qn#rtFw>tN2Z>G3}cq z{(Xf`Xz_s}*=S}iGwhI`I^~corsTy5aqFRD?gcJ9o&NLgqTUEJB*b6`H9M?*l4I86 zB+j*J;WEP=fwQA|EzXt7fX^Qlf53}iUZOpP`YK3Txv_qyqx-y*8ueRc3O)=KYRGhA_ zXb9mEiFQqb4Th@nA8BGwF|HkQ5@q2H77o?@DvS&6PSd8Njvb}R%_Wtp@u`~NQS6P- zngJ_CuiEgjTZP^FM9|@;^iJVg%`RyTbylb~zJW0+fw?|stOPN$VuEXEY=o`IQiTPC zmsO{*wRabFN?@xb<{{PxStwOr&Gb_%B`Zipsmp)6!^)#L-g%aW(8r1`&>jA9Gl58lA@A1twhMO(m@M z<3~0|;C!4MlVR2=N@zZFne_1mYT7in#jb5LH*sBy0yY->VofLLqO(M#6J*B3nwxgU z09NcSU;S2ISXej@!@yt+UXn4-%Fh-RJ6c@&9>DYEyw-6IaxY72%0B)RB=`nHu{3UJ z{Fvd*cWi*Z2~74iR;Jc#QK251WxQ90iN2>5n)H<#tV1&2UWt!^AwG!y5YwT>?52IM}EK+hJGW+_h$eqE@jHv0bE=6l+ z*JU9m-pTO;AGOLq5TBnraCKi$w$FC6MWamFs)Dt^k_dc&$SLya|01>(Pe=wA85=i` zSh^#Dz_-`X6PN}f;sZC9#5ZR8FLa-c@dcFr&{B;rNRlW0%a&LoCbg*@9so$u!qzn! za^XRxj*1_cWYPpj7DMFzgfvVVcvH6=lnAK2+)k~g(J5nvvh8Jc6y3oc_$iSB*sR@3 zg-G#(LLO~4omGAq-N_XA0m}S=DN)H#+sTA)(&M5O&kBHpF_JDyc||VQFU?r^KT$C3 zO6yB(enw_@xHT(KaJVexASL0I^FYm1+v6toQj>ylYvCVQcF7+InegvZk(FvTmx3 z+jhyMkFLJca^(+dui>3RPg0cUV`K4bf6$niK>ibG@-7bZ4%>$IrfTG_imKCVR_>vb z)BsZL8j6SRFaWdk$a@B9RxcJ|n&GsO?c4M%PL?tWbmedE?0nov{#kcZG(Nn%rXH_J zvAMu^t*lyK+Cvb~eLAE@Z6WHi&`?=Zo%%FI%4ZF7VG$S-!eg3KVtAjRxPdM#^lu*R zWjc_^X7VN7WFz_`}v%7)Snp~)!&Dn#bk`Rgr@2Rz`|2U z5ES9u#jn!GRx9Ksr|ZDk%a!CPKA_68;D6=9Je&w{HX+n1HBY@W+hc0+kE0n)RdK-q zW1r;Jro)!>FE=wo=ZW+dp{)$XIP3}EUiZ#BtfY^%p6KYseIO{_o3$!*BwjN|ynY8= z#pnuLPDo<*e(+id4hAn?oVOb&{F&A0vuYfGLLfM!J^+5*IR5(DdoHiQ@`t02qZ=wB znNTVe`e3kg`UxFhiQgGdbRU+F_c-jAxaNQk{=pqx;&@l-*UMm3dC@32Bs@<|Ps_bI zx>egS&Hv=CoIV@9mbUa1dTVDp2vkj8n=>)JD(&0IUL~6_sWBSRV>;dBAY|@Zr!>=8 zUJBqGa`Rn(^+Z)X-WEM=jcdwflr<0{pbvi;kD2?~-@L#-cJuK&WrD4k(e3h<=+2&C zash>>ApZ$6FLR*gN+2f}@+@TPIHC$3OUio&DS70d*vW>_gBJ%QIEMsjq5j}{oeTK1 zc2%BUnCU1BXg&JK339^JzQtpR%yjFhph|liB#zOhX8#qeNlESLP9{%05d! z#GzcCY&$i@wD|JcB{I6%tY31_bHZGsxAgp=0Gg{M{ErnJn@&sqZw6-h)MiD?>Lx;^WrdNeXq3y~m{7->FZF4qpwD^m<2coXw6ZfGaf`+wcJN)-W5u*9;u zJH57S48_7Xx|}7KqLEB_CxIxsx3tqywvxQ=UaHDq$<*~Fl?lcwFaF8%`LxL|oy}MO zc$XtG_lFvU*7@7XqhbJ@#E-*V4E)Tm@f5;jw=i&WQ1em1x`8=1e=$2x>mjw1r{ue~ zc&zRkxR*Rzp{9=+w!9o!yxs#aQ;?Ub)_1UVCE0U2Y{1IbmopIsF)u<7X-~25hz~d+ z8!@nmVd3-tb|RYiMBxEGH+tDL$ftteM|m*N>g0M35~rBrzL5 z>b>zQ|Iltlm`E^?UmVBf^;%@!zPyMxQ)Ej>mZYz``)Kq;(2g$bF92ogWhys625Vb@ z!H`j>y2_tr8nm#2gyfNl!2e)WDqAo_%esFRMojKabf3sq2&7lHMPH4HHRdxSxFRdY z?r0W+MoblzVuU#E#kb^758b!atM}yZie>-!8?!XyJeOFy!{V$*NtS;@e2A8k?AR1Ai2LANeAWcMP#=QEk;*@3kkrGS11Oe97NWFd-?+-BYuElQ7v||cYY>9YE1!MBj!%#%TV!klEwwYs)l_^z@kNs^6Uw( z-zB`?5m_0+V;r{u@Y`K2y)#7OGvG)QeAH%Hd;g zr5wlK+=Q(BT&WY%+*(kj$P_FdPky=V!suG63SV8Gb1;Rod=!3c4NN50TQ(M6q1eC2 z@(aL<_R!2QJmD3pEjl@IB=nAHxz7J@rll4;fyb%Jgqhfcu0SAJVHuB`=pCc(K<5YU zFqO~U___CyjNba1rdS{m_!fzgbTfQ`I%60!3)_q&qU7g_upY-L1$EtG>MjiN(CjfO zM^$#tC|*KpRVi8xh<2JHj$*teG!YObbe5r+Z%9!3kXJ zvne>5ju(MTF@Al8f=ta^O#oR^QJ(3bbC7@vC?Q8O_i^3|>*JAN&Z8GVAebxmzIsK( z-U`LG8T*XH?z5Ev0Fp%R>7t4EmPxI-kwBruhTW>RC97hUcgFOq@&TuZ#cQ7wA1RvX zDl01^k1!N--K--uIL>Pv?`fspRt!#@RwixU#~?9G(he#Z(cCcpY^A*2HHv}Z-%i7F z?~To7s~r)Ux*-|r8jY_PfeZ4LciIZ!^YcI~!jmw{I`}m@-LM~sSxbDwhBM7JEVqs3i1`5{hAl z67T>O{n%Q2LgHPiyH0*O#EgJk08mD{aU>fL9^%0%!bnH(?X)Aw2nz!SXu-Z%n$c<_ zib(Gc-emm)`lJ*^V>m8Tr1#Jxl!~da4!sjCYbmui zqDU2Up%p*-S5bbvLR|5v+urcd4&Tq*<4+hHt6U(a6@etT%U$ONZDJSRBKV=p;agZ? zIL~;bsB*m9?=PE!E8f4rqf~y{eY}FxrT)&*Eh|X_VEiLiB1H#u)Bxq1tlHs)uN<|r zC_rQ}EjwSxD*U;FXQzz*))bY18XOqKkWV8eKv-}LQ01b-v%EufDPO@f6tCk0z0F)C z-`($6Ht;s0Wy$P2VYpgqDeZAZ`zO4DhXVSf93Vxa$O{dPugVZppv@1d`t=D&=cvTK z_4Pb9PD@BV7zkjd59=rSabC&uGV^7xn;^bS4^gbARIKSDAk_-Vc^?BZst^O2(Tk)J z9tO3mD&!rbizFp=0=s*@{Pw)w(88Q}Uqo9N{G#ZNAB-nFXJ_F}rRc>U4o~+%qW$9| z`nZAy|UT!sVB!bPMUmjCI|{jqKoFn}^LSQBh2fY9fp1av{9 z=o`d9l1LR3{eVUFi*i*e=t?dg^$?i@ehl#nEbME+049IyqUS-{+0TG~WT{^p;Swz% z6^zI?MX{-5sOQ~?`1)fiky0k-#UBJ04D65Gyn!v{Qb;)rN_>j_rxSe`2}wt=qBPN} z!V3%zT6R2J_@D386XOdEn^aj=txS9P4q>n`$5k7Psq4cx=A)M`^pwi9`5os2vJhAK zH1)js*48J55&g7r)F)>rD*}q7YN#PGn3}mTpYx!E)WbWisD(gB2G$#8W?I?rjw20p z86*Vg`%H0M0BOQJn^?gxGvD2n_p(r-F9Cg=+Wfcc+`)=}h~zh{K0SUF{uuB|GNmL~ z!4nlP(Z;uP{;hwrLZ4f?%nH2z{By8&CfG2{~p zSUdN>k-V=tF*>TY_nrqcgG5Nk(yZHq@SmkiAO7cq1NZ#;|5aVGp8uaddr%?PW?E}K zQLeRiSIofB`q33m5@7#&KT*Td&8;qH;O<8ZLaE%5>N;GqGW?NNpR2wB1zVrPUIxQ{ zpiG2;ajp%8GFo48<$wWSt1aEJX0y4thfx$36&2+qxk%k@fRR(n`J}5N_d2p@YLI2@b)UF(P-lz!#Q92hSulzaupK zoL?t~$QFOl-wb2Om{U%Xe%)hPxFFkaNOpOAucgI^@8spY$p~`{Qq4Uy)cAKe5BXv@ z0U)$Bmb90=Q-AA#z2^w`DwEMcI8;A-nkWbt-?x1sKrN~X+- zHv?og-T{v^DsCWV4q6@jW`5yGvgGm~Lt1rQ$)_o)sI$+pmKsf~-gJFv!{WUFePX%@ zZuB;}&1R3DXl{~JA#85Z(|d5?t@jmB4Rc|@Q^yZ~NJY+%60OJz`Dih@@c|TqsnbcW zKH7^ZP_6i&tmzl7_T2PoJsCk}gjD=!&^jbTU3UH1FoWYnHX4sEu6IQPUR)q(p6XzS zl1okJYW1@ahz!TNTy9G8P{C)cu$VTKqozBP*4k^(HCoh^3wfcU*Bkd@qfa0xvy$K7L4 z9PRY@oC{M(N57%uUR7;=z7x$@xU#YS_ep)C1qfIFh*Ckj?J_JhUb6A&4xb>jN)76j zE-snk_{5we-KW~)GYV>zb*nN2*Wi|~QKkr&3Nh+Y)iGNS9)I>Li0sQdAt}A@LB3Vo z^pe}fHb%WlQsue%#ve~MyMIZ}iYg0BM~KZ;L}00$QK>6HyQ{u!b9z_7D5{^sbye6E z(5UnGF@?Fo(d1F?y+O>(8Aj4`JGBYu;E_e|DzCt$3({|4(wa1i6lHE*nUPY5jh0Kp zPh<)gUV^sPQfMuLqTK*z%!thN5fGxIkCM~b{qfNa)V50{8Ad*Na7w`Ois8dz(v2N; zj%1$iV(r&}z#2j(pA1C#jaRm|2`#78<^ zKj$VZ3|bK`o#HE!2H+^V`g|1~zeAXS4Hoyq{56Dg{5>4NCw}z9t-+R zy6ogLD6yE7ioPu;l4=eqI8L5bNFHP@R3;3rFK|!Kwv;;IKt&(b^>ba*=vvAr zer8Mdcu#%wfF!yxDnW8wWd!j`qGtd4{RtW8eYdt6c5Zs ztd3|Km}jygXVTDa{)1kqB;_C*H?>KIQ8IxhEUalU)VK$~Mxxxf!8}l6`I2;bT9qnX zBlWFT?a5(FtdPoe?AO~rr8e3s7IyTvZ{5!)ZzOc5kjVQ?q)X4#4)ct3w{^X*)K6Ck zYC_F3eN@5-?Tkkl#zGDoDf`q+bm(ug&iBxl=X=u88kvCk8ylAM7A3Z8W!MgJor9y{ zdYAW!Vi<@v9KMBHaFFy`kLC^6Q*05*(GNX=koH*`k7vK!45L5}ArqA{A?v_VA$MLG zM*VL>=P;Vjxq&5JviA>PE_i>zF}$U6OeioFxT;R$)pMW?la_JYQup$rn;220jKI## z(ct?cO}u_IX8q$0_9QyZd%UdaY4&)cPjH1%2AjR?>u{--a^LZw{3mMWqCb0#x^)sA z!$|Xo3r=`T>?SUd)M-rA!`Q5Ij3=nT5v#ALsi5$0_eRNQy7b=@=jyCJLoNUX!TNS= z!bQ|5LReBGo+j+=g8b2Z3|DE``(oK(T-QM-@tXij;zys*BkVB*vZ+ti*H%uYmy*ma z{Uim@hqU<-qW;ITSr;EjuvyLy2CW;ujxsRbEdTwk%1Vv50(he(tdDJ^P|Z~e_c19^ z!1Ih>AN_qZnxbA#WzAKD(S)DvuT=S5SH39u2*w44mP&=JPi)=KG&0SM;I)e{vFNnm zeR8&EGQSZ~E^$S3F&k>bn>rezfxC9n#Z5$MWCfx5z5gevmaA-qW;PBPWPo}?pShji zu9j|kCJj@K@x&!xr0%m!Hc`#{9{k*Lm%9-zMqv8xPWRvk=f>3eF%a+T zC5M%GYx#Z^y>!?QTwUTe!rb)*Z}HA2JK{pmobZe{+@b5-MG5x-?NqB0!#)$FqZc|V zT^vU5NB^nNlFc4@@1r+Yf!}0*95z<)lCGpA5acSa@=J>~BeC73J?$a%0_iH$tFA45 zxQ2uucoxX~I8TgP1a`5W<`&mbEYQ!7t$3$^D_=a zOH5EgT$+Q!OHuJRhvmj-vn$Y|j$9^hP^ppr(v^AG*Mh`mKahTz(U*KRi6*f+!oTsWcOn~h%M2xGoBwhT4I9)p*SWifIrI=0@4W&l;KfD2= zvs>8lj1vAZg?v}YA!zr3R7fLou9|4&C@g^?v9K~xIa8kq0()YtberT$N|mX>WgoaL zq^dSDL1Z~TVye|2C#JQ(^%n5{n#9c>o@gMKifsqKEZuAtOqd21%`d#7>*CM4j2n{r zT4VlZzz4plJ2Cv`!fT}WbO(B|o{p8-L6GvbCxnxz<*I73xfE0?R~ccc#;KY#utese0-d3-q3aJY3GCSSXS6{knkm+6%%ru}ybOj|y94f0G)O@U=o*<@7XrF&@bsZ5DmCa+k~Yb0UT z^Iy34$mG@1YuG5t1S<&^liwB;u8Q*=I)}z0SskNbWMDk6*Ow z?clXO2od{#;zF`}|A|d!P4ALeLxv~f`(Clc#KeSB#g@JXY=(As$90yM&a63B_{0^z z)e?5!O=IoXzg{Fkq`tblCI+H!4bpZ}W^c-sEP8t+T47{&_bapWQg@{O?In;Xj-CuX zQP*7Ag7{s{EQs7*A5|bv$?(uyZ8z2@)#@?3h5BBW2GPPh$hhGa5%jS&hwwEbG2`|o z$jP18y`G{q5qZ z_4W@wyWg&=3U4>9aYwheZFtDieYS)uG8+xb8D4s9G(Xr&_g+2Wjut+f9tq$%o8R7^ zh@!|pQ}S6m*&79}!t>Tzp;hE`);(If$^-+$s{CqW?Z)cQABvpDe+MlljaqH|>hrz5 z0xWs4Hc_Epe-pd1xVTv1hu&IQS-I=kOuhYFldJ21AtPyRaSg=igq%WKbr|%Q1r2u6h7GaC1O;8xzuc zhTOBAsVif?VqM7ioY<;;JZsFZExEDno&j4;o*4dRJdAYVxg0+N?0>mc0Stn+%W?i1 zMJ^6-kNIlOJnozM<{7|917;!@=Jz@z^+`2X8lrf8jwo#A@V*r)TzyXAv&)&&lOg2k zusi1dHsZcmr10si{Da3Q`4?W#pSK)OkIt1PKQAjoAgs}sCu(YHH8nM!eVv`1GL$}m z=d^g8?XKd0Lqp!()&;ayx}=9>ysx;f&qvC%Uaz$6YzQ2#AdjmKZ*{6{H(NVSDMA-O z+OQ3vvyUd_WO;jR8trz+Ra{Nro*1h-?vkm(Do)YZQDtkPLt};qkHvO`6cKC z)WY@P!uDMA8OO~cM`ta5yTsW%<48vC0(w_PesOl*&Mmc3zfttj(!kVNtK0D#V2W!u%<-t_de-F!>0qt3tT9hh7GjQ!W%-n68AqE|@k{sD)d zp^xL%V!*fFS%(qh2mRz)^D}|yN2Sb?2q0<+`(B^h`yQqKV$(WtGxSWb7~dJXwVQeO zU<4^S)H`}NUSH?EqVGnpird2z17mDFNdMZ(uKhBiwNW3vD2`L`;04~!WYtpZ)$Y~# zQndYi%hc3V?~ymsSzSUtF|(oWWXFqdbd_x_bVzjn=R$S#W9a6@?Ox+OVd#0{**nAf zX*dROBR)H|6Tp2ecyDPhSjB&YhpYn~H%{=6_)jgs`k#pmUj%D{l@zhBh4zI=6W{4_#J%ihYGSOCLY} zFj;f~m@M1d+W;(92cy)6(uK~()RgDE_K<$)2|si$C3-#c_9D|dMP36~GP;_9r_g;L zeuB||at+_@$+)ShAl*7&Tb=j%7b)6zi_R53t#?WCxD=+7Eev_(p+VtX-^+*8Ic05aUVHVPb+^qs6ZdrZ-e{$G zsj0MyX>)fbwjrmCQ+eIC#>>JS%!~iZeCWRx3V9T4es6BK=05ja1Tmr@G^7sCtI+4Ti9TmABSeJHM zob>D8IJq9(1=&ARD)FA?_cjZXGyX#iGWh6!dS18!@N}@Qf^zfi7|cxs8SZVPldCT|?C( z+c=tFzNC189ko;4GGlVDlXeUVaalN+^T|pREyxDsKo4$?)xW?}Oo^of+Sjqals@N|MQKh+b0iP2V`u zuVv1!=237X7`U>94REgcP+Fts$>uH)SoRk5_qNsTUb!nPN8c>)?ae#vFBJm zQ#NrOH7B!d->>WT|M#v6vUWI&hK}F&Ltu>+y_y;ZQWgFvuj3J!nd#|q5qsYKzui0f zZC(t6`ktSWG5IG3bU^a(U>zu_L}KCPw8VPRq^Db>B2u5f!@EqX2At?S6Pt*H~Ujr73Z|F>ymhl`7gPOEn#5{V4Iy?^w(n@u}8URY?7 zj+I2TZ3r0H)&Mz6?cw=GQNJK0;&O<5TlXS!W$J_L1@RT#-l?q{=xTRvd!&M+%01p5 z8L;y)Ds?E-uIB7;VYdB-e`j$;UZF1^p^+S)oJ`tNuAQ_bg1$Y@l%!wzy%Mg_H%NE7 zI9RAL89yg9`EIV#mpiVycO=vAEcMnvmBKp&x$U|$y{6FDw|Kufa{(PC*BHux5twlI zl*7UBzp_>_u|hEMDG*G2PN&SPSr=MhNAmiYzkxs#V&Ut1vnG0bad_yYp)v9K!Q;~G zOK09UP6)HK}4wnB2Bu0fV6~`1Og-? z0@6DH0z`UC=t+P;ayCA{-}}9D-f!lcZ_b%Hb7tQC2Q%4B_TE`*-Q~LOYu!77iPLqm zZeVC=r~g@8FhgQ)3O!_Kzk<`j){^ICg3q*%dU^1E-qY)dYJ63g?d))1CJQ+E$f+4H z=qJC_0p7?>?H9m!l%5_s5f#OosA6u8Lwc_PmvqMklOKA1Q?0GuOj#iD_&R@$BjjE< zdbf7x@x9*wzzCE!iTHExQT*@wzH?b!J={XX!#}j~Z_5O_ejnQ-k(v`aUO5U5tNjXlSW#hx0g;nONw;Z1D4B9*xUA4bnDcu0wtT_3CWw7<<-Pc|c^9iHddlsbuO z^sCQZ-{awG<6>eFG26%0q&Z;Mp}49<2Wv`CS9IB0k(8S}Mya-X@2%v~c0~ma`-0{l z5@Jrt#$g*fti$2Ii2F3;AQcUF=?z@B>EX%m9~h{rGiYP|Ytq*CyQ!XDU03HBU&9l0 z!&n_nIo(kbQ$Sh@4tlEmdj0mklxPq6!bMmv4!)Dw01tAYc++8+qVyn#UI*GNu-r-P z{;E=f%cw!Uui?X>+5p+_Ui|^>8+kZnt5W{oufQPU$o0ZE5u@``&*+{o)jp}6c)I!G zcyT#M+KRkv34rs5+aHtRPsW;#NLT=q4Kw|5r2j8%c<#DQIVmeE$8En%2lC}O&T)IX zN4je{i$2olyFaFU%TCzWWCE{y+79EjmJauWR>)(MWr|Hrff5W*c6hXz~ zFnRxgh~J@?bhFYCH9b6)RBf&Q?z!VF66A1A2tVL9X<(_Nm-;!Gfc3e52g3%rcZbWj z(jGqx6MAtT=HfBGc_!(8ad0Q9%)1GM}esX4`2?x-|ju@ZgX&$;0~`V&)XxlV|@#PKof8loVgUqUI7n5MQM)oj?RV z2Bj7NUYhd70Yi^OJL5h-yB}IcfJLUE0OElp`fp#kphDGfo(o!uLDkjJl5@FNU= zz_J6KKExzF$Bupd(g2WZg^+4;MTCW4Unc`eH5^tY#VJw5BIQaun38p*4l>~5ge&Ne zT^Yv{{l{C*FQP6iq)c+I;9r#$Jre@*yh(r@U}s}nN7JZJXAch>g}Z>*IN-256Uk$? zRQC*-=YrpJrxZek%Nvoww+1>Bg>pmYID)Gkhfr%6(6~PtGp=~jl~dR(Xl?NRz_#&{ z+o5S6L`rSrcJe53cQ<*`0Ru4w01Aaf(9wl0K004iP%sBLO#*>nddU7cP11F|^DBP5 zS=6$AZ{M5WmO|osp_)0Dv%W8c=OX*ATWoaFg!`CFyAWey{s^}koeAF!yM&M_cY1(R z7-RPC@=qeWkj$u=oMX9lCXLVkYbHKz^|UhXbBx0E@LVJoS(3mru(l=j6%I#X&>bj+%sWtpwjdw1Lgid9&f0=qwLr; zp1VKYg}S&o4fr*h5c`!%<50G4z@Xnv4v({J!`~g!+ZP*&bG?ZYWR2b>5-W@m>uqtI z{rHL`>xdF|(oFA7?t*@-q7kdWY>lCj4`@74J5|?&npVqHB zK=lhq-8PVGkmE#}Y5Vd|;5uoksQ^e@pG0N*m$=+&(B6sf!C&5<^(G+-B;BUFzm@~i z>XW0}-ae;iihA%?39Vq~D^p(O+I&_}J!gVNLdedU%odVQ`+a9+F=7mE(AW#H@usGZsHf!`T9a#LmpONKoS_Xf zV`n%fme3)Ta35+|V10#xKOdPua}}O-h5^|d%j3-_GdSN#_jUl_+)Dh_M4n!Q1)riS zeNST-BM))W3R>#a7V=t!Xn`bF7wi#HR+81l8SVeb-Fs?xv1e%_N{`LFzsMW~BL-%! zfcpA2!04U8OrUF2KU=*#&0K$ihJp9^_hpywKf5d=Bg4ktW$^Y*LpdW5SkC(z?zfog z(b0kNCB->+!IU#iU7Z`46MFF``-hxqi-A#56Mb&j{T@?e`Pw6yH*04Ug!DsXf=ePN zG}j41-UaQF;PT0aat?W;rr^x%6W&JXoH*v}9kYK2mv2%&K0)Lu=fi+t$FS$=x%TKQ zwdMTiYbWWPzMReee5ttuj^-Gxd3f#dCBPlh{a7a;a1dX%FRuR~c>kZeyXpI{ z9ithiRD07-&&!wq>s*DcNX;DxHmuCH{ZKDyD@27W zSr$szOVD)`v+TDl7C*(bjG$(jbLf}`~Ht}Vd)nC zu!y35-;CDVE`%_F5J&-J+VgtvHU6aP5V=5sQFWh7$Y5;Z{N9}%;@bEUi}Uo)A`|2u zJ-=-`R-EPT2WhGfe!p z8kFQ-_Ry-swmER9BNuc%w4I!AHvN66s52K|G`FA zCI2fn+5_o@EWA%&fjUo7+OcY&U{u&YTq_55aBwjFfjz{m2?;PsM-(zfRyGCOHZ?R< zKqL1wNKFPh9u%{)>(_ThLb?xK7dxNnc9=EYIPUEC=FIDb&XkoENBe{S8kt}f!P8E^ zTjH?j5VA%FdiP{t(%);%s>k2zzoPk=^Ahi|i7Cm*j+6qd9$;3!TeGe2-@m79pwSlu_iSLh7{T0SWN!uZ%D}-4-FKO%t&A zWYSc_c!9aORj5kv8kchv#`_J1<=;o>(fK6U%h;5_qngIX$*HNHcctnMTbfHN0$lIwJi0&xXIj$x zRu9Rub?Sna0C1+GlZcpV@Ff$8*>Zt;FO!)#B>_}YP+Yu}7s)|k;{^$^m=y0AOZ9jD zkk98PG!kM=DBI88OS{^R1N`0360#)Es32wJEr9ype9V-g{5_otR9Eq@{!np>yoo3j z%6n~es?PnGlLIemr8wBm2z3!a>tiaMSkTRba~K^ztM9;CA$z%sDW&sC0S_j9+{5y0 z15kYu@QC4VUPzhc?bTDG?_VKPc^><1#+n~mHSK829^;CYUA_tU&Pbd>?E(#}6zZ|k zdGTnUPAFEaJBzk*Wv%6;s_TWFKn0{~h5f9c?N=M~3dfYdHJd;nZ z799%ENsEZd=AwYg#&1ZYgSTZ^u!T+2vb*PZ0fQ4yzSSaX5>5dB+kBgHJmLST=jUeQ zFu#*tW zx`v`#Mu9l!!jz=?Z+y4(+&fAZ8j#@Z3j`fKBM&WG^iyx^4WME_+f5ZA_0#FYNjRQm zLX}&+4>882D{<~3Hud9JZl`%4)>G{AHc4dvAvU#zJ^|?EhVsP13pd^zMVU4Qx4;#j z%6an%kHJkwaaEyC8)x4+b82M66OgE2Qf}8-dO}ms5((+jRbfm*osGcXx@%rbem@+y z2??ghHC1k6R|q5T7W&b4 z5xVs{O@&&*xp6q_;@?!fgg-b~Q`QXWMX7vuj2tO5N5OAa zZ!N^W554Di*q0$Ns}|PW+*~Bf1quoB_ut2l*Ni*+VAbZ;0p^9chG}SM&{W1*Q* zBe)2et4hqWK46IIMVe_*b~b+M-RA|JtOU7-E=L`e9Qt~ao_n`chITwqr|=Py1n~7x z=(zb;6zxs$lWW8cBPl{(0(%Qd-vnZYw!?Z5Qjhkx3JVL7U#nJrS0%wkK!@K0U5wA4 z4m2MIZSa&+U|}g&0?l_xY$;*>TLfE*#@L8e$I3h8exJ#KR7mhTL9UJ~ za4bnvet*4T!|r~%Rn;C)m!Sc_g}1u8di!vv&&}C6OFsA@oafNO``bYZG{|=8e8WRc z)26-5{K?Ru+_|<1G=xftMGA)JViEPOBewMZ^KFA^ZX2|cuof|F&Di9Ut1M710rLB% zjXog4Z`KbLXnuRh$;-31xpI8}sVeJs`R&AncTe*+LdXqnsQpD?{BnT>6c-mq28wKO zEh2aALCF>WA}Fi=Iz>vkfv2HnqLZ1Myv27MXWmTB09|`qT3W=Kc0Uz4&b+SE5@cj% zmf!xh9`f#6;^DJ35BE@mZQtG)##Q!Et)uq!IOV(UCLt}hk);g9>y*Yu_12BcfHl17 zYdRW4cs%6vzy+)vkIjXP(F(l4g~OhF(Gq;T`TZ2x#)5C{wg(-QPr-n7K# zJ~bt!WY7l?(mv{A2yUlH+VC z%7nN$BsESzun@BjwA$ zAnEBF8@&ClqsRByRyVG=oMY~e5M5nYPSAEoDhXGpY4|We_6cB_QlVQDonN9<$gSbZ zp(}f+H1IU@@49dmY8yt(lrwo9_vqnft7uyAdbM6|^#pOC)Num(W|ZL!p_qKIW@hGf zH#^(gZP==KT+A&;+A+Z#gIOPg4=d*zdv5mM3^en_-*LMfG*wLAYq>xNZ|08DBVPzP zhBK33BcuGb0C*rH`W*1_aDCi9cWQ;#qW!hYG5JGP{L{gj#``Dj4TZs7VNhzjm(Orp zo09$!^yTQv@PiFCR@I@XrF*6r`p?|pnE-JR2#4qf28d1 z6LUo>@bI({9cpmOg?7yXxcxui=HIuOB?G09H@M*0OS#g1n_t?q_4V}jf=2_-Vg8)= zXVEpDx<*B;K`V0NQSI=B?|B7qk%)O0W0Ef!2pgf~3>USH6BO*&4wxiWKUHTNiWfE@ z*ZSRXaGQT)SnD$2O}Vu2Sawl>gv*xpBsIZB*49XguLBq0E^2+KV7SPXDJe2eavKa6 z@m(*+!tppX&g@Bn1#LLvD37u(N|9#t#dhgT*4bjWd#_O3PtbigZG!>f`?c7wr5&-x z%^zh@6msbF-;sm^@NxA93;sH!4e$X#q@njgN*nuX)rY?BKfsA)Gv?O& ztgPwlV_$41a;kw0kXtIsF$kUGR^s19Ujyn5wKUNYH*_$CB!$|F12{0jm~DVNi+GyX zU=DZL{Lisw&+dOE)?7G?w>T#YDcb-~VYtyrwAmTa#6uma>HSvhc7SHzIFX1+$T`dk zPJA=OT&9l>a(QMm*Tv32v)bIteW>{}?PPd(xVoj<;qfbxGXki{zih5sBtuK_svp<>Nr(yW|W7rmVV#hX|n7E8+5 zLv@lV2^*f11{BOlXy{9J+f7f3B&Gt1zmYI$aIj4{0zG`aXB)_tNttwMPvAiZ5KGBN zhJcaE`v&ZugV{ZsKgA<|e1E8{4}MG;2s2uOyHh}z>5;-Uh8!Ju_Q@fts`|25wH_yqVega{Ou2MEj+TF^}Z?7=TY*0evIy3wE_do)m z%soDpaN*&nPzO`dbrv;huVLcfN3$%Yw6Ufw6~6c`w>rF*_sno`ZW^LwFZ%~z2b=W> z^8-BsgTnugD5IRQK8(Tm0;Ox~_V}qrNAtJ!I!GiE$iSZF0YQjpZPpI{w-&$+QVn7p z8v>)>O&XJ#^A3oY=$Xfji)3v=TZWCMQIB7nC&)oluq5A$Tw`wL%9P&iPcCXhz z!3ta;_ilJ$al3qe_uF9ScL4-&M$1h~uu#FesU9yWSPw%G(pvLmk^aCF=&!d!%8v1; zaMrs{*P^G+%g!ze^@Wtl9`s+cMXPA2(XgSqMnCH@aBH!^<-EwdwBX<0!wQrWlz0;# z*!R{E&cpUS!LPIQU2*yE z_~LRpi%2;@uO>o3tL0WZ?fSd{%+ZxP3rqR?V&Zx%eFAlGD_9KE$o1WwKJhRPYL1i? zoI-m#{f;#irA*pZ$lJo!3P!R;l#UXR*AxT)`mQ+G)Jd(l<1rWllPCAe!bOO;R_8mS zT)Gyz6h6|Cvg9sQtlvE32bNMD1}I}o;2hOtTWEXgz=_|!eex8%2Kx!wh(8{2Qw&l8 zFEl`?UJdVh*CZ$d8~qqgtpf88*5@23DW_v2;vrIeH_A-P1e)jJ>LkL`*CE$Gxt5-d6B2((AalL^Rc_{`S6B_V;T?7{Ql|9Tm(AsG`X=?p$uU3 z6XXxR5pmGQ?M{37o%HzI3_w;U2RSw1#Gh2}zq1Hrn2tv~3Do6;`{^%)*}x!M;KA_j z1bJIx7y7VE47Fz^nJMSF_#r9_D1^+m#sX(%0ZEydZ$9vb3%aqPi8wtT00D>vuc(>t z{a~N=n`64@KNlwzvY;Qba9sF3R$(_um51slDYV*BV)UP2;kO(jB zz?=qFADYl)1ODqkmO9ba)`lX%puxvq1)k!SE^xd|Zf^ejPr5)ySo`VELB_@0WMCroE+cePm~Io zlTw)14<+i$rrZF&0Xv4h#j$U=`qTfc53Iedt!<`H1kD?NjJUo_`U6#PU*y@bdnU)= z?LX%F&l@v-n^#mA6V}$SMIO#Qz>@>Z47d^Y7r1s}YAU-{XqaQy+TlKl`&p zr}&t@3j+?FVnCbF-I1hP*Pws<25-bmgL-$uAa)#4?Pdyy<1yx;M?~NcWv~#)eoO94 zN5|*nMlEU2JxE`zsG9fU{gjiD)#YkG&B`SQ%5&05^358!)M!#1UvVUxOI&R> zUv!&NU);Au6H)eP1&^JY2iGXfq9SnX{DLKcS=AnXQ_a4<-f^{cS-p;j*n6+jn8V^< z-vv)emSqGGi+X~MxHPz2xgwi&@(bIQ*vzfk6e$zs5lG023!C4=N zrlwMRVI#5#jKYU!^bNf20UNUJ+m=KxS_di%b=b5KyaAw-0}=ua#C4{YWtHcLe6muH z)tT3x;v9Uss4%EifpUx=4gO+)i`tK?1nj9yKr zr#GY9K3$5wXE?!C6PKaVb{`uw*pPWY)`&NcF)En@BvXDD2@x8}Jh;VMzfg|fdtKT& zy>eNXI+v%IZSRDG~4Yud;cXvg$T7-aR@0DJ%CXr|G70<9P!hFWmstGMb?WL!hG}P!ke~ z+MG&3xLpq>XusZ{`ca|VA`xT7Q50pFQFKi_?&C|mQPS_u0DV{6BV&+(Kh^j^^Dz8b zLMxBHE|Hd=?!OLfUBF;uwaZ2ol#{I8VP5PCYJI)V($HQqoRVBdJQcvNLC4>U6^?fCgpe+X!l-x>61ouhE_#pqiY8e z)BCBXHyYBWICQIe*~=LF?8Mi_>H_fTuKN$>MsB|IKG&TCUO?T{4_q%OI1f{wv;y? zT+)$V=F^m4?`Lsb|Eys;ez-~A>-q8uZg?#-N{F}fXKhAK1`K8vz9=I0pi+L!VN8E#qF$6s z-xxWs@N~+#qbNMje`M0G!mcL0OCHW|B(EP_uD)_BGfjF;z_J899bcQL1AWv(_=25U1^$Tq+)E>3H zc+g|)U+`J#gH^L2TdaS}FZLMD_fPX2uD;K&f5`}8`ysS{3RLHDgE#_46M0a;>%D?$ z6zI_e0A<*ieW@i-{y#1!Up+42_|SAr+*7#E&pXPr`mS_2HZ~S{|NcGGiAKlg7{!-o z%54BkWL-hH?z0HSEFXOG46#1~SZ2%#4 zknUESl2F(ASKbcpK0!f2{Bx=0frQdni7)em>~?k!uf>dr7&@4|sndP4RZ^RbXwa+t zn<5l&@U-PYgO1V_U>4cEznMVCKHf#bKf*FIfuk_O zt%rn~^rtO$`m?vHrNOX>4C&C2?t|f1cZ=Kl>h;7QBn>L4OYep@_&=1>hTC7ZP4mqE z*7EXV*^pHXh48dBWcZ`W)T+JPpNd9u4j_% zEe#NUl&A%J^@!O){%VF^kIU%x{me%jbN%r6$oiq%_z5ur3|I&weKft7*>>pBjNUlx z-=DHGuS2~Y3TEcrMYZQtOU~;ytq_Js>+Cbr`tyj5Ot%4LkteWE`9XBo1rPZxn9LcU z1QDgOB1dLsW-4As^QaqiFn-#_eo7w8q$7{`e^PwEV3yPkj(H;-XN-xQ>>(?d|d&Dx+GsVnX08joc0C||w ze-JBkS&02x@++T5`qxHz^Lx^0v#I6A1gEvc^z`&DRUg;38P*qbC%<-{hB&*Kd_pd& zOz?bgU;Oye`&wDTgz6kdvc%@WgBnLuu4^vv2)`O#&e%4k_E}Y3kXuOQ-=j=e`v>nM zdLYGWeLlAA5~d15w#lZ0WdhIuz{)fI{iU_xj+brOV1v{FYLr9lwTp&#dESo>(zSc$k%M zQR2Cn2^&niUeEI^ChJnr{@|mE1?+eir{a)!PyXk{h--|WDWbSX2cbu1i=hYjNa_Hv zmBqwxKNG#5*|62GyRsE~T3u%@I(p^ZGP0=0+~Ai@%>q=qv)-n9^-|)tT-&G4CY7~r z>B5e8GS{<{s49+Q!{#OUgeb@(6YpzUmpgj&3!D5Ak2%!h;}nuRYxA+H1A>NW6R@^t zClr1ITkR^c4fs}I!hWyRh0iNfl^ zcl8!vhP3bZFw-i$-@V)_Sj{8FqC!kM@38k~xPs`sh5= zypiD@TyDY*5qX%M$!D6TQt-()NV?+_M9uMprrJ=vaUWdoDOfxJ%$Hz4Ez%byzyG_45&Ltv)ZdMY!8HRc0Ae+GbNg)Ky~y=KRfjOhe-8cT_jFiE*IA zZ5-_fh`L-XPb?AAhXCx9P?4ig{@Za|N{kAH+4Dh?Cu>}5L}bLUpA~OTKaeM?@#Zh> zwzh8TCsS{ZAELDPogMxAs`Hm8oPGW-rHw=nrmY)()u|cX$pF&H{F!;HC6fj=lq1ae zjZ!H)8@%N3Ybs+&ej$7<^J`?;cdlxe9fvZ0WX-UR zxll>7aL0N>nXww~PupgV%-tb9cC6&fSsFo9*}r7IE@0P-9H&ERM+qS6-s(gfS(JxL zE!^Brc{n8eS*clk`@PlHujcQUc;o(o_SDQ1bGPN?FbKKH9yg|$ zdr&W+nZ8eanx`eq7Ncl=%MFsz1ht9Vw?`ipfJjx5I5O%KJ+oJ7gc{P!@Qk(|+DIU? zqr0d3MSMcBs_$>Wg)7+H(W$8;{w(dp>uvv6Jyl;H~)FxmKYn;}r%%|4^%_Uat20lHA4y(Utl*{^|90oyHu$ag za9!He_?O*-2Y1x(KtF&>YI}VC8C~OyEfaoAHy)n_$4$g%qFyG%3}~!);LV%a6jl<9hG>5r!Z+ z){h&1N`LN{iAbL4>1s)=4lekWfl0~O6R-Jpr?j+IvcHMzGrXfTee;Jsm3N9%1|;Gd|H5>i3f&s%o`)W?0Bmu<{z97UZn$20`km+T zaW7s7l!vB`a_UjXa<7*OD-Xjud#1a)=d~pygIpa{E(TBghvj?ondx@j;%msd^pZpK zfzDA!)lY@TH<76tV5i60`_FXm2q|VgXUf(zXdUtvu@8)DG^}2S?cANKqU#YdfYxj{ zc9^Ind@I!>&YcAAdTq*iu++7$x2Gtj>gTT4Q!kN`%8$mvAHbv26U7U5ZZN-+ycG|H zQ6ICOgk%DzqK5M1CrIpF5m7D|KMNV(!rG8MsZ`U?m|+F0fB?aVh59MwD+;fO&0Faa zr(F{f@nuHL*;|q>lI0oL@)V+YW__>Uh4XRuU(0McJ$mJoEv?s<$2$o!pnDa-Mlp%yoy|_-kE8{=EP$1#-TGW2E|WP zqM=7gDD%^2=;@m_xERlXb{>EpkUT-?&5WR(K)F~bG~y|5kt2uVGXNsJe>)KR_z*<% zC11hlQxCz=;Lvdcv3E=@c+h~{mgg!+)Px-*7eUJ8WCf-x+=OhCv%;}T~GPz)O96F_M=xbS_inro-m$R5P?gom@XyFX7dJg$EHBqBy~9)L7wXh1)8-2}z|-fCJx72slO98?E{4Hyj6ha?ovM_6)1 zB;o`o4Y75>va|<0*ib@DNU=RoWTWQHMVi(7EwqW$G_+s1$0ryzsAH%t5w7og8e$SG z6>uPd(VJ29arFq|40S4OsZLLSe)1Jv;9G(scKP#^_bk{PJg}PgEK);hT@Agfg!1c` z_@MpG>9YDzCDrk>BG@`l%fMWyd`U_Vv!mFuSH-hV8Q?h&DWAO8^F&jVd=Rkp!#qU) zwzH`=lgbl?le{M`CVsp#)vV+_+&6szMw5f>zK2qOS0;-=T*?OQ?gx!ki;z;I(Cc zeGU7fB6#7fdC1ZPAeA{4_Qo;eXE{J&1?qtZoCGi5XWUur%(lw2xEcX0^%}tl?=_rw z-0Z5+3~BYCO$p_2mA6&viTnXIIF|~DP`L}VlC^#yCZ{AAc~RB%%$aW<2-f=1~wa^ne1F`t`z-bmcwExMEU z=G}+i)L@E&g3lCeq?2LI$7!I(`h<+(U9cr$$h>xV??Wxons1>N<|V_58?c*X?ro}! z4Vi8&{FZ&qlzC1SGqh8K-IjsISF5^)A}j$dKotHHkBk??AeJXidra*v$X@w4}T{UQt-JuQ7q7ZSMb^Zd_T7zh#Q4-Dg0h zha1Q0Nl8jF7QEioO50zLc*)2SamQ}p@~vDk6LdX1u`kxKwNmk7jh2KpsFs#Ih(PK| zsMi!Xtc|Bt(^ksTzEZ|e5R1y%7b7u>YI#oIlePMn?{|k$e-Su+3ASU|HFI4#QVd!T znY^lB={i1oA>q=56Y+tpeg$E)!(^`{xGf==+96x9k}<>e1G<;aKbJ_&Qu)yFDL11d z+v!M>s=;1heatbvB%a(qW|5GPS8l5bD*IEiva%ZwbCSP4Xg9^1JeC6GILc-R4(VZS zl$A8>>_Qw4Oq^YX+QEh22kZjZwMTFb1yuu8Ki|nDZ@2r_j)u4qM=Ok_An3BJF|k(N zA>jkq4FuaC zeTn+F7COS^-^(wPI6m5pM;YZj58bBCs+~2?RXL z({dBM&Ugm3n+Cmdik=b>aI*OcU|a??Wx$km6w1M6R_}UX&!&KVeN-rFTU9=HLxHQH zYJM!rsfpbbqg^xFFi?t!ffU-?tC}+u6m(S88KF&Yb8vETYhS(?Jg~63w@0kWf~@4Bo$ex2FpJ#flG`Z{C8$^Dv* zN5fNBLI@O`7~6S*xmg^a0Bhpp;qV@Cyi$$5&Hw3MBG4o0sfY^~PwpV^R@K0_x~Kb0I(;8~y*#YlInW1P6~%78eh|qp7ONt{{@*qoQn<_=^XT%PS>YJ%4{P?JpHe z`x)`7YC5dyeJM&cADK@ zde)})GTXP(L;aW%)a;Q8KD6x?kWu0J?=BbUU<>J)lLu93N=j%-m|JGAcdxZ2ZTsqZx3uE}B3(wA3 z+UVK4V&TpmlWEwX*{BX$`*QH)+nuiz%e8wY6VJ*k(uW3}1g2Y$XTJ2nrtGxqU}MT^ zExSr`?e)igkGkay28pT<{4x{~GBZ+uu<@W5=#v03iO!L^sQbfiYqYboB1m4W$nvw^ zH>28V@RiFovbUwy=Zo#oNAGEsd!dKDIBM6p+jDYN4g{Fq%Z%QqPfj&I(HFnK{MV1L zC;HzHSk6VBWKAV%QpYH`Mn88)|8emipEY(au9rlweNM3C11Yz-0sQ3rp5KD(>ti0Q zfR}gSN=;$YPvpg~#l`&gi}%yJC%c^|y5c}0y1j^|U1OEvybQyd`}VFSP8B1_CgIxs ziP$UC;3k-!cjrX?O6ebd}*-mc3ivD6*W-sNo8t}Z6 z@NsL@L8B>D6p}1u+~I!_D0sA{l%`^@pMmiuJKNbwR+QZ;7~uDJDeAA}%8)8}kmd*L zX>7bM%TzPwkzn%=Yo>C?!1!(g80`3Fr_%MNG8y8$^u{TyxTHhwzMJ^vGU-0h%IL$KOJVFV-<|zaR%c=&h=FBxH!Na4hrM~%aB}ALjmzR7K4SbJXf#ZmRi?F-$J-7rc#2T#y^9*u%1hMF}^ zgdH#euz9hpZEP|2VLsrTRTN%!CZeZ#u5^exWN>H#XiBxOMZ~6hd>bRYU~=Cu#pf%C zgNv)|u>$b29)5O?%Y4=Eca7DHqw#?2ntOJy!^Y}a>GI0^a)rpL>h)jyHwJlJv>No% z<`H^pqsFkmM>EOK${XI2%IZ>Ni%0!~RFjUYIs!+DgThPRM}<1iv)W7B|1y5jN&Hxn zt7AG*?Gxz`s^HbrrFf1{{vH?fPz_BiA97~fC45Ho z1q}bN#G16*^}_9130#kQIFLR^L^;NMw&Gy@sCDD&d6gSCDCGAbQdq%8J+v4h+o*>( zJDd(6Z7YdiV0&?+a2QW4hKa44ho!}bj0*+K|%viNBQ*Yn&(QQY5;<%(+k`-Lt^(dO9)oM2A zg4ZCNOH0z%k_46y+|!J-!#4~^b9H%97#fKYF8BPFH&ooG(B)Ian&)7l6ACuK*84)B z8B>2Vs+~J-_bTRTwWwXQc#PHMpMqyj+T9Rr{_?pfXzwVJHj{9D|95&0Ih#3ncV?YN z)gg1qjhPBZDEugT_u_#~#?7I#>~S9*0c!Ex!sw~uXFSyYQ|8oIv>zbxifOf?e>#Hf z0?J3bUia0`KN(Vskbso(WHfG@^h3H?}MK;fQofOO`wwDR74oF@ZKt{y6 z!c#FhvF10DrCQ%p;hVM%)05$oN~;{NG4A(Ld?fXCb>gYdj(H)^{&=;WHEig4{q_6C zy|pWZA3(dS79m_I@v}aCW^Fu-+rsASV>d*4TH3uyC$^lx+koqdkIH4xXd)P(h+{>j3-?4J{1EL zZ=D4=M!}o?dC^ibGP6N#o|!%}pqVt-^@_!v{p0-@3=9mK!3RmJfuqO|na$skDu4gH za4(!U@6EOID$-XE`zi7GHKuEJ{o>*KL0j{G@9fQ3u z;1O^TWV@i{<)s2s^0MPEd>%9#3Wi_iWA8;(y- zall}>Q=*Evoi?1Rm0#79Lret*efV$St}fG@U@0*c>$(Nu$K)t)h@MmLaJr)UOWi`) zw@#7vGp2VcxU{&(6J#}Y-nHywwk)dB(5Q2zvAE?LUGP^q?)#8Pm$m2qE^M+(k1BdJ zCgF(>EI2XQcVDOUc<2YT=(Hfc49l9IQ7*Yj*vXBhcpyVpWC&hCKg7WPd{1s%_=P$m zJ?MK}P`b(vqG^K2=tC?*@A5NJx}Cw(uqWRcPoK)O5WjHtD(eIe!+v&A5pdmp=H_lU z&Bc4Tb)H6CydQgFi1D-4nNv#Am7`!Y>gKKBjRx9YE_K|TdW1mP+72h$()|a^rJzs_ zd(C@4i9;s0GPPp`nJNUTOHEH-)r{9o?OQQgShTUT^SHyoDK91QHA;S?@k_6cqs%9i zu}miJVGYAhMuy4@O_su<-HZfLr*p7H#3{gE{|1PpdSdBaW8+D-oeB;6ftxgjm5aI~ zqIC~dT!!q@Jb7bUgfX|%4vb_IMnqn#m%@SkH(jI#DRS?kW)!4wD1*a|9P!f5PE|=t z%|KVd&ELE7d3J0XM~0~8pv%%o5F;Y%{Svo3M~fO#w6wO)Yxp4$GcWhiCoA{rpm&?K zFhWpV7Im&G!oSwxOpnzs@sqqt;s(p-rq&ryM=acuA?r1u#2nfxnl^=N0=6VeUuQlO z-pEBq1q2%j%Z)#aM0|Hr-cbXOZu%5!e7J4LLbI@|1Iu8BjT^B!eM=A0y8#jF6!iKL zj@qsX?DX;fMp;DlD`}3MrSGv2@1Nod5NRM`X&Wq}hr~j3r!cLTCv*uxlQx!M&anF> z91)}RDE>nWL_se-Ch5pn-vlFwcZr8`lN~ zc7~Q@5tZMi{4H5Jy1z=eX`ZRGByA>+eOwI+&;4RCdLnsR%T?{%l=0#ay|+`L zTQK&aKKt02g1q%-Gq26{_1&Z=FNr^Ee)HFD13{9PHQKa^85wzH2>uRY}}}?bKq#W!GJA^iH($M&O|Us4hf~jF+NfY2-pN zQzIi_hDSNxXuM(q2%!cu0GmbuAsFZz84TK`k`s<5`xJRQchcX3Xr1O}CPoZiTr563 z=X|-&o(Amui-GXf_p)I>I;rcN2}gV5xrfmS+;U^&?$CX)(EUkIv7ntyjN9bd$QD4N z%^7M9D6{Dr)amneyMU%w$C9aLVE3E=XupHfmqR%3`#zA=v_HE2iMrkiC{P5w@MFys z-pGXO>kJvK7B@D#-!tG2vFM|9FtmwC!bVuW8ZBil1t_L3`PKuag$M+BIq_DpMsCO^ zew>~=z`?@e_jl@1-fIJeZB9;oU~31#nM46vfN}yG_(lf@0VNl}(!90(Spqy&CD3Hr zDWk|S18`VKJr3qbfF=7}bcglqUyLolo}kv_A`?f%%X8XCfzKbNW&tm2Xk;1el9v?% zXws)6hbBMbmkpHh-Ox;f1S^Svq;lia*pj-GvZz!ImRQl} zx<-Dn{wW}H#eaw>en`9r_W(6lOzKez%++}1TIs5KCZ#sO3t*tGpV5p?svkzLPjC7PptJO9W(6mw8YgtU0l?Ep4V%Qv8o6zr>6H* zGF}>~-P9X-_muS*omyAd$}%fHO#EQGp2x$`DeM&e?*0vJr^EkDAL*)ar3WI)?*_t5dG7o%b9j3N)I;N^ljZCH%ZwPID<1^_(;ydr^TIhHg=H{cQA$oWpeI<7w~*m0CDvHzvWrQE z3cbM8o{1ja(8(?$o)!Uk7tUzo^fjcUId$e9xUcq`yKaf7Zm@ho%d;5Xd@(aY+`gx< z|NfbX`}Zn}iuu#}bkl59dHzRnXBy8|`}KRhJJPDEq9|H5)T~t$MO*XOB8i!*3KCPz zrTFV)rqmczioR&aS|LYD4)2kY zW5#lkpq^{-a^s|P=sKkqeWM1~SllEI#s~q^uy6()`-dPD^S|rl*bSEsa#!z!k~Pex za^_hruq<;#4tLdSL-7Wjqknj)gwid=0>AFL9I?bo|EeQ5+ACY8>ehGfwY3_JZ!^2F zSDm8{wua>QJ-vs26Hvxf6Uu)~R6Vtek@YsoKjxWn^Wt`m!HdFbYU~MqB-ny&C9|8F0`A;@4x|nRD_kfqT80dn3Crc zw-PGJyX>&s#m7hD)9h?Pd&kkE0IT!D73-z@AeKe4C+>(ULL%$OckjVq0R02AjlUzc z4j*PzrqT?DWOus!Q9w(PX!3)+n>nVq`YNt-%Vnu!?o@ne8F5Z3 zy~v-?W&sbCdv>s&wy{zKGK$TH2Re2#K{(43ElO)@DUkatx!B*|Iaw3By8~*5eaQ;p z6orSMwZgTQrb{8gLgMmyQM5PrfW<%R)?;w3nt(t;NQw3FD3f4hD_pv2;H|(#-bY^Z zXJs*nb8W7n*s9OuuyF&L+*J>6BU&13szr%?a+Un|qug*Nx~wwGY;EVM)$HMdmr+-0 zrGt7gkN{4!80yO4w*Ckg)viLX-~FZHbw{e}r1Mz4m6B+6HaxT3TQZ}=0h7$8LF*?@ z`Vg=;CC`flSH+BRcRALj8uuSWR-n)xqy|0|lq}rQA#NN3h!XS0toQ9H`|tSoMw$uD4Y0;$pc^eR@5IJxbyDUB9Hft! zt$w|k-r)&(A7e%cQr_AZ^)cL-=sE3y+?5m>sp-$KDP%I^eTk>=cIlr%eQtIk&*DpU ziTcSH03WI;eM*KR&PgmCuloY9ff8sCzI!lp>e(>Ndu)uqTZDA;(CTziMJQIy zq?X(S;`0Ze_Ra!k_EMMMsTXJO8WGr0nU}8g$N|GKGcq>7m;;3SWX}PQ%mk8djeF4A z(TL#<^=*E>rP(n4I(uYs1aof8NS_JZc^hk(rv?j_9Oe#H+$fKa*hm&uu*>S7r7M%r zz!ZSFeJL%|2B4b(h{kEwRBpv&AT!kcGQVi0wG~LB+6>N0OFS))9e{s=;k@JH;=p`X z_(9Y6KWy3jsSyxFPwwi-oM*YvkuBE*>_cjmdGs-EaNmzJ>q@H`Vk|NpCwRRVf6d{5 zumw58`sErJn?z64oarfL7cp?T_36AeIZw?*$v=oDP>|?T%3KvNWS$g&|8)V-rcL7# zP(d8F9Wg%Gu73eJHSsq|xBGwZ*tG@@!18WS>TT^~&La5CPHE(!S;lU6e`$8^yv?(m z^{e7}!=-9y?ph6090SLEaN9cZh4=Kg{NneG-da*3Gp9&A@lob=A`mmTZdb_~LN1tE z{#;2;IbF1j9I@b&es|D&ck;=OKIrhBYe+7|2QgZc-l-Vb{-i}+9d;LRwXyWe81fh< zomc=>_Bw8_jBu|@tl;}hw4S=8ZzQ6nm7BiFC$zZz-9xUqrveP9A%bt82&fl37wsCm z;09az9X0zaMi*X!4&l+yqaxy=EM(0Jl0B)|`X2=5G6_vFH#2d_5lbEn{0D)_JnbUl zM*2_HXv%!gjx}Zo=I6G#5Eq-NgyyQrO0uc?i8TJ=y||LhFg%#P_8}C}_v2(}nZn5w zpYhE%IN$q&|H(-TSjQ4%$=76p*Fam8;zl^ zSLV)FN?X8VAX_0&V@yh$T%w2~zEffsf)2skWX?=aCOYA)WicoG1>CG#YSi);a0S}MHV#ud_ zW*8pd(mM|N1|~4c^M^^s??Wy1Keyy60Ou^OJy`xwyjLPaLc!n}aRU_+$iBA`+Mcs8nNWtVzryD3T&$#uBSHprOJ1;cdN zZDgA4zNfKd@Ml{`wZH9UW){uqRh9;oB>p!I(Ku(TQg9o^1Wsw6M-0YxP}ZHe%}^C% zynbtG)o^X>h|d6o`h0eMGjG6*N~8cZqs9Z?xE@>$sITRW>+@-a!6z@XcpCtI{7)Pk z`=vW4cgL^+k$R%%DfigkGjE=P=)<fiUxqute~;y52FAdN7b&@j9k8bhT#R(_UK&&%mf0U zxGm5nmDhoA*`)pAOpq_hyW~7WCF7q&`Y*fxv#j)=I*_dwSZ<(>Kty@TFq5HM=O_$&0hEL#^1B1o=0C{U7QERQORjn7bO$fbXypv=@HU-|+i6hOa8Xo`yig za8RKT;!&ZNayR=CJF5-Az=NdrG#&nz*O=xVfU>6j5CO6^8hPs}m^o(vi?a04SxbZh zH;sN_RKy%&_R&`g_Kz25Df)A6ZYMH8N>0_(inYJQE{>Aq0;J~N`RIYd>2R^R`iFl~ zYE={SC@OJ(!9dt*m!{9^_{7rip`nyA=h1I}fX^2umoLtnDMUyW3mCP*hwq~{Up6$D zB5qx*daDWZf)-il73Up^-4Vq@PwnBaYg}=*Kw@wFMZDcvI=)Z|$kjUrO%jX$cRmS7 zJw*;Y0Z9Hpflp$)lao2<7z6C*b{XJo0#d}G?dp!(xw-$QxX&-i+79>{Cmn+?9YjQE z?4o#ZfPz=s__R#Na?$~5)z2(8S=|Jm8p;D8Xzw)$``^ynEnz_6&D5jj6cmV6?PfrK zW7XYWRoB7K3_JL~s%y6I(63iF#iXr)En;G|sNC0p?6!tpkRcLl zVp>78Tf`p&ijYZc{lzI_Hnc8a70fx`2Dpl^i~p5Xu{2{tX`TkQO~?k&>ME&MwMZ_2 zRqoRK4xOFll|n-Sdm@&m5f0WQ09oa@C>>XwWSp6iJLIXNS(G~uq}BfLRIKT!h>}tc zWxh-3+dpZOxPJFRiOjCC`up{M@3w3Ua|@hMRK(x@%mz+seg=I*$P)H~%rsn?4CbK@ zO8I)2*Y8q*=#xx~O=iddZnvQWXF&1J$KUf`B3heZ#?_DOl(b6Qn}aPjr%;;h+$n@4lx{Vh4C4HoZ8U z*;2YqkFGV>^5zOuSz|9lAp+hY#t;9(d3U2!UGYihmxPF%BcF z9nYp&dkrux9+zpBfY&n{tIZqJ@M?k?W|fG}9-Kjs?rjbpK5i2LC=Pg_AKNQYgB)EF z#T^w+{Clab6Pxrfq~M=OyN3Dtt7ajxx|0ZO+Lh+1u%0$=^!Ze?V+U{5{Q(() zIOPVbMOTuXr!brui*ERTYWPtn84DKZXW8!11 zC7jQ8RIE}oFpmE>%@+b||IK9S=Pr+m5y~%M13rPxZ@)e)Qn35pfo*Wbgkm|<5otYu zRehHh0a)XKWS<29`FH^S@yQ7AYjSR%g*1Tk9FHJAUU50Z92oa65U+7WYZb?nr`uq; z_y%=JR?bJ&-tiOF61_@2iI0_epPrsL4YhKUPlf}9Hr{1Mw57shzzjZ;82xL{jgZcC z92{;g@?+iBv}cc$vJxC5)vB8>DV~6f&)jRfuzZ2Z|JB!5pZd^zch`pvJ}6%f zu?>B5oaGpc$_=h_Zyq%p*NVQj++X(0UAQ}!f8F!lw8D44%vQhYgH>`QJw(#&Qd{8a zeu7%ax(-msi$MY1FXm?Knp_Wq0Q}M$xSa;ltlD_*?3qG14|jp~IA0a>fT_eV7o7|| zGxTw~9NF((fun8%_w4?8>raE6-~^!S3d2X~0ia}^VO{f2x12_uqYg0tpAVwez1|Bx zq;CQ0THrFE?Fl{e^78WWSqGZYb`!%?o1V^M@3=K6p|5P;^NQzJGb$Kl;a9Dvz8sSU zLTcknbf9T}XQ<%(Xu7FlO7|OJH-)=64wTX<$^X&e*34du0R*Fy6|8D7%*I31;DeSu zr8^CE55|jw-a&A{IU)$|e)}@#(fB|ujBH*)XH-n@!Dc(sI$j0SUh zSOo5to%pQ4d)-+<%kQ5)T_NKeSB9X`akc&}-l>Ih(8&-Vgcl*6a z$HLzRuU%5R+Ujp0&$T=XQbrY}_MT^{eOqTAy~LtlT1#uGXXg)r*tbf6yW-?(YMap@ zUiDTk9PdN5T8m=vT9@ft2d+pc6{Kcec-d5bQ=u2VosP7`bAkKjOg@5OXd$sj0A+S7 zFiT%EtCW0C!zW_hpK9X9ZHwvuSz0&wJkeib%Gx0^*jMFrn4{rlPR%zu+H3VBhVAWO z(Dyg0iY1(p1~ILj6BRmT`gg__O9ILVOj{ru2xU4h;C4)p#tLJUpB>uow0pOGU-XCB z(inxyIxu>wnU!K>pz*pZTtCoGwf^vS1cBvys!gZc%z(hf;2qj{K{IfbhKI8_d%Z4d z8Y^YRsfKRbtZAOCEda~HBPg3rOOIz1h{`0?qiz$Fr4+EMCsvr0W<9ZfVE)F&$l9)rc!3~xPMN7x&bae6gsp1CvqQ#EJ>F}nnG2ehA zuD3W4kqE1!??XX17bv9qT%NZJG}kJ$Qb7i?+~G!9)8m`vsq*q$e{sz|!@N__5QIm) zZt1;9H$lOQR;==XJHts%)p$sMqyC8t-izw%KS}-AFutm+Y}-hIxHbu~6HII|Y*CT| z5LH=9VKS^j7^kJJC#RsRBJIVjups{ImIZ72g!+D`YP!$UEcSpfTTWp<_pP+wPd5=H zR3Cb19H!{JbndXp#s6)SD6KJuc77~IoxO7qdrkED0Zg1TmcUqgxC*7Vt^LaKzafzL zLuHh{yh;D%L))RIN@pIuxRY(?-nmFRjM)m^!PL{~)S|{P@D?@@`PgIo{)-p8%q>Q_ zqh(1yVQ|q@lOv`Ji!ia?Aev%yqxsr9(k!yQYczqih2zs1J@^(`vG{l5i1QD$K0M z(Aj1pxP2X!E~gQ5cF-QSkM{bM*-|am@>$8K1j95{g)kvXaM*NsYJ&P2J$K-n{be#L z7bQV4EabQ7rgal+nEBlyJyB?A2iFnRIz)(IQHbz$8-2`mKN8XhnIe?Hap0TuoDum zUig6;Ifz-z-?hI%unU7;^C(;lxdEN07-Raro6!3tk~rsl&oWmf-v@rRki*P?vGkoJ zb%#4H2pLztVjV#uesAFLCWjQ*hGiRH1L9^aC&i@bA|IXUEW3l& z=x%tI*Olw&z{9IDS2|3_>D$WhAG&;2$lA_Yerd5$Ke-SE7xgH>6IYUEAX<25w-`ht zh;KOXTcA-FR==Y7db6#Ffjn$>$-CxjwC@3&w!FnjYedk_O9&=gT7@3$&X~>zZ=NbB z$jQ<1dbpbFK@JV%?ijJCJ*4R_roWHR=KEZEu)k4OmR;sT7d%EILpq}Kqre^Ptj1vk z_nzQi4L@N}@fp}SE5KSKThlOGJN%Er2+R^r^)`ALZLk*!dPN@_WXY%AZp)LRmjq;) z*!=v6>E+6S^IzeW`~C1c_`nIcywX`-I#V>egVE@;OrzjD{|U5XYm?iE3szRH%2xc8 z9#@J`m_kJ%hVmS2UH?N*aG5xH&I5IkYuppBc7auhXQq}%P1SzrFGlK)wKT9tSLCf5 z>^`I^uFvVY&{h0wtc0Vr*z%JG_bG*VzVn!kFTO1L_HL`6 zbWf#Bn8^F}Zb8ATWz{I5;i5`KMWMz+Mzg_``pd#d&dKmSi( z*2NOd5-Ar;6(yx7uN~4eGc&L7^5RDSFTc?E603Pr^UBJzOPXitI#EqtKnpAew=aL1 h&Hqn3!)1rZvOZKszC&G00#3r9t7)Wxe(?C^e*v(7C*A-6 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..06ffbc8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,93 @@ +# FingerPass + +[](https://github.com/gazugafan/fingerpass/releases/latest) + + + +### A fingerprint-enabled Windows password manager + +FingerPass is a Windows password manager that fills in your password when you scan your fingerprint. You can finally put that fingerprint reader to use! + +It sits quietly in your tray watching your fingerprint scanner. Once a fingerprint is read, it verifies that the fingerprint belongs to you. If it does, FingerPass checks to see if your currently focused window matches any of your saved passwords. If a matching password is found, it types it in for you and optionally presses ENTER. Easy peasy! + +This isn't necessarily meant to replace any existing password managers--especially browser-based ones. Instead, it's intended to be used alongside them, and to fill in some of their gaps. You could use FingerPass to manage the passwords used in all of your other Windows programs, and you could even use FingerPass to fill in your browser-based password manager's master password. If you do this, you could set your browser-based password manager to lock your database quickly--essentially adding a missing fingerprint feature to your browser-based password manager (relying on FingerPass's locking mechanism instead). + +## Install [![Github All Releases](https://img.shields.io/github/downloads/gazugafan/fingerpass/total.svg)](https://github.com/gazugafan/fingerpass/releases/latest) + +[Download the latest Windows release here](https://github.com/gazugafan/fingerpass/releases/latest) + +...click "FingerPassSetup.msi" and run/open it. + +## Setup Your Fingerprints + +FingerPass uses Window's built-in local fingerprint database, so you'll need to register your fingerprint(s) with Windows Hello if you haven't done so already. However, keep in mind that FingerPass normally takes full control of your fingerprint scanner while it's running. This means Windows Hello won't be able to access your fingerprint scanner and register new fingerprints. To get around this, right-click the FingerPass tray icon and select "Pause Fingerprinting". This frees up your fingerprint scanner so it can be used by other programs. + +To register fingerprints with Windows Hello, press Start/Windows, type in "fingerprint", and select "Set up fingerprint sign-in". Then, select "Windows Hello Fingerprint" and follow the instructions. Add as many fingerprints as you like--they'll all be linked to your Windows user account and work with FingerPass. Each user on your computer has their own set of fingerprints and their own password database in FingerPass. + +If you paused FingerPass, be sure to unpause it after registering your fingerprints. To do this, right-click the FingerPass tray icon again and select "Resume Fingerprinting". + +## Usage + +FingerPass sits in your tray. It looks like a fingerprint! + + + +If it's having trouble communicating with your fingerprint scanner, it will turn red. Hover over it to see what's going wrong. + + + +Otherwise, when you scan your fingerprint it will flash green for a moment (if the fingerprint is one that you registered), or red for a moment (if the fingerprint is unrecognized or belongs to a different user). + + + +If it looks greyed out, that just means the password database is currently locked. If that's the case, you'll be prompted to enter your master password the next time you try to fill in a password with your fingerprint. Having to enter your master password occassionally is what keeps your password database truly secure. By default, you'll need to enter it at least once per hour, but you can increase this timeout in the settings if you'd like. + +Right-click the tray icon and select "Settings" to get to the settings. There's not much to configure besides the timeout... + + + +More importantly, select "Manage Passwords" from the settings or tray-icon to manage your password database... + + + +This is where you'll save all the passwords that FingerPass will type in for you later. Each password includes a Program Name and a Window Title. Later, when you scan your fingerprint, FingerPass will look through your password database for a password with a Program Name and Window Title that matches the window you're currently working in. If a match is found, the password is typed into your program for you. If you checked the "Press Enter?" box, FingerPass will even press ENTER after typing in the password for you. + +The Program Name and Window Title don't need to be exact matches. You can use wildcard characters * or ? to match any number of characters or any single character. For example, if you enter "\*something\*" for the Window Title (without the quotes), this would match any window title containing the word "something". Matches are also always case-INsensitive. + +FingerPass looks through your password database from top-to-bottom and will use the first matching Program Name and Window Title it finds. You can drag-and-drop passwords to re-order them how you like. If no match is found, it will ask you if you'd like to create a new password. Alternatively, you could put one final password at the bottom of your database with a * for the Program Name and Window Title as a last default password to use when there are no other matches found. + +Finally, to make it easy to figure out what to enter for the Program Name and Window Title, you can click around to other windows you have open. The password manager will stay on top and show you exactly what FingerPass reads as that window's Program Name and Window Title. If you already have a password that FingerPass would match, it also gets listed and highlighted in green. + +Oh, you can also change your master password from the database manager, export your entire password database (decrypted in plaintext), or import a password database that you had previously exported. + +## How It Works + +FingerPass has two main components: a Windows service and a tray icon. The Windows service is necessary to take ongoing focus of the fingerprint scanner. Without it, Windows only allows a program to acquire and maintain focus of a fingerprint scanner while the program itself has a UI window with focus. + +The tray icon acts as the UI for FingerPass, and communication between the tray icon and the service is handled via a named pipe. The service keeps the tray icon up-to-date on the status of the fingerprint scanner and sends over a user ID whenever an identified fingerprint is scanned. The tray icon lets the service know when it should aquire focus of the fingerprint scanner (when the tray icon starts or resumes) or when it should let it go (when the tray icon stops or pauses). This way, the service won't have focus of the fingerprint scanner when you might need it to login to Windows. + +## Is It Secure? + +Pretty secure! It shares the same benefits and shortcomings as most other password managers. + +However, keep in mind that **fingerprints themselves cannot be used for encryption**. That's why FingerPass asks you for a master password occassionally. This is what is used to encrypt your passwords, and it's the ONLY thing that keeps your database truly secure. + +Requiring you to scan your fingerprint adds a small amount of protection on top of this, as it makes it difficult for someone else to simply walk up to your computer and get at your passwords while your database is unlocked. However, your fingerprint is NOT used, in any way, to lock or unlock your database. It should only be viewed as a convenient way to trigger that you want to fill in a password while also providing some level of assurance that it really is you (and not a passerby). It provides absolutely no cryptographic security. + +More security details are at the end of this README if you're interested! + +## Why, though? + +Fingerprint scanners have shockingly little use in Windows. They essentially just let you login when starting your computer or switching accounts. I got tired of looking at my useless fingerprint scanner, wondering why it couldn't do more, and decided to start developing something that would let me at least scan my fingerprint to fill in a password. What started as a weekend-long project exploded into this full-blown password manager for the rest of Windows! + +## Security nitty gritty + +The first time you run it, FingerPass generates two different random salts used to generate two SHA256 hashes of your master password for different purposes. The first is stored with the application's settings, and is simply used to check that your master password is correct when you enter it later. The second is never stored, and is used as entropy to encrypt/decrypt the passwords in your password database. Passwords are encrypted using Microsoft's ProtectedData class, which encrypts data using the currently logged in Windows user's credentials (and supplied entropy). So, in addition to being encrypted using your master password hash, your password database is also tied to your Windows account. + +Your password database is only ever stored on disk with the passwords encrypted, and in fact is only ever kept in memory with the passwords encrypted. The rest of the database (the program names and window titles) is never encrypted and should be considered public data. When you unlock your password database, your master password is hashed and the result is kept in memory. This is used to decrypt individual passwords when necessary. + +Unfortunately, one of the shortcomings of FingerPass (and most other password managers) is memory management... There's really no good way to clear your passwords from RAM once they've been decrypted. Even your master password will likely be left in RAM as soon as you enter it into the password textbox. To make matters worse: if you run short on RAM, Windows could end up moving those decrypted passwords onto the hard drive's swap file. + +There are some possible approaches to mitigating this, but they're difficult to implement and the actual benefits are questionable. FingerPass doesn't employ any of them for now. In any case, if someone steals your computer while it's running, or can otherwise dump your RAM, you should probably consider your password database to be in jeopardy. If your computer is stolen while powered off, the risk should be lower but might still be possible due to RAM paging. None of these exploits would be *easy*, of course, so you would likely have time on your side in a scenario like this. + +FingerPass types in passwords for you using .NET's SendKeys--the updated SendInput version introduced in .NET 3.0 (not the JournalHook version). It doesn't use the clipboard. \ No newline at end of file diff --git a/docs/settings.png b/docs/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..2843932ad5932473390fda903fdead443e22b35a GIT binary patch literal 11362 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 literal 0 HcmV?d00001 diff --git a/docs/tray1.png b/docs/tray1.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3066d845d94479c412185114cea3f73aa1f3f3 GIT binary patch literal 13304 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 SEe<^Y43d*lmaG>y4f#I_OrymB literal 0 HcmV?d00001 diff --git a/docs/tray3.png b/docs/tray3.png new file mode 100644 index 0000000000000000000000000000000000000000..3edb4136c744869833edfda70185f1cbff306ea3 GIT binary patch literal 11652 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%0A&a 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 - + + + \ No newline at end of file diff --git a/fingerpass/DatabaseForm.Designer.cs b/fingerpass/DatabaseForm.Designer.cs index e6531a0..97d4e4b 100644 --- a/fingerpass/DatabaseForm.Designer.cs +++ b/fingerpass/DatabaseForm.Designer.cs @@ -58,10 +58,10 @@ private void InitializeComponent() // closeButton // this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.closeButton.Location = new System.Drawing.Point(789, 656); - this.closeButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.closeButton.Location = new System.Drawing.Point(592, 533); + this.closeButton.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.closeButton.Name = "closeButton"; - this.closeButton.Size = new System.Drawing.Size(108, 42); + this.closeButton.Size = new System.Drawing.Size(81, 34); this.closeButton.TabIndex = 1; this.closeButton.Text = "Done"; this.closeButton.UseVisualStyleBackColor = true; @@ -77,47 +77,47 @@ private void InitializeComponent() this.toolStripMenuItem2, this.deleteToolStripMenuItem}); this.passwordMenuStrip.Name = "contextMenuStrip1"; - this.passwordMenuStrip.Size = new System.Drawing.Size(188, 106); + this.passwordMenuStrip.Size = new System.Drawing.Size(162, 98); // // copyPasswordToolStripMenuItem // this.copyPasswordToolStripMenuItem.Name = "copyPasswordToolStripMenuItem"; - this.copyPasswordToolStripMenuItem.Size = new System.Drawing.Size(187, 24); + this.copyPasswordToolStripMenuItem.Size = new System.Drawing.Size(161, 22); this.copyPasswordToolStripMenuItem.Text = "Copy Password"; this.copyPasswordToolStripMenuItem.Click += new System.EventHandler(this.copyPasswordToolStripMenuItem_Click); // // moveToTopToolStripMenuItem // this.moveToTopToolStripMenuItem.Name = "moveToTopToolStripMenuItem"; - this.moveToTopToolStripMenuItem.Size = new System.Drawing.Size(187, 24); + this.moveToTopToolStripMenuItem.Size = new System.Drawing.Size(161, 22); this.moveToTopToolStripMenuItem.Text = "Move to Top"; this.moveToTopToolStripMenuItem.Click += new System.EventHandler(this.moveToTopToolStripMenuItem_Click); // // moveToBottomToolStripMenuItem // this.moveToBottomToolStripMenuItem.Name = "moveToBottomToolStripMenuItem"; - this.moveToBottomToolStripMenuItem.Size = new System.Drawing.Size(187, 24); + this.moveToBottomToolStripMenuItem.Size = new System.Drawing.Size(161, 22); this.moveToBottomToolStripMenuItem.Text = "Move to Bottom"; this.moveToBottomToolStripMenuItem.Click += new System.EventHandler(this.moveToBottomToolStripMenuItem_Click); // // toolStripMenuItem2 // this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(184, 6); + this.toolStripMenuItem2.Size = new System.Drawing.Size(158, 6); // // deleteToolStripMenuItem // this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(187, 24); + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(161, 22); this.deleteToolStripMenuItem.Text = "Delete"; this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); // // changeMasterPasswordButton // - this.changeMasterPasswordButton.Location = new System.Drawing.Point(12, 656); - this.changeMasterPasswordButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.changeMasterPasswordButton.Location = new System.Drawing.Point(9, 533); + this.changeMasterPasswordButton.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.changeMasterPasswordButton.Name = "changeMasterPasswordButton"; - this.changeMasterPasswordButton.Size = new System.Drawing.Size(245, 42); + this.changeMasterPasswordButton.Size = new System.Drawing.Size(184, 34); this.changeMasterPasswordButton.TabIndex = 29; this.changeMasterPasswordButton.Text = "Change Master Password"; this.changeMasterPasswordButton.UseVisualStyleBackColor = true; @@ -125,10 +125,10 @@ private void InitializeComponent() // // exportButton // - this.exportButton.Location = new System.Drawing.Point(264, 656); - this.exportButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.exportButton.Location = new System.Drawing.Point(198, 533); + this.exportButton.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.exportButton.Name = "exportButton"; - this.exportButton.Size = new System.Drawing.Size(159, 42); + this.exportButton.Size = new System.Drawing.Size(119, 34); this.exportButton.TabIndex = 30; this.exportButton.Text = "Export Database"; this.exportButton.UseVisualStyleBackColor = true; @@ -136,10 +136,10 @@ private void InitializeComponent() // // importButton // - this.importButton.Location = new System.Drawing.Point(428, 656); - this.importButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.importButton.Location = new System.Drawing.Point(321, 533); + this.importButton.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.importButton.Name = "importButton"; - this.importButton.Size = new System.Drawing.Size(168, 42); + this.importButton.Size = new System.Drawing.Size(126, 34); this.importButton.TabIndex = 31; this.importButton.Text = "Import Database"; this.importButton.UseVisualStyleBackColor = true; @@ -153,8 +153,8 @@ private void InitializeComponent() this.passwordsDataGrid.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal; this.passwordsDataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.passwordsDataGrid.ContextMenuStrip = this.passwordMenuStrip; - this.passwordsDataGrid.Location = new System.Drawing.Point(12, 134); - this.passwordsDataGrid.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.passwordsDataGrid.Location = new System.Drawing.Point(9, 109); + this.passwordsDataGrid.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.passwordsDataGrid.MultiSelect = false; this.passwordsDataGrid.Name = "passwordsDataGrid"; this.passwordsDataGrid.RowHeadersWidth = 51; @@ -162,7 +162,7 @@ private void InitializeComponent() this.passwordsDataGrid.RowTemplate.Height = 24; this.passwordsDataGrid.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.passwordsDataGrid.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.passwordsDataGrid.Size = new System.Drawing.Size(884, 418); + this.passwordsDataGrid.Size = new System.Drawing.Size(663, 340); this.passwordsDataGrid.TabIndex = 32; this.passwordsDataGrid.CellBeginEdit += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.passwordsDataGrid_CellBeginEdit); this.passwordsDataGrid.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.passwordsDataGrid_CellContentClick); @@ -178,50 +178,57 @@ private void InitializeComponent() // // label1 // - this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(16, 9); + this.label1.Location = new System.Drawing.Point(3, 7); + this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(231, 24); + this.label1.Size = new System.Drawing.Size(197, 20); this.label1.TabIndex = 33; this.label1.Text = "Current Program Name:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label2 // - this.label2.AutoSize = true; this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(35, 38); + this.label2.Location = new System.Drawing.Point(6, 31); + this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(212, 24); + this.label2.Size = new System.Drawing.Size(194, 20); this.label2.TabIndex = 34; this.label2.Text = "Current Window Title:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // programLabel // this.programLabel.AutoEllipsis = true; this.programLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.programLabel.Location = new System.Drawing.Point(268, 9); + this.programLabel.Location = new System.Drawing.Point(201, 7); + this.programLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.programLabel.Name = "programLabel"; - this.programLabel.Size = new System.Drawing.Size(628, 25); + this.programLabel.Size = new System.Drawing.Size(471, 20); this.programLabel.TabIndex = 35; this.programLabel.Text = " This window will stay on top. Click on another window to see"; + this.programLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // windowLabel // this.windowLabel.AutoEllipsis = true; this.windowLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.windowLabel.Location = new System.Drawing.Point(268, 38); + this.windowLabel.Location = new System.Drawing.Point(201, 31); + this.windowLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.windowLabel.Name = "windowLabel"; - this.windowLabel.Size = new System.Drawing.Size(628, 25); + this.windowLabel.Size = new System.Drawing.Size(471, 20); this.windowLabel.TabIndex = 36; this.windowLabel.Text = " how FingerPass reads its Program Name and Window Title,"; + this.windowLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(9, 111); + this.label3.Location = new System.Drawing.Point(7, 90); + this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(124, 17); + this.label3.Size = new System.Drawing.Size(95, 13); this.label3.TabIndex = 37; this.label3.Text = "Saved Passwords:"; // @@ -229,9 +236,10 @@ private void InitializeComponent() // this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label4.ForeColor = System.Drawing.SystemColors.InfoText; - this.label4.Location = new System.Drawing.Point(71, 556); + this.label4.Location = new System.Drawing.Point(53, 452); + this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(825, 85); + this.label4.Size = new System.Drawing.Size(619, 69); this.label4.TabIndex = 38; this.label4.Text = resources.GetString("label4.Text"); // @@ -239,37 +247,40 @@ private void InitializeComponent() // this.currentMatchLabel.AutoEllipsis = true; this.currentMatchLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.currentMatchLabel.Location = new System.Drawing.Point(268, 68); + this.currentMatchLabel.Location = new System.Drawing.Point(201, 55); + this.currentMatchLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.currentMatchLabel.Name = "currentMatchLabel"; - this.currentMatchLabel.Size = new System.Drawing.Size(628, 25); + this.currentMatchLabel.Size = new System.Drawing.Size(471, 20); this.currentMatchLabel.TabIndex = 40; this.currentMatchLabel.Text = " then use that to create your password entries below..."; + this.currentMatchLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label6 // - this.label6.AutoSize = true; this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label6.Location = new System.Drawing.Point(17, 68); + this.label6.Location = new System.Drawing.Point(6, 55); + this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(230, 24); + this.label6.Size = new System.Drawing.Size(194, 20); this.label6.TabIndex = 39; this.label6.Text = "Current Matching Entry:"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // instructionsPictureBox // - this.instructionsPictureBox.Location = new System.Drawing.Point(15, 559); - this.instructionsPictureBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.instructionsPictureBox.Location = new System.Drawing.Point(11, 454); + this.instructionsPictureBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.instructionsPictureBox.Name = "instructionsPictureBox"; - this.instructionsPictureBox.Size = new System.Drawing.Size(53, 66); + this.instructionsPictureBox.Size = new System.Drawing.Size(40, 54); this.instructionsPictureBox.TabIndex = 41; this.instructionsPictureBox.TabStop = false; // // DatabaseForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.closeButton; - this.ClientSize = new System.Drawing.Size(911, 711); + this.ClientSize = new System.Drawing.Size(683, 578); this.Controls.Add(this.label4); this.Controls.Add(this.instructionsPictureBox); this.Controls.Add(this.currentMatchLabel); @@ -284,7 +295,7 @@ private void InitializeComponent() this.Controls.Add(this.exportButton); this.Controls.Add(this.changeMasterPasswordButton); this.Controls.Add(this.closeButton); - this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "DatabaseForm"; diff --git a/fingerpass/DatabaseForm.cs b/fingerpass/DatabaseForm.cs index bae72a0..56926cc 100644 --- a/fingerpass/DatabaseForm.cs +++ b/fingerpass/DatabaseForm.cs @@ -547,7 +547,7 @@ private void passwordsDataGrid_Paint(object sender, PaintEventArgs e) : passwordsDataGrid.Columns[0].HeaderCell.Size.Height); if (relativeY == 0) relativeY = passwordsDataGrid.GetRowDisplayRectangle(passwordsDataGrid.FirstDisplayedScrollingRowIndex, true).Top; - int locationX = passwordsDataGrid.Location.X + 1; + int locationX = passwordsDataGrid.DisplayRectangle.Left + 2; int locationY = relativeY - (int)Math.Ceiling((double)dividerHeight / 2); Rectangle rectangle = new Rectangle(locationX, locationY, width, dividerHeight); diff --git a/fingerpass/KeyDatabase.cs b/fingerpass/KeyDatabase.cs index dba6159..f24075f 100644 --- a/fingerpass/KeyDatabase.cs +++ b/fingerpass/KeyDatabase.cs @@ -545,6 +545,9 @@ public int FindMatchingPasswordIndex(string programName, string windowTitle) /// public static bool WildcardMatch(string test, string pattern) { + if (pattern == "" || pattern == null) + return true; + string escaped = "(?i)^" + Regex.Escape(pattern).Replace("\\?", ".").Replace("\\*", ".*") + "$"; return Regex.IsMatch(test, escaped); } diff --git a/fingerpass/MasterPasswordPromptForm.Designer.cs b/fingerpass/MasterPasswordPromptForm.Designer.cs index e09e0f1..3b2d765 100644 --- a/fingerpass/MasterPasswordPromptForm.Designer.cs +++ b/fingerpass/MasterPasswordPromptForm.Designer.cs @@ -60,14 +60,14 @@ private void InitializeComponent() // // currentPasswordLabel // - this.currentPasswordLabel.AutoSize = true; this.currentPasswordLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.currentPasswordLabel.Location = new System.Drawing.Point(14, 128); + this.currentPasswordLabel.Location = new System.Drawing.Point(0, 127); this.currentPasswordLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.currentPasswordLabel.Name = "currentPasswordLabel"; - this.currentPasswordLabel.Size = new System.Drawing.Size(164, 18); + this.currentPasswordLabel.Size = new System.Drawing.Size(178, 18); this.currentPasswordLabel.TabIndex = 1; this.currentPasswordLabel.Text = "Your Master Password:"; + this.currentPasswordLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // passwordTextbox // diff --git a/fingerpass/SetMasterPasswordForm.Designer.cs b/fingerpass/SetMasterPasswordForm.Designer.cs index ce276d7..dcf9a29 100644 --- a/fingerpass/SetMasterPasswordForm.Designer.cs +++ b/fingerpass/SetMasterPasswordForm.Designer.cs @@ -65,33 +65,33 @@ private void InitializeComponent() // // currentPasswordLabel // - this.currentPasswordLabel.AutoSize = true; - this.currentPasswordLabel.Location = new System.Drawing.Point(42, 120); + this.currentPasswordLabel.Location = new System.Drawing.Point(17, 120); this.currentPasswordLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.currentPasswordLabel.Name = "currentPasswordLabel"; - this.currentPasswordLabel.Size = new System.Drawing.Size(128, 13); + this.currentPasswordLabel.Size = new System.Drawing.Size(153, 13); this.currentPasswordLabel.TabIndex = 2; this.currentPasswordLabel.Text = "Current Master Password:"; + this.currentPasswordLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(54, 154); + this.label2.Location = new System.Drawing.Point(14, 154); this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(116, 13); + this.label2.Size = new System.Drawing.Size(156, 13); this.label2.TabIndex = 3; this.label2.Text = "New Master Password:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label3 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(17, 188); + this.label3.Location = new System.Drawing.Point(11, 188); this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(153, 13); + this.label3.Size = new System.Drawing.Size(159, 13); this.label3.TabIndex = 4; this.label3.Text = "Retype New Master Password:"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // currentPasswordTextbox // diff --git a/fingerpass/SettingsForm.Designer.cs b/fingerpass/SettingsForm.Designer.cs index 899791e..54afc1b 100644 --- a/fingerpass/SettingsForm.Designer.cs +++ b/fingerpass/SettingsForm.Designer.cs @@ -92,12 +92,11 @@ private void InitializeComponent() // // label7 // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(12, 53); + this.label7.Location = new System.Drawing.Point(2, 53); this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label7.Name = "label7"; this.label7.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.label7.Size = new System.Drawing.Size(103, 13); + this.label7.Size = new System.Drawing.Size(114, 13); this.label7.TabIndex = 25; this.label7.Text = "Scan Failure Sound:"; this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -105,10 +104,10 @@ private void InitializeComponent() // SoundSelect // this.SoundSelect.FormattingEnabled = true; - this.SoundSelect.Location = new System.Drawing.Point(119, 50); + this.SoundSelect.Location = new System.Drawing.Point(120, 50); this.SoundSelect.Margin = new System.Windows.Forms.Padding(2); this.SoundSelect.Name = "SoundSelect"; - this.SoundSelect.Size = new System.Drawing.Size(151, 21); + this.SoundSelect.Size = new System.Drawing.Size(150, 21); this.SoundSelect.TabIndex = 26; this.SoundSelect.SelectedIndexChanged += new System.EventHandler(this.SoundSelect_SelectedIndexChanged); // @@ -144,6 +143,11 @@ private void InitializeComponent() // this.timeoutNumeric.Location = new System.Drawing.Point(167, 79); this.timeoutNumeric.Margin = new System.Windows.Forms.Padding(2); + this.timeoutNumeric.Maximum = new decimal(new int[] { + 999999, + 0, + 0, + 0}); this.timeoutNumeric.Name = "timeoutNumeric"; this.timeoutNumeric.Size = new System.Drawing.Size(75, 20); this.timeoutNumeric.TabIndex = 29; @@ -155,21 +159,21 @@ private void InitializeComponent() // // label1 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 81); + this.label1.Location = new System.Drawing.Point(3, 81); this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(151, 13); + this.label1.Size = new System.Drawing.Size(160, 13); this.label1.TabIndex = 28; this.label1.Text = "Keep Database Unlocked For:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // managePasswordsButton // this.managePasswordsButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.managePasswordsButton.Location = new System.Drawing.Point(55, 142); + this.managePasswordsButton.Location = new System.Drawing.Point(52, 142); this.managePasswordsButton.Margin = new System.Windows.Forms.Padding(2); this.managePasswordsButton.Name = "managePasswordsButton"; - this.managePasswordsButton.Size = new System.Drawing.Size(204, 37); + this.managePasswordsButton.Size = new System.Drawing.Size(213, 37); this.managePasswordsButton.TabIndex = 31; this.managePasswordsButton.Text = "Manage Password Database"; this.managePasswordsButton.UseVisualStyleBackColor = true; diff --git a/fingerpass/TrayIcon.cs b/fingerpass/TrayIcon.cs index e5334e7..4ac8a61 100644 --- a/fingerpass/TrayIcon.cs +++ b/fingerpass/TrayIcon.cs @@ -61,24 +61,15 @@ public TrayIcon() _iconRed = new Icon(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Icons/red.ico")); _iconGreen = new Icon(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Icons/green.ico")); - try - { - //create bus with service... - var pipeName = new SimpleStringPipeName( - name: "gazugafanFingerpass", - side: Side.Out - ); - bus = new NamedPipeBus(pipeName: pipeName); - _busHandler = new BusHandler(bus, this); - } - catch(Exception) - { - MessageBox.Show("There was a problem connecting to the FingerPass Windows service. Maybe another user is logged on and using FingerPass already?", "FingerPass", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + //connect to the service... + ConnectToService(); //handle shutdown or logoff... SystemEvents.SessionEnded += OnShutdown; + //handle user switch... + SystemEvents.SessionSwitch += OnSessionSwitch; + //create the tray icon... _notifyIcon = CreateNotifyIcon(); UpdateStatusIcon(); @@ -94,6 +85,72 @@ public TrayIcon() Publish(new GetStatus()); } + private void ConnectToService() + { + try + { + //create bus with service... + var pipeName = new SimpleStringPipeName( + name: "gazugafanFingerpass", + side: Side.Out + ); + bus = new NamedPipeBus(pipeName: pipeName); + _busHandler = new BusHandler(bus, this); + } + catch (Exception) + { + MessageBox.Show("There was a problem connecting to the FingerPass Windows service. Maybe another user is logged on and using FingerPass already?", "FingerPass", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void DisconnectFromService() + { + try + { + if (bus != null) + { + if (_busHandler != null) + { + _busHandler = null; + } + bus.Dispose(); + bus = null; + } + } + catch (Exception) + { + } + } + + /// + /// When switching to a different user, disconnect from the bus. + /// When switching back, reconnect to the bus + /// + /// + /// + private void OnSessionSwitch(object sender, SessionSwitchEventArgs e) + { + try + { + if (e.Reason == SessionSwitchReason.ConsoleDisconnect) //switching to a different user + { + Publish(new TrayClose()); + + //wait a second for the message to be sent before disconnecting from the bus... + Task.Delay(1000).ContinueWith(t => DisconnectFromService()); + } + else if (e.Reason == SessionSwitchReason.ConsoleConnect) //switching back to this user + { + ConnectToService(); + + //wait a second for the bus to reconnect before sending the alive message... + Task.Delay(1000).ContinueWith(t => Publish(new GetStatus())); + } + } + catch (Exception) + { } + } + /// /// When shutting down or logging off, signal to the service that the tray is closing so it can release focus /// @@ -518,7 +575,8 @@ public void Publish(T msg, bool failureToast = false) where T : fastipc.Messa { using (cts.Token.Register(Thread.CurrentThread.Abort)) { - bus.Publish(msg); + if (bus != null) + bus.Publish(msg); } } catch (Exception e)