.gitignore000066400000000000000000000003451516100164400130460ustar00rootroot00000000000000/build /dist /node_modules /*.log /*.iws .idea/workspace.xml .idea/tasks.xml .idea/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml .idea/inspectionProfiles/profiles_settings.xml node_modules/.yarn-integrity .idea/000077500000000000000000000000001516100164400120345ustar00rootroot00000000000000.idea/codeStyleSettings.xml000066400000000000000000000004251516100164400162330ustar00rootroot00000000000000 .idea/misc.xml000066400000000000000000000002561516100164400135140ustar00rootroot00000000000000 .idea/modules.xml000066400000000000000000000004121516100164400142230ustar00rootroot00000000000000 .idea/onenote.iml000066400000000000000000000005201516100164400142030ustar00rootroot00000000000000 .idea/php.xml000066400000000000000000000003301516100164400133410ustar00rootroot00000000000000 .idea/vcs.xml000066400000000000000000000002471516100164400133540ustar00rootroot00000000000000 .npmignore000066400000000000000000000002371516100164400130550ustar00rootroot00000000000000/.idea /artifacts /build /test /node_modules /*.iml /*.ipr /*.iws /.travis.yml /.scrutinizer.yml /Gruntfile.js /*.lock *.log /corifeus-boot.json /dist /secure .travis.yml000066400000000000000000000017371516100164400131750ustar00rootroot00000000000000language: node_js sudo: required node_js: - node env: matrix: - CXX=g++-4.8 global: secure: xR8HDjpnnX/O6ekhbRehaK8LOf0eWkn1IKzxI/OjJHKP1c7QpT3sCmNiewDrnZXHDhXK0o8+ixVB0k6K8tBOoqb3mFtXLMczCx7EhgqUgmp+J42PpSffS81knMzN7COJXWfkbxnwCcsah348/8TkWUx4WDn7iSC7XfBGZXoftpoOwcySRZ2yucmai6cNdOtao9oV9MliufHdOdZ5lOaDArZWu10Mmm4aiHRHuJbcmCsOEusO3TOjPC5D4gKh2Qt6RvV/syVju50vvbYdcKyD6xKsIaX5wGzZNzZmIjq+TjbAXYkMk5cfYXsnUiSnlZSWPF/DSOuM+CON5eQQgucQHQQCqVBeiRWICRth+2xfrEkqze3/wtx24wi4xPK+G+DHO2ur1lJGXqgjWeg/07v40lPRM3p2MIcz6Lh5wK/ZOWdttnOyplMlB4J7CHpPK9HaC/MxMDtsWoUlJzyzpKyRaUxPAMpkRznUmDwxGlJNEKmvVI46tCqSHpCatZIX0CeL2ptwSRDWadllrwvlcRgvZLkQjExF/SCgFgwO/9TV93MK/KJrM1iRsJ7qluUSvrmRVO9APf5iXqKqU21ZCDXGaS4HoS0cGxgDO2n6e4Xo1lK3xlosncoiuTkCJcn+eMqnqBn9lK/H9mFtPLnF+/yDJ5ID4S4pqbaUWCarR3YhCE8= addons: apt: sources: - ubuntu-toolchain-r-test packages: - dbus - gcc-4.8 - g++-4.8 - libglib2.0-dev before_script: - npm install -g node-gyp - npm install -g grunt-cli npm Gruntfile.js000066400000000000000000000005521516100164400133530ustar00rootroot00000000000000module.exports = (grunt) => { const builder = require(`corifeus-builder`); const loader = new builder.loader(grunt); loader.js({ replacer: { type: 'p3x', npmio: true, nodejsinfo: false, opencollective: true, }, }); grunt.registerTask('default', builder.config.task.build.js); } LICENSE000066400000000000000000000022661516100164400120670ustar00rootroot00000000000000 @license p3x-onenote v2019.4.101 📚 P3X OneNote Linux https://pages.corifeus.com/onenote Copyright (c) 2019 Patrik Laszlo / P3X / Corifeus and contributors. MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. README.md000066400000000000000000000261011516100164400123330ustar00rootroot00000000000000[//]: #@corifeus-header [![NPM](https://nodei.co/npm/p3x-onenote.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/p3x-onenote/) [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://paypal.me/patrikx3) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Corifeus @ Facebook](https://img.shields.io/badge/Facebook-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [![Build Status](https://api.travis-ci.com/patrikx3/onenote.svg?branch=master)](https://travis-ci.com/patrikx3/onenote) [![Uptime Robot ratio (30 days)](https://img.shields.io/uptimerobot/ratio/m780749701-41bcade28c1ea8154eda7cca.svg)](https://uptimerobot.patrikx3.com/) [![Backers on Open Collective](https://opencollective.com/p3x-onenote/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/p3x-onenote/sponsors/badge.svg)](#sponsors) # 📚 P3X OneNote Linux v2019.4.101 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. **Bugs are evident™ - MATRIX️** # Description [//]: #@corifeus-header:end A Linux compatible version of OneNote ![Screenshot 1](https://cdn.corifeus.com/git/onenote/artifacts/screenshot/screenshot-2019.png) # Downloadable installer ## Snap [![LINK](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/p3x-onenote#cory-non-external) ## AppImage https://github.com/patrikx3/onenote/releases After downloading the ```AppImage```, make it an executable. ```bash mkdir -p $HOME/opt mv ~/Downloads/p3x-onenote-a.b.c-x86_64.AppImage $HOME/opt/ chmod +x $HOME/opt/p3x-onenote-a.b.c-x86_64.AppImage # Then you can run it $HOME/opt/p3x-onenote-a.b.c-x86_64.AppImage & ``` It then actually integrates itself into the menus and it will auto update itself. The app can be found on [ElectronJs Apps](https://electronjs.org/apps/p3x-onenote) [Change log](changelog.md) ## If you are a NodeJs Ninja [You want to install via NPM...](artifacts/npm.md) # Original version https://github.com/peterforgacs/electron-onenote Props for Peter Forgacs! 😎 # Main Features P3X OneNote Linux is, actually, an independent browser window for the online OneNote. You can use this program without having to clutter your browser. The main functions are: * that is independent from any browser, as it works in it's own process * it provides a tray, that allows you to close your browser while it keeps running in the tray * the data is cached and is faster than always opening a new window * it allows you to sign in with the corporate or the personal login * when there is a new update, it auto updates itself (Only in the `AppImage` version.) * the program allows to use other Microsoft online applications, but the dedicated purpose is to use OneNote ## Verbose feature info * Desktop menu * Icon * There is a bottom bar * It shows the current location * When you click on this bar, the location URL is copied into the clipboard * There is a new button on the Edit menu * Copy this location to the clipboard * This is the same function that is on the bottom bar when you click on it * Restart button (empty your cache, you can login again if there is an error) * Remember last notebook (as much Online Onenote allows ...) * Menu > Settings * Close button * Close button - will minimize to the tray instead of quit * Close button - default quit close button behaviour (quit the app) * You are able to set a proxy in the settings menu. * There is now a menu called `Corporate home` * The OneNote language is controlled by Microsoft, and we try to work with Oneline OneNote, but we are getting a hard time, but the Electron UI is now able to use any language. * Allows using multiple instances (with some quirks, as the config will not be synchronized using multiple instances at once, so it can provide wrong results - to make it to work, configure with 1 instance, exit, then use multiple instances). * Multiple instances is not recommended (it was requested and provided). # Issues ## Not loading the pages / freezes Sometimes, it is possible, that OneNote Online does not load properly or freezes, the solutions is to quit and start the program again. (I know, you won't like it at all! 😡) ## Online OneNote Change language Although the main page's language can be changed, it reverts back when an actual page is accessed. This is being investigated. https://github.com/patrikx3/onenote/issues/14 ## Electron problem 🐞 Since Electron v3, the tray left click is executing as the right click, Electron bug. https://github.com/patrikx3/onenote/issues/38 ## Fedora https://github.com/patrikx3/onenote/issues/3#issuecomment-312711801 # Development If you try to build the app with AppImage, you have to change from `electron` `dependencies` to `devDependencies`, this is because it is created to be able to run this app from `NPM` instead of an `AppImage`. # URL links [P3X OneNote Linux playground](https://patrikx3.com/hu/ajto/jatszoter/14/p3x-linux-onenote#PG14) [Corifeus P3X OneNote Linux pages](https://pages.corifeus.com/onenote/) [AlternativeTo OneNote Linux](https://alternativeto.net/software/p3x-onenote/) [NPM P3X OneNote](https://www.npmjs.com/package/p3x-onenote) [Snap Store](https://snapcraft.io/p3x-onenote) [//]: #@corifeus-footer --- [**P3X-ONENOTE**](https://pages.corifeus.com/onenote) Build v2019.4.101 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) ## P3X Sponsors [IntelliJ - The most intelligent Java IDE](https://www.jetbrains.com/?from=patrikx3) [![JetBrains](https://cdn.corifeus.com/assets/svg/jetbrains-logo.svg)](https://www.jetbrains.com/?from=patrikx3) [![NoSQLBooster](https://cdn.corifeus.com/assets/png/nosqlbooster-70x70.png)](https://www.nosqlbooster.com/) [The Smartest IDE for MongoDB](https://www.nosqlbooster.com) # Open collective ## Contributors This project exists thanks to all the people who contribute. ## Backers Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/p3x-onenote#backer) ## Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [Become a sponsor](https://opencollective.com/p3x-onenote#sponsor) [//]: #@corifeus-footer:end artifacts/000077500000000000000000000000001516100164400130345ustar00rootroot00000000000000artifacts/new-language.md000066400000000000000000000067221516100164400157370ustar00rootroot00000000000000[//]: #@corifeus-header # 📚 P3X OneNote Linux [//]: #@corifeus-header:end # New translation * `onenote/src/electron/app.js` * `onenote/src/electron/window/onenote/load.js` * `translation/en-US.js/menu.language` [//]: #@corifeus-footer --- [**P3X-ONENOTE**](https://pages.corifeus.com/onenote) Build v2019.4.101 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) ## P3X Sponsors [IntelliJ - The most intelligent Java IDE](https://www.jetbrains.com/?from=patrikx3) [![JetBrains](https://cdn.corifeus.com/assets/svg/jetbrains-logo.svg)](https://www.jetbrains.com/?from=patrikx3) [![NoSQLBooster](https://cdn.corifeus.com/assets/png/nosqlbooster-70x70.png)](https://www.nosqlbooster.com/) [The Smartest IDE for MongoDB](https://www.nosqlbooster.com) # Open collective ## Contributors This project exists thanks to all the people who contribute. ## Backers Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/p3x-onenote#backer) ## Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [Become a sponsor](https://opencollective.com/p3x-onenote#sponsor) [//]: #@corifeus-footer:endartifacts/npm.md000066400000000000000000000072731516100164400141610ustar00rootroot00000000000000[//]: #@corifeus-header # 📚 P3X OneNote Linux [//]: #@corifeus-header:end # NPM install If you know what you are doing and you are a Ninja, here you go: ```bash sudo npm install -g p3x-onenote --unsafe-perm=true --allow-root p3x-onenote & ``` ## Warning This installation is not supported at all. ### Note 🤔 Though, I am using it, but some distros are different and I only use Linux Mint and still, I can't support this way. 🤗 [//]: #@corifeus-footer --- [**P3X-ONENOTE**](https://pages.corifeus.com/onenote) Build v2019.4.101 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) ## P3X Sponsors [IntelliJ - The most intelligent Java IDE](https://www.jetbrains.com/?from=patrikx3) [![JetBrains](https://cdn.corifeus.com/assets/svg/jetbrains-logo.svg)](https://www.jetbrains.com/?from=patrikx3) [![NoSQLBooster](https://cdn.corifeus.com/assets/png/nosqlbooster-70x70.png)](https://www.nosqlbooster.com/) [The Smartest IDE for MongoDB](https://www.nosqlbooster.com) # Open collective ## Contributors This project exists thanks to all the people who contribute. ## Backers Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/p3x-onenote#backer) ## Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [Become a sponsor](https://opencollective.com/p3x-onenote#sponsor) [//]: #@corifeus-footer:endartifacts/onenote-icon-2018/000077500000000000000000000000001516100164400160215ustar00rootroot00000000000000artifacts/onenote-icon-2018/256x256.png000066400000000000000000000143671516100164400175030ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs B(xtIME  %aXfIDATx{x;M rB(4d6$K>mkUjzϑ =jkjO{jj)zKnrQQP ${HRN6<>$ygf;w}wFX "߀Q" 5)Eʊ2P8f|.&L y2rKr7+ {\[_j ̖T@@@JB1V0Y !42o0M+9y3(,)\2J /m/ !) @1cũ^ӕ4%f~H=z3ϣ@1 P( jRa~)I<2' N ݐӥw-N]ybʲ2㆜=&K9M^@"P5!AROP!1bEh΀Q"$LT< & !5A"ǀqN n~E*&d%B31!4H} Ӥaxk;KGR*>f)z>~@1oũ 7_7%R`W{:EI.ϰ\4&)s vO "ٺtn<1/4HskPD^Ӥ^H.yr'@, A4E@ހB\`'@,H[: %oBt<);QL@htRy@-b'Rr:]~UMb!e S D1+=MS&MݯfH30M{ҙn'(/-%͎| US B#%4mVs;Df@z+.^v=?h% 6kp?M2B Nq;jH|* 7uqOU@W:]49N;04@.D邦W=H'-% xħウɃtj= 4`K&fkQ*fJH*=:3`~<0:@ղ J,{?ŝ0]q)nW^xD@ȇ)A"ϊ3@~vӽ@\ ,37xSP8_s)uk75]8lRKOyr$MUTcY | ξ7%/j y*yi Cӗ#ʥ%h E <\t)σ4PwEK2I#pm * q.»~Le ܋!)3yW/!oߟz ?0@4h 8w`~6\@ A2dDڸt 531>)Sɷ^c`7ЬaH#"ud*2g"spx=,1bARze mLIGژ4ICrf C X+uh}~!7R㑐kqC|8|>xxM"qX"%7oC%"1-!>zݛ3w.0ƹ($";gz'mωyB]܅!Ny EDZƄLL=k|2i7>@#w5hDmp/eiIf*#tA6rN0%$rbxx1DN 8HwȉU̺<z?)Zy:QT3 3& .=bCmr±ȟ 3PLRw찣ǞwvL4>|}45l spS:{ZF xߐ)]0E!{U]/xmmZS JM 3s[Qge:=C",KG&V[]L3fc?6ňP,Iv?jl3]<oߙBS*`LI,9ZQpW 9Eb_#t?'ɽ03Y]RgB( .a ^'@ȇEwxm[xT=bfG{kE:2yP(X2w5ξ~< 0!plZ]+M.>%.x;L4|} 26wyۮ[ hSGs]j+wbKY{؍%kw&;":Otb(vVm(;/ntdn;ە2"Kǡg`RљqL\,l[zc>~ ]]as{09<)*%e&GG Qh?ކڥƦsoI;nTGM|z~P* J?{ESbpou/'8*Z`+[,=kd2{EoL-qS+Yo ~xSJHMI`>|Kmi,^8@Z iJKmt>ߡ=Q񱥶ic0<9u/OoCJkߛ8obU:+R$Kˋ9ZkW5{*e8ѧ?m{1fj;'ރkg)ѪY^D ^o5{1쪶jvVu(S`kX]z"?=d~pH DsۏIӳYHbնWry7Ea9`Kn gNsYHbؕ[~^7 I ;һtT>)= ^6$]mZ-ۗ\3 ,$1쨫5/T[nŌgd .jVU"[{*P iF485h}36;&wn[V1RG4MKwn~aDHv؊-bP-abV_n! &,$1쨹 O8X]3 z[#0eTvtda|>-cp+1liݓo!t?=粐:ٴO˘u})|> xjm}($)mۧeL,&E L k-w{ܘxq_cR1,+6;.w|L§U8 Fi}oP uJL-fh:n6^i} Pya_&@>Z>9ԧed`6Ť[aW}gy9p0E@NyE ;30,xmho2FMˆI0ͱfipJT9hxf.}ZVYLRuMP\_aٜ4MAV~ęD6w嫱g u "j9|U;uh:heTݯ1/ן;0z_V"p@:ّR<pm Tf9@2wo rP?Iz8H41ا}0]6ho  ~&Mkjko@/y @6y՞@_%Q?q<@t/ n5G^BW{W.H6Kj7nCE\{k;*^n 47c]8pb _[!YJVaz=[oZ@cxWYow Ě)Qt t=6P+cE~s:w س^\!!L- DLֻk6h %)~ڗ-RwuNyq_tprKRoJh!Q(| !@kʲ2uOӔASRդ@!<0 OpU+>x\[nJ bXdKyO Ès@o057`j`8\$~2M-%b%AƠ(R31I$DHY!T.hwFߦQȗP5R3!zddqr?ȓ*J<ȨfH3O$e0(7A`_AF))03#Л@$gX.&&!I pf+R|F"K3 @*/-OC4E@3{`0beYqCd)4("R5`0bwCBfNO(KEr`ĸ i~R=Pg,NMP, #6dRėdd!B)4k&#1&4 JLFAF1 P( jR.!g_fX5]!&!AF1bؒ%BZw((2@  2v~{2 #1(4 d #d4L/4 LF1(44%fdd0(ƅ7Bvdd0aVuiwZAFb4PM _f0Af|=M ya0ȡ!@0|ӃL3e׭LIENDB`artifacts/onenote-icon-2018/onenote-icon.svg000066400000000000000000000027561516100164400211510ustar00rootroot00000000000000artifacts/onenote-icon-2019/000077500000000000000000000000001516100164400160225ustar00rootroot00000000000000artifacts/onenote-icon-2019/1024x1024.png000066400000000000000000000512771516100164400176310ustar00rootroot00000000000000PNG  IHDRH۱PLTEGpL`y"{!b{)s%sLr%$n%[c6'q)V+jdxaG_`X^b_db\dw2Kdu!zox}qc pr"tync{|v}m~l#bj{|sfzgi~ bk bj$a"|svyxhmk`]aed[i`Yb_cZ_޾^rqpWμ]vtR~lI_ݹ[aV˄$N%]ٰW̹\׺\؃#`d"OUƮVɩTÉDhKPFMEYѧS²X΃$CH@QATĥR?fUǚL|=UȏGJTśMS×KQB~>En6z=q8t:f3wv;j4{y;}>b1r`/n].kONх%SѲ_Ûڊ6~ϡaă*~&oɄ4FSr*BDgj(<\+ULtRNS3 /  &-1$,"';)96*@=ECHA5l`?r@%vcуfiO"IDATx`оol ] Gط A ÓN޺$.эM62 jC}ԏ*c~͆ 72@ d@//5խ@tU_6Do2%sBŋ8"pc^g4R8CI fN s#@ikT#ڹ @JFu`s%)eL d.;Ʋn PK`hPgؿ$@:Xd!ž.Z|$@=oehPs@@8-WWTx[@Ej$LMjCTx9<РK\1-xu=7M<>(1ep<°!4CJ$*p{(W@ \G? @Uw J @Pg@:pLj#G  4EH7u z i ؖ@{`$cC~@ۣ} `tR>Rؖ*G!SF%$&0=0j|t,$TP "0@$ E"`( CHDP ٩cA[{a<"'R@H)x EO <"'R@H)x EO <"'R@H)x EO <"'R@H)x;uh@@QA IM OSP`JL@ )(0E%"SP`JL@ )(0E%"(Y@mY(`J" )(H`J"(ס$F5@8`J_8Pw$(9[yP{qC%vDq|͢'H  R"ӕ1)YTd2_ILNrNC}sC рC`$"'ުmKHx, <^|(G``[P(p!@TF0O|WU6@FP&H 8@(dmf "Z#'*>( ͊j8 #'b6pc ]CWXc@tD0OL$aE<0ݨЂ,; L@A8N:L㲏eZ֯'JM/jr0a77&ewz"` @ q59WǪ?+ ð~MKT$K.H @k? mw6PH @.S??կ^:%B;H hsGtXGV^j#Yy CG_π=]|< XP埪sgz `p-(ū3+$Y;7XE/c 4! )Q|WU^3@/r?@wK;% u=`V3@ⲿS~Akw[`~4GGZg@KdP>|? VWD; '[ ›I{GgJ $8 .;U} Xe((@_FZ B@\?5=l둓n:E_pٺKo|hԭ &x"= bP_h}/ Ra'h[np7Gl~ T } P Nv_(kO5<~X2 ZKO6[}wmK"I*3Op(Ev2V@h8 `g/nP__kc㣾 ٜ:Jx5jT 8 Y?n?[s߮s28 .'h~~s@3@gWu_]ob;}h@"P#T$gtj&o̕L".0k?l@"@π o=F `5(@??b[[M.n: +}ǃČ @I~W.>{#^A uA tzO:`g ?:X7lmXr Y?O>o?;pYplP)ihy#F'~km.2YAeFҿ+Op0^@W@@@V쏛C #/ZNػ&(^ 9"AxRP"(.HIbZūTE`ѣcfM&?|?lҺUGku; f``T/0z ՟f&-Uv&@oѯBͽPP@ ^M/\蛻 0cD~OW?q7`h~ @Dr/#>7~-`T ȏ՟F1<1kt >x X0A@KgC9WV_Q$ Lc/Xoc0?a#Yo>Ku\*X@lwr췀OB B`;?Og{ gb(4?ϵ/o R0韼ӿ) fF1}@D_Q?xXr&?L@4<ߡ7Կ>k W[0v ` t;o_?\1+H@nz?qI O_SFs@"@WA@ӿoC /ȝc 4@ rO3 _+4]]D~_`?oZ> _6#69`UX>H!L˿',+Ag?^&}X q.1}[["' TpZ;ӿ 7ph=鎗~0[,( g2 >=WSS~˿GDX]2/<YMmz ݓJ2 ^ _>>3U\JWc-kNS_ s>T9RS!5XnX@3&!_m ?Sϸ _=t u\(n?axIp P߯{,kX|Sdc[=@5xo?5X6Wil@_ٰ]P_@F[׿:">Lxy¯/Y?3Ԩ 2'֟zge0S)il{[,X)Wk,/ Q?~cn\X6gP@a=: g[O)x?^$Cdz|g*ט h5[`$p+(m)@;?p(ԿC1ALױ@[KdlʪO\gy a`?J{L//QVeX 1 Gh!Pr1 @`4@t#P~t>i*66?{ЌF[lO/Ua8(aVdT8 \| 0jeQ zc~?`.PO1@?`+k2Ϩ?@?S`q)>.cJ?c1@2GHAԩeLPo e= ׿!7Y P8^mP~ ?^g@DZyw&Scy_x p0NWedpdV0""TXT o mIu+1j99sf`w̰=@I /c%I f$MYض?GgPMW?c:?KMH @rt,[-2M[1:`"`{߳@A[#(=1O˿@3bO}lq_1HNc`PԿ)З} @J˿m_=RoeohEBr,sP8;_Ȳ{?~D@Z?300[""<_`(xppMxVH@. @9AyHD@,^co @Ev@ p.;["./ Ha``-?V }q(oPNxQ{[#'8=Z)^g ?z ?,˿@3B@П"][A\7dHǕ@?EAS?Y/UA!=1)bO}BȲ[4#: y߃O,#  ?Bm' k?qW?YL@忡,L9:'d?Xh!h4`-z@Pgq$["%8c }8 fd  @q[whFBLx8 l,*WyY?4 `bǏGDմ @ߣC7dY7 7k$^-f<8A)0["%Y nH:o6??/{c$)GBr, ~ ՟"<˿@3i?mjGA"\˿@3X"R <SohF^8:$ӿ@/?U z'@<# >Ak0/ygPd Vڈ0F}Eh:]PhNp[ JL:ipg{9pu7i0`xqD=-:0`i_lxp/_oЊ)hԿA< @/BF;CY fDg`_  ahP$>/\⡦?,hЉJ3J ;f7i[-ZX?# qϿ@-}9Īh -ֿ@1]#]|?xhP$_;V0!HO~ P[oЎd +@?Z#!PAFP`\x,ǿ@3@ kKt?pkP71j( (i{Zt"-\ѿcb @+@ѿ.7s\ rDRҮ~9_?  /(EN_տoPK |1H#(s ^cѨ@/B@+?|WVb/d~ǿ@3"@^h?7,>E@w @gcEQ t;<8GN"J z ? +ޟQ?Ahzep ?,,?\](@7 DcCM&H,*ޟ9D R ; _r?x }O Zd !S%3?{w9,_<``  oЌ$ZpXdZ% oO?/]@%? 8?g9?-:d x?DhEVZ-zP/WG f %1r[4#% < chFH(cox c]-4G<Lȏ|x[>G@ }0>p7- p,ǿ@3Bpvo?YC} ?;DdA ,_>@)Q4_iY"/n @ON>d~iHug9-߼+P->QH1PL3Xq" ! ^"KE]:b?xAatmR3-vǮ^=u/yH u4#@A)c?K@_>'0LOPdSA!oE=ci2A6?_&} : @\/(lgHaDO"G/Pio61?O\R!"\Ϸ(Oci2S/)?U@'3ODŅpFoêo"K ..8GQZD_otZ])8/@_h|@tV)x0h8FOT 4?*DOS|ϿDu_Wc@d dof%8? 8N`OGw <.`1}14jn)8@v']o)8G;cǟشShbO(8@u(#/ $ (>|W @3]^6(x@_"(;&(8?@<@Dƽp!?a?"ck(2|<`y_ S)x$s?&K&ci)vO?(8Q&W6w@O|[=O#i>{ODƥ ?;ƎWW3?zg4}[ $`4v7U~ODŗ0Ö'xm?@`p?c?"FORq"\7BzOǁ yUu?u @?wKP(\m@\< @!_+Y)ǿ?;) |o( WP? GOf(¾Q"ԹH9pb"BN "֟j!P"3Әx{n;kqI8 =58@ G1?ſ%p!}=Ջ 4% _{?ϣ9ǿ osߣ3(XO%^@`wGA%R Q_@v7<ۿw$44%f(`!?ӣ/Hf.oҽ_ @0C};ĿՓ(A@׽?ѓ8?ŏ dVoD[Xx=U+K { P?oۿ 4 ;_"] <صA]5-'#)Pk%^kߣo% =3(9/!ێ Č/_nW@q5bK@ {;?-6J"+3!ۿ ?ݣߛl"3!SqyۿACݎgE#xk/h~?+c 08_~ۿ {_  ~8ǿq{v&,"knj ƿ=."| `C@A5|w:/kOO8|Q`Gvw;o!5('n `O%@p'|[S{* J$Hp?n }A5~f)2 ,3xJ@D{DoF@@l8v^H@,{b/ uI 跡~K >l< PK `]~yۡoN@.C=0'0 _fʼn s cA\*+D7t#J% FEbf$$!$`JV**vOWUQwnSܺ|0Z ?__˿IO>}N lgf .- Zߐ~-gd\6T*g|/Q\?Gr $ak\s?w+%-/]gsXHٛt ybZgk3@50>@ Ζ?ߏ~ՔO?&0} |.*g-"˿4i7d^T`R %u៭IՓ"@7|7P9[+!{R545S8~4 @Z/.s/& M]~<6l#w꯴_D^!~JOOPY+"*Iߖ@616+b[kV{[3[b('b @< к${@b]9~)B8K2 HOLXKN" @fO[7rWzB?gu GH/]`(BϔVJ@# 0O3@6TJ RmS+  56UU?t('@i#shFP. -?/HG / koϹW)?? KGlOH__To~o#@eb\`(Zb xnB-Gѯd2#_в``UBb^ Sq[@DGjLdдM48%??  @o-v rvXiPOO71  a`eH)h0 ( a[i>_hOb0tBX% -j /UUr ϥ*;G `p acշ(O@3{`\\3@D 0 -?=qG z l,O)vPK4x(6Sbw\ԥkU    ewB.T}`Mcll C ?藣??;X gb0f~vl ?Dbm$B  F;̈́jh58.\H$}W@v_ydoezEHf^.o_w  j_x/Hfti_+߯^5? ,L>S_?r` x\>?sHEq_  I3z?ƻd7;BaU?ۿ^.Tq4'|'~ow_? @2F/Aq\տ~.Xx_ /? GOߎ~=ʟ @ ZW|~Տ;c^2 Ayf @ R)'|__<diyw+/dS]C>7~gHf^ _6?2v4TO?w$3O+um?HnVhm^_? lEO~6 @2pbDN?OTkGO_ @Vim:$3 >?[z??2V4'}'~zHek:~2dz^WzO?O R6W=~_o/){W~?HvK)z~$;WkGO 2n~? @2pp$~NT~.HU? @2ptn?O?nS? @2p~C3i:o3 Av'H[?/ @ewgHnΏW =N@l0/1TnW* >re ܹ } ` `~`}! ! C @@@4k@@@?@dnv0 +EBZBqB  t1Hk`òK%]5{!|@CG(PE p:FS~`boi ,@'AC&nO]9X+ồ2wO\_lr+|`bt@4 6pCO6 M .sh36z.pKC0Xۅ2 ݞyx l>buݝ$x8x{#50?M\H`8|T>J|#񈵍 @PFZK[ck+W<#$?[^"z.P2wP3o G|/x-YיdYP3WLM~0i%7F#VTMjԴ C5x,FLFLqMUJt:iEm.a$tS5 tX*q]&XhG @x)X8߿3Mh(dElUIpR v]vMw26{;Іqe / 0+{Zns9G >&q< o}~Ru4="K |PR<P]n-$vj(@P?NQ=CmMwK / P`% NYn+G0R j ,%!0K 7λPj^rBN? sp G @__}pD7΀uy]7~ ( p+% :I?>5n8(!b+0J0 ip& m,_Y*$ rB?Np 7P$ /hCP P-py/y^ !P `(CBZfĚ+@WC@@ 68~b_x4Sp@ȉͿp<"_@9 qM^WtP(0__No/4ƕ?0vI~#W\0\X4OakS * !!E& l3>ܻ d„ȄT?? `3\G @UIP2B'DQ$Gk صd7a( .% #:2I$|{u) xڡ MxG?!@gLlə IDATx{\TueqDA*B eyLk-M]lKKm.]tKjZbV&^(( 6ai̜\Μ9y>G1v *B!B!BossscΜ9(d,/B!B!B$4 v4B!B!BԧjэB!B!B|$p(B!B!!C!B!B!  !B!B!l8!B!B!RQts * (^Lfz/zK9SU߈B!Dʕ ;2*@Q|t-KơB!nN&=ڜ3dе#{7.=vJp% cOmyFTCe` tT}AC QMg/EŏasSu>]TtʴpjyѦJi̙>!ݮi-{_g W(Wzp<;'psk`W 9+}vߓvwe8tC/Cúᠰ._?<3}KǑ+*GgZѰ5-b{kv{j]>PV`2TPx"k:28-BcƌGG{:4ܷeNmɄdԎoeN KơB!nN"}_4>O c3+^?DuyJ xۢtWTTeD̚Į3iw(l6||czʖ(15f׃qO>";<O`Q١V+уTI^NZc.Scsg;04P'H>d*/q#`cL%ZJL :Y\4@㜪2a_G0i6M:^Aü:Cn:EF"m^O4 /-Gmd7=ܿOAB5 pF!Bq]O cboohdΝ>}f=r">awb?i}S2BqsRtaģ/s;={H(7.<<*ojSw5aya/?Iu#عwNP\?c҅\M8vf_EGѬWۨ?xFȦϝ1;>g Mw~27gj Q:c={ndC0YbLL5dTR懅2>|Kc0H߼5'k_ m S!TIPq#+\2*F]vrΝpS+3r{|oiuQxwf1ib0Us~{w9[(6\ۓ04B8M(:8CC on:ߪy-Bqa̘1O ~TSs2ߪR-&]߱B!nN %o?:( i:pJw w>Og{7uEQ;q5xx<e0Q2`8=<6N+QDYG3H~HؖS/ڛťn {5ڏV0'̽LpqLg8JiP QS/ce-5 lН['F_]ÕgL!(Sq kVB3ÏMW~,Љ~;No2tY!P| LJ;3F#w:*r ۻ{G'T>%p(B1-K_˓DRO_'9^I=S Ix}c_̎ēKH`p05U)6UW b4 [LlGw/&j.5ruS%u05 &Ol"vYp `0i= dC0 &xi c 3חa 2eWP3g?'e?q` Teո(0͙yS6w<<E 1Qzœ/ac#R&ۄ&9lg@y(}Y!3QY_.OIdM $ՍNvBб;spWϤ|  !7D'Υh栔3v+>0ǎ=_1E& 39οSˬ}4/C$s{D0}t/MUfPaՎb&*/RhB73e9^Rb3٦1֜cۆzvO}r.P`{u:@F7s @ဣmh95?}ƾ9RBgyzr/ʒ[\ٲl.ן)H_gƜs\jG7 g)3)(/םPD!, L -n7^@\Rݞh5\t!~Rؽ>5y+/SB!A6nԓwX^z;t%`$78B!o/T䝿DQM޸ۛ(=c&<#Ծ(ulp]^n{:93H3጗VŸo9A.*M=g~}2k8@Q8'_b1#K iLJ 7:a) ٻv=0 B&gNwc嵁R.'*ݻҵk_T 0rE7܍!lk9;LOv^J@X8Iw0pra.5!CnOiQh!?(e!B#)ꦇ{+S<ҦsZ!B!Bq)U .}qxP-t:۔iXGB!B!B2TY!B!BaCB!B!B8B!B!BؐB!B!†B!B!6$p(B!B!!C!B!B!  !B!B!lHP!B!BaCB!B!B8B!B!BؐB!B!†B!B!6$p[ eh&{tl_T^Ctov]p~ɚ!B!BCob)Sa&}Qp%^sY03O5E9d%⍵鴰:mKS{t,kiiЇk~bVfW1eC_sו?Q1P^ԫmSEFȂxnW;."'+m_fHZtB!B!č|ơof̙}i 9s? 4m,?9sSŒIT9H29IĮk4,"%%̞E+HTNaql3m9 Gg djT Zu$,#+vg?‚ؔbж7A_/"v9s&3Z4[ڶr#C33MnU,eM)x;\B!Bq#5qh<7ͩFYڵwHOBgfU*1 fOHTi0С ex 1K^*Hgs c334)!,ZAV!xIYKLLo $ӑdĒ[WQ> qϙMHJRIQsNdBscլ !j?6yGN7~N~ZbVæy[C -&" HHJ'!euJXnnW i޺B밍)+#aZG ۾L_k2y #ѭ[DT<5DFx"f3KD(lm"Q2w~7 plwfI$k $)Au^@z2( ?m>4~!vF+~Dx%=/9P'+1 _J7͎gueY7fl{B!Bq58Tva[&J!&6o6VamRSXWrRP{NNYƔj JMpGNQ dM#%# %\ɍO ;ްAG8sנpBHa]ymy&UE62pźFI`NZЦ$Ihm NY׮Y<7mK:lV,!M3V v:jASKxLYGsn`y~:PƇV ne_g{c2@S7YX$$ 33qyNj&P 7J 4xfi.D,eՖsO۴䐸6ð D-*tJ%j߈6+=PNVj6jON'B!B"va ,Z Jea| W̙OڶLf!0%Iz#X՛#y)j2ˮVTiPk-G-GQl0Pu!ta(@R iHJЂMZ|_hr SY d,Y%)uwҠ֦+NXL'jK* qu0vu^RfZJBUx{longqIBBENjz/"ubU Yr5,Kk-ʀiܧu%=q8  G2khZs[&tJ(JPz33\Cfb57AOxi[hloQF&K !4e~ !B!fоCM. 椲9f)Du^MdQT$IKFefvs,gtdnbYfs0>;w+4(:rR蜊5Neqϯ^m6k. T̎a4V/\ަ!}MTҢ9΋)Z͂/:J ,-&.A%Z&ґqύScdV/[gήj]M9)^¹Y3 ܅Kv}ͫFQv!bZ,Nu,CJy1,)LB@5oyvt SZ df7S^"Xdgɒ OUNXvr4P''3kH{BN;#ڄuć単IOH!ǣ뷟B!B!n`Ӎna1k IDATlҤ~,B%lB!BR* qch ǣ6CL8Hҳ$h(B!BѮ(Bjި吺&M!B!BPe!B!B!D#dB!B!†B!B!6$p(B!B!!C!B!B! KntB!B!78B!B!BؐB!B!†B!B!6$p(B!B!!C!B!B!  !B!B!lHP!B!BaCB!B!B8B!B!BؐB!B!†B!B!6$p(B!B!!C!B!B!  !B!B!l8!B!f h7 Ν;jJ.VsDK\Ҷ`1uhq=Ɉϻ.e|r [wyZvwo]ZzYh%9 !B_C$o&.G_Zs'G;9ߙ3|)8]–7cuW UP(89³:Fw1[^b\<^LV%tU7BW᛹3k]^B!BU Lxi0 ސ=IX֥G1I 6d,* v#9}Ai~%};:*{|uiHQk!)9Oٝ8˖Gop˄B'B[ @Nw|PF kÖ7\\xODPX $9C3V) LJ /"`tw>{$ſf"|wyuCő m5]&^:{ix&~Ź}u56,=?_:/nSNv .QVP!xs@"ӹ*Ǵ]}?\:ri):됲BzN?h\6RpO컩]zh=%h(7R$"hX'r@,axWmα 즤Dhpyv]ywv<$pXϨJ0~%+Ӆ3|yr]{6Cī.L|q0߽|Ƭw8ßDPY'yi..ùdΪq/zzk.C!į˹y#qru`'')PztSR*MBL\2W||ɅEw7fىKq<>W"n(* ڞC8)v\?8Φa/Omėb!æ(l7ݙJ0{VeVeØV(9G"c秸1?Cץk͉bKC{. Cgn#H)k4S#lv_tۣPpz'o`S7 7{{s D֮gv׵+oM]$C&MBiVs#c{1@=4ѻMۇ\sM.t`Za]}n}ˇ͉ßD{4σmQV&(-gߧHx?òLxk8yl;ѺM쾬v;%`twv#?H-stQ1>̌ K/5NCWX3mi[M"{P^T͹Wask1tFoF<ܟM EIX~N-h񳯟;K>27}+0[sOjHx8??.#. $ͯn/^9Mj[{cå#g~)`)t5Obτ2ΝO-dC\,e㒃5u}̌ /߿8:roo殻D֮KRO\X* ՇyD͟RHw7OкDkASKݙPºuHfd,?|qIe q j̼az\>{4#=`uB[Mln1gl/ q= -)ckGa}㟽Ҏ%w~|{ӨV֍= &rV_א}`> Q;w[k*S{KOh Z{ L, ߰n6Z8likk6kqm8v塏):M4gΪxՍ:` v%~|Ǿs g`K@}ďݙ Ú;x{j~5'wS5>)έ^..c`g[>wt]ʷB̝io'W|C3M>9Pm$}k.nmE;wm㽉Vs?B-+OŦ׎4ؗPԳ~~2jf/“ǿMu/ǧ&RxV#NDǶerycLyk>G"cGs>.M9`LNhybUc|w.Ը;ʶi6h#{We5Խ>6}#gQ{X:.)ukxWO&cG5WLv{o A1h0QY'^9Ӹ Em \_/]3LT*!,>n}?zڶfץGm(/w[FٰMnۻUe5i:{/GQp1zb *+Hw'lGG;a|!:;v]b#Puq|-?HrO/]4D`W٭*Wڧ/Bхv)`tOrf_ ڜk2,s !^Ǟ2}Jd^}=ɮ'N0 º뒹ݗR=ܻӒ{XWF1[gHlW`m[q ;p3{ (?aEDI~ eXeVٝѯ'c{K[4ŇO 佉-)AS|13Gg`]6_ܸusS*6zpu58wVkW'6~rݿF4yR܋9y&.}p$}k._?se' Q_i~%3xp%N"yi~9no{o5fˇ,koO-@qd^uN ŃTPQgOl7[J#1{rlӅv|Mk!S},s<>UetgߏY0%Dcr2@9.TWäo%ɁM7jsMy%3|1awaߧ'\BHMlHusu}H3ƈځn};t竧 ֋^CS/b}ݐݬ]ቪ#J{Ŷuu](q8)XҴjS0 J{2w^dCQVz1@<9m|9Jg{+ {iKoeTz#)_ʴsfp$k%^o`iP(JKr-~ s+l#̌ %h7A9ZoΑelJ\:ji_miҒ! gW N N6zmqz_/1iR7RfqC|3\nu}0/t0OU-;y:3oGL:ڱoGL3,W;ȭj*ݔL|i0FQ%lz09GZ޷FΑ"Bg!cG虆æ[:Wi\iONZU4[=Ǥ%Q81obǎ됌:}mUsj7;h/8iui>ӓViu5i?0h[6;y:33kma9jwnю_f[~z6}^њU`#o8OBR4^m;AQluY[€Ko]|xNVLZ[ϫѭN:w'?_*bBw'=0o6/}º-zK?l90+ /,S|,;lS(`;aN*:y:3HCʗ2졾}ׇ|G]=W^*޾c FnƵ.Gv4'v^ͰM, LM9Vu4wm[PQ\ms-zlU\8b=؝_ afLղ&-n73=S_ !7Mk9Ux^ CL~y@u|{&-?d]C0烑}|o`vc=+yw67Bg8T`}F-FPl8Nj9fCؗP;,ўEo9/iLkU;ik$mN9:;E\L&s .35ט+U."mK=@ȽK/ـ93+ {uX.XN켈jS7Dg/&9#ohbgx{;˃+F؜>/nVf0j?6DWoT[WnXU鬏j@wlO54*º3.𜎏Eg/ODgӵ@4MlX|In,JĀWc)kϠPN+ 8)ӥFcǏob&"IV%MOI2mi[K~̡d'{Dԧs)΋d'_ƭ3o%+` F{qD_ax|Ս> ]ٰպLF)kpDIkOl\r,>j ZsҖkio4y2+"[m)vM؏m^Y'/!M{T3!IR|+lzΌ=&j[Y?_"lNT]-RfɯrP{lY;sg{˗ˮ*[puўX޷ekZe=l<} ?ɭ4&SZ+jN48\.DܞxJxk4Xm5(]5û-;ړ].]eGU_eÉ>Nj<9j#߽|c{r~ܝTM =b5onݾ:m) mg|wrY2[[f/yovz=oGWnxS8j~seV[q^6G}҂Jzp즮-~+./֙9(,Agq\Ne=yo;/2/N"}k ~mVf)/\4z'tbވ弰z>#E^G!f⋃)X3e(-Yv߽䗇xdm1?v3œ4Fuﭦ8&!2:wpБΓ%Y1+&&K*k5[\G?sbG2@v1 0ݔm.|!wrՓ[#4Mfjt% ?˧rg?ThlX H( c[vgH\A#zuk8<-O۴y-#h3\׃oScsS r>S}xokε gQDOW?W2Li~%m3{2a\(٨j&S%+ؑǚy{]F}&fk xf_xX Lxk;?[_5Sfa@|Bw[Ҕ-c0>,2&)Fv2/^3TɰMmr+{<Ӧ'gauIJdgeTG IUۥ-WgO'vdӨVBKefOqı zVfoKVZ6>?KN:95S,mFY.^ YiٴR '7*?Cyk;W݆ڝ*yC6oqU5(w.(`Yф7t/B2xkG3x{4TMse뛅 "8c?_/lУزLi6hZRFJڏwTߊj{hȵ+eƅu0)s,~yg6`hNu8e 8)COjZTr}hGXVJ}]?lQX18n*Z?zJJs*+7f;{ LH8 [ + לP*p{+S.=7ԧb*)co Br'% sL{?0]4]-Ta\*#{[h9:JtndӨD^lVx=ɜzG+'"9mq֚~@=NquK *5wcaꅌ,vN9p}ӁCduiqMLHO%0n 98.:@ѵi9HOn@,k W /ZN kG32Ru*}hUDf1w'+-{1NPQ9wPw7+k?)4a˙?Bt'~}g~^'ih\ƀ9wQeIJ(~o/|-FĆ&iiM?2A16ބ؜on$}9)\?A9NIr7'筅'gt0 A.Mrflc =}%a)l~2WMС0Z9&ez6G{.fS=%C7j{T+c,5m>IZ< :RO}s5{:Ch5:ΙhVzX&YiӘddz6_Ή5PެC^$Fqa]o!ύg}9zi'ʼn׈k٠#BlTYj|f_U- ringea^|f_z]Ch͙|ٜfD@LC^(9Sm1 &ў bn'qnMң0/JxWsͿz 3bVC=|MXjw@ѵ0)cH0~'Fg7t%#% ,κhߎ9뇞"a[ǝa3ɩ,*k'S"^dv"a׎Z3gh)QFloOVz6G}ۦ{5<׷&12+WپAvF6A YDqieǠ+>Jc|j5|.ܻʷݾ<€[cfmDJ\:A-FvL{`)c"9: ¯s>Nső6p'aӅ(ju@Ё0]!B؛]Y1M_d(؝}~UzΓvd-]eA.ڇѨ#VeE#E*-5-Rq\ufcYфqG p]}~HcD߫HšB!Sx t!64Źbn'aR֐.Jވ $99:]', "Div!Kurt ֘GXV4a-QV ,^{UY!"UfyyU)ABϨ})[ɔKrbu]#x(\:oTR7آhGLK !<r}?SB<4<35U֢B$Dt0#K-iXY$C! I>B!B:Q:!^4B!B!DB!B!B\$q(B!B!EB!B!B\$q(B!B!EB!B!B\$q(B!B!EB!B!B\$q(B!B!EB!B!B\$q(B!B!EB!B!B\$q(B!B!EB!B!B\IIIj]!B!B!(]P!B!B$B!B!HP!B!BB!B!T*2QUQ``dRYpM$B!B!++3= s2:R##=D M \N* !B!BWZO042*T$B!B!HP!B!B$B!B!(B{.vŋDEEQ|y\]]ѣ+WuxB!BZ>NvHšBrgΜaʔ)ԨQiӦi&Ə-sܹsQ!B!^ ?Hr\ϝ;ʕ+|}PBu}.]̙3ر#SZ5z-&NȒ%KwCB!BW^vN6bMN>={jr}>Xt){qRؽ{w޽XDAAAC{{{3b~gtZ5k˗/s'|sp6měoosdtQzr]O#G4iҳL 裏t钮ΦgϞDGG:!B!򕖐ڛlvYw0puK=fg.y.*55K82dݺu_T)SLqo^&ܹòe˘7oC{'$$p=mرc;w.yzz/0|pqlCCC9åK8p`tЁ?ejժŶm8pǎc̙( Qڮ'%aԨQL:[[<翎B!NE'~TndM^tf \ӒuCN0puK)q0z:6NTk=xiQCB4ZlYܛ.8uЪU+ؼy3899 ۷͛```V)))cǎ3-ZJܼj5 +++ի_ի>}zU*K}Yt).]~ǎ3 z޿dlll \lٲ$''?u]J2kQڮ'%ݻ|翎B!x]wyoE<{U[sd- =W00~:*1n8ƹ10o92ž/J'*GGG3tPvؑ|???6nH\\9+pEϏ瓙̞=*Up!222HOOƆPnJLL NNNDEEyf-ZDJ/ 66V>www&O]Xt)FFFÇ4h͚5իLZZ.mڴ?nO>L:4:t(ǏgݺuiӆvZ?Njj**UbTTA1qDj׮ )STf?׬YZfȐ!:7ccc<<<4CZ?>c{n_f̘˗8q"+VVV$''3h ֬YN$r jԨ27nܠ|/PVX;wdȐ!4n85SNJ-h۶-ׯ'11}}}Ə۝;woG?ǏtRٸq# . <<;v,NNN=z[Ã={nݺ|'saÆ@N;zq6mDDD&&&xzzoc``@`` ˗/Ԭ0{m 6lؠ0ѣGӪU+ƏO~Y&˗/˨T*իǧ~|ZU*vb$$$PlY&B!DQy~ &e86ɻ(. bꖹQ>媚5-kTkEѨloCCkmCjjv@ֶsi} TZE򺔺K.l2ƌúuhڴ)~m֭[~\ƒ%K077glݺ3g5ÇoYd -Z &&Ν;xb&NHff&G`ժU3}tlق7={ ǏweΜ9 :ŋ $zY`Λ7VXy8t'OԬ֭[TZ3l0LBٸqcLT\JUs VX‚ aWڵkQ*Tsyzhڴi<==9u@ιo)cΕ+WHOϹcmm/Rf"i_JsJb۶mxxxv4iڵcݺu5\KLLdԩ|8pŋ3~xϟOʕ5}2>v6m'99Y}3f ׯёUVi楧3qD6lAXx1*]x=144]v>|X3-00իǥKXp!|֭cٜ;w͛7?k쌅AAA혚j^G]!ԯ_d5kƊ+Xr%j/$$ӧh"bccٻw/UVeƍ,Z(W5oIMMeѢE]OOOMo?ؘ+V?j͛7sLOXr% !B"]011fɗe-:ź7S5扼2)|w9gO,s_+,zHbС0:+:D^O{,xC %t>ȵ#EZ{pƍ 82lذ.gu놋 ݻƃ;~z .hDΝ5/קq\z,*V-Z9YRq9|2 9]V"[X-ZT5i҄tsܽ{,M;wp5tЁSNiiffFv4xCDVu5'!,Uk|ߍ=5S3BOAyMZo8s[ok.+-STkm/aW 3);{H^bϸՋ7x(\g4RI\\*U*8¯K,QcO affJЅ[u?7QgIоo3J=ɱ$Ǧc_ے˃&WQeQ`Ş8455 Qtԉ7|*OH95EPPe˖}fMLL([,5^Qk믹>subnnڵkM6lfee5޹3gX+VT* 4355N:;w7oRn]233ٷo:om IDAT'_5XXXPz<.?l ,--)_S뼟5 qضm[o߮ibeHӦMcڴi[/p\nݺq+֯_ϼy1b)))ŰE/;;ޞtV%T*~277'!!$MxV&))&O!?/T*Gk~ӦMٶmkFTʍ7z*5*]*5kRL6mD۶m]iǸF$$$pQ@:7?TXn<<<8{,ޚsѢE Ν;jLMY۴iS.\@dd$UTԔʕ+wBk^{G0n߾2oݻ5UrѬ[NL^ @XXXаaC6lؠu.9r333͈9}?~P|'''/_Njj**Zjo> o'}b͚5gpp0>>>/B!S4 Uipa]{0)?i:[*=nodS̾ݗٷ2+/czpt4rAZnM|||LӦMy7xKp/r[z5WڵkG.] lNܳgO,Xg}95"88X3ݝ+Vп g*UVL===ٴiS͉vJ%M4!$$D,͍M6uy֭iZ/ΎkײdLLLpssZ\uNNNdeeiU6i҄7ҠABm ???ƌ-[j]뉁[ҥKZnnn|,_8,,,ҥ ]vr=zf,[[ۧΒ%K4թSuYfȐ!,_+++4iBRRR^3|={vy&'Nd՚fժUc̙擯ɓ駟8pt҅kyغu+SL!%%;;;ƍoB!ٹ-w1<=04#P8zJw?) `\}#%gb.*+k[ܬ]%.43#5߿?\BsM{<(JɓiӦ ^^^O_X!B3X+RM ?C9s07TRnY:~Vjm숺m|J9oum ҾuTxU$j',,7:WАUV:WSGDpYy3}_ٳH߽֓PռF"Y?N/C)!!;S~4hp^k#GZZgaaaزe+8<|0O]Օu@DUPΟ?1..UW>iDGp-޽{SLLL;vo?/࣏SfM֕юxn2eP"uaXXAd:to5̌ySzn2WGzȑtvK8eee1yDٶm;7odqL:=4DsZ0 MիDGGѺu $uv.FJɗ!v(_QQ(3I/C~:ԩ?,u8jժӨQB- CLQ*dffb``ﴴ4ߊA\*cbE)VdNQjUTF133r\zӧhR].m /7쳱yoFx$$$@ppO)[âCtЁ ڵ票.m222:u2FFF̜9 ===jԨĉY`>k׮uZK˖g~W*qx%~GTBtt4{)ޔpa1{^؅(}̕+ ^!$&&`aQ[[;\\\t+eƌ {9={Uܹ#G ã9IIIZ 7n 55O>Iƍukذ!...`cck׮_~13gb%$$p jԨ4ڸRIݺp >|Çp17lpͼǗB~d|W6oCǑi ť$ CFF&MȈYhurSݻ:ұcG9LFFzfݻʹ˗/xb `˖-<|cIMM#o߁;rA}:peDMPS׍ aјw]$  99;2b'?Iefb={?t~e% E|KTbbb0!n I!>>^wff&M\lFհCXcʔdɒ,\L>~He#111I&lRN:E֭}ۢtտ|Z_l\~Kc/{U*TAmێ3x"}cbbXr%O&!!kkk&NX&{wϟo_v>,X=|3ccc_x/_ON>Ջ>셷2144`_ kS)37nXe.,lllHap7266<;&&S#}װoƊ+XpaUޣ|G/|wXZZ? еkW:u*s~ve_1cFP(Xp̞= GGGzU"!Ҿ}E8_═A #SBLR3|=wgu0++Cjh߾3ͽJb4lؐ_~CCCnܸfAJbǎ ʕc~JBɕ+WhҤ m۶%22Ĝ*$.]$#"qrrݽ)>>>OII)pYkO_VՑUV0\Vʙz3_jONxJk;LpLڋ83U խZ _aiHׇ5jRbNQ ;pI~:F}ݻzJQ\9ټysׯӵkW 9rrvb̘1֝ڵk߿?{fܹMVV?#o6]veΜ[cdooҥ?reƌҥKYh1jkTW}Wہ޽;.Ǐ̋fĉt҅z۷Idd$/^dȑٓ>}LYAv_~9?Sl -Zp1>tK.a3|2p-[ZKiY<8|Oü8bgN}0l5?U9;vUg6mƎK=4hO0o<֬Y4OYz5ƍ{d׏]2~x;͛LJÆ 9qfS֯o3gBvvvM&̘1S2c $͛75_/۾ڵ'O2vg4kL9ku/&N jVPV3glbccr ]|z/EFF2`JjHƖ.FrLAadkÿ@9Ŭ7ӱc'||w ϿBRTзt===:v޽{%%瓃x96AǷ}_C9oZW 2[ɫ~5c8:VedR2UO~~usEjOz;}>uq_X11ќ9kp;y9rXӟCX~'N믧纎DOO3g2m42dkիg<==Yz5*TÇZSR%ۇwmnذSNl2͙={6+Wd̘1޽/n: uVcVښE0ud.*Uh* ur4; (+Tzz:gϦRJ=zo-Zh&4|2e cǎm۶~TZAr1cfӧsy+++LZuţCyOIIÇV5 {p> P܎J6IO"*ɪj5jC ԔlOf̘kg̘11Ν;se ~Wʗ/_5%/.] 2X @fͨSϟgŊ̝;urKڶmww1|WΖ-[:u*V?d̘1tܙ.]9EWZ⫯>cΝׯm.^[[[fΜIzzz[t>\gxxHSJ\''`^@BN0d.^=v*-,,5kJCCCfϞMGFTv/%WD Ү4ˣܹΝ;صk'11̝;7ajsI#22:}ddd;?##CgEϘ1Ą<}4,%Ysn(ׯ_?aaQFk^JJ oM`` BqǮ(c22~B֊蹴ĠF'xOo g1my ϸqhڴY&iYzUyׯ_z$%oߴЌ rbOً-[6ӫW{УG.=dM@,vy{8,-ɂT*i׮UѣG޽Ga5,]#?888<Ӷ\]]غu+| cڴiZlٲiӆ3x`ܹÃh&ɬY_~L<1cƠÇɉjnԨT*,-sr=e_Aahʆk[ndee#t IDAT1IIIDGGիWo4}ޏ9hV__۷oIX=Rr)))ܼyT>|ѽ7?UM\RvV9}r0TBZw;v [[[jժ8$4.ߊFbb"eʔɩ~i0.. .ҴiB==~"ߟT' ) H*U'&&&ߋwll, ŋԯ_UZUMY-k۠AXvmϫFرǓ­[puui\9;jժ8gggGTTT#""tRAi?LHKKcE3V3o޼oeZFI}ݻ77\ICE:q¼<?#q:i>_o`P%懓Y6M[VbRf- ;w`ooO$|8Cӊȇ.hh]oذ]м_rxӥԷ3aЎ,\2Fvm(< tbDUʏv UTyٷo̚JR8q~7-ǏUkX3`tg}Ɔ _{|w <|\σIII3e͗j T*]t!..cRjUFo#}}}0|p,(ol8MtJ[PVA6CląypA">,ie((Kf T(to#@s9 Wq}'͙󺮛$ƶz l+tx+)Q2mæn'l-|l߾5k퍍 )))d?Y,3g}CeȐ!1"%5ȏ1ŝ]vɰ(K++#pzjķbذa,\jժ9zhSSRRhҤI~~~PBNNN$&&Z WWWsT'Ok׮gmccիWsLů^Jpo}wl/jnrz) e˖ԩS3gZf̙3HPPPu<ӧOE.jҪK|x|QJNã*$::: 9СÊ<'c4_{bŊFbĈ\I&n:)%5ڲe33o~pnŃl~Lk|-l`(}B*@0CIYd$u'ڶmˢEGdde肛U\v1}׵of+tRҹٻw/Ν{!O*WL߾}4(ѣ#F`ҥ|L< &3gfϞ] X>oNZˍ/KfX+7>郃xzzƆ xHHHkŋH=HLLd̙ʱUuaŊmQR%--/\իWX_,*mР̙36uKlׯ_gb2 eVHڵ gg4P5AA{IHHc{.Ӻuرc;}- sR UZu0$v"~FbtT(_ܶ'lmmNVˆ4Tϒ4`J1aN3cJ3vO=(؝l} 1aVv6,q.%)Y?ȤIH۽{Kv--xM?… l߾nݺAXX;w[ne\]]p+Vty߿?ϧN:V)ѣ/fʔ)TX/I-8|0^^^T\͛_Z&_MqҥLɷ/3RηCKEDб 6C5&)x/D]^¶qSRRFђ4Yne ҥK;v, |?xrZnޖ.k5ȏwZ7ВVqx; |1cr|ԩ˖-c׮]{、믿ұcGFc>_:u/m۶w^ߐ~L&ov?MfѣK.YfԮ]oFʕc-7>nOHY \DFS~\ [֘ڵkǮ]x'qwwsΖ䒽=o6seT\cDzsNK/dƌ+Wm9dsXwpHDcf=XXzW_}e?d_/^̜9sprr}]n>_ի⋤rҳg\ ҭ[7lllX"-Z` OuFtt4/_!CX6l3f 00ŋO3w\6oLJh׮111yƿo>f̘:[a-ܹoRFsf.]:#G6ڑ#GJLRwǼ+Ա͘=˘1?.Dn/&O~8K /J_[deˡCpvvaÆoߡH#O?ƆkSd1 gA".6n_"eݳ7 I>BTPx&*j"kFnVS5"&G~9Npʺ'7aNOG֙sC([ &2.W_٫Dۭ^Ymٲy4iji| >~m꒜A근0z|a9x 3g_/zreN#5im媘co`S"`7h^Nǎ_fÆܫ z rJ>hРAQrsb8+i&SOQd!i("wnȯzvF<<2`bկACNqB> $l=]APRJQve<\iҹ!?;# ԣТNek ;jn~8{{#yGHA8qojQq)<ݛҠzzskӼHKMM%11ŋ3rR4,*`qH}bŦiGypΝ4oޜ *|iB.|LwҰ059 tgϞ%.. ʖ-[ aʔ)ZU$+WJ-svU{q%j38V8hkx7{bpﴶ잹?6y&mHLG(ixhwO=7|}3yi0 +?08aV%=ys,7aݟyc+oRSGV<-[h"z̀|%]ډ`2I>Ïs0_+{c8|0'99wwL9v7';6iE;9JI Ύu2wbVIܹ.iإKc)-_38V(/2’ciSšDcJk.ڶmKn[.u-y"ݟH~G%nrf{'#idPDDDDDDr4ZšvҤIv͡C=6n8GGG>#6l/ iii@zQF1fڵkG.]8qFSNw}Zam;YfԩSyWg6m^:C ʕ+Oヷ7rmLU oṽϋHUEN:1a:vرcyרPeI&Q\9Zh5kXd ۶m͍b }QmƟ<;vdǎ4jԈW_}͛vڵkvSNf;֯_OXXÇg͚5iӆW^y)S'h"8{,񖄢HAT)G%_mD^^V3 ^[Tq(""""""9)1k <_|-[~L ܹ;vo>>Nw,cǎe_nK.DDDШQ# =Qd5jk֬SNxzzҰaCfϞi׮=mڴh4իWյP;u!Z y9_;#sM(wiCIY(EZf dذa7SO=ҥK)WΝ<<<8q"QQQuʗRq?!!!_0rH֯_dbʕY|e-[GJJ iӆ͛3pƍITr, g1v/9źgby,y)4ơJXW^yAY*<==YbDFFr~/۩^:wu۷og<TZ~ڲ~dd$ׯ_̙ñcǸto->+RE'x]ӑk/0O,3{gnvϴ8hVe)5;ڵ+iii,^c0駟سgAAA2ds̡yxzzr!hذa]<#L<{R8x`˃>H͹t'Ns޽FQbE5kFDDĭ?IR&e$  ӻz'o`lKjN?ϋHUcjr7ʗ/+? ݺucŊ2a"##Qes%ڷoOZZ7fwA3p@y,mM6G!**jժÇ3|plllhѢK,)p|Rv4Yֶ5ơpl fXLW!lǎc?~\[RJχҤIB^DDDDDDJPq(rL&xygu}H!<8hVeرcT^_n 4Ѭ%æM0w|TX)tVe)^e}Vɓ'⒩-667xsҹsg݋S1E("""""RrhC2DcfB@@3fСCL2C)4ơHRV8̏SҲeK>c\Rለ;U!8Ɔ~$V^2k׮W^T\|||x'8y^pj֬իWgќ>}:_q]zvQ|y^ji7|WtؑDӦM3gIIIٶyfʕ+GXX;wYfFj֬IXXXbE""e*sףGٓl63fLtt4&MbΜ9ݛUVѢE oߞm{ǎoaȐ!̞=Ӽys?k<111ݛwQR%K<?0FӓYf:u0ezMJJJmőĖ-[ի͛7gѢEcJ*!euVQ;w.S… O>}:oF&OLǎy믿2M裏b6 vږ~'re4hc,׏~w)ooaÆeZoٲe<,X^x!v'NԩSy77n\)sTq("R0o+Vڵkiii̚5 ???^l׭[ٳgʕ+-v~cԩ˗gٲet)4hlܸ1Sd2;0rlIC{-Z|k IDATݡClOhC2Dc-%%`;vdȐ!ذm6K[ PC믿i&tر#9իGHHHk+"""""cԐ 4͖`|s["UDDn9oYCƍ-3p~~~Vqqq#ӄ'OޞZjh*wf9V$fL2a&L`u;FṬ+W@񈈈He"C^I7nXyyySt! .P~bUǡx-&ewxxxnʕܿq{?3g4fbvfΜInjժْ""""""a&kw5ٌeL uy#7k_)kn%CnIY{nL 9'''^뺗/_T)_7O?塇gժUwvv;w.EDDDDDhcmC9}4$%%l&-- DZZؐ6DKNT9l6[rj/k>ʗ/O-m_9w5o bi!))W>oԩSs̙mSDDDDDl2*2n)))7|ooobbbrfVvڜ?>*-cb2ꫯv0L888дiS>cRSSoGr""""""_%nÇS^=.3j(V^mvZz쉻;SL̙38p3gPn]FeY6<<իF 5j˗/'"" ߚ5kXd ۶m߿ߒЛ6m&sO?gm۶%<I@@}e*U`ggٳg-7(P\x N:E@@@WڕZjgj;t~~~9.߯_?*Uıc,mUVOOOvvvx{{3f|A&M6ԩC=!e*EDDDDD$J\š=祗^/űwL˵oߞ˗/[1b=1110}t^Um_ϘfZlCJ 29sX:tcǎD.]6m\|2Van1L&ƍnj3UJӇiӦHjj*7o&.. *pi1LVP|y֮]˼yZF%g̙ڵ8vܹsyǁg…DDDw}G\\e2H$55'q58`* +Vnݺ*UDӦMiР/_>q?&ɓ'Iǎy뭷rL0fF#Ǐ{}0e˘/ԨQg%k̟}wfҤIn={'|2kϏիW[xغu+5">>>׸22q;v⌒Rq8|p^x&L'< 3gΤG@zw͚54lؐjժxb֮]KJ,pssggLoٳyIHHŋtԉJ*O0}tuVh)*EDDDDD$ ׯ_ϔ=ٹs'Tfl6[9^zc~MKNcŊY&lEsYusel =44_bzȩ=,,&M[""""""R̙3y'4沮TT82Z{ 7W'|{l2ʕ+Whyٵkn:O8?TV^z~ie2߬"eMnCNRpөSPuVƎ[ܡH!8̭0ˢlٲ" ĉ8qbUe]JŒZHYD(]''|Btt4iii$''[Ɲׯ 4(}YV-Zlmm1Ԯ]ݻ|[S×mnݺcǎ/ ;vp˲iii3ݻ1TVAYdƍ,Fƍm=ޜ?~-[ЬY3tSXfMxqqq+TX}I||<TXll鐒G}DLL jDDDDW*+EQšHZ1cΝ;0aB1Gtk6l>>>$%%e/_θqDNjj*UTG$''駟DNҥ%Yq<=9s{2n8Yf ׏g/PF Ν;i>|ѣGDjj-% /_~(2%l֭ɓ-CBB_2% RRR0L4 HzժU<3$''cccCr8z(7wa݉d2Q盈TVXCܕCkΜ9Î;=z4'Od޽CHHfӿ_9|0-ZЦMY~=/^RJQjU;Ʈ],ٓuaèQk֬Zjm6߿? ,СC4oޜ(6mDbb"iiit2ɓ'駟HIIr :-[|2& ___z WWV0hժF۷/@z~ԩS2s/Mxx8[ޞVZ|pYq!s}rޑ#Gh֬%֪U+;뇏=Gɖ8ܷo?NNNު3̙3Ç=܃-6luw{s 4`׮]֭[Là zSnEDDDSšQTq(VqhMn7?uNb/B=ضm*vvv$$$[\QQQ,_ܒ8brYnJݺuiҤ ;5j ))'NXwacc@z{ԪU8.\Hڵ1L]'|*UpyL&+nnn<L& ?N HKK#**QF… ܹ3cƌȑ#2n8ѣ[g}sػwoL&'Od̘1TP1&%%qY  իym/::nnna6Vfoٲe & ??|MV }Kj<}49IKK~vڙ> .lBDD9sHőHi-qh4IMMUšJ8ɝ*v)]Ɨ_~ w֖u7Ю];իڵ+J*e;֖M6quRRRfɒ%뛭ki^Ұ%))/sNcA*UY .))ɒhܸ1666T\Hf̀Dk,U\???6mʦM޼~ׯA III8pR_Y51n0<3͛7nݺűtRUFÆ O^AsZv]vVfϟ->>> 80F-Z~xU+""""wlCggg_C)Tq(;Uz|f X8rHΜ9/BHHuܷuQNϕ+W/pwwZjr(~Dxx8 4n#G>r.]z]v~yʬ圖˘s6ld2ѯ_l8pooo\\\~~LL nnn~6Fpssf̴[ׅ `ȑV1 >|ǐիcjժ+Wsׯ'>>aÆeKȦDqa1L߿?_~5kִ/фY*9oEn{xݻiժUqA7|CVny3d8twwqƜ?7nC)5Tq(Zqhcc)Rren.]+>>>^Æ >;;;v튧'+W$%%z @׮]Yv-K. ___K{l۶ Ti" e7o` ))~gޞ+Wb41 ԩS#GZdžʦMΎJ*1|p۷/0Lx{{3h t͛18::2x`ɔza֯_O4hPazmf/^?ɉ,UrՕufZs5jDDD ,֖zYf3><=$&&о}{ZnM>}Xv-s={1k6ټyڳg =ʰa"**3gZhcccu"nݚUVY&n1 sSDDD 2\~=7Cl7nn+DJ߬aaa:L8{Zf+))Ə;ϟgӦML0A s'""""rflb+ť@]DR^ov&!v)<F]M[NDDDDpd볒6EJ"ͪ,;ͪ\rj.hJ7=w"""""_EHP$w8ʱ0))'Np5HKKl6d"--ҵJ$QšHTq(""""""-qLpp0ĊfUB*䮬Ϊ,""""""SHNNΔT9ɢ$˚ 8_5]9Hٕ-qx5l2RKJ2q(;q(""""""-qC)Tq(;UH~eKfPšF8ɝ*EDDDDD$&Uq(*ErC/UE"SšW8\bN*I馊CܩPDDDDDDDWn߾͛7SN"ٟ~8ɝ*EDDDDD$JtaXX>>>V1pM IDATBIf+Ʋk.|!%*EDDDDD$Jl]^:>(~8-g֬Yח$T0`.]di'00Я_?Q]{BIl W]v… }RPDDDDDDV~ :aÆnݺT߿VZ7o& .aÆxyyѻwo"##ʄ Zj}:F/RjU>ѴiSBBB8v 7o̗_~IPP,^Pkŋx뭷ؾ};5˗ kJB!A-3)[?uV/_Nhh(9YEEESOqY6n/)} Pzu֭K.]h֬yݲeK @@@ ̚5+kJJUH~Ȋß~SZ5|A|?~x\]] jժQ֭[߈#Xr%۷o,YѣG?le˖888Z×q={رcGݔsRBN>Mbb"͚5cÆ \zkZM?=:\T]2i&>>4)q(b""""""P ...t''jӖ8@C8WWW\\\& ye?NIIɝH,~XXX`2.U$4>VZI6mtgF'r81OCiZÆ}%iCơ4u'\?xgF'r81OCi:8,**ĉ\p"(// DYY...wc"fiCơ4Taqq1~-FajEI-iKR,u,-C]EDDDDD5U9%%jEE '81OkHC*^ptJjIc5E""""""P %%%JJġyJHC*VRP"%ESPDDDDDD¡)q(b""""""PJJġyJHC)q(͊")q("""""" ġ4+Ja~zz衻=k۷/[ncL8EݢPP%ESƝ9sVZqoqq1EEEu{w?Z(..>UDDDDDnF8߿?}HXw5j$z/_H4)qxJKK)**I[XXxSu"""""r(q(JsI߿Ȼ= iZj_ 777^xN8=F3hР::t@ڷo?W^eƌ̙3)))`ݺu3}t\\\ $>>z:ˎ;4ixxxdɒzsprr"--cbccӧٺu+}un:֭g„ ?Aضm/RZZZmuuӇ>;Cpp05RRROu("7$oVNN/^Ðf%&Xt)G!++0e۶mF?#F~O?K/DRRIII$&&rV\ @II qqqKHH!!!$''/̔)Sڜ9sHKK#99\Ros.]ח۷SRRB@@ټ{\r˗3pc۶mߟ,"##9T&L{?Naa!'N0رs~zrrr&,,8V]_Çy'ذazb׮]ٳ,<==*ґgΜO?ԩS̞=I%WZE.]С!!!;wo=zl2Nnݪ}x衇psscРAc郧'C =j˗3yd2d رc/L<:vݻYb>,| ;v'DGGON~l:rgġ#۷kkk@DD1?//xm_72|ڶm3ݻ}1{l,--7nY;;;Ǝ9s Ʋ`<<<`ҥ\sѻwo,-- 4c=kFi۶5޽{7={dĉb ֭#**!CԩSڵ+v:uP֮]˨QkIpp0VVV̚5d2{鉧u_KibCkkk 2330RP" ?>iӦQXXd"""cǒٹsMԩSYz5Νݼy~`޽̛7JKKyꩧ%''~] iý{ /3i$^|Eb]QQ?'NgϞʧ~j|hLu\?0sÆ 3粶&++XawǏ͏?x/GKL=cǎh"ù|2׏8oNxxףٲe ?+666deeW9Td2o~f}5cJU Wi|||̞?xW0axzz2k,ڧC6m̞4\I1ez+)..6k׮Z{ HKK3tT5p}UUu 999ҫW/qwwg֭beeŎ;Xb{Rƚ8ziӦ <3 0޽{3}t~MYYY :7XjjÇsA0dlذ>(׾2w!5vX^{5Ξ=dرc$$$\1b111dddpq&O Pg7r|re.\@׮]`֭׼[1|pkKxWo\|UVJxx4{l  (++cܸq]$̬6M\DDDDDn^I 11doرcvJ@TMLV]k‚W5EEEl޼0dΠAHKKg„ |wl߾GynݺߓMXv\s}>裌7'x={HV2b~߳tR|Aoy6KnN}Iowҭ[7իQvvv&--RJKK),,}@ź^|򉦹 1~k{sзo_IPPPi/[e˖۵kǺul;yj}V[z֭)**6={4ߚnǍg,gyAco5M6iӦչʊ3:wߌ]\\8ux޼y̛7s][16q8rHpppۛѣGL3f;EVć~G:t|Ib…ʘex3f|}}9y$6 Vٳ۱d21w\<==>HU*++3,//7 75SN[n̘1nݺӻw[v\>U%fnOOOor_U㮍v[p!?CiToVھ};w^c=vSfrU,YzE"wĨh("""""RF᭴g}Ycpn,YcǎѪU+H\\\6MS[PNkkȍph.qXecq[~̎;[~\9547}"""""""-WSk~xv>LJcU_ⰾ"-C]EDDDDDjkJˡ5E""""""PJJġyJ6ׯ硇èמ={֭M#%%;;;oѨDDDDDz*Z[W,{ġ4EJ;s Zwb8{􍌯R]Tp(q(M")qxJKK)**I[XXx<iYj}||%iRPļ8|͍^x'N`ooOfff 4"00իW1c>>>x{{3sLJJJXnL>筷ޢCc|&M+,Y~\HKKcرpicnݚ>}Gyꩧx79r$m۶%88o>/^Hxx8ߟGV 7ި ^{ ooo0aK„ HOOgԨQxxxйsg֮]k8q"/o߾nݚk^3[¡ ݻwɩڴe%)PPļ8LJJbҥ9r,חm۶>CFQg@nn.?/III$%%ȁXr%%%%Onn.!!!Ljj*/2SL9s搖Frr2 \r~\.]/۷ovܹsY~=999DGGfQRR믿γ>K^^aaa?Ωs!==D?kdСDEEq9}]-[͛xYjIKK{Պ}L4b֯_Oyy9t҅Lv?o5Yt) ,ɓ4""""""5*ZXXJ>}8p lݺ< }]6ni۶-DFFw^c}ٳdܸqf;v,ϟ̙3˂ K޲s˺u눊bȐ!8991uTvʮ]6SLaذaXYYO?qZھ};/2<ƾ={2uTĉ3__~(wILLѣ,^kkkuk%CCCҲ5(mڴ!((ΌN:)q(b^KLGLL AAAFa,""222سgݻw'((5pE&N~~~,Y;;;MerUVXXX`eee</^HQQ޷\뒞N@@@ggg+ 憥%.\lmmONNNII{{{f1eee{u6V EDDDDn j~xd2U۞ce.A["wQC^Uȷ IDAT4u ͽOѣG3zhbcc '77@G\\9fW^k#[l??nj|ؐEΝc;՞{ij~B?΂ }cǎ믿f\|qF5j.~-999K$''wqqa˖-|-ZDAAǓz]DDDDD̫sßKy6-&__sz"5iCZDEEѦMشi['99^z;991g9r$˗/cǎ"""8|GfYMiiizjy`ԨQӭ}}}ӟ/,"""""4add$SN_SNk׎2گ4}!qxI6mNNNtؑ &\sȝIII,]#GEXXm6݇~Ȉ#l?`RRR姟~ॗ^"))$9p+W8%$$IMM_fʔ)FlΜ9LBBW\J.]dΝ<|7@7|{<:ty0LXXX_ϯk}jw_ɓ'矙={v0w]JMMe„ r c;;w.ׯ'''hŒP5*//qٵk*{!++ OOOd3gO9uT&""""Ғ4ѣGINNf֬Y9r)nnn… yڵ+SLȑ#5OJ3HL&6mt]D8ttt}amm0n‘G||<ƍ?>m۶ٙHk={67r֬Ycǎ9sbbccY`t>D=ŋ[n >ZJoʔ)<#XYY%/kkkF͏?XoկaՎ{=ץݻٳ''NՕ+Vd_nQQQ 2'''NJ׮]ٵk5Yaa!FbĈ7Ipp0VVV̚5 L&xzz^in]0)) mSO}vΝ;yGpqq|||L2͛7_Ξ={nj CGGG6l̙33fL -1qG\\111k.p@FF{{۾.^ĉϏ%K`ggg6oժXYYuEs=s eee{Ƙ>k_~xuV~_ӭ[7&MTmUˋ .CCKlm5OOO' ~???y ɩywqJaaѦ""""">4\t  `$%%mٲ'yǰޞ￟#G舥%<ɷmrw5!r1<<<ׯ[li>jI&ݶqJPƱcXh\|@G\\۷o'<kЮ];l>3̚5WZZ999i̕i]ϏL&P:tٳ@EJ#,,;wͩSxᇍcmgggq֭zm]!qXÃիWyfmо:d|XⶎSZ8<|0Te/"" 6g;;;caaCbرcy8{,&cǎpcbĈĐǙ>kƆ ʌiU=>|SNl2{:2|pkKxW8y\|UVJxxkVgɒ%<dee1n8֮]KRRdff9ZDDDDD*41ր77jz)vA\\&L6 KZƒ8jȑ?4h'ڵ#㔖%&---M6DEEi&Zn ?Nrr2z2ɉ9sȑ#X|9;vw888灊)Uӓ+իWӦMuСC ߚǮݻ9t^^^oߞŋ)>[[j2d?8ݻw_~tԩxYp!O>$}w޼+@g[[[,--y]ѣ+V ,, ///JJJ 5Idd$3f`ҤIwͪٳy橧"::PZn<@bbb """""`_z#&LPfS9V)m}*vbʔ),[1c`mm͗_~Ihh(EEEF={beeE\\[nƝ!_}U yn阥q,_`===~+ :vXڶm޽{1cG%33}VVVxxxPPPPm O>%Kp[:Ni{?Ե=##=zܵ ]taʔ)fo%"""""Ҥc]^CmXhh(NNNk̚5 ;;;YjUvǏgFPfTۡ]vرcaaA>}عs'Իŋe<"U5-;z('N0~$""""""Q&*""aÆbh CNpB>|""""""Ҩ4ᵔ_Xqi CLbbbDDDDDD 5\YdwUnɓ'ƍ-.Rbk ]E#sH$7nKġyJHCYֻfq#Hԧa}EZsHUlP&qY ,Է]1~k\JJġyJ6ׯ硇jPٳg3mڴ[ַ/qsɹL8ExDDDDDZZC'/{ġ4AJ;s Zwb"_7<"w=2bJKKo8j<"""""-U=ZW|ġ4AJ+--&o׮]Yj۷#Vܼ+QP %Ek_///x8qdffm֯_ϠAl!h߾=\z3fヷ73gΤuqqq!00xz-:t耯/;v0gҤI%Kלcǎ1h ڶmKXX?ٳL:o޽ʐ!C(--%//'Çٳ8rUVWX5jtܙkd2`:vH@@6mٳgӾ}{ڵkǰa8qℱ~`Ȑ!iӆ`?Ņ-%%___? /pk.""""\*>۾]ډ6U-+q(M"aRRK.ȑ#deeFpp0l۶h2bĈ:0rss駟x饗HJJ"))D8ʕ+())!..rss !$$dRSSy嗙2e1wΜ9LBBW\L&¸8}4Fb׮]R1LL4~ꫯbiiINN "%%L.]ěoYw}/SN:U繉57XXX ::+?`/KI[wHvYd2ջ]Hh}8::RXXȾ}?~< ""[sϑG||#<<<XtukRR))):tmOW_]vOs eee{7ο)(( Vyꊽ}xypvvspqqﲉu&D1邟w<]ġy-1q0zhFMll,H~?'<Sx0`'Odk-|86m";;/i쳴$,, pirss9s&?ݻw8;;3|rssg…Վ?{l  (++e?7V‚sG΢\ υ\+~@nUtWeZ]---M6DEEi&Zn ?Nrr2z2ɉ9sȑ#X|9;vw888灊Up666~lmm`մiӆnݺ1tP汫ڵkqqqos5KKKlllXf ݛ(ʴiӰ{Geզ۳pB|IK޽yWjƆݻws!h߾=/3#$FwժUtܙAիW)ڵ?oooOo 6l@FF+V0szDDDDDZ:jڶm{FƐ8LJJ"(({{?'%%>ҵj*^~~,JHC5!r1<<<ׯ[l1M:GGGcɓ'k=̈́qciis=?bZgJJ EEEЮ]|6r'5aqq1K.c|UOC=Ě5ky璐w}+°a8}9i8jtJ^͛7Mnn.eeeL2^z+pqk=7--Xqww~m233 8CϏ&%:t}qjmWZŧ~JPP v'''.]TW\dߟ~l۶64JHC5aU#GՕ~$&&;vl`ڴi;w///nYf wテg#[cH8cN <==qssն]vtڕ>wy#GбcGIII'88޾-,,g#͍""""""P.qȪUիQPP@׮]z*X[[STT͛OwmfC֖+V0g6l@~~>5uЁ^zg}ɄO=\tuqAª=_~`Ĉ弤yPPDDDDDD%۵kǎ;ҥ :ubܹWWWF3g̘1 8cٓ7|'|;2j(زe ^^^tܙΝ;3nܸx6r5!@hh(~!q=tRVZUs~QPP eڵ+Æ ˋXS+DYh{キSPDDDDDD"??Z)(xnY1fNIF2knOOOWZumȠGwm""""""rw7ġh,CJCiFơh k4fZPDDDDDDJCiV81OCi(%YQP<%EDDDDD8fEC8RP%ESPDDDDDDvᰭġ4MJġ4T¡e?ġ4MJġ4T¡3OJJӤġyJHCNf0ナ}=h(q(M")q("""""" e]sVC( Cd*>DHϿ#i L&SEZ'""""""rJ^+bfL3NJġ4Tk%QNv7x*Jġ4u'cَCwft"IC83qsЏ\|MP^?nW,%ESPDDDDDDV0UZ W*@}UdƯ$U"R{?Ե]DDDDDDZZS_9XXcƩf12AUv""""""r*~U,j<iơyZPDDDDDDVKW(q(b""""""P GCiz81OCi(3C%QP<%EDDDDD8fEC8޽\b洅Der>TCo9M×9XI(TR?4Ґ&c]~umu3v=usz}qzf8DBp!,(RH8EE C5 mSTbEUXQݺuM߫W/-[6㏳=ѣǏ۵o޼Y͛77]^aI6iDZn+VrjzrOspy4i]ڵر#sm/[{vZ}Ʋj׮aÆ)>>> CY2qyfu]={unZm۶ULLc1B-[̵4nܸ[:Fdd] r_aJnذA{[FɓfuI~eʔŋڵK]]vs_)))IS$u]$Y,-ZHgϞUXX!B8Zz5m4_~~~;5b=;vㄆ*000zO?i˖-7}XǥJJ,%JMnnnv7nnnSfʹzjիWOӧOECCy.qo>%$$gͲnРAھ}.]k*22n}ٲe 5䴴4Tݺu!Cd9իu]wɓ*[^}U3FW^5jhܸqJII$UVMqqqj׮ڵk'I:uꔺu*UYfڿq7xCjՒ&Nݯ UAڶmt颹stwŋ5ke˖jڴKKKʕ+kȐ!u̚5KQQQ߿5k-[ѣR-!bl;l0TTJu]^C+|vEmݺUݺu3>7cذaԁ_ܑ8UǎS͚5e]ժUSNӦMӷ~۷̙3Yv۳gF׫zNӫW/yzwZTƍu1ݻWF2b($$D[lі-[dԣGo^NĉO*--M{ч~ә3gԧO]oqVԬYS񊊊Қ5ku֩]vP9;V۷oO?KRSSՠAo_ٺu^}UڵK+WV5a}7 ̙3tyuQ>,{yNavÏ>H<ʔ)csf͚"y"q0%TJ,RJ>^zzhܹ Pɒ%U~}cSOjѢEjРAǛ9sOsٵ޽[;vUBM2-vRrr%JiGM.]bQRTn][ġ$]tA={VrJ=SvmڴQ5$I۷ׁ$]cpȐ!JNN֑#GTjU;vدu$lR 4Pz$I-ZСCԴxbo^>J,J*) 5<ꫯtӀFC ]088XǏjͲ~SjjUfxgϞfSHHo6lhz" gϞz-ѓz:sn@mgXTjUPFt9㓐VZI맣G*,,L{6][qW+WիWպukIRTT֮]UVwަx3gTÆ O?iҥRٹ;`-X KP*UsܡCWJKKӌ3ҙ ]Coƌ+Vʕ+pfΜEiƌzFwz\ÇWbbVc/W֭[7|křUXQ/]gchhVfΜ4矚c=vM2`URX_z SDDnl3rH 6L}Q2ef͛7OAAAjܸ?.I?չsgi?~~YaJvE>>>j֬~mٲE-Zj֬i#G͛ռys7UN}G@=JNNvwtG… 5{l{Ѯ]m6KAAA1b:uUV?8U"11ѮSJI7ia&z^kB/_ѣGO>3ωOFg`zz񑮧[,|y'Ծ}{=VgσSNM((,KL:yٳt©”8tjݻX(~Hrs*enHRen/(?EtVWσv@ Qҕ7+s03Y{AYhQśP\='ͪ ܊42P12fCeC0!,(RH8?8!CYY:kO$q!qF`VߟHCp!,﫦#۩iqo+CH8喹DШWh$]ym:t>+LQD l6@q㨓s($KԩRAz4͟"qF`avIkin>_  qF`Vև Ou@8\#q0aӚk:{]f7a#ߋCp!,ΝӘcuUDJgI̝$Q\z,*)99X6(t630u7G+Kofl|8\cCYY:]fLk$fU!n$Hq4E' n$H"q"!CY$Q8\#q0!k$f8DBp!B8>^%Kf9a2d&N*UW=~5؛|lyP “8~X|]fӂ ay{{}yY%$$j(^Hʓa߾}+SN%]4ԩ{N;<#G^pzxKQƍIҾ}T~}M:Um۶UzsNM4ImڴQÆ uVm~muQ<&L *I9rf͚ewΝjҤ$ZjSvԮ];IRrrFs=Zto vښ3g%r0%vZ]|hۼyj֬*Um?رիիWKz- >\7oVPP6mڔh"q0+8۷M;jΝܹ֭LϪUʔ)pjUdd7ncǎi޽Ӎm;p}1bv`}W1cƌcl'OOO}ڹscbQHHl٢-[H&L/ڰa&LǏ8p@GѠA=>nNaJUVZb6|e't]w/5tPSwQuiu!OGD`Vvl6-jԨaVzu9sX5~.]κejڵk;˱M!wY%''aÆF[ZZFp2 $fU\cVeרa.(8X%;:ơkq0+W8t~:q℞z)Gu 2a&Mu\=ٳsx9so߾Yڻve˖If͚aÆj 0!te㻨$-[L/_.JIĨES٣x͟?_ʕ+zP0rSN8p`Ac.2_$[:xDu֕|IuijfR~4x`lRM6;c4zhUREk%IϟW ر>lkVԮ];kNԨQ#OѣGR0!һwoy{{giV޽ "dHq?VZ*SVUjܸ;{*::ڮ'رc ח_~#Fk׮ W_}3fh̘19yO8K_|/_C*999~SE_aБŢAiܹ:w}Q$nذAcǎOkTߚ5kSNi:t?nj_gX,h˖-ڲe-Շ J 4bիWhWF `epH$SRRvJݻc]*TД)S P֭%IZRrr1DDD=jgv[3Xz)_5~5NaNfw?,_\=zPDDc:=^6mTF IRutPϞ=UD cǎڼyF-$$oooXӧ" "1ajt1l6,/TPzu9sX5~.].I*[V]m͜|v뽼1NSO=e}``,Vuy[RvC:%ԩS|`EGGjTRt=ڵk]|n_UlEGu+B9z-s[`]P$޻/K֬Y4zh}GtuV޽[Z9sj8p`UP- 6MiiiJKKj~ܹ/^(==]-Rll-*///3F~w5JjR:u6mdtl߿_{U׮]UtiըQC_|$iϞ=6}ĉ؝ 6Ԇ $I.\кunac*cJc=ŋWժUUV-rww֯_ZիWWXX"""4|<[1t"///yyyjժzս{wU^]j޼7dɒZ~N8 {ŋrJڶmjժFիWϞ=[? {1#Gjذa&LЏ?Pߘm1fHLL=LIOO7>:3;wxƳeK)]6d6q=?Wb)b{]0IOOWzl2w}]gσSN~V+n} eXN W0Μ9m۶)--MW^+"___5lذKCB`VP8̩t+\ԩZՉc>.Y yVi۶m]8fUC/$TPn!H1BA8cagEp!\M6l^]/UG Fp!,8KdHYb뾈`lv8)\(\=W&r %8\#q0+|dy$Hʗ!_HY ƬHH\#q0!_5HH\#q0+6mҦMnLk$fK̙3P"`C5278Kl6홥h:eZe˥Y uG+Ka$VƗIg7vvء$c3OrŁג]='+W8uΝx|B :{uze˖9y <ѣGS*_7nӧ+%%%_XM4J.Zjiڴil^~,4o\7o$}bŊj׮M3ӤI|mUT3< .؝gÆ 9j(:\ OOO 4dXh5kr) @[Ç:Zliw-Wjj1&MI&չsg}ԩTQC`VJi߾}Y.\(ٶmƏ$:tHӦMӪUԵkWY\9~aJnذA Z|/_yh0%%%ѣ Wݕ9]v;v(!!AÆ 3֕+WN~c]zU~*UJ7nt^М9sڵk{1%$$8'11Qsq_ԏ?Z'^z3LP~a}vm6M ,PDD={e3VXpDrssSPP:um۶)&&Fk֬ɕġ$,YRK˺r:9RJM:U_~QFڽ{N:ew+WaÆ.gZ5f5鳾i&\R6mRDDA)44_xM>]ΝsO/H{=)22eCYE*qkF͛UfMURn]vVʕU^=-\P[oiڼyi&IҎ;ԴiSURE<Ο?/I5k =z6sN5jHz[nTBCCuc]||z`ըQCƍ3^LKKʕ+kȐ!Add^{55kLO<$髯Rƍ'xB׮]s={CFgͬYԯ_? }nS͑”8Qrrozժ[:ƍxyy˞ի d?~l7h %&&j/X@Æ _lРz街^zrJ͘1Cst!"8WVb m߿]E=zЋ/xZJSNնm4b;j߾N>:ԩSzob讻҄ mܸQSN5kk޽{zj}ƺw}W?ui[{VZZV"##ոqc;vL{UttO.IJMMU ÇoK}gڼy/^,Ţ>}h̙c髯rsss7|x6mذAcǎOk'{vԩSvլYS9ϑ”8k׮=7usi̘1[j֬yӵl6jĉvkZh?k׮iӦM3gԤI:3y>>Q@@bccumڴQ5$I۷7wVJJFRJN:۷s8s5ݭ(LN:bŊz5}tuX;ZjvS.^?X%Kfyd<ʖ-.](<<\'Oۯnݺ^15`ڪU+5mT3fȲ.55wʔ)Ffry;C&MҨQns%yzzҥK-Hr,yܼ˜8-[ڿ֯_(_bQZڪWnLɓ'l2ِSRR_+We@rիrpps%?SFݍu9sFtiEEE… WΟ?oqPP]͵k׶;V ^js=ژVRRq_ϖ+:Qڙխ[7G8sonڸqZnp]~4fc󅅅iYݼy^xc/4ٳg+<<\^G0aLWxx>sr}n믫iӦzgڃvI>SA4uT >З.]ĉf[wv::s<8j_E.q(/utR/,cY,UV4tP;w$&&)R`YbZo)88i]UV$͜9S 6O?KAvX.\`wXƍCi͚5zGL].^hזNø8-_\QQQ9ϙ”8tK*UM]o^2>7v\/_8Ojѣ~Gڵ|}}s5l07nbH͙3hQJTLS-Uf͚I&uKӋmڴQDDƏѣGٕ b կ_tQ޽rJm۶Mt͛7O>b'OTZZգG-^X?$̙3NӉf|GFkܹTjUjj̙JKKӟɓ'kOjљo:ҵkWX,ܶmQfW^ܔK0/ڹsܘt$==]iiix֭[N:_Tz$]OY,Io>z3& rۉx ߿Mc̘1ѣGbŊٳbbb*b}vZhf͚٥G]}h֬Yz$]Wڵk4h_ӧԭ[7c{L͛7֭[`I;n֯_ZիWWXX"""4|pIȑ#yf5o\ƍ3htYf5jڵk-[jÆ N&???5iDݻwWhh5j(=C=zq̘1C^^^5g_ѣ3:"׮]իWK>ߜ9svIVWFteʔь3쒨ڸqj׮nݺB j׮*W޽{>3,z?#F{xxh?a!v')G1UscmܸQVU6M6MVX$ "ܖbd (=O:X{t @`]BaXN91`vGZҭ޿@QdW n ngErC_q(p1fjà C5r5qMb!CY8Q(k$fj;ԃ> *Dp!, Β(6a{fk;s8. uG+gUv$00J#qF`V'СMGp!|Ip!\U(hܿk̪ 0+˫ʙT%JHIII ͫp 4w\uEQQQjݺs믿V%_2eʨ|vW~  TBB$wտ/}ݪ\]cq9IeY{vnJ2etc[etƦ IDATU8p@ 6aW+_oϟN.]bŊ:|CM-ҺunIIIv˿uM8QR``vܸ^Kv<*Rcl6)--͘$¬:uv*5k֬1])Shq5jN.0qٳgٳzVZ$խ[WW^ܔbIx3N>O?TtE͟?_O=RSSUD yyyI>\. q0Hq8h`רkH?pm۶ճgO 8Pu5͟?Ok7RDD*Tt\0avZs=\Νu֩bŊ&???5iDݻwkժݻw]vԩFpUTIFRxxڶmJ*vJ$&&udtIkəϝ;ڵkK{$l7|ҕ&lyKjLѵsu(v޿߳W(.{ԩS_~ (h%8 3@a(`C)$Hġ_,'o!CY8sg7Dp!\M1." A~"qF`V&:ݭQzJ]nW @p!, Β(6a{fޝkfvm _FKNtGo~V=w(|VeI*ߦv!CY8tvʔ,0!CY8 C5-qx#︩dܿGqfnR u!,(RHq,q(L\=C)ܿk$f[pӦMڴiM Cp!|I9sJ#qF`VϪJNNjf_.d3fU0s+ˤ]vM;vPRR[kɮ@c:tHW^uy< /1!c1/\Y(Pqr5qBb!CY>2$k$fj@~!qF`C)$H*2&Mh֭r.^%qݻ_*TP.]] OOO;1?yzzjڹs<==~Ο?ѣGUT3< .A`C)!qN:M6:~~g=ٮ2ehժUJIIr{Oޒp%%%)))I}ѫj,q+))I;vPBB '׋ CYE&qH#qD :T R޽]']塀{n:c8qBWnM%JPɒ%榐M:U_~e\/n/$fնm[VZ:y$7PZ﯉'JFYfܹSM41wءMJ*zGtyIҕ+Wԯ_?UVMAAAO LaHfiɒ%9Z'I6M>>{O}=ΩSߖb]wݥ &H̙ѣjРA^_L( C-\P#GTu1S2ڵ?XIRJJV\z*ϓfSll&NhJ4/dTR:~RRRTZ5/_^nnnt,J*uf{KGj֬J,#Fhƍ&zi]pA>>> ˂ !q(I]vULLhʕIﭾ}5k(,,L9^SٲeեKkɷ|]8U$UV-曒_ӦMSեK,I/GN<ŋ_T=sjڴ> 6LW^_L( ;w.]gN˗ڵkzԿ„ JNNVll&O,[&H**U?ֶm4o3g_ߋwQU?I&2a$HHP$E EpCVEP(ZkA,DDQL,5֐$3/$˅L'0{?PgKMMU֭uu;vTbbz)}72dH!L*))QNԹsgѣ:~BBBtWXԷo_m۶Mrzv222KrrrsNIһᆱN-[T߾}t:>QUCHH:39أG%&&jԨQׯN>}pBMjCCU%Q<vvWYNN8j:~@g<*4^~Uٗvՠu$s$V=qX "`CCUu8 0G`_wU0ǮH"0~s$V8D@aH"q̑8XUgì,eee]`7kHHaNNN XG0G`rAuI㳼2˥}@NSn[G~:PUM/̞_ƫa$VŏVRR]vȨcru&h |l/qxa&8̱!*qx)BbCkkrXA"q#q*XA}"q#qʯ CCU$PHH cǔ.ݮ(uѰ4abbo<<<$&&J6mU^Y~$iɒ%ի7oΝ;+++Kq*lܸѸVBBJKK0w\͝;׫쭷ҵ^֭[+22RT~~{&MK.+"I:r"##7x5|p\͛_~?ysOM8l *x 㩶fkԨQ4k,Џ?~֯.lڴIC5!IU^^+WjÆ Zn$)$$D>V^u֩C:r䈂o+oa| 1]XXgyF3gά?VC='xBk֬QYY}]krڼynVO={СC귿$ir8?疔hǎ[Խ{wm޼YG'NPbb%뚨& ͞@cǎPӧOW-'W~k}MFጆ84,&fL򅄄f)88XAAAF}PPvءI&gϞj޼ {Yq|9f͚ܘ,??_w}VZ'*22RJOOW6mBBBԴiS]߿#Ib K,XYffyۼys7N#FЎ;AWG`U@qإKy<\g}vvƎ:(99Y$}GJHHмyԱcGs=[իI}YS]tу>(-IJKKӂ nnkGk֬ѩS.܌ #X/hРA,--Uxx3i=z(33S_sN"""&Wq* ͛7?{Gό:ǣ ]{?I&LtIuAٚ1cl٢IҾ}$_^+V[|VZe\^믿Z_T類8<_gV6mԷo_=ƄUƍW;tc͛7phȑF}ݧKj…1c.*UffݫѣGW_$VDPƌO>D111߿֮]+IڳgNO ;V駟[ݻ+>>^;v$+4i$~aƪYf۴e]wZl:_SHN4Iqqqӣ>z#""qF֟'1B?Q^iFsٳrԤIsk׮j޼Q7j(l6;|szk)66C!q(%Q*אbbb|rjʔ)6lN8?\v8Dyyyjٲbbb6ahÆ ںu$/ԴitwK:dׯq! CMo]XlJI:v4b7N=,X IK%;M/Wy\\>|k޽[ǎԩS_{F]PP&NcǎyM(V(**ZyUh&qxTnZGQLL.2^\s?^[n|:SNmjժUFڶmq:4 ?aVԶm[mDM^{ڶbbbԻwo0^SμO(77׸#Gjp~Geee*++Z6,ZHwК5k4p@cnda~_Rz뭷rgLW>}Gg@"qتU+_^={T|rmذA[V&Mn:XBϙ0avڥ ;ЕW^*..NsQXXXmSCJ*""BرKSLQTT ~׿Q{7o޼jy't:ʖ.]SjƌjӦ.rmܸpBաCo4<$Vz͞TLIFry~~%I[l6GFFJ:Xj_a_yUz+~8HRhH 5 iC!bCU$PHHk0,, CCU~M6k֌ CCU~Mv֍ CCU~MFGG+))IQQQl>jCCU%Q<vvWYNN8j:~@g<*4^~Uٗvՠu$s$V=qX "`CCUu8 0G`_wU0Ǯ\ckՕ ɅߒcuOT<G< n(_\σ|e k"0~s>U^=44u8RVVv!`!:IԠu$s$VUdVPKl\.۷Or:rxzh(ÇU\\lPX0S|8̱!*&].〺B0G`wU&qD0G`_՝9H"8̑8X0D+<<\:uo~&8Ꝑ 8pnm޼:ƌ"q*6mҏ?uiʕznZZ<藶PRpfւ O5s!q*`P_ry{ر ú8ΌǰPuI_,Yoͭ q#q*g+--Uxx}Ϟ=2dڷoK.D?Qw=h{O8}9rF)Ir:9st颞={jժUƹQQQ_x=3|!%+ׯgIR^^f͚kFÇSO=O?=Skذ:v3N&N%KJ\.}Q 6L?(mq/+%%EWECE`rAuɬ)8pqƄPFF^x >\Vjjt5טp8ԫW/۷$iΜ9ou}2dԽ{wIҁtQIyyyrݺ'|JEEE{b ͘1C}n6=C9rNVAARnnzH]v̙#IZ? eiʔ)۷:u$I:znݪ2w7jS^.{hh*q8i$uA֊+,IZz5|pIR^4mڴ J^nדO>.Hݺuѣm6㘛oYAAA ύ8l:pJJ\:VԪUK͘1C6m$UW]+:ڴicd9N͛{Iguu+<<\qqq2d{=㜴?.4"$VTpٲeٳ.޽ۘ(t8⋽ԩvy͕4҇TVVXFj縮.C99'ձcW]ll{}7'>oCWv.((ĥqǹnv{LJ[h|H2qX9U#r_}MZ2^+ׯƌK/Tڵ_|uP\ܙF]aaa׈Vhh EDD<&8Ju6mٲENK>}W^99'նm[IRTTN<鳝(͚5Kg߫ԦMEFF)f;Դi1.{à3U룇"vUЮ];=C1c<&Nkjǎάb z뭒}j۶m*--s=^VGNSaaa5jΝ+ө2mݺUEEEu~!xTZZ\effUXX.2yС'*11ƺv'|R"]' IDATuU9s\.WgRv4k,wNhJI^}lZG!Bٓɔr#xry~~%yvv###%I)))usghw:u j]?IuCW.]tZ W@p88DԐ@CD`U@qƫ!q4Dq! CCU~M8D"q#qʯf͚8D"q#qʯnݺ8D"q#qʯh%%%)**J6g{@m"q#qVdY^nn*с_TM/}$Oyʾk׮]#q#qꤤ\`HH!PW9,qԅ a=Yy(//7>Ֆg~C/`yUhLVتhH9W9"q̑8XUgì,eee]`7kHHaNNN XG0G`wUv\ڷo t:vxU+8`yUhLVNbUl%%%ڵk:&gPj2~kf Vqqi{@mbCkNb,+8̱!*&].+92'98|8̑8XE!`!K>ҥ<O?~V^}A.[LӦMa$;tvEEE)55uUVV믿Aƍ5tP7|ݻ륗^${ |7֭6ouJHHPiiqsܹs%IM6rp_^7nRqF۷WýޫwQ=*qX^^u֩Ez캕5 j_CH:N5JÇu!M4u5xt7k„ |PEEE'::Z?ŋZb>K*,,3#I_]}ѣk͚5K?}ևf)88gTu!JK?~z*))1/^_W;5tP 0@|Qo/WLLn*vm0&Vkxܹux@.86!$+^_ryĦMꫯ*33SU*5k;C/ҥKZ^>}56CU8,--ի )>>^۶m:fӦM[oo6&J&OE)//O7p|Msl٢ȑ#rJKK_>L~<J i͛=ܣt}g.TNNMW^yE-[|ӵuV=ӧ.qF}e#&qoGj߾$nК5k>|u&IkuIҋ/4 ĨZv:Iڵ7lzf͚yڱc~hv&M 8{lӦΝٳg~=>}!qV$JZpڵzn5mT?5k&I25k"I҉'J2&$3)Š :uRNNN~YiSO111Z|RSS5e 6Lmڴbݻw+$$h֟jӼys=s6lz]e_WƦ'^u'N֭[uUW]=y_|λK+ߛ4irA3{|HkΖ2>zy~ddN:Uuڵk/«pcǎ6$ϖ֭[ȑ#bbbԶm[ӪUs^O>Zpn&}W^uF[[ 2x>BBBxb͝;WŖ Gmu!XpٳvWyZZZו}3f֬YcLرCvkѢE*++w}k6j!qxA-[L*../"˴nf=Z7pNQ^^^2grJNN>}:;xrmW\8XõkjUǍ;vd͞=[#GСCi& >ꫯjΝԩ ]}՚1cFF4aV~zS۷˵anڴ?v{O(""TbM<^{i޼yF]jjQ~v}+:#q*kb2H2A5l"-##m|$͝Q:p8A _JHH!P!$!X828XE!`!*&H^8̑8XafH^8̑8XanH^8̑8Xatt%=68̑8Xe\P],nn{/`tfσr@]}i׮] XG0G`III.֑8̑8XU'C0~s$VuWe1~s ! 0G`C/`!*(_CUu8RVVv!`!:IԠu$s$V*TDx<>+s\ڷo t:vxUtyUhLVNbUl%%%ڵk:&gPj2~kf Vqqi{@mbCkNb,+8̱!*&].+92'98|8̑8XE!`!Hk…^e5`[K.$xZz]o|.jWCH=Z/Rf 4Heee}իVV~*H ao{[:z[l׮]:t$i̙ƿ8B0##Cj 6hlZ>`!H^s5zTZZ*I*))+Bqܻᆱ!CHvzPBpܸq裏c>}Zo222$I Kyyy?F]1!q* zR-w^IݻէO]uUFڷo,IJKKK/d㕜4Fo.r覛nRIIQt:5gǫcǎuIIg&^xd=3N:髯֭[uem۶ k!$۴iZ7n4ʲ;J+ؼ;xm۶ͫl;V:tPrrgٳGC Qu%٧>H 7o:v쨃tj̙ҥzUVǗGU^Kxu 7_m?H ġ$ :Ԙ$|뭷4d su]SL$9R;w$)//ѣGmjʔ)Tnn~Z4 !q(Yw5e_|Aȑ#׿5<222t*;;[?&M29edd׿k˚?v:'OT޽{kΜ9oumڴIs1]|G;護RNNM&|ƅޛ$VDP:r$;4d%%%?[ה}4i6m*IkuIҋ/4brr3=,Y-Z(44TӁ_k5& mۦo]{Uyyvܩ#F(((H!!!O$ jC8ywr)++KUxhٳGNSӧOWPPƎ+IOzjk$oMV=AAA[w=䓺袋ԭ[7=Z۶mSyy?k劉Qpp9+_#((r[!!!5/ $VLpذaڽ{ t1_aaaJJJһᆱw}5ਨ(͚5SQQ$ĉylnnl6Zaaaj׮rrrԽ{wz5n8S;C#G*$$Dׯג%Kt饗*++˟F$5p@m޼Yoz:T9.77W!!!^u[6} }ɓ˓Pݽԩڊg1&rsst:շo_ݗ^zI͕Q.]lƅ[?$V*T$Sm;זXuQ-RRRl36x`m߾]} tFFFԩS^e*))Q~~v$TƎ#Fu1KÆ Ν;w^=s+Rx M0AGQLL-_]e˖վ)өb5iD3g]v&?{=}^eݚDGG+44T_|"""+))7|j{nn5jro}W[_f ġt&u,~<#I(IC g}IRBB5rHIgָ{Զm[ 4H9 kdە.](66/_wyGIIIJKKӨQ&MhݺuZbbccut]+WC=XMtv(22]xU8Ī1Y]JJJk.uLΠ.dג͞@5>b98X5O:YWqcCU~M\.+W$s$V}We+O$s$V5qX@]!q#q! CCU8LLLTxxILLk7n4nժF'NǎSzzv*I4i;|pk>|XIII=ƌ!`!JnڴIEEE***Ҟ={W\";vL[}'Ir:5jǏСC4i׹?N:[/ȑ#m6)--խުqÖ@8&q(Ill Rxj| &ݮ믿^_3iBM>]-ZPll&Nu^HH6m޽{Ӄ>{5nv{I&@8*qKZZ,XdtM]viС:ǛU8}233Ta.]xrJu1}U."͝;W-[<:8΅!JV^믿Leggk„ Ztv9sHi$}ᇊnWAA*l޼ys=JOOg}v>5o\m۶5R9*q8i$)..N>Q~uשe˖ ժUdk̙ڲe$Iҥ^>@{_#FL4f}'Qvsr)44ƍ!`!*[(le˖+$EDD山ƿO8իW륗^2\.JKKM$)44Tm۶U۶mpBuY{Urr$)&&F˗/WjjLaÆf'$ 5TnZGG}TiiiUg$s$V55ϖL߿_;wBYY{=#jڴtA-[L*../"8vrѣ9svءE=7&qcCU8O>Zp&OX;V.u+""B;w{ァW_}Ujժ֯_={}Z|6lؠ֭[hBQQQ7nl6vڥm:9 fO*&Sˍ$c:}[l6GFFJRRR(u83FWyvv꭯p8_!`!F!kX`C98 #zE0G`_͚5#zE0G`_ݺu#zE0G`_JJJRTTl6D0G`rAuI㳼2.U_ Й=wU]v5"`CCU~OV'%%XG0G`U$̑8X]̱2*(_CU$P9H"0~s$VY0++KYYYM9$qS.֑8̑8Xe\P],ri߾}*((QddTU :W92q IDATX9Uc򳕔h׮]***2ꘜA]_%='˯k>|XŦ5sqʯk:u5PX08t\$VPHH$VPHHkⰺB0G`C9*qp84uTuQ-ZP=4:>CCU8O5h uU{?WE09l Kx<Vί SNwܡ~(8pX'GP :W9 Cta͚5e˖gϞj׮RRR/IZxLS*99YCէ~)Shp8vvڥCTPP I:~FX]|:qD4|"q#q* 8/XM41=f_-]Ԩ۾}{1ٳG۷נA4gۺ+h"IRvv&LKpk׮3g$iJKKɓ'}vlٲn>!`5VDⰤDaaa~AqqqƧwܡ͛O>QLL;f 6Lv]4tPG\r$i:|$iժUPrr5sLmٲEǏr)..NZ{79"qعsg?~Xy}vInnvWuQmlҤפ_&MT\\,I:q233eeկ_?TO?k]|ӟTHH +Wl۶cl٢Zn VLLO|SXXPuA/vء+V_֑8̑8Xð0-YDwyHw6)..VDDl6\.VZuAPff/IΝ;%IJJJԩS'uH)8̑8XCIJKKӚ5kΝ;[nZ`-[&I7n"##t 8ӧO-\P'OVllƎ+%IZv:t=zG?~֐8̑8XTXX5{R1R^^n|$V.W||3ny<y<n{dd$)%%n _a_yUz+~8IC\H 5 qcCU$PHHk0,, CCU~M6k֌ CCU~Mv֍ CCU~MFGG+))IQQQl>jCCU%Q<vvWYNN8j:~@g<*4^~Uٗvՠu$s$V=qX "`CCUu8 0G`_wU0Ǯ.(qxAM&M!pHH:#G^7CCUU6G ɓ'UII`~yy RybÇʁ$shLWqq1Ir&Yʀ9vUXUU.4 &Y98XUe𫯾nd?qcCUU&KJJ8O CCUwU&q9LVb?$s$V8D@!q#q! CCU$PHHaii<υ8O$s$Vjp{011Q袋tG e˖iڴit.~zHHU.1((̤L{5jXBU)i& 4H/~ iػāa"D$X Tl1iuʞtWیJ~5mJSw04EM]ȇ5Gànz*s{uC/ߵۿ?1 !tl_Z0: AAӵ% Szgo@]]E^X]v}yUU?|5" w[ymiiaԨQQAAۘ{+ ?׾87bG9A}6Lh4~;>*++럈  ƺ]ƞ={ذac&BRO2e i<ǡ#N+9AAnkF4'hذaFh>UY|V+*  ]Fkk+---P~hhiibĖp+W#AA_V CGG;`8v(F ~>1PAp5L&F"h4v̷jq(VDĈCAAC NC1ǡpGW#AAnnA~ Cbġp[W#AAA#ۊH`q(   q(VDĈCAAAĈC"ү 'F   }%F ~>1PAAA+1P+   B_4#_ϼ}yx(?;3tV,WX<^fh7\'"s_uwDƟ}k )Ou )ghtb9ʣ3"fu&0 o_2nWf{i~?J鷫ux,^ c `wc2x;i?翪$h7wss =oA`9}3lYǢ yW?   _F^H@g Olxٽ g>/g;ݤZʤPe92pKH^|2~PF `O::c|+A㇐^~XR2HF`f ;?4նP]#>| >}/Cg(6u5F}+ѳA[ F q( pڲe <͛ĉ={v?Ŭcf̘AyyyGlٲkr!V\V7w|gӦMV_OX_FZLy?N[BʈݷFs*;\@+_kPO\3]cQ[]Z,Liogץe.RZ7t<y/7%8M5zp=1\)]iqYbW4Wyu̧-&׉C#AAd۵0h:缈yɹj _>VMz`wX.{]ߺCǫʮw ` 1PAU__?Çinn?;ww-U]A558KYPr~:q@Xԯ50^Cs ؄x b_?ǩ]VPU@R$Л[)cԛIDʎuN\b7s{1*_gq4ReEps_UAAs_b̝;6NNNOb޽۷Kdu+V̾}"!!b|ٳT ߱ݮ]o /c .dʕ;::r1"""ٰa999|wl/Hӟāؾ};SLߟ7|vœO> #8v>{ ۛ\aƌ|'d޽{ypu| m߾}<#111lڴCe&Md~С;:t?DEE~yln+>ztvLimI>+?7ԃ_Xf oͫJpp0/" .{e6Ü0aW^婧b̘13gl2~i.Z::뮻wԨQ?~cL6b/_?`Μ9L8T^z%;~U䷿- >(qqq3i$;z-z)؝+++QL8cdz~/^yg?>* z_IJJb 2cI&'0|.^HZZ= dŊ|̙3gϒDEV6sKUy $3$:߼cD'Z,CvӇ?3ee<ܔr^zZ nKHuw?auDȴW#hA2gx%­Oq( pgfڴi,ZEYc0;TVVwy{9sϩSxXv-_m7{=RSS9~8_bܸq߿c"Hٙ'O1޽ .ݻ7ӧO999mK,… t:*++)((`ԨQ۷f]`@=F_2yd>\\\`͚5qʕk}d5wp<{\|[r/_ή]3f ǎk֬Ydgg իIHH <<f0 tu'35HexPX#կl­Mq(  [, ٳzo8`2prr___^z%.] ۗxyyq ^~eY~=~~~?GRqit:]]*++:t(| JŽ];Z[[r,av}/GT2zh*++9<`?>cǎDbZX;0?D"b`KKKSQQo.AAA߱L.k<[-=Pү'j]F_&nbġ  pyv/:,` `7ԎvUUU|{<==9q TjkgYWok466kz®BV3~x,KJJ g}˗/3c f̘kF믿+W_}h1h{O>LJXjjjzpkiF NHyhC %F  /~kZ-puu߿U`d2%%%~cc#=>>>8;;w;}4O?4F9Ÿgapvv[*ئ}>CT*)//Gseη~ Xy.6o1ɉ> /$((c1cHMMxjlD|uvwwۛa]pu455).­ t'ү ',  wye߿_~{w.]JNNΤ|G̝;8|}}y'X~}Ǐs} 7|BŅgZ 0Əȑ#IIIӉ{!%% عs'O<Z|a˴OpSO1vXζ:""":1^O_~%444pܹGyP3gNFj4x=z4:...9s&> PUUeuG}Dtt4seذa R{p#ۊH`q(  dڴi_MKKk֬jժ ˖-8;;pB ~-?γ>qx5rssqrryvAv/իWٱcGO8{BBBh4,]uuu|W^g%11ÇGq]wulyf?K/1o޼^zj:uoⷯ)))YB6l@bb"R`W|ᇼ⋴Dk6YYY<裄pRRRgϲtRϟܹs)//7:}tzuLn~,gk׮u:NUUU9򧌳 t鷬L_c+?X[h5jTUAvd20t::ujG~6mQ[BVVr$ūeee=_U>¤}p3W쳗-AAA\bC"ү '8AAAJq(VD  '(mE8n+" }bġ   WbC"ү '8AAAJ8n+" }bġ   Wlw   5LZ1b`ґ;%APʟB G rU     PAAAADǡ     =XtJ""1+:G샼H~}Hf絬xy9oX0Ϲ#b7Auʹ_A]ݔyJˬSHTD[Ū0I_$ZdC?xi!s'jw5!<;ťI,ۨ9ADлw/h*BSHSۏG#R'3(knr=y3x V/biqY^r?g+>Eߡ#+\f@fۢR.X9.m\%(gF2+ERJMN!GSLȊ1LM+:J3ٖ֖*9֓|w@"g'] t=G 7.}/u\NVŎ)lύ_6׵PN6W IDATt?6O8 u: ˁᶩٔCzsF`3YddLb:%mϋ$@nh>+gTXB+5 /'E]E-:A S6'DG&%6.1v;P&i:;Cl c*P0ǵ;Yan{P2qbɡ} q2*8'8ADxPVF$=D#o+7Y+&Ũ02qWU(k~&:\E"HWt,YKJʜs[1+qЮ9a=?,/m3o`&2&k)Dܖ=?~:a832NbLj RÉSJMtI/@1UcuAJiFҴ mi\Vjrϲs8ˆ0+oa^l!Fn(84-N2n@)Fm5^>=:V9.H-ʱGٙ M#icoN96,HneWAzɯwn4!qjj[+gf8SFf[QN[iG+GIf-Eg7NV(|u(,^:Fmm*xn!/',%G4c^ MeTU֜`ۻW$ &h:(. /=æ%=ͼd}Yg\ezG=Jsq5ΐqg^/PeX|T,OٕLj6_g>te)iR|5⓬_֥̲.w'>{1t4662u8 7>wJ5Sm7zaH ILsDNqi6Qn>t?`ߏ揩u>~ID( 863򫼙q8ddWycHeIٕ}j>e2cj4EQ'(6Tʞfڅ؍$%Wz3#IcGBEx?Sټǁc*`BG2H>Z hR DFA۾\ŬC_%y)aedD?VJg>ÀDN L_hEcؑ]֡DXr$IyrEZP{.)!z#u`ZyCDfW8\yxLLl%Vy7 ɸQ$ X?"5 %qXUZt_o o|;4ϟ_> @yjٖn>V~u%ҽǑoNCeN2F!^ym ) If|ny.adDB5!@6;smi)J?aZ.29rEYqf]<\$q 6R[vr"WRS+̌apJrzn3 ID/st pUa@0Zێ`5"VA(fͬbj3E@g=^.E9.1!t%^oʰ cԃfkb81/q&jdWʝqt=6[:wWKAЙ7'#%?"Ƀq{3?ϙ=˙b&i4&R.p0Jh3OyuJJ'i僙vh,niٝB o"k9d?UHQQ* sY0S2o"#边 (br$3!+2}`AW'bUKau6/mD(';*$ &`4ꈦv<{J[q;ɼ]~ YktDLʑj>{z]d dz؀2{ȮOcc2O5eیV.HIR$b/lLFJUIF *ls魄}.VdHO9®Ô_d_&nHRnv7 G⣾&t4oM%KUAM!N `NIOḳ- .VҖPg$dg*y`IY4jH847[")ϒZyžn K"ؙg)z?%r\yW {S\]h1U{ @"Rq>[ʑƭg9R` nҸR j5oШC{,<G)-5g5&$Rj-(ID/l@[,7P\gq8:3*3E$bV4 jr+i ꙽,0:Z>2Lz .f[c\mWGe2zG<4m#TdJ 7Y\='Bff>~Ǘ>bHaIzN$QBc9E{k*:7){㙽<2J'ł;:4Ϲq@"<I>e4acy[4U.HEZm@YJ0J/@'d6`CV-SWz) BАL%=P BW LV]*%jT5CU)[<ɾoS%3PqM.}R&3?,j0@ЛL$#.jL:X#b8nrq} j9 $z%q.֡z/{⚾6(Vqr2w"WD\uĹ9EUOjO;`=꡷2ey VG3e !, yʡ$}1ݰm)(ɹ@Z C BIhIo(8ۊҫ·mes tAJ9nMh4v,ˮ`+#`GܪK8VB$7ȭz1loW0Mz%5zl@EJ0*8;)A0f2_Ojh5İ##ɼ]jmm6Q}yJ@a1ϹQx/{9]i8pmes`@$@%']K R7aӷwbQv#N^}cs`S jm}GM0p$krh@naYz)4Hӡ#Y}^0/90m6|Cx8ٍsZƵ/ԡ~f7yV-q Gz)p-O|dodJ9`D*4dbyTsn+YN웻 ;M>ΩzfHN[DFCYNmQ2gCY| +7 &rsAnk4^r$z-ُ%}D‹rӣA32+aye 4jz$Q*AV5PT`'qMOSI~JDEXƓTHK#//׃Y NvMqdo|q /q=HԕT7u7wf+(ݠ}K8RA|mqLQY^rߔH(\۲[HڬP%%!P樝\XOjQմoԱ,OUS3)i3e4f歴j GO20&=֡kla^囀F^]<(dYHь,>ÑkyzTUz{m$ % #P86ϹYgY_{h0iZ}3SUwoj@@r8+hDVG}{zF6TUq$ zrj1zmPs$"9tM1tp- OYd tGCiGσDgJV s7M4/dHc %,fǧ$bI3[YW;b_䫜RT<ЙMC0|N W(lYSDRIp0I M+(,vS% HmK[/PVoNc6 &j,ASgC۵Yq(r9xr.,R(&Jsj\dd`-$jJKqtU3k}M:;q:-t Gm=?u/gSgm%H"]m,kٗVߪx^O<7-He`u/C^j3K(՚QZJh& .њofv:^U:XfeJ^2_~(gB_zw\7=pO4fdƛGWpg|eHQ%߱kS޸mr5K ԕiy˳Yu/H .Ӎ G6TBPdP gGxeW('}y s:t(ˮKŹw@9o q2>0wr9#l\XBst$I,#ʲ`l_GhKmg4ǰ?xq`ݦՓ(p_4OiI2W@LIRΥu\V^ǚGh- nrG HL)QFu<8`zԳԝь՟'{kD Mj>~(GDdNvdmmcFl?nD&;uYa+\zr:u)9:bIHE^3ցd%2 Qa5‘Y~2ʉy+6;r%>+%h 4psw!yv [502ư˲z.@J||~?\؝LAn V '[hGKA_Aܓħf~3F}N %Lu/@‘W;+KM2| Go/rIEBoHXywGݥ4\'rJ 7PU5_0By^OP[qKGܼi,謺tqIUjܺӃGîw.< )Nw[۾ /? S -9o!ىW{5HJ6eVJyBf#p~j,QWrmi*JVGИq]cw*r- ]ҥ*5lzTO@&Ws3}g~{Cg1GXFQ۱we}$B&2ϣ7l:GtejO2ŨKfe>ϙӜ%+0+o۫V8{#lÚ&PH #WᱽdBM@UE22̝㍏iK8esvcOM 8 g:cC!;8tj]Wؗ쬱xrSi'8ۖ'dĬm=6,R]P3v@@XVly z;ؙ.]a_;W6瀓)K>z e+ڌl˨k{ʯq{t;^;PMZx1qS-< :ˇc;v굌V&Z1ʺ6VGLR=a%hT$m){ټ@}2+Nds&=r3.ع}+T ^g o pq=+0g JѢCXݮ!#kqŬD853pdѕ4Kݛ,X=9ИyOM!o {(kmJk~1< `p1ϳ~UQHmĩSzV\G\(@5J xNΩmˮEoONZzXrjvqM!'t4Bl)t-iFIfb-`IIDAT\#q, Ւ,VExKUhz>I)Y!XpK4%lqh%r2)N2euলuaCR/o4tA})z^2Ut܈JUѼ&ClCjZ48A l#}qO]d(eW~|/;e΄Ɛb8S[̇hGRB=(<3Pߊ\BGmrUoz3Xo"!u72ZC~ QϹY`~=Cip +gX vܻjW/9 S^O8g|e.xzUq]Z^lS6iqR8`* Γ6ͶιֵCGk^XPϔ(8]`y> :WnRQa^2Wھ@/ʿ3rX&ղâ!(#,QʑrX~)#nck~ry)וenEȹ#:7lS&'W7؎:"c(h9.*gștૄhg?HғՁbӆCl̴%H bBk9[:/#C[9" f0гB!Ma|'^u 6_]$`N፛ƴ|H}tkԬ50iF@/Tjmm@?Ύ_q8Fk)'Ix՟X+Dֱ- 'I>$`_asfnmFřTC\ i_Y?)*g҈3ߌl\9A=UU;u(Zs</h#t +5!n]ׇ]=tI}4W?GZ>!f$o\$I]FҮPB崾`[ }Nns~ #,nH=jY2IFu-5ʡAi+*f 晽wۍD)Io@!)[^m#BI$w L9zAμ(Ŝ=C^zNAAF](Zο:jwKJsi{|DFlk۵`E@`-y3:(AB"oLAkCbbU}Vg~´7 !)O4mlON'nhu4ԀL*0VhV<]-.6oZLqz2Yqjq{x{RDz,02r ъ )븞\pUg vQIHUfۃr峖ate=x4{# J8!&rsEYkʭd(bKV,E6>tM fEvl:rhya0Uy֍aJֿ`̲UV/re qO@T ^ѿbߺ5 H*aHiq/@/ p'Zs `݇}8Ե7M6oWzmp⥔-bTx,<̎=@_)>Shh(hY[җѡ=dD'8ELQ򊝉L@>EzlJ.HKl/e4 SSKS`B6Qu'h[QG虶'4hR:[p %.4-Dv&kC;,L''ȯLܺd6)$̬`V`+(0ADnq 2I( ۞q4:l.vfBmaӤLS3 ;ݨQ[)xMwi) H45܋(\8qJvl~z 9?nP8΂βiL޻}dsɜ R[MSAm[smp'2эP %dm˫|y='oJ#-\}PY?^`6pUiϲ8J3ٌT7͍5r%]1K"@v.k@>/lGn{SsG9H&u" Y^ZþRJÁ.^q`2,-F$axߪy4;6)1/V3ϻuAъZ2'Rʞ[_I7ח=L!Xj-wR pN<*y{TgC3QJ㐂 5Sc7h^$^}^8:k* )Dt)sJ6Y?k]qztSR4(%;st=|WeIny(,LԈ~\BQ0{W\OY8;,TyL`ƿ6O|7)s 4C/qTv-`~?"P; &84 2@o}nD nlWv7LC򪉌}Z~y/=-rp/cwh>ك]NDWa oW$vޡ?.S; 7m4ǂT.zsK@:/o %$0@q>^}W E LJYr9Co]=P2qJǏ4z<Sy=@0)_F;B1^21uq;cyD@ #i=?a{{i@ GЇ W^pч +] "rLP8<}q84NAm=j`pHڗBl9];.nzhV&SHaGdf`fʶTrjt5#c]-?u(6yUa@  M d0>n(~Xm/sPe@ @ C'@ AP @ ~>@g>@ @ @Qk'EIENDB`bin/000077500000000000000000000000001516100164400116245ustar00rootroot00000000000000bin/p3x-onenote.js000077500000000000000000000025011516100164400143420ustar00rootroot00000000000000#!/usr/bin/env node //const os = require('os'); //const process = require('process'); //const cores = os.cpus().length < 4 ? 4 : os.cpus().length; //process.env.UV_THREADPOOL_SIZE = cores; //console.debug(`P3X sets UV_THREADPOOL_SIZE to ${cores} thread pool`) if (!require('fs').existsSync(`${__dirname}/../node_modules`)) { require('child_process').execSync(`cd ${__dirname}/.. && npm install --only=prod`, { stdio: 'inherit' }); } const utils = require('corifeus-utils'); const path = require('path'); const mz = require('mz'); const start = async() => { try { const desktopEntry = `${process.env.HOME}/.local/share/applications/p3x-onenote-cli.desktop`; const exists = await utils.fs.ensureFile(desktopEntry, `[Desktop Entry] Version=1.0 Type=Application Name=P3X Onenote Icon=${path.resolve(__dirname + '/../src/electron/images/256x256.png')} Exec=${__filename} Comment=https://www.patrikx3.com Categories=Office; Terminal=false `) if (!exists) { await mz.fs.chmod(desktopEntry , '0755'); await utils.childProcess.exec('gtk-update-icon-cache || true'); } await utils.childProcess.exec(`${__dirname}/../node_modules/.bin/electron ${path.resolve(__dirname + '/../')}`, true); } catch (e) { console.error(e); throw e; } } start(); changelog.md000066400000000000000000000130001516100164400133170ustar00rootroot00000000000000[//]: #@corifeus-header # 📚 P3X OneNote Linux [//]: #@corifeus-header:end ## Change log ### v2019.4.101 * BUGFIX: Minor translation issue. ### v2019.4.42 * BUGFIX: Revert Electron to v4.2.1 as there is an SUID permission, https://github.com/patrikx3/onenote/issues/63 ### v2019.4.39 * FEATURE: New `OneNote 2019` icon * FEATURE: German translation, able to try to guess `Online Onenote` language, but not always working ... ### v2019.4.33 FEATURE: Added in the `Action` menu to go to any URL. ### v2019.4.32 FEATURE: The link chooser was missing the cancel button. ### v2019.4.31 CHORE: Updated all dependencies. ### v2019.4.26 FEATURE: the Electron GUI color (you can check in the `Set Proxy` theme) is switched form blue to purple ### v2019.4.24 FEATURE: Allows using multiple instances (with some quirks, as the config will not be synchronized, so it can provide wrong settings) ### v2019.4.21 FEATURE: Reverted added emoji in the title (notebook) ### v2019.4.19 FEATURE: Added emoji in the title (notebook) ### v2019.4.17 FEATURE: The settings tray menu is a checkbox now (it was a button and different labels). ### v2019.4.12 BUGFIX: the tray was giving a "tray was already destroyed" error ### v2019.4.8 FEATURE: for all links in P3X OneNote is left for the user to decide how the links are handled - as internal or external ### v2019.4.7 * BUGFIX: the tray was showing all the time, now, it only shown if the close button behavior is happening by minimize to the tray ### v2019.02.17 * BUGFIX: Added info, that not every case can be handled. * BUGFIX: On the sidebar on notebooks it was opening a new window, it is quite hacky, but is supposed to be working. ### v2019.02.16 * BUGFIX: On the sidebar on notebooks it was opening a new window, it is quite hacky, but is supposed to be working. ### v2019.02.04 * BUGFIX: Donation button was Hungarian, now is supposed to be automatically by browser locale. ### v2019.02.02 * FEATURE: Disable/enable main timer on window blur/focus * CHORE: upgrade to Electron 4.0.4 ### v2019.01.24 * CHORE: upgrade to Electron 4.0.2 ### v2019.01.18 * BUGFIX: it was saving the window position and size, but it is not correct, because the user could change 2 monitors to 1 monitor and could save incorrect positions, so I disabled this option [//]: #@corifeus-footer --- [**P3X-ONENOTE**](https://pages.corifeus.com/onenote) Build v2019.4.101 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) ## P3X Sponsors [IntelliJ - The most intelligent Java IDE](https://www.jetbrains.com/?from=patrikx3) [![JetBrains](https://cdn.corifeus.com/assets/svg/jetbrains-logo.svg)](https://www.jetbrains.com/?from=patrikx3) [![NoSQLBooster](https://cdn.corifeus.com/assets/png/nosqlbooster-70x70.png)](https://www.nosqlbooster.com/) [The Smartest IDE for MongoDB](https://www.nosqlbooster.com) # Open collective ## Contributors This project exists thanks to all the people who contribute. ## Backers Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/p3x-onenote#backer) ## Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [Become a sponsor](https://opencollective.com/p3x-onenote#sponsor) [//]: #@corifeus-footer:end onenote.iml000066400000000000000000000007131516100164400132270ustar00rootroot00000000000000 package.json000066400000000000000000000047361516100164400133540ustar00rootroot00000000000000{ "name": "p3x-onenote", "version": "2019.4.101", "description": "📚 P3X OneNote Linux", "main": "src/electron/app.js", "corifeus": { "snap": true, "prefix": "p3x-", "publish": true, "type": "p3x", "code": "Linux", "nodejs": "v11.15.0", "opencollective": true, "reponame": "onenote", "build": true }, "bin": { "p3x-onenote": "bin/p3x-onenote.js" }, "scripts": { "test": "grunt", "build": "build --ia32 --x64 build/dist", "postinstall": "opencollective postinstall", "start": "node ./node_modules/.bin/electron ./src/electron/app.js", "publish-electron": "build --ia32 --x64 --linux -p always", "publish-electron-snap": "build --linux snap" }, "repository": { "type": "git", "url": "git+https://github.com/patrikx3/onenote.git" }, "keywords": [ "onenote", "linux" ], "author": "Patrik Laszlo ", "license": "MIT", "bugs": { "url": "https://github.com/patrikx3/onenote/issues" }, "homepage": "https://pages.corifeus.com/onenote", "dependencies": { "@fortawesome/fontawesome-free": "^5.8.2", "angular": "^1.7.8", "angular-animate": "^1.7.8", "angular-aria": "^1.7.8", "angular-material": "^1.1.18", "angular-messages": "^1.7.8", "configstore": "^4.0.0", "corifeus-utils": "^2019.4.13", "electron-updater": "^4.0.6", "jquery": "^3.4.1", "opencollective": "^1.0.3", "semver": "^6.0.0", "typeface-roboto": "0.0.54", "electron": "=4.2.1" }, "devDependencies": { "jsdom": "^15.1.0", "angular-mocks": "^1.7.8", "corifeus-builder": "^2019.4.101", "electron-builder": "^20.40.2" }, "engines": { "node": ">=10.13.0" }, "build": { "publish": [ { "provider": "github", "owner": "patrikx3", "repo": "onenote" } ], "appId": "p3x.onenote", "copyright": "MIT", "productName": "P3X OneNote", "linux": { "category": "Office", "icon": "src/electron/images/", "target": [ "AppImage" ] } }, "collective": { "type": "opencollective", "url": "https://opencollective.com/p3x-onenote" } }scripts/000077500000000000000000000000001516100164400125435ustar00rootroot00000000000000scripts/start-local.cmd000066400000000000000000000000431516100164400154520ustar00rootroot00000000000000.\node_modules\.bin\electron.cmd . scripts/start-local.sh000077500000000000000000000001611516100164400153250ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ./node_modules/.bin/electron $DIR/.. src/000077500000000000000000000000001516100164400116435ustar00rootroot00000000000000src/electron.mock.js000066400000000000000000000016671516100164400147560ustar00rootroot00000000000000const Module = require('module'); const originalRequire = Module.prototype.require; Module.prototype.require = function(name){ switch(name) { case 'electron': const mock = { on: () => {}, }; return { ipcMain: mock, app: Object.assign({ requestSingleInstanceLock: () => {}, quit: () => {}, }, mock) }; break; } //do your thing here return originalRequire.apply(this, arguments); }; const { JSDOM } = require("jsdom"); const dom = new JSDOM(`

Hello world

`); global.document = dom.window.document; global.window = dom.window global.navigator = window.navigator; require('angular/angular'); require('angular-mocks'); global.angular = window.angular; global.inject = global.angular.mock.inject; global.ngModule = global.angular.mock.module; src/electron/000077500000000000000000000000001516100164400134565ustar00rootroot00000000000000src/electron/app.js000066400000000000000000000061531516100164400146010ustar00rootroot00000000000000const configstore = require('configstore'); const pkg = require('../../package.json'); const conf = new configstore(pkg.name); const { app } = require('electron'); let translationKey = conf.get('lang') if (translationKey === undefined) { translationKey = 'en-US' conf.set('lang', translationKey) } const path = require('path') const langTranslations = { 'en-US': require('../translation/en-US'), 'de-DE': require('../translation/de-DE'), } const translation = langTranslations[translationKey] global.p3x = { onenote: { pkg: pkg, lang: translation, translationKey: translationKey, translations: undefined, title: translation.title, conf: conf, disableHide: true, allowMultiple: false, iconFile: path.resolve(`${__dirname}/images/256x256.png`), tray: undefined, window: { onenote: undefined, }, action: undefined, menus: undefined, mainMenu: undefined, setVisible: undefined, createWindow: { onenote: undefined, }, isVisible: () => { return global.p3x.onenote.window.onenote.isVisible() && global.p3x.onenote.window.onenote.isFocused() } } } global.p3x.onenote.translations = langTranslations // configuration global.p3x.onenote.disableHide = conf.get('disable-hide') if (global.p3x.onenote.disableHide === undefined) { conf.set('disable-hide', true) global.p3x.onenote.disableHide = true; } // configuration global.p3x.onenote.allowMultiple = conf.get('allow-multiple') if (global.p3x.onenote.allowMultiple === undefined) { conf.set('allow-multiple', false) global.p3x.onenote.allowMultiple = false; } // loading global.p3x.onenote.action = require('./main/action'); global.p3x.onenote.menus = require('./main/menus'); global.p3x.onenote.mainMenu = require('./main/create/menu') global.p3x.onenote.mainTray = require('./main/create/tray') global.p3x.onenote.setVisible = require('./main/set-visible') global.p3x.onenote.createWindow.onenote = require('./main/create/window/onenote') if (global.p3x.onenote.allowMultiple === false) { const semver = require('semver') if (semver.gt(process.versions.electron === undefined ? '4.0.0' : process.versions.electron, '3.0.0')) { const gotTheLock = app.requestSingleInstanceLock() app.on('second-instance', (event, commandLine, workingDirectory) => { // Someone tried to run a second instance, we should focus our window. global.p3x.onenote.setVisible(true); //global.p3x.onenote.window.onenote.webContents.reload(); }) if (!gotTheLock) { app.quit() return } } else { const isSecondInstance = app.makeSingleInstance((commandLine, workingDirectory) => { global.p3x.onenote.setVisible(true); //global.p3x.onenote.window.onenote.webContents.reload(); }) if (isSecondInstance) { return app.quit() } } } // app and ipc main events and configuration require('./main/ipc-main') require('./main/app-events') src/electron/images/000077500000000000000000000000001516100164400147235ustar00rootroot00000000000000src/electron/images/256x256.png000066400000000000000000000077041516100164400164020ustar00rootroot00000000000000PNG  IHDRkXTPLTE`y"{!b{)s%sLr%$n%[c6'q)V+jdxaG_`X^b_db\dw2Kdu!zox}qc pr"tync{|v}m~l#bj{|sfzgi~ bk bj$a"|svyxhmk`]aed[i`Yb_cZ_޾^rqpWμ]vtR~lI_ݹ[aV˄$N%]ٰW̹\׺\؃#`d"OUƮVɩTÉDhKPFMEYѧS²X΃$CH@QATĥR?fUǚL|=UȏGJTśMS×KQB~>En6z=q8t:f3wv;j4{y;}>b1r`/n].kONх%SѲ_Ûڊ6~ϡaă*~&oɄ4FSr*BDgj(<\ZtRNS@fbKGDH pHYs  tIME | @IDATxSU_L3?uTDb!!!yH"VʋQW^T MF'$IӦәNw=gw˽|p{}ݽB( BP( BP( BP( B\+ [6@ @x#43&C @ @ @ Qdц>G |^}L&#@'P @7uUUUQ AJ OHuΟCLoz:~g7 XQ#_!`?{VO&aR+ھtmwjcgi 9 5UTQ)#"/~RLE"w23+ޏ!}$0$$pmH@)y/Eדy_֫$Koh0W176T6t$>  ,4 HW~b?'gl ^oYai00ILBU39C,SzO~f<룛F`k_57KBWtF'&hI`\ϴ0;t䀱x 7Oi?HM>'E7i[좓@I (IozeoZ7  5Oc3Ctl W\bO4?0LgA lkO||X|T+Ih_rAR%?SK> >$?Wg9Z/#eS `R AL~g K~)ZXs@DY o2 nVqS~b˖n@= ZyvfS86E=I/pe?51k @y+0~gH߾ %'2h9Х!}Zri'9rpXK^#U_r <ݨ{Oss_rp[g`ᒓ@3 r!p0+5k= @|7"(+t07v7 Y-dO#@ r˧V~v%D @~A46$= *?46=RBs_P@z3@z#J~f^lwȣr@ݽ&`[O@g_ 9M *~cֽ<aVb4E-_\ r?@m`_i =ɵP$?*ͺ@+P%?h`&?2L<aOE!hQ_w8U7g!paaE?(~pCk_b_yأ{?@ߕ}Ib ?< @BSS`ߥ{?@K_>P)I~ ' ,}_VZ_p ^ upk0^*$?@[3yX/naJ*w`^i3 $D. M/%LQJ~C#sS @^݈.pBAֽuFFWfg<%Ov@g YR>HA/=/ }ʲ4zw>z|1x^΍>o[bo[!qF.GY<}PEU2`X) n5j?J_ZX$PM_MS@|Z%2S3Cd S Y}dFF.u,O3 _oڂ͕L--+c1c LWs^ѥ!xݠەVL MN :]7o]N[ˮ5K:";YOwV|.î5338xPI2=ĿM`ȃzy⾡ e;R`ҋjP}tM^< @{U3uP=M5}x>!jn&WtVwfdjjjoo$SO1F'! ^@7uvU%~BRjO>%}L̾_P]Lى`7eH>^S81OĕIu@xQ~0~6rB? `FЯ@~PBi NY P( BP( BP( BP(jCo&޺IENDB`src/electron/lib/000077500000000000000000000000001516100164400142245ustar00rootroot00000000000000src/electron/lib/remove-cookies.js000066400000000000000000000031531516100164400175130ustar00rootroot00000000000000const removeCookies = (webview) => { let session = webview.getWebContents().session; session.cookies.get({}, async function(error, cookies) { if (error) { alert(error.message); console.error(error); return; }; for (var i = cookies.length - 1; i >= 0; i--) { const cookie = cookies[i]; let domain = cookie.domain; if (domain.startsWith('.')) { domain = domain.substring(1); } const url = "http" + (cookie.secure ? "s" : "") + "://" + domain + cookie.path; console.info(` cookie.domain: ${cookie.domain} cookie.hostOnly: ${cookie.hostOnly} cookie.httpOnly: ${cookie.httpOnly} cookie.name: ${cookie.name} cookie.path: ${cookie.path} cookie.secure: ${cookie.secure} cookie.session: ${cookie.session} cookie.value: ${cookie.value} url: ${url} `); const promises = []; promises.push( new Promise((resolve) => { session.cookies.remove(url, name, function (error) { if (error) { alert(error.message); console.error(error); return; }; resolve(); console.log('cookie delete : ', cookie.name); } ); }) ) await Promise.all(promises); webview.reload(); }; }); } module.exports = removeCookies;src/electron/main/000077500000000000000000000000001516100164400144025ustar00rootroot00000000000000src/electron/main/action.js000066400000000000000000000027241516100164400162220ustar00rootroot00000000000000const { shell, app } = require('electron') const action = { setProxy: require('./actions/set-proxy'), restart: () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'restart' }) }, home: () => { global.p3x.onenote.window.onenote.show(); global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'home' }) }, corporate: () => { global.p3x.onenote.window.onenote.show(); global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'corporate' }) }, toggleVisible: () => { if (global.p3x.onenote.window.onenote === undefined) { return; } global.p3x.onenote.setVisible(!global.p3x.onenote.isVisible()); }, quit: function () { app.isQuiting = true; app.quit(); }, github: () => { shell.openExternal('https://github.com/patrikx3/onenote') }, patrik: () => { shell.openExternal('https://patrikx3.com') }, p3x: () => { shell.openExternal('https://github.com/patrikx3') }, corifeus: () => { shell.openExternal('https://corifeus.com') }, npm: () => { shell.openExternal('https://www.npmjs.com/~patrikx3') }, download: () => { shell.openExternal('https://github.com/patrikx3/onenote/releases') }, } module.exports = action;src/electron/main/actions/000077500000000000000000000000001516100164400160425ustar00rootroot00000000000000src/electron/main/actions/set-proxy.js000066400000000000000000000002151516100164400203500ustar00rootroot00000000000000const setProxy = () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action-set-proxy') } module.exports = setProxy;src/electron/main/app-events.js000066400000000000000000000005501516100164400170220ustar00rootroot00000000000000const { app } = require('electron') app.on('ready', global.p3x.onenote.createWindow.onenote); app.on('window-all-closed', function () { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', function () { if (global.p3x.onenote.window.onenote === null) { global.p3x.onenote.createWindow.onenote(); } }); src/electron/main/create/000077500000000000000000000000001516100164400156455ustar00rootroot00000000000000src/electron/main/create/menu.js000066400000000000000000000211041516100164400171450ustar00rootroot00000000000000const {dialog, Menu, shell} = require('electron') const menus = require('../menus'); const action = require('../action'); const mainTray = require('./tray') function mainMenu() { const copyLocation = { label: global.p3x.onenote.lang.label.copyLocation, click: () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'get-location' }) } } const minimizationBehaviorLabel = !global.p3x.onenote.disableHide ? global.p3x.onenote.lang.label.disableHide.no : global.p3x.onenote.lang.label.disableHide.yes const languageCheckbox = [ ]; for(let trans of Object.keys(global.p3x.onenote.lang.menu.language.translations)) { const transLabel = global.p3x.onenote.lang.menu.language.translations[trans] const transMenu = ((trans) => { return { label: transLabel, type: 'radio', checked: global.p3x.onenote.conf.get('lang') === trans, click: () => { global.p3x.onenote.conf.set('lang', trans) global.p3x.onenote.lang = global.p3x.onenote.translations[trans] mainMenu() mainTray() global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-language', { translation: trans, }) } } })(trans) languageCheckbox.push(transMenu) } const template = [ { label: global.p3x.onenote.title, submenu: menus.default(), }, { label: p3x.onenote.lang.menu.action, submenu: [ copyLocation, { label: global.p3x.onenote.lang.label.openUrl, click: () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action-open-url') } } ] }, { label: global.p3x.onenote.lang.label.settings, submenu: [ { label: global.p3x.onenote.lang.label.disableHide.checkbox, type: 'checkbox', checked: !global.p3x.onenote.disableHide, click: () => { global.p3x.onenote.disableHide = !global.p3x.onenote.disableHide; global.p3x.onenote.conf.set('disable-hide', global.p3x.onenote.disableHide); const message = global.p3x.onenote.disableHide ? global.p3x.onenote.lang.label.disableHide.message.yes : global.p3x.onenote.lang.label.disableHide.message.no dialog.showMessageBox(global.p3x.onenote.window.onenote, { type: 'info', title: global.p3x.onenote.lang.dialog.minimizationBehavior.title, message: message, buttons: [global.p3x.onenote.lang.button.ok] }) mainMenu() mainTray() } }, { label: global.p3x.onenote.lang.label.allowMultiple.checkbox, type: 'checkbox', checked: global.p3x.onenote.allowMultiple, click: () => { global.p3x.onenote.allowMultiple = !global.p3x.onenote.allowMultiple; global.p3x.onenote.conf.set('allow-multiple', global.p3x.onenote.allowMultiple); const message = global.p3x.onenote.allowMultiple ? global.p3x.onenote.lang.label.allowMultiple.message.yes : global.p3x.onenote.lang.label.allowMultiple.message.no dialog.showMessageBox(global.p3x.onenote.window.onenote, { type: 'info', title: global.p3x.onenote.lang.dialog.info, message: message, buttons: [global.p3x.onenote.lang.button.ok] }) mainMenu() mainTray() } }, { label: global.p3x.onenote.lang.label.setProxy, click: action.setProxy, } ], }, { label: global.p3x.onenote.lang.menu.language.label, submenu: languageCheckbox, }, { label: global.p3x.onenote.lang.label.edit, submenu: [ copyLocation, {type: 'separator'}, { label: p3x.onenote.lang.menu.role.edit.undo, role: 'undo' }, { label: p3x.onenote.lang.menu.role.edit.redo, role: 'redo' }, {type: 'separator'}, { label: p3x.onenote.lang.menu.role.edit.cut, role: 'cut' }, { label: p3x.onenote.lang.menu.role.edit.copy, role: 'copy' }, { label: p3x.onenote.lang.menu.role.edit.paste, role: 'paste' }, { label: p3x.onenote.lang.menu.role.edit.pasteandmatchstyle, role: 'pasteandmatchstyle' }, { label: p3x.onenote.lang.menu.role.edit.delete, role: 'delete' }, { label: p3x.onenote.lang.menu.role.edit.selectall, role: 'selectall' } ] }, { label: global.p3x.onenote.lang.label.view, submenu: [ { label: p3x.onenote.lang.menu.role.view.reload, role: 'reload' }, { label: p3x.onenote.lang.menu.role.view.forcereload, role: 'forcereload' }, { label: p3x.onenote.lang.menu.role.view.toggledevtools, role: 'toggledevtools' }, {type: 'separator'}, { label: p3x.onenote.lang.menu.role.view.resetzoom, role: 'resetzoom' }, { label: p3x.onenote.lang.menu.role.view.zoomin, role: 'zoomin' }, { label: p3x.onenote.lang.menu.role.view.zoomout, role: 'zoomout' }, {type: 'separator'}, { label: p3x.onenote.lang.menu.role.view.togglefullscreen, role: 'togglefullscreen' } ] }, { label: global.p3x.onenote.lang.menu.help.title, role: 'help', submenu: [ { label: global.p3x.onenote.lang.label.download, click: action.download }, { label: 'GitHub', click: action.github }, { label: global.p3x.onenote.lang.label.developer, click: action.patrik }, { label: 'P3X', click: action.p3x }, { label: 'Corifeus', click: action.corifeus }, { label: 'NPM', click: action.npm }, ] }, { label: global.p3x.onenote.lang.label.donate, click: () => { shell.openExternal('https://paypal.me/patrikx3') } }, ] if (process.env.APPIMAGE !== undefined) { template[5].submenu.push({type: 'separator'}) template[5].submenu.push({ label: global.p3x.onenote.lang.menu.help.checkUpdates, click: () => { const {autoUpdater} = require("electron-updater"); autoUpdater.checkForUpdatesAndNotify(); } }, ) } const menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu) } module.exports = mainMenu; src/electron/main/create/tray.js000066400000000000000000000020011516100164400171530ustar00rootroot00000000000000const { Menu, Tray } = require('electron') const menus = require('../menus'); const action = require('../action'); function mainTray() { if (!global.p3x.onenote.disableHide) { if (global.p3x.onenote.tray === undefined) { global.p3x.onenote.tray = new Tray(global.p3x.onenote.iconFile) global.p3x.onenote.tray.setToolTip( `${global.p3x.onenote.title} v${global.p3x.onenote.pkg.version}`) const click = () => { console.info('tray on click is executed - if not shown in console. this click is not executed.') action.toggleVisible() } global.p3x.onenote.tray.on('click', click) } const contextMenu = Menu.buildFromTemplate(menus.default()) global.p3x.onenote.tray.setContextMenu(contextMenu) } else { if (global.p3x.onenote.tray !== undefined) { global.p3x.onenote.tray.destroy() global.p3x.onenote.tray = undefined } } } module.exports = mainTray; src/electron/main/create/window/000077500000000000000000000000001516100164400171545ustar00rootroot00000000000000src/electron/main/create/window/onenote.js000066400000000000000000000123501516100164400211620ustar00rootroot00000000000000const { BrowserWindow, app } = require('electron'); function createWindow() { global.p3x.onenote.window.onenote = new BrowserWindow({ icon: global.p3x.onenote.iconFile, title: `${global.p3x.onenote.title} v${global.p3x.onenote.pkg.version}`, backgroundColor: 'black', webPreferences: { nodeIntegration: true, webviewTag: true, } }); global.p3x.onenote.setVisible(true); global.p3x.onenote.window.onenote.loadURL(`file://${__dirname}/../../../window/onenote/index.html`); global.p3x.onenote.window.onenote.on('minimize', function (event) { //event.preventDefault() //global.p3x.onenote.setVisible(false, true); }); global.p3x.onenote.window.onenote.on('close', function (event) { if (!app.isQuiting) { if (!global.p3x.onenote.disableHide) { event.preventDefault() global.p3x.onenote.setVisible(false); } } return false; }); global.p3x.onenote.window.onenote.on('focus', () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'focus' }) }) global.p3x.onenote.window.onenote.on('focus', function () { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-window-state', { action: 'focus' }) global.p3x.onenote.mainMenu(); global.p3x.onenote.mainTray() }); global.p3x.onenote.window.onenote.on('blur', function () { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-window-state', { action: 'blur' }) global.p3x.onenote.mainMenu(); global.p3x.onenote.mainTray() }); global.p3x.onenote.window.onenote.on('hide', function () { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-window-state', { action: 'blur' }) }); //const windowBounds = global.p3x.onenote.conf.get('window-bounds'); const maximized = global.p3x.onenote.conf.get('maximized'); if (maximized === true) { global.p3x.onenote.window.onenote.maximize() } /* else if (windowBounds !== null && windowBounds !== undefined) { global.p3x.onenote.window.onenote.setBounds(windowBounds); } global.p3x.onenote.window.onenote.on('close', () => { if (global.p3x.onenote.conf.get('maximized') !== true) { global.p3x.onenote.conf.set('window-bounds', global.p3x.onenote.window.onenote.getBounds()) } }) */ global.p3x.onenote.window.onenote.on('maximize', () => { global.p3x.onenote.conf.set('maximized', true) }) global.p3x.onenote.window.onenote.on('unmaximize', () => { global.p3x.onenote.conf.set('maximized', false) /* const windowBounds = global.p3x.onenote.conf.get('window-bounds'); if (windowBounds !== null && windowBounds !== undefined) { global.p3x.onenote.window.onenote.setBounds(windowBounds); } */ }) const {autoUpdater} = require("electron-updater"); autoUpdater.on('checking-for-update', () => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', message: global.p3x.onenote.lang.updater["checking-for-update"] }) }) autoUpdater.on('update-available', (info) => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', message: global.p3x.onenote.lang.updater["update-available"] }) }) let firstCheck = true autoUpdater.on('update-not-available', (info) => { if (firstCheck) { firstCheck = false return } global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', message: global.p3x.onenote.lang.updater["update-not-available"] }) }) autoUpdater.on('error', (error) => { console.error(error) global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', error: error, message: global.p3x.onenote.lang.updater["error"]({ errorMessage: error.message.split('\n')[0] }) }) }) /* autoUpdater.on('download-progress', (progressObj) => { /* let log_message = "Download speed: " + progressObj.bytesPerSecond; log_message = log_message + ' - Downloaded ' + progressObj.percent + '%'; log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')'; */ /* global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', message: p3x.onenote.lang.updater["download-progress"]({ progressObj: progressObj, }) }) }) */ autoUpdater.on('update-downloaded', (info) => { global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'toast', message: p3x.onenote.lang.updater["update-downloaded"], }) }); autoUpdater.checkForUpdatesAndNotify(); } module.exports = createWindow; src/electron/main/ipc-main.js000066400000000000000000000011061516100164400164330ustar00rootroot00000000000000const { ipcMain } = require('electron') ipcMain.on('did-finish-load', function () { const toWebview = global.p3x.onenote.conf.get('webview-onenote'); global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-onload-user', toWebview); }); ipcMain.on('p3x-onenote-save', function (event, data) { // console.log('p3x-onenote-save', data) global.p3x.onenote.conf.set('webview-onenote', data); //global.p3x.onenote.conf.set('window-bounds', global.p3x.onenote.window.onenote.getBounds()); }) ipcMain.on('p3x-debug', (event, data) => { console.log(data) })src/electron/main/menus.js000066400000000000000000000022021516100164400160630ustar00rootroot00000000000000const action = require('./action') const menus = { default: () => { let visible = false; if (global.p3x.onenote.window.onenote !== undefined) { visible = global.p3x.onenote.isVisible() ? true : false; } let menus = [ { label: global.p3x.onenote.lang.label.personalHome, click: action.home }, { label: global.p3x.onenote.lang.label.corporateHome, click: action.corporate }, { label: global.p3x.onenote.lang.label.clearCache, click: action.restart }, { label: global.p3x.onenote.lang.label.quit, click: action.quit } ] if (!global.p3x.onenote.disableHide) { const hideMenu = { label: visible ? global.p3x.onenote.lang.label.hide : global.p3x.onenote.lang.label.show, click: action.toggleVisible } menus.splice( 3, 0, hideMenu ); } return menus; } } module.exports = menus;src/electron/main/set-visible.js000066400000000000000000000020351516100164400171660ustar00rootroot00000000000000function setVisible(visible = true, force = false) { if (visible === null) { visible = true; } /* else { mainWindow.webContents.send('p3x-onenote-action', { action: 'focus-save' }) } */ if (global.p3x.onenote.window.onenote !== undefined) { if (visible || (global.p3x.onenote.window.onenote.isMinimized() && !force)) { visible = true; global.p3x.onenote.window.onenote.show(); } else { global.p3x.onenote.window.onenote.minimize() if (!global.p3x.onenote.disableHide) { global.p3x.onenote.window.onenote.hide(); } } } global.p3x.onenote.conf.set('visible', visible); global.p3x.onenote.mainMenu(); global.p3x.onenote.mainTray() if (visible || force) { global.p3x.onenote.window.onenote.focus(); global.p3x.onenote.window.onenote.webContents.send('p3x-onenote-action', { action: 'focus' }) } } module.exports = setVisible;src/electron/window/000077500000000000000000000000001516100164400147655ustar00rootroot00000000000000src/electron/window/onenote/000077500000000000000000000000001516100164400164345ustar00rootroot00000000000000src/electron/window/onenote/action/000077500000000000000000000000001516100164400177115ustar00rootroot00000000000000src/electron/window/onenote/action/load-proxy.js000066400000000000000000000005311516100164400223440ustar00rootroot00000000000000const loadProxy = () => { //console.log('load proxy'); const webview = global.p3x.onenote.webview; const session = webview.getWebContents().session; const proxy = global.p3x.onenote.data.proxy.trim(); session.setProxy({ proxyRules: proxy }, () => { webview.reload(); }) } module.exports = loadProxy;src/electron/window/onenote/action/multi-action/000077500000000000000000000000001516100164400223165ustar00rootroot00000000000000src/electron/window/onenote/action/multi-action/get-location.js000066400000000000000000000010431516100164400252370ustar00rootroot00000000000000let text module.exports = () => { var copy = function (e) { e.preventDefault(); if (e.clipboardData) { e.clipboardData.setData('text/plain', text); } else if (window.clipboardData) { window.clipboardData.setData('Text', text); } } text = global.p3x.onenote.webview.src window.addEventListener('copy', copy); document.execCommand('copy'); window.removeEventListener('copy', copy); global.p3x.onenote.toast.action(global.p3x.onenote.lang.label.copyLocationCopied) }src/electron/window/onenote/action/multi-action/toast.js000066400000000000000000000002001516100164400237760ustar00rootroot00000000000000const toast = (data) => { global.p3x.onenote.toast.action({ message: data.message }) } module.exports = toastsrc/electron/window/onenote/action/multi-actions.js000066400000000000000000000035131516100164400230410ustar00rootroot00000000000000const multiActions = (data) => { const webview = global.p3x.onenote.webview; switch (data.action) { /* case 'focus-save': //console.log('focus-save') webview.getWebContents().executeJavaScript(`window.p3xOnenoteActiveElement = document.activeElement; window.p3xIframe = document.getElementById('sdx_ow_iframe'); window.p3xIframeDoc = window.p3xIframe.contentDocument || window.p3xIframe.contentWindow.document; console.log(window.p3xIframeDoc.activeElement);`) break; */ case 'focus': // webview.openDevTools(); if (webview !== undefined) { webview.focus() /* webview.getWebContents().executeJavaScript(`var a = 'foo'; Promise.resolve(a);`).then(result => { console.log(result) }).catch(e => console.error(e)) */ //webview.getWebContents().executeJavaScript(`console.log(window.p3xOnenoteActiveElement)`) //document.activeElement } break; case 'restart': const session = webview.getWebContents().session; session.clearStorageData(() => { //console.log('storage cleared'); webview.reload(); }) break; case 'home': webview.src = global.p3x.onenote.url.notebooks break; case 'corporate': webview.src = 'https://www.onenote.com/notebooks?auth=2&auth_upn=my_corporate_email_address' break; case 'get-location': require('./multi-action/get-location')() break; case 'toast': require('./multi-action/toast')(data) break; } } module.exports = multiActions;src/electron/window/onenote/action/set-proxy.js000066400000000000000000000016201516100164400222200ustar00rootroot00000000000000const { ipcRenderer} = require('electron'); module.exports = async(data) => { let valueProxy = ''; let cancelled = false; try { valueProxy = await global.p3x.onenote.prompt.setProxy(); valueProxy = valueProxy === undefined ? '' : valueProxy.trim(); } catch(e) { if (e !== undefined) { console.error(e); } else { cancelled = true; } } finally { if (!cancelled) { global.p3x.onenote.data.proxy = valueProxy; if (valueProxy === '') { global.p3x.onenote.toast.setProxy.clear() } else { global.p3x.onenote.toast.setProxy.set(valueProxy) } //console.log('set-proxy', global.p3x.onenote.data.proxy) ipcRenderer.send('p3x-onenote-save', global.p3x.onenote.data); require('./load-proxy')() } } }src/electron/window/onenote/angular.js000066400000000000000000000022351516100164400204250ustar00rootroot00000000000000require('angular/angular'); require('angular-aria'); require('angular-animate'); require('angular-messages'); require('angular-material'); global.p3x.onenote.ng = angular.module('p3x-onenote', [ 'ngMaterial', 'ngMessages' ]); require('./angular/prompt'); require('./angular/toast'); global.p3x.onenote.ng.config(($mdAriaProvider, $mdThemingProvider) => { $mdAriaProvider.disableWarnings(); $mdThemingProvider.theme('default').primaryPalette('purple').accentPalette('blue')//.warnPalette('amber'); }) global.p3x.onenote.ng.run((p3xOnenotePrompt, p3xOnenoteToast, $rootScope) => { global.p3x.onenote.prompt = p3xOnenotePrompt; global.p3x.onenote.toast = p3xOnenoteToast; global.p3x.onenote.root = $rootScope p3x.onenote.toast.action(p3x.onenote.lang.slow) $rootScope.p3x = { onenote: { lang: global.p3x.onenote.lang, location: undefined, copyLocation: require('./action/multi-action/get-location'), } } }) angular.element(document).ready(() => { const bootstrapElement = document.getElementById('p3x-onenote-bootstrap'); angular.bootstrap(bootstrapElement, ['p3x-onenote']); }) src/electron/window/onenote/angular/000077500000000000000000000000001516100164400200655ustar00rootroot00000000000000src/electron/window/onenote/angular/prompt/000077500000000000000000000000001516100164400214065ustar00rootroot00000000000000src/electron/window/onenote/angular/prompt/index.js000066400000000000000000000106051516100164400230550ustar00rootroot00000000000000global.p3x.onenote.ng.factory('p3xOnenotePrompt', ($mdDialog) => { return new function() { this.setProxy = () => { const confirm = $mdDialog.prompt() .title(p3x.onenote.lang.label.setProxy) .textContent(p3x.onenote.lang.dialog.setProxy.info) .placeholder(p3x.onenote.lang.dialog.setProxy.placeholder) .ariaLabel(p3x.onenote.lang.dialog.setProxy.placeholder) .initialValue(global.p3x.onenote.data.proxy) //.targetEvent(ev) //.required(true) .cancel(p3x.onenote.lang.button.cancel) .ok(p3x.onenote.lang.button.save) return $mdDialog.show(confirm) } this.goToUrl = () => { const confirm = $mdDialog.prompt() .title(p3x.onenote.lang.label.openUrl) .textContent(p3x.onenote.lang.dialog.openUrl.info) .placeholder(p3x.onenote.lang.dialog.openUrl.placeholder) .ariaLabel(p3x.onenote.lang.dialog.openUrl.placeholder) //.initialValue(global.p3x.onenote.data.proxy) //.targetEvent(ev) //.required(true) .cancel(p3x.onenote.lang.button.cancel) .ok(p3x.onenote.lang.button.go) return $mdDialog.show(confirm) } this.configureLanguge = (opts) => { return $mdDialog.show({ template: `

${p3x.onenote.lang.menu.language.dialog.label}

${p3x.onenote.lang.menu.language.dialog.personal} ${p3x.onenote.lang.menu.language.dialog.coperate} ${p3x.onenote.lang.button.cancel}
`, controller: function($mdDialog, $scope) { $scope.exit = (answer) => { $mdDialog.hide(answer); } $scope.cancel = $mdDialog.cancel } }); } this.redirect = (opts) => { return $mdDialog.show({ template: `

${p3x.onenote.lang.label.promptRedirectUrlTitle}

${p3x.onenote.lang.dialog.redirect.url({url: opts.url})}
${p3x.onenote.lang.dialog.redirect.urlExternal} ${p3x.onenote.lang.dialog.redirect.urlInternal} ${p3x.onenote.lang.button.cancel}
`, controller: function($mdDialog, $scope) { $scope.exit = (answer) => { $mdDialog.hide(answer); } $scope.cancel = $mdDialog.cancel } }); } } }) src/electron/window/onenote/angular/toast/000077500000000000000000000000001516100164400212175ustar00rootroot00000000000000src/electron/window/onenote/angular/toast/index.js000066400000000000000000000012661516100164400226710ustar00rootroot00000000000000global.p3x.onenote.ng.factory('p3xOnenoteToast', ($mdToast) => { const toast = (options) => { if (typeof options === 'string') { options = { message: options, } } $mdToast.show( $mdToast.simple() .textContent(options.message) .position('bottom right') .hideDelay(5000) ); } return new function() { this.action = toast; this.setProxy = new function() { this.clear = () => toast(p3x.onenote.lang.dialog.setProxy.clear) this.set = (value) => toast(p3x.onenote.lang.dialog.setProxy.set(value)) } } })src/electron/window/onenote/core/000077500000000000000000000000001516100164400173645ustar00rootroot00000000000000src/electron/window/onenote/core/overlay.css000066400000000000000000000006521516100164400215620ustar00rootroot00000000000000 #p3xr-overlay { z-index: 999999; font-size: 125%; position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; text-align:center; /*Flexbox*/ display: flex; flex-direction: column; align-items: center; align-content: center; justify-content: center; background-color: rgba(0, 0, 0, 0.9); z-index: 100; color: rgba(128, 128, 128, 0.5); } #p3xr-overlay i { font-size: 400% !important; } src/electron/window/onenote/core/overlay.js000066400000000000000000000027211516100164400214050ustar00rootroot00000000000000let shown = false let hideTimeout const ipc = require('electron').ipcRenderer; let showCount = 0 if (process.versions.hasOwnProperty('electron')) { p3x.onenote.ui.overlay = new function() { const template = (options = {}) => { return `
${options.hasOwnProperty('message') ? "

" : ''} ${options.hasOwnProperty('message') ? options.message : ''}
` } this.show = (options = {}) => { /* ipc.send('p3x-debug', { 'overlay show': shown, }) */ showCount++ if (showCount > p3x.onenote.wrongUrlMaxAllowed) { require('../action/multi-actions')({ action: 'home' }) this.hide() } if (shown) { return } shown = true ///this.hide() //console.warn('p3xr.ui.overlay show') $body.append(template(options)) } this.hide = () => { /* ipc.send('p3x-debug', { 'overlay hide': 'done', }) */ //console.warn('p3xr.ui.overlay hide') $body.find('#p3xr-overlay').remove() shown = false showCount = 0 } } } src/electron/window/onenote/event/000077500000000000000000000000001516100164400175555ustar00rootroot00000000000000src/electron/window/onenote/event/handler.js000066400000000000000000000104661516100164400215370ustar00rootroot00000000000000const electron =require('electron'); const shell = electron.shell; const ipc = electron.ipcRenderer; const handler = (options) => { const { webview } = options; /* webview.addEventListener('did-stop-loading', function(event) { // webview.insertCSS(window.cssData); }); */ // const allowedUrlRegex = /^((https?:\/\/((onedrive\.live\.com\/((redir\?resid\=)|((redir|edit).aspx\?)))|((www\.)?onenote\.com)|(login\.)|(g\.live\.))|(about\:blank)))/i // const allowedUrlRegex2 = /^https?:\/\/d\.docs\.live\.net\/([a-z0-9]{16})\//i //const disalledUrl = /^((https?:\/\/))/i let windowInterval const generateInterval = () => { windowInterval = setInterval(() => { //console.log(webview.src, global.p3x.onenote.root.p3x.onenote.location) /* ipc.send('p3x-debug', { 'new-window': webview.src, allowed: allowedUrlRegex.test(webview.src) }) */ /* if (!allowedUrlRegex.test(webview.src)) { p3x.onenote.ui.overlay.show({ message: p3x.onenote.lang.label.disallowedContent }) } else { p3x.onenote.ui.overlay.hide() } */ if (global.p3x.onenote.root.p3x.onenote.location !== webview.src) { global.p3x.onenote.root.p3x.onenote.location = webview.src global.p3x.onenote.data.url = webview.src global.p3x.onenote.root.$digest() ipc.send('p3x-onenote-save', global.p3x.onenote.data); } }, p3x.onenote.wrongUrlTimeout) } generateInterval() ipc.on('p3x-onenote-window-state', function(event, data) { clearInterval(windowInterval) if (data.action === 'focus') { generateInterval() } }) /* webview.addEventListener('did-stop-loading', function(event) { // webview.insertCSS(p3x.onenote.hackCss); }); webview.addEventListener('will-navigate', function(event, url) { ipc.send('p3x-debug', { 'will-navigate': event, url: url, }); }); webview.addEventListener('will-redirect', function(event, url) { ipc.send('p3x-debug', { 'will-redirect': event, url: url, }); }); */ webview.addEventListener('did-navigate', function(event, url) { /* ipc.send('p3x-debug', { 'did-navigate': event, url: url, }); */ global.p3x.onenote.data.url = webview.src; ipc.send('p3x-onenote-save', global.p3x.onenote.data); global.p3x.onenote.root.p3x.onenote.location = webview.src global.p3x.onenote.root.$digest() }); webview.addEventListener('new-window', async function(event) { event.preventDefault() //p3x.onenote.toast.action(p3x.onenote.lang.label.unknownLink) if (event.url.trim() === 'about:blank') { //webview.src = event.url; return } global.p3x.onenote.prompt.redirect({ url: event.url } ).then((answer) => { if (answer === 'internal') { webview.src = event.url; } else { shell.openExternal(event.url) } }) //; /* ipc.send('p3x-debug', { 'new-window': event.url, allowed: allowedUrlRegex.test(event.url) }) */ //console.log(event.url) /* if (allowedUrlRegex2.test(event.url)) { // https://onedrive.live.com/redir?resid=3B992A1F2BEDFFA7%21955&page=Edit const urlParts = event.url.match(allowedUrlRegex2) /* ipc.send('p3x-debug', { urlParts: urlParts }) */ /* p3x.onenote.toast.action(p3x.onenote.lang.redirecting) webview.src = `https://onedrive.live.com/redir?resid=${urlParts[1]}%21955&page=Edit`; } else */ /* if (allowedUrlRegex.test(event.url) || allowedUrlRegex2.test(event.url)) { p3x.onenote.toast.action(p3x.onenote.lang.redirecting) webview.src = event.url; } else { shell.openExternal(event.url); } */ }); } module.exports =handler src/electron/window/onenote/hack.css000066400000000000000000000000671516100164400200570ustar00rootroot00000000000000:root .BreadcrumbItem { display: none !important; }src/electron/window/onenote/index.html000066400000000000000000000020501516100164400204260ustar00rootroot00000000000000
 {{ $root.p3x.onenote.location }}
src/electron/window/onenote/ipc/000077500000000000000000000000001516100164400172075ustar00rootroot00000000000000src/electron/window/onenote/ipc/handler.js000066400000000000000000000051621516100164400211660ustar00rootroot00000000000000const { ipcRenderer } =require('electron'); const setProxy = require('../action/set-proxy'); const multiActions = require('../action/multi-actions'); const handler = (options) => { const { webview } = options; ipcRenderer.on('p3x-onenote-onload-user', function(event, data) { if (data !== null) { global.p3x.onenote.data = data; } //console.log('p3x-onenote-onload-user', data) if (typeof(global.p3x.onenote.data) === 'object' && global.p3x.onenote.data.hasOwnProperty('url') && global.p3x.onenote.data.url !== 'about:blank') { webview.src = global.p3x.onenote.data.url; } else { webview.src = 'https://www.onenote.com/notebooks' } if (global.p3x.onenote.data.proxy.trim() !== '') { require('../action/load-proxy')(); } }) ipcRenderer.on('p3x-onenote-action', function(event, data) { multiActions(data); }) ipcRenderer.on('p3x-onenote-action-set-proxy', (event, data) => { setProxy(data); }) ipcRenderer.on('p3x-onenote-language', async (event, data) => { global.p3x.onenote.lang = global.p3x.onenote.translations[data.translation] global.p3x.onenote.toast.action(global.p3x.onenote.lang.menu.language.alert) let type = ''; let cancelled = false; try { type = await global.p3x.onenote.prompt.configureLanguge(data); type = type === undefined ? '' : type.trim(); } catch(e) { if (e !== undefined) { console.error(e); } else { cancelled = true; } } finally { if (!cancelled) { if (type === 'corporate') { global.p3x.onenote.webview.src = 'https://www.onenote.com/notebooks?auth=2&auth_upn=my_corporate_email_address&omkt=' + data.translation } else { global.p3x.onenote.webview.src = 'https://www.onenote.com/notebooks?omkt=' + data.translation } } } }) ipcRenderer.on('p3x-onenote-action-open-url', async(event, data) => { let url = ''; let cancelled = false; try { url = await global.p3x.onenote.prompt.goToUrl(); url = url === undefined ? '' : url.trim(); } catch(e) { if (e !== undefined) { console.error(e); } else { cancelled = true; } } finally { if (!cancelled) { global.p3x.onenote.webview.src = url } } }) } module.exports = handler src/electron/window/onenote/load.js000066400000000000000000000041471516100164400177170ustar00rootroot00000000000000const { ipcRenderer } = require('electron'); // fontawesome require('@fortawesome/fontawesome-free/js/all') // jquery global.$ = require('jquery/dist/jquery.slim') global.jQuery = global.$ /* const fs = require('fs') fs.readFile(__dirname + '/hack.css', 'utf-8', function(err, data) { if (err) { ipc.send('p3x-debug', { 'messsage': 'hack.css is not working', error: err, }); } p3x.onenote.hackCss = data; }); */ const configstore = require('configstore'); const pkg = require('../../../../package.json'); const conf = new configstore(pkg.name); let translationKey = conf.get('lang') const langTranslations = { 'en-US': require('../../../translation/en-US'), 'de-DE': require('../../../translation/de-DE'), } const translation = langTranslations[translationKey] global.p3x = { onenote: { url: { /* https://www.onenote.com/notebooks?omkt=en-US https://www.onenote.com/notebooks?omkt=de-DE https://www.onenote.com/notebooks?omkt=hu-HU */ notebooks: 'https://www.onenote.com/notebooks', }, ui: { }, hackCss: undefined, ng:undefined, webview: undefined, pkg: require('../../../../package'), translations: langTranslations, lang: translation, data: { url: 'about:blank', proxy: '', }, prompt: undefined, toast: undefined, root: undefined, wrongUrlTimeout: 1000, wrongUrlMaxAllowed: 5, } } document.title = `${global.p3x.onenote.lang.title} v${global.p3x.onenote.pkg.version}`; //require('./core/overlay') require('./angular') window.p3xOneNoteOnLoad = function() { $(() => { global.$body = $('body'); }) const webview = document.getElementById("p3x-onenote-webview"); global.p3x.onenote.webview = webview; webview.focus() const ipcHandler = require('./ipc/handler'); ipcHandler({ webview: webview, }) const eventHandler = require('./event/handler'); eventHandler({ webview: webview, }) ipcRenderer.send('did-finish-load'); } src/electron/window/onenote/style.css000066400000000000000000000017071516100164400203130ustar00rootroot00000000000000:root { --p3x-onenote-navbar-bg: #7719aa; --p3x-onenote-navbar-color: white; --p3x-onenote-bottom-bar-height: 20px; --p3x-onenote-bottom-bar-font-size: 12px; } body { background-color: white; padding: 0; margin: 0; overflow: hidden; } #p3x-onenote-bottom-bar { cursor: pointer; position: fixed; bottom: 0px; left: 0px; width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; height: var(--p3x-onenote-bottom-bar-height); font-size: var(--p3x-onenote-bottom-bar-font-size); font-family: Roboto; line-height: var(--p3x-onenote-bottom-bar-height); background-color: var(--p3x-onenote-navbar-bg); color: var(--p3x-onenote-navbar-color); } #p3x-onenote-webview { position: fixed; top: 0px; left: 0px; overflow: hidden; width: 100%; height: calc(100% - var(--p3x-onenote-bottom-bar-height)); } .md-toast-content { z-index: 110; }src/translation/000077500000000000000000000000001516100164400142015ustar00rootroot00000000000000src/translation/de-DE.js000066400000000000000000000114171516100164400154210ustar00rootroot00000000000000const translation = { title: 'P3X OneNote', label: { donate: 'Spenden', allowMultiple: { checkbox: 'Mehrere App-Instanzen erlauben (möglicherweise mit Quirks)', message: { yes: 'Nutzung mehrerer Instanzen aktiv (möglicherweise mit Quirks).', no: 'Nutzung mehrerer Instanzen deaktiviert (keine Quirks).' } }, disableHide: { //yes: 'Set the close button behaviour that will minimize to the tray instead of quitting', //no: 'Set the close button behaviour as to really quit the app', checkbox: 'Schließen-Knopf Einstellung', message: { yes: 'Schließen-Knopf beendet die Anwendung.', no: 'Schließen-Knopf minimiert die Anwendung.', } }, settings: 'Einstellungen', setProxy: 'Proxy-Einstellungen', openUrl: 'URL öffnen', promptRedirectUrlTitle: 'Umleiten zu URL', edit: 'Bearbeiten', view: 'Anzeigen', download: 'Download', developer: 'Patrik Laszlo', personalHome: 'Persönlich', corporateHome: 'Business', clearCache: 'Abmelden und danach diese Menüoption aktiveren, um den Cache zu leeren', quit: 'Beenden', show: 'Maximieren', hide: 'Minimieren', copyLocation: 'Speicherort in Zwischenablage kopieren', copyLocationCopied: 'Speicherort in Zwischenablage kopiert.', //disallowedContent: 'Disallowed content! If not working, hang on, it will reset to the default home. (Max 5 seconds).', //unknownLink: 'Hang on, it might change while loading to the destination. If this is not a OneNote page, free to click on the P3X OneNote menu home' }, dialog: { info: 'Info', openUrl: { info: 'Sie können zu jeder gewünschten URL gelangen', placeholder: 'Eine valide URL', }, minimizationBehavior: { title: 'Minimieren Einstellungen', }, setProxy: { placeholder: 'Proxy-Einstellungen', info: 'Um den Proxy-Cache zu leeren, nutzen Sie einen leeren String.', clear: 'Der Proxy ist deaktiviert.', set: (value) => { return `Proxyserver-Adresse ist ${value}` } }, redirect: { url: (opts) => { return `${opts.url}` }, urlExternal: 'Extern', urlInternal: 'Intern', } }, button: { yes: 'Ja', no: 'Nein', ok: 'OK', cancel: 'Abbrechen', save: 'Speichern', clear: 'Neu', go: 'Los', }, menu: { action: 'Bearbeiten', role: { edit: { undo: 'Rückgängig', redo: 'Wiederherstellen', cut: 'Ausschneiden', copy: 'Kopieren', paste: 'Einfügen', pasteandmatchstyle: 'Einfügen und Stil beibehalten', delete: 'Löschen', selectall: 'Alles auswählen', }, view: { reload: 'Neu laden', forcereload: 'Neu laden erzwingen', toggledevtools: 'Umschalten Entwicklertools', resetzoom: 'Zoom Normal', zoomin: 'Vergrößern', zoomout: 'Verkleinern', togglefullscreen: 'Vollbild', } }, help: { title: 'Hilfe', checkUpdates: 'Auf Updates prüfen' }, language: { label: 'Sprache / Language', alert: 'Sprache auf Deutsch eingestellt.', dialog: { label: 'Versuchen Sie, die Online OneNote-Sprache zu konfigurieren?', coperate: 'Korporativ', personal: 'Persönlich', }, translations: { 'en-US': 'Englisch / English', 'de-DE': 'Deutsch / German', }, }, }, redirecting: 'Einen Moment, es wird zu einem neuen Notebook umgeleitet. Dies kann eine Weile dauern...', slow: 'Einen Moment, das Laden von OneNote kann eine Weile dauern...', updater: { 'checking-for-update': 'Prüfen auf neue Updates ...', 'update-available': 'Aktuellste Version wird geladen ...', 'update-not-available': 'Version ist aktuell.', error: (opts) => { return `Error in auto-updater: ${opts.errorMessage}` }, 'download-progress': (opts) => { return 'Heruntergeladen ' + opts.progressObj.percent + '%' }, 'update-downloaded': 'Aktuellste Version geladen. Neustarten um den Updatevorgang abzuschließen.' } }; module.exports = translation; src/translation/en-US.js000066400000000000000000000106671516100164400155000ustar00rootroot00000000000000const translation = { title: 'P3X OneNote', label: { donate: 'Donate', allowMultiple: { checkbox: 'Allow multiple instances (with some quirks)', message: { yes: 'Now you can use multiple instance with some quirks.', no: 'Now, it allows only one instance, no quirks' } }, disableHide: { //yes: 'Set the close button behaviour that will minimize to the tray instead of quitting', //no: 'Set the close button behaviour as to really quit the app', checkbox: 'Close to the tray', message: { yes: 'The close button really closes the app.', no: 'The close button, instead of quitting, it minimizes the app to the tray.', } }, settings: 'Settings', setProxy: 'Set proxy', openUrl: 'Open an URL', promptRedirectUrlTitle: 'Redirect to url', edit: 'Edit', view: 'View', download: 'Download', developer: 'Patrik Laszlo', personalHome: 'Personal home', corporateHome: 'Corporate home', clearCache: 'First sign off, then click this menu option to clear the cache', quit: 'Quit', show: 'Show', hide: 'Hide', copyLocation: 'Copy this location to the clipboard', copyLocationCopied: 'The location is copied to the clipboard.', //disallowedContent: 'Disallowed content! If not working, hang on, it will reset to the default home. (Max 5 seconds).', //unknownLink: 'Hang on, it might change while loading to the destination. If this is not a OneNote page, free to click on the P3X OneNote menu home' }, dialog: { info: 'Info', openUrl: { info: 'You can go to any URL you wish', placeholder: 'a valid URL', }, minimizationBehavior: { title: 'Minimization behavior', }, setProxy: { placeholder: 'Proxy setting', info: 'To clear the proxy, use an empty string.', clear: 'The proxy is turned off.', set: (value) => { return `The proxy is set as ${value}` } }, redirect: { url: (opts) => { return `${opts.url}` }, urlExternal: 'External', urlInternal: 'Internal', } }, button: { yes: 'Yes', no: 'No', ok: 'OK', cancel: 'Cancel', save: 'Save', clear: 'Clear', go: 'Go', }, menu: { action: 'Action', role: { edit: { undo: 'Undo', redo: 'Redo', cut: 'Cut', copy: 'Copy', paste: 'Paste', pasteandmatchstyle: 'Paste and match style', delete: 'Delete', selectall: 'Select all', }, view: { reload: 'Reload', forcereload: 'Force reload', toggledevtools: 'Toggle development tools', resetzoom: 'Reset Zoom', zoomin: 'Zoom In', zoomout: 'Zoom out', togglefullscreen: 'Toggle full screen', } }, help: { title: 'Help', checkUpdates: 'Check updates' }, language: { label: 'Language', alert: 'Language set to english.', dialog: { label: 'Try to configure Online OneNote language?', coperate: 'Coperate', personal: 'Personal', }, translations: { 'en-US': 'English', 'de-DE': 'Deutsch / German', } }, }, redirecting: 'Hang on, redirecting to a new notebook. It takes some time...', slow: 'Hang on, loading OneNote takes some time...', updater: { 'checking-for-update': 'Checking for update ...', 'update-available': 'Downloading latest release ...', 'update-not-available': 'No new update.', error: (opts) => { return `Error in auto-updater: ${opts.errorMessage}` }, 'download-progress': (opts) => { return 'Downloaded ' + opts.progressObj.percent + '%' }, 'update-downloaded': 'Update downloaded. You may restart the app to update.' } }; module.exports = translation;