From 060f4e6632875b6b9cbe4aa367fea5a6bfd1be02 Mon Sep 17 00:00:00 2001 From: dev Date: Mon, 16 Nov 2009 19:44:54 +0000 Subject: [PATCH 1/2] disapproval of revision 'd07b92fb678f4dc87b62eaaeab002820b25583b6' --- apps/i2pbote/WebContent/META-INF/MANIFEST.MF | 3 - .../classes/commons-logging.properties | 1 - apps/i2pbote/WebContent/WEB-INF/lib/mail.jar | Bin 434812 -> 0 bytes .../WebContent/WEB-INF/tags/emailIdentity.tag | 2 - .../WebContent/WEB-INF/tlds/i2pbote.tld | 82 ---- apps/i2pbote/WebContent/WEB-INF/web.xml | 16 - apps/i2pbote/WebContent/buttonFrame.jsp | 47 -- apps/i2pbote/WebContent/checkMail.jsp | 26 - apps/i2pbote/WebContent/deleteIdentity.jsp | 21 - apps/i2pbote/WebContent/editIdentity.jsp | 82 ---- apps/i2pbote/WebContent/folder.jsp | 26 - apps/i2pbote/WebContent/footer.jsp | 2 - apps/i2pbote/WebContent/header.jsp | 53 -- apps/i2pbote/WebContent/i2pbote.css | 318 ------------ apps/i2pbote/WebContent/identities.jsp | 72 --- .../WebContent/images/darkbluetile.png | Bin 298 -> 0 bytes .../WebContent/images/darkerbluetile.png | Bin 1496 -> 0 bytes apps/i2pbote/WebContent/images/delete.png | Bin 475 -> 0 bytes .../WebContent/images/errortriangle.png | Bin 1637 -> 0 bytes apps/i2pbote/WebContent/images/favicon16.png | Bin 714 -> 0 bytes apps/i2pbote/WebContent/images/folder.png | Bin 600 -> 0 bytes apps/i2pbote/WebContent/images/help.png | Bin 852 -> 0 bytes apps/i2pbote/WebContent/images/i2pbote_de.png | Bin 16703 -> 0 bytes apps/i2pbote/WebContent/images/i2pbote_en.png | Bin 16251 -> 0 bytes apps/i2pbote/WebContent/images/info.png | Bin 780 -> 0 bytes .../WebContent/images/lightbluefade.png | Bin 234 -> 0 bytes .../WebContent/images/lightbluetile.png | Bin 1410 -> 0 bytes apps/i2pbote/WebContent/images/link.png | Bin 564 -> 0 bytes .../WebContent/images/mail_folder_sent.png | Bin 1234 -> 0 bytes .../WebContent/images/mail_mark_unread.png | Bin 794 -> 0 bytes apps/i2pbote/WebContent/images/sandtile.png | Bin 1392 -> 0 bytes apps/i2pbote/WebContent/images/tabletile.png | Bin 1075 -> 0 bytes .../WebContent/images/tabletile_alt.png | Bin 1131 -> 0 bytes .../WebContent/images/tabletilelighter.png | Bin 1184 -> 0 bytes .../WebContent/images/tabletitlelight.png | Bin 227 -> 0 bytes apps/i2pbote/WebContent/images/wait.gif | Bin 2182 -> 0 bytes apps/i2pbote/WebContent/images/warning.png | Bin 803 -> 0 bytes apps/i2pbote/WebContent/images/yellowtile.png | Bin 1313 -> 0 bytes apps/i2pbote/WebContent/index.jsp | 8 - apps/i2pbote/WebContent/moz_fix2.xml | 22 - apps/i2pbote/WebContent/newEmail.jsp | 59 --- apps/i2pbote/WebContent/newIdentity.jsp | 13 - apps/i2pbote/WebContent/noIdentities.jsp | 43 -- apps/i2pbote/WebContent/saveIdentity.jsp | 31 -- apps/i2pbote/WebContent/sendEmail.jsp | 13 - apps/i2pbote/doc/techdoc.txt | 462 ------------------ apps/i2pbote/doc/userdoc.txt | 18 - apps/i2pbote/src/i2p/bote/CheckEmailTask.java | 130 ----- apps/i2pbote/src/i2p/bote/Configuration.java | 192 -------- .../src/i2p/bote/EmailDestination.java | 154 ------ apps/i2pbote/src/i2p/bote/EmailIdentity.java | 123 ----- apps/i2pbote/src/i2p/bote/I2PBote.java | 256 ---------- apps/i2pbote/src/i2p/bote/Identities.java | 169 ------- apps/i2pbote/src/i2p/bote/Util.java | 81 --- .../src/i2p/bote/folder/DhtPacketFolder.java | 58 --- .../src/i2p/bote/folder/EmailFolder.java | 54 -- apps/i2pbote/src/i2p/bote/folder/Folder.java | 96 ---- .../src/i2p/bote/folder/FolderElement.java | 17 - .../bote/folder/IncompleteEmailFolder.java | 132 ----- .../i2p/bote/folder/IndexPacketFolder.java | 42 -- apps/i2pbote/src/i2p/bote/folder/Outbox.java | 72 --- .../src/i2p/bote/folder/PacketFolder.java | 62 --- apps/i2pbote/src/i2p/bote/network/DHT.java | 34 -- .../i2p/bote/network/DhtStorageHandler.java | 17 - .../bote/network/EmailAddressResolver.java | 18 - .../i2p/bote/network/I2PPacketDispatcher.java | 101 ---- .../src/i2p/bote/network/I2PSendQueue.java | 354 -------------- .../src/i2p/bote/network/PacketBatch.java | 108 ---- .../src/i2p/bote/network/PacketBatchItem.java | 32 -- .../src/i2p/bote/network/PacketListener.java | 12 - .../src/i2p/bote/network/PeerManager.java | 26 - .../bote/network/SendQueuePacketListener.java | 12 - .../bote/network/kademlia/BucketManager.java | 323 ------------ .../kademlia/ClosestNodesLookupTask.java | 198 -------- .../i2p/bote/network/kademlia/KBucket.java | 260 ---------- .../network/kademlia/KademliaConstants.java | 13 - .../bote/network/kademlia/KademliaDHT.java | 376 -------------- .../network/kademlia/KademliaException.java | 9 - .../bote/network/kademlia/KademliaPeer.java | 76 --- .../bote/network/kademlia/KademliaUtil.java | 19 - .../i2p/bote/packet/CommunicationPacket.java | 116 ----- .../src/i2p/bote/packet/DataPacket.java | 87 ---- apps/i2pbote/src/i2p/bote/packet/Email.java | 166 ------- .../src/i2p/bote/packet/EmailPacket.java | 246 ---------- .../src/i2p/bote/packet/EmailSession.java | 49 -- .../src/i2p/bote/packet/I2PBotePacket.java | 82 ---- .../src/i2p/bote/packet/IndexPacket.java | 108 ---- .../i2pbote/src/i2p/bote/packet/PeerList.java | 70 --- .../src/i2p/bote/packet/PeerListRequest.java | 36 -- .../src/i2p/bote/packet/RelayPacket.java | 93 ---- .../src/i2p/bote/packet/RelayRequest.java | 79 --- .../src/i2p/bote/packet/ResponsePacket.java | 62 --- .../src/i2p/bote/packet/StatusCode.java | 5 - .../i2pbote/src/i2p/bote/packet/TypeCode.java | 12 - .../i2pbote/src/i2p/bote/packet/UniqueId.java | 89 ---- .../bote/packet/dht/DhtStorablePacket.java | 54 -- .../bote/packet/dht/FindClosePeersPacket.java | 55 --- .../i2p/bote/packet/dht/RetrieveRequest.java | 64 --- .../src/i2p/bote/packet/dht/StoreRequest.java | 74 --- .../i2p/bote/service/I2PBoteException.java | 11 - .../src/i2p/bote/service/I2PBoteThread.java | 20 - .../src/i2p/bote/service/OutboxProcessor.java | 155 ------ .../src/i2p/bote/service/POP3Service.java | 13 - .../i2p/bote/service/RelayPacketSender.java | 82 ---- .../src/i2p/bote/service/SMTPService.java | 13 - .../src/i2p/bote/service/StreamHandler.java | 8 - .../i2p/bote/service/StreamReceivedEvent.java | 25 - .../src/i2p/bote/web/CheckMailTag.java | 10 - apps/i2pbote/src/i2p/bote/web/JSPHelper.java | 118 ----- .../src/i2p/bote/web/PrintNumDhtPeersTag.java | 26 - .../i2p/bote/web/PrintNumRelayPeersTag.java | 26 - .../src/i2p/bote/web/ReturnStatus.java | 33 -- .../src/i2p/bote/web/SendEmailTag.java | 61 --- .../src/i2p/bote/web/ServiceInitializer.java | 24 - apps/i2pbote/test/i2p/bote/AllTests.java | 26 - .../network/kademlia/KademliaDHTTest.java | 86 ---- .../test/i2p/bote/packet/EmailPacketTest.java | 54 -- .../i2p/bote/packet/I2PBotePacketTest.java | 33 -- .../i2p/bote/packet/ResponsePacketTest.java | 48 -- .../kademlia/FindCloseNodesPacketTest.java | 36 -- .../packet/kademlia/StorageRequestTest.java | 45 -- 121 files changed, 7546 deletions(-) delete mode 100644 apps/i2pbote/WebContent/META-INF/MANIFEST.MF delete mode 100644 apps/i2pbote/WebContent/WEB-INF/classes/commons-logging.properties delete mode 100644 apps/i2pbote/WebContent/WEB-INF/lib/mail.jar delete mode 100644 apps/i2pbote/WebContent/WEB-INF/tags/emailIdentity.tag delete mode 100644 apps/i2pbote/WebContent/WEB-INF/tlds/i2pbote.tld delete mode 100644 apps/i2pbote/WebContent/WEB-INF/web.xml delete mode 100644 apps/i2pbote/WebContent/buttonFrame.jsp delete mode 100644 apps/i2pbote/WebContent/checkMail.jsp delete mode 100644 apps/i2pbote/WebContent/deleteIdentity.jsp delete mode 100644 apps/i2pbote/WebContent/editIdentity.jsp delete mode 100644 apps/i2pbote/WebContent/folder.jsp delete mode 100644 apps/i2pbote/WebContent/footer.jsp delete mode 100644 apps/i2pbote/WebContent/header.jsp delete mode 100644 apps/i2pbote/WebContent/i2pbote.css delete mode 100644 apps/i2pbote/WebContent/identities.jsp delete mode 100644 apps/i2pbote/WebContent/images/darkbluetile.png delete mode 100644 apps/i2pbote/WebContent/images/darkerbluetile.png delete mode 100644 apps/i2pbote/WebContent/images/delete.png delete mode 100644 apps/i2pbote/WebContent/images/errortriangle.png delete mode 100644 apps/i2pbote/WebContent/images/favicon16.png delete mode 100644 apps/i2pbote/WebContent/images/folder.png delete mode 100644 apps/i2pbote/WebContent/images/help.png delete mode 100644 apps/i2pbote/WebContent/images/i2pbote_de.png delete mode 100644 apps/i2pbote/WebContent/images/i2pbote_en.png delete mode 100644 apps/i2pbote/WebContent/images/info.png delete mode 100644 apps/i2pbote/WebContent/images/lightbluefade.png delete mode 100644 apps/i2pbote/WebContent/images/lightbluetile.png delete mode 100644 apps/i2pbote/WebContent/images/link.png delete mode 100644 apps/i2pbote/WebContent/images/mail_folder_sent.png delete mode 100644 apps/i2pbote/WebContent/images/mail_mark_unread.png delete mode 100644 apps/i2pbote/WebContent/images/sandtile.png delete mode 100644 apps/i2pbote/WebContent/images/tabletile.png delete mode 100644 apps/i2pbote/WebContent/images/tabletile_alt.png delete mode 100644 apps/i2pbote/WebContent/images/tabletilelighter.png delete mode 100644 apps/i2pbote/WebContent/images/tabletitlelight.png delete mode 100644 apps/i2pbote/WebContent/images/wait.gif delete mode 100644 apps/i2pbote/WebContent/images/warning.png delete mode 100644 apps/i2pbote/WebContent/images/yellowtile.png delete mode 100644 apps/i2pbote/WebContent/index.jsp delete mode 100644 apps/i2pbote/WebContent/moz_fix2.xml delete mode 100644 apps/i2pbote/WebContent/newEmail.jsp delete mode 100644 apps/i2pbote/WebContent/newIdentity.jsp delete mode 100644 apps/i2pbote/WebContent/noIdentities.jsp delete mode 100644 apps/i2pbote/WebContent/saveIdentity.jsp delete mode 100644 apps/i2pbote/WebContent/sendEmail.jsp delete mode 100644 apps/i2pbote/doc/techdoc.txt delete mode 100644 apps/i2pbote/doc/userdoc.txt delete mode 100644 apps/i2pbote/src/i2p/bote/CheckEmailTask.java delete mode 100644 apps/i2pbote/src/i2p/bote/Configuration.java delete mode 100644 apps/i2pbote/src/i2p/bote/EmailDestination.java delete mode 100644 apps/i2pbote/src/i2p/bote/EmailIdentity.java delete mode 100644 apps/i2pbote/src/i2p/bote/I2PBote.java delete mode 100644 apps/i2pbote/src/i2p/bote/Identities.java delete mode 100644 apps/i2pbote/src/i2p/bote/Util.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/DhtPacketFolder.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/EmailFolder.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/Folder.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/FolderElement.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/IncompleteEmailFolder.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/IndexPacketFolder.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/Outbox.java delete mode 100644 apps/i2pbote/src/i2p/bote/folder/PacketFolder.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/DHT.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/DhtStorageHandler.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/EmailAddressResolver.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/I2PPacketDispatcher.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/I2PSendQueue.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/PacketBatch.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/PacketBatchItem.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/PacketListener.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/PeerManager.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/SendQueuePacketListener.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/BucketManager.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/ClosestNodesLookupTask.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KBucket.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KademliaConstants.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KademliaDHT.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KademliaException.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KademliaPeer.java delete mode 100644 apps/i2pbote/src/i2p/bote/network/kademlia/KademliaUtil.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/CommunicationPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/DataPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/Email.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/EmailPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/EmailSession.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/I2PBotePacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/IndexPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/PeerList.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/PeerListRequest.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/RelayPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/RelayRequest.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/ResponsePacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/StatusCode.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/TypeCode.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/UniqueId.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/dht/DhtStorablePacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/dht/FindClosePeersPacket.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/dht/RetrieveRequest.java delete mode 100644 apps/i2pbote/src/i2p/bote/packet/dht/StoreRequest.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/I2PBoteException.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/I2PBoteThread.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/OutboxProcessor.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/POP3Service.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/RelayPacketSender.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/SMTPService.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/StreamHandler.java delete mode 100644 apps/i2pbote/src/i2p/bote/service/StreamReceivedEvent.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/CheckMailTag.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/JSPHelper.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/PrintNumDhtPeersTag.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/PrintNumRelayPeersTag.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/ReturnStatus.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/SendEmailTag.java delete mode 100644 apps/i2pbote/src/i2p/bote/web/ServiceInitializer.java delete mode 100644 apps/i2pbote/test/i2p/bote/AllTests.java delete mode 100644 apps/i2pbote/test/i2p/bote/network/kademlia/KademliaDHTTest.java delete mode 100644 apps/i2pbote/test/i2p/bote/packet/EmailPacketTest.java delete mode 100644 apps/i2pbote/test/i2p/bote/packet/I2PBotePacketTest.java delete mode 100644 apps/i2pbote/test/i2p/bote/packet/ResponsePacketTest.java delete mode 100644 apps/i2pbote/test/i2p/bote/packet/kademlia/FindCloseNodesPacketTest.java delete mode 100644 apps/i2pbote/test/i2p/bote/packet/kademlia/StorageRequestTest.java diff --git a/apps/i2pbote/WebContent/META-INF/MANIFEST.MF b/apps/i2pbote/WebContent/META-INF/MANIFEST.MF deleted file mode 100644 index 5e9495128..000000000 --- a/apps/i2pbote/WebContent/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/apps/i2pbote/WebContent/WEB-INF/classes/commons-logging.properties b/apps/i2pbote/WebContent/WEB-INF/classes/commons-logging.properties deleted file mode 100644 index 8cc45de2c..000000000 --- a/apps/i2pbote/WebContent/WEB-INF/classes/commons-logging.properties +++ /dev/null @@ -1 +0,0 @@ -org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog diff --git a/apps/i2pbote/WebContent/WEB-INF/lib/mail.jar b/apps/i2pbote/WebContent/WEB-INF/lib/mail.jar deleted file mode 100644 index 09222952eca85801a9ab78763e7ef652c6f8ad45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434812 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

utrD!h@ERCt;y-%RT_r;S+-Wgn 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%0D@xc@8iz~AD1T?YJ!;OG!7=g3&Gil0skInU@FDj^ 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%0AHbiv0?Sy$7=i z&%ZCbitBEG-yOPneswy^?MS*En(auw9s9EX<$=!^kFc8#!0sL8B|^hT4+W^h_M0&R zYyWUb$ zKz0%ceU#aDH|}*lvp3`X(`8@de17eu&g^;LqxtCfgyWCR+zP+J`H}b!#UItbMuxps zE(7r|bndFJQ@*yc0r$?0?DDsczt*aS@>^ivird0`m*~dvTd(Z8}PA#obbY^ zl|9pVK*RTgYL7%6fcbDjDdR~mMOApzn*1SyWTssO^;*xYJDt?!9i}}j^G>R_Bg!RY zsooDwe&@v!91AP3Yijx!-$ZU#l8v?L!mprt<{5tC)7XM#9gLBg=_ivQ^WNjku*4f< z_`L_0y#C@XT4`c*?*XbTskd48zM;yCU>_J}w3SCp z?-$2<#nHr8_Lb=+Shfs&!Q|>RaN+#$Jg|minUkC?c{k8ui=I}Q9O;anHUuNhH4BO| zet0^h>*vX5JL?B1Ncwvk`nRDFjE+me<}zINeEe9Z7_4oG7qIGAa0QI835@W|`U7v? zvPu%VEh!CHFG}4})~hqN<(@~C9~N8n3)aRpsQt=;2`fsEKonmB&9|`n6yk^o!Ys-s zgBsePks_#e9~B@48;UK;xJe`z{4pfqArcctK7{EZ788m;>~Tq5w*N~ps96My4w2cR zG9wg-5qky|O@sP)pNkQJJ@O48t8(yEglvxrb4S()X-~Y>qnsni)tmCTCGYhI79o<# zN0%nv3T_i3f1i`&2wXFb2AXN6SdH0o{>=lZ6<+Z|Xj33*#_9SLp_Kzwe5o@c$hlBU z+2*Sd9pd=6gby5hQtra|G|&?g85Yf zyd&0^{S2waw|XRB zuZC3+BTnn`TjCn~Z8+dif10%_#shWsaUiRq`KWKUr{}mF5AYMyzQ5KyK&c)WQ+=n zH*yz|Wqi-@rJ>PHnvOaDprV^;ic| zcKhF^VdksWKt;V$RSI~9>dlXC${Gq#>jE!!<(QVZci8~RE;RVj2E_0KjT}H6>FlZ2 zrvc3=d-(@k0o17=4W`9d&=qgckat{|`?#kBd;y93DD%DYg(^PqX!|f3^gThc`}z*C zuk^U;(|C}oo@ zmxK$A?UylMrr^hu+ZrTYy98@+;$t#6q+JIZYcS+vc^txKdpK(d)TaJAG|qGM4-TnQ zqs^v3c4?v>xj03K9#kD2+!mr66hn)9;7qS8iqeCEvonss5{Bnb9w2A9(oQP+_I=ot zh@$&_u2RmT)XX~){gt&Kp(P+T#}G!A+k{ifTnf*qR~y2NycQwVm(zoaf;%7n7?1Ot z-D*L3ded`QPy)=89U~?UxILvzwWVOsxMRwMVY1NDk|;55mX@Sn@i@Zo_@rm_u1jpV zs$E#m?1H^c_h6d~Kc>778#RwmBZ5jf^(D$P{1R@xXDjUYZVPs>L?0b_B@aFTNH*m! zxKGf3r9X)W`gQ!>nC;l%N@A~cHho|o8PSOgvk8@JjOmobT#%j<+sOnBHtE3tkb^*M zN(y?Uq(Q9S=XDm|e8j||uQn*k^h^852_OQ#2kl9=NufR{+XQ}{>U!G{(}(Q@=R>nH z$bQfBs+NbqKMu3ouo+Oc8DZ&!B6&Pal9_H$*exTuOxY4t8)sta&_=9@>{n>sJDjc3 zz%ZLg9vIs872kXtz%E`2dCZ~K!Q6N*KzXzFdMn+O;Vp@s-3f2@?JsWQ7JWfyMaiIEHHCY0EX4L(7JNplle z>4cFo@nQH=6QGZ8Ss8YSds-<>;)Bmw-oj@YQ<=UT`$C-OG;&X4if7jsyMYp#3Tg zwRhvX7yYv!R~l=W&l3)VEwG*$FuwrIL2v!qOO-R_x~4WR0$eL===twmKF_*8rWFp` zv)f9mmE+yPT@&~4$M^-ZcYRoWng^r}uxWr6x4l(~9=W1haLe0l2Ep$iID`AXMZKHl zPUy=;Q$@eU z6t12p%~Ve3?n~Z>wT!hoHF^W%w(v16U{zF9yOJY2qhx`9>6Pnx*B%n3M}9(+U#Lk( zCnatA0_tz1kvl640n<;+hc68B-_aVk#46+Y2Bn{1=ZF8sEO5i3B@XHrXP3fK@h?!Hq&cx~BV2Jncu(Y%E0iOSd?m0f|R zf~Bgc4I8U$(`1RYA+(q*vcSrgfs$HaC6+n`!j{oGt+#efY9UZ9cnvesz=~V88AKoY zWoqfC=HC02Xfc*8Jss-O5HPI39ABWZb;4{FY=p)F5U(V~y_BAB#LcIx9pz?dX81J(l!yqDNeqz-b4Apwle!jvc2)paSehg}7bXN@i& zE>y;b^KM0K5a9M3c1~gwX{3+E)+T2z|C-LSvzeq{AA*~EXL#-Houet&qT9=5 z**UN~&i0yTeRE+? zrWToK9e4%mL_q!MmL=oVO57YX3}Im{xBbudks|N)ku-HyFXuV@9qvg^-bIE8^!e3N zH&(+%uU7w@<4X5D4Lq}Gj8Cbza5 zPnrAW+9J@9D4OrCj9_`<9-T|rde)CjWq#XOxqKS)+UDk@ef^^KIotcCAENwZEj#x_ zgD2%wkp70|Sqyrzfj)1lwYeEaf=lpWVH%u39%ew{N~U5_ZP3dW&Sq|Tpmd$fVsSc* zyTy6e^2*0Uc;nZNHAer*I@zmU7pC7lonWPI9NralOG|4;nQpA+IvY-bE_Q2(MThqm z2cobIU3N@&Y&4`>f_d+g2PZ&$ScaEXTm~z;I1Yw6}9^QCaSapw;`< zT*)^fk7Q#s8&GN}C8;-{e*%^hvPWC2dHgU4WyqKZuqsVXp?y)u|EO$*qtBPe0{JJR z-$B1s$`fdQ#P}@nkCphs>$cX9>-)mCV_X}KUuaG}Egk;FRDVPV2CtMsx zz2C~KU*`5biNs6V*SBL7Uo|2a)ZWt;?{9g?f0WT~)A-wTm14LJEb>Mn)iPGxl5OWd z6grVV+648OcCVS>vYl*0_63-|oA3){B zm3q2XD0~SZ^^(^p#SqY-58?8KWKsAdh7XDT)bEh%7e%ehTL_Fmb<#VM$h;kPk!yQ9 zVA>`gn@kt$uW(o~Vi~7LibT#&$o+0flb%*YrzHm_iw|GMMb)!}f&QT|#FNmF9T&xY2W0e$6o4`~bH~bAHG|a#&JUMG0p81BAb+4R{ zfsM-k7*YNPla*MH(?cQ~?f;$XMVGy2oyLmbjWa_Amks}~?#!W8S}z{`wOlxG95n+X zf_6uY*coHZooZR4$iRsJmaq*z(69==uhao-NxhFvwY`sjS9)Ezt~b;^fd^9QGZ442 zxvI+u;j%P|yE_zN9t-8Mad&Q1Fp3Ya^BkohTMzutlhfF;dEYNzGSu^C0{~yPNdqv| zQ%8eBK1B4BDdKFk#BSi#^Ie zK;ISh;p&ghyR=_AuL}GK--Y%e^iMFm)>XYr?0qkw57B;%R_~-4CHhgiPt=X!erWHH z)s4M=aPW)m9qxGg3s&%Z_!Q^wdZk2p#cD7yLnmi327R;*zy3+^DG?v=LHrY;#r1^; zE$=IGW5ed=n41^!z}4^bnvWa4rTWgylVpuv{@5V$u==V{V?xWa2#*jxGkq~69E&htV^C)MaRnyI`SToylr;k0?a>hmOl`k(% znR)v&e9u38OeV4N+tr=!up%@tf8O^2 zgz8Y@icoyHmRpR70Dcr8|H9B-j~tkr$zDwt920O}WBVD1$D1`yBD|o=w(Lo3u|^C> za#YrSh5I*7Sp|(Y{ML!hPqRhsS&rHD{?=Fs$Q3)KTzFKVSB0uheoEvO;c-jX0Gf;f zjq?-3xiX8A&4(piG`i8>-QZ3>3@(uDlc<8gw6LzkL6tA{up8B zH;LZf`8pfn4BG#Oc+V4zhkN&SA{jYL1buc$#x{p@R(!%W!KbW}K}-gp;d^dyygC(W z_6pgx@AEuxc#o2L4X8c#-88b(3*r1QWx1Adg9LrLbeN{b7~BMQWOxT>tFjr#@%H|p zahaXZ`-#yNL3MKCg$Me)x%tKJN5IA|Q7gOmIYHIul3EE?3t@dl!x$A67*T$~>@TE~ zKtL3R9%Z- z?t3BLs!N?Qh^@s&R<*6E%IslcdJfh37^xGIV2dVL!IHSak-Nc#)Qu3Fn!|?K7(>D` z$p!Y0C}0}rKr_Q}J7CLtbOn`akV=l(v?h~OH8zjaq^maHQh#bST6qOo7u#==d}77T zOeu0Uw`}^}&Od7mOvU|EdLCpSDqTdsbRj_3p|ZA&34t|6ePj_6_BWQv(f;d5A^1t| zcQN%8lsv5^gPqWZ+o_n^lWV`<_~6Dg{WoJyVkGmN&h0~myL+EoOJ=mrZ9rf+_qS*^ zOBr^2x!Vcg6P+9|qBP4NPquF|)4j}PD??^fE`V=LHEs%pinU-6q6lsr>y%+K6`*8H zHpOJtFJ#O{!*o29`EQuc8sotIl^0^`wcY}e&Q%L@MUcgeXU=VSTiGeJ~Q)1)E9#TkzyMZe#e zOF$wc7nBgM>Un2gt@9MA2M%|$1xeYFduYD+$ZDKlHi&S@X1t@w>mIP={J?iPib~O{ zsbW?w+jg%g{-Ey&!Gb26Ex#7Xit6o=SzCcD7G)j@C z2W+m`3vH$1i=Mj(*amGM{L@DnM5ej}gHZAA>VdsY2=LJW$4^dE>+h;M{&p{^-8{*9 zCuzX$sJFT>TM~tXdV~?Wxs)9Y|3*=`K}YQIWsNS&8=HAYL+I zFYLH}l`UttFg~s9X+$}eE#uE-k4IA>cSJ7CdPTAxSkN)*yDA5&^VjT#QFrPT?Avav zUY*SbY--HwIY6&+kK!vfe-1!hq$$~U6v)I+%8mb-O<9HnzEwtNJN_E|;UZf1OwG2G zqK1?ZpULVG+nTN+c6|jFeTS>E+>&LmVii^hU?=bUBH~ZZ8xa~#z=|9Fyw^7o z-p~LA>$MmY+{V4PCw#k)cQm?B212;H0bRIP*>}d#M8|;{K1Z~T_HXb-VziU;@%G=Z z|1N9r4D$cY1oZ1y?a%l>%Nhh798B#@R3%0JQ`X>{@K+1!k2=WuhT{srMzmj$|E zk)6+sK9FZkMT1q5p;4@YR4F$~kBjNOOaY(Z0X(5Um2hSbQjA>h4leRz^w<+*Y9Q>N zY!*zyWGxVK=u6Ar>wyV9v>-?uCytk)*Mm<-P=y{C zr6{9aNmk{b>}y!jnGFg9ouOc;G^mOMHlKq;Dob%!(YJFwxUszChUB@|h_-Il_xgtd zQNvNFbdxst=%b=_L>3Gj?Oyf;dbl0xr@iB+wv=0DPf39jIN32^@CC;4gdY`qh;TTD zD5Dj(CfSa#!f4V0Ws8mzDO~l9b*3#x`2YRDKd2iixqf6$c|S6zALFZE#`d=K&aQU! zwuY8A^p>`U4)lV;GXHhdO4jzsiio`FqjUsmQqs|_KNk_=SMOU#-vIR*j@1|>Y zF8@KuE?cABv2EM7)3I&a&KujdZ6_UD9ox3qv7OxPZ|`s1ea_kEj&Xljf52L+ zs-9<7)tocaB(=xzT_Zz1)7Rb1gIRy^K{BWDxmspIjw=e#{)p+&mI z2oCo&v{%^vJkF6f;MSx|fR8xf$kAKTZ>u4hb?9AnACTOX*pa;AD}S?gq%(jn1G zO_tcGz1`8%zRg?r+waeQ$sv@nu6NV9z|QlQ_%Pf@Ge4f@qm>vO@nDLpi3J)b&*&aj zJ<#AdMMG;$F-^05W-KBnpZ}o*teyb;APVg9}aIr^(`XT#XsF`>c(Th&JFZH%+Kwx^iPE(;1f5-d zD#q0rMF>ks0cb)pewcS=fECq>qF>^kF$9G@GPZ$(3~a=z;&xVJRD_T5WNDjEQ#pwY zWc)x&EhZsJ8^r;j2*DPj!T3giqG-gx;&=vICHxk-957H`#nrE+IDbkE8e9L)={|_S zKB(5+pSeTQdkS?K+~Xa5z4LF(Iu|QVE=2o}t*Y;E8-@7s1OGpUoQji$wS|-WKf^9r z#l{Xr1;xjfo4cVQO0buFm7Iw;&5_>vbP4{(qleeSQ|tPig=`GdCMO zBtZ$OI{e{GDm8T&n#_3dX)qu67Ab$mUl~wO8Ep?PQgciIou4AV2;j^(zq{zXz_&8_ zwSCddGmX>iL90iAjz1BVW_0AX+UmIQY8>_&I@(f=pVe>Oc=Bqy7>v*E1a~%SzIRqRQJq2RTn-kO5*SS7h7V+<6K^{sa?U%f;r3Ck>$6vv5};Zf^1R zYCM3^YTLQRLny;+e%C!KOgJ>APG#qi7>~4chpFZIj8aIUAe?58bbO}e^g(1!UC(KO z>h%sAVvaT4qyo&QNf{`s7P~zneN?Rns)&fz#EY?9)j!*5e_4X}n{t2x3X#%#m zxj1R5Y}4wA%FiOaIO+RKBG@qBB8V(scDG8q;v(F$OkzOrk3eM~X}Rka0S^N(Z}DJb zyH=QVSpm!(EBMIJk0K3s7!wQSa-|que>|17(mc5`cp%CWybUOQbe5q;3k?4w`+b(2 zOkwejoxPWBMA`CaMrSN&qrcIiyc~GSe-crzhLDWa9oYZQ20CYbsd0YVoD8bo8=#Zd zg9GFI6-eU%$t=toMs&mIqcnEFLhBxQdj`YbBa$Pt@WiC^>7%Gdej}sx4US#M=+Aw| z@HOBG^NNe-?F?Xz8uKL}`h6&CbdEfcpVOrm1080>+r}8S^ebBu1Q(LUQAF3ggOK2Z zFMLaU$tlOK&s4Q+pS4qW_eM$ctg)SK+^D2oBhoS<02x++Ht$#R2c=S6; zT4`V1^_Z4AQ+{~8)Hn_uHBc(8Zfx}D zYi$yR?OE3Z6t8JAJ=3%4U1V)i1OB-;mhQgk#;m@U))4CF;EuDOly4l@WLI-oEb&RE zm&=MFm{xI&nQ4oTD8P!!364|*BE$hCCeUiuj=?C|ni9cz)7S#Mv|%^c`KFY_on?Q& zfd1>*Y9&I)m;wCbhZES3A7uZr(EUqMQrg1F#L?hiVjjWDHcHt4sCO=ju*;|j6pd?= zziim)<0=-=^A^D(h0)7EXT#_lf=I2&S0_n2&^}mwW(3x`j7mu{Bb6Q^@!u6STM*cR?SX=Y|Xd>5on7WU2Z=QF;38(q9o$Th(O> zL9I#)Eqx!xXw$NHMd#)(C4ho-NAY4F#(L%Uve;7t{+Y2|`x`5J%*xZGR;7H^6KH=^nZx#wgLPTsE2=C^ z-)`amEX!(sIVZ1d&F_IGp^4gkV}plHJV{TC2M6~% zO7{o(wi`KgJxS!x)4Md1{tSbBL8cp79~tFNi+5$D_Z=EP;73LsrsjYTq6VYwTLcZj zEex6J|COOHD^HARd>T73>mD%mdJ2q^*2f}YOD30Lw4V+hw#f^YtY7#}N>e5VmmLs* zuMir(o}^CLCEWX}hcQ*J%Ao{3eQ6YwK7xcymYzhTP#1f1C=ACqa^ti1X5Pi_Oaa0XZ8vDU$fij0B5WJJGfDT zcibL04amv`XQT}pwq5$iRG>_6JfKZWI=h}n5c2wVv7iDqY9=|{fZ%%*!q0dU0L zwnX&gGXWaii&WLq66dIV?Y`ybbfUUD%P{b9CKk?nVk`cAQsex z{(A1yaK?^1@?kkSuw+bj99?@nfb{(y9x_>T`iWpmIG!~#gXNws4x9bJfWq~_o3MHH z-ZP-BlYgHM^-RIRCE(}eg64kO3aC_X&R1`ZekjcmC}(xOdTdF-jB^E4vt9e$psEaH zgn(<)Tdq@qyUSe-8HYg*20-r3qe3B4yE?_bZ^j}ia4-ajTgMz6MGD%MlPhJrZ!pUU z!LZ>6Yz09utI9QzNo*r`9)p>;m#x{E!eb?k>#ADb${Ln(hbzMJp4H5`KkEto=mf6U zRshDY8lloN@fqxsLiW1EEkVVtQ7jr)AVuUZH%9gK^Lx_cGaBzVBxUbcKD0F}4!gPq zwHfjOCN7&`?ixeI)}{wkoCHO^`f4Hx0b5TOad~*fhF95^$=O!vr!VK7ucFL@ zdXph6(12O1Am8hQvqGfddBZ>YnljolUdH|3tAH!V=NuU1cf$hl#}D%VSOp|x1mq=b z?VX*JoE%LIZ2kpmz7@Na)lk2()4AJ5?frQ$2nY#x71E@EEGR<+frBOTWnp&_g^`uh zq;30pjBV4vK{eMSnjb&v>3Dx$>UseA{lJ`_YQ(dsB#5PUHn=p}|ydY_du{?)@#5>(dJd;qr$D{`tn4 z$9#_v8GihU{k_(HCU*3>B;4*rfhY+Hhvg>Bn%{D7-A7t%OpY=(ylhy8XIBg~hh{*j z{;si>msl}3`H<7VYij`7M;f^e5WLInR);`8TAnI0KpoIUwL;hn2kjy}<-HtR_?)9Z z{O$%j9BB`>tp=zF8>0i3IS#o?A5*vSZ0H4|@`Q!y-Ccw$`>Q zou9>flLckA8D?@IFPC4dr*3Coiwh(3#9Cu2cdHLw-{K?xokwJRE`2UL48KCe)gEhQ z)~warKwBj*&T?d&h#3r2@ESI2w%*}hA4sm`(kKN`i(w313VJd-XDwHD;!nmr4Vo`y zXj_#iVV*TMwPJ~H>YCWMgtCnw-%nS8itf#PX4#4s7rRiEv~y`U|5!+Io3ovKbXhB> zot+Azjp42{H?(3wO|?rkH+C619qK%zh$MNd$Bbwx>|*I`T$dO;KgxEoep>VPUNw&0 z9Q*+)Qps-0tPVZIElZx*HdC{S-tYzz@8$~qrhU=hjdRCEK5J5%fh@ar*&fm)r+yrp z+R1omoRyY1V)hv8C2rfk9}WWOS6`Oh(aZJJ<@Qj)FhME0;2pKDc_t};bP}a3R5F-~ zHV$In*qmyJ05uiIJ!uu^1Z@c>M(pjBWtZyDtR3AeTzAMg+OIxGJ-yNvjW9&oX485` zkxPn(M?!Tcp;&y;YHQcW)kcnGBOg!t9T|CGVZ_v~F00jwo=Hp7kBgRK6dbH#UOyAn zLAw!7hHR(#OxR9Sg>oBfzt$IfgN)4Ibj@sSs>>(Uhxui-QlHNF5@U_A+cXo)jOG*5 zV7TfhI5}w<FY)ZRCsjU4ce{cdYAyTP?3`oG_ zPA@meTv)LUT)00vfL^Dk=_IY=iPh75PNvBu2{CC;+?N%~aYRO^f!SY{-YwII{?ogT zcG+hMjV>auo^Y$xy9BZ1KS}0ewu`G>j}U0H_k{N8M~8f+@r=w@du^uOd`(zQp}bk^ zq<+DU3-Jp+*xC8#{4K;ie>dU2!RA6=itgwFfHfL z={D`WwPg%IT!jQ7=OZMvX?QZeFrLVM>HK|Q3dODShT055jJ$yskG-kL9#zhL9?|ZM z))etKvzA)D(LuPo@7%!x8z6<&{?0TK*!22|O3ys2Ocu&^T)nr)GyPb~>{1h@6psja zEh9(4(G!e^6zA$D-B%odq#HdveH5| zZIpJ4;CtOWWy|DK2C3;MYCE1MO+@BD^RRy1qsQwA<@EZ+daJ_-iHCVTz{9l9dSJh7 zUkt6*7S}J*&wA;)65NT%a=<}S)x%pv?WH?UL_y+1-`&#`oRlhlhe!tlD-iq_YzJ}? zz6ZMk%MTF>1Nb_)6PN;G5w;KKm%$&j`kXUuC?HTw6cu3wC2?9I>an_?4Rwgn91L2c zbu8pL3(lo5cPP`nN}e{{hn3#MZ0Xd=8Q1wlJjct0 zS%}%h^e83lW_d;4h#L{>#d6T@Ao??Nr`9^l;~KxDQ?C=xgT9f${yU8FsIE0ZF_>va zWn?r6ADnp*UYNwuEKEgUiYql*l4LzW0w+9Fq~gB4MeY!WNKdu?RS(uI>Zte`>6Doy zRk-{y*yVH4TpU{(`{XH?WVB0!zHiMSf=0T@J?@|}M`8lAPC;0RI0GI)q1&iF)7QwiClP z&MbWBl-|CdAfQWdzkY32AYclraD&O?Tas7mgMLiN1wCDvn5ygyR|SPZm8C~LNvlxK z{Ps(AfL>++q#HzKBXc%ncqRoVx^nPwzwN_UOG_of&n8$*tsk^$;HR8>j>kSHOs=u<9y7+iM5gE7JC! zS%PkT|H3O35W5Pt?ysV;c8%1`a$oEwtcBL>H3mx(JDVpNvAH%1%(Q$8F@UH z9hVrG*o73WK`Il28^ef3)1KN-g)BQ?CMZa{?c7c=|kX#?>XD3Sw4r^VbC$_Xc=U) zRi8-?J;4UatFWC~AtFOe{Sm6x%7MF${);+uROF|LrQ8lOxkuK_a=8% zWt|Bxk{KyX$6~ToXv15_Wn=i)`}WW_WHA(3hQh1Dci;aCsE~wtad^G~RsT1jqW@p7 zQZmlgP8RkCj!wb`P6kSL&W=X^^5SSx){^@_>T4G+`PBvD3I~^V&X$UlsghB;;HxFZD|%&t1l z;Dj##AtVIGwWO**f}_ilU&SK|M1lH)XV;Lwa_H4+_sU{KiD`mm+Yn;Hy4X$Ek8&if z?Gd^gTPuGbskaw(8RI1(FsBl_W2 zuh2kwe1D&dY}gSh4MF}6qB3Ztx*>;7sbt9KpG$V3?c6nOs}&U^b#_Iw-~Q`V6=u1n zAzQ?kaoooXoNKZl1*D=bn6^sOxRrv4LiRO(z=y?9r+j#GkIAA}@;p{fYW0F0ZfzCL zz`UzIk2`Q@=1gM1%P2ctko%lO{DWt(`ob{NROqRWr1FlvQq z(%h!F=<60(knam;f1`M>=D9Rgrea& z?>rQ>vo9*8VYJe^Eixkl?^cjCos<$#l2(4pFF>J|Zk&7@1Sk~|Xc@`^dQMjKdiz>ap-ySQ zAE5An0bu+dF~T7WEORB+CgW*0m!s#2x~Hey+&@36`lks4K|5%Ub`2>bt=zvQ14UK` zz0oUSf`Rc;-Zn50sY4V!bMfu@4=k6j($p(9VMDZ!8<;%%M*Ikk9*q@s&D1Tyxo#8v zZ;9!I^h7(a{vdICA!NwlJ_<_*r9+-2=Lm{>j@^e)z~$qw^UxEF_}GV%nlnDP@II>P2iD(Dze;aFWg@;yfLSI!lf`cL z5#k!Oca<3GL9zW2cFI-z)e)+S6(o~e65C(n3hwCijb9zyH8lCj-g_lj=s}D)61>dV z(f8kkt^W~8H-2*q;Qv1&iRqu{_ZwCx};5*2#>uVV3^RG<&VogCOL&P`Tg z9kQU`Bx=xba6Z3S!KitbnG#FO(VUy}iJNqzt1Etf-=FG%xk6x17xi(Wk%KhVhjl?F z=qBj!+EolFaBk|C03+cl49N>`pPrAnN}WGOhUG5Hn2y=gW9N{>z#&nqi4yM726eb6 zBXVG4v8^!Pm^a;Dn&;O7=4?(Y$c(6_ITECk&>`f><*SL{YAqOZGMmUSgU!l&n*@I& zo`J7I`j8fX!ne55T=<|!e`}NKUu#N+w_@IsAfjmGxOlxV&QAV$K?&=Q*CeH@Sa6kN zcSdnoG;;G%1^-aT#yy#_>+)`D<6Ns!`?5OpcGUw3sny8M_b`Cio0|>fK)`lfIftyS zMB54s9mjJV@k|q#6xkF4jy=&WaT#Oq%*cyW2^lgjCS|4KK4McX;y~2kg8cO`Olf3* zsfg-XLyfK+aLFPKrW4{~a_gUUW86HQ*h-5$ugINokj-DCMl%DyKSw>*CopO$?eo(m zsp@<`TL=IqQr~dEOPWcfRkaA;YZ)!X(S$GVjZ3DR&ngt$!}cFziS)n4()m7u^(BQ3 zh-nvhTIto7KJEst>Q?`Q0Xp0wel!hULBih&^`5vZV_{bvFkFqIZL3{`YG_yeF*OjTm8m^Pyz-KBFJrT(_!G0=;!0IU1CJ^u($pKlvWjlJJ=yUQiA0wY*g*qM=EP8Nl`>!-94~E6@b2b@`N*4P8@`gGhL4^=%O`J zIMud3nacQZXK3je_u^vg#$I#O0wSfAh#`ioYri@s^=N~cyD*>f)dS0ixU1lS__+>x zoMqN1E|CEq;4rjp+vWwXS*~1hJY?dO#uVM%yLy`?;>!*LQid6wwlF(lw;*c}qy)qy zMu8*V!45S$CSf$?^PB3UtnVY2>1WIF#~`Y&)@rGo+D zVg~jmO9kS2mdp&>Tg!EY0ZQ`n3e%x%pJAQ6=bxpKD_l_y?OUiqXfAr(Hqn`yasy%5 zyDpXJyC@<-GxM7D_MuU(yf8W3&LyBPY@4M0SZZ<^2Ql)$iz%j}(jPOz#KcmElZhtm zRmLr%LyA;Ec}m>d4s?B86L&8i8kR0})dZUXOSCC1Zi5qe69g>;;K+_s&~2{oS(+(n z%Z+&-_g}lwjIT;4{tujiKQK>`Mm8HY^OIw9gvu!*U&&l{3b(Hwg;_j*;oR-FY zA`^Z=XSru=dHRdb^5ceql0Eqhofy;9MviE5p`{V^*>wtj!A+(3K-KC!e&z6xFv>Rl zI5K~rRLTGKK!X%aO4KbKfj^UJvLQA~_JW5fAzUEBRc&73T3Ynx=tjyW2Qc{xsKW-5JIxZDtq<|R_yytB@oPRGZRe%fpoz!&TJ+UYz2p||B zs(##|{hcrRDD)`wu9X7<|M|l=iQ|+CMS)R>iP=tf3ubivZJgSVw`y_5QQu%ybbSaa z-=mB;`vJ0x)`1-Vpb%RUx3ybR30G{3#>JTsj7eG7RlGK4A6vv60=HZMFGkssQtT%& zEn=(*LsB@~3%R*T3m2)=00-PAODq&G?wIG({rSnpQ*iEJ_$`EsCJR}kFIK4hRN{`- zjTK$M{;)ffD)}0V&6MO77GJ)hM~Sm?t>ntHCsyApeNe&L*HfSjBYWKJz(a$u81hv+ z_W;@0JEAF~7N`oJ%@oM6$>WrZU8%?tv!q;BvOF_}r#?P_V+Ym=ifsK|c~k%wy2_|P zge6TzJ!8w(=ik;1|8b@eC2`l-!T$J>O!WWtwFT{r-Q~X#=Rd!8wg#k|whHR!v~dD^ zdZ&}b+DsDNX^wP43ABV1RIsVlJekFs6CrItV*0YviLq%~agn})F*2fvd?Qt6ME=;E zVIrk6grY@L9!)?*geI!Cy?_Yl>>lS;SNb=_XEdm0d&BjrH{=WCq+Me@GEJ0m+|oUb9?~)_#QdihVd}uU&YcuY#8+1@#mFp5*m3rNPKdaZS?tJtC z@BLF|e~Nc{i>`;yE3KGN{jQ-ZD0W0#e4aJhN4FOKUnRh;iQ13y4QsVw-0ot4N%Lb?6kBV@EvhH~JAY32sd zV&$wN@0~1qX{YFF$k4AlvbJod^2C;oq^#UpLYov5z*?uSww5npLS8B~2;sK}_n?rE zP68e>8oO)J?k#pJJou-*c4?~+$);mLHl}Kur{qB!QX}joThK1AwaZV>Odk`6bW=+z zqa~ELP|D9f5b<-F{8J&*f+&kk%B=~UU~}Yq@NY3*a}gvx7@M3(a>WymWsAm)vP5&o zua0blFz)V;z`Cbq>YMU2mh*Sds_ZkP)`1Z*q}xsy1SC0X|S#$!LdkmD#No>%t$7jC<>Cl<9|pCUvPdE}o>q}b%V3OK`Ve{Ty&Ey~V3?kOGV<#0B7P!r za4IetEf!%>n?e@U`o{R3;{(Q6j?P|B!ycS=3w_mZNU-d;5YPIqetgJwmT*TjQbvDz zG+ES5h>Dq7slnpsJSg&ZWv?Hp_76D3h15z8IW4=AK84v)BTj&f4EjU5hf#=Mx}&vl$Kg>8)6EE!7eLVz%Gtz zJTS48El^zFDc-eM5H@G6c9ty&TLoKWyY+NYb^Fm*xJlzQ!#`EJLBLmX1oczJj36W* zDx~v{0WZfscu7-{+p>}0s8dPC+_sNY>uAas!!Go#>N{8gtccP3$wX&2NDX{P>7w@= z2CV-oTNblTX_#6oOWK#Y{a~+^8{P)Z?nV$&g=<0%uIn;**u?XsrWMt-&Syty5Vac# z@l<%P|DA(p6IR4BFPm7YNHJ$}Ump>fp3PfT=1#fJjkHRm;-TjtZpXLk zm&j4)1}*LKghGd7;hD{HBd^EuI6iQ&B0|)pN2yiIQ1naA!6Tb)V{vYz2zP#`6VHbV zUtq^0%Oe<3x9tm(MiL>lt7*>6(U6T)bifkHPx)gL%IK{wvPE|3J=YQOLAEP|J1F%~ z7xy3=3!ltd1K=vm8;xEYS(D*QCwnvDgDE-PHYhPnoA+JFJM)U0s=8rewvtDA7f6cR|99|N8&dO zN3QYMU%R={zHJICR=;Bm&wkv#=Ho5-)9*XbS@WJ_TNbWhim%6% z;7tMnSO7`8K&5#*q>=cOkrB5IA)H8Rn-Kjr?TUmwA7&_T(04=u4U|ydO=PB7&8z!z^fqA3g30 z&L7;Ja!AdUAF1Iq68BJ*I8q`62XH`{e^por4X3SR?_4Oyw8KIxfEg@df#ziEb)>eY zO>WX0cugBJqZ@dTcBaK?ge|HG-uAo;#x;1yccn z+vMM9gVBe5#z*F66sf!X>}&zV8GaZC`>^x z>nbx`UhN8(3OQy^!CDrdG?r%S(h_JL zNr!WWRw(0O)Ui(v?($Tz=+uGMFUe{kf!04km1c&XT=bDWqj^lc*-L+Ej02$7 zW~ZOFg2e94_M(xT;q>vV=1qQkAbl? z)N|?<2e9sl!rqmxbh$s-T|;B$$g61_HwKR|@ywrUJ(y+aYf2>O^-S3r=OV3yJ=(zaCe{DWTNHK2>e#m~c%R3C zS!Sm|pIOAg$B6Uj;fu9<6G!vG4b5M$i=OQJJM8><;k(Ai z5!>^kHu}voAYhkQ%^>AbU42D?mALr9#@v;-GuB3_{el2j%B-ivw1s)(K_8tLYyXK! zcM^X;VwD&d?x{OAh0(?j7*w>yTJT4Vh%Qk%Z#QUae2qrktQJUvT`f)c?L=kA%#z-RvYfyA}&uN3@AVJ@?x* zx_U;cQG*}7x_Sp{bBG5!+HzgDHazsFb&8-hZSxS6StyEZd9_K?>fmbs*4XM`R8uiL zUpl&VauT1P&8uO@stLB01%zCl{C3-j_ONTofD6~8vzM8rwOMG}Q8piqxr{jo)dXLj z3dsK89Fzsn*aI0s>ARc5R9^p>UQ(zA;O^$zAW|qtxu@8NZ?YJ)Y7$hLOm1F~-QEFY zGC;7wppY|79Ke{3#^{VmRR%O}!Dv|y<=hC8I>*#%!Re(O4Y9Z*sp)@qqP-zlX-~bl zD{I*kxDZ6~dr(3%7Tp|JR*8Bmk1fT3dP<&qt58Py7p}6nR#{N90;o-Cu~Ymd?%B$k z^ZP7SF@GfgAlg~+_ShDqj2&Km8?BqH9U@H@5Y&T9PoGa_O$+dz#kk@?&;F}U?!UV- z{R6PItw&m)f6oXHzquon|0_I}H32x882@Xz`d=7XSxaeM6yW&bU3+5|eoHS`PW<(p~p zH1qv-gATV_&vnBMe;wkbM?W;rI6yJ7GL}8UD)`}k&4X~BnJJOlq`uM}YK_fxBFU(I zQJK+v#n#!UWB@_V6Lrd-&8mZExhmP+Xp)B87<1GkRIT+izOg(1(Ow9%l<74O%+@b)I8CiuOTG#zs>g zbBaj{W(dWiNBZh-_D!l9aq6bG41^V*b*kG`H+>sgu7wiwFLCmsu#6(g6@Bq%l$|sc z&B-)E#PjBoq@fp?wiEOs{4AAFEgWL_lN}4XrW00dG`;%4=HZx&`x5b`+HgA-?SU4o zA$x&-*Vc+%PiafH7)n_Fopvx}6WICI5(CxFtsWUz$_b0s;B~A^h;^L_%32oXUtJ}! zJ(|0{Dc|d>0(BZSp0Jj_t?(gM7W2+szsN`0F-Dhp)zBLkbi$Qun)0Ch=rPFTdX+K<~EGf{u~qp_0&M$PLQj$M;V zU@CYmguPzxPW%t@e3m9Qyy@E^N=;qn)4O}a-yB5q zW=ZHqT;=O=Bzu$SDjCCEC3eCDAMldc;|sa@A@UUcjb(@dl{P@ck9(4>WLl*IR_qXD zl(ys|jFhkeN<2wi3r)f-#h*?00@}2RK)VS)z`nmQ+Ii~#{FwVxew@{0G{6_~FiI0h zu$=uJR$ctLq;j?j*|cYjn0#UxY__CgQH#AODqP&!nmqfW$&SR#luPHtF*=<6B6RV) z>{i-lZPF#yg0CR78)nvg>s0iP3TbjPv4nFy`ww>fw0THdSl7Vz&gSKNu7~t3WZj99 z7n-VvAP}vA5`BHjRs`2Ual|wu{Rb7}E1yZ@8S`Fq+0FHTqno`z zlMyz4mx`C~=RcQ>f6>kUVXbOx@egO!f0hjAm^!FF28^Jq<+U}<-bEE$C&o)zMFgmb zfY#PQEJ?|Xi12`#qn&R?sUbC7fLs42?C>yeP7Ajm5QNZ)GDS(N?5bsMc+vaf$G8(@5EfOuP+32v7Ho7&2gDeRybaHD^?xUz zRI}Hsgnhqu`}gxd2`Jy(PDK-dy`3$?!CS@(;E$junckU^Rf^ov;9=vOR?9K6fYz$1`d`t`gd8bu1nPLzFtJ(WlC^%MV znZn68K}e4QTT935sv2q#5eEXv66gKJzy$e4^#DM+n|t_3tXE8wTEW1?z)ZvV|njj5h{co*0=kLm2hjZgB1NY+x(l=%Bf3gO@-$mZh&dJW`|61ZEt3$gb z9y|NQlD?%5+SS4irTI-RuGB|Ef`noS*0v4qtbnY`XNC|QY>N^|i6$Ut={A_y)Hk2j zlU|6=E7mt!pP3LwgThi4X=JiVbQEv4H*FSQEH!nwZnnRvzUIjNG0{lz=kdAMnSSZM z>pFgYYs&p&kJ-b;xi{S9)`SsylfhP_^_+pfbw9S;^a5=2DWA#S_!7dleZL=jJDu(dZ1cGh`=>|m@6eOet2Z?N^?uFuvXAm!X!|=m*K0f*fAe*V z56$5A>Fu`GGdStH7=OxcuG3+z^F6VR_%kx}*WNJJ`$DYdyK>9dVyG|mk&a#20ss8b zcGC;I&F6fd?_}@fvmL+YH9y+ta;(<1FWRTxF@KBwVyukYBDp^OUMkSd$;ervU=F>= zn!3-81fw0&AK7DbqdN&j!%=O1mr))mN%x#24Mp2gFI>8rl0JIq;snDHqHI-*hLwcO z_Z506r}~8iOa50UM|I0ajgm=68&w2j4G98cRA-V(+VUpj=pIj+6mh6A?pW|EXg0Bc z+1;ZYV;&sbEgA~R0YP${%amf*LfQJZVH$@9`x#CyHk!DfF>*132{Ap$*u>5v8C*D4 zTf>0~JX4S{6vO5`Y#9hN(pRyh{fLSKqSQVNcRDe9J>!rcQ^0liJ>XlIxM5kCG6=2h^&@Fym90+x=t zW*mQ=qN8z~_quuu5yeEJg9GA$d)?HJFALb+X(r4zSdh)WZ=At~h~2~7Sdru^l;Jr! zvftVl$|IOEA?2VzHPaH~qpJn&o$&H)8KuqjDybS-VD0V_0vs7Ok@KkC4E%*XcrFQD zO3$8u|CamT?(FOo?QW#2;{7hNbvbhkk2-LauHAbrN@Bf?8n^_QYBw@qNri+C0hS=u zWH$3xr)9Riv;Mg0f|{Iw+`*e*3O&v4vj|s9rj=m0mbo;P%%{$f#KEU zyIRjrxk1I!(pqPmyJpA19I*5`Dy}q zZLi;mSeB)&jZe?3SunBGJ@97t-6!o^Qrv_9>D)UJT~F&QC#>JC%aJS^+F@u}LMyKb zRinks&ZEDs%I0DD^4w;+?6Nw8cgh%f+?&Ua0j-$o!l|lwzzA`OK#!;JAVJv8n1!i0 z&e;wLeXWL^MNkx9NQ7r~eO2i6E-OFiv)8^)#$xDTftfPEjsgc(v=5#mWx=7D6vZL1 z;}1C-8a!u5AC{36S#GQ9bn^{dr!_Iq@DRrH%-jZy;l58+y#q)Qu5!HrP6OhQ12#EA zW6@TMAIl0y1VY<`iIohMo>f9CX>>Eos3x}1*qbho^*-`*QFQE{Q3}g?JzVS>#xO8j zcUUUsYISZLZQJTMtwL_rBrqCL*rrW{ZEcPSyL=wo!Of&=Q4|Jdl-iDfbDblyG}$6C zIx)|aE`wHpxmw1ySZ5V8%V&oBfDIc`-eC}N(od6qb&e|2W|gRAya8kFL zuAvy2e$_G6Nn`H!hb*>T|GIPIbV|o!pAYySYIPr-Kg}lme4{7{!<9Ct@mr(6Pw}#? z*xh+oQ}}p{#(%C_jS6UO6_`Jb`_YCvz5I^Y%iy8F^4%J2V@`uDBJ!2 z2xe`X?}aZla0b?6N+~hytUNmz(L$sx8}B%0Z%S1)Vrdj)RuDR2fXZYYPHeoC@0de@ z6B$CH**`W$^~u8hc0~ht>uil3ttA)HXPv;p!JoO>#{0OL`>STW{kY^LAC_+W3q2@0 z94;=+I8tbK2Z}E1bj7Np=BhbqGeH=7X8P=t<8ci3!KH^o2_s?%2|n(C@dQK>tR{sJ z1JyXEf3;{ia4%##-8XPwB_r+IR~(!60rVSXrNwHE9boFnY{te0SmHk)Z`xu!tCC!y zUy>f`2I?#OlAY^<)~BKrWK_e4)b<16L8h1)LT&}I`vOIg&7+uM_(@&s1l0X2*%fHe zpQ`#5SVaUm4cS~>QAJ%v*+3_V*B{9?dHO+npc67F;TdQQ$RA})DGk3h3>3Kx!tEj8 zSmBxk4Pds*Ibruue4H{>>7_QMR7=IDEy6F-E0<2*m3iSqqmNBQV1x1^J0ZeOiK~p< znhf$grl>pp>$0tbij5~m#kOtRwr#6Yv2EM7ZQH4!V%w=N z@BR9Y?tZ)P80U;}e($x{-e=9V=A2B506^MYP3&~P7dtKC5#G7Uge3zUTeqp|3nPg3 z+DuAHVQuLyNI5Cw=-uIw)Gn!;dU`)HGObGg5V|~%KbCAtoA<<6iy;UVhgRC5)&cxj zOL}0_M@p?|n3^vC7TBWPcYEFd(<+5Gp;WoB3JN=(qD|qKr#-c>^|$Bjr-dK9`iPpT z$s7T*6aoIJYMyIX45SaCR*Ev-1$$1et_hSm^%ODd<4)$v6N=JU?AiTBCl7t*%&-ak z)LlrZ+E$q$MhIPC&rvuFo;WP-AQjgHKkp1G2NGIA@%wDKMG{`ffjNc#ys`JOOQ~lM zTW}Aok-_TwGXr7vP9rZqVJ2`&9dFz1aG#|svxegL7FaLIr%M#v2cdTEF<}ZsOzxFT zk+`P!b_rh#yr)lWiduH%r%sB%Q83GNE!wg2iY55*N;M5(N<`dX_-2hj&ZTl!Z}CiD z;k7*KUwY8RUMVhnd`|xLRAO%3`SN4AB=hpn1s#&@@?5p~NDLg5)D;+vy;c|3_68&~=++*Cl~~N1k30^(VC^fnR4R zFJpc3h^lybJlbLjb8_CBWN(OpdW6s1pStCp-RWdfsBq+M*kh5T*h~5S=S@mkBy`9?EPT$qfab@D%2;K<|~+oK*`rQplZF=oA9YFG1yqWOqKYdO^YXs84wwPEIJ^mKsl z$)XDWo$bg{gYh2gG~^yNqv(g*9w-wj-;&f)T+1>0hnpL8n$X#&ouj7xacpVt;fo#fhr%_ud(z2k1iLafsftl4VN2PgFdU++PE0dwSR_BqtDH?4)QJ4I#4>E50tky|3j3!M( zk&#}7%jGFTM)`4dab6O7oNh=~Nlkb4hmJ}Rg>zQ7rv^f|XWS}_A27{j(3UNKb$#}M z(gcQQihjyT#&OyP`{hnR;}z43a-Y`^Uf8l=IZJx6WP@sIv9wB2z}*aTnMl*DS`j?( zbVecG)cg;b`OvBPNE=5c*RiVO*oRfB7Ja@EpL!&SA}~-#?C4QboCF$n0=J#5dbq2& zi|5?)UX*$ixiQ*;LFrFWi)yZd$1=xihPCi0x2+41|}fI#jb7#yU>$lGb-M7Lp; z>=<94IE%pn@&|U_nZg|tZud#@##nN0%lGcko32G+^oUJ5P9TiI7Jvqs%9EjRFinfwbHM6Q)Efv3zyHsx3NxhrB5A=tUVIox; zP96rqDq~;}W99)&Qra1%!&*?oe9!`+G(M?xHZ@Z67nQ?N1cR`Y($OYYKoJAdoM9+u zD2KF_1KmMfN&`MZqxVpfIh>FqtO$9;QoVAxa;iAueosvu zE5q=z>S*Tz7SfJajxz#WUUd3?DuP98oW0H+d+I%l`L3lvdpk(dgPzELnXX5!L5Ud6 zgz!DZ-RgBIW9wLblHM!kl$Y#j)N3~>r0hn_6sisScZx+tjWM30oicDDp!@jjDKYu} z(M#&1D@W+f14XZ7&kkXuCiSfQ73QBKI)7E7h31d^XI~>aQC~PD`B!EA?~+OXQi+PV z8=2Vu6Hf?=pRrxwM;z{v*(-F|;v1C7rJ<3RbjX5q`T+wcPEG?EifFmM*)080 z@f{uqDW;F<$2aA@-l7&>RKsNk0&;oUj)n%No|o>X8DH-=_#IXp6p_jlgPri`>h#v& zDCFvt+A(^RF!$Vkb^6L?pQWcggX4!bSne^1ZC}^6fm)0R@!MRgeD(6{>oHnTuW|a7 z{I|dmi4+JSgUs#+zD=qgzfpPXad}b%jN56~l)PC*I*VaJt>C?vT0i1^P+wH};(1kG z1CG9vOcI!}x=2jc5`|2I11o6OjboQ8GR8G60 zy4!SJx~nK`15ey}48Gaa8t;?GWHgp&w>xpu`+DNImS#|p2emr6fvDILvaR}Rzf5q{ zpAF+$KkT$o+CNIDJ{!VO)J)WI?`0vme|mHAK}L78R7K{X$LR$Q7b=55hKSRbMaG#a zM$Fl^Q0P;91TK{{-Taq5ep_@2;ldeiiUi3nmtwIdo39jFih4@xaIBkcy+YmkiLgj$ z2c%z>l&+U@3!Rh(M|@lOqO3F~2-viI0)q6kTRtH=1)=@X+HCaUJDj&OF!W;}R@IBK zc=W+4)_~}EK!e{f+hUB28Dw}fYONz_^kgfRegCEd@@bnv>;E-nB!c^YKo|cD!~B2T zsY=buTlpdB&nM#yYyy2C@lQ;_+}tr@WK)qs z)ryBYO{vY$Z=5kvJmpo1-_Yak6}RBgBm9{4g{auAtm2_TX?(&;OpHRMNIPT zi-q9p_-a#p|3hx~M*>d|c}wqcmkOAAP$BK5{Qgq|Pw#H`Y~GjXhuxkQ;d3RzujEIr z?3PMCjhjsFZYtOwvaYMQYf#Mh*$}@kVn0g2Fdi7-YXqs%p9`gDd#BaUd4-m!O1{1z zDPgUPLbkoWjvy%f(aLCLC_Tg|Ebs8rnll?ivq~OI4z@4~i6~Bm+)9d+aZR1DgNK#d zvh{dV0L*WuJ?iR2eWgoem^MgXOU+EK(P^VS+gz<=l7g~ma`-`Qv^0>a*(Kd5|LNXV z$F2rGK_%s~ZSCwlK0D`JbLFH+;N-D7#Wqx`!;8y{wdyLYc}y5Lsc{hH=3FzV{PiT5 z*}A08W=sH!tAQt*o>NThHOg78(r*=UAOW;)_oB{Odw98!%S(p4Kz@NY7RO>bk~Ce+ z@MibWoqEYTDNbSz3B0R-TtSOZ$JmN9O$MGgq)9i464Gd5cKI_^(7j#!Y`e0KHY@s~ zD3Z^nOa-#?7n6Qry+gG3a~#4EbV99%CGzGi=7(2Qg>|A-rfofv8rypgc#1f=3P5{w z>q{hMPhx2P=T-TNEPhy#TY{sh8~0LHI2^{kdKs)|d`DDZAjzBcX#wE{rg*eu;fqpm zomS-vebxHwYA#1!$65UtQqcHoupon$$}d%W-G@6d`k7n?oFm7jVO~&9nJ8cZ781bt zUBII|DOD&O7c{{%Eqg_ELxKgf6uvDRc>UPDrBoQE=Q{mi2^9gJ&dv{pUv}cfVul(e zZcSSk61yWs87IS;a>w)SnPhuo-iyL0WpmUTm~}|ibQ57`Zpe&a&Fh#B2OMHYn~XwN z*0#zzzgCW%oz(s`H71;Of{rb2TgM+-dI)?MS{hl8Wvwqb5r*$$GdA{e2BwTLQ`f4$ z88nx!TtZXa#-F(#{Ng$#r}1+)(8OW4?x$7Lw4a>EJEj-}(Qj-&6k^UeU&$EPFx1}w z*CUZINMRGDb(|PbVj`QY8AnUza&e^N(X$ScJWMzO_XtwBkcpINt1_5c%?j`D1EJw`#|Vby(vaYER0UC|(@ZoSLe9&2Q$Bs?<}!f<+UG90~_tjo*Apld!C1A}NdAgIaDb zD5>J|5#7%S&$V71R%8UKv8JlW?Ihw&o(+g;I*}}r(ot@Fkyfp|DDs@AUR$P~aCKqT zC>7iw+^GA(*6wzz$OL0cf$fMNkF$IsSz*F4Zxg{{s$l5F`x$N&G;vTI!K;5$?UnuswN$Hqx544?ohHuunVUPBo&&IjrWed4chConKL?d-JlA zxi-;;+zc1DAdln%O@g#S(OP&E&7AEoW=cq=aC=YTPO?G zwT>?%2ooVzkUQu~EM*1cB5(n1ZAgqz$n4ua%bMc^N3i#rfSEJP_WtS4WjE%Bc+=8LpfuL3S_;*H0kibzvFie=350Hi`8L^wGA2OW zj&1YNE(q+|g>E>bjI{R9zy@*gwiyx^86H&v|9*|NMyUgi6Jh=aO?i>pVRt%m%z+5u zK6k&!AeY8(^78veF}a1&J7etUW|3E18NHwuLs>DUp-revKSTnWGnBQ09qXvKMALnh~!!h8? z`zYyI1jZ)2d@WnkZ`X*mg4kC;^+zz4g!!l$V+dgMO zoe~F{Q=rV}0+)9LRh;I68s&iPx0G^BFKm{Ovcm>tr^4KHW}!Ld1yPH!P)w{UQL!jE zz-$ek>02m~hw17VQ@~uOAbN?ya03*^(xoBwk;f6yL+aToYW4`!EqP1=3Vim_8uu@= z0b3K|(T;U)>!M)5y3aZc*z64A2UMWLvcIlX!5zG19$k~T7g06T6JU?J;Z3G07?ogqKH;k{EckHax~jxiVljIteW<**0g& z%XH%z_DIV$@heuwA5Qh3BpmP1QrDal2iVclTgFabPnWP$l1^t_Qs3`ao#DuHshpvu zaol$8PG2lOm?kH-m( z+P*7zHa;%OYf{P=9fgUQFqmry&1Q{^n($;&vJd_+O|nl;%Ohd>MnrPw+uh@~6F3|M*;Vh|ZT=y>6hn~ZWL7B7 z899gOP7-W595*ZO3L4<2mP)Sj)G(n+ScD3TYB|Sh?xA4;^agfA+(p%wwrV?cDrsW9 z{8fwPpbhmD>CHac4b30?!Hj4(<-PoUk zV&C3s)D%q<4n&7Gxq_F7R(r`N`4p~lk=|-Fw`=Zk6~>~6K=b$c$KjgZnbr1HOep|z zQ+bxcy1-!;xtbR40h_Ubr~1b4X_EKfnM`vKRq0KE$0<04Y$v-7>dP5-uuRH)U988oW??onTVULKw0m*Vz%hxVWG!Lxj&uj9Z>L)cx6T)x zv;7X6Nxyv4bgHjNCwN{2+f^k^COT)Q9VDgWt8OC=njuvWhP-TV$<6qA((nTj42zRp zzXC^p&`G*a+48v3Ir}zJH=;T3HlA;kl!RTJ*tVigIz`!%q(8wUwySl(LRIu+Sq(6k zatSJuG%dD7U#k4`kPPZhr**K4e5D;DB(0l{!!;t$NtcLG!qKIP!a^QK7j$%utlP}= z8}jN&{wa-UwvW<Ot%D)d@qn_4dt+gmdM$ zbYg1vOm*WF=R~U0ef@sCLGY7O^jA9!%8?IVGeS)xB_fvk@zN<~;D{Ici8<2@hn)cX zC}GH+d&s_98}UeK$iDOIOBL}57~8BVh-hdP0DW}_0DVmcHBW}S&xKnw1XfY!C-7q^ zJi-wNu+Hc0iT4?b^O1)#tKv{7!=7jh6y6YuyS)8I$)lf#0gJ<{r>bIt-cpJwjPOSF_mn8UEzeFi2CO{AJs;z=yqPx1(mq$uDUW zJHT27K%@8w+DRWCZajB`k7dOE-Jp3on)5Fl*1yVqjsibY=dW_V?2D1}pKR#A%6$Vz zCktD%zgPQlQnDZdh{1pM%0lT-m6apg1!QngwggszNU;nf5gw;j=avo9Ct-)*>_OCs zX}Nzu%xPg%K35X{qRs4h|(A=~@HdOH;f@**}7;mucAnBr- zb7W7jFwdy_x%-YsYSfo?3$+2K)k4#ArfHLhBNZ0yLhIh`rR7&|Lbf9!8E9SSK!+D} z0Qt1s4$DoOGAVuw=Tj+6jylqYK7Vyh;y8PPr21zTQ8A_cZ0%M(&8DG1>LMf0LYlxv zdN`HZ;O>_Zq}D!`9K`zabPHrg=*Bw}eo~Nuf1ar^8sDx|pj+ftftx zV4LtRiedXejp%t$q(gdqL62R6+DE}Ky^EK~bYhv^lK=ZfQMg1>QBY_h_ zNm^&zplcuAe<+ zjgl>pFRz*rJ2n~U@$_rTnt1n|VvN3|(S(=MY%-(jefFQz>AJ6qB!NqFQSO<^2IExc z-B2bgXr0$5hWcQTZ>skHoZjuFsO=?`6=+L&iL@BkgoE~NgF13^gr$LSMlu0NHH z!vII>ec<_>>fm}A{^*pER37BbWeb|S+CwT@X|ru0jU64!XBL8tW29~nvvp$6EA_CP z5pkEB*1q|NCitph(b8+w1FxeW3hT=>s8}jyDdW#7Q~No%8beki9s`+dr#6Rz7;mEw zqE5cva;|lQ9om5>9A}5`_<|GDOl_ygTr&O39?m8Lj*bTZkfZidvXNVm|B`3jsM1QKM^a!zyly%p z9a#oDJUx5#X3|;#Zq2WrY>!rjp6jwQ_<%h>@7IlQcnZ>e1b?e%8EYKV|Di&SVP~y=AeMH!|~4 zh}?4{u0QVhvl{ckyTQr}ccGzWl2d{YQpn3Jj(9`4jO;${DcZgbj;)&P5VfoSB1+zL zY3q{g<;iqUZJ8>HxGp|*TEv1K6QWFZ;MXYqSfR3D{vRG-Hu~bZ z_Elix%f+@8copWo;E2!p&7r8$Z|)Y#rn$2R4ce#YT z`zs0tRIp~FH|)cO$Ko^Ms+MRU^Go46DPfNcqfGq>`(Rr*LUe2)MP}d0Iinn{~*Sns&+^d8QALItCo zw^+01=qNUD`aPR=foV1_gZe2`g>nk4zX8@!2u30w0){uk;?AUeEhD6B@K3V^1v({` zrxcd)k!lu9rx5xrA|2xe2D70ihg}YB@ixY>gU`U%_p8*_GM?YyC3v_uEOD>xsjs)8 z5i^d#cQ}c9mq*#x;?-k>0!D0>_k;*=F%d0~*^z#^=+|+@cM{^0q|9YEnA*t0FA;6h z;KboIkjWK(f19g9s%lYe{@VBZUoYN&+yDP2PRt`a0o~6Jn`!RiL*zckXHHk`HUs^0 zHek<(Cc@g{Yfh^C*#hq!h)+^l1TK&uVNyD~<_)wLgvh_U_s34sVKI~p-zwr@5xwjc zjlrRvk&EiQI;JXZ&E_;fvuI+6|G26;ZaS+@gM$9Ihgk*Tyj4Q&oc;uSkmO-gCViAO zzp}KM6A+^-J61IpkcK2Nf=X}VR*Ne zZvHE{f5-1dlRbQYe+dade9aL5*L&fA;n@FBZH!Xh`b&!b&sNsSx7r;R|M zjhl&z@#4>*Ww41aM&;P6hOa8Ga2e&)of@^13XH^F@!M!BTbmh%l3z%hzvNwE^k*; zPtw~8b*Q}pvaPU!aAD_VCz?BDgM*Ke9XaxCQU%T(97zY#6HPMSCW0bQ;4#ytA{Q!Waqd{lQ39I>SYNOC^y1>8XTY`D@enp77?--ZEFhrNGYpM&BQA5vvt51 za%#NzWza#!(=g!@CD9-9C~Z8IZ-$haN94(MjY}BjUCeAX-focB+G!9&hW2{pviWnD z=77*0Kv2m&wJ_>w5`da)5IcffWA=SXYT4kG`lm@2BVQf=u)cY_518UG9|H*fN%4N8 zBg*2hTqV~A)0!c&t=fM6mRrREb5Xv5*9{z=5FE$?C`}Bl+3DHmUrqMs{1^ck(EHzm z2i&1UFqUbv)PK!?5496k+n97LU^(I(%1^VJl5S3xehNIf+>4uMgb#7}Mg&XamP#eZ zhCIB$y;b~2h%9)NkKm1Qqzo}#J2An1Yy4gImW9K!kn6;1y!GU!JB-J$F=|HVH|%}D ztO@Ff&XGp2*M4e4v}duaP1pEi;Q@D-JEqt6IC$QNV@5m$$`*~Fb%i0A7T z4b|uZLFp(Kt#UXP_6Qno;=c)xbAk<>4LK9o1{)dYYpd|BMsw>NvjSM)3;!aNgK zOQ2pXdWZuumww|Q+#@ZvQrbjtvrTpNQCM^{{t2P1BDe}=Xh@w@?btVU3 zlzYRUJgd-@P?h6^MV61l=GS56FaAu*5QwdWR;A%Yv--`Y<$mTMlVqk)0HLA*cj&C4 z6i|?r^rA<_Rz1?Fu{caSPh7ogrY-jSFw8reeGHWO4R~(}(c$R(%>m*Ku}lJXpDWIg zZloawxJSJ^I7d8bv=J=p@a`@K=@_TbvX%WcykshY9T-ZhFja~J@~_xW-0Tqq_Mn_= z5S44>CHvrV_9#92pkLRFzF!P&l$t%d&S|V`@P%vIjnF4`kSiu!{94&e6CL&uPls*3 zxrD()Y6k|<9ASlTr~A6(s0H|1VDm?-1sOpD`({;z^5!@0vA&oW^gY*h<{*6JOo22BCvooA~7@nxD-gECsSK+ z-xo8!O#xUzt8QI&W8Koq8}XZqHw=K3TT?hf(uZ2dr&V?1;B-J`rT$~CX`RofGTHZS zn=1hV#a>{V!!5_ByKCn2aqVcb;}4eubT5uKB0rI<RA&=Z-fWTLr(Fy+2EZK(<7GBCHl*VIW8Hu~jV04hw2y~Xt!ks8hQ#r}JMwbqUin&=Ukq&Iu zbR??mPR%@X1!lCSY6bGj>b24x4Xi6>z;L6e(c$TKHat_?_VF>Ri37KxvmJB1!i#GV zo|RT&Z-N%lO?I%dU1i?Lch^O6W@eHOPp`>T60}I+{zw-}>8kD@*%)dHpG~s>qO~G< zZ>{*~nuho}jGq3b=%+2w%8EWDPAhOWR%b~A)oidAg2qu+qBKUDpx*ioBGdlxVIvAS zy1Nb6JdYBS`S2D`sRo-mp*(%5hJNQ2LFVo6lrm$5bxtxhNykl)wpcu@?gt{ysKvjb zq^PDyqinGa=8qSkeK!V3skRf~QU|cw%53YPs&p;5x)k#U=Uj+nH3Bp0Ol|{LG#CyDIgDh1#bT z7|#(NVw|10@Nz+0rjdGFp8NF-O=+0s#e||i@ikje*n@`9_b&;-kMw>tMo=#)CC4>t zHe^qB$^X`}bhM2g#Y&pQzG^b1?E6yx%^TXQbKx=~=BTCJ&WKE%C~!2Ds)w>q`+lbW zBM3S#E=k}w+i@%Oos08MZ1lkGi&1CsK4dgyVwPWg7D^F8ff3NiH~pq)6ZPs{_L!@e z*GUZp&1!mA`YKJsSB=CMTWHyI0s(E^1iQ3l8$~so6-#>Wc|nbr5jeXQ+Eh6mUr!uj{G~kX>w`oDSz#)c=j$n>y>E%mDIGY-C*@{ zwzyC-ng%BgYUC?oi?##k{d!9pt6=exnDl(1ME8JNcL6U zvQREb1;&f@?>rQyF(0-!w=xXt&xB7WRiWE{SkkJCPshyctm`v3G2=Dl*Xa&Ofaozd zZ6BX9inU!i)v{o}B&YR_AoXsh2oB7tM{C5a>Q2=ZB~rzGiIy&93k!6Z0R@Tea!4Bh zqt(IX$6jz#vfc_f1JLfI+|YKhsO$P_L=s@!@tZ{a1TK)=f75~5Wi4za3MlOEK|h@V zjT>urQ!>snUSH72pE%{fV`T%;ZIGPT9MGoQgT1|&H{+J($1yffZ3_6OI_bpCx!}~f zOX)agy&`9!S2-Bo5Wiozj38q0Gep6s!>m$Pyew)PWu)#uZN;cLrU1+aoKdOz zS(TqNy`0WYj7kRmwQQa+EtJ% ziN{%*;aDnb*;-n3kpzm70`UNx&&y6}*%8&w;nqouH5-CCD<%qcjP|5|o$Y+9c2N)^ zlKCdRvn?9trN3~EN=y3syZ~84YkeQc1Awq6JzslTrSLBfMD{FXUR#<#MBy)_K=6=d-+h?NR1V#0ucdm{cYwx zA$1bppQ#R?#T^=seRTer8T1cq%wPkoAJ)b-4zfF*+dkN44EhbZZvNxM`xA8Zo=Rt! zkT);Ru$XuI2YAiy)8HEuBP+xTeLGCpgUaTpbL#k!XoHR;<_!*A&Mqm2u?dc^L{DL+ z%%K$VPgzGIv+hu26t;!~rSaXW+*Bvu+oPO|cx5+9b*!_zEC2QOHQ4Rl+9L*YyuA83 ztyOj9)nk~q{%p`yE%Zm7wbGy_Ugf|hc?rJ$bC3_n;HEluH?!kv0u0U4X8gM~o%xuF zHI=7=WE~kk)7p(KJ0WSe@6GUn%D98Vas?}CFr%Bks2*4mkFTQxm$fZ&$QGPoQ0NbN z3`d$W%S{9mrL9Tf4+b*si4XWCyA@BKGI{Cqtx8=5^HQ^M$OGQ$Dn}DD3KwHy`V4R!o0f{Y zNMZu$9i?#@&@5HkIutXsDz}1=F=eSYhUjonVhQdH;!eWM3iX;S9XCs$6h`9)(d3Ap zg$+O0wjcM}nx~f+--$+Y;#`rdvshnAtO8t^69rggOyrs7=X(@>{(-GSoz#GCM-Pd- z)mq=x)V$K91W1i2R6J81&+nH~^+H-18&^`|7*;WxRV{X@87IzQ`Ej-`e;%NT5otlK z&Dh>AhPX=cs^SRoSZS^ooJnD`=XytHc4N`DYEv46tKH|3M=@gRu7$)W zq;BY5;`Vl~EFAHc@g+KSr-|T85wpLNHFDRc}$|6Yxf$4fA8XvX!WnU2$nQ6Iil;ku|J?izQTAXO6E{5+U~<|eJrk1Nu$cTc>h%{FjVPJ4-vbt@nl6db1Y zMy;>I1>WkAXxc7)^Pi0(nl{2Fr|1Kmns*~z^JVs>VM*G>h-i(_yLVvrATA4;#`R9(lUo+>Hnz`;K z@()QrCC(@1kJ=xw_2&>A*u98~ICtjFMA~a6a_0*fxU)`#m?jxUcKEpG29X8cYJm>Y z#PYfw5T&*AmP{F1xUk-2iEU>DSo}yxOOTMlq?G z*1(w4CkP%9SSJrI>F$CVIDWjbKm?M7Bw8*S5;v=$dT`;><6e zxN;U~yu?gGpr@p%>--)JYb!jkFP&$qJq#Uu*OekI>PAUixum_%Wgy1YEuUQ=yupDw zRes}>moXAkZ7s$v6(mo+ayb-W&z+|=?Se|aRlZt{x(@Cm7dYg|_bM4|qbur41=_!f zk0>)yJ4bFxQ}%;5okjE5(3muJwIxX z^Lqm*ICh8W$pm+Il2&Xlb=@79XCzr+nOf{EbrA2?d)!3^W56BuAkFIssH>)(r_mi4 z=r1Th^;!&6QFVn_Z3&e0@RY|xj(XTtC1pdjuR#($prLp_Jx%VPS@;)i-B)n?9_lN8 zu3ztex@>;+kOZ9V{^1N_BR?TKK#!OyBP1mFnmg-w@XaEQ-VISPXi@1~Nd9J)KA2iq z!0k>C`*&h^Zy@}j)j&xc{^W}_%&YTizMgG9AZ`7_zTxf&JW_ag9313V6&=e2WYS$x zUa2^Vgm9M;oqErrsOlQ1g`FDi7|2JNn_S2Od2E-B-*uE%CYfc+)#AozV~Q;|$&F`X zI!Mv|g`*-%7;#crP&7G%^|X%FVwIj}Uvf50^ESi!8pSfz(mvbCPrLf3Mi4%i$9f3; z&n+_@?gjDbvoME9(H@o=e*W$aeP|r32OB1hKZjth(d=@E)~G7cqp97!;W^NqK{8}_ z6@Ty?n)21`8UZ<*k5+Soi0W)VWB>aKs*iFhgMF=@*4O)AVM>87dzG&)+&`$haxzi_ z{D?jY#Zh4&^_EC-cpK1L+kiZPC$wkj@A)rxWCyAGIA@~g2JXTx3#-cfcVQ$)0|NkWa&*X@LApLuH+JW>(b<|L%H#kAR5jY+lUMba)pd1**h5fxI) zGAji$-C~vM$Sm965!M3(7T7Y4kY<0@5MLi^Mhhi|d^#1vNSH>&E%U-BAf9vm5_IjtPg6?fp#@8&^N1{d}BacH_(N{NESw z)k03+`fKr2{;xLXKXBf^ogYC86SP7Ks5%{*Rqf;|S87&@>8;3-pSq*yI_;|q7`Kd#Q!42XDg)kD4 z#SF>A>;&i%1;X-4q>7x}+iS$Lw0UMiA#s4bs_^g0WoIq(DtjjnX|rv`f+j0aN+vTa zE^OgKEwsuzlymk7#)~^VZJcT(#BBFr#P=SQiCzv}q*HOFV3Dxy>t-T-?VEo75?;lG z{nlJ%C6&yCtL^tD1N9>+uI7;YexoS$A)Kt;o2oLG{c_k6_)PoE=2ozlRth5OqY7us=L4WJ%X*`kyapoo^k~^%R&9mwB z*@y?5RkzHmm#gA*VwH`5Ygd^Cq|ibguk{fQsUOCayu6B;xRKm~__0Je_&d8gw5uz# zaieKv9tP~(nyiOU^p`mzzM)nf49rGso}59mX(c92-U;9&Z?SQ&C44a78Az-OV#{i- zM);s<7LDom1O*&R8uj-#uv-&^cw;4?700H;0iR?cAHVt8e1o@*5QLAz=8dzG`^J^w zOg+2iUSFT}2oB{B8f7Z0k%$xKd3SuktEsJxn{J(wP0FQ8mT|cDtr~RQ0^z!1vUPf4 z`ru0F_r2F_;hdA$RbOjC_F5yZ_?+x~bpN1(pzO^H#jt-i7ErbTSuQuUl>5n8JeCi{ z*27Pf_hsU!%mGa41dpj4-7}w2gz)4>Uzq_vY*L4TSLY}!;@2ij6r;6bxAYh-EBz|<-?N2AI^*q z&yV-gc-dF&6)TNNS(!sfaeXpf`m!rZ7SK_f1$$z>$3tecEqawe;kUuCl(isRe4sZ& zlr+wnmi^$l7O_!AVJ1P6aC1q$$Yn{nLNPjGeT_2Ad(g;hWMyUj2ot#@HU0q59av!x zz)l@uQy-Sm?)!2Qy>h?vGWG41dq(QnGppQB(b1}lgY1~or;4UT6Z*T|c{I4frtnve zV|?ZKe`r(uGsopzod4z@_N9<6i}H0WmoUk5qEUQTNzK<59?wMseh>f&SBodqg;Zd+ zEGvknz@=7Nbnh8CM%YOJM#=W32bS@^27O2O6VN`A){?g}OkeZL=`vf^^txKO;_LAR zoelT^hjk7@{7E9y!psGit^@8$L=eNnxQ-%hhv)+W(4|dk1{);a*Ya2~(k^l|@{s$U z-kFvzMS{cDw=ccTb#`#Rcn|D94or6D9sm;N{-QQ+)BGp!V{$aC zq=adD8gI*)lqPL@*Ru=xjTTnw+G@p| z$yN1x;TM5Ul6b!|W2WfBC>j;#Lu%QUBb=Ua6?+&waG*5Vl*qDw)n6U)t)CtV#;9R3 z)f`~{C&m;kJ)DTN&g{sSZW%p-$f#)e8`hsXnzh4XM?mB4I7X)y7KkEu!H>lnZmry! zKz+NWMi=g)w3TD*%1b)LIZ2)QIr6II)b>3EEb$!Q*&j15iO&55Fk$RLfmkb(oVz=069qh?dLz z^i|MnTg8`&leKzJ8cBFK@1%@F;csUCGB<#1jwGi_wa!pA;Zhv%NW%K-MGqbyW>go9dyyHQg z#vbW_f_|MIRzjagTa)1qiY_C)m+w!((w#O)f`V3@;6Bl7f`XgMU_aEW!ji>8ZW6^Q>(*kpE8JRp2{=ie@qhZbLO$O;Uu^e9r+j07GIX*-_S@??%T39|C1p zhYj&KV=5`UKwu4IzrwG@7Qu$+u)FOc*c z2R7xN1R#Q#Hif*(%~ejlD6Y+nS*U3+Jk(;cP)x7BEk z0t3B*G{&2&3Ua%_&ol~9dND~xuyJMyCm zwM++&Ha{oi+@MqrS!P@Wk-fizA^N9L#0U0ZO(t_*idsT}B&j``7)L`sA&yY65%#M+ zH+bvhxM@>A-nOXHFZgt-4)Q9`C66e3#`69J_B@N!$osR-FeUaWfQ>u&46C5bxmcDr z>>_X!XJ{VAgJooTeaqZ@=w%Yt4r+ZZi@hZ}dy|wK22l(UZ}0P=5s+A9&OjQ*a}LJy zCcI|YR-!_y(<6Mm6OmsYiPD%g0Z+W`M(_($aWFgxw98sYObc;N_<>_t=e-wgNyG&@c6k#Fc+OytD zRo5y-{v8hF#opnf;N#W~S+Bms=cEle36JRahbhkUY8{?W=Ho}qRRW4W5(`+1*k$H7 zkWm&}W>MworA033gl<%pUM|Z>G%OSCgv~k|;#AEDZoWS{puA<0pGI%7>))gQXm%et z`R&mDBCEiE;X5XqY9#Z#rR@n*XZ2TO*?#%^eSdR0j2QS;faQN3H2?jdUfROe)?(WpYyv|J>Yr?@# zKuy0kfY4tdZOclt!IT-xGs#nS(F+>8icG>mN`LQ!;7x95_5O1f(?=Ne59>VeX0RjO$Mv#4Q$*I{DLHL_Ey(CM=m$zkaOe?%0=VGV!vPVTgy>tsau* zgpa8EAq?T|XDE3A!m-{P{DBD}t5fKu9s~~f$ig?P_~@Ho-?)iSpo^;ORrMc`M6WTF z-1lI{;)uu1Q*jAYJy#j_A|@IKP3-Xsgz;f?)ox65A&t9DWgkm65&;?Gwc`Erjw9bA({0`yJs_L{)9*p$$rseF^{XVPpeIxYF-7>~GhLYXkj|o` zZai#|LD!-+#IZ_0^o8C%tZfk!PrzHr`1+6U?8c7(dvypEZH`e=iSq0{>yl&+@?k6c_&`OYeW& zX8vb(mx!%{%YU;taY>W%X#deQW@$6G59|vhroK25wtfCZFFs-j0WD-e-UaIJQ-|i_r6)>=Blb|h z<8`}ttAwnNbsJB zaq}P5CHQK8=^Sa-JIJw2XwWX`w|Ri-XvMc45MF(G)8oB5-|IQ^siAed45XmSAAMJy z600C5ZRrH%aUWbO*xR?9u=QbI8Vo7&{i7zFTmX^l&a9^jG zI2?WzUKbtN0Lx1>xE}tbM}6BT!YpvPp~#&AO!O}* zw>=G0)lh1<6+8}&WxXe)4`b#GrLjul&`nZ(p; z`?&&>F|@piY;;vVo478sYHF#eB=b$Nu6711Uujn#S$P zUMLXFAOKZAjUS2Oh1pg(AI)RktsU*aEr1r=H$o4+#PHq@Pfl21gR`%Sld8c`!Gqt9^8?s~N7j z*jxq3Xpf%&%M&UGaF`GwD>B~4ivhr-xEfz{UIb!T4%AQ>K% zH!csG4X@vd`%X8b9HPV8R@Eq%o>l2q0X$KepZ9k9!RU%|3Zwt4<5)35oP|#O*8&## zk_X~oqimyFhA@g7s%A6KZI?sJZY?n7onVU%>MAF^0@4HGv2*VO{>yCZd8Bg>#`fd* zjx&*5F9D<_irdhMoM`!OW@<5e-lK5O#!2pr{2kP#@6aiHruh@R@e$9E+!I8U>ZT9r zarl~rrNg{ELXVh)?;(q;_d|4z38(ZOWiso-;)!9~+_3rFAPncsm0{xa{?FZtj3+ww z;H2bF#FJHSar0t}j3U3qiHOSFm}y6n)P`@|nvd(>K0v3ruMnnH)Wsa+MT`k!({iJs5=H`&8C)aUoEU_}Q-)f~gz?;6*z z2jF*XeR}}uGHNT{2*;Va&Mo5ncZ4SvfL)8`qBP47^2s{mIj;O7S!YKIE}~m;1L|vI zK8st!I5jI7(~0>|DRzx52(=}@;-^=E@P8lu!d|G)G9cZg%G+>hxg zQrPYbrcRgR`Ak?OO^F2(Oz=K2MI@1>O}1bPOiwl};$G2Er4HtdNw^p9&a>yv6_ENE z7M6&#WSEV0+5Ld!fGGnk$&fs!+dNSQb$h2?`W-cNl%*Z#xgupavQd%lu%C$+I!!n9 z?FaSj3K&vT?Vrvatka&S&|BQ`xE2b3&U9_?fe!(K@}!l1k4~k?x`?k)3a76VZTxX#anI@Bb{~ zvho6!LXpKgd}u{3U~=a|KFjE(KInpzzj_l41ol8R+Sol_40umxnDg0ch+)wmM~ugf zZ#47*(F6X@rNl_+^cSQxPA@&oXRB|0o0T_Uq{n$J2GAbD23hdHnt)*MGGy1GYSIMt z$t9bRU26*EKi!87Jea=5a`Ir-s+lFU*zw^W@L}Y~tL@deAP#kuoJ1Ks(={JzQNUa5 z=%K8si&Jx48nPKg=AwACF*(pern{{%g0AZPK)Aztj?-c^ig=_c{FXfKj*^9JJkHv` z*iL73K=>A0O}16EvzxoIP3k0h{1)r1&=hdku@8FP3B$U zOeJv0OE(jsZD-l{EKK=Kixtz-F4vPryiRWqh(p%JQEbaIrlwReCk<;E8l6ucZ9>DX zKdO?G2-d%3-7*yEro>xn2}_%r)3Byg+2%)JS~c^%KRA!eZ9z(cl^VKZRGrNHgSMfE zmFkN}v79zCV8FOfYPuO3%IcsVGfuU{4b?OeDMO}yds-vQPRB1fHd>XLhzu0%jhiff zqlMk*&TG!yFpC8jdsev3P@;!O`Mh@jLzi~%bFpQ~(6sVef24$4miSyJJwQd?QV}IT zI_8^v9xXq!r8qq)jYo`ShBT5%FO3vidrFqT1ap3@p~%8k7_+)(Wcv^{v`CI7)xjQQ zm72fV;qw6#&&gNTm7=2|T~N|=3%*x3%sKCTYOK3Gaw9XK2X8yfS~1FrI7uh%-=-}) zP#HUGN9U;`vnYq<=8p@JeLDZqK5+c24$!-Qn}BiQm#m3#sD0{VwwG|t4c^+M%Ka@r zV82*N8YRFlumGz+(BSru+qHbDjo$^p!}qSn&Afw6u3?8*C3!$xJ|KSg$*C# zrHGM>kt2|`aOtvI;Tl-DqOzS5sa?&S0s9UWXM`%zR_+4W$QX5}vGgHj(osd%-pFz; zk1FIv-602l^Zujdz9NgLFg)~i>4^YmBb5uH8byQ~ZArEONS0WPSC!keNc{!$ILlVN z^!#!RDDi0mq%BTOW6GRQuY+kED8%eMzT{?h8D@bsP1ANFfM17CEXC%AqbvZRXIa#( zuFBv8HlCy&R({(^M^Vx#2d}>XEA@ylVEVJ+v>uESaG;|%uL)fPh`hCJECD;^^%(Z9 z9m*7wY1vwJOD@i3ttm8r_-b=bFJ)8${deVi?JLw8{^}Z>vz6{7#}*J}7ojixbSH=L zAIdV;9f1nU9$g*^iu0JNE((>OXgA81iniEV{tc-?k)P_GtF;`8*Nb#TyYHNimFAg!A@dQDxkg)`!yDUwlHgO;A)BNzMoX|a)|U;dA(VR8ni96h2Zt7^z#YPbgdTP z!n-+ARuij-zmV1{6d@`|6fY2pmlH^8(_sQ6zeR^MPgQR0UPr;+;UVVWCxaLL$vyf34Z}^-8jBng=5ueP6SMNI=Bcw4(MONqVu5fita4T*zEd$bl(wO?#oThft6&ca1AIXurh-Y!9B+hDXYdb!dB z9rn_dik=1*USh#>S@JDg^-2o#(zO5rnp(8m{k+;zNNORbJ#2-4Jvv0$jiPqY^7a2P zW&e+EJL0QOn%YkjjQi)u{a=Qv|3`hQq$p};;_wqM{lj&b8T~IfCQMbw0ap#_E8YWt zQ-@-m+)c{nSiFN%zAA@3R3>kZ+%7sq3Km+(iYDn#Gm(t%pngW6;6Gr}x48(Id_ifs zYIdlOV0Bh8@FHp6Urt^U!j<)sACLncD>;ebl73k%EEY#O*Hcqhv)@~D6o zLBR0Sp45TlymZ4X%DmM8B$PXM#S$qysM%LXP4D=zE+ay5Ury>hDO|LQ2ymPUF%pw> zaM5J(feD?bL_r zHGwFXL`q5J=^U8go#y~8l5g*Bd5ads3GAoF;aIJfTH*Yv-~@DRV7qOtCqQN(gSR(l zR;s6TC$ofBW(u=Sa(IJgQ}<6Uh3KgF$VrlZKL06Q_TfS%i!>~1nsK9I(=>OR3JCCB zW7FfY4QiM)l}Wtz!dm0$@H?qX(9MRAg8Ib06-jdgU|Z;-uM(~3m#ZyeF?g*|DDo}9 z6Y25_2GGmT8X^s=(iVs7M2vbL6P~o1MEwTc$F>rJ-eDk@C;Oss!#dc^svKG z#(oerkGNc#+`)QZePCSamee^~cPy~`=--gctH+)2WA@a{XP2d0q>ho+vR-22=vW=}n995?hr33B(U7E$#c%O^IP zK@7+%UB5Z6v=^bRI)Yf>boD=JYB=^8>fxhV=tMH=|w%k{d;JT>%t!U zsckW>7>jMxUQB49mWaJg(6_IK6}v>Ool`b7R*WMr9wpU(qjYdmDJ)M{>O^a-_J*nB zda#r^fD5J9-p+g6!uk)hw^>~`fD6L#$GX5#thHyX=SuO$Qhkl+o55CixrDFSFfxW{ zl`=_Wm9;R5E7D7AvQ+NNJ~VlIB&*Lp2I%`LRMOW2`=Egu|lw4+7vdcTi9|> zm!GRsASpv?xp2Pa?#}jnQ!7czo)?!!NN`3xl`7v3 zP?(njqa1DX%#pI!*#ifG%{6PQbn3!593Np~N(2@|J+@CumJkkyAw++Cqv)M0f7*2H z8xhez{{yQME>SW{9BEAPh>rSsO6k((lH|ftru<-ACYIKVR8y_0*m3!}%zc<1i+!tn zZQTjM%dXRk%jc3 z;K5>=c*5}3BAS$g-u=GV^dcru)pIxlE^DX*(yU<(`1t<0Xt&n==1I2jMlpp#>~<+T zD70#tcdF24bbPXy@Us*yWl}1cpN>thq^QL3v2uh{J~7MaX~ul6MS@yNaA-UyM!dMC;QCK+}q)9PHJegRo#fc%djsV4?|r-3gh%UL{UTs!m*X!afB zEQZGHqAo9xUcN0(;fvZBx7Na^saQI~-#pR3$QvClzDKo-It zl{#*si6l&B7)#BZ3*5R_`SW78dVvrmJ!2ZC6JEi;-?IQ({@E;so9mbtoL4(vXor2V zts$8gBK?tsTQlF#$rrY|J$`+oWqHG z%71*Umd<3Q2@Avc7%o3}?5aZ&)W1M**P1nL_cR;v(s*HpS?|qmvhvL2mvDP{f+i%Y zk8tEV^p)AnR3K72AY=(?9~aLEcxBU?{st+vk-p9E-60){|R$|!IXHceCXZBr4xP1jK ze-TV%5yTN1(O==@742i!%_z%lma~@W$|+fZxExY<+n?o`F_c8NA)8lqYRAYex7_{2 zuoc{_6)c?k_`(K=M+od~&C0+s0>@4}z zrgp7SX*}Z`q1)9`HmcR_v_!>d0{1zL?JivJ&S$>UHt({$5t?9r^>JJ#kiD*-XXEUZ zSq6{_n6Y|Cylel##jd=(vY}1HjbH7kwmgob>S38Wf96n`^8Y9y#lxA+RuEL=cN@Ov z#f-jA!_jdnNO+Te_Z-) zH}&sf1=fb)x#7<&ZsVh8%RFKfR>pufG^qKw~hkR9UmjUzK)CHgNFL54i)Ks=Zvkib1Mue6#y%@HC-j zZ{=$2C`|`Fa+mR9SaVRMBcz9ZW zTi@aDy*jysJ<03w+gRz6?A?)raHY^HFCYo=M%1b^F_pX~qj}(W4!$Sv_1Z{QbIKOH>O^$V?8@jK-8ORbrAYEnl`M9%wl{_u;-fMOinJ5sk& zA^FieQ@2#*(AY29cCLUlb;U&MaSW<1UtzeB1mG3U{{NzLKc=7YF% zOnkDAo65D^RGNlTnlHZ2E5>JXau507`xof{-IqoDE&0v!qsXNG7|s0m+P{dhtoVPg z{i6z@@hxs&n&=e<#zVeu6p-d?*3;)VX76x0-r=#B;d6O@PpGd3dSj{_>?^`*Ez-#5&m$-4@yCyF619gc z<@jYHQRYD#YzsCD-cqc0djviN=C_HPH#Of&gG7a%kDjM2^ox~;8i~MJI-Y~JfhNtz zR^Sgyd`?!4x5Dq8R1NwynGik}kh9FLK2SNX{4Q<1Y=+c|%U5C&IxY?eOpA*ql4l{s zM*=SNpex-Sy$RLdWmCzQXe??8<`?4jzOdX{?KO7q@7tzdH5Z;JENnzkQ0%1z0r?EP zw|H%;QF~xA%FQLrm;i32dS@^+52vJ7P0GgN{dKbhbbiewWHPezVv$$lxgP$1>XWYn z?IgI20Tt^M>)4jV?x66NtaG95K_QaZoKd1+6>zSTZ&;)EPmoL)VUPvxU9@JJEcC z55V||k0}d?c+F};*|pG#0yWKX>T$;-U2?iJE~pDcwJypLKzw}Zz@FaVctFERV#nVy)6^HL*+kjtmp_NVMV*{b z9c}SB#rM($0=v%o28s=hsDvcc<=m&>bF9@_{v7J8S*hSAI$tE=SI8|d$+{JVS1$E0 zEp^Z?pWMe#E`G6PZG36jjcZRl3Zq{8(^F*mH|yuYMW@jzc#ji?PU0ogMD9^Tnj|N9 z!1J}o>u(jBs&Ix_J^7)w{Zu7e;c;D#n&=K1tm#(lNJVx zCvJsF51m=?uRH$UFufVRYvR^zT0&oH{fn{A=wFsi8Hka~oPs(MD#buCzEu%;lM?)x zCH~}w4MBKj9#w`XJ|9UC*?%17d8E6I-r{jqD+Gwii^34`pNt?Z>ApK3{u8nQgFu#s z_Ok&Oe)roC=^N~YjegJVckpipop^Q}bGF$Srcr0!JK{kG4H$IRzU-s`K4 z2caNpr`cf4wI;_P=t!|i!diNHc_+>Yb|}A#xCv#f@?By|wAGKz1sC76B4%7pmE#7}0F|0TIDQTs#Ta=7foq5m*B@pPgdPh|1d*&>03&4; zPP0+;T%1-ufrF7DDBM+M%3ed(nNE3DaY$B_sCM(|6i530MsaP9xVA7V0C}--U%PiE zhwiXFgax{7k@a$8EudiS2J<+Uc-bi&Uhi6Z|C#clQaH zo94R#Iu`Z!oU%fz`R5-EZ`$dbTdpRJW)tu_Oe=uHFEQSDCn)eARmE5--FMPTr{qO< zxoPQNdq?{e(v8I_4_?mdzWZt)l?+8YbBW>D0qcSF!hAUD2eaIx(#d#I5yr;`2rDf; zqZj?1ltYtPs6C4NJP!lX7BFlBT|2*daP&AvpImFql{?S8Ye}f$s}ZNP5`-x)4t5e# zt`PVoGL?@QHp-t1gsZnTjVxLhgo!exmV{2!vlr|)r{PB zcSQvZ$YV>m%V89!f)>c|>YPdr*KFAC|NCeAkLk7@Vy`w893Y?*4j>@1|F&fQUyy;B ztBK|RW(vx*VSN{u9|ew&Zr{m1AJL(ZU~mqX%dMh+)ffIkn={s#TQL@LB9hyb%t<8; z`@y}2r=K?)i&cg?-UPvylxtu(Akgx46dR**)YqlLmZ|fr_O+<%lx}U&d&`UkhyQG$sy1l# zCkE5GX9m^6v{qrM-{PUKR;}4bWUciVa8Zk2G(eT`mZu1uUos+_xNC+ufunA5==9U` z(2l_Cu8)=3)7$OOcEIG1mdt3}Y`RzWUppRvQ|ntsV0_R&>zYQq-x{NH(0D>`-uuA# z@5X2Bn{9b<#TfMK^d?tpI6YdU*DKvVW(qF7JR!d{`+2+$70@pJ{Q#Zx=-2AE1nAdlOuG=rfFG%( zdGY#_n!nJPsNhl_-Q%`lTh~i*I6~D|bC{o}W|YrsEy3sh1{rT}wgiSh9WvwK0OqQB zFs7$#Kj95|MarO#f!@actE}x4PV7RgW5-0^sLJz_}53a zKrdi6=Hs<~vD%;rMP5U+I%zshhGNF-E+ig%f<6nzN1>`s9>I z!?Hs(>4tEWBT^BoogpvUMRXWy4mr3;<4`G!xqOa}SeT;>CzfO=Qq5=t31G+ZXxQ5aXkO3g)0LhILgu%6?*M}j;6R# zRIiX^2sNzJt5<~863QdASTBlfyI;|Q7%y&)vDA-y5yRFpMvS9rxpEdS{*G1LgHv0p zhu5!C@;udKk!RX&o>R{5iZstM&H64=o*DDfSJfSM0oh|jn9eABaRVK3d3AM;-O@!h z4)<6oceq%ar@*7Ig9}4p=;TFtc}bX7U#=i*32Q-55#}^ID*cZuE#T;PtD+-*Jz1^f z#)wY(kR?h#&YB7j$>;gsC=F8=7&PLon@``+L=?N>ZZ4Xs*vqURvEk{ zvMBpHkX63h@Y`Y%_T zx}U4`Hyu(u5>(v^B*nc9*|S>tKMa11VAiOi#zm4+7^!e(yk(pW>a$Hb?U@zi zLfQcqlBwykJ0!mF!wxUARC$^vPG>h$P$P``9i&Jl*>V~a>lj7)>5`Q*C@xRZv8W^f zhj54BK8}rb(grfIglV|qi-lCEDxEaXPPSt%;%M&Lk`yz^0$No(sc9Jg1VfQllGL4?=#A zSeJ!e&SJlWU?#U#lWKd}6AwYW7EB*UloY1DO0k(5qNgPcrH@hUia4iYCgZ~zH4Rms zq$boY4nVMuOBHhHq!tyg?IP=7#RiV0@oS;$5^GXsda0!=mhvP;YktX+Q1bDw*)uZx__ferz|q0We5DCh`tpW_Uza2RojO7T0V;)(IxEqL zU01`58!cr+{MV{~Y&nY{x&T7p-^BofTN3BSq6vmGYb(ICf_}H@{3%5Ti|bvN3fJ`c z5u=mM3&#gfSm^3>uAsUAxk34FQc`=Z6|Sg@579w|TNZGE)f>VWaBvZJUs9D9CLj+vU zL3QNxQu?ejY0Q#O=xT`T{`bQ~E%Ibx`;Jv3)Dv~eG25~~&Zol1Npj%PiFh&bV@-t+ z4*i=@5`^J`i+i*Wm_;7}f{t>O!gBJdQcdH()aL7+j>eWkH*d)9MD83GI>+)NrJt93 zRutq0WC}jKu6`!Ua)iVAR3EVsDxq^4Y;GK05+L3U1?*G~t=hFLQ<=jr(y-JZ5SMk} z*`@EJedW+1h3V0)iZwZ3R5Ag=*jZX4qIauQ5+i(UOv15Cp{P#_{ijG52&3CcmIHZ_ zZo{ZW=5nzpC2X`3_2eUreQP?4YlZ-%mibVbSh8yP9&M^(QPhJWPk8>YSvIFsPHj~C zkJxGhOXFayI7TL#NYbiO1R@Ccf8{!+)8={{&yL^6CY<5Iv~G@v(;={=3f+AIhuyHI zEv1pE;VDkh8U-%joiO$ z$SUYczoVD|MWyL3g^kkInjM+Hq3bIZLlscdg73zdB4!V9Hs<8p(ncgFw}U%h(A^Mh-p_0 zuNWyyVV>tE_UVc!z`{GkGU@VoJH`L0%T^;;0O8ZFvf=EAv$DZ)K~zRsjUj`nzS^L6 zWOiAr3n*`X2p~nh{pW)J5CryQgt~`vC}*5nN}f-7{hX3v{4Z?Ml_8W!^RjI{I4dpyz}*ToL)7XaYm`}O0t&pNA{!I{&@EhTwzIVCz6oVrBnz8U zx~7O{P8!34)2*#|)5G|)fLt!!UoopY#z`{Ns{V_!u3)>jY2Hi2g%cw-Jrr%wOV|*h z305m&X&Kh?T{>G?zG{%6ais3kEw`K3-?TP1pBrSWXK+8>ke@JwQRQhhVSZllS|UYXtudMX3Jpsc5qQF*9q(C zTrhHjDFBHWE50cbH1=)bQvITCVQnVQO6I3^;MQvExrpR2PRw~YRDqY|f~|u+@GHtC z?a0}KZf0tFuhx}~tb&vQODX#jP+9tLzH>WrHKgkM6oMqswq&>BHp8^!(#8D{-Tj%UffbF@C~>MP92 zH2HCwSiKv&SSxUNnPgAh@g^C?xDB%s7T%4Cz0>pt#V41r(ZYzWlFfp|Da_?`&Q$8y zJ#oIAOX8JUGxJu?8_a7f6}nyPHN2OzQ@KDJCB@xe=$U33@t7R4z+1b1ZdOE9HqU};Sz!BxmoEcl|gsqh1O4-BV)w%xmfX^f$M?%W_IG-NUV z4sTFr+-L*jwo}nVSRB6BRm_x(MWPIEF)IsL<&yee<%pn<##lS8xmR9F=G;70L8|k2 zKhb;h&WVr-@_XJ0bn+EZkoyewc!_Kl|6H17^#yt31e})mAxX+o$yj7Xd|1& zIjpd%XLA5C-T)yr9478xDLhv3Z(QZ!-@!*@JN0=%foDGPhE^e;{x(k3h_D*)$cnFX ziuP|dEQb_!cT_E+QD{~UL?vqMq6b*2z~5$c$bcoJPdvPU3v11t`3ADFv;duj5- zDwpw|A5c>(MXfqmFd=u<7u2%(97B>@gXdGA8zwp!+}x^sFA!`$T+E&lwN)n)FT_Vc z?%In}1gRy+q-gez(BM}GZYn`$Gwu>_1KTBV7fC%LE8?fi;bKK8A`D)bYUN%!@f+u~ zpW+r|JU^C_6I4xnlG~0*A_tH>4)5<3nB zG-O2j?VNGXZo&1<3#^xCImEw+)jl6Acxq>xy~(A*WHwHyuLnTgKugL(ZuT0)O0rhA zjN1mU{Ir!5I_LCEw}0kQ+ta}C7l=kbe?ZXUUv&0P7=*r90<2@|HAI%TJA<`e>sh))@ljGUa-UB10zs}635vTDbI zNpGlJUK@cRO-j#5;i86Q;HA zya9bDI0wMjj?W)@d4s$KTriNpM0h1i@c}j}#2_Eh<;1=fLSqP77y8}+O3?S%fXmSr z;t9_isAx73M&hr|^ ziI88G$4hZEz%cCllBNkW8-sph;{@>`o(tcLUVFnc56lpy?u z?=_MvS%_J(NiN$(QO_=t(}nCM;exF})fkky@!_tQ5e4}YbcWHTUKu0=n1OV>4^!R1 zjIWO=j}BC`uE_fkzy}m76Lgb_57;bKCn2Ks7g*WyuN$G|0bom)aZBT~ShJ{#?&a{g z0jk=IQ;ug;x9Uhkv};)d2Gv8Gy;6%_u0@Bfm8P~a(j%>vr4BZZL_FV7LIzMC^TIff z7j9Yz!ha_hASvFK^&NR?`SwmC!u(}^%i#u!9e$|!FS{T`>wz7`tL84x4cSvGFl(nyn+U`R7cQ zKR*avs&kH%Jqc~=DbB%`d_Hycoi$zGA3H_zq^nF_xm4kq=4gh}cmgL`E|lNW<`qXjK02EA4aqi+-<-xp^2I`Coib!b9i8X@b34>y2I^wDvm z*bgc-Mh(HC(pAoQ@@A8T&bQiR|b0Q=`nL>sd__>EzpcKUZhEonMNf{kjh+` zm}?pDwvM6r6so1K#h~4wK%Cf=5+3^8`~@&EEb8($g(Hm0OST!)*!fxrQTjvV9SiG_PxW6M{;#}fGu+KR&$;|xG!7*5=$fUhM)O`FM?E~ z9V{<|h-2(U1WPy=9K9?F4fsNGBC=1x!10JLvbBj!JZTKuGV)UWT@D|;OGg`_I^v9W z-+LbpvooDmiTsRzF8@qso(x_nr3}M_OB<5#r%1k9K62|3k+yG(NxG>{h{$MYKg+BZ|Z{PheVr)CCfEY0?GCH$?&r1?T$u9~?U@d=Ixi@zZLl7 zdtdZ`$a*8hzcD(uCf(rQVFD; zf*qocJeLphFBBg!HzxG<8Jwkabqp!8qQlii>cq|P0_>U*#J}NJiuP<06Ke)1kaLGX zshx&OXvwrBN|N$xhxGF^ybQxLDYb&hKu^Erc%^nG9g!a$&DSoAL_5)^y4Ft5Cg3af zGM&H{>G?wsAd4CX#56LG_@N$!mBL<`EUlQiw9l*Znd<25a>KBL)B#OnPDapzu!}$^ zc%LJ!b%Yyk6eKrN=T~!GB&XXU8Il6`Ovd>z{IabVCAtfUDp6tHx5$|x3VkTPC^I7k zO7i?r_?}SvFKD_6vwifw>}d*PAXKH>dBPjp5DO@%;ok!prt4Kh6}`!lKLdIxP&z9! z-!g$g&jl)o7Q0~JimnW<#7o|Y1M@qh4q=V@iw~d;e<7p!R5uXM--%X4Fs{Syw3Fpa zAx$!z2ImHA>jowp)f=zRho7YKCL`H~;3r?kB7h9Y;SIu=KUmBbJc>XJAPN5hFW$;k z4!2ohUiY280J8!js=7@eIkFR3OzE7!o`g}S+0f~RTr(X=BQH-#nS^qWWwbe_yI!uh zIz6&5<}A~qig<6vttdK)yuvmrL*kq&DfwEtxOFUCtM=!T+$cXF=?BlTQ+G z7Idn=J({LVsPO!iL-oYpZNw5`_$BGCyN0-H=Z!>v0#5U1i6iMnY|FoK$3MxoHxko` z&@GG385|Kh{r-Vwn&(5kW8j7LA4f$IQLWX65{=kMS(L6Y@lGn3-Hp!$5()3_K7BVdB#}}ttoMz7z6C`*=2F-#rst# z#9nFLMNo|U_?`OJ_=;dFNT)yAqi&y$ezh5?9Yu)t7a=*B2_J!)Efv9n{xXCgj9gPK zA-Q|<+ylVH5@iqX6v21Eov}C98tup&gMYw!Fz@OC)|*lYH-uof27*;cd#LJ~zf?8p zSfL_)p<;yFQ|bbJhM}+uWu{C9q%;PUTx(0J;~eMR9BK7VrT1t6Ld}#CYM%4-)Q-6~ zMpczVS;jasn4|kq#@s8>*qRLSg9uEp9Fgm5bVvJM0|}UsUN3r$KpZisHz-PB8j-{8 zVzmA5L(0B_xwP9pkn=;Mdsr`llAUR}-k8?Ol=OjiqU%|db>Y*ZTLq*Ze^Ea~cfaLZ zJ>lcik!T|e(@^s&XmHa9U}(i5lUlPx-zAV5+mz{I<%^%qVS?f~vw!6co@{c4SN`pj zvHU!Cq>Vtjk`6~olRk-#^8}aezx6~Lw+m|YWW5vXoB0k1ybXP#Kb@Rg;G@m-PVR46 z9@`3E<+8sD(eXBP;wpP2T=sS&aM5cQ{O z^Pg>I1S(k}eTXvg*IQZ{4>T_B0yfJv zDWh4y*SP)(dPCE5b+0$o-z#BmKzffO$LJ*A!|tzng5gr_Tu}B#glI9ISY&)gG11a+ zdp~^XU4^lnD>&LR8R+ER)RG8!^+f%DCu|Sd#6gLb??78JXBQ_C?@xoD-6#n9XhY)C zlIX5!^C=>E-ETmgFC#4}?8e1O<_o*UA{++jqHkg$buS6hwcyKaHKnkKlUygpL)NN?Rmg=SerTqfCJS)?liYloa&uA?cN zk_?MBbY>{PSsWifQ|arN$iP`r$;s*lcFVjE`5hA=mF?KR6k+wo8K z`|Y^m9f*C;7>duRW@w)AY+gsGR$+(X<&IH}B=-^0CFGQ3H5 zqhH5qp@)a1H(lU*R~#X5Be%q!E3DWz@vXVw#}y!SkRMU0$nkN;rf~D7*&SIR@r7;W zp`utVGV%&J|5uuWc;s^MipO{PvbHk9|8}MNH>NW$)$f-8yRAk1NJI(@S6(E=`#!eB zRld?}o>LRfiYvu}$@IGKZ!g*_(wuv)=$)PIDzHXof_8`i?t;YzSATo>Mha0j4w9(m z(*PfjsQ2KSJf1$7OO16pJI`R9J>ik@`F=~Riwk9pX~1p+m;kqQR*MSGKobUEQ`nHSo_I+G)@Vqg51eRPCWt|No zg^+GYD>YRk7cx$jZ&VyHdz2;e{KSd(!mI4S&Vgh|`jqvccM(wyY^v656|+&1n&{LJ zP7T{FTt3?^9*!*Qgd4hgjwb<+Xt$v;qI=dFO|i_7xGl5e%#eJ?#RxsT+P&#O@+`e) zMYcU)o2=Qsz+L%~oOvvIFW0jBpVQ6|IODyb-%uH&6gqEuw zWQ?9^)=>^wI65JrMvL4%oa_N!N)Aew`XIFDoegD%JKdpO=D7r-iLP{psp0%<q`fN*@MdLr$Ro>q<1+biy+XH78TB#r@uBw$#l#yqrr#$Dd|t3mm;x#Wxjm!3tCjf!~z{dL7$B@ zs;5*&FKs@EKz{=WZ}q30w`zS?5H*cD?s9}SOl9W6pB%(*`bM?iXehK7P`^FtBWkg9 zqV_B{Taom5f5&VsdnQR)NpJpc7qiijvR7FwE)p4T-j1<|;GjZRpCars5cG66nEeG- zVJlA^ZHk^tNaTa(83E}l56>`Xxh*ty)(h$k8BfemLF8rsZU%d zp6HzWS|9@7HY{z*^~t6F=&SWBZded!ejJVvG4y=`w$vbwS&^j0fKoWa6+&UYr6EwP zxr)L0FMXq5y-U-M;VFexfQnKMeX4|>e0!JV8UQ(4J&1}re7ITS1g6&~2TsMT@(540 zz}5uuk-9gf#RG-O5gy+|X`Nw@rSdF(dpP+E`zIv?qajwjB(Q=eqsu!{0(cpGX$YqB zkLy>9dBr>ZV$THY?ty5J!W*LIEMiProw4SR`dM4m!^|;MXB;`&jg-NMp<|Xe%IDJ{ zVD@tn`_5%uoxtguB4N@Z%xKTGzb4_n#5kpXx$E1-Kw)Q7-=rYkDOZyaymQ4!v83w@0S2%imqWx_6L1!p~n|ws%~*czW<&6i{9e zBiutrvQ|V^qt&k>ybdm@*D!DBQ$Bf6J$%0_+Nw!gE;p7Do?N@vIMi57Km`NwhwxqoU+ z`nMPEie*WT5*aj9`me7kYiwQ#87kqR1)=fcO3DdcIXPKP)Ob=<9?~e}zm%~{H&e`Qjkfcw%g>Z52^eWMygU`wQYfG&251Ef;1sqx3z)L18?@6|hj zn5fZj46e!|VA9_QEa)DCUozwr-{jUaqa!tm|)x7;P_c3b)bti4n<*H3}T}6qWdEtRX*%GOPnSsb?R;ebk zRc#h+ZJ^{9DfW3L0j^Hb)(yR`rjG5PVVB4PHr#ib#@fr=mbLj)M;&(ai!M9 zj#|&8Wp|s9Sc7?H^Qj^W4~G_M;mbi~tU?N?4n@uS$>PG%MXR|>Ci2n)4rMHts)P?x z5A!mF0lWZoJl^qgcku^cq9I8A!@Aoa_ptGKcv*jtsD(+@v=*u6SUnTzwsHG(Jv~k$ z4YCLVf1hRzxBydtOAjBwg@BKb$w_9j4=@A?^scQg!(0W?xb~8$efbsTCn14rkcL{~ z7?5v4`AeKT_;pHE?T!fZI-(UVlRceCRgX;L}qb&lJT-u#7-~b|^S~%e}<|!4C z*z3{p*e(}(OyzEe#qF)b+1N$kDl*H{r!oQ+cUA1t)1B1&AN?)=n%&6cWphG5WEj|= z8UD|+oBto8qM$e_2|zjI;BCgU$aG_~)!{P#KQQTkLwiD*AOmwzgRxknI1Zv-LvN+m zzhpC%`JjCM@KSI(B>kmpi*UGdyB>FdJ@)qOiUGjZ<-X-gldKcfAM7dfW8mXO>54T8 zj0%6$a7=AiigvED5fX3$UMeK6GapNZKX!M|=6rwy?w;qNS(wrVB zzz#>y8$JWeW)JtAuMe^iju*I}yJn=wtc3{s9Upl2u@u;m{{b|9dwm!iTjrRti0bDK zT)9qUxXy?CltqcaO7l5zJv@UguS#h7$qJ?C5?wgk#l`b>xc*@vS7{EmE_!3XpYK;3 zG&Q?(mgyAb(AK0HgZ$R^;p~Wm(A=T)O*Zz>Fqz5?*Dob2k(D=YAJubvZ(+6jYj|Qtw~a`uvI+7 z@ZRdo+@yl?gs}8A1cCx5$`EY{6#D%e*dG{(3|}A;!P)ugwd&Yw`?`~Bo1K^Q z{Rrci!%aM#(a8iK`5a~&)5YA6I0+ZVgZbiq&mGUYCyEEwdd{{!yK68+!!84N>x!=# z%;hCEg0r(lqS?iwWjMm)@y*NKwi^x-&b4+s0<6<@Bm(H|HH6z$5XxgAVz|R~BjVcq zHV{q5-AV8?rUy^P z(Xp_ayP0tq*O`d3{*#3N+=#JN9a_|e=y?u1+;A{iqT34Z?$&eav7gXghHr)rl)SvZ$Q3qR5x+X9$YI+ViY7VlTwkjaB&^5zKr|+S97mGL9TzaUMS|O34X5 z7~TvN$1GWpPLnF-aE@*ViJyj=O!Yn3y^v%qk4f}uj7XKzN)=5w3W1pWXhi&R=}(Ff zv%IbfE&-0RjBqr@d911yZeu%#k1mQ#i!n-5t&SVa4jaHay}1HRK3Dviy({<| z@hD{vdmX$r3&EmFP$luQ9h1el?3N-Pu2eeZjFeJXl6tp2d*x6=D$*ebk?>+-X4P_sy)4C7~I7A`L(GcMi34y3iGX>qmh zG?-PQu>7P?BgtN=`S>ZZc3XF`4VIzU3u;=9u#`Jb3%CWm@x*Av1}a~Rg`w168~y2$ zQj9TZ->})3;%bg(H1!)D7%w{}K0YQ|2pxteR<2Gihb?c8<|g%-ri(eAxwoi|LY>q@g^n6PX<_O~gcRbOO%IbBGpJD$!5-eD7=)yIBIgQA5Q9o1cG`Yj_X!VP=1GLU@_ zc=@=JS^AfuJdbSCZEHA~`Ti|d)86nP+&gzr@8Q=FdSy0C7AA*~ew0qq z(-pkgYd^z$u8x*v>(ptc0ryz@#00^9Nv6HuTAPhuLtq;~;0K5GA{a<3(7Jo%lJ3JOw@GgTi`LMhIrK2PbY3!Q=zOo&VvN(ewhJunsJ%dtc+?H9+vHKkh0bWOE0*{>t#zY zN+{S>zNB3C*4GQU9udLUjf--2+dJN{9q%Qa!LzTozK>_E#QG0en>v_|a6S)M1x}pZ7tU<&Q&pWcral&%OgRjCUlVn2SYhYa=m9>u zTs#KuUr6;gv|HNWM^cY?^4G_bNwhNr{w#I|)#x9l7y$+h$<;KFwBx{;iD9k+B)bj3 zx6#PE!wewT65!p5r!S&3ebclWv}74e<&)XgJC_ME(SxQXM3cBM($YNWIy?(FzjhJUJJSr5e7sj(^> zu6DxqxU_(#PY1^(o!eayZPb9{0|3o>m7loKiD~!EBVd2Xh6SJziU*qxLE~F4mhyVn zm>G&I_{r*bU@5<0CO zq??c2`}f@Y+pH*{7Uk#aIM%;0`Gf8$p>RY%-=W@1?U4nP2ij+0FZDqY=SB>eZ(~Wq z3osIhgW=)0B%1OC)nAockthpsnB)IcI_eVI!&)_JSNP6;=$K_KX3u}03KZ%jBCLfR%$#DZo>B`Gn-~|X z0Bce>A}g$JY()6uX8=|KOw_T0gz#u&szIGJT9aCMz0MrQN1n{7)HSMr2(fPVY_uZ0 z+9L%xGNO)Es!})SN?Q-(o(=`rgPosCcTl_RAKSxy{eIqcXjKw?lK6vL2dKp7vb^gC zI%vq2yvwbv$w7+YFFBIQfV+N*-KAgeysvz96uaVL$p3`KGpqt@7c}kq(kH9t8f*3} z&gMCUl2M&t<=G5vf6ycXDiT!Od7e3*=_$ajpyrBxjfD`ficYiFTd6v^OpBA=xT4u& zE8$G6DQG7`XBLQ45oB#}qjAl+G0mR@qFEs568yc9{=EUvZ&cmV)z;T~5gBnUfS}Us zIm?Pp&WV@fK_A7#4jhARjDXW?${rpz7s2la%6O=TIzz8XHEodH;R|Aq9Z`UnbcYCa zYBY51aWJYfLsOk6q22FgkNAG*#6<$cMpSIezt!X0A(rh4#hWz$64Vg|H;V6*=yDVG z@hc}ztt%E!Uv`U7J?4 z`v|IJD#Yyt1rb%m?UiFqZ+MG-h(d29!~E6EB|xFF#KyL?>0Xb(0u_jPh}C_VL?4lMoSvI&^*k$F`7-ik~CTlE7V{SMX<1n=%_4efJ;dP zyO;%GxZGX;j}^&Ld3h+(0_vXN;-AcdCPXO3MAee?P`*V;DtY=nLnFlE5>$OrD^h8t z$^kP9>C7r;cv^YRFh)fzyCQSaDR~I}T5&`PMKJn`D#GM4j+mG@8-b67jSbcx6kw}BvYo?ApEKFtDDc(ihGyD)Xp3dI!olro_K zqq0QTQi^I`KijIEhG$^@DPj=G3GGOuHZ(RCrvS}673r?vn>6jnV=5026cDhBLYXNa zn#l&yThfDAxDgb*vHlK+99<7|JVqHGLeiD4UQXV71Q8kxlTEK!T**3*iJ)^Tx6<$b z^_R1$nBztMgH(q{_`gr#|M3sU!&XrR=WFU}QzRLR%I`2K(3+|tLrTXmnh>3g_ zm<)i34?p98M6E5x5f7XixS^qOX-(gYSP8gbQ&|p60+p(9aY???X-NJ2Br?g4Lwd2h zB3jy{V&FQ{qu#P#e|@#J`~Ho)>)vCtomR*FP3@ON?4vHm6S5w;bpjEAm|}b?ksTT+ zw{049b9>y)@32J8g3T4mVHr2kC$T!6c+P{ZEL`j!K6b45gIKJP!g!hX8w}Q~J6)RS z7Q1G!=N)Y^p7UO>mrSVV_8T|257(Y3+L2p6xT;W_itZxrB=F%km3u18>%%lt1Y76g z_qWJEUn`S*--vR<7uam}zFKXAoIi3tT#f8{4?*l`SqH~$PAFsZEI!xnc*%9h8>OXU`lDWI%H`J2M}7A2f{G&t7~LQNrvdaX?? zjSGL+)X;C6tXQ$Q7m`Nsn?}c9A=Ob+bP7502T6c2dpkndwX38j8fB2o(V9aMJ6&@-l7(SQ8v~5 z!ufBLpsmJOal?!WycYz0SumFFxajAdCT|6q632E6QAK39a3n@08Hiw`0E&f8s_ju~ zgJ0-O1X(8=hUdd@^Vz9(C({q6%+17y-8U-sNh)S)5gR#_#p*DfIF|lK`);wuI93dD z_*oDMI5A-}m(80YNi?R(1dG$6b(QY3NuQLYxC5ye#iXAuQ_oL_KAxGz>hgqXak$qC zh+wgty^!%7^@-u&*xLampSK`10xCqNw&^kxmh5Y+jCQo$0ggd2#W_&avma+Dc~gFW zLi#;SlfP+FYq}~98;qQ|V#~DLSmA866fT*fTJdoh6UC(A(TcmaG4~A@5a4 zCozc>=6?$ZksfZz(U6k`vAAJU!;O8J(8=Dt?LSiD@0Xg7}P1 zX85$5z{W@6o(kC!$2z4>4g@?cQAoilLCfedB9XEcUOo&)f`@T&qL(J7fGW!7#T6H6 zAnswl8mQLgZN=5T1yqLD2U<_j!1JWI7Ep!mpwKMsZhlkAltHV0h9Y7`?Fq>n7r&k% zo#HW4p4Iiq^L4t&Hv)16k3s+^jq}DB|*|1iuaII?CS8Jia`sa z`erh@fpP@{E@TW43asDc+ z&0@Ud-rQ%2wfS?t_DF#(N#owa7Lhgupdu*DC!F7G zQP%`^-!MtDGbMe|@UUfwPa$8+6`&?_r0BM=Xeh)TUtCq<+a`0ME3JIY$t|{NfIRl0 ztv4dc*~2buGfU`{?h0DjJxd!hIjbM=Z0v7d)Z82RSmA@)3+Gf`#|xpF zrbf~rKdc&6JSJs*%hWkL2rY_hT}w7NgQ{UT%?KKdY|&j^CVxC%XCNEbma^G&p1xG+ z^7gqF>%c7c&ea_Up~ZMGy;3^ae4Df=mI1hW{M5utrrcXmlHB^BB=e^m+&I>UwXGhq zHP@hjUb|iN;DbOm*Q6!SwEP=_z#Ub@D?7_syYk0h?Qvt)A{%kqALU67dyhLnFFi<%01WlLuM;4$`BKH%0?%kE}M;ojr)RadzksEhp6W&gkeIp5~PXBlq|8TuGK3??N5VOp~C6w8EBs)a)z_kzmm z2%Y(`i(2y=*A8HY1r-|0i_D+RqP-Yzu41QmId-r)JRQpm%?hV)`2w|&zc_<%z&hq> zC1OZ!=HSn$2mCw{@vDFB))M&KKQis$1<_ZlX7lpzJ8NlA4Jlgf9$AgPN z#6~L|31#r6e~&{sWFtl0bF;(IMp)iwM(DxPC#MNda+RnU;>?pq4r9*auRxLz>THo? z3N`+UIwOsW&=8cjgco@k<|0&A;;_-#JLyBJSpwqAXGJbr@tg0;-|5U^mjgiY?Xpy*QeIQy;xZ~#WcL@|Gb z{kgn3QT)3l1x7Rz9#xp~+9Go$_=qIDW>=@SL%rE`Uu5$o|6mVQ#~WgXIv|0cL|%pPx#Py+=A!>mq1n z*ste^mjd$Q!-d8#sk<0qg(kOR46W1o$ln8VZl^T+C@YK|gIylTk0b#{?Rz+Tdmi}^ zV>$Ssz4Vdkma!koa$?rx*&i15MGPGHgNNw51GovZLWt^>r`GnFa^QH*D`?vPhx;D; zXe<5)iIU9vi(*ZwMqkZf74epJgtlZ5PtM2g8mT{?GO$GDbghD~D=6{0hH5*XoHwzQ z6MM_h4W`^kr?M>6ur>JHDEo1)tCz=Ct~UyKd(P&+=fF~<<}mrs9BBNx|Jf<_|Hj)t zuFU^sWQdaGmiV##dLboXXNUbqtIfjXu5N zH8sn4hU8OO`UyivlM@D89{rx4oj3%7$e)mvK{|0(r60g=3Vg9^ zHVkDgS}1jFPT}!$zSWzHBrzsYxk<#->b-eS+ckHF(Zjun1a!2T8uNTz+b2(aMDK*A>A#MVe4iuW)KwegVVPrnm}B0oC{^gRwRvc zACZy!2vT#r-Glb;v1f7L$C7j%0)n|Q>(SmPBxdHLB`9b;->wk|ob^3h<`VUs( z^8Zd3|5HLu;onpVlQ%=(IeFxWF$q(VTyun^CNgm;a|)qS{XYYG=z5Zz0%M9|iW@bz zr0A??!BJSfB71#}^j{?BttsK6Of*NC9#?K&$DA%*pD!OEJz|ChCXMRUzM$C8guY0c z(6;pGzvIAVN67J{-(w&2M>&EsK*|mCsh}unL;71a z$(cr&Oe`K|B+`Bp1vY-Y%pPHDDbNw3lIMjSF!GUTFp{f_;nte;uWY-#d~o(9kp67t ze<7kE(_3X**h22LBgsVZC*db2bWW~LxtEslB685N#R^4er?%4CJ+5yPiq989I-s+@ z4MKCzY4H=@_4~S4#!;NrUY>t*_+`0n z)&fNr(4RPL+c5Rh!ZD!ck`+~re2Jfx!Z6#(B`Ml(FR0wz!6zRzA{Onvf@9~upK-h zW(cVG2R^ZYM8FXVO?NTpzt`3*1;<^@&$@~O|G)M#IoW?$Tv3V^4hl-hTCA;ZTGk_e z$tnuSRHm&;kXGc?sNw<jauPHpA&2~6lELaUyKW+rF3zQRt6O6v`x)J)2hq~GzZYW>ZA>% zV@9>~A#iSXDQwmq-jocw9nK^=_={1r`zszGsmjr1MjPX``@$zerDxAY?%iaEwA)Sr z4QWg|q{8}xP>6F|Cr>67Z*oTUov|@P@(l9KiNt$`XH=Fl7ZZhwMpxx{I2%1}!v(}@AT){hH2Xp7GLLYlTv1%#`SR-BbTLr~ zP_20Y7PlCLYVf&+e;Yt}J z#{z_VC=;jVWR5aTI}m1BWJ=?!8@k#Brke6M%H%`BNa~gqf&o!Vs#XS3fAS?W;G1h9 zG(cF^Px@f7vR14O2(uya&FX{LPT^G}oIqK=iU+t>-2l?!Gbm}3XaDqn9L>amgrz>^ zGnv4KZ$bg@BpjH%5?OH9!E#s48YCDF&-&vNBV@2s_D$o>Tr^Df+J3m~BHcixO4qwR z(Ev6xkGoGI5IxbWle#(o4z?DSh`s!sy)zYziI!aeVkJi?j3`lece+BYeZk}Y&K8`- zl9VY>gF8HTE*5C3dS6xbN_`W|tt}88=+Valkl;oy;?vwZrs)F(Bdu{yaW8pH#jhe| z@Yb8-^p*4gA`IV4Zp_TDr9ErcHnL;VP~2*M=6+1bvWwAhCZ1j+q(YD^FdoCQM)I7! z_{w#B=-_Lyhhn$(VfAc+psl{8mK>*{sBMU^Iso-Vce{jHi|}aJj;rGbmg13#@j_b5 zUiD+VL{wQq&Wm2tog!d>iAc^#=8<=o#6L>4uW_g;qOa)064R9?V2j#pJdAExqYEcj7d($nmv?+8e_rIFs}j@+f-uChA>>WG26MeuQotD+5c%(8@$5Zse`Sh!x= z#P4JdFsiRf3IB%hI9HgoSpMMJ8nncTF^HfsdXKcs`KHW}$%c-xQr!m9t*j|Mp-Q&s zM--shnd8aQ7uYE9ieP;m7m{20A`B<5PFN<1${e-onB@wamv#s3+DSub-C_jy3_``J zbK!aF7X!Aie*DB+{go@B6=6)_tX4FCvbb>cUC6?H#zy+c@%|bPuuZpb<2JQjTXpRQ z;Qd#>x%3m~Vi;P-zugtZ;i4$V7J|24;i{I=yLb2nCgH_v_T9lCSH#+tn?Skw>TjE} z-UX4*C2?DU6R2>~8*}Vaxm9UHX;bkWz+#*@n34$vj=WZ>qw1w-p^~fCZD7^i{m6;*7EXzmU_sh&wqg8{#6)~QhRAt z0QT$GE6lH7ME_WS#-|`4CiX8CrJ1AK|7WB8sR%K_@SeI_$;B=$Q2CM z)U_w1>z5|m36D^xYT_^0T|O8%kez-2JRY(xIItQ3k-)^eTpccG*T8_635al6ICDB6 zIy&SY4(JFYK`wPnVIWskQ{17@V8>s2*zgjVgS*?5u zy=MhU%?d)CtsG2vayYU_qERe4GD;_&jP_dv3D2!BN7mj;i*s#O8aTuCr3}ql zKxdhaG$pOl6tn#ZR@U4yp>`llT-FYNH$H>#YmZDjy~&%d{Iy`GR9P~E;p}j^Tlu|v zHVhz^6q6nD#a>QYa9rpHxmF0CpAPQQ61CEaIkTw?=KDCR^)yA0*uK&SiJg&ygC{!t zAt|#+80Q|qheKw|_6c7~ z{AVgbi*^hAZ>ZOc_6^ty_xE3bi+#=&8h$Cbe3!8I?AcH@cC=SW4cTX&WYs6D^Q|oS zQokL9IgZWmN<~GDA}zIKz9TBtPG)*I8LA0;5QK0D$@4Z>INtW{5cdmGP@1HpI7|PH z<<4c8`wcs7HEtVPi#w{(q{dO$IoG-{lji_N+Yi%WFgQF7m7M7B&-uDAVI#DWF^fUA zoww5`T%}!V*~i&>CIlon^LtYaSbcW2G0qv_%vxBdZ;aCRQK{ABulF>L%BGzR-4zT7 z?OssH?xrS!2Plg9hQeW(1(LQAqIwc*6^1$+&NIf=42Weh3M)$vj7~7>GuGFAixzMP zpw2e*hmxOJMJT91O0Gicka*nC&AOeEJD&ELR$#sOT50fgAHR@mV0Kw9#us6PGxWEv zW>)5>aN3jutObmXEVn&^wm=p|b5pT6jz=O4XcM0hrE)GzlBo!@vn~t=LLbeO1uJI@ zSX2v|3!xv|PxU4dhb`Wf2-;JAhDZ$<=}d%z>o1d;kYPJ`ouPo1(2yG`>>(Fh;N{r9 z7&_k^J@9IM;O?NHbM!%&f?Jn^gMle{K0=fEP;@5Y82fm7X`1N!=qeZ)`v>|i{%Lp( zyA+3m_7@tl_>2Mc1c&ah$wW>0HU81bu_^;f;-tsUsZ{ENA!K+MNhfJod=v-E z{N^!Jn$hef0*@82q}dTN*d_v7jPhdC+3P^6qApWK|07zyd(N4${(FD>k<|$@%2$D& z&e+T^)cAR zZ#3_-r&Cm=HaHq5S_7>pbtG5)I1y@?`)7%RBZY%Q zH|%~!wlEWVzv{U+c29tW7s#%m?&|&Z)V_$8K)m>B-rjrHp!DS%tqwo4jv$N=7+PIa z6$z>+vE-%%LhcSFU^u5E&!ySTe#^;3z=;G~XZ9I(3R(M-Kcjl&h3v^)Ldi`M$zMWs z3*!_vqRHk1ipK}8Qgw<4s-pQg-$8|o|9axW?|?$jNsi}hWGBq-{oI|M=o=-Oat9~O z>>H4ZawVAQKoPsDX7Pz^u67^$r$;QePOOP>f4SIqkd~Y*5-eSWj#MEROi1SN2L7$nMbwyFJDpzzS<&X+2f< z2=yhF#hs*JYQC^!{=7;lA^bqO_4fR;ly(5@{?eHQR&H86SFLJ7_^SMny8p@Z zb)Ayx{{0`j{J%K!pk*&}fImkxx<5DW|K8(ogDsWe|L(Jk?8*eKe){# zHeWQm@P;OX%Z#dWQvyx^&Oaki_$&q8Mm(BqxZi7Y$OjDP{fjq|EyLYOZ|maAc`M-c z>-7WBHhl9JE{QXMq+r9C>Q%_ z>~cr{^^5QyM^9Epmhs;T(tn3Yst~SQ@PPO z-LTo@t!p92i;0Mq0pCaf+@LjKmAFrY)3~cu>d$pmAL@=X&R|+EbQ4ZDDO|`U@Mz zAwZ3}WcQbF)^M2E(uQe?Q#E_aXFPbIKl-}xOUt7GS31vZG6z|yKYw%rMGCnUFjARUe z?fFFx1Z%!)8iN245*cW#WuVh(_`HEV|2w8bO}g()9$jIcE)g{R4yvTifnV=Cz1N!6 zO^ik5K{!epl9y}Tj|zSj9+KafXahq!bi@B8+i3)Fl=AqAZTfEyc#w0}l7VsYqQMnr zvPnC94C?LNurL965rs2GDJP#x8p`DrlR>b>y!@3F17a^Mt~3t#f?=+aX{2Uu#IUe2 zaeXFYdgaM)e4)~a(R#vDgmy|X6>a4MF=+WYt&)-8%PN$iDBSw4fVPp)Eg54-!ej(- zvmJ=KTL#yfc~tey+Q00aRJ0vzmpC$Ul&7Zr_0gaci}W(-!V~i7&BZMR`@j>kw}`0c zt{BzuO!uQ_roC`Z9pTH4AF$Quu0S?tFZ4@iu2AD%t{TIfY)ZrJt}?^#sptJ*9NsZ- zC}VY<+BkUld9vJOM++hqEg0hK&tRTZXm5nn$%na=kum|cs=u4f&I^sHj0ej`z5JmT z?Sj#I-xH#F_h~u4!V4kaq5J4$8nRfm;z(N0NnbMfjhrdaNGi~4ziC3>i|~Un1oY(? zd(o~vTUby=e8?mxnw<1P5Euo_@cD;%Z)tIIAcu2y9dL9)Idt|Y%l0>FCLKS@)E!Hm z2~(osOXinfghdpuJV5p5h(PVP;loldg$sy>e#Z`J6~Zi@(jitCi7ze?JNlwTRUlug zoU=ihoU?&hIA+pL3Ndu3cG1KgZL3lwYnRh4$;oSS6dDZEY~ywh9}HY1MdcOQ7N@Pn ztsfc2Zs-ogho~th;GQ1QYFL9Jd2YEKVQdN$Wg|pw9F9r~@8>HMY&6XcI^i0Y&|{OP zG!;eeLlH0smOO+javG|)^1wB$h(Ywz+PoE^MR8=jZQg9Ua;L~G@sQtc4YiD3W zP!f@^KX#R2TXS}ix@fm}0s8LF`TW$}a9W&r#(1#hl&G8%MRIt-5Tq%;O4f3)e+o*M zDBHrqP&To7J~ZnJo|v81c+H6)fHF&~sjMW8(}gU{t5mh1b?n)nx;KudULzk~Ku!UxxfV$-N`#dbi5^5UVs5N@W?yS2fchtRF^77o`_!n{ z)O|CHb?!rE#$Pd&_DAni>!G*{Vat%|?U2qFwGJ3!@6!Y_{IE`RN_{7jIVi+Gkyk;{xQ7yRIWPH;E&uobgYxB-{4Qz96k@+Ccf|jMi zCRa|LA2J$v+v1U8%U$LY6fJp~Ii#gXZB7-t9#WacdyPvsx-OP5yU6ouq}S`U-h~Tc z*=Gh_E%Qu>7#4jW-b&;ro={X@;lqu#2~AhWxi z(p}2FSOvnM+R@BGx!D(sFd*&yH};P~ylV%=F%8!HP= z(7u7ju^g;EMYv*aLX2OxPc2v7#>r#46^3q6ccYm^I+_ZJovrTq+fmOF&|3z>B)0A3 z#sSy8@8`sQsDgAFL37_#uU#RxirF(mwz$N&tNGa8`|q5~Vy;gN6`tcYw8$WxIk>L9 zs%ks3P9qgb>|=)W-HQH-4O`>0V8&S?jS>L*IHkWH%OEtvMnD4F;O>|B=L!?iu`Q*Z zH>IA)W&TVgtvRCWpqZbjI4EX)css*rgZC3a?FC0xWM8z@9Nn;)2| zf$p|Nl=jh-^6P;D8WP2iyER{lnOy6iMFqPS;3F;F`F_aYL}82lfcbmNL(4B zu&m%&abIO1n}2Ceu#?l#x|Aa)V@|ANDJlqe(i`9i7Y}*`zXoVzG~IiPVb4#TIT_O~ z134?5h*e8u%J+=R_i#qa@2IvTuk;ig3LzxK)-0MoOJK~TtZg9Ewjo zGnf8^>WjDw&aR7$2QO-ovYe_ZTp|4n5~)?%Lz0h>XN%>j#o7W9?l^ppG;0f3rYbgl z@-})=?pViVF1Bgz)5i7`?CH{3GzNfEdRlIPP!M8+m!)kt8x3tYcT`)hK~}jrA8`Mj zqFIn$2S-Qz^=ta4nULWBjKu%PHvd0?c$B(_uHs?Rcb40MG>HJ9A27cwQ7C-y064h0 zpe(+hDdNm8`W*{V>%Kn>NG2p)p1J-@&*kc98s&@Ty33V+V_Sp=ttpqF(_R;(;Itl!5us`SlDM7a{}H!aJho!*ufv z@If9b_Cgi<`>R6Y8*$*+-xA^WCIPOgW33LCN8p14KjMB6T-0|a-b$1%bTvMok$(+S z#C7y1_r*dQy-bYc_*(}L2_`L(8bls_K#W0cxCpp_j7*_WHARxq&>cR)DA;>qK_sk- zLa9J4I8%4z;&-yRw5)U@d+>x(Vx8{f5O?Lzjv=M#RgKi*Og}GR=(8;yvnH*r~hXy;9MTKjy6j z7@hv6YDZJ13`vID!rlYz6RE2d=*wm#331N%bIGFP$$V*>chZjV38!}2k$LkWtj#^h)LXgbcI5{rF zRzK9S#8Tcoite97?FB++DKbR;>^hFjd@EA2FKO{1zwiCx&(zz_Ge@U*rtpkEM zY$`e|Qk5@W&{;i1gAt$$1EUwOxq@IMI&xh7K8UF@<%sAVt z8d4-$%u>t|-ancOV(O@LVbWG>C$SKq zp`Xao+N^cvCY(LMl$cCQ^QcLgF-(J$oH?OG%8Ek=DkvhH%f^N-_v^HvEk3dxQ-H4^MgpVV+0nikDiJ;T;N zLZzfJF@`3cXo96F)9j5?%v;Y5-4I2CS>{0ZQW#@twHnh0u#RAa)Fdt8K8j-4vtd-A z)&Pdus0~3EGKq&@&%+gPXPCt7zdR@!CUU7K<6~0C#unwq< zuwgXFG|h62sD}5R#kBc*EKFspkBz$CxwpsBatot zIn&BMmQ1;q#l=yX+$_=y-5_KT2Wz22)CCi)`A6Cy-h9lV7HbgyH-gka5nO z6z;v996@Szd+ZVjBA&f);;{jmWahNim13>QVrRuV7jI&TgJP;7t){Qtx#0$uWvCsA z+E_|)@Ce4ZEWyzmoU?#Fa6Aqizcl9ZZ6(~Q!P%;x-GT;sltXPAiB-Nm$ylSHy+8K> zz6xQC0+(>Vw1ni!P?97+c*9Jrpny5OX6}Lb0e*OWXpsmS`23AB+R0m5c~&oH$q$lOOsPzU|=_ zJh4@iflrjC9|k{c#MoW6Kd&H)BDE57odBJ;BUO*L3xOYU6W`28Lh{oSZ&+YXSVWX_ zmhA2+)^hfN&P!65+0Y`iG+2C~kdi26Upo7!!JJr`ps-RR6OmGFZmrU!dO%z`SXNVh zkUQLlGu`+IX7RxlynAj~!IguEJa=mScA}?>0X%cnw5FUTnPGi05TBF3PQe*w#fq%4 z+^gz$Zl+aj(_!?1uZ`PS`DGwm!**;rzkSpN%fVW#CaFg-nf|=E=+hWXpcA1Q-)QLX zS~#0vR+|AQD$q$mf^4!~zs3oXLxR~!p!Otp3@HbcO^VS`|&Yfq((I?$*8QV_@% zNrgnd+J>zLAgw4UX03{Pox~~73V;1uq9?XxQO_m#fM%)2REY(8Y_pYy=xJ1SscHne zjWy8a(Q|V0MpiUr73XwTVq|iby2p5Qx0am7rFP+p42#1e_9_?}>PF}HSM=A86`&Gg zEi4;98XbZ8yqRc^(~=%UFg{6Jjq*5(mG(N?k;p>5nrIR^?qFvzkN9}l4|5m}IC%I^ z3pny_cniSw(=i?37F%55z1OmvyQ(JtRhqH8X18M)j_EoND#Z_mV8bbD3*i z*etW$WumECu;x}xd}u3@Q6($zr$&zYFzyGzSYa~S@c3E#nbT5b2uTcCURBU?7T#*< zd`WT?!%#ak`6bNZg2TgikrX-TvOjH1%y zhWx~}Smn^-M2h6prFp~HRS>sD&KoePF;pDl<=kqTk&)H7Av&wKVaiH5)A6zwIq;G} zVtbM>IxTRSm=Y}r4`xTBWg~@4bC5B6(faFcZtY}I=khHdg|&~ovdrNwI%NEP1tyEq zN|m~1RS!%g`DQn04T)^DJG3+P%Lwe&>;*1`2(Y{RSt7&AFO`50)gv*BEM<9IPkZrb$YHO z-Uj%H(}tnSVpX3 zb|4a3Xa{y{+qu5`!P+6}YL1Q28rx(V9T99UPp~(5^J(0bkd1-?I1cJS0S}e6V*U*w zNeFA>^^q2dR*)7BiX=`7x6Xmb)$F_&(yAG&R{Wm%Q+u5hQ zT+i?V8`7iqdlaR4H{_XOLGIN6kf5C8t&`_~h|%WRzWL6nEiH+;E06Dnx0E@|G3rC! zjp-k7_h=a&fAaVA`H1{i+ZTWox4*uZET{kJ?jB)kp4QG~U%7jh6BPU3gZSbPvXj2d z;E&PEzDbI0Z$splXqA@%eISmTBCz*lMB}8V-N1rf@5yB#)r}Cu7(E!x*P2#T2P=fT z$NUSp7)gBaBdtlIAEjORpKZCkYrRaD2^SK>k5K->^Zs zR4>$+Y|bTmvWkyM)^j}51W#XY1GAc`k*o^HhuX$Q2=PFClGKFWh;KtT(l&n2I#Gq?U_7(>ZcYWAM4C#2t-_IjR;{;MEigF~94CdjsYq9{W`sf8ADQ7Ou z(imAE4Z8=o2xoavEo$gf17+ny$~$bqv@f^JxeI7kmU}}gtL)_vM$C$L;cfyS+GP3N zV4UZQcVt=vE#4+rhxf|h@NcM@@TBtucGbXv-YELbsKUW`+QWstxfcq`7z9;ZgI&7P zxh|wUVMS$Dr7=-rTrNyN5sFO1`(_2_@o4Xr3TI_C^=65Pc2turt-X8@57&UU@$d=n zj{1s}{ohe3g5#KY@z>jp+EHHLW9&u6OpP%S?h%m3_((MH_Q6reLZgfe9lLsk9z^$U zu-c5urhHV&r@VDQ^RavtPKLrQ060F8pK#*$uTPx;i%*1nP4l@VSnXIpy7XFZ|;5W84p)YV|46Rp{gkdxUdOnrv>L zSAnc4x-s2_h$d-@%Xg9}upHscYpne5v^b}+e%!r===O4--ZdP3h(!WwXu}*Vpe+H+ zi&Mgo^k{-6al%?@99a!dm4U0eU!pBN&kmX<*1|4MD+Hwt$EqGod^Mutk4smrT4IK6 z%SNP^J!Lm>%l?o1p#*!_?D!7b)Q_2QujJbfG!;m+Y}&mJCOhbX1$dpuaFRHvF4kmHdBEiCKaCob(NvSjRy&csXK~gmx zBi!#`C-LjvY|LE+;qfIZhOkG=OJgg-sY^|k*7U0{n7>7ZO~OCyhm*p$U#5G!3{ zyJTT8jr1Bn{TXn#NI04zDo?RJjO7O9aA=p_4puVZtu*H6*q<%=sc`S=7H&^mdnO5;MiX42WoCzP2iEW6caUt@sPn(>R~s>*y<{-(r$!g z_&rb#QIB*ke=tcqde?-4X5r5BWu250=EDo&QOh^MZ2az~{B!EruRwVfc|=cckQn2v z&)$1hIYk2(to|66$RWs%+~L_?CveS;F>UNg<-B@ztg`IdI-PI3!)>4~XuqY-zMJ>5 z4!GE^VY|SrI|j=wEbS2O?f@)RN`@>>6+U^TR?R!`@Q%a$aKtqJdmi_NoMi&j^sqzQ zJGknOhvOxBB15cple(wZ8pAfGb12}B#X7;oE(L3(>kg-z23L)y)&EFGYE#!l{kY^W zG1cYXL9Rx9?p7W&ikIH%iiPl~I@N3QoVZOWM-rRGovK4IO!(Y7)rVy9toZVx` zGqx?WEyJ>tJnbvJwr7;h^wXObb&j=L#lu0_QM*?6mz`R;*I4IQE0Nzp3<6{ki~=f6 zk2KMosghZ1cxYDxM$2g!ogK&KnG+*I?|~+V3-qnu%GGUIgK9_D?K0F<2*RnCjJH{P zN4CE?YP6og;CILL<{;GZytX4-$9gU8dLF>RBLUzz*Qk156j5E%ec46^=Z7Z2*Z3%S z8UnlrqYRsd=&2Xrxr+%|_!h|#l|JGV5X`t=Liu0_5ku9)G5-CAP@#b2xC{^HbcHUHXI+QH{o3IFaZg?&Ho;{E%+ zlD&nSRk426zTVyh zySm->-CCj}dmGvC=<%58I)3Cl&gQJ~ysJ_aYK*;hQHbA~C;n7=-Sl}VS% zVJl1JiA!pLApvU$pjI=im`+b9ZkQ5Z_;W=>yUsrdLyEE4=O(Z}S)en$vT8ezMH3q% zE~7CNG~ZfCKEDe6(x&DtojhD{kCa6_=T<(glT~ucrG1P*nsNuVN~b8o12$uSV~L+b z$aT!|te~D*a_^Znfu(g-$l*TI=S|9N>&JvFQ+-g*RlW~0uf*w^Hyz>FE%gtT8}*!9 z*)%f;?SfldX0yPtZvd@}Ldc)o01G4gqUj1povM3ej+(hPnTP6>;-AKQ8eptvoy&da zjyl(caHuC62RoEmi;~x;o%}MU%WehJ)G*dg3cNP)R;qnKo$5Tw3r9Q7U@mm4h;_3x zjAKfRos6!6wH)Ro73+(Ohf>Y9j(9=LHty6|71qB=0;CyMlOr?wyl4Lylob-(8HTY8 z4a^-ZyRw-L^T)Q7IW6pAXK1jtFxnw1@_SLGi-8u5QTK_BH~!L-C#mvwxYrZo3nB*a<6m4Okhq9P*zFy-{G^&?WRQwOP$j}tal3W7#IUiF!JE;HXoR? zwMSMIU45}kZ$9K=q{c^Fghh>rm)LIBxBY|&H_bbnS=6*p?m`bO+;P@bH) z1KF}}mY8tGTR<$dIW5Z1ggQAY|4j{DDnG9^KB?w)P&^J6>9HzkDn>X~kABwh0YodS zDLN-E)`%%%{U2M5!hDPr?v;Knw{ghWmJivsOlaWOh}aY3Eo^ATb;9~xfM+*1n1vi( z#cW7W4GMq&l^0&B*hSb70Mg>A7iXtpMT#ZRLt5TdCwkuj$M|&QbN)f1AFAlba@P{( zcRBsXq8Ju2dQJ#VA~8#F8Nos_=yh4h-QfA+9QT^pVtg>zO+Ck12(j#^o&V}48uULp8o!%-0oKiJWUJ6OeBG8EXB1~SI@sf;n};08l2 z@LYOQBdD}eSx|_Q)cz%P7iIuSk{ll&5da7T&+Qo_L_Z}nGi!$qrbqS>QH2$*C+;A? ztOGOdUj06xwiq{)_`?RK!|;|XX%}ro7a;~bomN^>pA7uTUN1^VEEXQ-tHFg|){F;# zg&UgsSoisvJNVF_S^BYf(hw|#Ts?|^;w)W+e) zIiP0O0#Ft_+#c=3(-!}$TaF5YSy24qiP(TgJgs{b&eFL^R$!TQL_6eKB4<4O%p)YA zhLvqp8wLh_W2%^+y#41%S1(AIDTcQA#P6QSDvs8X9UTrJ>b99&ZeU%M<5po&W*nFC zlm5oJpxa^@S`0C0PQa!ufl8C-%RI7jMBogK83E{Jkr(I((1$J7h+QastM0|;u_Na~ z;cH`-C%0|GD)n0jRCGTkR>5`t?#}?13QB`cr$ghLAQ9Sq-i& zQVz5vvY3vE(ddq-n^Di~sIK}@g|?UF(Ikni8k%nyj*7I2KjQ{zQZ=BrNcpnHOOt)@@Q`HF# zM)b3UK{6wNCMaW7+f{4C3jN4L=}jiNq4-Tk>~l%-A(e{ItH5kDSTbBp63ekxIPbp<8f8c z*c9#2No|!xACayqNVJ8di$tyUBCcjh^~$q@`pd_B4IBc_vU;+uS_2QF%?INx$kO&3 zx1V&(W$~Qoky5S^(qwy%51Uivu?-VO$rp-6P6_VnL5GH#vP4O}m5lhX&4bIeu?L1N z)Y=)=@$W+BPF@W_`;B>Wb|_*l4D31h}GYc)q1Zg{;QFxZIz1fx7^A0xvFA0n<=1Svx+& zm~8x#9{a#@(Vp_oHFS#m7!L1UvRBl+TXVB7pd#vkMtn&}^^pqnic_58Q=h>G7pB3qfrI;XPfoZ{c zVK;31`p*C^LFBv=P;wo0#YXf(kIlfbRmZEqswDua{2agVQFj7OY88Q^f<7a&mGRW$ zlwE@q5TD=^UxF1{v3lKLOf&%sTu=<-*g@v`8ya8an%fc0#^(~}OPqe3Orn`L&HkpOWS;&Nq?vp``c+~je*rA;SuQd7B zHKkD3{zlI_;&yfo+pl2gm$|c82*!i4l0DK8_;E5cL)2EO?3z-<=g_pc+^(x0?p+M5T~n??1Xv=lV+UQwG-OA$;RbO4cT?P z1=6UL8hF=+ne1uB<=wzK6r#E?87U@@75p;z?$Ek5f_JR3+upujU!mAOA=ozkXFf4r zy#3KFrtH}jl&2xHha(a;xJ(lPSHE~8?kv|VP~>)YA+Se$PYP`2#v+?b>SQ}NPF!mI zs;5ZHU|cJ=)qZBd&hjf*25&xDuuwR1Pl%dOF%dVIpUTja$o%s0=gD%IkLZ z>nZ7r3&$9#ve0{_fJY`CR?_xejC<(`EryoqDU*FOh_>!q+eRmZ!!vlhI4gD{BmEiN z#e<4i3HyXVdQy_`;^OqYRs5yV!55tr;!%d&@#Tx>E&oO%8hNWEzNpI|El^4%uCfci zU@AeF$vc-e$|$8HAC`y3BJgp0ME~GPA8)At89t@{Q=(xS2YT(+Qdik*hsO!5gjz1c zsN==688#s*2EtRDC(*1z0=Gc?PMM-eZT(qOu1Jn1K ziQfmYRark1p;XLE4-nvIf;9VaP4RN{NnpGRzElVlkW0;*|KIre5^hR*iV!E_M#!Jg=fj^3FW?grw<_9Kb5r0sjtg)1@jzH(!<>Ozty zh}9u8l0X*fvHPMA^y-@(`ks1XQ(k>$b*(9i+PPuNlp254(Tb`LpB{+#(;h~i(M6FnqcO|l z=OEFeE$-u;b+~;dLgo)Ln_fXfSnM6lQ=KhI*gNS5x^1bE7Zmrnrv*t*%C2#+6YB1$ ztzFI&gYIu)A1dnYraB$z?APz58qigeyvFA`cV8qET#6xAIPoym$jRqoid!Av3uO&M zNs=?td=Hf@LF|^i zoHLDX7aqs9>FyXXP14Sa^T5Eu&RK9(cDg}Zeh3U_a2!x5Z6#K|xw9~LW#1M@&OcRQ zgHw5pxyj#sGJZh5v*8MV^^^mvh9iDS6SvaCo|kUnOd$PzTb$xsJhbmJJ#TDBadtGX z7RJtESuw)Sa$ebsmI<*C7cIHcSerYo?=YX`(3+S%t3EWn*P@)|(B^M^sitWRrVMQE zU5av!pAgbKIXiXrQyG^`N{YIa_=In~EhtI?_n<-j2}Pn|9v0p zTdAPvXk%~muQ~-A21XkOw^b4%IB+-={Io!!p&-!6afHy|AHhSu${}NfP%=kD>cCB{ z&MO+!OAuF07?x!qalpdTAkgNhO;uGID{Dh4Rck6$Rr+7|TN8$2!6z#*w8vX*Pa6%J zUzrZLvN)bQfFGh|61cyfyMsBI-g`qVH^>iYXxqKmu-83Jhc?+WKjcPZ0xePR4Dg?R zzl6nN3phixsgBa%KY_1O7mkGJT+Dq_y$kG0P+><~S0ccSJV!%9=8lJCyIcn&ymT&} zcICN93Ux<+(&9Yrf^(e?%-lH8ehpSw<6<^Sl+-_!@Idb0hjd8I?FF?$XOUg>%+fNi)XwR@W3ne5Xw{2LtH6Atc^ zki;6)Nqk_%{*f;B))DODY1-d`v30-8^e%|?QG)f6V%f7h^hS^@!83c4=TC`o!G!ca zbslgGc23Y|DynVqEoyL{R2a2lT?S2v8$@7CmXni)xU%hRYD&9T=2|tPPGJq1oNjkz z&{#o-5JhY|~dC+v|FvSTtXi$u!h(?t0NN5Tk~+J)CzWfBa_)LAK!NpNzirVfrQ zL*|D$i4b7rmoUPfoNNvR33~v7#{^ zJfq+>Nvy|)QuFi-h3Qb5HyTm3!<+ydtXFimmPLr5m-BngDnasTmhz)A!vumXV37)@ z&l@mMBhwVOLmUI8wQzV4JCK9CR7K1wX~tH3ad0T>voy?#e1?pcIvIjB9kQFylZs#pqoWVc;G1Ca; z691y4Y&0A=K63>xjC3;JsIb}#? z$P`S>dasDCMrq>c8JK}g!9xkIh7G2!Ar%pp*N~=9&sc20&2s(>`)QH1RgGRBi)3FN zZKPIh0HSin24uyd0%(e6ycNba85>@$w~L91a~ub2E*!C2NW*bPYj1fXV^9rOE@ZrJGEm}4U-|6 zloCVy97%8DvTRf(nhgIfsVuTjq;JGA9WYp{f{{@jEob1Q6;`3<&ZrC%G|u#%9dBq6 zR^I|_R5Lf9s=uVn4ub$hVbi-PSOMiR7&;VC=c3SiD{L6GaLWw-?uy_EmVq42=D9Sx z1gwl-LULvvpI%u(Zht1i&J1`i6Absub?~?I zw8VhxT74(#;de7-lQ`fC83yKJX~<$(GfKCS^EzyAT6POe69A7LmW+ z7KU#vBHceKZ>d7AEkmxcj$LLk@L_*hK(QNiFy0yQoh5mX72`H9-?8l{1TgjMPTAfs zVBLU}TfApq=$LX+k7d;l%d^?n{+6Gnu#`zXsV90VBv*)@+!Kq{BqFsMQ^!@bhskv( zYeU`g-EP2S_v=5gJ{#YP+VEY2))vc-edk-YMjEY@6N{^T4nl%NC$=DF{X_V&$td@rbAudqNM-2tBytX6%nhE>&A*LuotZrZ{m zTNv-;E;WGbps(6W;J=*9UtS0>ux#RtEBZzPn}dviIyJSUh_aWqf-MzF?)F)pu)%vX z=`qQOu*={#AL~&Z#T($f9PhI+<>NrwBB0n8g?-78CTobNz>iIYT_d-Kmi8pNevr`n zK&w`hu6cxA9Ea}3%;t&QSE)wVrcZ_l0dXw-ax7DfQ>tnWUCyeR?hQJ#v{X>t(RX65 z&MitQooZFG8ZrW&Ql&a@#!vCYm>vOjB?tUu+56>6W`aXwXl=@sB`MiGxH**?DBYU+ z3Eu&vc0Ad~VZyR(MDmhhHAUp0-T0`Y)z8dYJXxQk%c+S!ilo>qao_5fsS zVnaLA4!!W}2_V8D^UNulYhM}VTglCKB?Ne|A8^sn)lewXQZQ;Slt`1bC*}i+Heqop z$lvNhWn2d)(LE9N%6ZS+JmRgJ+>8k3S#j2Aj9(%QM69F_R-dk7$q#*yPzkA!>-9hj z`i@ZBhaWm4oF6!Z&OnrXC|hqT*_~k~HYJG}>HzD!L{0R#^^;p{l}1#Cc~D~QXiBs& zVEH?vtpH7e*mCR?O=f9z#xisD`ZYZhuwRsfn1{W> zDugjU&3m342YZvJJz=jcWS}?X^tG zQkOrzTj$(~n-hvpjH9r%r97b$T!Ra+iUWj;O)>7TWk$HPJMw2|CCMXXk9PhSVM_Sf zW4D-6>6Y2)dLU{7t!v=6L7rJ`H|K>s;43uXqP!NTUZb47^=i~bDUzIj^<^+gU*0L< z*y`E-3?O-=X8gsSH(*LoJOn-cb`e?_BOQ2D9yh$az}Zr>~EodfYEbCq20wWj@vZR z93wM1(%V!40~je&i6BbKY~4K)c0zeruRW1B-L_bve?yO zYO>>U8p)G|PZ~ftZwNeRaR7~5X;51wz-%M2n`jZvUPdXs626y96HYvpjj;Eo7=KZ5 zQ~jPF*%7m`FGPiwxbDk`f{>`{rYp@QE6N=`BRYl9x(mx>&{dZ~QQ(j8D#O49iU{cy zjw*V$yRg}p&m}1YDX|r^ZN6KKB0s&)bbY(TNH=K;BkodLVrgH2i>CM}+D ziHqV|^S%;6*fG@C&f5z%9(~j`YW!$R&vnIf-WcJQba-;3Mwy{-dn-3UJ;|XtQMLTG z?A=0fRI29u_Ro7c|4|UNWklSte~aE5zQ2F}u&-d`U~6OT@SpXNQ|ydPKOfw1j}_!^ z6n@|@Jg}JlzH-+ES9o&GctAoX{{Z+};p|X%s|RYliKM>6DkL zD{n6!&tGgpHNgxl6=Z;k(dM`;h<4-)2DP&^KW+v##cFmz3#Mb*4M;bx`(cix+l$1! zgC6rZddK8qr7h*mgLKb6!n+9*hUC}GzO8H7-%feO{(1EAb**EBx`nVCut9zmz9ER& z5)Pl#9IxUC9jp*a2S#oe!dk&P`SE!!wDm$mX}R!Cb>j7I%y#2py3#e@@DBDn40h9dR7?-;z7R9 zB0npz<0Zv7)6%A;sI+;WcLHEPfqVjBUlo?)i@csh+qj;lV*|&e;Z@Yyj<>p=*x#}p zUXHhUzd&zjw6N_wi*_xLGdQLJk^{}rHaC1jEg0Pkd3*RVm>kY>s&liorG!Bt7}jQF z=454h91MS!YRmJ=0O~{8{s;OK<}a+sQpYN1&K)~Wl>+OgX&@ucN08?h=l9Cn&Z`35 z#dz|Km{NUzBqsEeWIRIJFo&bX<0iwkStrwXo1ZzLNZz}WOLp?V*YvJ4a}?{=Pk}n1 zB1O7t3HH6D6zB3;G4$v+o*t}fc^}5zcFEI0SE!f1T2GkI`zbo+F49l!%#u|tL#L>B z`;WoZ;>x)cC0OcLvi7ckE@p)8;^UP_s(MX zo@f^15pGjSGiU`}qNpbaeYECsNL5QAUu~a&%JImcjIi{oE1OkupShv9IHkDfDj4g` zedd$sLsn;>&qPSJl_9iUU8{Q%Z|IXkF}1dnUNU-&KDSfXFgu{ZXR!oPWCte{l^RX5 z3{mGN?rd7iZxT5xz6{bpQeN#|s7pr@Ywl#W`-JLIJZgrHsBSXEkgi#Q5=G#WfG}`m zdMGe;aYa1o3iWp=+<=8-b>(dCDi%gAf(~KA)kJtl7O|XdymELGI!bF zpllk%!_J7Tz={<>p$5sF2eXs{{7fO+wm+Q4;D(A(aD_@3HsuSY>0GxwNU=(rDF!iJ zJ7!6m$Vx)2%qTOk_CGkjb6k$DMDzKH@OquIQzs9?Jr zNa`13(WBW#YRa`Xf}}6Y5qz3-IPh`<5 zCTorLZW7L;-YM|(K;hL9hW7DmENvBt%xAU*O{buzJyd7lclExLA3}*Oj?M36A{xDP zwv)}ljPIgcA9|3nZo5NB9Nt|ww$T4FR;W+&3(Q>*!V5D+;6&?p6uJBXsn@6)svEj$ z{^+0${DBoYLkL$Dn>{x8t}(|g>R!fe+Oe3D>aqK)pNHh29D>wB-)Xgn*`!`Fnxdn1 zba>1zg)kzL{HbEDPXWB)n*|{nVZTz+0BGFQ-H6!;3C4w>Qg|b&K3Y=k62DRss71Hm zL}8f`LB;0x`JFG&VP7BiNmC_mQ-pWWzX}H z_g|;QTz~w2ruq&jK;Piw|A(3Oe`zZJ;DIPAO8rx#ElOTm_7^>z*8mMwHJN`Y7-9e` z{C+vsiY@)^BA#7RK#M>0@`d%7H`-S+DI)CW51+(3BW8S&sH{fD`=iIHLN5;=HxS#v zDvER(%SujD_CI(^GDcJlJb4`>S1&+54+J!Vv~Xq=$``cyD=C(}gu5;xz;9BU5CU0a zYEXBkRPmHNFwFCY=KTZkvV~*3{G1&LBPKY9!2jE2D1@Of}K;e60tU!}) zV5^%DzA1zF$-yB#%*TWqFB16Uq=z{4OmjP=x_!BNg4PD;L!h8gQOWcT#s?oFK~<`$ zHN}#qzH#l``NGjEvtm+Ug*A(&R^9e;hP@}FW;dv)I@vSt)>{VzX{{s}f5X~xb{4gE zIX}p3J%>AFWFMTf+(UwNIv8TN0BH4nW<(xwl@qfDpV=B0_nJ+z$^r`Eb{VxwYn9q{ z7Du+bN&z|VO4>qs=hzNj7OzxD3a$AaRbwpisRW5m-i$18;vhXx@3Rec!TwQBh7VWY zEBti-f(Owi_)Hp9oy6-gQ3eK5=JO#`Dl{l4(?;gM{(^i(!?V%`NGOAqvnVl5yx^aB zGv%n1`anMT19$bSJnp3iF&T?ckQm3wV+2y!BUW(}DS;a1=xHV5!bOmW!p60}eGfSK zZHdJHP34Lsnv7Dr|0kg8Kd3{iTB$EM-+vA8oe9wX&p+p2ED*(U4*&dGo2@ zbo)$df0Q93K=Sy`>;l29B>aG9R$v{S-`Hn-+G01U{eEjO!uUDC;FhQa zuMW~OrSzyQ2;8ey$MXTAP$o6DKVTBK> zVr|88bU|-|{OD^ptvR7)jH$*nBytnHd^R~q8{-0TpmEp_Hrv5$DbK~vyua4-)xOe= z5NZSNKix6`rrB%Mf?h)c=KfM?PhaRX)eEdSdANP~q!F1S2NI$TBDV+-Wd6HU03b{{ zaGQLgb2t4h#U+d(iF28ya^vz<^D9QR3NNSvWzOIiaaF51jr?f76!*v9yhFkd@+8K! zr6VBvx$^cr3uN+orb_tJi=`6bR8ceq#Z9WVL2@bu9C=vExZSX35~$ziM)tp(nxd4F zJ;3@q;kS4EPkH!%y5*ptA!K3rhZ9k*-)JiV*~{N}yn*>DUMR^u?dVMi4+tmZdEzHcwnJqReiCI5MdbWO ze*+jsN-5LDY;N9Vi{)FyQgnVmEi^ARA7$O~Yp$r7hxUj=q@fsT+VNVQW=IOBR z1ItLg#MWv9T^mE-6|EhaAIOkJ zqnvpqJg(E>pk*?R2~nejELVqSv;#%SRswx7m5NlcAdXY6R>1zZIU1u5ouzm)WBb2d z^FL0#v6n)K`}=bH{{Ak+q|l0pR-u>OX!!k&2a~rZAGXv%?s4 zN|1o7SzQ%qI1>?{Z?~F2)vv><;FNUV=Cw28wm{4T55_juq)#N?F)0%=>^FXF@hpyl zeXtPpukf$F+Y4!Mh5Vh=w2M`4kL-pS9ut@2&(GtDoS%_++o27udAnG{nD8Tk!5OZq zuhwO*vH`gJKRanJ3oVP8r1qOLv*Wtdqud=Rjt=$sSzLZS>Law^JPo zfsz=r4TrMyYX>3h8iSKMco21`s?l6ko2O1warW=~76`~}{}z-butL?BSq(>aWW;rV zu%=JelBz0{Xg@@{jF;?-8XHOOFl#kV_hpryaI~Sb~j4m`iVF1RY2VG((p> z>~EKsI6Ze0L}*%Y_m-wjvwt5i6U&F1N-)ybg9q7cl7!OltB;&_)N#QIC^jIqJLU8* z;SQ_ZrHSWhH{t*Zj=tgJP7Cz@O~|mnyU$;83$^X;yHO-Yk4h zmeIT)PtFNyHLY7{<&_4QHK&gbCz3X_Y>WBg4}4gOcWz5$F_xCSC!~Ou^z9YyB!?4_ z7%K0@;8D1(>*d}+Ws8A?(yl4VqOh?P+k#H0D0_+RC4E-f`AI;51K}Aw1JZsQ>>Hif ztE^>UT2tWP%Q6289j@YNol&vE;Wm~C6?X0?l$D%%l+=b~cOC&{Ex00H2rXLhr{X2L z2J8!M&2c0XxQ~2$b2&H)^vGO8V-*H7sID4?DoC<6#9cH6y|PL25d!4c%Nq0B`o&;e zQMm#=Q`=wjIx!Pfm*3mCJTMg=2p=4NR2+x_P7*#?^3>qFzpA}z?=(qIgxWcc^HN!h zF9rBhES#1#BXp8|_s@t~lX3~mPEVP@msuGEV#K${Z2UVRz*6PI+Uy{tE|)9eKvF`{ z+yQ&ccfYt8p1D1d$vjM-rzP#f)=faJGouvZ>$!Yg3< z7xDc`hYuQ*!ZdMpR4G?^wh@fqU~V{IJ#>5&B3(8_PjY>hV6HC@Lc`ham>g#q8T=i- zN*7SNX2Cg%z%_|rSyHT7mOC)9(iV|iauUUQ(Z9WUBe`)+Jc6t1F(DUCvwd&keaLP_ zDjp*ZV=`)7C#X5G8)o8i6J=6yH<=&Rempne0e9Giwx1Gv@Zs7^OE@qvdIx_ndi3%G z=k|BA8t{TaK>{Z|;8geB9zR9>(Tl<&0v>WxUbO-o(B{r}XrM`HV5 zW59oVBPkmbGwXljl9CiJWe~r!#fC<04b)hI=b;i5>O%u~cwsof42fkVI`X>^UCFdW z`ps2im-3r+)LUdJp)g+0AGqVLCUm2!3Rd%JoX1-ZS6Ln=KA*3jK)qDS3nznWq*q3< z!yi!gXfr!Mag1X}0{_c%Q6sGn zYFmAR{!M!euz(sHKT2=e&4p}W!C_AwFu=Tr$=2%|Rs@@=J=tL=JKp$e@dvbHp9*-c z1l`BdJnjT`P4E9HL3&)6V0cJ73Y~pqnaPE`%$Zu^#^n*UAlFc-AfEA%OqL6Q%5tg> z50U7J@}o57tWz{Z>!DK6s!B#Zny44KX3AH)0%PK~o;Eyi2@htUFE&4urSdlpNa@GB zA%^BDE5qRq4IPmNJpv?l_cD2vGC6Vs*04`0UAreIOg2pNzp|NwM z|2S!Mj6qwVi=TsFS%7o}vI{LCs6Sx#{oE)trT!b2kJ#7|)Q?(QW$D!D)~ zoz!{g9L^AQfwjEs-AMtr^qXV(R)#0Gs;)2&b4vvAcq4Jt9#ZTyS_v_57z!pswKaBsP^WruTaan`uCE#W@f z>u~2t1x^W@V2xa6Cr3QWs2aB0Z@9EiIi~WBMru`l5&mQ;kadUfVXuXrS)e6dWOXH> zIgv8dJ9H}Ykt13aPaxpHdAn(2!F`URET5G0W9ZSL-6^T#bWuZ6+`2tb{NZ7 zh*ROMFD@^(U!d9yakNb#NoGlmgM7gjCkbi}f4`_U+ggwmeuK8toPsn9q6FP#cbR|Lwr$(CZQHhO z+qP}n?5Zwxxuz!OWp-yaVqb2=jmVdbxHt2h%yYgkWihAIv_zBD(Y2&dt7NAci^Lwb zZL*(PyZB#8N-kxlFoSDzUg(R&qn%jvBNOqCNPinM83gMc+nIZ=9mcw4tXJV zT6kZ9;!tF-%lTZ*piF6B@F)l?^V)-BQrR1(3!(I3)Zmh`aEZAEf*$_5M0<7$1stc16Uo=wmDDmH1S053q}c`$xH!w&j^p`-7{Y8fN0QHq2Nog#8sfY zA$(5rxWr|_x_=&b zc_r#DSJl;=Y8%a!>gG>P*U3uAi#chy7zW`FR4Gy?*s#oBF&T^A6HGW2vxN3t4r_na zg6&cw+$SBW{jv!%EGMM(4Ce3uBqA?o&8N>V_wEl!3QKLjZQQwmmKdMaJ0c4#`HW*rz;zC?L! zO{>b3C9-(WIZ_&JEr5EcJCxKFep#nIUn}wVZOvjP+mXgG?u@n zUX7FAD@Z3y+F$8vWH$v$f6*NanDCF;UK6YrbVgNbyOA8}zXDhx-*YD{0Gs|}G*pVP}PI$)yg-mReq8swuo!1Ovzb&7>}l?~(~ zDrTZiUYHJIxPra5Zd)7tLB6rSI^9|<#9y$Rc;bYUvf5hgF9^cH$&3u70s zzU(LXDhW2OMpFqiG*j1&xYfy0`H!o_WUZ3$cC+l4tL+%gob+PX_12w$JAA@*LLitlxU*&De&6}-B}mv3EDP{eRy zb&d^ZwoHhqJM>#H0XwQ`!%Uo{S!RB=Y*^lmTa24OOt+0?ACHMK{5R4q;h>)oL|+)K zFP_5}*Ww3I=&MlniJyM#cSO|(BB&p>FvIShGgG7q@n0c?4aV5`VUP=Q2?D`g!N|!{ zf|#X8)APC7xM!l^%duZEK>>6c*szjQ7287R1st*u#iRedZt_19S#x33oG^}GzfPV1 zm;0*!naKWE>RRIs;jOH)`qFWdBCQJz1q2KP4vVm8jzo_FMZixFB~C6{4?6)Wx|l9O zu8Oj{%axDcxOpXgtnU!||1v(^ytnS`<=okX3i(~`E7cSF8xJFb3>BU zCw=7|viWU$rzZ0SAN0L+T<4+B;kUW}O*pN~_6i8T@4NU*%ClSeWe51cfp5NZlljV> z*kgNzSbi&j0RAAV^pTE}JO4`&^BT?TEnBCT{vl=g8i}i?G{pw~y?VU2@cs|CJ^q`2 z>04aSm+@r|w>|sY{9dp8uiE89*1-4CLEpnSk^y`MaDAEn<9;bZcw;b=x`|4wqGSTUy-aF`Uw%_y8f zxxsx2=aX@|DILRA;ufy|SNMbqpLK|+#BCYw6S_W^zt-HZ=vUt1y}4ePdTR0&ddlBY z*TFE}PibR*2N8AUT@cSVjBg^FLpMKPAt$MEv`8BRm9uLSRJSYVGj~_>7*qbhLXD%a zfep({ozsusJF0hORbiF8gkf#kFNtX$Aa7!VxhglBFoh+wZoT|2M6jnA%pg9X&QrLH zUJgJsH-Clze9RC{f;@dWcEJQjKddZ+ezGoFL~VmaUc;}G8I;t~$}2^PD*}RupLqKS zP%I+gnaf$!AWHB@)h`3RR6_2D5`*w|vqsq@&(T&0|pq?&eqEZtu#Gbg>I+Tk+YsixQ5 zOX!-b*IJ5VQ8JGm7BN(^jxNIq>n8a^hUjVt1&)4CjCw-&%5g^1s5AkmA-%s6Icbk! zR%V{wFA>Iq^ZTGS6gL!gVy*-dn}a`6X2gR%Oj6ht=HrF}YtcaZ=HOltBh9TXV)wDl zu^Avbb{fiqJ4Y?`cBGAMLTE6^4QEom_9gx7Yx$O!!?pWE6ppn0oTTat+8e+Di2$rD zke1)iOIU#V31s!nd5p(2FmZ83^pQk54emB;PLN)6%0srk!{Epb7%GGy!|dXXwfXLT zwY5P1Lm|uO#Zc10EGM?EH=B9+18NsHcP&%YgJKgzp1k1(D^$m6}kI{?l>_sG#tXkVJdd~wx1LKScm zz8gH*TRGZ#NHTSab%Qk^lBXTFODLQvwoJB#B=@_4`#ROBsne71J2<^J&7Jg8f|`Se z(_8q$x=r{w8f;$F;seQ1Spty`?|D?*r;!uxOQk$r(?y4ZzD+rSjP$>o65PeCiV817GO-*vi z;KJ>iA4TNR(UZ(^UKbpIf&NFRo~*Y}3D63!P29zVW#>jS24)DIN6-W@u!5f*g=4WXn*{FtN#s|zj0uC9VJwA)QJY|S}PD(G;Ix&`rk#Q=oBEEa^ z@AazSKqYQG>PZg`v;|-{*RizzLcwIGp|SF;hd+m`y@f00;FL;H1{%X?kW*u_;+D9$ ze3kTe7Va;mdM1mv84rhOrY=KdW=%AYYqCH!!Wx_pT#_C$x8|y%Lst@pTN}Ep3$Q>w z)p8`-><_m(JjIVdU3J2)P~NzNoUk{N27@ly=#229*da@Wx}lqU#NP+ZH(FHYVP4*W z$H;tvZ|xVk#h7$U@Ub*M5HIy;Gx9)Wk^g=`UcjgUpNW1^O77ab6H(EJR|5u`S%9V@}lr8NP^Ir0Yp8DjfYka~2>CS$K=)NPLk(6gt?#f2_=~XgYyNtPtM>has61WKb>c8iPF&JeDsq zV8__ifW0UVEdUJ1XmlQ9M^;I`FphuQ-u7pZA$|J;gz=7ZBFImMj$Cz>%{{8Lv5r*z zEC*k1O$=S)9ccXbuXV@Bu9=;dHP3qx0dCu{9(!cOKkH`tiS(K5HjCuF9 znV??M29o%6tLqm5*PqsP%|S{IJ&mc;PI(L@uDnep&dr>g0IVn-e!Xe$NG68j*7YAi z&O4q+Gps0Hh2L5Zc`;=jZ)8FPYb$gtGx>9E28k|lV6SmR+6a~KU7yx9_Tgp73qoC^ z8MP~V7l4GGFHutC5D(i&HgM-qxFz(ZY~+htw`sU9yvaI&L{}|E3FDE^n$@fUupxuC zHM6T){Y+37oa;u7p)}vV|C$Y6nO$RykekdJglHrOM#+3r&NRKX+LK zp{w}=7o2(JvIts7@MROhrU4ir#M1a7F}IG0F?ilBwBxr99Y%0Z9HKojQk|jBg_ z9X?bz5Fc<4@~E{3u~AF!lF-cPI^XGz@m8wmn}2m@ghQexO`6V;*Yx|(!IeM`#lMxB z+Bp@iwP=M_^7ZdXdHk{)YlP{6UF@346F1tT{`-5&EW$0~{DUj6rR=hw?iEH#B>9X$B~8#0bky73=k z-twZyNy!Nb+Iz^SWdxmszSqK#R2+A%U4ztyN$QKFx6NNfWulhFC zkcwTBFH1bxBb(|c&Wg-7@EGvWcVSUG;-HpwXibf9Ts)>^|AU4!HOvTqoo@Yb9T=?$ zV2a*`;kHArs2&mW(oykhhHl3m4>cMg^+>Pa-XRX)$DR>dh0|^;M*VO+>c2%V6NY$5 zF((lZQfC_8oRlDRCUf{^+sOrS28Pwp`4RZO-`3%J)X%kp3$Z{wBgr{lHzgX^o~}V7 zwWe$8*P5<4vJ7pF#<*yxO=fdYbX1%|ZNqiJQjTZai%5MD-|B~MfAvr{h{&2#*@M9~ z1C24l<&9Ygw-T{wl2DAjl2qDtlh%X@;_f{Z6LYVmyb1gU8d8^wZ5?8+Qkjb_CfJ)@ z7m1D*qV@G77<8R-9r4Z+A0)9V0TJiz)JTF-nv4VS5$26oLr@pt*2k-eOR7?&h_e%o z5JAyHCsnD^1kb`5-I~x+;%CW(JCjyqeVK=J`X37J^Gdy80dnOM&KZWb+X$t`q zbd)p?vUyxx-SdY|6HHMSDX6KBNRUi;O4HscFjl)ABoCw-jtDJ9R&ZrqXnYyq7rH00 z*d1KnozwVJJ(4cv0??SPn277giAat;2>~IxQol=IksmA&zhb)s2_8!Gr&7k^4b@+Z zk7N$GJMz3()qeOm=hCJ~{q8OE_M|qmG`UQ3Tz0Mmsy(PpXDPCEgDElLHpSRn3Kq90 zozkci{RmROQ-&~(ab2y^0q7(xQVVjRImWY5md9e1kK-*jQtdh9NhD!zSRMU%u*=}{ zXs9mP2&A1{?ug6#<%p3$&!Jgf%E{`foZgN;bg?IRUtzif6C{LTC=AwqakNUv2~9Mu z2{dfRu_R6=xT63ZLUj~gQpE{K%7^Ac50Um$B0Nzf{YU1ibxWz({NeK7MB*HZv5d#& zusg>XQE^HF;tobqIx&u?v#q&nypZ{KQa81*PD`a6?V;j9d)W`5m5S=vsu? zD;@OrPwE`2iD1Ulh4?C6XE(4EvjM_b#wVS_peiFl9y$)y1C-+gkRhzV2ERax%3Pjd zx0gyd6FLCFBx4b4oCnp3B&eM1V&Jy;8aW}p5p||?48;06LW*GPGQnCpmq1l!bhP*?DX-!nr95ZOH zCyL4+S~j)7zfy8vZikKXpGL2nyA)+LU*Tw3rM_G_^ibouAg@ z7pd6;WgHp(2G8^KgWQ)m%*4q6u0%#Itq4IYeRMXpjcATk7)e2qFjs?QGP6lV<=%+Y zY!MXwBpMH3l|(M0&|{~>&VZajH#@P>Go90_QFj-05hEd81rrC0iZt0VA9f{#nCcmX zG(gMxjCIh6tw9^1vN3k&E%=Gx!^HE6n8_R3zXwgJ)P(A&ij|df#=!&ajJ_Wc;WS8G zy~aMMNGypPOIP5A$5dcU)pgNbv22$#EUfg~br+IDbBK!c7m?%Ts)hG5tA?1BGyN^L z-PTx{6ZYq5`N-PxaT(9ncG2cmbhbv;OpJl)(@mvHGX*am6$a#ywGseu_0bD{Hovn$ zKZZ}#_0IGvdv;4ER#(F44e(!OjJck--bB95S=pf_$q^8%?aS8})k!ZvrpMyll?m98 zn&q#^nQt+1Un6bi(HIFUNYOnLj}h`Td*w08Ip~t5>&*SL^b#w@95Jh9Y}{9!1Ro?~ z3A>n|U9nv{yOBOB{oyxLqR0s$u6_!W!Uq0nxdy5bY1NOQ(j!b_b$JRzJ3wBMuAr*P z!St3s|5X{wjdfP!4j$!0{Bf}3=9ZV&>th3Az7%tUz|e0y=^eFb`*mqEGJ|!63)~pVn1FVfd&75eK3$I7Octl* z3Ew>WDx9~lK56-XBHriUid>+}9IR^G#c|Ib_&IiA*lB5KQjVnM@0ch`D~mcLCh%S+ zDWiWfirZTj^}5=rhf(#OCn9Y~WlOy} zTV2su+zeEO{XxX6+`jlQgwr+#f5|{;Z#Ry1W+FH`d9aa!rX}pgtf;N+$0O4S_$fRr zZ>gy^2-N8E^v#i|Uw?D8Oi~Z0vMZ z5`pk>pgAuRzq@wW+-o!1hJuKKzc$eQah9`3CYk?hs?4)6>n%Z2guH;bLto=HzOzFx zCzxf0=BSpsV248JOP+D+mLEa*%0`m~B~ySGhw(UhX0{!zRWapfnOCVbFsr<$c5S7c zbJ)+ldgPn)(7Wo+yG=%CKjAFXp8Lw5gvt3r=QtVpy_;6<>vJ(Jp7OIGDtnMT8(mXg zg77r#tz2WRd~3SqP}Z5TmEViHBB$a`Dl}XRWqGjMBG2x$P}hT(SMhwLgfDS7@0Y~BXZKW!DL zi@fH>P9kL++|TZr2XH-0NZ1ASdb~(ogvGIrBXkw`1xP0W5Uk;!2?gy!*v>B_58O z2mE#L8@mEA%!A?~15f{K4s0=u(PE$!4e7gu85uf{JG)^Z6%EO|g&DjN#jB7!58hQ? zyN=gZCwdWtRd%GPZ0e2|S^An3obppFiv%Q?7F)&b{x)jF3r=>XnZeirCsOW!5QSDx zuMGn@6dG&Kmxo-zt$LnsTsz~O?SK_=VffO*4wEt1(yGftQP9JC4pGDdwa~)?$HSQQ zo42Dt?=z7bPPsIetdOfd_81iLcNQgP7OAVJMTxR=sH?#?ts# zaAm@!RIuK_ACoPCAq~m(ymg=UOabSpel)3J0m=qn$P1R!U(ir!Hul#w^xS|dqn(cd zw6TlU&$;imalcLZ>=umb7+gcl1!fed4z0o@w>sq(Ym zC5~JN0_oRxHq4GcR_k*hxj}YzNTve{bAPjV__;yO7b?dqk9IWOeg?Xu@-%()ZX|{C zpAIqC#&^V1+TvM|YXPuNg0Rb=b=uX_bm(ju1=+b-fghW8gkKSXhmydJ$-l^SsGOE0 zL?QLA4P0!Y`ckfXZqO_DPrfwmdS$A*enE`077v9dSY9%7&uy5Y3_@ZooH^uWG?sIQo4Lv_#| zQ=+7Ti(-aJ%r(do8L@)a&O(b1*onN8&m8rl`&=_c1cpJaV*D49MxI>=3xwgvE&Z5N#W76l~2@g2Jx#1Dx@w4H{ z!@|cC>*26Jqp-1^4B5i9_wgO^NePEIi5l5S2_cM#7^|5Gr|hNk0m7>s;oPVSuxx}Q zT$}`rl%#}mO=gC$xvL(i=))M)8%@`Bt%Ffo3M32SfA9Y|R}~MTqnq!zWd6B-^>oWI z6>e^x7iarz$b5$%P0M^2(V&2aM#ybR`YgS)na^y3wla^GS{XoAd;!2`fG>)7_CR26 z;0f9TAL`7io6e294ZW9GUKoalN^<<|4`K7t01%L?AV&sU_T+9YsL7H+l#~_anwD51 zx1O*KLf+E14ahLH9p<0#ts%bI2>(=YW$RzRPWG^&_X827urZ#wMugEK82ZXJt(z@e zDWM)l4ZpE?6Ro$0vn!qgxr@6_PO|52H7--8;FsGZ3avmSJA!00Ks!iWjG@PoTZf6N zT8wdJFQKR9sfCl>`Gv0FvH5B533!3#*|^AMRc}PRN0}C~>l9EyCWl|BAO)^_n%70G zaewyD8}c2ejFyYzD|ZhXYHJT$3k?es%gw{hOG=~N(!X%sAP9~tbOzpn6r!Kc2`OCf z|KpDUeSj5>vD&EG4x_RU)QW5rGb5=*@bnYX0kC2YRy05KF0Pg#lJ`cFXoIbN>*Q6zi|GVe)CKS~LJiufRYO?u zwD-=(USKaL&8XEI`jJ+uB@-^~mOA-8aL>+OcpGC^RxS_p>M=cY^jL#oRMC%tu@TqN z(738w2G>IT9uT}CGjc{f{qvpUdte0DBrf<5g7(Bxo;Pu}G8$p6b zUcs}th~Qol!%b`=NbeHFP2b_T*%2tUQOdYnk3A?z5JdZQ8mJQ z7{S_Qtz#BT@)x8{Ya4*_$Z}^y6*&>kFRcpC%FVI;`oNvpUEvW_Ne35ejaksee>Bgn zN7Y;MClt8s8SZ|+PLbc?`4M|~B%j3O{6K39oDFlv5i4ETw59NbWySC;4T&KzazZr; zGEhu$F34G2g$Z8~;zkKUU>ER^Mt+^sb;nbI5B()XE{!0NrwkR$zyN;`MpKT+7H?j} zqqzHB8)g`qL;k4SSocYrfj&3)O}D_UL15Mtd*Pb5eNc-j{)Oj+$3T%8cEY@HNu<;+OGXd2 z#DFVd!$=rX7e@d$vmNQjW5AC^9_0&42P2OdYwr=?MH~@b0YE*-Ux8YBNuJ-dLsOUb zBH5{YkhaWAN)GUWqFC4K;oh1D+Zju$08Zj6L+VVEnRg8lxNY-Cs)UQ+^!4k~FooEZ zh@OV2zthn@|85{Ns#wrf|3b1i7-_G!7;i>8C!owHOSLfMbRUs6)~AR@YRc!&{)H@z zDUEtU|6^~YriJ5Kf*`MKZeOI00tmDD;3#}xc_Fhd*{~Y2ix|*j&L`81i$RAf+7g9Q z%Gv@~>A}0Mq0Jw=ZbeTxHuO{%MKVPPHqhgmMFb_#1GOG{6;P55qL8Z=?^FVx5o;d+ zYad7;kjVxZJ5Ux!Eg9tB36!e;CKAS}tw$VG6Ovr6>}@l~NF*0IZdR*wWuuys#=D$_igV zJBqmTH+cA!L47-7`F6sP6=GY$aHRL;bWB+{hAIhe)#}3u9 zmzSQD=x~F#KC1^(J-rU#V<_(z_tnsy^s%`!gT7L7)i(j5))!yosZaW0@*hv%?)?gK ztUmz)fANkVz+ET7Co7>T@qxbt|8dk-SFHe|Sn}0(7heV#cD+Cne5Vs4hNAVPON+0*U{6+_ew(#yfhmm>j+qJb$h`bjzcK@y*ouV&Blj zp^7^77gSk9n?Zy-oND-*L5Vx^YB<|IHT4|g?V!maPrE=jeAY08ecB7c#2sR@(I?_x zl56z5K_hiu0^TsP5w*w}ne*XULDG*<)*1fpv-FjSRxOK`LxXz|E4>AVG9JuSs=!5Imd`vK$2(YzuS7>U%g4Xw1`Ox zd-AByDl(g(M@*jm1x{op#AMb1?a{{Yr>TaHRK+IbRFR0z-?)cETq=Q?-n%(rxhY_c zPxDDN`Y4;CXrKD)Mle$oN+29e>A zDWNyCZS!xpa!X;e&}F^w4F!H1*X&stRB8)*=(r*s9auCTL^BRO1w?uW+psb0K6%kr z!NTWZv0#Y|r3`SzXK=`4Q*%S1mib*H=5%;33=6G#v z<`lQ*Kz*$PdYThiJO*oA8qOI(%~-{7eN3 ze<1n@p?!uhxHkd>JgCkoASRofaPT-g_zoQa+^y)p4d0%WQBUx0?wq-}gG3GKxTB7~ zJ7IE@z&I;DA5=m%f!ZToxetW{c0JFdoRzPPX10K?Zi}r%0UtH;Qfueu`ys$YCnJJP zGwZNE=gI=PvUoGjGQ|dMY0xZMr}x_pYg5VnR>|c(f-FgvesRYS>kl2yGrMB>c6GGY zJj!CB;%(>#;>NUZ-pu}#8|~XSkjKKs*Tm;!abZA?(AY##_)@YVh>lp3hp^@GCH95c zU{NPf`$;D9L{kP8*>EzBzk`n>>{GL0u1rX@sm}&b9eKB@(fe=iiQC0g2c{emz46h9 z#_myG1ar|E5PbOWjE_;np7xz)$!SF?ZUSsj_;-hulw)NKcqckzGoQqAC%p*us`fo| zLqEm8{9^9D)Uy83|Jt?3HyeDE_si=m{KUB*&yjD30&#(BWC~F{zO0-BMj!eJnK<_vL>49F|JZNo7 zlR!YE%uZesFZW`P89B7dj`Kbv=RQ@kUCscN0l~M6@K*m{dN1-o^63rwu57;CEvK0I zGYVM+MQt3%h*wz7;b%F;>FG@YvTd_3`*Y3ZZHT*^ScxiTLLEV9r-j4^G z-6z4JYv`kIAw@X@-FXUELZB=h0Q&w*L_7igez%*|G}7axq9+ODLG5Z9T&dx4?u=e9 zRReo=t`oRp_bSxihskp6C-CaFqxWQ8$3i)d=}M*>pD*^Fa|9^2qhPR`;k!{Z8!&vz zC0Z9y7K_gTd}vq~n*w*mM*ho_kxML_M_(2OQ~d!B#>QZofTX-*mAMt12>XuT%ty{+*l3{4(7Phjl zGp7y>TXksYi9H#r@hH1W;v0huoD;Hg+aaaAG#2R6SN&`}hz&dFx-$oBh#KE-?yGO_ zK#2>WlDpRpDB{)Avq}@&Eak{Q4eMpmv7PyUJI|a~a0MHX!BjIvX4HtWUG2o^*q!#F?L}k6P;1qC5%BHW{@GzfEDg9fxEJ zv;*-(Rak12vJBRR|HPpfrEQ9fh&a2x}mT|g*NkeA;;=#!v9Swg@|80`l%_u#6ZbPN#5*fy$U z>VX&%tJS+EB)1P!+BFsqTj4~T2ZfozZD5ZcnMsl?t2h@n)>U84`v#3C#ghJ^K99@B zsoh%?c<(M5(IKl;NSBJqY|b|Oa0x7lT8vqd)N5xIx;$RMC_z zK8JDxXhnp+flq#`=uxzbK6-{rWLp<;dgf22ft<$dl@fUS7bf zlkEnnc#PUx(=K4Nz0zK5R2_cn$y_5GHZpCe0~)>x8y%0?RCTR@*P zQpbCj6W9M~!rPixY%hA=E7zdkmOY(y|_B zz&7o5t4{7jY0~n_P9CCK6h0_znC+HgPvEVLUXL_^{4@b$dh??XYAr`E08N5#?X2Ox z1=5Gx7K*|7QfMhEv73$EUHrT6vNV1{_J8Jl&I#UVZ|EB z?1&T18)Ju#R&ncrds>?YcWo{m>}BsmjvCPqrH81t7L!9J8vNd+%VED3Ps}owNnFjQ z>!Ox%gH1^eMJ*CCi>ea}byX{~iG0^qZYeG?-Rc~wHUp15*IsYoE`HqQ)d{ucr+Y7I zzZKe)u;wXdoi1&u)!OAy^EC^O%_njwHp`=yEO}mA(TsLvl0(zvL>Y3jHVf2EnoVq* zrdIi_!kk(g5seOHk`q^(64x--T35E%HzE;2>9F1p1B?j>gXH*eyfABCjG%ks7aXGq zyNx*ghTiN7b3&lqvm|9k1UlJ}0ZYGeq$|P}5&Eew$}#+IBjp=yjEdgTDYJS}FR8zq z*y5&r2CA9mGycxfc&dVdsUR-g$Yy)=0Ao6cQz?)1ihLe_$J^xl$wkcEyJ~Y*9efnmPDf zNzi!t3whibmxn`thauCcZ>e2y^7YR2I^p0gUix4m~R;9U_b+6E%%Rzv2V@dW_&p7G_ppb~%95v}^}C zHn!MY2mIMKJm#hmy|C9d%bEOIwsW;(N2ZIh@oJX}6~BnWYzNu)+P!YNs|gowLDh3!+rL2j0ro4CDHt6>S2qyA@v(DcG-6> z>1EwuiA^c_;vU$O&8mc)U8gPfPh+A-M2z4P^TCp^Qr45F@S)CBx>VngN91-mrXVE0%EFBV&m>`XuvuI#4LpSfK{4 zccGn@9va7zrzQtdkm^cl2!&vD)vV?*#aJ9+a>amNNeyvUQq!#z0cUu{7D7D7!WVjV z33RDQanmt@+{6kA$zoE9h|afgBo+ebX9nAKADs18cV|;~6fUNnBXDO-bP|=KLQ`xc zFVQyrlQgjz7Uos$bv8C@c4^jd6Vc*R<@1_?`klDO*0+|g0vK_NEHJ3Xo!$QbfJvoc63mp0M3 zWE|6F?Vd!7yUun^6@rk#w4r9xdA2k1@Y3jgZ~*nimf%W$aZv6I#S<%9!cI011;VVF5Vy>pD*LjFO@PiIdp78%^ugzH#!d1Q(aS80OBWrxI`A12pma82H&TuDkq zOQ&G&ivYV&Y1>=l)$HFmDlaB=z5q-kQ)-d?f_iD;$V9BfmrxtU+ySVSSz;A}zYL>U zrgOZ)*V!up_FXP4Pd-t5my~m}s4KXSANT39-?S=k9#pot4N>867QjDk$^Pv~>(5Ml zhABQPD!v#*FAiV8%{)Zh16F!TWzgCSeR@%45YY>sdTA!u44 z=SbyR!Ys&61mi_DIKYkrHabkreNPq^dpPQqS*)m+Enat*aCpBf}A2)
qD<_!X=FCV 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 -test \ No newline at end of file diff --git a/apps/i2pbote/WebContent/WEB-INF/tlds/i2pbote.tld b/apps/i2pbote/WebContent/WEB-INF/tlds/i2pbote.tld deleted file mode 100644 index bfb1fa4f8..000000000 --- a/apps/i2pbote/WebContent/WEB-INF/tlds/i2pbote.tld +++ /dev/null @@ -1,82 +0,0 @@ - - - -1.0 -i2pbote -I2pBoteTags - - - sendEmail - i2p.bote.web.SendEmailTag - empty - - recipient - true - true - - - message - true - true - - - - - checkForMail - i2p.bote.web.CheckMailTag - empty - - - - numDhtPeers - i2p.bote.web.PrintNumDhtPeersTag - empty - - - - numRelayPeers - i2p.bote.web.PrintNumRelayPeersTag - empty - - - - getIdentities - i2p.bote.web.JSPHelper - - i2p.bote.Identities getIdentities() - - - - - saveIdentity - i2p.bote.web.JSPHelper - - boolean saveIdentity(java.lang.String, java.lang.String, java.lang.String, java.lang.String) - - - - - deleteIdentity - i2p.bote.web.JSPHelper - - boolean deleteIdentity(java.lang.String) - - - - - isCheckingForMail - i2p.bote.web.JSPHelper - - boolean isCheckingForMail() - - - - - getMailFolder - i2p.bote.web.JSPHelper - - i2p.bote.EmailFolder getMailFolder(java.lang.String) - - - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/WEB-INF/web.xml b/apps/i2pbote/WebContent/WEB-INF/web.xml deleted file mode 100644 index 3aa2f2fc9..000000000 --- a/apps/i2pbote/WebContent/WEB-INF/web.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - i2pbote - - index.html - index.htm - index.jsp - default.html - default.htm - default.jsp - - - - i2p.bote.web.ServiceInitializer - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/buttonFrame.jsp b/apps/i2pbote/WebContent/buttonFrame.jsp deleted file mode 100644 index 3e519a4ad..000000000 --- a/apps/i2pbote/WebContent/buttonFrame.jsp +++ /dev/null @@ -1,47 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - - - - - - - - - - - - -
- -
- Checking for mail... -
-
- -
-
- - -
-
-
-
-
- -
-
- - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/checkMail.jsp b/apps/i2pbote/WebContent/checkMail.jsp deleted file mode 100644 index ac66b1e7e..000000000 --- a/apps/i2pbote/WebContent/checkMail.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - - - - - - - -

-TODO checkMailTag, show status at the bottom (or top?), -point the Inbox link here or just check periodically and when the Check Email button is clicked? -

- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/deleteIdentity.jsp b/apps/i2pbote/WebContent/deleteIdentity.jsp deleted file mode 100644 index 3b6451bcc..000000000 --- a/apps/i2pbote/WebContent/deleteIdentity.jsp +++ /dev/null @@ -1,21 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - - - -
- Error: ${errorMessage} -
- -
\ No newline at end of file diff --git a/apps/i2pbote/WebContent/editIdentity.jsp b/apps/i2pbote/WebContent/editIdentity.jsp deleted file mode 100644 index 4cd5181ff..000000000 --- a/apps/i2pbote/WebContent/editIdentity.jsp +++ /dev/null @@ -1,82 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - - - - - - - - - -
- ${param.errorMessage} -
- -
-
- - - - - - - - - - - - - - - - - - - -
-
Public Name:
-
(required field, shown to recipients)
-
- -
-
Description:
-
(optional, kept private)
-
- -
-
Email Address:
-
(optional)
-
- -
- Email Destination: - - - - ${fn:substring(key, i, i+64)}
-
- -
- - -
- - -
- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/folder.jsp b/apps/i2pbote/WebContent/folder.jsp deleted file mode 100644 index 436301662..000000000 --- a/apps/i2pbote/WebContent/folder.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - -This is the ${param.path} folder. - - - - - - - - - - - -
SenderSubjectSent Date
${email.sender}${email.subject}${email.sentDate}
- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/footer.jsp b/apps/i2pbote/WebContent/footer.jsp deleted file mode 100644 index 691287b6e..000000000 --- a/apps/i2pbote/WebContent/footer.jsp +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/header.jsp b/apps/i2pbote/WebContent/header.jsp deleted file mode 100644 index 8075e233c..000000000 --- a/apps/i2pbote/WebContent/header.jsp +++ /dev/null @@ -1,53 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - ${param.title} - I2P-Bote - - - - -
-
I2P-Bote
-
-
Secure Distributed Email
-
- - - -
- - - - diff --git a/apps/i2pbote/WebContent/i2pbote.css b/apps/i2pbote/WebContent/i2pbote.css deleted file mode 100644 index 0e56379b3..000000000 --- a/apps/i2pbote/WebContent/i2pbote.css +++ /dev/null @@ -1,318 +0,0 @@ -/* Based on the router console css */ - -body { - margin: 15px 0 0 10px; - padding: 0em; - text-align: center; - background: #eef; - color: #000; - font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; -} - -.titlebar { - width: 800px; - margin: 0px 20px 20px 240px; - background-color: #fff; - color: #310; - padding: 0 15px 15px 25px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #001; - text-align: center; - -moz-box-shadow: inset 0px 0px 1px 0px #002; - white-space: normal; - background: #ddf url('images/lightbluetile.png'); - opacity: 1.0; -} - -.title { - font: normal bold 20pt/120% 'Lucida Sans Unicode', 'Bitstream Vera Sans', Verdana, Tahoma, Helvetica, sans-serif; - font-weight: bold; - letter-spacing: 0.15em; - text-shadow: 0px 0px 1px rgba(0, 0, 148, 0.9); -} - -.subtitle { - font-size: 8pt; - color: #cf0606; - letter-spacing: 5pt; - text-shadow: 0px 0px 1px rgba(148, 0, 0, 0.9); -} - -.checkmail { - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - color: #555; -} - -.menubox { - float: left; - width: 175px; - margin: 0px 0px 10px 10px; - padding: 10px; - text-align: left; - border: 1px solid #000033; - background: #ddf url('images/lightbluetile.png'); - color: #000; - font-size: 8pt; - clear: left; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: inset 0px 0px 1px 0px #002; -} - -.menubox a:link, .menubox a:visited { - text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.5); -} - -.menubox a:hover { - text-shadow: 0px 0px 0.5px rgba(255, 255, 255, 0.7); - color: #f60; -} - -.menubox h2 { - font-size: 12pt; - color: #001; - letter-spacing: 0.05em; - text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5); - wordwrap: none; -} - -.main { - width: 800px; - margin: 0px 20px 20px 240px; - padding: 0 15px 15px 25px; - background: #eef; - font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - text-align: left; - color: #001; - border: 1px solid #000033; - background: #ddf url('images/lightbluetile.png'); - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: inset 0px 0px 1px 0px #002; -} - -.infoMessage { - margin: 0px 20px 5px 240px; - text-align: left; - color: green; -} - -.errorMessage { - margin: 0px 20px 5px 240px; - text-align: left; - color: red; -} - -img { - border: none; -} - -a:active { - color: #900; -} - -a:link { - color: #007; - text-decoration: none; - font-weight: bold; - word-wrap: break-word; -} - -a:visited { - color: #606; - text-decoration: none; - font-weight: bold; -} - -a:hover { - color: #f60; - text-decoration: underline; - font-weight: bold; -} - -a:active { - color: #f93; - text-decoration: underline; - font-weight: bold; -} - -button, button:visited { - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #999; - padding: 1px 3px; - background: #ddf !important; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - margin: 0 1px; - text-align: center; - min-width: 80px; - -moz-box-shadow: inset 0px 2px 8px 0px #fff; - color: #006; -} - -button:hover { - border: 1px solid #f60; - background: #f60 !important; - color: #fff; - -moz-box-shadow: inset 0px 0px 0px 1px #fff; -} - -button:active { - border: 1px solid #f60; - background: #001 !important; - color: #f60; - -moz-box-shadow: inset 0px 0px 0px 1px #f60; -} - -.underline { - border-bottom: 1px solid #000022; - padding: 5px 0px 5px 0px; - margin: 0px 0px 10px 0px; -} - -input { - background: #eef; - color: #001; - margin: 5px 10px 5px 10px; - padding: 4px 2px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #001; - text-decoration: none; - min-width: 110px; -} - -input, input:visited { - border: 1px outset #999; - background: #ddf; - color: #001; - margin: 5px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - padding: 1px 2px; - text-decoration: none; - min-width: 110px; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - -moz-box-shadow: inset 0px 2px 8px 0px #fff; - color: #006; - opacity: 0.9; -} - -input:hover { - background: #f60; - color: #fff; - border: 1px solid #f60; - opacity: 1.0; - -moz-box-shadow: inset 0px 0px 0px 1px #fff; -} - -input:active { - background: #002; - color: #f60; - border: 1px solid #f60; - opacity: 1.0; - -moz-box-shadow: inset 0px 0px 0px 1px #f60; -} - -input[type=text] { - width: 100%; - background: #eef; - color: #001; - margin: 5px; - padding: 5px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #001; - text-decoration: none; -} - -input checkbox { - border: 0 !important; -} - -textarea { - width: 100%; - padding: 5px; - margin: 5px; - background: #eef; - color: #003; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - min-height: 100px; - border: 1px solid #001; -} - -submit { - background: #f00; - color: #eef; - margin: 10px 2px 10px 0; - padding: 2px; - font-family: "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - font-weight: bold; - border: 1px solid #001; - text-decoration: none; -} - -select { - background: #eef; - color: #003; - padding: 2px; - margin: 5px; - border: 1px solid #001; - font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - text-align: left !important; -} - -.identities table { - table-layout: fixed; - width: 800px; -} - -.identities td, .identities th { - vertical-align: top; - padding: 0px 30px 0px 0px; - white-space: nowrap; - overflow-x: hidden; -} - -.ellipsis -{ - line-height: 1.2em; - height: 1.2em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - width: 100%; - -o-text-overflow: ellipsis; - -moz-binding: url(moz_fix2.xml#ellipsis); -} - -.moz-ellipsis > DIV:first-child -{ - float: left; - margin-right: -26px; -} - -.moz-ellipsis > DIV + DIV -{ - float: right; - margin-top: -1.2em; - background: url('images/lightbluefade.png'); - padding-left: 26px; -} - -.moz-ellipsis > DIV + DIV::after -{ - background: url('images/lightbluetile.png'); - content: '...'; -} \ No newline at end of file diff --git a/apps/i2pbote/WebContent/identities.jsp b/apps/i2pbote/WebContent/identities.jsp deleted file mode 100644 index aec9ac4e9..000000000 --- a/apps/i2pbote/WebContent/identities.jsp +++ /dev/null @@ -1,72 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - -
- ${param.infoMessage} -
- -
-

- Email Identities -

- - - No email identities are defined. - - -
- - - - - - - - - - - - - - - - - -
DescriptionPublic NameEmail AddressKey
- - -
- ${identity.description} -
-
-
- ${identity.emailAddress} -
-
-
- ${identity.key} -
-
- Delete -
-
- -

-

- -
-
- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/images/darkbluetile.png b/apps/i2pbote/WebContent/images/darkbluetile.png deleted file mode 100644 index 89df70b960574329efe68890e5c3303e8bbefef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5mnSp^(qp;Z;$T0};32|j$aA9BwVPJ4(U;wgB z7#Kns7>pShOc@y57#N%w7=lAsHv;8CSvEEUIcyu7+_yLqo%#Z&P-jdu<=KCSqgK(JoQ#FuVOmV)HkM%8O!vsn4d? oo~T{;OkH}&M2EM}}%y>M1MG6B0 zYnP{sV@SoEx3^CgMW+h1J+$jOd}tCgr?bohxrhegIh6^=ryZy@nB2{5WN0~^@tBWm zVBw|$q3*@;sjkz`6-qDO6#MjfbjjAW*B0L0QyI$VDyn|3YemwGe;aQ8`c!HBFZJ>2 zQ1vts{!a>Ev|#V@tp73De*&^=zkc|eA@{@)gi2WCP5#7muROoMarVa?L#ynKmT~^> z&%fWOS-W(f)LeV7zs6?qGgs-mKVSc?O3SML__LEIZ`n(R#>RKOn*U<|jUa!QuLi%k zb+?LNt*UeX93+ zm(KUcq1~1^6PK>E>$|LPa@Akz)uRn^_gBp~ySj7jugG9qv8&JDZWX>NZhcLk-Bc}W zYv}&073pnT{{`l6z4GwP+G)3H<}Q=g^}Dm;qt)@vuiq3bKKFlj;N?=W%db<+odlW$ zS`=6mIUG3#1@i(Arh*UPuvzwy4#->F9S7uQeQH?Pv{n!T=Z`0`&5 z&xGs`__aeyx-|aT?B7+-qH=1k+_RtgYW?)@*Z%77ex0B4H!FC5;I|rmvpl~qS0C_S z{?mUky7PE?^52}`dcAAYqkdIAYk#)yckLIsBa4sKsmkq@e*JvW@4FH8`_Jf1pZT%Q zVzbSU=Y02m2isWf|N1u&C>*0|_yz$JP?3eGS{q#<)TLg6B^qJPWf8QF_FFnJ* z-~Qr$;k~;r>i#{vG-8MGi|eP)9D4g=-Igz3&s;tDS$tpa%l(?4ub=wk5`R7>|7AYU zx0|{9gYHFtk9Yrm@Eg!`)mOrqna_&N{n_Mg>}I{dxc4H*T+WzVzy2P{keMs8cp>}Qz(000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0004MNklYk2Lzg~*gV4n+UEQQ9 z#cm}DHej+ykbv}@gUYR#pASCHchBEF_oo4e(W|T%Z~{GnH-=$+p=IWJRLNm9i(*Wg zp=F|eHBA$CyB%z|TOf_TXCY2jr^1G?`)oR$!elZ5S(e$ErYScdtX3pE+ii1cQ&scmo}Xc?dAUXmnex7#on4A{9|uc6!RLJ$PtI1Xr< z2FvC09YdeUeYN4}*oVqvkH}l3L6cpL7fD1xRCt`lSba>DWfVX6gUc0e0v9dfqE-^12q8mlbs5t|Z9zGm zZVbz<<(wDh#~-z!ZDi@RS%27;VoxxdYTUd?F;Tkos$ zZ|f;3F!4foLAp|WWV{$YKI%HP6u7z}SF1MYrGe=AT~O_2}WaOP()G=2b+^j$Cvebl_j2Hn3r3;BucM?Ac88+sCv zXTHg3jLj?>#@dIrZwK&t0g8$sD@zJv{r&x-&-}s0Mj;o^ znB6&RmeV#mDlKuz60q59VxWi(QJ?wt@o``|V%yX_R50P@#9UX0I5-%5=fH=dfcZ53 zhsnhJ2`xjlUm4`Ak>ijuhD>ZMyf4N{j^$ZTF%W*l91#Qp1Kx;PGAO=zy^%cQGZ~^y z8xPr0_UvR=3V<((N{RY<@XNr?J5K*vFrrpAS7f zv3%naDd4nI-Q1 z`@v?lhDHhssQAw%kEn8RyMycpl;H|CY=B!sLzk&rMl_k|WO`{d8g`;VXI@^3XYXFH z(WD~MGf`%&-m*pHA#P#e!r&Oou{`UszHH}zbxs&=sI0WNZ`>GiibLs&6>#qQb!cmA z6N2sS?QrTcZPN1P(zqH52^o$=j+L`WOA8ggwZ+9DuASzg;{ucPThT;q zfbLsLN(yv#b^`tElS%|SezdjC@DFM@rACv~=lG z;ao*Ug{F+}+ixQ5vHfDH0P%oIi4=XT6bs-2hc zK?SF2`D^rU`-80S$hF2X@mWoDD%`o9L?0cZ+Pl;oX2dZY0v~^_KhYFm{NzJ`TYm-n z7pYu*=O6L8mFP2et~td3?;oE*oAf9l`7vRTvfqlkR1qS4&HH4tl2d2=R8Cst|FJwF jaGl>xeoQk6=Vty3)E|I^+PrRf00000NkvXXu0mjf7tJ0E diff --git a/apps/i2pbote/WebContent/images/favicon16.png b/apps/i2pbote/WebContent/images/favicon16.png deleted file mode 100644 index ba34d12c7a2c69c077e853bc5f055b20f7697d61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmV;*0yX`KP)Px%gh@m}R4C77QcF)$VGy0~_Pc3I+hEZ^kW%_mF%eTYbfHEqiAd^22n6T@wY;Q- zrA84ppb=K0Cb*FwAPeOst`JB}Se5R0nJ6_aEjB^YmI5ukcU+W|2G43TnR7C8<`6^# z002lAgb>IABA)1w3?U8Q#)jAHO(c>!z0PDZWpj=u5pgdb7X%@dNL=bUtadCZZ6%i2;I1A_MbR*)>;Lw@80&A0Pa$<5}ZoaptSFb&1ynH2@ zOtiOkD05F=IA7ZN$R!f9Vy#YBR(7e`@u01}W#s)x>BUlwR%5O(=jAD9zI@%;`MVYR z6Ap(Dlc}}UHAZjH|N6NxJvk+p%j^z&_KA*WM^27pc6QF^^ASP_0fj=r+`M&TX=%yh z@yO*0sYIIX4**D|IicWIC=>#KL?Y2-ZD2T#6N|+Q3*V#BXu$6$gk<~;ZU$q!y8wU) zhnc}UXR061G8s!P-a5rdnX zb+z@r-+oF(GMVh!^{Wzzcx8EYefz>9uL>Cpo5c--1(^?1B2%N{?K z5J3aIGygUqu;B9Oz##9tLJatkt2yQM8X3)V&q~I#JI5>!-lc3nr zr5)A9)urHjsfD5i!L(qcq5mFONzwPnCBz(u_cSGmu^(Kx9KQ2?ALpJ6fQTFrk)((y z`e0C9#h3iYxfADrlfWc!EPLrKTI*|;Wqpb3Z-4|KfC5lTwGfdrA7=B?jq=p6c%CO= z7>>jy2@x3*k<8visysC;7w&8UGhG31voM|Omz*P4++2lUV?YCfKEwQj7NlFdn6)zVKWZVIL>_q5QgD--}je-AlR3HZQD()_1#P+GxPUTh)9CyRV*M$ mXA=z2j89uBB{5$qrQ|nD?$tE4@6Dh90000pI21!IgRCt_aR9{F_VH7|2-tFG0b4p_WL6?fAkebsCZ^VT4kQGLu zLN6-wtj$vv!@YrX zM}tq;GFj1ZVz)a>9v+^8^>sIFY`D?nSrEm7ex>w?hzs9o z?uiMBxLg5ZFo>kK_LZWC=fywl?(XghN~P5bFf`N-dc7WOwh|?=*DJ-cI-PD)RpRq` zpsQcX>%nHSxphWkDe3L~M*8}GlJxWn zT8ZO8Z?G&aw&5Cv z_5C;YXDQZbw9gY0&*-YF??YNzMi~9(=5J_ieF%$-^RnOXF9Z1Wa*v2*O^*2Z!ocY0 zw&G($!#LJrAqfeWNm9}k+8vUTQbe52H3g?}F)=puJKw3?$H6qSEO)oA?hz9a5gZm# zEX2-zfbQ-Iuv%?6(Hy!bgNoDN#zqJB#8ZwVk&h$D1_A*;hxLcaud2EMD=S~2va%eC zi*FymR6-P@K_v@ro)-q2n;(EI`wj$RCg6Dv;^K~lC7|(0G>ay`SB*tq%=ZBNk4s9* z7`y#Wc+)~_WTYS3+a16#T$3!Ht^*kGA8s-3b1q?q2A|KHgC+7Rz;PNGzZhS3cDCyQ e&b*0(#bJuq*(*fVrwli2|yo2u?sB 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 V=lBNh4q7rmMnX}%O4K;y{{SSQp_u>x diff --git a/apps/i2pbote/WebContent/images/i2pbote_en.png b/apps/i2pbote/WebContent/images/i2pbote_en.png deleted file mode 100644 index 1daf2af2eace06ffd22994041843476786b94f7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16251 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 S&c`%8Kw4ZutWv}<@c#jr6$_{U diff --git a/apps/i2pbote/WebContent/images/info.png b/apps/i2pbote/WebContent/images/info.png deleted file mode 100644 index 13f25a9aefc55baaa710c82cf6158c38f890e8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 780 zcmV+n1M~ceP)pHzDYzuRCt_iQh!KOQ4~J!wddPf!=^GUl@Sz3LZNf4LIzqcrN~f9 z{|ZqUWQ0RZA@D~jriidV`bR=T0w<9mWRfnF0x6KGi~@;7LNGNlYHs8Gyxn_sug&?v zdmQdL_q*Tu&H}g<%QfWlZ6V^H%hidD zM(4ZzAXyK17R#(4**_;k(Y3X$ThK8QP;ul@&24j~kq>*7HG0000< KMNUMnLSTY>g=U%n diff --git a/apps/i2pbote/WebContent/images/lightbluefade.png b/apps/i2pbote/WebContent/images/lightbluefade.png deleted file mode 100644 index b79947d3efacd5956ec7eb7fc3542bb434687a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T3!3HF&Ggs6BDaPU;cPEB*=VV?2IZHfU977@w zzrAS9cgR4X<)Nb4$75nUmfrk*zmdB@VE%y%2`2?b3^j!OC-V9J%-$|pyZZ0LO~qUr z1%rgzW<8vH=r%{Zkkjh~WvAB{s_ORtv97R?0J#*a?;1cld9)m{-kbP0l+XkK{|H=u diff --git a/apps/i2pbote/WebContent/images/lightbluetile.png b/apps/i2pbote/WebContent/images/lightbluetile.png deleted file mode 100644 index e7fc6c1f12ab57637c3c0858a74ad87643a76b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 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 P{a&bu@Mts?mRS5BVF=Fk diff --git a/apps/i2pbote/WebContent/images/mail_mark_unread.png b/apps/i2pbote/WebContent/images/mail_mark_unread.png deleted file mode 100644 index e07161c1620aaa3ba390f5e177ae4f81986ffcd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*yM zqGce=SbMeU3{X(A#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFy~civXVx zSD@nm|NjF?l0fyWy=_a6cPu&5x9Y^ib?2t6IX-*K<=I=W&fk7v(T*!i_TE^!@Ak@l z*H#_8yZ-R4O-HV8I`L%l@jF|N-r9ZQ+JSR-k6yTY?8=klmmeL!`r_n`Hz#krJAL*3 zxf_qq-F$ZO-lwaNzFd3!_4>W%*B`vP{^-k%2QP0ue0}Tb*V~Uj+Nd4{twye+L8~zrFkP~~KdAc};RNT6H`FPkN2Z^?aoQ4yXT&v#i{jLX$KS4%8>8_xr@Ad3z^$pDJ4bin? zn}0luJ(DKzt$V*9$2mWN1P;!lLMK`6J0m&-6l3Qqs0t`q-Td=6)-+$YWnQg&IL4vis7C9Si_2vLb5|UBClJ%T=;n>O zh-~Szu6eBw+Aedfs`-9kIhWZrWtQ#Ip?jA(1&a3W+cj5V$L)-pSH1e(S8m(BO_-&B zPU1n4g{Q1yXLiltI{cO6Ah*O%S=nc`f9;A(Wc~?mclvPd)vn<4)h($ diff --git a/apps/i2pbote/WebContent/images/sandtile.png b/apps/i2pbote/WebContent/images/sandtile.png deleted file mode 100644 index 4d88cb84740316d941ccd5b6a5ef0de5ccf4e519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1392 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5kiGhJJ)Rr?I$l)yTh%9Dc;5!V$jK}j=q%bhB zDtWp%hE&XXd-rT!bgD?}!{R%Oj;-VB^mI^qcxpxgFV7B}WhD`Y$v#ak8FK@!Sa59E zIJxcE%DEfn%-p}Hl-s$(x zueT|ge*cl|u_(_qQ;%RLy4GF&_v3E($7{x~8=K`Mqna|1MtoJmY`Gj_p6+ z-MK3xJ7=!FJpcZPQnA01*LpTJX=r!QpYZto=%=}_an`JdwsWF=i?8@>pY`oi2 z|NHU&=+8GlXFqrUYu=v!{NLiAb044lGq3w+%7)^q-IWDJJ2oEsQ}Vpz@vNWM)i=+b zpEp0xCT)pOjKLbN9%uzhRqp|*=-$Y+;BW*`QRzpZiljA65L3f=M~$Iw*vNNm{KvRe XQLsMVu_G2(gfe)#`njxgN@xNAZith+ diff --git a/apps/i2pbote/WebContent/images/tabletile.png b/apps/i2pbote/WebContent/images/tabletile.png deleted file mode 100644 index f34c0632479b019d2b68c852a705323e6e5767ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvEiGhJ})y~t$fE>;OkH}&M2EM}}%y>M1MG6B0 z^HWb3$B>FSZ*QK?6Lyqvc{uMutGUA@c7{X0_Y0}?9pQ6q=oRN{lgx9HTHTRr`L}z$ z*y3p$t)4!55fRvS^>^;A8m?ui&J5RXk-LgOY=ld<@{a2#;<<=4*%c^((_J0*) zZk5nD;-JXJWf;)W=)@zEv_OD%LT%;WZ-32=-j`uNfAzMS$|cWNZ`*hCb>-b@;qF!Y z@?LNMZMR(d+`p*j+nP)BtfHR(7Ix%t5@-@=QD9NzKw(yW=|vX(@2vUle_y?NV?y56qIoZX-M>`$eY{p-gyH_hfR`~3Ok z*Wh{Ymwm33e}4L-!94wC*ZnL18C;V%|NL?H;-<1im(|^tyD#_e@#{bL{&UMY{vL@H z3RXNv93W_^VUhwH1ZlPNF&heiQ9x#oL`Ne8omzMps+K22N*Ss)X+hBo1BhAy=BdYE nY9&_4j2aCJkQMyQwam|2^S<1;OkH}&M2EM}}%y>M1MG6B0 zi>#-MV@SoEw|DP)O$n4~{rLA>hme-(R}nwq)+K)9vm`E8ac5UAWuw?pFE#`~IHX`{C5u$BO)wC!FOzU3m3!+P{5f z?`PjqlLiY+Xt&u?mG`k$cmG7Y4G*Fp-pP4md^<$MD^SCAp-5{G8e_`4v)jM^i}`l` z{l0&Vs`K|3b8Ajn6wu|Q$+c92c*f=Z`qtIg%i^}woqPWF&EGdRIo9l-&$F|?{j(ug z-)jEW&-|M|C*Q8y_4D(&+N1BHctnyG2r#!wXdH1+WaBan=xB7JozTlT+1}kZ?VBvV z=XBS_O7DWz64kx-ZuY7kyw>6}H!OQ>p+qPbJQ-Awt3Geq?LElfN ze!6@zb<3x}J9_Q5uKjCPbLnzz`L*XI*V21`CzSv4jGgCazjEpO{`Bwqn}09<_wM-H zPubG%wjVsK`tI)Q#UHs|#N0J+;OkL~Z#!R`T+({fOTtiq*)SlpN1~$@i-r>p<~ diff --git a/apps/i2pbote/WebContent/images/tabletilelighter.png b/apps/i2pbote/WebContent/images/tabletilelighter.png deleted file mode 100644 index 5586bb0635f0adfd89b8898a6e29a60833c7afe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5kiGhJJ)Rr?I$l)yTh%9Dc;5!V$jK}j=q%bhB z1bMnRhE&XXd&@IVI8lK0LDpLE*|F&$sL*ZxPX^s`)L(J9gYnN8+z{wX)xW!rX?#y`t_YI?5(k1>H1Ra--}jz>m470H&sk8uLPsN`tM)WtpBR_{u3BQ zz21H9Z(Q{|^_b`4(Z7_#f2yuCxaO6#Rs}n8=|$At*H8cbn)O%q`>o6`QP@@C)Q%#t zxxQ95ly`O5r#W>~AMbp=9A1mFiZAhzMl+IN$#K{MGZN!p|Nq4$sdo{aO)FziMAkcJk-vg?Hns{{79b z+mx~I^7;L@=GphYewX_BcwJr9zdxJjzrWiuGvbJn*v4BIIwE+_f><3_+uXpkt4@+& zH(0U*FZ0$mha*`fYCxT?Ys^eQCg4?$tl-)*0|-cF$Vw&pf=Tz%mK_Fry>3z7Z=JA6$px62y0ba2RIIV_k diff --git a/apps/i2pbote/WebContent/images/tabletitlelight.png b/apps/i2pbote/WebContent/images/tabletitlelight.png deleted file mode 100644 index 9c9092e7372739d8bd1deeabd0c125a81dc29c6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^Aht9I69WU|-n%=UfE>;OkH}&M2EM}}%y>M1MG8=G zs;7%%NX4AwJ^y~&Gcz-v{>#my@alfNz|kWNj1HD+3s{5$L{yIKcz&$DgXMHTe}JmN zQisSDp8oHfLjU~g$yCrfTJh;@J)6pbPyaZXx&EK$7qJs&W_GPv!7TW!{#QrV{paQt zZ_|H%m+t*Pebu|gH|oXr|4To>8*y*{A!Y8K4eKkG{{MGGyH`x?#ijrMA5M1resaS^ aHinJTmXA74c0LC>kipZ{&t;ucLK6Urs$5Y3 diff --git a/apps/i2pbote/WebContent/images/wait.gif b/apps/i2pbote/WebContent/images/wait.gif deleted file mode 100644 index cce9681fca0f7aeac8bc6159a4bf734463e920ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2182 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 - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/moz_fix2.xml b/apps/i2pbote/WebContent/moz_fix2.xml deleted file mode 100644 index d308c4a97..000000000 --- a/apps/i2pbote/WebContent/moz_fix2.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/newEmail.jsp b/apps/i2pbote/WebContent/newEmail.jsp deleted file mode 100644 index 6495c50e5..000000000 --- a/apps/i2pbote/WebContent/newEmail.jsp +++ /dev/null @@ -1,59 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - -
-
- - - - - - - - - - - - - - - - -
- From: - - -
- - - -

Message:
- - - -
-
-
- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/newIdentity.jsp b/apps/i2pbote/WebContent/newIdentity.jsp deleted file mode 100644 index e4eb58138..000000000 --- a/apps/i2pbote/WebContent/newIdentity.jsp +++ /dev/null @@ -1,13 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/noIdentities.jsp b/apps/i2pbote/WebContent/noIdentities.jsp deleted file mode 100644 index c63b550c8..000000000 --- a/apps/i2pbote/WebContent/noIdentities.jsp +++ /dev/null @@ -1,43 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - - - - - -
-

No Email Identity Defined

-

- In order to receive email from other people, you need to create an email identity - first. -

- This is similar to traditional email where you first have to set up an email account - with an email provider. The difference is that in I2P-Bote, there is no provider that - can read all your email because I2P-Bote stores all emails encrypted on the network. -

- I2P-Bote automatically decrypts emails sent to you, using the email identity you - created. -

- An email identity has a secret key, and a public key. Anybody who has the secret key - can download and decrypt your emails, so you should never give it to anybody. The - public key, on the other hand, allows people to send email to you. Think of it as - the equivalent of a traditional email address. Give it to everybody you want to be - able to contact you, or make it public. -

- [TODO paragraph about spam, HashCash]. -

- You will find that email identities are long combinations of numbers and letters, - and that they are impossible to memorize. I2P-Bote lets you assign an email address - to an email identity to make it easier for you and your contacts to remember. -

- [TODO name attribute, address attribute]. - The public addressbook should not be 100% trusted. Only destination keys are secure. -

- [TODO private address book, address directory]. -

- -
-
- - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/saveIdentity.jsp b/apps/i2pbote/WebContent/saveIdentity.jsp deleted file mode 100644 index f865ab996..000000000 --- a/apps/i2pbote/WebContent/saveIdentity.jsp +++ /dev/null @@ -1,31 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/i2pbote/WebContent/sendEmail.jsp b/apps/i2pbote/WebContent/sendEmail.jsp deleted file mode 100644 index aa74b3b1d..000000000 --- a/apps/i2pbote/WebContent/sendEmail.jsp +++ /dev/null @@ -1,13 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> - - -<%@ taglib prefix="ib" uri="I2pBoteTags" %> - - - - - - - - \ No newline at end of file diff --git a/apps/i2pbote/doc/techdoc.txt b/apps/i2pbote/doc/techdoc.txt deleted file mode 100644 index 575f0c660..000000000 --- a/apps/i2pbote/doc/techdoc.txt +++ /dev/null @@ -1,462 +0,0 @@ -I2P-Bote Ver. 0.1 ------------------ - -1) Introduction - -I2P-Bote is a serverless pseudonymous email exchange service for the I2P network. Emails are -stored encrypted on other I2P-bote nodes. -There is a SMTP/POP interface [TO BE IMPLEMENTED] to use with an email client, and a web interface -[TO BE IMPLEMENTED] that lets you change settings or send/read email. - -Email can be sent through a number of other nodes (relays) for increased security, or directly to -a set of storage nodes for faster delivery. The same applies to retrieving email. -All nodes are created equal. There are no "supernodes" or designated relay/storage nodes. -Everybody acts as a potential relay and storage node. The maximum amount of disk space used for -relayed/stored email packets can be configured by the user. -Before an email is sent to a relay, it is broken up into packets and encrypted with the recipient's -public key. - -Email packets are stored redundantly in a distributed hash table (DHT). Stored email packets are -kept for at least 100 days, during which the recipient can download them. -For relays, the guaranteed retention time is only 7 days. -If a node runs out of email storage space, and there are no old packets that can be deleted, the -node refuses storage requests. - -〮Email addresses are entered in the format "username@domain.i2p"; they must match an entry in the -local address book or the distributed email directory. An exception are addresses of the form -"dest_key@bote.i2p", where dest_key is a 516-byte base64-encoded email keypair. No lookup is done -for these addresses; the dest_key part is directly used for routing the email. - -Below is a diagram of how an email packet is routed from a sender to a recipient: - - - .-------. .-------. .--------. - | Relay | ----> | Relay | ----> | Storer | --------------------. - _ `-------' `-------' `--------' `\ - /` | - / | - .--------. / .-------. .-------. .--------. | - | Sender | -----> | Relay | ---> | Relay | ----> | Storer | -------------. | - `--------' \ `-------' `-------' `--------' `\ | - \ | | - _\/ | | - .-------. .-------. .--------. | | - | Relay | ----> | Relay | ----> | Storer | ------. | | - `-------' `-------' `--------' `\ | | - | | | - V V V - - .--------------- Kademlia DHT -------------------------. - | .---------. | - | .---------. | Storage | | - | | Storage | .---------. | Node | | - | | Node | | Storage | `---------' | - | `---------' | Node | | - | `---------' .---------. | - | .---------. .---------. | Storage | | - | | Storage | | Storage | .---------. | Node | | - | | Node | | Node | | Storage | `---------' | - | `---------' `---------' | Node | | - | `---------' | - `------------------------------------------------------' - - | | | - .-------. .-------. .---------. _' | | - | Relay | <----- | Relay | <---- | Fetcher | <---' | | - / `-------' `-------' `---------' | | - / | | - \/_ | | - .-----------. .-------. .-------. .---------. _' | - | Recipient | <---- | Relay | <--- | Relay | <---- | Fetcher | <----------' | - `-----------' _ `-------' `-------' `---------' | - |\ | - \ | - \ .-------. .-------. .---------. _' - | Relay | <----- | Relay | <---- | Fetcher | <-----------------' - `-------' `-------' `---------' - - -The number of relays for sending or retrieving an email is user-configurable. For higher performance (but -reduced anonymity), it is possible to use no relays, no storers/fetchers, i.e. sender and recipient -talk to the storage nodes directly. - -TODO explain how an index packet is relayed back to the recipient, who then uses another chain to get the email packets -referenced in the index packet. - -The code is licensed under the GPL. The author can be reached at HungryHobo@mail.i2p, either in -German or English. - - -2. Kademlia - -TODO explain modified Kademlia: index packets, 2-stage retrieval; -exhaustive Kademlia search for index packets, standard Kademlia search for email packets; -no need for exponential expiration time (used in standard kademlia to prevent over-caching of popular files) because -emails are only retrieved once (or a few times if there is a transmission error). - -TODO mention the problem of highly unbalanced trees and the sibling list solution. - - -3. Packet Types - -3.1. Communication Packets - - Communication packets are used for sending data between two I2P-Bote nodes. They contain a - payload packet, see 3.2. - All Communication Packets start with a four-byte prefix, followed by one byte for the packet - type, one byte for the packet version, and a 32-byte packet ID. - Strings are UTF8 encoded. - - Packet Type | Field | Data Type | Description - ---------------------+-------+------------+---------------------------------------------------- - Relay Request | | | Request to a node to forward a Relay Packet - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'Y' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID, used for delivery confirmation - | HLEN | 2 bytes | HashCash length - | HK | byte[] | HashCash token (HLEN bytes) - | DLEN | 2 bytes | Length of DATA field in bytes, up to ~30k - | DATA | byte[] | A Relay Packet - ---------------------+-------+------------+---------------------------------------------------- - Fetch Request | | | Request to a chain end point to fetch emails - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'T' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID, used for delivery confirmation - | DTYP | 1 byte | Type of data to retrieve: - | KEY | 32 bytes | DHT key to look up - | KPR | 384 bytes | Email keypair of recipient - | RLEN | 2 bytes | Length of RET field - | RET | byte[] | Relay packet, contains the return chain (RLEN bytes) - ---------------------+-------+------------+---------------------------------------------------- - Response Packet | | | Response to a Retrieve Request, Fetch Request, - | | | Find Close Peers Request, or a Relay List Request - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'N' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet Id of the request packet - | STA | 1 byte | Status code: - | | | 0 = OK - | | | 1 = General error - | | | 2 = No data found - | | | 3 = Invalid packet - | | | 4 = Invalid HashCash - | | | 5 = Not enough HashCash provided - | | | 6 = No disk space left - | DLEN | 2 bytes | Length of DATA field; can be 0 if no payload - | DATA | byte[] | A Payload Packet - ---------------------+-------+------------+---------------------------------------------------- - Delete Request | | | Request to delete all copies of a packet by DHT key - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'D' - | VER | 1 byte | Format version (only ver. 1 is supported) - | KEY | 32 bytes | DHT key of the packet that is to be deleted - | DEL | 32 bytes | Deletion key, encrypts to DEL value in the email pkt - ---------------------+-------+------------+------------------------------------------------- - Ping | | | Check to see if a host is still up. - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'P' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID - ---------------------+-------+------------+------------------------------------------------- - Pong | | | Let the the pinger know we're still there. - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'O' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID of the corresponding Ping packet - | HKS | 1 byte | Minimum HashCash strength this node will accept - ---------------------+-------+------------+---------------------------------------------------- - Relay List Request | | | "Send me your list of relay peers" - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'A' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID - ---------------------+-------+------------+---------------------------------------------------- - - DHT Packets - - Packet Type | Field | Data Type | Description - ---------------------+-------+------------+---------------------------------------------------- - Retrieve Request | | | DHT Request for a value for a key - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'Q' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID, used for delivery confirmation - | DTYP | 1 byte | Type of data to retrieve: - | | | 'I' = Index Packet - | | | 'E' = Email Packet - | | | 'K' = Email destination - | KEY | 32 bytes | DHT key to look up - ---------------------+-------+------------+---------------------------------------------------- - Store Request | | | DHT Store Request - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'S' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID, used for delivery confirmation - | HLEN | 2 bytes | HashCash length - | HK | byte[] | HashCash token (HLEN bytes) - | DLEN | 2 bytes | Length of DATA field - | DATA | byte[] | Payload packet to store (DLEN bytes). Can be an - | | | Index Pkt / Email Pkt / Email Destination) - ---------------------+-------+------------+---------------------------------------------------- - Find Close Peers | | | Request for k peers close to a key - | PFX | 4 bytes | Packet prefix, must be 0x6D 0x30 0x52 0xE9 - | TYPE | 1 byte | Value = 'F' - | VER | 1 byte | Format version (only ver. 1 is supported) - | PID | 32 bytes | Packet ID, used for delivery confirmation - | KEY | 32 bytes | DHT key - ---------------------+-------+------------+---------------------------------------------------- - -3.2. Data Packets - - These are always sent wrapped in a Communication Packet (see 3.1). - E denotes an encrypted field. - - Packet Type | Field | Data Type | Description - ---------------------+-------+------------+---------------------------------------------------- - Email Packet | | | A email or email fragment, 1 recipient. - | TYPE | 1 byte | Value = 'E' - | KEY | 32 bytes | The DHT key of the packet (generated randomly) - | DELP | 32 bytes | Deletion key in plaintext, zeroed out for retrieving - | LEN | 2 bytes | Length of the encrypted part of the packet - | DELE | 32 bytes E | Deletion key, encrypted w/ recipient's key - | MSID | 32 bytes E | Message ID in binary format - | FRID | 2 bytes E | Fragment Index of this packet (0..NFR-1) - | NFR | 2 bytes E | Number of fragments in the email - | MLEN | 2 bytes E | Length of the MSG field - | MSG | byte[] E | encrypted email or fragment (MLEN bytes) - ---------------------+-------+------------+---------------------------------------------------- - Index Packet | | | Contains the DHT keys of one or more Email Packets. - | TYPE | 1 byte | Value = 'I' - | DH | 32 bytes | SHA-256 hash of the recipient's email destination - | NP | 1 byte | Number of keys in the packet - | KEY1 | 256 bytes | DHT key of the first Email Packet - | KEY1 | 256 bytes | DHT key of the second Email Packet - | ... | ... | ... - | KEYn | 256 bytes | DHT key of the n-th Email Packet - ---------------------+-------+------------+---------------------------------------------------- - Relay Packet | | | The payload of a Relay Request - | TYPE | 1 byte | Value = 'R' - | TMIN | 4 bytes | Earliest send time - | TMAX | 4 bytes | Latest sent time (no guarantee!) - | XK | 32 bytes | Key to XOR the payload with - | NEXT | 384 bytes | Destination to forward the packet to - | DLEN | 2 bytes | Length of DATA field in bytes, up to ~30k - | DATA | byte[] E | Payload, encrypted with NEXT's key (DLEN bytes) - | | | (can contain another Relay Packet, Email Packet, - | | | or Retrieve Request) - ---------------------+-------+------------+------------------------------------------------- - Peer List | | | Response to a Find Close Peers Request or - | | | a Relay List Request - | TYPE | 1 byte | Value = 'L' - | NUMP | 2 bytes | Number of peers in the list - | P1 | 384 bytes | Destination key - | P2 | 384 bytes | Destination key - | ... | ... | ... - | Pn | 384 bytes | Destination key - ---------------------+-------+------------+------------------------------------------------- - Email Destination | | | TBD - | | | - | | | - | | | - | | | - | | | - ---------------------+-------+------------+------------------------------------------------- - - -4. Protocols For Inter-Node Communication - -4.1. Sending Email - I2P nodes involved: A=Sender, R1...Rn=Relays, S1...Sm=Storage Nodes - - 1) A sends an Relay Packet to R1. - 2) R1 decrypts the packet, waits a random amount of time, and sends it to R2. - 3) R2 confirms delivery with R1. - 4) Repeat until packet arrives at Rn. - 5) Rn decrypts the Relay Packet into an Email Packet. - 6) Rn sends the packet to S1,...,Sm through a Kademlia STORE - -4.2. Retrieving Email - I2P nodes involved: A=Address Owner, O1...On=Outbound Relays, I1...In=Inbound Relays, S1...Sm=Storage Nodes - - 1) A sends a Relay Packet to O1. - 2) O1 decrypts the packet, waits a random amount of time, and sends it to O2. - 3) O2 confirms delivery with O1. - 4) Repeat until packet arrives at On. - 5) On decrypts the Relay Packet into a Retrieve Request. - 6) On does a Kademlia LOOKUP for the email address. - 7) Nodes S1,...,Sm verify the expiration time, request number, and A's signature on the Retrieve Request. - 8) Nodes S1,...,Sm send their stored Email Packets to Rn. - 9) On confirms delivery with S1,...,Sm - 10) On makes a Relay Packet from the Email Packet and sends it to I1. - 11) I1 confirms delivery with On. - 12) I1 sends each packet to I2. - 13) I2 confirms delivery with I1. - 14) Repeat the last two steps until packet arrives at A. - 15) A decrypts the packet into a plaintext email or email fragment. - - Note: The system purposely does not prevent retrieval of email by unauthorized nodes, in order to - allow a node to test the reliability of a storage node before using it to store an Email Packet. - - -4.3. Pinging a node - -4.4. Responding to a Ping - -4.5. Storing an Email Packet on a storage node - -4.6. Sending a Retrieve Request to a Node - -4.7. Deleting an Email Packet - - 1) Recipient knows the deletion key after it decrypts the email packet (the packet also contains a - "plaintext deletion key" field, which is all zeros after it leaves a storage node). - 2) Recipient sends a Delete Request to all storage nodes close to the DHT key of the Email Packet - -4.8. Looking up an email address in the directory - -4.9. Announcing a new email address to the directory - -4.10. Updating or deleting an email address from the directory - - -5. Algorithms Used By Nodes Locally - -5.1. Sending Email *** OUTDATED *** - - 1) Given a MIME email, GZip it, sign it, store it in the local outbox, split it into 30kB - packets plus an Index Packet, pad the packets if necessary, and store them locally. - 2) Pick a random packet/recipient combination for which the wait time is up, and for which - less than distinct delivery confirmations have been received within the - timeout period, and the maximum number of retries has not been reached. - 3) Set a random packet ID on the packet. - 4) Encrypt the packet with the public key for the recipient - 5) Encrypt the packet with the public keys of relay n, relay n-1, ..., relay 1, and add - the destination key of the next relay each time. Also included is a minimum/maximum delay - value for each relay. - 6) Queue the packet for sending to the first relay. - 7) Repeat from step 2 until no more packets left. - 8) When all packets have been sent, move the email from the outbox to the sent folder. - - Rationale for storing the whole email, not the packets, on disk: When sending to multiple - recipients, only one copy of the email needs to be stored. - -5.2. Retrieving Email - - 1) Randomly choose a set of n relay nodes, R1...Rn (outgoing chain for request) - 2) Randomly choose a set of m relay nodes, S1...Sm.(return chain / inbound mail chain) - - with Sm being the node closest to the receiver - and S1 the chain node closest to fetcher - 3) Generate m+1 random 32-byte arrays (for XORing the return packets), X1...Xm+1 - 4) With Sm's public key, encrypt the local destination key and Xm+1 - 5) With Sm-1's public key, encrypt Sm's destination key, Xm, and the data from step 4) - 6) With Sm-2's public key, encrypt Sm-1's destination key, Xm-1, and the data from step 5) - 7) Repeat until the entire return chain, S1...Sm, has been onion-encrypted, - and also include a minimum/maximum delay value for each relay. - 8) Add S1's destination key and X1 to the data from step 7) - 9) Add the data (which is a Relay Packet) to a Retrieve Request packet. - 10) Encrypt the resulting packet, using the public keys of relays - Rn (Fetcher), Rn-1, ..., R1, and add the destination key of the next relay each time. - Also included is a minimum/maximum delay value for each relay. - 11) Set a random packet ID on the packet at each layer - 12) Queue the packet for immediate sending to the first relay. - - The following is done continuously and asynchronously, regardless of whether there a Retrieve - Request has been sent recently: - - 1) Nodes are always ready for incoming Email Packets. - 2) For every email packet that is received, a Delete Request is sent out to the Kademlia network - via a relay chain. - -5.3. Fetching Email Packets For an Address Through Kademlia - - 1) Do a Kademlia lookup for the keypair in the Retrieve Request - 2) Extract packet IDs from the Index Packet(s) - 3) Do a Kademlia lookup for each packet ID - 4) Check the packet ID on the Email Packets and send them back to the first return relay - -5.4. Relaying a Packet - - 1) Decrypt packet - 2) Verify signature - 3) XOR payload with the key included in the packet. - 4) Read wait time range from packet - 5) Wait for a random amount of time within the wait time range. - 6) Queue packet for sending with that delay. - 7) If no delivery confirmation within timeout period, wait for $resend_delay and repeat from step 5 - -5.5. Storing an Email Packet - - 1) If packet can't fit in storage space, delete stored email packets that are more than 100 days old. - 2) If still no room, send back negative response - 3) Otherwise, write packet to file and send positive response - - -6. Local Address Book - - -7. Distributed Email Directory - -Each adress-keypair mapping is stored at multiple nodes. Nodes can only add an address to the -distributed address directory, but they cannot edit or delete them. An address must be renewed -periodically, or it expires after a year and is deleted from the address directory. -A node only stores one keypair per email address. Whichever came first, stays in the address -directory. -When doing an address lookup, a error message is displayed to the user if lookup results from two -nodes are different. -It is important for the user to understand that using the distributed email directory is not as -secure as manually adding keypairs to the local address book, although it is more convenient. - - -8. UI - -8.1. Retrieving email - - * Wait 20 seconds for any emails to arrive, then return from HTTP request or POP3 request. - All other emails will be received in the background. - * The "high priority" setting found in most email clients sets all relaying delays to zero. - - -9. Files - -9.1. Identities file - - Stores all email identities the local user has created. One line per entry. - Format: [][] - - -10. To Do - - * Replication per the Kademlia spec - * Have an option to disable automatic lookups in the distributed address directory for your own address - * Automatically create a different sender address for each recipient - * test relays periodically - * test storage nodes periodically - * optionally pad all packets to a system-wide fixed size - * Always use the same amount of bandwidth, testing nodes or sending dummy messages - if necessary. - * Always keep incoming bandwidth the same as outgoing bandwidth - * Pad packets before encrypting to prevent tagging attacks - * packet id for confirmation - * onion packets/regular packets - * delivery confirmation to sender - * What about incoming bandwith, can it be limited? - * Turnkey outproxy feature? - * All nodes keep track of I2PBote peers through Peer List Requests and by pinging known peers - periodically. - * optionally, packets are padded to a constant size - * select different set of hops for each packet - * instead of sending dummy messages for cover traffic, test gateways by routing packet to self - * keep track of uptimes + reliability of paths (or gateways), have a "minimum - uptime/min reliability percentage" setting for selecting gateways - * Use three different I2P destinations for sending and receiving data - * Use more storage nodes if email destination is known to be heavily frequented (like Kademlia does for popular hashes) - * mention that min/max delay = earliest/latest send time (explain that there is no guarantee for the send time being between min and max, it can be after max) - * Consider replacing ElGamal with 256-bit ECC encryption (=86 base64 chars) which comes standard in Java 7 - * If an email fits in one packet, don't bother with an index packet - * Emails in the Outbox: Show addt'l "progress" progress column which is clickable and brings up detailed info. - * On first run, offer to create a new email identity, and optionally assign an email address to it. - * Folder structure on disk should reflect folders in app. All email folders visible to the user have the same root directory: [app dir]/folders. - * ask user for confirmation before deleting an email identity - * have a view of the incomplete folder, so users can look at incomplete emails diff --git a/apps/i2pbote/doc/userdoc.txt b/apps/i2pbote/doc/userdoc.txt deleted file mode 100644 index de252cc93..000000000 --- a/apps/i2pbote/doc/userdoc.txt +++ /dev/null @@ -1,18 +0,0 @@ -I2P-Bote --------- - -This file explains how to use I2P-Bote. For technical documentation, see techdoc.txt. - -1. To install the app, [TODO] - -2. Set up an email address [TODO] - -3. Send a test email to yourself [TODO] - -4. Checking for email - -When you view your inbox through the web interface or click the "Get Mail" button on your email -client, two things happen: New downloaded emails are shown, if there are any, and the I2P-Bote -network is contacted to see if more emails are waiting to be downloaded. - -5. The Configuration File \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/CheckEmailTask.java b/apps/i2pbote/src/i2p/bote/CheckEmailTask.java deleted file mode 100644 index 0f847bc14..000000000 --- a/apps/i2pbote/src/i2p/bote/CheckEmailTask.java +++ /dev/null @@ -1,130 +0,0 @@ -package i2p.bote; - -import i2p.bote.folder.IncompleteEmailFolder; -import i2p.bote.network.DHT; -import i2p.bote.network.PeerManager; -import i2p.bote.packet.EmailPacket; -import i2p.bote.packet.IndexPacket; -import i2p.bote.packet.UniqueId; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import net.i2p.data.DataFormatException; -import net.i2p.data.Hash; -import net.i2p.util.Log; - -/** - * Gets email packets from the DHT for one email identity. A separate thread is used for - * each packet in order to speed things up, and because the packets are in different places - * on the network. - * - * @author HungryHobo@mail.i2p - */ -public class CheckEmailTask implements Runnable { - private static final int MAX_THREADS = 50; - private static final int THREAD_STACK_SIZE = 64 * 1024; // TODO find a safe low value (default in 64-bit Java 1.6 = 1MByte) - private static final ThreadFactory EMAIL_PACKET_TASK_THREAD_FACTORY = Util.createThreadFactory("EmailPktTask", THREAD_STACK_SIZE); - private ExecutorService executor; - - private Log log = new Log(CheckEmailTask.class); - private EmailIdentity identity; - private DHT dht; - private PeerManager peerManager; - private IncompleteEmailFolder incompleteEmailFolder; - - public CheckEmailTask(EmailIdentity identity, DHT dht, PeerManager peerManager, IncompleteEmailFolder incompleteEmailFolder) { - this.identity = identity; - this.dht = dht; - this.peerManager = peerManager; - this.incompleteEmailFolder = incompleteEmailFolder; - } - - @Override - public void run() { - Collection emailPacketKeys = findEmailPacketKeys(); - - executor = Executors.newFixedThreadPool(MAX_THREADS, EMAIL_PACKET_TASK_THREAD_FACTORY); - for (Hash dhtKey: emailPacketKeys) - executor.submit(new EmailPacketTask(dhtKey)); - executor.shutdown(); - try { - executor.awaitTermination(1, TimeUnit.DAYS); - } catch (InterruptedException e) { - log.error("Interrupted while checking for mail.", e); - executor.shutdownNow(); - } - } - - /** - * Queries the DHT for new index packets and returns the DHT keys contained in them. - * @return A Collection containing zero or more elements - */ - private Collection findEmailPacketKeys() { - log.debug("Querying the DHT for index packets with key " + identity.getHash()); - Collection packets = dht.findAll(identity.getHash(), IndexPacket.class); - - // build an Collection of index packets - Collection indexPackets = new ArrayList(); - for (DhtStorablePacket packet: packets) - if (packet instanceof IndexPacket) - indexPackets.add((IndexPacket)packet); - else - log.error("DHT returned packet of class " + packet.getClass().getSimpleName() + ", expected IndexPacket."); - - IndexPacket mergedPacket = new IndexPacket(indexPackets); - log.debug("Found " + mergedPacket.getDhtKeys().size() + " Email Packet keys."); - return mergedPacket.getDhtKeys(); - } - - /** - * Queries the DHT for an email packet, adds the packet to the {@link IncompleteEmailFolder}, - * and deletes the packet from the DHT. - * - * @author HungryHobo@mail.i2p - */ - private class EmailPacketTask implements Runnable { - private Hash dhtKey; - - /** - * - * @param dhtKey The DHT key of the email packet to retrieve - */ - public EmailPacketTask(Hash dhtKey) { - this.dhtKey = dhtKey; - } - - @Override - public void run() { - DhtStorablePacket packet = dht.findOne(dhtKey, EmailPacket.class); - if (packet instanceof EmailPacket) { - EmailPacket emailPacket = (EmailPacket)packet; - try { - emailPacket.decrypt(identity); - } - catch (DataFormatException e) { - log.error("Can't decrypt email packet: " + emailPacket, e); - // TODO propagate error message to UI - } - incompleteEmailFolder.add(emailPacket); - sendDeleteRequest(dhtKey, emailPacket.getEncryptedDeletionKey()); - } - else - log.error("DHT returned packet of class " + packet.getClass().getSimpleName() + ", expected EmailPacket."); - } - - /** - * Sends a delete request to the DHT. - * @param dhtKey The DHT key of the email packet that is to be deleted - * @param deletionKey The deletion key for the email packet - */ - private void sendDeleteRequest(Hash dhtKey, UniqueId deletionKey) { - // TODO - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/Configuration.java b/apps/i2pbote/src/i2p/bote/Configuration.java deleted file mode 100644 index d7fd06c37..000000000 --- a/apps/i2pbote/src/i2p/bote/Configuration.java +++ /dev/null @@ -1,192 +0,0 @@ -package i2p.bote; - -import java.io.File; -import java.io.IOException; -import java.util.Properties; - -import net.i2p.I2PAppContext; -import net.i2p.data.DataHelper; -import net.i2p.util.Log; - -public class Configuration extends Properties { - private static final long serialVersionUID = -6318245413106186095L; - private static final String I2P_BOTE_SUBDIR = ".i2pbote"; // relative to the I2P app dir - private static final String CONFIG_FILE_NAME = "i2pbote.config"; - private static final String DEST_KEY_FILE_NAME = "local_dest.key"; - private static final String PEER_FILE_NAME = "peers.txt"; - private static final String IDENTITIES_FILE_NAME = "identities.txt"; - private static final String OUTBOX_DIR = "outbox"; // relative to I2P_BOTE_SUBDIR - private static final String OUTBOX_SUBDIR_LOCAL = "local"; // relative to OUTBOX_DIR - private static final String OUTBOX_SUBDIR_RELAY = "relay"; // relative to OUTBOX_DIR - private static final String INCOMPLETE_SUBDIR = "incomplete"; // relative to I2P_BOTE_SUBDIR - private static final String EMAIL_DHT_SUBDIR = "dht_email_pkt"; // relative to I2P_BOTE_SUBDIR - private static final String INDEX_PACKET_DHT_SUBDIR = "dht_index_pkt"; // relative to I2P_BOTE_SUBDIR - private static final String INBOX_SUBDIR = "inbox"; // relative to I2P_BOTE_SUBDIR - - // Parameter names in the config file - private static final String PARAMETER_REDUNDANCY = "redundancy"; - private static final String PARAMETER_STORAGE_SPACE_INBOX = "storageSpaceInbox"; - private static final String PARAMETER_STORAGE_SPACE_RELAY = "storageSpaceRelay"; - private static final String PARAMETER_STORAGE_TIME = "storageTime"; - private static final String PARAMETER_MAX_FRAGMENT_SIZE = "maxFragmentSize"; - private static final String PARAMETER_HASHCASH_STRENGTH = "hashCashStrength"; - private static final String PARAMETER_SMTP_PORT = "smtpPort"; - private static final String PARAMETER_POP3_PORT = "pop3Port"; - - // Defaults for each parameter - private static final int DEFAULT_REDUNDANCY = 2; - private static final int DEFAULT_STORAGE_SPACE_INBOX = 1024 * 1024 * 1024; - private static final int DEFAULT_STORAGE_SPACE_RELAY = 100 * 1024 * 1024; - private static final int DEFAULT_STORAGE_TIME = 31; // in days - private static final int DEFAULT_MAX_FRAGMENT_SIZE = 10 * 1024 * 1024; // the maximum size one email fragment can be, in bytes - private static final int DEFAULT_HASHCASH_STRENGTH = 10; - private static final int DEFAULT_SMTP_PORT = 7661; - private static final int DEFAULT_POP3_PORT = 7662; - - private Log log = new Log(Configuration.class); - private File i2pBoteDir; - - /** - * Reads configuration settings from the I2P_BOTE_SUBDIR subdirectory under - * the I2P application directory. The I2P application directory can be changed via the - * i2p.dir.app system property. - * - * Logging is done through the I2P logger. I2P reads the log configuration from the - * logger.config file whose location is determined by the - * i2p.dir.config system property. - * @return - */ - public Configuration() { - // get the I2PBote directory and make sure it exists - i2pBoteDir = getI2PBoteDirectory(); - if (!i2pBoteDir.exists()) - i2pBoteDir.mkdirs(); - - // read the configuration file - File configFile = new File(i2pBoteDir, CONFIG_FILE_NAME); - boolean configurationLoaded = false; - if (configFile.exists()) { - log.debug("Loading config file <" + configFile.getAbsolutePath() + ">"); - - try { - DataHelper.loadProps(this, configFile); - configurationLoaded = true; - } catch (IOException e) { - log.error("Error loading configuration file <" + configFile.getAbsolutePath() + ">", e); - } - } - if (!configurationLoaded) - log.info("Can't read configuration file <" + configFile.getAbsolutePath() + ">, using default settings."); - } - - public File getDestinationKeyFile() { - return new File(i2pBoteDir, DEST_KEY_FILE_NAME); - } - - public File getPeerFile() { - return new File(i2pBoteDir, PEER_FILE_NAME); - } - - public File getIdentitiesFile() { - return new File(i2pBoteDir, IDENTITIES_FILE_NAME); - } - - public File getLocalOutboxDir() { - return new File(getOutboxBaseDir(), OUTBOX_SUBDIR_LOCAL); - } - - public File getRelayOutboxDir() { - return new File(getOutboxBaseDir(), OUTBOX_SUBDIR_RELAY); - } - - private File getOutboxBaseDir() { - return new File(i2pBoteDir, OUTBOX_DIR); - } - - public File getInboxDir() { - return new File(i2pBoteDir, INBOX_SUBDIR); - } - - public File getIncompleteDir() { - return new File(i2pBoteDir, INCOMPLETE_SUBDIR); - } - - public File getEmailDhtStorageDir() { - return new File(i2pBoteDir, EMAIL_DHT_SUBDIR); - } - - public File getIndexPacketDhtStorageDir() { - return new File(i2pBoteDir, INDEX_PACKET_DHT_SUBDIR); - } - - private static File getI2PBoteDirectory() { - // the parent directory of the I2PBote directory ($HOME or the value of the i2p.dir.app property) - File i2pAppDir = I2PAppContext.getGlobalContext().getAppDir(); - - return new File(i2pAppDir, I2P_BOTE_SUBDIR); - } - - /** - * Save the configuration - * @param configFile - * @throws IOException - */ - public void saveToFile(File configFile) throws IOException { - log.debug("Saving config file <" + configFile.getAbsolutePath() + ">"); - DataHelper.storeProps(this, configFile); - } - - /** - * Returns the number of relays to use for sending and receiving email. Zero is a legal value. - * @return - */ - public int getRedundancy() { - return getIntParameter(PARAMETER_REDUNDANCY, DEFAULT_REDUNDANCY); - } - - /** - * Returns the maximum size (in bytes) the inbox can take up. - * @return - */ - public int getStorageSpaceInbox() { - return getIntParameter(PARAMETER_STORAGE_SPACE_INBOX, DEFAULT_STORAGE_SPACE_INBOX); - } - - /** - * Returns the maximum size (in bytes) all messages stored for relaying can take up. - * @return - */ - public int getStorageSpaceRelay() { - return getIntParameter(PARAMETER_STORAGE_SPACE_RELAY, DEFAULT_STORAGE_SPACE_RELAY); - } - - /** - * Returns the time (in milliseconds) after which an email is deleted from the outbox if it cannot be sent / relayed. - * @return - */ - public long getStorageTime() { - return 24L * 3600 * 1000 * getIntParameter(PARAMETER_STORAGE_TIME, DEFAULT_STORAGE_TIME); - } - - public int getMaxFragmentSize() { - return getIntParameter(PARAMETER_MAX_FRAGMENT_SIZE, DEFAULT_MAX_FRAGMENT_SIZE); - } - - public int getHashCashStrength() { - return getIntParameter(PARAMETER_HASHCASH_STRENGTH, DEFAULT_HASHCASH_STRENGTH); - } - - private int getIntParameter(String parameterName, int defaultValue) { - String stringValue = getProperty(parameterName); - if (stringValue == null) - return defaultValue; - else - try { - return new Integer(getProperty(parameterName)); - } - catch (NumberFormatException e) { - log.warn("Can't convert value <" + stringValue + "> for parameter <" + parameterName + "> to int, using default."); - return defaultValue; - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/EmailDestination.java b/apps/i2pbote/src/i2p/bote/EmailDestination.java deleted file mode 100644 index 32b848c43..000000000 --- a/apps/i2pbote/src/i2p/bote/EmailDestination.java +++ /dev/null @@ -1,154 +0,0 @@ -package i2p.bote; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; - -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; -import net.i2p.client.I2PSession; -import net.i2p.crypto.SHA256Generator; -import net.i2p.data.Base64; -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.data.PublicKey; -import net.i2p.data.SigningPublicKey; -import net.i2p.util.Log; - -/** - * Uniquely identifies an email recipient. This implementation uses I2P keypairs. - * - * @author HungryHobo@mail.i2p - */ -public class EmailDestination { - private Log log = new Log(EmailDestination.class); - private PublicKey publicEncryptionKey; - private SigningPublicKey publicSigningKey; - - /** - * Creates a fresh EmailDestination. - */ - public EmailDestination() { - try { - I2PClient i2pClient = I2PClientFactory.createClient(); - ByteArrayOutputStream arrayStream = new ByteArrayOutputStream(); - i2pClient.createDestination(arrayStream); - byte[] destinationArray = arrayStream.toByteArray(); - I2PSession i2pSession = i2pClient.createSession(new ByteArrayInputStream(destinationArray), null); - - initKeys(i2pSession); - } - catch (Exception e) { - log.error("Can't generate EmailDestination.", e); - } - } - - /** - * Creates a EmailDestination using data read from a {@link ByteBuffer}. - * @param buffer - */ - public EmailDestination(ByteBuffer buffer) { - byte[] encryptionKeyArray = new byte[PublicKey.KEYSIZE_BYTES]; - buffer.get(encryptionKeyArray); - publicEncryptionKey = new PublicKey(encryptionKeyArray); - - byte[] signingKeyArray = new byte[SigningPublicKey.KEYSIZE_BYTES]; - buffer.get(signingKeyArray); - publicSigningKey = new SigningPublicKey(signingKeyArray); - } - - public EmailDestination(String base64Data) { - try { - base64Data += "AAAA"; // add a null certificate - Destination i2pDestination = new Destination(base64Data); - publicEncryptionKey = i2pDestination.getPublicKey(); - publicSigningKey = i2pDestination.getSigningPublicKey(); - } catch (DataFormatException e) { - log.error("Can't generate EmailDestination.", e); - } - } - -/* public EmailDestination(byte[] data) { - try { - byte[] destinationPlusCert = addNullCertificate(data); - ByteArrayInputStream byteStream = new ByteArrayInputStream(destinationPlusCert); - I2PSession i2pSession = I2PClientFactory.createClient().createSession(byteStream, null); - initKeys(i2pSession); - } - catch (I2PSessionException e) { - log.error("Can't generate EmailDestination.", e); - } - }*/ - -/* private byte[] addNullCertificate(byte[] data) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try { - outputStream.write(data); - outputStream.write(new Certificate().toByteArray()); - // Add an extra zero byte so I2PSessionImpl.readDestination doesn't fall on its face. I believe this is a bug. - outputStream.write(0); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return outputStream.toByteArray(); - }*/ - - protected void initKeys(I2PSession i2pSession) { - publicEncryptionKey = i2pSession.getMyDestination().getPublicKey(); - publicSigningKey = i2pSession.getMyDestination().getSigningPublicKey(); - } - - public PublicKey getPublicEncryptionKey() { - return publicEncryptionKey; - } - - public SigningPublicKey getPublicSigningKey() { - return publicSigningKey; - } - - private byte[] getKeysAsArray() { - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - try { - writeTo(byteStream); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return byteStream.toByteArray(); - } - - private void writeTo(OutputStream outputStream) throws IOException { - try { - publicEncryptionKey.writeBytes(outputStream); - publicSigningKey.writeBytes(outputStream); - } - catch (DataFormatException e) { - log.error("Invalid encryption key or signing key.", e); - } - } - - public Hash getHash() { - // TODO cache the hash value? - return SHA256Generator.getInstance().calculateHash(getKeysAsArray()); - } - - /** - * Returns the two public keys in Base64 representation. - */ - public String getKey() { - return Base64.encode(getKeysAsArray()); - } - - public String toBase64() { - return getKey(); - } - - @Override - public String toString() { - return getKey(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/EmailIdentity.java b/apps/i2pbote/src/i2p/bote/EmailIdentity.java deleted file mode 100644 index e21ef19d5..000000000 --- a/apps/i2pbote/src/i2p/bote/EmailIdentity.java +++ /dev/null @@ -1,123 +0,0 @@ -package i2p.bote; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; -import net.i2p.data.Base64; -import net.i2p.data.PrivateKey; -import net.i2p.data.SigningPrivateKey; -import net.i2p.util.Log; - -public class EmailIdentity extends EmailDestination { - private Log log = new Log(EmailIdentity.class); - private PrivateKey privateEncryptionKey; - private SigningPrivateKey privateSigningKey; - private String publicName; - private String description; // optional - private String emailAddress; // optional - - /** - * Creates a random EmailIdentity. - */ - public EmailIdentity() { - // key initialization happens in the super constructor, which calls initKeys - } - - /** - * Creates a EmailIdentity from a Base64-encoded string. The format is the same as - * for Base64-encoded local I2P destinations, except there is no null certificate. - * @param key - */ - public EmailIdentity(String key) { - try { - key = key.substring(0, 512) + "AAAA" + key.substring(512); // insert a null certificate for I2PClient.createSession() - ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decode(key)); - - I2PClient i2pClient = I2PClientFactory.createClient(); - I2PSession i2pSession = i2pClient.createSession(inputStream, null); - initKeys(i2pSession); - } - catch (I2PSessionException e) { - log.error("Can't generate EmailIdentity.", e); - } - } - - public PrivateKey getPrivateEncryptionKey() { - return privateEncryptionKey; - } - - public SigningPrivateKey getPrivateSigningKey() { - return privateSigningKey; - } - - public void setPublicName(String publicName) { - this.publicName = publicName; - } - - public String getPublicName() { - return publicName; - } - - public void setDescription(String name) { - this.description = name; - } - - public String getDescription() { - return description; - } - - public void setEmailAddress(String emailAddress) { - this.emailAddress = emailAddress; - } - - public String getEmailAddress() { - return emailAddress; - } - - protected void initKeys(I2PSession i2pSession) { - super.initKeys(i2pSession); - privateEncryptionKey = i2pSession.getDecryptionKey(); - privateSigningKey = i2pSession.getPrivateKey(); - } - - private byte[] getKeysAsArray() { - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - try { - byteStream.write(getPublicEncryptionKey().getData()); - byteStream.write(getPublicSigningKey().getData()); - byteStream.write(getPrivateEncryptionKey().getData()); - byteStream.write(getPrivateSigningKey().getData()); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return byteStream.toByteArray(); - } - - /** - * Returns the two key pairs (public + private) as one Base64-encoded string. - * @return - */ - public String getFullKey() { - return Base64.encode(getKeysAsArray()); - } - - @Override - public String toString() { - return getKey() + " address=<" + getEmailAddress() + "> identity name=<" + getDescription() + "> visible name=<" + getPublicName() + ">"; - } - -/* @Override - public boolean equals(Object anotherObject) { - if (anotherObject instanceof EmailIdentity) { - EmailIdentity otherIdentity = (EmailIdentity)anotherObject; - return Arrays.equals(getKeysAsArray(), otherIdentity.getKeysAsArray()); - } - return false; - }*/ -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/I2PBote.java b/apps/i2pbote/src/i2p/bote/I2PBote.java deleted file mode 100644 index 10787ea9a..000000000 --- a/apps/i2pbote/src/i2p/bote/I2PBote.java +++ /dev/null @@ -1,256 +0,0 @@ -package i2p.bote; - -import i2p.bote.folder.DhtPacketFolder; -import i2p.bote.folder.EmailFolder; -import i2p.bote.folder.IncompleteEmailFolder; -import i2p.bote.folder.IndexPacketFolder; -import i2p.bote.folder.Outbox; -import i2p.bote.folder.PacketFolder; -import i2p.bote.network.DHT; -import i2p.bote.network.I2PPacketDispatcher; -import i2p.bote.network.I2PSendQueue; -import i2p.bote.network.PeerManager; -import i2p.bote.network.kademlia.KademliaDHT; -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.Email; -import i2p.bote.packet.EmailPacket; -import i2p.bote.packet.IndexPacket; -import i2p.bote.packet.RelayPacket; -import i2p.bote.service.OutboxProcessor; -import i2p.bote.service.POP3Service; -import i2p.bote.service.RelayPacketSender; -import i2p.bote.service.SMTPService; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Collection; - -import net.i2p.I2PException; -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; -import net.i2p.data.Base64; -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.util.Log; - -/** - * This is the core class of the application. Is is implemented as a singleton. - * - * @author HungryHobo@mail.i2p - */ -public class I2PBote { - private static I2PBote instance; - - private Log log = new Log(I2PBote.class); - private I2PClient i2pClient; - private I2PSession i2pSession; - private Configuration configuration; - private Identities identities; - private I2PSendQueue sendQueue; - private Outbox outbox; // stores outgoing emails for all local users - private EmailFolder inbox; // stores incoming emails for all local users - private PacketFolder relayPacketFolder; // stores email packets we're forwarding for other machines - private IncompleteEmailFolder incompleteEmailFolder; // stores email packets addressed to a local user - private DhtPacketFolder emailDhtStorageFolder; // stores email packets and index packets for other peers - private IndexPacketFolder indexPacketDhtStorageFolder; // stores index packets -//TODO private PacketFolder<> addressDhtStorageFolder; // stores email address-destination mappings - private SMTPService smtpService; - private POP3Service pop3Service; - private OutboxProcessor outboxProcessor; // reads emails stored in the outbox and sends them - private RelayPacketSender relayPacketSender; // reads packets stored in the relayPacketFolder and sends them - private DHT dht; - private PeerManager peerManager; - - private I2PBote() { - Thread.currentThread().setName("I2PBoteMain"); - - initializeLogging(); - - i2pClient = I2PClientFactory.createClient(); - configuration = new Configuration(); - - identities = new Identities(configuration.getIdentitiesFile()); - initializeSession(); - initializeFolderAccess(); - initializeServices(); - startAllServices(); - } - - private void initializeLogging() { - } - - /** - * Initializes objects for accessing emails and packet files on the filesystem. - */ - private void initializeFolderAccess() { - inbox = new EmailFolder(configuration.getInboxDir()); - outbox = new Outbox(configuration.getLocalOutboxDir()); - relayPacketFolder = new PacketFolder(configuration.getRelayOutboxDir()); - incompleteEmailFolder = new IncompleteEmailFolder(configuration.getIncompleteDir(), inbox); - emailDhtStorageFolder = new DhtPacketFolder(configuration.getEmailDhtStorageDir()); - indexPacketDhtStorageFolder = new IndexPacketFolder(configuration.getIndexPacketDhtStorageDir()); - } - - /** - * Sets up a {@link I2PSession}, using the I2P destination stored on disk or creating a new I2P - * destination if no key file exists. - */ - private void initializeSession() { - // read the local destination key from the key file if it exists - File destinationKeyFile = configuration.getDestinationKeyFile(); - try { - FileReader fileReader = new FileReader(destinationKeyFile); - char[] destKeyBuffer = new char[(int)destinationKeyFile.length()]; - fileReader.read(destKeyBuffer); - byte[] localDestinationKey = Base64.decode(new String(destKeyBuffer)); - ByteArrayInputStream inputStream = new ByteArrayInputStream(localDestinationKey); - i2pSession = i2pClient.createSession(inputStream, null); - i2pSession.connect(); - } - catch (IOException e) { - log.debug("Destination key file doesn't exist or isn't readable: " + e); - } catch (I2PSessionException e) { - log.warn("Error creating I2PSession", e); - } - - // if the local destination key can't be read or is invalid, create a new one - if (i2pSession == null) { - log.debug("Creating new local destination key"); - try { - ByteArrayOutputStream arrayStream = new ByteArrayOutputStream(); - i2pClient.createDestination(arrayStream); - byte[] localDestinationArray = arrayStream.toByteArray(); - - i2pSession = i2pClient.createSession(new ByteArrayInputStream(localDestinationArray), null); - i2pSession.connect(); - - saveLocalDestinationKeys(destinationKeyFile, localDestinationArray); - } catch (I2PException e) { - log.error("Error creating local destination key or I2PSession.", e); - } catch (IOException e) { - log.error("Error writing local destination key to file.", e); - } - } - - Destination localDestination = i2pSession.getMyDestination(); - log.debug("Local destination key = " + localDestination.toBase64()); - log.debug("Local destination hash = " + localDestination.calculateHash().toBase64()); - } - - /** - * Initializes daemon threads, doesn't start them yet. - */ - private void initializeServices() { - I2PPacketDispatcher dispatcher = new I2PPacketDispatcher(); - i2pSession.addSessionListener(dispatcher, I2PSession.PROTO_ANY, I2PSession.PORT_ANY); - - smtpService = new SMTPService(); - pop3Service = new POP3Service(); - outboxProcessor = new OutboxProcessor(i2pSession, outbox, configuration, peerManager); - relayPacketSender = new RelayPacketSender(sendQueue, relayPacketFolder); - sendQueue = new I2PSendQueue(i2pSession, dispatcher); - - dht = new KademliaDHT(i2pSession.getMyDestination(), sendQueue, dispatcher, configuration.getPeerFile()); - - dht.setStorageHandler(EmailPacket.class, emailDhtStorageFolder); - dht.setStorageHandler(IndexPacket.class, indexPacketDhtStorageFolder); -//TODO dht.setStorageHandler(AddressPacket.class, ); - - peerManager = new PeerManager(); - } - - /** - * Writes private + public keys for the local destination out to a file. - * @param keyFile - * @param localDestinationArray - * @throws DataFormatException - * @throws IOException - */ - private void saveLocalDestinationKeys(File keyFile, byte[] localDestinationArray) throws DataFormatException, IOException { - if (keyFile.exists()) { - File oldKeyFile = new File(keyFile.getPath() + "_backup"); - keyFile.renameTo(oldKeyFile); - } - else - keyFile.createNewFile(); - - FileWriter fileWriter = new FileWriter(keyFile); - fileWriter.write(Base64.encode(localDestinationArray)); - fileWriter.close(); - } - - public static void startUp() { - getInstance(); - } - - public static void shutDown() { - if (instance != null) - instance.stopAllServices(); - } - - public static I2PBote getInstance() { - if (instance == null) - instance = new I2PBote(); - return instance; - } - - public Identities getIdentities() { - return identities; - } - - public void sendEmail(Email email) throws Exception { -/*XXX*/ -javax.mail.Address recipient = email.getAllRecipients()[0]; -String address = ((javax.mail.internet.InternetAddress)recipient).getAddress(); -if (address.indexOf('@')>=0) - address = address.substring(0, address.indexOf('@')); -EmailDestination emailDestination = new EmailDestination(address); -Collection emailPackets = email.createEmailPackets(emailDestination); -for (EmailPacket packet: emailPackets) - dht.store(packet); -dht.store(new IndexPacket(emailPackets, emailDestination)); - // TODO uncomment for next milestone, move code above into OutboxProcessor -/* outbox.add(email); - outboxProcessor.checkForEmail();*/ - } - - public Runnable createCheckMailTask(EmailIdentity identity) { - return new CheckEmailTask(identity, dht, peerManager, incompleteEmailFolder); - } - - public EmailFolder getInbox() { - return inbox; - } - - public int getNumDhtPeers() { - return dht.getNumPeers(); - } - - public int getNumRelayPeers() { - return peerManager.getNumPeers(); - } - - private void startAllServices() { - dht.start(); - outboxProcessor.start(); - relayPacketSender.start(); - smtpService.start(); - pop3Service.start(); - sendQueue.start(); - } - - private void stopAllServices() { - dht.shutDown(); - outboxProcessor.shutDown(); - relayPacketSender.requestShutdown(); - smtpService.shutDown(); - pop3Service.shutDown(); - sendQueue.requestShutdown(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/Identities.java b/apps/i2pbote/src/i2p/bote/Identities.java deleted file mode 100644 index e525bbb29..000000000 --- a/apps/i2pbote/src/i2p/bote/Identities.java +++ /dev/null @@ -1,169 +0,0 @@ -package i2p.bote; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.regex.PatternSyntaxException; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -public class Identities implements Iterable { - private Log log = new Log(Identities.class); - private File identitiesFile; - private List identities; - - public Identities(File identitiesFile) { - this.identitiesFile = identitiesFile; - identities = Collections.synchronizedList(new ArrayList()); - - if (!identitiesFile.exists()) { - log.debug("Identities file does not exist: <" + identitiesFile.getAbsolutePath() + ">"); - return; - } - - log.debug("Reading identities file: <" + identitiesFile.getAbsolutePath() + ">"); - BufferedReader input = null; - try { - input = new BufferedReader(new FileReader(identitiesFile)); - - while (true) { - String line = input.readLine(); - if (line == null) // EOF - break; - - EmailIdentity identity = parse(line); - if (identity != null) - identities.add(identity); - } - } catch (IOException e) { - log.error("Can't read identities file.", e); - } - finally { - if (input != null) - try { - input.close(); - } - catch (IOException e) { - log.error("Error closing input stream.", e); - } - } - } - - private EmailIdentity parse(String emailIdentityString) { - try { - String[] fields = emailIdentityString.split("\\t", 4); - if (fields.length < 2) { - log.debug("Unparseable email identity: <" + emailIdentityString + ">"); - return null; - } - EmailIdentity identity = new EmailIdentity(fields[0]); - if (fields.length > 1) - identity.setPublicName(fields[1]); - if (fields.length > 2) - identity.setDescription(fields[2]); - if (fields.length > 3) - identity.setEmailAddress(fields[3]); - return identity; - } - catch (PatternSyntaxException e) { - log.debug("Unparseable email identity: <" + emailIdentityString + ">"); - return null; - } - } - - /** - * This is the counterpart of the parse method. It encodes a {@link EmailIdentity} into - * an entry for the identities file. - * @param identity - * @return - */ - private String toFileFormat(EmailIdentity identity) { - StringBuilder string = new StringBuilder(); - string = string.append(identity.getFullKey()); - string = string.append("\t"); - string = string.append(identity.getPublicName()); - string = string.append("\t"); - if (identity.getDescription() != null) - string = string.append(identity.getDescription()); - string = string.append("\t"); - if (identity.getEmailAddress() != null) - string = string.append(identity.getEmailAddress()); - return string.toString(); - } - - public void save() throws IOException { - String newLine = System.getProperty("line.separator"); - try { - Writer writer = new BufferedWriter(new FileWriter(identitiesFile)); - for (EmailIdentity identity: identities) - writer.write(toFileFormat(identity) + newLine); - writer.close(); - } - catch (IOException e) { - log.error("Can't save email identities to file <" + identitiesFile.getAbsolutePath() + ">.", e); - throw e; - } - } - - public void add(EmailIdentity identity) { - identities.add(identity); - } - - public void remove(String key) { - EmailIdentity identity = get(key); - if (identity != null) - identities.remove(identity); - } - - public EmailIdentity get(int i) { - return identities.get(i); - } - - /** - * Looks up an {@link EmailIdentity} by its Base64 key. If none is found, - * null is returned. - * @param key - * @return - */ - public EmailIdentity get(String key) { - if (key==null || key.isEmpty()) - return null; - - for (EmailIdentity identity: identities) - if (key.equals(identity.getKey())) - return identity; - return null; - } - - public Collection getAll() { - return identities; - } - - public EmailIdentity[] getArray() { - return identities.toArray(new EmailIdentity[0]); - } - - public int size() { - return identities.size(); - } - - public boolean contains(Hash emailDestination) { - // TODO - return true; - } - - @Override - public Iterator iterator() { - return identities.iterator(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/Util.java b/apps/i2pbote/src/i2p/bote/Util.java deleted file mode 100644 index 24f6e50b1..000000000 --- a/apps/i2pbote/src/i2p/bote/Util.java +++ /dev/null @@ -1,81 +0,0 @@ -package i2p.bote; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Properties; -import java.util.concurrent.ThreadFactory; - -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; -import net.i2p.client.streaming.I2PSocketManager; -import net.i2p.client.streaming.I2PSocketManagerFactory; -import net.i2p.data.DataFormatException; - -public class Util { - private static final int BUFFER_SIZE = 32 * 1024; - - private Util() { } - - public static void copyBytes(InputStream inputStream, OutputStream outputStream) throws IOException { - byte[] buffer = new byte[BUFFER_SIZE]; - boolean done = false; - while (!done) { - int bytesRead = inputStream.read(buffer); - outputStream.write(buffer); - if (bytesRead < 0) - done = true; - } - } - - public static void writeKeyStream(I2PSession i2pSession, OutputStream outputStream) throws DataFormatException, IOException { - i2pSession.getMyDestination().writeBytes(outputStream); - i2pSession.getDecryptionKey().writeBytes(outputStream); - i2pSession.getPrivateKey().writeBytes(outputStream); - } - - public static InputStream createKeyStream(I2PSession i2pSession) throws DataFormatException, IOException { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - writeKeyStream(i2pSession, outputStream); - return new ByteArrayInputStream(outputStream.toByteArray()); - } - - public static I2PSession createNewSession(I2PClient i2pClient, I2PSession existingSession, Properties options) throws I2PSessionException, DataFormatException, IOException { - return I2PClientFactory.createClient().createSession(createKeyStream(existingSession), options); - } - - public static I2PSocketManager getSocketManager(I2PSession i2pSession) throws DataFormatException, IOException { - ByteArrayOutputStream keyOutputStream = new ByteArrayOutputStream(); - Util.writeKeyStream(i2pSession, keyOutputStream); - InputStream keyInputStream = new ByteArrayInputStream(keyOutputStream.toByteArray()); - return I2PSocketManagerFactory.createManager(keyInputStream); - } - - public static byte[] readInputStream(InputStream inputStream) throws IOException { - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[32*1024]; - while (true) { - int bytesToRead = Math.min(inputStream.available(), buffer.length); - if (bytesToRead <= 0) - break; - else { - int bytesRead = inputStream.read(buffer, 0, bytesToRead); - byteStream.write(buffer, 0, bytesRead); - } - } - return byteStream.toByteArray(); - } - - public static ThreadFactory createThreadFactory(final String threadName, final int stackSize) { - return new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - return new Thread(null, runnable, threadName, stackSize); - } - }; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/DhtPacketFolder.java b/apps/i2pbote/src/i2p/bote/folder/DhtPacketFolder.java deleted file mode 100644 index cc4f60a36..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/DhtPacketFolder.java +++ /dev/null @@ -1,58 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.network.DhtStorageHandler; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.io.File; -import java.io.FilenameFilter; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -/** - * This class uses dht keys for file names. - * - * @author HungryHobo@mail.i2p - * @param The type of DHT data stored in this folder - */ -public class DhtPacketFolder extends PacketFolder implements DhtStorageHandler { - private Log log = new Log(DhtPacketFolder.class); - - public DhtPacketFolder(File storageDir) { - super(storageDir); - } - - @Override - public void store(DhtStorablePacket packetToStore) { - add(packetToStore); - } - - @Override - public DhtStorablePacket retrieve(Hash dhtKey) { - final String base64Key = dhtKey.toBase64(); - - File[] files = storageDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return filenameMatches(name, base64Key); - } - }); - - if (files.length > 1) - log.warn("More than one packet files found for DHT key " + dhtKey); - if (files.length > 0) { - File file = files[0]; - return DhtStorablePacket.createPacket(file); - } - return null; - } - - protected boolean filenameMatches(String filename, String base64DhtKey) { - return filename.startsWith(base64DhtKey); - } - - @Override - protected String getFilename(DhtStorablePacket packet) { - return packet.getDhtKey().toBase64() + PACKET_FILE_EXTENSION; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/EmailFolder.java b/apps/i2pbote/src/i2p/bote/folder/EmailFolder.java deleted file mode 100644 index cf71f2758..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/EmailFolder.java +++ /dev/null @@ -1,54 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.packet.Email; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import javax.mail.MessagingException; - -import net.i2p.util.Log; - -/** - * Stores emails in a directory on the filesystem. Each email is stored in one file. - * The filename is the message Id plus an extension. - * - * @author HungryHobo@mail.i2p - */ -public class EmailFolder extends Folder { - protected static final String EMAIL_FILE_EXTENSION = ".mail"; - - private Log log = new Log(EmailFolder.class); - - public EmailFolder(File storageDir) { - super(storageDir, EMAIL_FILE_EXTENSION); - } - - // store an email file - public void add(Email email) throws MessagingException, IOException { - // write out the email file - File emailFile = getEmailFile(email); - log.info("Storing email in outbox: '"+ emailFile.getAbsolutePath() + "'"); - OutputStream emailOutputStream = new FileOutputStream(emailFile); - email.writeTo(emailOutputStream); - emailOutputStream.close(); - } - - private File getEmailFile(Email email) throws MessagingException { - return new File(storageDir, email.getMessageID() + EMAIL_FILE_EXTENSION); - } - - public void delete(Email email) throws MessagingException { - if (!getEmailFile(email).delete()) - log.error("Cannot delete file: '" + getEmailFile(email) + "'"); - } - - @Override - protected Email createFolderElement(File file) throws Exception { - FileInputStream inputStream = new FileInputStream(file); - return new Email(inputStream); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/Folder.java b/apps/i2pbote/src/i2p/bote/folder/Folder.java deleted file mode 100644 index d3bb0c37d..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/Folder.java +++ /dev/null @@ -1,96 +0,0 @@ -package i2p.bote.folder; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Iterator; - -import net.i2p.util.Log; - -/** - * - * @author HungryHobo@mail.i2p - * - * @param The type of objects the folder can store. - */ -public abstract class Folder implements Iterable { - private Log log = new Log(Folder.class); - protected File storageDir; - protected String fileExtension; - - protected Folder(File storageDir, String fileExtension) { - this.storageDir = storageDir; - this.fileExtension = fileExtension; - - if (!storageDir.exists() && !storageDir.mkdirs()) - log.error("Can't create directory: '" + storageDir + "'"); - } - - public File getStorageDirectory() { - return storageDir; - } - - public Collection getElements() { - Collection elements = new ArrayList(); - Iterator iterator = iterator(); - while (iterator.hasNext()) - elements.add(iterator.next()); - return elements; - } - - // An {@link Iterator} implementation that loads one file into memory at a time. - @Override - public final Iterator iterator() { - final File[] files = storageDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.toUpperCase().endsWith(fileExtension.toUpperCase()); - } - }); - log.debug(files.length + " files with the extension '" + fileExtension + "' found in '" + storageDir + "'."); - - // sort files by date, newest first - Arrays.sort(files, new Comparator() { - @Override - public int compare(File f1, File f2) { - return (int)Math.signum(f1.lastModified() - f2.lastModified()); - } - }); - - return new Iterator() { - int nextIndex = 0; - - @Override - public boolean hasNext() { - return nextIndex < files.length; - } - - @Override - public T next() { - File file = files[nextIndex]; - String filePath = file.getAbsolutePath(); - log.info("Reading file: '" + filePath + "'"); - try { - T nextElement = createFolderElement(file); - nextElement.setFile(file); - nextIndex++; - return nextElement; - } - catch (Exception e) { - log.error("Can't create a FolderElement from file: " + filePath, e); - return null; - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException("Use the Folder instance to delete a folder element."); - } - }; - } - - protected abstract T createFolderElement(File file) throws Exception; -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/FolderElement.java b/apps/i2pbote/src/i2p/bote/folder/FolderElement.java deleted file mode 100644 index c31cc4eb3..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/FolderElement.java +++ /dev/null @@ -1,17 +0,0 @@ -package i2p.bote.folder; - -import java.io.File; -import java.io.OutputStream; - -public interface FolderElement { - - void setFile(File file); - - /** - * Returns the {@link File} from which this packet was read, or null. - * @return - */ - File getFile(); - - void writeTo(OutputStream outputStream) throws Exception; -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/IncompleteEmailFolder.java b/apps/i2pbote/src/i2p/bote/folder/IncompleteEmailFolder.java deleted file mode 100644 index 03ea8ee37..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/IncompleteEmailFolder.java +++ /dev/null @@ -1,132 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.Email; -import i2p.bote.packet.EmailPacket; -import i2p.bote.packet.I2PBotePacket; -import i2p.bote.packet.UniqueId; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; - -import net.i2p.util.Log; - -/** - * File name format: _.pkt - * - * @author HungryHobo@mail.i2p - */ -public class IncompleteEmailFolder extends DhtPacketFolder { - private Log log = new Log(IncompleteEmailFolder.class); - private EmailFolder inbox; - - public IncompleteEmailFolder(File storageDir, EmailFolder inbox) { - super(storageDir); - this.inbox = inbox; - } - - public void add(EmailPacket packetToStore) { - super.add(packetToStore); - - // TODO possible optimization: if getNumFragments == 1, no need to check for other packet files - File[] finishedPacketFiles = getAllMatchingFiles(packetToStore.getMessageId()); - - // if all packets of the email are available, assemble them into an email - if (finishedPacketFiles.length == packetToStore.getNumFragments()) - assemble(finishedPacketFiles); - } - - private void assemble(File[] packetFiles) { - // No need to do this in a separate thread - new AssembleTask(packetFiles, inbox).run(); - } - - private File[] getAllMatchingFiles(UniqueId messageId) { - final String base64Id = messageId.toBase64(); - - return storageDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - int _index = name.indexOf('_'); - if (_index >= 0) - return name.substring(_index).startsWith(base64Id); - else { - log.error("Invalid file name: <" + name + ">, directory: <" + dir.getAbsolutePath() + ">"); - return false; - } - } - }); - } - - // Overridden to include the message id in the file name - protected String getFilename(EmailPacket packet) { - return packet.getDhtKey().toBase64() + packet.getMessageId() + PACKET_FILE_EXTENSION; - } - - // Overridden because the file format is different than what the superclass uses - @Override - protected boolean filenameMatches(String filename, String base64DhtKey) { - return filename.startsWith(base64DhtKey); - } - - /** - * Makes a set of {@link EmailPacket}s into an {@link Email}, stores the email in the inbox - * folder, and deletes the packet files. - * - * @author HungryHobo@mail.i2p - */ - private class AssembleTask implements Runnable { - File[] packetFiles; - - public AssembleTask(File[] packetFiles, EmailFolder inbox) { - this.packetFiles = packetFiles; - } - - @Override - public void run() { - EmailPacket[] packets = getEmailPackets(packetFiles).toArray(new EmailPacket[0]); - - // sort by fragment index - Arrays.sort(packets, new Comparator() { - @Override - public int compare(EmailPacket packet1, EmailPacket packet2) { - return new Integer(packet1.getFragmentIndex()).compareTo(packet2.getFragmentIndex()); - } - }); - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try { - for (EmailPacket packet: packets) - outputStream.write(packet.getContent()); - Email email = new Email(outputStream.toByteArray()); - inbox.add(email); - - // delete packets - for (File file: packetFiles) - if (!file.delete()) - log.warn("Email packet file not deleted: <" + file.getAbsolutePath() + ">"); - } - catch (Exception e) { - log.error("Error assembling/storing email, or deleting email packets. ", e); - return; - } - } - - private Collection getEmailPackets(File[] files) { - Collection packets = new ArrayList(); - for (File file: files) { - I2PBotePacket packet = DataPacket.createPacket(file); - if (packet instanceof EmailPacket) - packets.add((EmailPacket)packet); - else - log.error("Non-Email Packet found in the IncompleteEmailFolder, file: <" + file.getAbsolutePath() + ">"); - } - return packets; - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/IndexPacketFolder.java b/apps/i2pbote/src/i2p/bote/folder/IndexPacketFolder.java deleted file mode 100644 index 4879e3617..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/IndexPacketFolder.java +++ /dev/null @@ -1,42 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.packet.I2PBotePacket; -import i2p.bote.packet.IndexPacket; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.io.File; - -import net.i2p.util.Log; - -/** - * This class differs from {@link DhtPacketFolder} in that it doesn't overwrite an existing - * packet when a new packet is stored under the same key, but - * - * @author HungryHobo@mail.i2p - */ -public class IndexPacketFolder extends DhtPacketFolder { - private final Log log = new Log(I2PBotePacket.class); - - public IndexPacketFolder(File storageDir) { - super(storageDir); - } - - @Override - public void store(DhtStorablePacket packetToStore) { - if (!(packetToStore instanceof IndexPacket)) - throw new IllegalArgumentException("This class only stores packets of type " + IndexPacket.class.getSimpleName() + "."); - - IndexPacket indexPacketToStore = (IndexPacket)packetToStore; - DhtStorablePacket existingPacket = retrieve(packetToStore.getDhtKey()); - - // If an index packet with the same key exists in the folder, merge the two packets. - if (existingPacket instanceof IndexPacket) { - packetToStore = new IndexPacket(indexPacketToStore, (IndexPacket)existingPacket); - if (packetToStore.isTooBig()) - // TODO make two new index packets, put half the email packet keys in each one, store the two index packets on the DHT, and put the two index packet keys into the local index file (only keep those two). - log.error("After merging, IndexPacket is too big for a datagram: size=" + packetToStore.getSize()); - } - - super.store(packetToStore); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/Outbox.java b/apps/i2pbote/src/i2p/bote/folder/Outbox.java deleted file mode 100644 index 3bacd86b0..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/Outbox.java +++ /dev/null @@ -1,72 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.packet.Email; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; - -import javax.mail.MessagingException; - -import net.i2p.util.Log; - -/** - * Stores emails in a directory on the filesystem. For each email, two files are created; the actual - * email and a status file. - * Status files and email files have the same name, except for the extension. - * Even emails that need to be fragmented are stored as a whole. - * Message IDs are used for filenames. - * - * Status files contain a status for each recipient address. - * - * @author HungryHobo@mail.i2p - * - */ -public class Outbox extends EmailFolder implements Iterable { - private static final String STATUS_FILE_EXTENSION = ".status"; -// private static final String PARAM_QUEUE_DATE = "X-QueueDate"; - private static final Log log = new Log(Outbox.class); - - public Outbox(File storageDir) { - super(storageDir); - } - - // store one email file + one status file. - @Override - public void add(Email email) throws MessagingException, IOException { - // write out the email file - super.add(email); - - // collect info for status file - String queueDate = String.valueOf(System.currentTimeMillis()); - - // write out the status file - File statusFile = getStatusFile(email); - FileWriter statusFileWriter = new FileWriter(statusFile); - statusFileWriter.write(queueDate); - statusFileWriter.close(); - } - - private File getStatusFile(Email email) throws MessagingException { - return new File(storageDir, email.getMessageID() + STATUS_FILE_EXTENSION); - } - - // delete an email file + the status file - @Override - public void delete(Email email) throws MessagingException { - super.delete(email); - - if (!getStatusFile(email).delete()) - log.error("Cannot delete file: '" + getStatusFile(email) + "'"); - } - - /** - * - * @param email - * @param relayInfo A 0-length array means no relays were used, i.e. the email was sent directly to the recipient. - * @param statusMessage - */ - public void updateStatus(Email email, int[] relayInfo, String statusMessage) { - // TODO write out a new status file. filename is the msg id, statusMessage goes into the file. - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/folder/PacketFolder.java b/apps/i2pbote/src/i2p/bote/folder/PacketFolder.java deleted file mode 100644 index 7bd7d6ab5..000000000 --- a/apps/i2pbote/src/i2p/bote/folder/PacketFolder.java +++ /dev/null @@ -1,62 +0,0 @@ -package i2p.bote.folder; - -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.UniqueId; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - -import net.i2p.util.Log; - -/** - * This class stores new files under a random file name with the .pkt extension. - * - * @author HungryHobo@mail.i2p - * @param The type of data stored in this folder - */ -public class PacketFolder extends Folder { - protected static final String PACKET_FILE_EXTENSION = ".pkt"; - - private Log log = new Log(PacketFolder.class); - - public PacketFolder(File storageDir) { - super(storageDir, PACKET_FILE_EXTENSION); - } - - public void add(DhtStorablePacket packetToStore) { - String filename = getFilename(packetToStore); - FileOutputStream outputStream = null; - try { - File file = new File(storageDir, filename); - outputStream = new FileOutputStream(file); - packetToStore.writeTo(outputStream); - } catch (Exception e) { - log.error("Can't save packet to file: <" + filename + ">", e); - } - finally { - if (outputStream != null) - try { - outputStream.close(); - } - catch (IOException e) { - log.error("Can't close file: <" + filename + ">", e); - } - } - } - - public void delete(UniqueId packetId) { - // TODO - } - - protected String getFilename(DhtStorablePacket packet) { - return new UniqueId().toBase64() + PACKET_FILE_EXTENSION; - } - - @Override - @SuppressWarnings("unchecked") - protected T createFolderElement(File file) throws Exception { - return (T)DataPacket.createPacket(file); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/DHT.java b/apps/i2pbote/src/i2p/bote/network/DHT.java deleted file mode 100644 index a997227a5..000000000 --- a/apps/i2pbote/src/i2p/bote/network/DHT.java +++ /dev/null @@ -1,34 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.util.Collection; - -import net.i2p.data.Hash; - -public interface DHT { - - void store(DhtStorablePacket packet) throws Exception; - - DhtStorablePacket findOne(Hash key, Class dataType); - - Collection findAll(Hash key, Class dataType); - - /** - * Registers a DhtStorageHandler that handles incoming storage requests of a certain - * type (but not its subclasses). - * @param packetType - * @param storageHandler - */ - void setStorageHandler(Class packetType, DhtStorageHandler storageHandler); - - /** - * Returns the current number of known active peers. - * @return - */ - int getNumPeers(); - - void start(); - - void shutDown(); -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/DhtStorageHandler.java b/apps/i2pbote/src/i2p/bote/network/DhtStorageHandler.java deleted file mode 100644 index b99e057fe..000000000 --- a/apps/i2pbote/src/i2p/bote/network/DhtStorageHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.dht.DhtStorablePacket; -import net.i2p.data.Hash; - -/** - * Defines methods for accessing a local DHT store. - * - * @author HungryHobo@mail.i2p - */ -public interface DhtStorageHandler { - - void store(DhtStorablePacket packetToStore); - - // Retrieves a packet by DHT key. If no matching packet is found, null is returned. - DhtStorablePacket retrieve(Hash dhtKey); -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/EmailAddressResolver.java b/apps/i2pbote/src/i2p/bote/network/EmailAddressResolver.java deleted file mode 100644 index f58652cab..000000000 --- a/apps/i2pbote/src/i2p/bote/network/EmailAddressResolver.java +++ /dev/null @@ -1,18 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.EmailDestination; - -public class EmailAddressResolver { - - /** - * Looks up a key pair for an email address. This method blocks. - * The local address book is searched first, then the distributed - * email directory. - * @param emailAddress - * @return An EmailDestination, or null if none is found - */ - public EmailDestination getDestination(String emailAddress) { - // TODO - return null; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/I2PPacketDispatcher.java b/apps/i2pbote/src/i2p/bote/network/I2PPacketDispatcher.java deleted file mode 100644 index 983ca79bb..000000000 --- a/apps/i2pbote/src/i2p/bote/network/I2PPacketDispatcher.java +++ /dev/null @@ -1,101 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.I2PBotePacket; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; -import net.i2p.client.I2PSessionListener; -import net.i2p.client.datagram.I2PDatagramDissector; -import net.i2p.client.datagram.I2PInvalidDatagramException; -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.util.Log; - -/** - * An {@link I2PSessionListener} that receives datagrams from the I2P network and notifies {@link PacketListener}s. - * - * @author HungryHobo@mail.i2p - */ -public class I2PPacketDispatcher implements I2PSessionListener { - private Log log = new Log(I2PPacketDispatcher.class); - private List packetListeners; - - public I2PPacketDispatcher() { - packetListeners = Collections.synchronizedList(new ArrayList()); - } - - public void addPacketListener(PacketListener listener) { - packetListeners.add(listener); - } - - public void removePacketListener(PacketListener listener) { - packetListeners.remove(listener); - } - - private void firePacketReceivedEvent(CommunicationPacket packet, Destination sender) { - for (PacketListener listener: packetListeners) - listener.packetReceived(packet, sender, System.currentTimeMillis()); - } - - public void shutDown() { - } - - // I2PSessionListener implementation follows - - @Override - public void reportAbuse(I2PSession session, int severity) { - } - - @Override - public void messageAvailable(I2PSession session, int msgId, long size) { - byte[] msg = new byte[0]; - try { - msg = session.receiveMessage(msgId); - } catch (I2PSessionException e) { - log.error("Can't get new message from I2PSession.", e); - } - I2PDatagramDissector datagramDissector = new I2PDatagramDissector(); - try { - datagramDissector.loadI2PDatagram(msg); - datagramDissector.verifySignature(); // TODO keep this line or remove it? - byte[] payload = datagramDissector.extractPayload(); - Destination sender = datagramDissector.getSender(); - - CommunicationPacket packet = CommunicationPacket.createPacket(payload); - if (packet == null) - log.debug("Ignoring unparseable packet."); - else { - logPacket(packet, sender); - firePacketReceivedEvent(packet, sender); - } - } - catch (DataFormatException e) { - log.error("Invalid datagram received.", e); - e.printStackTrace(); - } - catch (I2PInvalidDatagramException e) { - log.error("Datagram failed verification.", e); - e.printStackTrace(); - } - } - - private void logPacket(I2PBotePacket packet, Destination sender) { - String senderHash = sender.calculateHash().toBase64().substring(0, 8) + "..."; - log.debug("I2P packet received: [" + packet + "] Sender: [" + senderHash + "]"); - } - - @Override - public void errorOccurred(I2PSession session, String message, Throwable error) { - log.error("Router says: " + message, error); - } - - @Override - public void disconnected(I2PSession session) { - log.warn("I2P session disconnected."); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/I2PSendQueue.java b/apps/i2pbote/src/i2p/bote/network/I2PSendQueue.java deleted file mode 100644 index 8f3e26e23..000000000 --- a/apps/i2pbote/src/i2p/bote/network/I2PSendQueue.java +++ /dev/null @@ -1,354 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.RelayPacket; -import i2p.bote.packet.RelayRequest; -import i2p.bote.packet.ResponsePacket; -import i2p.bote.packet.StatusCode; -import i2p.bote.packet.UniqueId; -import i2p.bote.service.I2PBoteThread; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; -import net.i2p.client.datagram.I2PDatagramMaker; -import net.i2p.data.Destination; -import net.i2p.util.ConcurrentHashSet; -import net.i2p.util.Log; - -import com.nettgryppa.security.HashCash; - -/** - * All outgoing I2P traffic goes through this class. - * Packets are sent at a rate no greater than specified by the - * maxBandwidth property. - * - * @author HungryHobo@mail.i2p - * - */ -public class I2PSendQueue extends I2PBoteThread implements PacketListener { - private Log log = new Log(I2PSendQueue.class); - private I2PSession i2pSession; - private SortedSet packetQueue; - private Map outstandingRequests; // sent packets that haven't been responded to - private Set runningBatches; - private int maxBandwidth; - private Collection sendQueueListeners; - private Map timeoutValues; - - /** - * @param i2pSession - * @param i2pReceiver - */ - public I2PSendQueue(I2PSession i2pSession, I2PPacketDispatcher i2pReceiver) { - super("I2PSendQueue"); - - this.i2pSession = i2pSession; - i2pReceiver.addPacketListener(this); - packetQueue = new ConcurrentSkipListSet(); - outstandingRequests = new ConcurrentHashMap(); - runningBatches = new ConcurrentHashSet(); - sendQueueListeners = Collections.synchronizedCollection(new ArrayList()); - timeoutValues = new HashMap(); - } - - /** - * Queues a packet for sending ASAP. - * @param packet - * @param destination - */ - public void send(CommunicationPacket packet, Destination destination) { - send(packet, destination, 0); - } - - /** - * Queues a packet for sending ASAP and waits for up to timeoutSeconds for a response. - * @param packet - * @param destination - * @param timeoutMilliSeconds - * @return The response packet, or null if a timeout occurred. - * @throws InterruptedException - */ - public CommunicationPacket sendAndWait(CommunicationPacket packet, Destination destination, long timeoutMilliSeconds) throws InterruptedException { - ScheduledPacket scheduledPacket = new ScheduledPacket(packet, destination, 0); - - long scheduleTime = System.currentTimeMillis(); - packetQueue.add(scheduledPacket); - scheduledPacket.awaitSending(); - outstandingRequests.put(packet.getPacketId(), scheduledPacket); - scheduledPacket.awaitResponse(timeoutMilliSeconds, TimeUnit.MILLISECONDS); - - if (log.shouldLog(Log.DEBUG)) { - long responseTime = scheduledPacket.getResponseTime(); - String responseInfo = responseTime<0?"timed out":"took " + (responseTime-scheduledPacket.getSentTime()) + "ms."; - log.debug("Packet with id " + packet.getPacketId() + " was queued for " + (scheduledPacket.getSentTime()-scheduleTime) + " ms, response " + responseInfo); - } - - return scheduledPacket.getResponse(); - } - - /** - * Queues a packet for sending at or after a certain time. - * @param packet - * @param destination - * @param earliestSendTime - */ - public void send(CommunicationPacket packet, Destination destination, long earliestSendTime) { - packetQueue.add(new ScheduledPacket(packet, destination, earliestSendTime)); - } - - public void sendRelayRequest(RelayPacket relayPacket, HashCash hashCash, long earliestSendTime) { - RelayRequest relayRequest = new RelayRequest(hashCash, relayPacket); - ScheduledPacket scheduledPacket = new ScheduledPacket(relayRequest, relayPacket.getNextDestination(), earliestSendTime); - packetQueue.add(scheduledPacket); - } - - /** - * Sends a Response Packet to a {@link Destination}, with the status code "OK". - * @param packet - * @param destination - * @param requestPacketId The packet id of the packet we're responding to - */ - public void sendResponse(DataPacket packet, Destination destination, UniqueId requestPacketId) { - sendResponse(packet, destination, StatusCode.OK, requestPacketId); - } - - /** - * Sends a Response Packet to a {@link Destination}. - * @param packet - * @param destination - * @param statusCode - * @param requestPacketId The packet id of the packet we're responding to - */ - public void sendResponse(DataPacket packet, Destination destination, StatusCode statusCode, UniqueId requestPacketId) { - send(new ResponsePacket(packet, statusCode, requestPacketId), destination); - } - - /** - * Sends a batch of packets, each to its own destination. - * Replies to the batch's packets are received until {@link remove(PacketBatch)} is called. - * @param batch - */ - public void send(PacketBatch batch) { - for (PacketBatchItem batchItem: batch) { - ScheduledPacket scheduledPacket = new ScheduledPacket(batchItem.getPacket(), batchItem.getDestination(), 0, batch); - packetQueue.add(scheduledPacket); - } - } - - public void remove(PacketBatch batch) { - runningBatches.remove(batch); - } - - public int getQueueLength() { - return packetQueue.size(); - } - - /** - * Set the maximum outgoing bandwidth in kbits/s - * @param maxBandwidth - */ - public void setMaxBandwidth(int maxBandwidth) { - this.maxBandwidth = maxBandwidth; - } - - /** - * Return the maximum outgoing bandwidth in kbits/s - * @return - */ - public int getMaxBandwidth() { - return maxBandwidth; - } - - public void addSendQueueListener(SendQueuePacketListener listener) { - addSendQueueListener(listener, null); - } - - /** - * Add a {@link SendQueuePacketListener} that is automatically removed after - * timeout milliseconds. - * @param listener - * @param timeout - */ - public void addSendQueueListener(SendQueuePacketListener listener, Long timeout) { - sendQueueListeners.add(listener); - timeoutValues.put(listener, timeout); - } - - public void removeSendQueueListener(SendQueuePacketListener listener) { - sendQueueListeners.remove(listener); - timeoutValues.remove(listener); - } - - private void firePacketListeners(CommunicationPacket packet) { - for (SendQueuePacketListener listener: sendQueueListeners) - listener.packetSent(packet); - } - - // Implementation of PacketListener - @Override - public void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime) { - if (packet instanceof ResponsePacket) { - log.debug("Response Packet received: Packet Id = " + packet.getPacketId() + " Sender = " + sender); - - UniqueId packetId = packet.getPacketId(); - - for (PacketBatch batch: runningBatches) - if (batch.contains(packetId)) - batch.addResponsePacket(packet); - - // Remove the original request if it is on the list, and notify objects waiting on a response - ScheduledPacket requestPacket = outstandingRequests.remove(packetId); - if (requestPacket != null) { - requestPacket.setResponse(packet); - requestPacket.decrementResponseLatch(); - } - - // If there is a packet file for the original packet, it can be deleted now. - // Use the cached filename if the packet was in the cache; otherwise, find the file by packet Id -/* ScheduledPacket cachedPacket = recentlySentCache.remove(packetId); - if (cachedPacket != null) - fileManager.removePacketFile(cachedPacket); - else - fileManager.removePacketFile(packetId);*/ - } - } - - @Override - public void run() { - I2PDatagramMaker datagramMaker = new I2PDatagramMaker(i2pSession); - - while (true) { - if (packetQueue.isEmpty()) - try { - TimeUnit.SECONDS.sleep(1); - } - catch (InterruptedException e) { - log.warn("Interrupted while waiting for new packets.", e); - } - else { - ScheduledPacket scheduledPacket = packetQueue.last(); - CommunicationPacket i2pBotePacket = scheduledPacket.data; - - // wait long enough so rate <= maxBandwidth; - if (maxBandwidth > 0) { - int packetSizeBits = i2pBotePacket.getSize() * 8; - int maxBWBitsPerSecond = maxBandwidth * 1024; - long waitTimeMsecs = 1000L * packetSizeBits / maxBWBitsPerSecond; - if (System.currentTimeMillis()+waitTimeMsecs < scheduledPacket.earliestSendTime) - waitTimeMsecs = scheduledPacket.earliestSendTime; - try { - TimeUnit.MILLISECONDS.sleep(waitTimeMsecs); - } - catch (InterruptedException e) { - log.warn("Interrupted while waiting to send packet.", e); - } - } - - log.debug("Sending packet: [" + i2pBotePacket + "] to peer: " + scheduledPacket.destination.toBase64()); - byte[] replyableDatagram = datagramMaker.makeI2PDatagram(i2pBotePacket.toByteArray()); - try { - i2pSession.sendMessage(scheduledPacket.destination, replyableDatagram); - - // set sentTime; update queue+cache, update countdown latch, fire packet listeners - scheduledPacket.data.setSentTime(System.currentTimeMillis()); - packetQueue.remove(scheduledPacket); - if (scheduledPacket.batch != null) - scheduledPacket.batch.decrementSentLatch(); - scheduledPacket.decrementSentLatch(); - firePacketListeners(scheduledPacket.data); - } - catch (I2PSessionException e) { - log.error("Can't send packet.", e); - } - } - } - } - - private class ScheduledPacket implements Comparable { - CommunicationPacket data; - Destination destination; - long earliestSendTime; - PacketBatch batch; // the batch this packet belongs to, or null if not part of a batch - long sentTime; - long responseTime; - CountDownLatch sentSignal; - CountDownLatch responseSignal; - CommunicationPacket response; - - public ScheduledPacket(CommunicationPacket packet, Destination destination, long earliestSendTime) { - this(packet, destination, earliestSendTime, null); - } - - public ScheduledPacket(CommunicationPacket packet, Destination destination, long earliestSendTime, PacketBatch batch) { - this.data = packet; - this.destination = destination; - this.earliestSendTime = earliestSendTime; - this.batch = batch; - this.sentSignal = new CountDownLatch(1); - this.responseSignal = new CountDownLatch(1); - this.responseTime = -1; - } - - @Override - public int compareTo(ScheduledPacket anotherPacket) { - return new Long(earliestSendTime).compareTo(anotherPacket.earliestSendTime); - } - - public void decrementSentLatch() { - sentTime = System.currentTimeMillis(); - sentSignal.countDown(); - } - - public void awaitSending() throws InterruptedException { - sentSignal.await(); - } - - public long getSentTime() { - return sentTime; - } - - /** - * Returns the time at which a response packet was received, or -1 if no response. - * @return - */ - public long getResponseTime() { - return responseTime; - } - - public void decrementResponseLatch() { - responseTime = System.currentTimeMillis(); - responseSignal.countDown(); - } - - public void awaitResponse(long timeout, TimeUnit unit) throws InterruptedException { - responseSignal.await(timeout, unit); - } - - public void setResponse(CommunicationPacket response) { - this.response = response; - } - - /** - * If this packet was sent via sendAndWait, and a response packet has been - * received (i.e., a packet with the same packet id), this method returns the response packet. - * Otherwise, null is returned. - * @return - */ - public CommunicationPacket getResponse() { - return response; - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/PacketBatch.java b/apps/i2pbote/src/i2p/bote/network/PacketBatch.java deleted file mode 100644 index dec2b8df3..000000000 --- a/apps/i2pbote/src/i2p/bote/network/PacketBatch.java +++ /dev/null @@ -1,108 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.I2PBotePacket; -import i2p.bote.packet.UniqueId; - -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import net.i2p.data.Destination; -import net.i2p.util.ConcurrentHashSet; - -/** - * This class is used for sending a number of packets to other nodes, - * and collecting the response packets. - * - * @author HungryHobo@mail.i2p - * - */ -// TODO use I2PSendQueue.sendAndWait(), get rid of PacketBatch.sentSignal, etc? -public class PacketBatch implements Iterable { - private Map outgoingPackets; - private Set incomingPackets; - private CountDownLatch sentSignal; // this field is lazy-initialized - private CountDownLatch firstReplyReceivedSignal; - - public PacketBatch() { - outgoingPackets = new ConcurrentHashMap(); - incomingPackets = new ConcurrentHashSet(); - firstReplyReceivedSignal = new CountDownLatch(1); - } - - public void putPacket(CommunicationPacket packet, Destination destination) { - outgoingPackets.put(packet.getPacketId(), new PacketBatchItem(packet, destination)); - } - - /** - * Return true if the batch contains a packet with a given {@link UniqueId}. - * @param packetId - * @return - */ - public boolean contains(final UniqueId packetId) { - return outgoingPackets.containsKey(packetId); - } - - public int getPacketCount() { - return outgoingPackets.keySet().size(); - } - - public Iterator iterator() { - return outgoingPackets.values().iterator(); - } - -/* private void decrementConfirmedLatch() { - initSignals(); - confirmedSignal.countDown(); - } - - boolean areAllPacketsConfirmed() { - return confirmedSignal.getCount() == 0; - } - - boolean isPacketConfirmed(UniqueId packetId) { - decrementConfirmedLatch(); - return packetMap.get(packetId).isDeliveryConfirmed(); - }*/ - - /** - * Notify the PacketBatch that delivery confirmation has been received for - * a packet. - * @param packetId - */ -/* void confirmDelivery(UniqueId packetId) { - if (outgoingPackets.containsKey(packetId)) - outgoingPackets.get(packetId).confirmDelivery(); - }*/ - - void addResponsePacket(I2PBotePacket packet) { - incomingPackets.add(packet); - firstReplyReceivedSignal.countDown(); - } - - public Set getResponsePackets() { - return incomingPackets; - } - - void decrementSentLatch() { - getSentSignal().countDown(); - } - - private synchronized CountDownLatch getSentSignal() { - if (sentSignal == null) - sentSignal = new CountDownLatch(getPacketCount()); - return sentSignal; - } - - public void awaitSendCompletion() throws InterruptedException { - getSentSignal().await(5, TimeUnit.MINUTES); - } - - public void awaitFirstReply(long timeout, TimeUnit timeoutUnit) throws InterruptedException { - firstReplyReceivedSignal.await(timeout, timeoutUnit); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/PacketBatchItem.java b/apps/i2pbote/src/i2p/bote/network/PacketBatchItem.java deleted file mode 100644 index 8afe58e99..000000000 --- a/apps/i2pbote/src/i2p/bote/network/PacketBatchItem.java +++ /dev/null @@ -1,32 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.CommunicationPacket; -import net.i2p.data.Destination; - -public class PacketBatchItem { - private CommunicationPacket packet; - private Destination destination; - private boolean confirmed; - - PacketBatchItem(CommunicationPacket packet, Destination destination) { - this.packet = packet; - this.destination = destination; - confirmed = false; - } - - public CommunicationPacket getPacket() { - return packet; - } - - public Destination getDestination() { - return destination; - } - - void confirmDelivery() { - confirmed = true; - } - - boolean isDeliveryConfirmed() { - return confirmed; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/PacketListener.java b/apps/i2pbote/src/i2p/bote/network/PacketListener.java deleted file mode 100644 index 42e020cef..000000000 --- a/apps/i2pbote/src/i2p/bote/network/PacketListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.CommunicationPacket; - -import java.util.EventListener; - -import net.i2p.data.Destination; - -public interface PacketListener extends EventListener { - - void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime); -} diff --git a/apps/i2pbote/src/i2p/bote/network/PeerManager.java b/apps/i2pbote/src/i2p/bote/network/PeerManager.java deleted file mode 100644 index eada4f5a2..000000000 --- a/apps/i2pbote/src/i2p/bote/network/PeerManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package i2p.bote.network; - -import net.i2p.data.Destination; - -public class PeerManager { - - public PeerManager() { - } - - /** - * Return a random active peer. - * - * The peers are managed independently of the Kademlia peers because they need to - * be uniformly distributed across the key space to prevent leaking information about - * the local destination key to nodes that could link it to the local email address. - * @return - */ - public Destination getRandomPeer() { - return null; - } - - public int getNumPeers() { - // TODO - return 0; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/SendQueuePacketListener.java b/apps/i2pbote/src/i2p/bote/network/SendQueuePacketListener.java deleted file mode 100644 index 60fd57173..000000000 --- a/apps/i2pbote/src/i2p/bote/network/SendQueuePacketListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package i2p.bote.network; - -import i2p.bote.packet.I2PBotePacket; - -public interface SendQueuePacketListener { - - /** - * - * @param packet - */ - void packetSent(I2PBotePacket packet); -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/BucketManager.java b/apps/i2pbote/src/i2p/bote/network/kademlia/BucketManager.java deleted file mode 100644 index 57c950e71..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/BucketManager.java +++ /dev/null @@ -1,323 +0,0 @@ -package i2p.bote.network.kademlia; - -import i2p.bote.network.I2PSendQueue; -import i2p.bote.network.PacketListener; -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.service.I2PBoteThread; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.util.ConcurrentHashSet; -import net.i2p.util.Log; -import net.i2p.util.RandomSource; - -// TODO if a sibling times out, refill the sibling table -public class BucketManager extends I2PBoteThread implements PacketListener { - private static final int INTERVAL = 5 * 60 * 1000; - private static final int PING_TIMEOUT = 20 * 1000; - - private Log log = new Log(BucketManager.class); - private I2PSendQueue sendQueue; - private List kBuckets; - private KBucket siblingBucket; // TODO [ordered furthest away to closest in terms of hash distance to local node] - private Hash localDestinationHash; - - public BucketManager(I2PSendQueue sendQueue, Collection initialPeers, Hash localDestinationHash) { - super("BucketMgr"); - this.sendQueue = sendQueue; - this.localDestinationHash = localDestinationHash; - kBuckets = Collections.synchronizedList(new ArrayList()); - kBuckets.add(new KBucket(KBucket.MIN_HASH_VALUE, KBucket.MAX_HASH_VALUE, 0, true)); // this is the root bucket, so depth=0 - siblingBucket = new KBucket(KBucket.MIN_HASH_VALUE, KBucket.MAX_HASH_VALUE, 0, false); - addAll(initialPeers); - } - - public void addAll(Collection nodes) { - for (KademliaPeer node: nodes) - addOrUpdate(node); - } - - /** - * Add a {@link KademliaPeer} to the sibling list or a bucket. - * @param peer - */ - public void addOrUpdate(KademliaPeer peer) { - Hash peerHash = peer.getDestinationHash(); - log.debug("Adding/updating peer: Hash = " + peerHash); - - peer.resetStaleCounter(); - - synchronized(this) { - if (!siblingBucket.isFull() || siblingBucket.contains(peer)) { - siblingBucket.addOrUpdate(peer); - getBucket(peerHash).remove(peer); - } - else if (isCloserSibling(peer)) { - KademliaPeer ejectedPeer = siblingBucket.getMostDistantPeer(localDestinationHash); - - addToBucket(ejectedPeer); - siblingBucket.remove(ejectedPeer); - - siblingBucket.addOrUpdate(peer); - getBucket(peerHash).remove(peer); - } - else - addToBucket(peer); - } - logBucketStats(); - -/* KademliaPeer ejectedPeer = addSibling(peer); - // if the peer was added as a sibling, it may need to be removed from a bucket - if (ejectedPeer != peer) - getBucket(peerHash).remove(peer); - // if the peer didn't get added as a sibling, try a bucket - else - addToBucket(peer); - // if adding the peer to the list of siblings replaced another sibling, add the old sibling to a bucket - if (ejectedPeer != null) - addToBucket(ejectedPeer);*/ - -/*TODO synchronized(siblings) { - if (siblings.isFull()) { - KBucket bucket = getBucket(nodeHash); - KademliaPeer mostDistantSibling = getMostDistantSibling(); - if (getDistance(node.getDestinationHash()) < getDistance(mostDistantSibling)) { - bucket.addOrUpdate(mostDistantSibling); - siblings.remove(mostDistantSibling); - siblings.add(node); - } - else - bucket.addOrUpdate(node); - } - else { - siblings.add(node); - }*/ - - } - - private void logBucketStats() { - int numBuckets = kBuckets.size(); - int numPeers = getAllPeers().size(); - - log.debug("#buckets=" + numBuckets + "+sibBkt, #peers=" + numPeers); - } - - /** - * Add a {@link KademliaPeer} to the appropriate bucket. - * @param peer - */ - private void addToBucket(KademliaPeer peer) { - Hash nodeHash = peer.getDestinationHash(); - KBucket bucket = getBucket(nodeHash); - KBucket newBucket = bucket.addOrSplit(peer); - if (newBucket != null) - kBuckets.add(newBucket); - } - - /** - * Return true if a given peer is closer to the local node than at - * least one sibling. In other words, test if peer should replace - * an existing sibling. - * @param peer - * @return - */ - private boolean isCloserSibling(KademliaPeer peer) { - BigInteger peerDistance = KademliaUtil.getDistance(peer, localDestinationHash); - for (KademliaPeer sibling: siblingBucket) { - BigInteger siblingDistance = KademliaUtil.getDistance(sibling.getDestinationHash(), localDestinationHash); - if (peerDistance.compareTo(siblingDistance) < 0) - return true; - } - return false; - } - - /** - * Add a peer to the sibling list if the list is not full, or if there is a node that can be - * replaced. - * - * If peer replaced an existing sibling, that sibling is returned. - * If peer could not be added to the list, peer is returned. - * If the list was not full, null is returned. - * @param peer - * @return - */ -/* private KademliaPeer addSibling(KademliaPeer peer) { - // no need to handle a replacement cache because the sibling bucket has none. - KademliaPeer mostDistantSibling = siblingBucket.getMostDistantPeer(localDestinationHash); - if (!siblingBucket.isFull()) { - siblingBucket.add(peer); - return null; - } - else if (new PeerDistanceComparator(localDestinationHash).compare(peer, mostDistantSibling) < 0) { - siblingBucket.remove(mostDistantSibling); - siblingBucket.add(peer); - return mostDistantSibling; - } - else - return peer; - }*/ - - public void remove(KademliaPeer peer) { - Hash nodeHash = peer.getDestinationHash(); - getBucket(nodeHash).remove(peer); - } - - /** - * Do a binary search for the index of the bucket whose key range contains a given {@link Hash}. - * @param key - * @return - */ - private int getBucketIndex(Hash key) { - // initially, the search interval is 0..n-1 - int lowEnd = 0; - int highEnd = kBuckets.size(); - - BigInteger keyValue = new BigInteger(key.getData()); - while (lowEnd < highEnd) { - int centerIndex = (highEnd + lowEnd) / 2; - if (keyValue.compareTo(kBuckets.get(centerIndex).getStartId()) < 0) - highEnd = centerIndex; - else if (keyValue.compareTo(kBuckets.get(centerIndex).getEndId()) > 0) - lowEnd = centerIndex; - else - return centerIndex; - } - - log.error("This should never happen! No k-bucket found for hash: " + key); - return -1; - } - - /** - * Do a binary search for the bucket whose key range contains a given {@link Hash}. - * @param key - * @return - */ - private KBucket getBucket(Hash key) { - return kBuckets.get(getBucketIndex(key)); - } - - /** - * Return the count peers that are closest to a given key. - * Less than count peers may be returned if there aren't - * enough peers in the k-buckets. - * @param key - * @param count - * @return - */ - public Collection getClosestPeers(Hash key, int count) { - Collection closestPeers = new ConcurrentHashSet(); - - // TODO don't put all peers in one huge list, only use two buckets at a time - KademliaPeer[] allPeers = getAllPeersSortedByDistance(key); - - for (int i=0; i allPeers = getAllPeers(); - KademliaPeer[] peerArray = getAllPeers().toArray(new KademliaPeer[allPeers.size()]); - Arrays.sort(peerArray, new PeerDistanceComparator(key)); - return peerArray; - } - - private List getAllPeers() { - List allPeers = new ArrayList(); - for (KBucket bucket: kBuckets) - allPeers.addAll(bucket.getNodes()); - allPeers.addAll(siblingBucket.getNodes()); - return allPeers; - } - - /** - * Return all siblings of the local node (siblings are an S/Kademlia feature). - * @return - */ - public List getSiblings() { - List siblingDestinations = new ArrayList(); - for (KademliaPeer sibling: siblingBucket) - siblingDestinations.add(sibling); - return siblingDestinations; - } - - /** - * Return the total number of known Kademlia peers. - * @return - */ - public int getPeerCount() { - int count = 0; - for (KBucket bucket: kBuckets) - count += bucket.size(); - count += siblingBucket.size(); - return count; - } - - /** - * "refresh all k-buckets further away than the closest neighbor. This refresh is just a lookup of a random key that is within that k-bucket range." - */ - public void refreshAll() { - for (KBucket bucket: kBuckets) - refresh(bucket); - } - - private void refresh(KBucket bucket) { - byte[] randomHash = new byte[Hash.HASH_LENGTH]; - for (int i=0; i { - private Hash reference; - - PeerDistanceComparator(Hash reference) { - this.reference = reference; - } - - @Override - public int compare(KademliaPeer peer1, KademliaPeer peer2) { - BigInteger distance1 = KademliaUtil.getDistance(peer1.getDestinationHash(), reference); - BigInteger distance2 = KademliaUtil.getDistance(peer2.getDestinationHash(), reference); - return distance1.compareTo(distance2); - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/ClosestNodesLookupTask.java b/apps/i2pbote/src/i2p/bote/network/kademlia/ClosestNodesLookupTask.java deleted file mode 100644 index d98e78fdf..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/ClosestNodesLookupTask.java +++ /dev/null @@ -1,198 +0,0 @@ -package i2p.bote.network.kademlia; - -import i2p.bote.network.I2PPacketDispatcher; -import i2p.bote.network.I2PSendQueue; -import i2p.bote.network.PacketListener; -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.PeerList; -import i2p.bote.packet.ResponsePacket; -import i2p.bote.packet.UniqueId; -import i2p.bote.packet.dht.FindClosePeersPacket; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; - -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.util.ConcurrentHashSet; -import net.i2p.util.Log; - -public class ClosestNodesLookupTask implements Runnable { - private static final int REQUEST_TIMEOUT = 30 * 1000; - private static final int CLOSEST_NODES_LOOKUP_TIMEOUT = 2 * 60 * 1000; // the maximum amount of time a FIND_CLOSEST_NODES can take - - private Log log = new Log(ClosestNodesLookupTask.class); - private Hash key; - private I2PPacketDispatcher i2pReceiver; - private BucketManager bucketManager; - private Random randomNumberGenerator; - private I2PSendQueue sendQueue; - private Set responseReceived; - private Set notQueriedYet; - private Set pendingRequests; - - public ClosestNodesLookupTask(Hash key, I2PSendQueue sendQueue, I2PPacketDispatcher i2pReceiver, BucketManager bucketManager) { - this.key = key; - this.sendQueue = sendQueue; - this.i2pReceiver = i2pReceiver; - this.bucketManager = bucketManager; - randomNumberGenerator = new Random(getTime()); - responseReceived = new TreeSet(new HashDistanceComparator(key)); // nodes that have responded to a query; sorted by distance to the key - notQueriedYet = new ConcurrentHashSet(); // peers we haven't contacted yet - pendingRequests = new ConcurrentHashSet(); // outstanding queries - } - - @Override - public void run() { - log.debug("Looking up nodes closest to " + key); - - PacketListener packetListener = new IncomingPacketHandler(); - i2pReceiver.addPacketListener(packetListener); - - // prepare a list of close nodes (might need more than alpha if they don't all respond) - notQueriedYet.addAll(bucketManager.getClosestPeers(key, KademliaConstants.S)); - - long startTime = getTime(); - while (true) { - // send new requests if less than alpha are pending - while (pendingRequests.size()= KademliaConstants.S) - break; - if (hasTimedOut(startTime, CLOSEST_NODES_LOOKUP_TIMEOUT)) { - log.error("Lookup for closest nodes timed out."); - break; - } - } - log.debug(responseReceived.size() + " nodes found."); - - i2pReceiver.removePacketListener(packetListener); - } - - private KademliaPeer selectRandom(Collection collection) { - KademliaPeer[] array = new KademliaPeer[collection.size()]; - int index = randomNumberGenerator.nextInt(array.length); - return collection.toArray(array)[index]; - } - - private long getTime() { - return System.currentTimeMillis(); - } - - private boolean hasTimedOut(long startTime, long timeout) { - return getTime() > startTime + timeout; - } - - /** - * Return up to s peers. - * @return - */ - public List getResults() { - List resultsList = new ArrayList(); - for (Destination destination: responseReceived) - resultsList.add(destination); - Collections.sort(resultsList, new HashDistanceComparator(key)); - - // trim the list to the k closest nodes - if (resultsList.size() > KademliaConstants.S) - resultsList = resultsList.subList(0, KademliaConstants.S); - return resultsList; - } - - /** - * Return true if a set of peers contains a given peer. - * @param peerSet - * @param peerToFind - * @return - */ - private boolean contains(Set peerSet, KademliaPeer peerToFind) { - Hash peerHash = peerToFind.getDestinationHash(); - for (KademliaPeer peer: peerSet) - if (peer.getDestinationHash().equals(peerHash)) - return true; - return false; - } - - // compares two Destinations in terms of closeness to reference - private class HashDistanceComparator implements Comparator { - private Hash reference; - - public HashDistanceComparator(Hash reference) { - this.reference = reference; - } - - public int compare(Destination dest1, Destination dest2) { - BigInteger dest1Distance = KademliaUtil.getDistance(dest1.calculateHash(), reference); - BigInteger dest2Distance = KademliaUtil.getDistance(dest2.calculateHash(), reference); - return dest1Distance.compareTo(dest2Distance); - } - }; - - private class IncomingPacketHandler implements PacketListener { - @Override - public void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime) { - if (packet instanceof ResponsePacket) { - ResponsePacket responsePacket = (ResponsePacket)packet; - DataPacket payload = responsePacket.getPayload(); - if (payload instanceof PeerList) - addPeers(responsePacket, (PeerList)payload, sender, receiveTime); - } - } - - private void addPeers(ResponsePacket responsePacket, PeerList peerListPacket, Destination sender, long receiveTime) { - log.debug("Peer List Packet received: #peers=" + peerListPacket.getPeers().size() + ", sender="+ sender); - - // if the packet is in response to a pending request, update the three Sets - FindClosePeersPacket request = getPacketById(pendingRequests, responsePacket.getPacketId()); // find the request the node list is in response to - if (request != null) { - // TODO make responseReceived and pendingRequests a parameter in the constructor? - responseReceived.add(sender); - Collection peersReceived = peerListPacket.getPeers(); - for (KademliaPeer peer: peersReceived) - if (contains(notQueriedYet, peer)) - notQueriedYet.add(peer); - pendingRequests.remove(request); - // TODO synchronize access to shortList and pendingRequests - } - else - log.debug("No Find Close Nodes packet found for Peer List: " + peerListPacket); - } - - /** - * Returns a packet that matches a given {@link UniqueId} from a {@link Collection} of packets, or - * null if no match. - * @param packets - * @param packetId - * @return - */ - private FindClosePeersPacket getPacketById(Collection packets, UniqueId packetId) { - for (FindClosePeersPacket packet: packets) - if (packetId.equals(packet.getPacketId())) - return packet; - return null; - } - }; -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KBucket.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KBucket.java deleted file mode 100644 index dafecbc00..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KBucket.java +++ /dev/null @@ -1,260 +0,0 @@ -package i2p.bote.network.kademlia; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; - -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.util.Log; - -/** - * Peers are sorted by the time of the most recent communication: Index 0 = least recent, - * index n-1 = most recent. - * - * @author HungryHobo@mail.i2p - */ -class KBucket implements Iterable { - static final BigInteger MIN_HASH_VALUE = BigInteger.ONE.negate().shiftLeft(Hash.HASH_LENGTH*8); // system-wide minimum hash value - static final BigInteger MAX_HASH_VALUE = BigInteger.ONE.shiftLeft(Hash.HASH_LENGTH*8).subtract(BigInteger.ONE); // system-wide maximum hash value - private static final int CAPACITY = KademliaConstants.K; // The maximum number of peers the bucket can hold - - private Log log = new Log(KBucket.class); - private BigInteger startId; - private BigInteger endId; - private List peers; // the list is always kept sorted by "last seen" time - private Set replacementCache; - private int depth; - private boolean replacementCacheEnabled; - - KBucket(BigInteger startId, BigInteger endId, int depth, boolean replacementCacheEnabled) { - this.startId = startId; - this.endId = endId; - Comparator peerComparator = createLastReceptionComparator(); - peers = new ArrayList(); - replacementCache = new ConcurrentSkipListSet(peerComparator); - this.depth = depth; - this.replacementCacheEnabled = replacementCacheEnabled; - } - - BigInteger getStartId() { - return startId; - } - - BigInteger getEndId() { - return endId; - } - - List getNodes() { - // TODO only return peers that are not locked - return peers; - } - - void add(KademliaPeer node) { - if (isFull()) - log.error("Error: adding a node to a full k-bucket. Bucket needs to be split first. Size=" + size() + ", capacity=" + CAPACITY); - - peers.add(node); - } - - /** - * Add a node to the bucket, splitting the bucket if necessary. If the bucket is split, - * the newly created bucket is returned. Otherwise, return null. - * - * If the bucket is full but cannot be split, the new node is added to the replacement - * cache and null is returned. - * @param peer - * @return - */ - synchronized KBucket addOrSplit(KademliaPeer peer) { - if (!rangeContains(peer)) - log.error("Attempt to add a node whose hash is outside the bucket's range! Bucket start=" + startId + " Bucket end=" + endId + " peer hash=" + new BigInteger(peer.getDestinationHash().getData())); - - if (isFull() && !contains(peer)) { - if (canSplit(peer)) { - KBucket newBucket = split(peer.getDestinationHash()); - if (rangeContains(peer)) - add(peer); - else if (newBucket.rangeContains(peer)) - newBucket.add(peer); - else - log.error("After splitting a bucket, node is outside of both buckets' ranges."); - return newBucket; - } - else { - replacementCache.add(peer); - return null; - } - } - else { - addOrUpdate(peer); - return null; - } - } - - /** - * Return true if the bucket should be split in order to make room for a new peer. - * @return - */ - private boolean canSplit(KademliaPeer peer) { - return depth%KademliaConstants.B!=0 || rangeContains(peer); - } - - /** - * Update a known peer, or add the peer if it isn't known. - * TODO If the bucket is full, the peer is added to the bucket's replacement cache. - * @param destination - * @return true if the peer was added (or replacement-cached), - * false if it was updated. - */ - boolean addOrUpdate(KademliaPeer peer) { - // TODO log an error if peer outside bucket's range - // TODO handle stale peers - // TODO manage replacement cache - KademliaPeer existingPeer = getPeer(peer.getDestination()); - if (existingPeer == null) { - add(peer); - return true; - } - else { - existingPeer.setLastReception(peer.getLastReception()); - // TODO move to end of list if lastReception is highest value, which it should be most of the time - return false; - } - } - - /** - * Return true if a peer exists in the bucket. - * @param peer - * @return - */ - boolean contains(KademliaPeer peer) { - return getPeer(peer.getDestination()) != null; - } - - /** - * Return true if the bucket's Id range contains the hash of a given - * peer, regardless if the bucket contains the peer; false if the hash - * is outside the range. - * @param peer - * @return - */ - private boolean rangeContains(KademliaPeer peer) { - BigInteger peerHash = new BigInteger(peer.getDestinationHash().getData()); - return (startId.compareTo(peerHash)<=0 || endId.compareTo(peerHash)>0); - } - - /** - * Return a peer with a given I2P destination from the bucket, or null if the - * peer isn't in the bucket. - * @param destination - * @return - */ - KademliaPeer getPeer(Destination destination) { - for (KademliaPeer peer: peers) - if (peer.getDestination().equals(destination)) - return peer; - return null; - } - - KademliaPeer getClosestPeer(Hash key) { - KademliaPeer closestPeer = null; - BigInteger minDistance = MAX_HASH_VALUE; - for (KademliaPeer peer: peers) { - BigInteger distance = KademliaUtil.getDistance(key, peer.getDestination().calculateHash()); - if (distance.compareTo(minDistance) < 0) { - closestPeer = peer; - minDistance = distance; - } - } - return closestPeer; - } - -/* KademliaPeer getMostDistantPeer(KademliaPeer node) { - return getMostDistantPeer(node.getDestinationHash()); - }*/ - - KademliaPeer getMostDistantPeer(Hash key) { - KademliaPeer mostDistantPeer = null; - BigInteger maxDistance = BigInteger.ZERO; - for (KademliaPeer peer: peers) { - BigInteger distance = KademliaUtil.getDistance(key, peer.getDestination().calculateHash()); - if (distance.compareTo(maxDistance) > 0) { - mostDistantPeer = peer; - maxDistance = distance; - } - } - return mostDistantPeer; - } - - @Override - public Iterator iterator() { - return peers.iterator(); - } - - void remove(Destination destination) { - peers.remove(getPeer(destination)); - } - - /** - * Remove a peer from the bucket. If the peer doesn't exist in the bucket, nothing happens. - * @param node - */ - void remove(KademliaPeer node) { - peers.remove(node); - } - - int size() { - return peers.size(); - } - - boolean isFull() { - return size() >= CAPACITY; - } - - /** - * Move half the nodes into a new bucket. - * @return The new bucket - */ - KBucket split() { - depth++; - KBucket newBucket = new KBucket(startId, endId, depth, replacementCacheEnabled); - for (int i=0; i= 0) { - newBucket.add(peer); - remove(peer); - } - } - return newBucket; - } - - private Comparator createLastReceptionComparator() { - return new Comparator() { - @Override - public int compare(KademliaPeer peer1, KademliaPeer peer2) { - return Long.valueOf(peer1.getLastReception()).compareTo(peer2.getLastReception()); - } - }; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaConstants.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaConstants.java deleted file mode 100644 index bb3b59262..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaConstants.java +++ /dev/null @@ -1,13 +0,0 @@ -package i2p.bote.network.kademlia; - -public class KademliaConstants { - public static final int K = 2; // Number of redundant storage nodes. - public static final int S = 3; // The size of the sibling list for S/Kademlia. -// public static final int B = 5; // This is the value from the original Kademlia paper. - public static final int B = 1; - public static final int ALPHA = 3; // According to the literature, this is the optimum choice for alpha. - public static final int REFRESH_TIMEOUT = 3600; - public static final int REPLICATE_INTERVAL = 3600; // TODO would it be better for REPLICATE_INTERVAL to be slightly longer than REFRESH_TIMEOUT? - - private KademliaConstants() { } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaDHT.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaDHT.java deleted file mode 100644 index 83b8ab651..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaDHT.java +++ /dev/null @@ -1,376 +0,0 @@ -package i2p.bote.network.kademlia; - -import i2p.bote.network.DHT; -import i2p.bote.network.I2PPacketDispatcher; -import i2p.bote.network.I2PSendQueue; -import i2p.bote.network.PacketBatch; -import i2p.bote.network.PacketListener; -import i2p.bote.network.DhtStorageHandler; -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.I2PBotePacket; -import i2p.bote.packet.PeerList; -import i2p.bote.packet.ResponsePacket; -import i2p.bote.packet.StatusCode; -import i2p.bote.packet.dht.DhtStorablePacket; -import i2p.bote.packet.dht.FindClosePeersPacket; -import i2p.bote.packet.dht.RetrieveRequest; -import i2p.bote.packet.dht.StoreRequest; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import com.nettgryppa.security.HashCash; - -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.util.ConcurrentHashSet; -import net.i2p.util.Log; - -/** - * The main class of the Kademlia implementation. All the high-level Kademlia logic - * is in here. - * - * Resources used: - * [1] http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf - * [2] http://xlattice.sourceforge.net/components/protocol/kademlia/specs.html - * [3] http://en.wikipedia.org/wiki/Kademlia - * [4] http://www.barsoom.org/papers/infocom-2006-kad.pdf - * [5] http://doc.tm.uka.de/SKademlia_2007.pdf - * [6] OverSim (http://www.oversim.org/), which includes a S/Kademlia implementation - * - * @author HungryHobo@mail.i2p - */ -public class KademliaDHT implements DHT, PacketListener { - private Log log = new Log(KademliaDHT.class); - private Hash localDestinationHash; - private I2PSendQueue sendQueue; - private I2PPacketDispatcher i2pReceiver; - private File peerFile; - private Collection initialPeers; - private BucketManager bucketManager; - private Map, DhtStorageHandler> storageHandlers; - - public KademliaDHT(Destination localDestination, I2PSendQueue sendQueue, I2PPacketDispatcher i2pReceiver, File peerFile) { - localDestinationHash = localDestination.calculateHash(); - this.sendQueue = sendQueue; - this.i2pReceiver = i2pReceiver; - this.peerFile = peerFile; - initialPeers = readPeersFromFile(peerFile); - bucketManager = new BucketManager(sendQueue, initialPeers, localDestination.calculateHash()); - storageHandlers = new ConcurrentHashMap, DhtStorageHandler>(); - } - - /** - * Returns the S nodes closest to a given key by querying peers. - * This method blocks. It returns after CLOSEST_NODES_LOOKUP_TIMEOUT+1 seconds at - * the longest. - * - * The number of pending requests never exceeds ALPHA. According to [4], this is the most efficient. - * - * If there are less than s results after the kademlia lookup finishes, nodes from - * the sibling list are used. - */ - private Collection getClosestNodes(Hash key) { - ClosestNodesLookupTask lookupTask = new ClosestNodesLookupTask(key, sendQueue, i2pReceiver, bucketManager); - lookupTask.run(); - return lookupTask.getResults(); - } - - @Override - public DhtStorablePacket findOne(Hash key, Class dataType) { - Collection results = find(key, dataType, false); - if (results.isEmpty()) - return null; - else - return results.iterator().next(); - } - - @Override - public Collection findAll(Hash key, Class dataType) { - return find(key, dataType, true); - } - - @Override - public void setStorageHandler(Class packetType, DhtStorageHandler storageHandler) { - storageHandlers.put(packetType, storageHandler); - } - - @Override - public int getNumPeers() { - return bucketManager.getPeerCount(); - } - - private Collection find(Hash key, Class dataType, boolean exhaustive) { - final Collection closeNodes = getClosestNodes(key); - log.debug("Querying " + closeNodes.size() + " nodes with Kademlia key " + key); - - final Collection receivedPackets = new ConcurrentHashSet(); // avoid adding duplicate packets - - PacketListener packetListener = new PacketListener() { - @Override - public void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime) { - // add packet to list of received packets if the packet is in response to a RetrieveRequest - if (packet instanceof RetrieveRequest && closeNodes.contains(sender)) - receivedPackets.add(packet); - } - }; - i2pReceiver.addPacketListener(packetListener); - - // Send the retrieve requests - PacketBatch batch = new PacketBatch(); - for (Destination node: closeNodes) - batch.putPacket(new RetrieveRequest(key, dataType), node); - sendQueue.send(batch); - try { - batch.awaitSendCompletion(); - } - catch (InterruptedException e) { - log.warn("Interrupted while waiting for Retrieve Requests to be sent.", e); - } - - // wait for replies - try { - if (exhaustive) - TimeUnit.SECONDS.sleep(60); - else - batch.awaitFirstReply(30, TimeUnit.SECONDS); - } - catch (InterruptedException e) { - log.warn("Interrupted while waiting for responses to Retrieve Requests.", e); - } - log.debug(batch.getResponsePackets().size() + " response packets received for hash " + key + " and data type " + dataType); - - sendQueue.remove(batch); - i2pReceiver.removePacketListener(packetListener); - - ConcurrentHashSet storablePackets = getStorablePackets(batch); - DhtStorablePacket localResult = findLocally(key, dataType); - if (localResult != null) - storablePackets.add(localResult); - return storablePackets; - } - - private DhtStorablePacket findLocally(Hash key, Class dataType) { - DhtStorageHandler storageHandler = storageHandlers.get(dataType); - if (storageHandler != null) - return storageHandler.retrieve(key); - else - return null; - } - - /** - * Returns all DhtStorablePacket packets that have been received as a response to a send batch. - * @param batch - * @return - */ - private ConcurrentHashSet getStorablePackets(PacketBatch batch) { - ConcurrentHashSet storablePackets = new ConcurrentHashSet(); - for (I2PBotePacket packet: batch.getResponsePackets()) - if (packet instanceof DhtStorablePacket) - storablePackets.add((DhtStorablePacket)packet); - return storablePackets; - } - - @Override - public void store(DhtStorablePacket packet) throws NoSuchAlgorithmException { - Hash key = packet.getDhtKey(); - - Collection closeNodes = getClosestNodes(key); - log.debug("Storing a " + packet.getClass().getSimpleName() + " with key " + key + " on " + closeNodes.size() + " nodes"); - - HashCash hashCash = HashCash.mintCash("", 1); // TODO - StoreRequest storageRequest = new StoreRequest(hashCash, packet); - PacketBatch batch = new PacketBatch(); - for (Destination node: closeNodes) - batch.putPacket(storageRequest, node); - sendQueue.send(batch); - - try { - batch.awaitSendCompletion(); - } - catch (InterruptedException e) { - log.warn("Interrupted while waiting for responses to Storage Requests to be sent.", e); - } - - sendQueue.remove(batch); - } - - @Override - public void start() { - i2pReceiver.addPacketListener(this); - bucketManager.start(); - bootstrap(); - } - - @Override - public void shutDown() { - i2pReceiver.removePacketListener(this); - bucketManager.requestShutdown(); - writePeersToFile(peerFile); - } - - private void bootstrap() { - new BootstrapTask().start(); - } - - private class BootstrapTask extends Thread { - public BootstrapTask() { - setDaemon(true); - } - - @Override - public void run() { - log.debug("Bootstrap start"); - while (true) { - for (KademliaPeer bootstrapNode: initialPeers) { - bootstrapNode.setLastReception(-1); - bucketManager.addOrUpdate(bootstrapNode); - Collection closestNodes = getClosestNodes(localDestinationHash); - // if last reception time is not set, the node didn't respond, so remove it - if (bootstrapNode.getLastReception() <= 0) - bucketManager.remove(bootstrapNode); - - if (closestNodes.isEmpty()) { - log.debug("No response from bootstrap node " + bootstrapNode); - bucketManager.remove(bootstrapNode); - } - else { - bucketManager.refreshAll(); - log.info("Bootstrapping finished. Number of peers = " + bucketManager.getPeerCount()); - return; - } - } - - log.warn("Can't bootstrap off any known peer, will retry shortly."); - try { - TimeUnit.MINUTES.sleep(1); - } catch (InterruptedException e) { - log.error("Interrupted while pausing after unsuccessful bootstrap attempt.", e); - } - } - } - } - - private void writePeersToFile(File peerFile) { - // TODO - } - - private Collection readPeersFromFile(File peerFile) { - log.info("Reading peers from file: '" + peerFile.getAbsolutePath() + "'"); - Collection peers = new ArrayList(); - - FileInputStream fileInput = null; - try { - fileInput = new FileInputStream(peerFile); - } - catch (FileNotFoundException notFoundExc) { - log.error("Peer file not found, creating a new one: '" + peerFile.getAbsolutePath() + "'"); - log.error("Please provide a peer file with at least one active peer and restart the application."); - try { - createPeerFile(peerFile); - } - catch (IOException ioExc) { - log.error("Can't create peer file.", ioExc); - return peers; - } - } - - BufferedReader inputBuffer = new BufferedReader(new InputStreamReader(fileInput)); - - while (true) { - String line = null; - try { - line = inputBuffer.readLine(); - } - catch (IOException e) { - log.error("Error reading peer file.", e); - } - if (line == null) - break; - - if (!line.startsWith("#")) - // TODO read "up since" time if present, use a separate method for parsing lines - // TODO write "up since" time back to the peer file - try { - Destination destination = new Destination(line); - KademliaPeer peer = new KademliaPeer(destination, 0); - - // don't add the local destination as a peer - if (!peer.getDestinationHash().equals(localDestinationHash)) - peers.add(peer); - } - catch (DataFormatException e) { - log.error("Invalid destination key in '" + peerFile + "': " + line, e); - } - } - - return peers; - } - - private void createPeerFile(File file) throws IOException { - String lineFeed = System.getProperty("line.separator"); - - file.createNewFile(); - FileWriter fileWriter = new FileWriter(file); - fileWriter.write("# Each line in this file should begin with a 516-byte I2P destination key in" + lineFeed); - fileWriter.write("# Base64 format. Optionally, the destination key can be followed by a space" + lineFeed); - fileWriter.write("# and an \"active since\" time." + lineFeed); - fileWriter.write("# Lines beginning with a # are ignored." + lineFeed); - fileWriter.close(); - } - - private void sendPeerList(FindClosePeersPacket packet, Destination destination) { - Collection closestPeers = bucketManager.getClosestPeers(packet.getKey(), KademliaConstants.K); - PeerList peerList = new PeerList(closestPeers); - sendQueue.sendResponse(peerList, destination, packet.getPacketId()); - } - - // PacketListener implementation - @Override - public void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime) { - if (packet instanceof FindClosePeersPacket) - sendPeerList((FindClosePeersPacket)packet, sender); - else if (packet instanceof StoreRequest) { - DhtStorablePacket packetToStore = ((StoreRequest)packet).getPacketToStore(); - if (packetToStore != null) { - DhtStorageHandler storageHandler = storageHandlers.get(packetToStore.getClass()); - if (storageHandler != null) - storageHandler.store(packetToStore); - else - log.warn("No storage handler found for type " + packetToStore.getClass().getSimpleName() + "."); - } - } - else if (packet instanceof RetrieveRequest) { - RetrieveRequest retrieveRequest = (RetrieveRequest)packet; - DhtStorageHandler storageHandler = storageHandlers.get(retrieveRequest.getDataType()); - if (storageHandler != null) { - DhtStorablePacket storedPacket = storageHandler.retrieve(retrieveRequest.getKey()); - // if requested packet found, send it to the requester - if (storedPacket != null) { - log.debug("Packet found for retrieve request: [" + retrieveRequest + "], replying to sender: [" + sender + "]"); - ResponsePacket response = new ResponsePacket(storedPacket, StatusCode.OK, retrieveRequest.getPacketId()); - sendQueue.send(response, sender); - } - else - log.debug("No matching packet found for retrieve request: [" + retrieveRequest + "]"); - } - else - log.warn("No storage handler found for type " + packet.getClass().getSimpleName() + "."); - } - - // bucketManager is not registered as a PacketListener, so notify it here - bucketManager.packetReceived(packet, sender, receiveTime); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaException.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaException.java deleted file mode 100644 index 9c60dc54d..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaException.java +++ /dev/null @@ -1,9 +0,0 @@ -package i2p.bote.network.kademlia; - -public class KademliaException extends Exception { - private static final long serialVersionUID = -1286128818859245017L; - - public KademliaException(String message) { - super(message); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaPeer.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaPeer.java deleted file mode 100644 index 202c7c511..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaPeer.java +++ /dev/null @@ -1,76 +0,0 @@ -package i2p.bote.network.kademlia; - -import java.util.concurrent.atomic.AtomicInteger; - -import net.i2p.data.Destination; -import net.i2p.data.Hash; -import net.i2p.util.Log; - -public class KademliaPeer { - private static final int STALE_THRESHOLD = 5; - - private Log log = new Log(KademliaPeer.class); - private Destination destination; - private Hash destinationHash; - private long lastPingSent; - private long lastReception; - private long activeSince; - private AtomicInteger consecutiveTimeouts; - - public KademliaPeer(Destination destination, long lastReception) { - this.destination = destination; - destinationHash = destination.calculateHash(); - if (destinationHash == null) - log.error("calculateHash() returned null!"); - - this.lastReception = lastReception; - lastPingSent = 0; - activeSince = lastReception; - consecutiveTimeouts = new AtomicInteger(0); - } - - public Destination getDestination() { - return destination; - } - - public Hash getDestinationHash() { - return destinationHash; - } - - public boolean isStale() { - return consecutiveTimeouts.get() >= STALE_THRESHOLD; - } - - public void incrementStaleCounter() { - consecutiveTimeouts.incrementAndGet(); - } - - public void resetStaleCounter() { - consecutiveTimeouts.set(0); - } - - public long getLastPingSent() { - return lastPingSent; - } - - public void setLastReception(long time) { - lastReception = time; - } - - public long getLastReception() { - return lastReception; - } - - public long getActiveSince() { - return activeSince; - } - -/* public BigInteger getDistance(KademliaPeer anotherPeer) { - return KademliaUtil.getDistance(getDestinationHash(), anotherPeer.getDestinationHash()); - }*/ - - @Override - public String toString() { - return destination.toString(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaUtil.java b/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaUtil.java deleted file mode 100644 index 59bb5f02f..000000000 --- a/apps/i2pbote/src/i2p/bote/network/kademlia/KademliaUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -package i2p.bote.network.kademlia; - -import java.math.BigInteger; - -import net.i2p.data.DataHelper; -import net.i2p.data.Hash; - -public class KademliaUtil { - - public static BigInteger getDistance(KademliaPeer node, Hash key) { - return getDistance(node.getDestinationHash(), key); - } - - public static BigInteger getDistance(Hash key1, Hash key2) { - // This shouldn't be a performance bottleneck, so save some mem by not using Hash.cachedXor - byte[] xoredData = DataHelper.xor(key1.getData(), key2.getData()); - return new BigInteger(xoredData); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/CommunicationPacket.java b/apps/i2pbote/src/i2p/bote/packet/CommunicationPacket.java deleted file mode 100644 index 4eddeb0d2..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/CommunicationPacket.java +++ /dev/null @@ -1,116 +0,0 @@ -package i2p.bote.packet; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import net.i2p.util.Log; - -public abstract class CommunicationPacket extends I2PBotePacket { - private static final byte PACKET_VERSION = 1; - protected static final int HEADER_LENGTH = 6 + UniqueId.LENGTH; // length of the common packet header in the byte array representation; this is where subclasses start reading - private static final byte[] PACKET_PREFIX = new byte[] {(byte)0x6D, (byte)0x30, (byte)0x52, (byte)0xE9}; - private static Log static_log = new Log(CommunicationPacket.class); - - private Log log = new Log(CommunicationPacket.class); - private UniqueId packetId; - private CountDownLatch sentSignal; - private long sentTime; - - protected CommunicationPacket() { - this(new UniqueId()); - } - - protected CommunicationPacket(UniqueId packetId) { - this.packetId = packetId; - sentSignal = new CountDownLatch(1); - sentTime = -1; - } - - /** - * Creates a packet and initializes the header fields shared by all Communication Packets: packet type and packet id. - * @param data - */ - protected CommunicationPacket(byte[] data) { - verifyHeader(data); - checkPacketType(data[4]); - packetId = new UniqueId(data, 6); - } - - /** - * Creates a packet object from its byte array representation. If there is an error, - * null is returned. - * @param data - * @param log - * @return - */ - public static CommunicationPacket createPacket(byte[] data) { - char packetTypeCode = (char)data[4]; // byte 4 of a communication packet is the packet type code - Class packetType = decodePacketTypeCode(packetTypeCode); - if (packetType==null || !CommunicationPacket.class.isAssignableFrom(packetType)) { - static_log.error("Type code is not a CommunicationPacket type code: <" + packetTypeCode + ">"); - return null; - } - - Class commPacketType = packetType.asSubclass(CommunicationPacket.class); - try { - return commPacketType.getConstructor(byte[].class).newInstance(data); - } - catch (Exception e) { - static_log.warn("Can't instantiate packet for type code <" + packetTypeCode + ">", e); - return null; - } - } - - // check the packet prefix and version number of a packet - private void verifyHeader(byte[] packet) { - for (int i=0; i 0; - } - - public boolean awaitSending(long timeout, TimeUnit unit) throws InterruptedException { - return sentSignal.await(timeout, unit); - } - - /** - * Writes the Prefix, Version, Type, and Packet Id fields of a I2PBote packet to - * an {@link OutputStream}. - * @param outputStream - */ - protected void writeHeader(OutputStream outputStream) throws IOException { - outputStream.write(PACKET_PREFIX); - outputStream.write((byte)getPacketTypeCode()); - outputStream.write(PACKET_VERSION); - outputStream.write(packetId.toByteArray()); - } - - @Override - public String toString() { - return "Type=" + getClass().getSimpleName() + " Id=" + (packetId==null?"":packetId.toString().substring(0, 8)) + "..."; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/DataPacket.java b/apps/i2pbote/src/i2p/bote/packet/DataPacket.java deleted file mode 100644 index 3764f728b..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/DataPacket.java +++ /dev/null @@ -1,87 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.Util; -import i2p.bote.folder.FolderElement; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import net.i2p.util.Log; - -/** - * The superclass of all "payload" packet types. - * - * @author HungryHobo@mail.i2p - */ -public abstract class DataPacket extends I2PBotePacket implements FolderElement { - private static Log log = new Log(DataPacket.class); - - private File file; - - public DataPacket() { - } - - @Override - public void writeTo(OutputStream outputStream) throws Exception { - outputStream.write(toByteArray()); - } - - public static DataPacket createPacket(File file) { - InputStream inputStream = null; - try { - inputStream = new FileInputStream(file); - DataPacket packet = createPacket(Util.readInputStream(inputStream)); - return packet; - } - catch (IOException e) { - log.error("Can't read packet file: " + file.getAbsolutePath(), e); - return null; - } - finally { - try { - inputStream.close(); - } - catch (IOException e) { - log.error("Can't close stream.", e); - } - } - } - - /** - * Creates a {@link DataPacket} object from its byte array representation. - * If there is an error, null is returned. - * @param data - * @return - */ - public static DataPacket createPacket(byte[] data) { - char packetTypeCode = (char)data[0]; // first byte of a data packet is the packet type code - Class packetType = decodePacketTypeCode(packetTypeCode); - if (packetType==null || !DataPacket.class.isAssignableFrom(packetType)) { - log.error("Type code is not a DataPacket type code: <" + packetTypeCode + ">"); - return null; - } - - Class dataPacketType = packetType.asSubclass(DataPacket.class); - try { - return dataPacketType.getConstructor(byte[].class).newInstance(data); - } - catch (Exception e) { - log.warn("Can't instantiate packet for type code <" + packetTypeCode + ">", e); - return null; - } - } - - // FolderElement implementation - @Override - public File getFile() { - return file; - } - - @Override - public void setFile(File file) { - this.file = file; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/Email.java b/apps/i2pbote/src/i2p/bote/packet/Email.java deleted file mode 100644 index 905ff8910..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/Email.java +++ /dev/null @@ -1,166 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.EmailDestination; -import i2p.bote.folder.FolderElement; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Properties; - -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.internet.MimeMessage; - -import net.i2p.util.Log; - -import com.nettgryppa.security.HashCash; - -public class Email extends MimeMessage implements FolderElement { - private static final int MAX_BYTES_PER_PACKET = 30 * 1024; - private static final String[] HEADER_WHITELIST = new String[] { - "From", "Sender", "To", "CC", "BCC", "Reply-To", "Subject", "MIME-Version", "Content-Type", "Content-Transfer-Encoding", - "Message-Id", "In-Reply-To" - }; - - private Log log = new Log(Email.class); - private String filename; - private UniqueId messageId; - - public Email() { - super(Session.getDefaultInstance(new Properties())); - messageId = new UniqueId(); - } - - /** - * Creates an Email object from an InputStream containing a MIME email. - * - * @param inputStream - * @throws MessagingException - * @see MimeMessage(Session, InputStream) - - */ - public Email(InputStream inputStream) throws MessagingException { - super(Session.getDefaultInstance(new Properties()), inputStream); - messageId = new UniqueId(); - } - - /** - * Creates an Email object from a byte array containing a MIME email. - * - * @param bytes - * @throws MessagingException - */ - public Email(byte[] bytes) throws MessagingException { - super(Session.getDefaultInstance(new Properties()), new ByteArrayInputStream(bytes)); - messageId = new UniqueId(); - } - - // TODO - public void setHashCash(HashCash hashCash) { - // add hashCash to header - } - - /** - * Called by saveChanges(), see JavaMail JavaDoc. - */ - @Override - protected void updateHeaders() throws MessagingException { - setHeader("Message-Id", getMessageID()); - } - - /** - * Returns a message ID that conforms to RFC822, but doesn't reveal the sender's - * domain or user name. - */ - @Override - public String getMessageID() { - return messageId.toBase64() + "@i2p"; - } - - /** - * Converts the email into one or more email packets. - * - * @param destination - * @return - * @throws IOException - * @throws MessagingException - */ - public Collection createEmailPackets(EmailDestination destination) throws IOException, MessagingException { - ArrayList packets = new ArrayList(); - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - writeTo(outputStream); - byte[] emailArray = outputStream.toByteArray(); - - int fragmentIndex = 0; - int blockStart = 0; // the array index where the next block of data starts - while (true) { - int blockSize = Math.min(emailArray.length-blockStart, MAX_BYTES_PER_PACKET); - if (blockSize <= 0) - break; - else { - // make a new array with the right length - byte[] block = new byte[blockSize]; - System.arraycopy(emailArray, blockStart, block, 0, blockSize); - UniqueId deletionKeyPlain = new UniqueId(); - UniqueId deletionKeyEncrypted = new UniqueId(deletionKeyPlain); // encryption happens later - EmailPacket packet = new EmailPacket(block, deletionKeyPlain, deletionKeyEncrypted, messageId, fragmentIndex, 0, destination); // we'll set the # of fragments in a minute - packets.add(packet); - fragmentIndex++; - blockStart += blockSize; - } - } - - // set fragment count - int numFragments = fragmentIndex; - for (EmailPacket packet: packets) - packet.setNumFragments(numFragments); - - return packets; - } - -/* private byte[] toByteArray() throws MessagingException { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try { - writeTo(outputStream); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return outputStream.toByteArray(); - }*/ - - /** - * Removes all mail headers except the ones in HEADER_WHITELIST. - * @throws MessagingException - */ - public void scrubHeaders() throws MessagingException { - // TODO does the superclass remove BCC addresses (except the recipient's)? if not, do it in here. - @SuppressWarnings("unchecked") - Enumeration headersToRemove = getNonMatchingHeaders(HEADER_WHITELIST); - while (headersToRemove.hasMoreElements()) { - String headerName = headersToRemove.nextElement(); - removeHeader(headerName); - } - } - - // FolderElement implementation - @Override - public File getFile() { - // TODO Auto-generated method stub - return null; - } - - // FolderElement implementation - @Override - public void setFile(File file) { - // TODO Auto-generated method stub - - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/EmailPacket.java b/apps/i2pbote/src/i2p/bote/packet/EmailPacket.java deleted file mode 100644 index cff46ccfa..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/EmailPacket.java +++ /dev/null @@ -1,246 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.EmailDestination; -import i2p.bote.EmailIdentity; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - -import net.i2p.I2PAppContext; -import net.i2p.crypto.ElGamalAESEngine; -import net.i2p.crypto.SessionKeyManager; -import net.i2p.data.DataFormatException; -import net.i2p.data.Hash; -import net.i2p.data.PrivateKey; -import net.i2p.data.PublicKey; -import net.i2p.data.SessionKey; -import net.i2p.util.Log; -import net.i2p.util.RandomSource; - -@TypeCode('E') -public class EmailPacket extends DhtStorablePacket { - private static final int PADDED_SIZE = PrivateKey.KEYSIZE_BYTES; // TODO is this a good choice? - - private ElGamalAESEngine cryptoEngine = I2PAppContext.getGlobalContext().elGamalAESEngine(); - private SessionKeyManager sessionKeyManager = I2PAppContext.getGlobalContext().sessionKeyManager(); - private Log log = new Log(EmailPacket.class); - private Hash dhtKey; - private UniqueId deletionKeyPlain; - // Begin encrypted fields - private UniqueId deletionKeyEncrypted; - private UniqueId messageId; - private int fragmentIndex; - private int numFragments; - private byte[] content; - private byte[] encryptedData; // all encrypted fields: Encrypted Deletion Key, Message ID, Fragment Index, Number of Fragments, and Content. - - /** - * Creates an EmailPacket from raw datagram data. - * To read the encrypted parts of the packet, decrypt must be called first. - * @param data - */ - public EmailPacket(byte[] data) { - ByteBuffer buffer = ByteBuffer.wrap(data); - if (buffer.get() != getPacketTypeCode()) - log.error("Wrong type code for EmailPacket. Expected <" + getPacketTypeCode() + ">, got <" + (char)data[0] + ">"); - - dhtKey = readHash(buffer); - deletionKeyPlain = new UniqueId(buffer); - - int encryptedLength = buffer.getShort(); // length of the encrypted part of the packet - encryptedData = new byte[encryptedLength]; - buffer.get(encryptedData); - } - - /** - * Creates a EmailPacket from a byte array that contains MIME data. - * The public key of emailDestination is used for encryption. - * @param content - * @param deletionKeyPlain - * @param deletionKeyEncrypted - * @param messageId - * @param fragmentIndex - * @param numFragments - * @param emailDestination - */ - public EmailPacket(byte[] content, UniqueId deletionKeyPlain, UniqueId deletionKeyEncrypted, UniqueId messageId, int fragmentIndex, int numFragments, EmailDestination emailDestination) { - this.deletionKeyPlain = deletionKeyPlain; - this.deletionKeyEncrypted = deletionKeyEncrypted; - this.messageId = messageId; - this.fragmentIndex = fragmentIndex; - this.numFragments = numFragments; - this.content = content; - - dhtKey = generateRandomHash(); - - // make an array with all data that gets encrypted - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(byteStream); - try { - deletionKeyEncrypted.writeTo(dataStream); - messageId.writeTo(dataStream); - dataStream.writeShort(fragmentIndex); - dataStream.writeShort(numFragments); - dataStream.writeShort(content.length); - dataStream.write(content); - - encryptedData = encrypt(byteStream.toByteArray(), emailDestination); - verify(); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream/DataOutputStream.", e); - } - } - - private Hash generateRandomHash() { - RandomSource randomSource = RandomSource.getInstance(); - - byte[] bytes = new byte[Hash.HASH_LENGTH]; - for (int i=0; iidentity. - * @param identity - * @throws DataFormatException - */ - public void decrypt(EmailIdentity identity) throws DataFormatException { - byte[] decryptedData = decrypt(encryptedData, identity); - ByteBuffer buffer = ByteBuffer.wrap(decryptedData); - - deletionKeyEncrypted = new UniqueId(buffer); - messageId = new UniqueId(buffer); - fragmentIndex = buffer.getShort(); - numFragments = buffer.getShort(); - - int contentLength = buffer.getShort(); - content = new byte[contentLength]; - buffer.get(content); - - verify(); - } - - /** - * Decrypts data with an email identity's private key. - * @param data - * @param identity - * @return The decrypted data - */ - private byte[] decrypt(byte[] data, EmailIdentity identity) throws DataFormatException { - PrivateKey privateKey = identity.getPrivateEncryptionKey(); - return cryptoEngine.decrypt(data, privateKey); - } - - /** - * Encrypts data with an email destination's public key. - * @param data - * @param emailDestination - * @return The encrypted data - */ - public byte[] encrypt(byte[] data, EmailDestination emailDestination) { - PublicKey publicKey = emailDestination.getPublicEncryptionKey(); - SessionKey sessionKey = sessionKeyManager.createSession(publicKey); - return cryptoEngine.encrypt(data, publicKey, sessionKey, PADDED_SIZE); - } - - @Override - public Hash getDhtKey() { - return dhtKey; - } - - /** - * Returns the value of the "plaintext deletion key" field. - * Storage nodes set this to all zero bytes when the packet is retrieved. - * @return - */ - public UniqueId getPlaintextDeletionKey() { - return deletionKeyPlain; - } - - /** - * Returns the value of the "encrypted deletion key" field. - * Storage nodes set this to all zero bytes when the packet is retrieved. - * @return - */ - public UniqueId getEncryptedDeletionKey() { - return deletionKeyEncrypted; - } - - /** - * Returns the index of the fragment in the {@link Email} this packet belongs to. - */ - public int getFragmentIndex() { - return fragmentIndex; - } - - /** - * Returns the number of fragments in the {@link Email} this packet belongs to. - * @return - */ - public int getNumFragments() { - return numFragments; - } - - public void setContent(byte[] content) { - this.content = content; - } - - public byte[] getContent() { - return content; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(byteArrayStream); - - try { - dataStream.write((byte)getPacketTypeCode()); - dataStream.write(dhtKey.toByteArray()); - dataStream.write(deletionKeyPlain.toByteArray()); - dataStream.writeShort(encryptedData.length); - dataStream.write(encryptedData); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return byteArrayStream.toByteArray(); - } - - public void setNumFragments(int numFragments) { - this.numFragments = numFragments; - } - - // Return the number of bytes in the packet. - // TODO just return content.length+CONST so we don't call toByteArray every time - public int getSize() { - return toByteArray().length; - } - - public UniqueId getMessageId() { - return messageId; - } - - private void verify() { - if (fragmentIndex<0 || fragmentIndex>=numFragments || numFragments<1) - log.error("Illegal values: fragmentIndex=" + fragmentIndex + " numFragments="+numFragments); - // TODO more sanity checks? - } - - @Override - public String toString() { - // TODO needs improvement - String str = super.toString() + " fragIdx=" + fragmentIndex + " numFrags=" + numFragments; - if (content == null) - str += " content=null"; - else - str += " content length=" + content.length + " bytes"; - return str; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/EmailSession.java b/apps/i2pbote/src/i2p/bote/packet/EmailSession.java deleted file mode 100644 index df5be3c53..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/EmailSession.java +++ /dev/null @@ -1,49 +0,0 @@ -package i2p.bote.packet; - -import java.nio.ByteBuffer; - -import net.i2p.util.RandomSource; - -public class EmailSession { - private static final byte SESSION_ID_LENGTH = 16; - - private byte[] sessionId; - - public EmailSession() { - sessionId = generateSessionId(); - } - - /** - * Construct a EmailSession using data read from a ByteBuffer. - * @param buffer - */ - public EmailSession(ByteBuffer buffer) { - sessionId = new byte[SESSION_ID_LENGTH]; - buffer.get(sessionId); - } - - public byte[] getSessionId() { - return sessionId; - } - - private byte[] generateSessionId() { - RandomSource randomSource = RandomSource.getInstance(); - byte[] sessionId = new byte[SESSION_ID_LENGTH]; - for (int i=0; i 0) - buffer = buffer.append(" "); - String hexByte = Integer.toHexString(sessionId[i] & 0xFF); - if (hexByte.length() < 2) - buffer = buffer.append("0"); - buffer = buffer.append(hexByte); - } - return buffer.append("]").toString(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/I2PBotePacket.java b/apps/i2pbote/src/i2p/bote/packet/I2PBotePacket.java deleted file mode 100644 index 9694c2edc..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/I2PBotePacket.java +++ /dev/null @@ -1,82 +0,0 @@ -package i2p.bote.packet; - -import java.nio.ByteBuffer; - -import i2p.bote.packet.dht.FindClosePeersPacket; -import i2p.bote.packet.dht.RetrieveRequest; -import i2p.bote.packet.dht.StoreRequest; -import net.i2p.data.Hash; -import net.i2p.util.Log; - -public abstract class I2PBotePacket { - private static final int MAX_DATAGRAM_SIZE = 31 * 1024; - private static final Log log = new Log(I2PBotePacket.class); - @SuppressWarnings("unchecked") - private static Class[] ALL_PACKET_TYPES = new Class[] { - RelayPacket.class, ResponsePacket.class, RetrieveRequest.class, StoreRequest.class, FindClosePeersPacket.class, - PeerList.class, EmailPacket.class, IndexPacket.class - }; - - public abstract byte[] toByteArray(); - - /** - * Returns the size of the packet in bytes. - * @return - */ - public int getSize() { - return toByteArray().length; - } - - /** - * Returns false if this packet can't fit into an I2P datagram. - * @return - */ - public boolean isTooBig() { - return getSize() > MAX_DATAGRAM_SIZE; - } - - protected char getPacketTypeCode(Class dataType) { - return dataType.getAnnotation(TypeCode.class).value(); - } - - public char getPacketTypeCode() { - return getPacketTypeCode(getClass()); - } - - /** - * Logs an error if the packet type of the packet instance is not correct - * @param packetTypeCode - */ - protected void checkPacketType(char packetTypeCode) { - if (getPacketTypeCode() != packetTypeCode) - log.error("Packet type code of class " + getClass().getSimpleName() + " should be " + getPacketTypeCode() + ", is <" + packetTypeCode + ">"); - } - - protected void checkPacketType(byte packetTypeCode) { - checkPacketType((char)packetTypeCode); - } - -/* protected void checkPacketVersion(byte version, byte minVersion, byte maxVersion) { - // TODO - }*/ - - /** - * Creates a {@link Hash} from bytes read from a {@link ByteBuffer}. - * No check is done to make sure the buffer has enough bytes available. - */ - protected Hash readHash(ByteBuffer buffer) { - byte[] bytes = new byte[Hash.HASH_LENGTH]; - buffer.get(bytes); - return new Hash(bytes); - } - - protected static Class decodePacketTypeCode(char packetTypeCode) { - for (Class packetType: ALL_PACKET_TYPES) - if (packetType.getAnnotation(TypeCode.class).value() == packetTypeCode) - return packetType; - - log.debug("Invalid type code for I2PBotePacket: <" + packetTypeCode + ">"); - return null; - } - -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/IndexPacket.java b/apps/i2pbote/src/i2p/bote/packet/IndexPacket.java deleted file mode 100644 index 0b09d7445..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/IndexPacket.java +++ /dev/null @@ -1,108 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.EmailDestination; -import i2p.bote.packet.dht.DhtStorablePacket; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; - -import net.i2p.data.DataFormatException; -import net.i2p.data.Hash; -import net.i2p.util.Log; - -/** - * This class is not thread-safe. - * - * @author HungryHobo@mail.i2p - */ -@TypeCode('I') -public class IndexPacket extends DhtStorablePacket { - private Log log = new Log(IndexPacket.class); - private Collection dhtKeys; // DHT keys of email packets - private Hash destinationHash; // The DHT key of this packet - - public IndexPacket(byte[] data) { - ByteBuffer dataBuffer = ByteBuffer.wrap(data); - if (dataBuffer.get() != getPacketTypeCode()) - log.error("Wrong type code for IndexPacket. Expected <" + getPacketTypeCode() + ">, got <" + (char)data[0] + ">"); - - destinationHash = readHash(dataBuffer); - - int numKeys = dataBuffer.get(); - - dhtKeys = new ArrayList(); - for (int i=0; i emailPackets, EmailDestination emailDestination) { - dhtKeys = new ArrayList(); - for (EmailPacket emailPacket: emailPackets) - dhtKeys.add(emailPacket.getDhtKey()); - - destinationHash = emailDestination.getHash(); - } - - /** - * Merges the DHT keys of multiple index packets into one big index packet. - * The DHT key of this packet is not initialized. - * @param indexPackets - */ - public IndexPacket(Collection indexPackets) { - dhtKeys = new HashSet(); - for (IndexPacket packet: indexPackets) - dhtKeys.addAll(packet.getDhtKeys()); - } - - /** - * A varargs version of {@link IndexPacket(Collection)}. - * @param indexPackets - */ - public IndexPacket(IndexPacket... indexPackets) { - this(Arrays.asList(indexPackets)); - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - outputStream.write(getPacketTypeCode()); - try { - outputStream.write((byte)getPacketTypeCode()); - destinationHash.writeBytes(outputStream); - outputStream.write((byte)dhtKeys.size()); - for (Hash dhtKey: dhtKeys) - dhtKey.writeBytes(outputStream); - // TODO in the unit test, verify that toByteArray().length = Hash.NUM_BYTES + 1 + dhtKeys.size()*Hash.NUM_BYTES - } catch (DataFormatException e) { - log.error("Invalid format for email destination.", e); - } catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return outputStream.toByteArray(); - } - - /** - * Returns the DHT keys of the {@link EmailPacket}s referenced by this {@link IndexPacket}. - * @return - */ - public Collection getDhtKeys() { - return dhtKeys; - } - - /** - * Returns the DHT key of this packet. - */ - @Override - public Hash getDhtKey() { - return destinationHash; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/PeerList.java b/apps/i2pbote/src/i2p/bote/packet/PeerList.java deleted file mode 100644 index 41679113b..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/PeerList.java +++ /dev/null @@ -1,70 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.network.kademlia.KademliaPeer; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collection; - -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.util.Log; - -@TypeCode('L') -public class PeerList extends DataPacket { - private Log log = new Log(PeerList.class); - // TODO should be a Collection because this class will also be used for relay peer lists - private Collection peers; - - public PeerList(Collection peers) { - this.peers = peers; - } - - public PeerList(byte[] data) throws DataFormatException { - ByteBuffer buffer = ByteBuffer.wrap(data); - if (buffer.get() != getPacketTypeCode()) - log.error("Wrong type code for PeerList. Expected <" + getPacketTypeCode() + ">, got <" + (char)data[0] + ">"); - - int numPeers = buffer.getShort(); - - peers = new ArrayList(); - for (int i=0; i getPeers() { - return peers; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(arrayOutputStream); - - try { - dataStream.write((byte)getPacketTypeCode()); - dataStream.writeShort(peers.size()); - for (KademliaPeer peer: peers) - dataStream.write(peer.getDestination().toByteArray()); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return arrayOutputStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/PeerListRequest.java b/apps/i2pbote/src/i2p/bote/packet/PeerListRequest.java deleted file mode 100644 index 060fcf772..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/PeerListRequest.java +++ /dev/null @@ -1,36 +0,0 @@ -package i2p.bote.packet; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import net.i2p.util.Log; - -@TypeCode('A') -public class PeerListRequest extends CommunicationPacket { - private Log log = new Log(PeerListRequest.class); - - public PeerListRequest() { - } - - public PeerListRequest(byte[] data) { - super(data); - - int remaining = data.length - CommunicationPacket.HEADER_LENGTH; - if (remaining > 0) - log.debug("Peer List Request packet has " + remaining + " extra bytes."); - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - try { - writeHeader(outputStream); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return outputStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/RelayPacket.java b/apps/i2pbote/src/i2p/bote/packet/RelayPacket.java deleted file mode 100644 index 736da9e1c..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/RelayPacket.java +++ /dev/null @@ -1,93 +0,0 @@ -package i2p.bote.packet; - -import i2p.bote.Util; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; - -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; -import net.i2p.util.Log; - -@TypeCode('R') -public class RelayPacket extends DataPacket { - public static final int XOR_KEY_LENGTH = 32; // length of the XOR key in bytes - - private Log log = new Log(RelayPacket.class); - private long earliestSendTime; - private long latestSendTime; - private byte[] xorKey; - private Destination nextDestination; // an I2P node to send the packet to - private byte[] payload; // can contain another Relay Packet, Email Packet, or Retrieve Request - - public RelayPacket(Destination nextDestination, long earliestSendTime, long latestSendTime) { - this.nextDestination = nextDestination; - this.earliestSendTime = earliestSendTime; - this.latestSendTime = latestSendTime; - } - - public RelayPacket(byte[] data) throws DataFormatException { - ByteBuffer buffer = ByteBuffer.wrap(data); - - earliestSendTime = buffer.getInt(); - latestSendTime = buffer.getInt(); - - xorKey = new byte[XOR_KEY_LENGTH]; - buffer.get(xorKey); - - nextDestination = new Destination(); - byte[] destinationData = new byte[384]; - buffer.get(destinationData); - nextDestination.readBytes(destinationData, 0); - - int payloadLength = buffer.getShort(); - payload = new byte[payloadLength]; - buffer.get(payload); - - if (buffer.hasRemaining()) - log.debug("Relay Packet has " + buffer.remaining() + " extra bytes."); - } - - public RelayPacket(DataPacket dataPacket, Destination nextDestination, long earliestSendTime, long latestSendTime, byte[] xorKey) throws DataFormatException { - // TODO - } - - public RelayPacket(InputStream inputStream) throws IOException, DataFormatException { - this(Util.readInputStream(inputStream)); - } - - public Destination getNextDestination() { - return nextDestination; - } - - public long getEarliestSendTime() { - return earliestSendTime; - } - - public long getLatestSendTime() { - return latestSendTime; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(arrayOutputStream); - - try { - dataStream.writeInt((int)earliestSendTime); - dataStream.writeInt((int)latestSendTime); - dataStream.write(xorKey); - dataStream.write(nextDestination.toByteArray()); - dataStream.writeShort(payload.length); - dataStream.write(payload); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return arrayOutputStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/RelayRequest.java b/apps/i2pbote/src/i2p/bote/packet/RelayRequest.java deleted file mode 100644 index 405ec6fd6..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/RelayRequest.java +++ /dev/null @@ -1,79 +0,0 @@ -package i2p.bote.packet; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.security.NoSuchAlgorithmException; - -import net.i2p.I2PAppContext; -import net.i2p.crypto.ElGamalAESEngine; -import net.i2p.data.DataFormatException; -import net.i2p.data.PrivateKey; -import net.i2p.util.Log; - -import com.nettgryppa.security.HashCash; - -@TypeCode('Y') -public class RelayRequest extends CommunicationPacket { - private Log log = new Log(RelayPacket.class); - private ElGamalAESEngine encrypter = I2PAppContext.getGlobalContext().elGamalAESEngine(); - private HashCash hashCash; - private byte[] storedData; - - public RelayRequest(HashCash hashCash, DataPacket dataPacket) { - this.hashCash = hashCash; - this.storedData = dataPacket.toByteArray(); - } - - public RelayRequest(byte[] data) throws NoSuchAlgorithmException { - super(data); - ByteBuffer buffer = ByteBuffer.wrap(data, HEADER_LENGTH, data.length-HEADER_LENGTH); - - int hashCashLength = buffer.getShort(); - byte[] hashCashData = new byte[hashCashLength]; - buffer.get(hashCashData); - hashCash = new HashCash(new String(hashCashData)); - - int dataLength = buffer.getShort(); - storedData = new byte[dataLength]; - buffer.get(storedData); - - if (buffer.hasRemaining()) - log.debug("Storage Request Packet has " + buffer.remaining() + " extra bytes."); - } - - public HashCash getHashCash() { - return hashCash; - } - - /** - * Returns the payload packet, i.e. the data that is being relayed. - * @param localDecryptionKey - * @return - * @throws DataFormatException - */ - public DataPacket getStoredPacket(PrivateKey localDecryptionKey) throws DataFormatException { - byte[] decryptedData = encrypter.decrypt(storedData, localDecryptionKey); - return DataPacket.createPacket(decryptedData); - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(byteArrayStream); - - try { - writeHeader(dataStream); - String hashCashString = hashCash.toString(); - dataStream.writeShort(hashCashString.length()); - dataStream.write(hashCashString.getBytes()); - dataStream.writeShort(storedData.length); - dataStream.write(storedData); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return byteArrayStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/ResponsePacket.java b/apps/i2pbote/src/i2p/bote/packet/ResponsePacket.java deleted file mode 100644 index 01d70ef2a..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/ResponsePacket.java +++ /dev/null @@ -1,62 +0,0 @@ -package i2p.bote.packet; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - -import net.i2p.util.Log; - -@TypeCode('N') -public class ResponsePacket extends CommunicationPacket { - private Log log = new Log(EmailPacket.class); - private StatusCode statusCode; - private DataPacket payload; - - public ResponsePacket(DataPacket payload, StatusCode statusCode, UniqueId packetId) { - super(packetId); - this.payload = payload; - this.statusCode = statusCode; - } - - public ResponsePacket(byte[] data) { - super(data); - ByteBuffer buffer = ByteBuffer.wrap(data, HEADER_LENGTH, data.length-HEADER_LENGTH); - - statusCode = StatusCode.values()[buffer.get()]; - - int payloadLength = buffer.getShort(); - if (payloadLength > 0) { - byte[] payloadData = new byte[payloadLength]; - buffer.get(payloadData); - payload = DataPacket.createPacket(payloadData); - } - - if (buffer.hasRemaining()) - log.debug("Response Packet has " + buffer.remaining() + " extra bytes."); - } - - public DataPacket getPayload() { - return payload; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(byteStream); - - try { - writeHeader(dataStream); - dataStream.write(statusCode.ordinal()); - - byte[] payloadBytes = payload.toByteArray(); - dataStream.writeShort(payloadBytes.length); - dataStream.write(payloadBytes); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return byteStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/StatusCode.java b/apps/i2pbote/src/i2p/bote/packet/StatusCode.java deleted file mode 100644 index 9bb44a22d..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/StatusCode.java +++ /dev/null @@ -1,5 +0,0 @@ -package i2p.bote.packet; - -public enum StatusCode { - OK, GENERAL_ERROR, NO_DATA_FOUND, INVALID_PACKET, INVALID_HASHCASH, INSUFFICIENT_HASHCASH, NO_DISK_SPACE; -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/TypeCode.java b/apps/i2pbote/src/i2p/bote/packet/TypeCode.java deleted file mode 100644 index 8006b07dc..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/TypeCode.java +++ /dev/null @@ -1,12 +0,0 @@ -package i2p.bote.packet; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface TypeCode { - char value(); -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/UniqueId.java b/apps/i2pbote/src/i2p/bote/packet/UniqueId.java deleted file mode 100644 index d72fcc747..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/UniqueId.java +++ /dev/null @@ -1,89 +0,0 @@ -package i2p.bote.packet; - -import java.io.IOException; -import java.io.OutputStream; -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.util.Arrays; - -import net.i2p.data.Base64; -import net.i2p.util.Log; -import net.i2p.util.RandomSource; - -public class UniqueId implements Comparable { - public static final byte LENGTH = 32; - - private Log log = new Log(UniqueId.class); - private byte[] bytes; - - /** - * Create a random UniqueId. - */ - public UniqueId() { - bytes = new byte[LENGTH]; - for (int i=0; ioffset. - * @param bytes - */ - public UniqueId(byte[] bytes, int offset) { - this.bytes = new byte[LENGTH]; - System.arraycopy(bytes, offset, this.bytes, 0, LENGTH); - } - - /** - * A copy constructor. - * @param uniqueId - */ - public UniqueId(UniqueId uniqueId) { - this.bytes = uniqueId.bytes.clone(); - } - - /** - * Creates a UniqueId using data read from a {@link ByteBuffer}. - * @param buffer - */ - public UniqueId(ByteBuffer buffer) { - bytes = new byte[LENGTH]; - buffer.get(bytes); - } - - public byte[] toByteArray() { - return bytes; - } - - public String toBase64() { - return Base64.encode(bytes); - } - - public void writeTo(OutputStream outputStream) throws IOException { - outputStream.write(bytes); - } - - @Override - public int compareTo(UniqueId otherPacketId) { - return new BigInteger(bytes).compareTo(new BigInteger(otherPacketId.bytes)); - } - - @Override - public String toString() { - return Base64.encode(bytes); - } - - @Override - public boolean equals(Object anotherObject) { - if (!(anotherObject instanceof UniqueId)) - return false; - UniqueId otherPacketId = (UniqueId)anotherObject; - - return Arrays.equals(bytes, otherPacketId.bytes); - } - - @Override - public int hashCode() { - return Arrays.hashCode(bytes); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/dht/DhtStorablePacket.java b/apps/i2pbote/src/i2p/bote/packet/dht/DhtStorablePacket.java deleted file mode 100644 index f854cc713..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/dht/DhtStorablePacket.java +++ /dev/null @@ -1,54 +0,0 @@ -package i2p.bote.packet.dht; - -import i2p.bote.packet.DataPacket; -import i2p.bote.packet.I2PBotePacket; - -import java.io.File; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -public abstract class DhtStorablePacket extends DataPacket { - private static Log log = new Log(DhtStorablePacket.class); - - public abstract Hash getDhtKey(); - - /** - * Creates a {@link DhtStorablePacket} object from its byte array representation. - * The type of packet depends on the packet type field in the byte array. - * If there is an error, null is returned. - * @param data - * @param log - * @return - */ - public static DhtStorablePacket createPacket(byte[] data) { - DataPacket packet = DataPacket.createPacket(data); - if (packet instanceof DhtStorablePacket) - return (DhtStorablePacket)packet; - else { - log.error("Packet is not a DhtStorablePacket: " + packet); - return null; - } - } - - public static Class decodePacketTypeCode(char packetTypeCode) { - Class packetType = I2PBotePacket.decodePacketTypeCode(packetTypeCode); - if (packetType!=null && DhtStorablePacket.class.isAssignableFrom(packetType)) - return packetType.asSubclass(DhtStorablePacket.class); - else { - log.debug("Invalid type code for DhtStorablePacket: <" + packetTypeCode + ">"); - return null; - } - } - - public static DhtStorablePacket createPacket(File file) { - DataPacket dataPacket; - dataPacket = DataPacket.createPacket(file); - if (dataPacket instanceof DhtStorablePacket) - return (DhtStorablePacket)dataPacket; - else { - log.warn("Expected: DhtStorablePacket, got: " + dataPacket.getClass().getSimpleName()); - return null; - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/dht/FindClosePeersPacket.java b/apps/i2pbote/src/i2p/bote/packet/dht/FindClosePeersPacket.java deleted file mode 100644 index 9cd8cd392..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/dht/FindClosePeersPacket.java +++ /dev/null @@ -1,55 +0,0 @@ -package i2p.bote.packet.dht; - -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.TypeCode; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -@TypeCode('F') -public class FindClosePeersPacket extends CommunicationPacket { - private Log log = new Log(FindClosePeersPacket.class); - private Hash key; - - public FindClosePeersPacket(Hash key) { - this.key = key; - } - - public FindClosePeersPacket(byte[] data) { - super(data); - - byte[] hashData = new byte[Hash.HASH_LENGTH]; - System.arraycopy(data, CommunicationPacket.HEADER_LENGTH, hashData, 0, hashData.length); - key = new Hash(hashData); - - int remaining = data.length - (CommunicationPacket.HEADER_LENGTH+hashData.length); - if (remaining > 0) - log.debug("Find Close Nodes Request packet has " + remaining + " extra bytes."); - } - public Hash getKey() { - return key; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - try { - writeHeader(outputStream); - outputStream.write(key.toByteArray()); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return outputStream.toByteArray(); - } - - @Override - public String toString() { - return super.toString() + " key=" + key.toBase64().substring(0, 8) + "..."; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/dht/RetrieveRequest.java b/apps/i2pbote/src/i2p/bote/packet/dht/RetrieveRequest.java deleted file mode 100644 index b23d4223b..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/dht/RetrieveRequest.java +++ /dev/null @@ -1,64 +0,0 @@ -package i2p.bote.packet.dht; - -import i2p.bote.I2PBote; -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.I2PBotePacket; -import i2p.bote.packet.TypeCode; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -@TypeCode('Q') -public class RetrieveRequest extends CommunicationPacket { - private Log log = new Log(I2PBote.class); - private Hash key; - private Class dataType; - - public RetrieveRequest(Hash key, Class dataType) { - this.key = key; - this.dataType = dataType; - } - - public RetrieveRequest(byte[] data) { - super(data); - ByteBuffer buffer = ByteBuffer.wrap(data, HEADER_LENGTH, data.length-HEADER_LENGTH); - - char dataTypeCode = (char)buffer.get(); - dataType = DhtStorablePacket.decodePacketTypeCode(dataTypeCode); - - byte[] keyBytes = new byte[Hash.HASH_LENGTH]; - buffer.get(keyBytes); - key = new Hash(keyBytes); - - if (buffer.hasRemaining()) - log.debug("Retrieve Request Packet has " + buffer.remaining() + " extra bytes."); - } - - public Hash getKey() { - return key; - } - - public Class getDataType() { - return dataType; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - try { - writeHeader(outputStream); - outputStream.write(getPacketTypeCode(dataType)); - outputStream.write(key.toByteArray()); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - - return outputStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/packet/dht/StoreRequest.java b/apps/i2pbote/src/i2p/bote/packet/dht/StoreRequest.java deleted file mode 100644 index b387d3889..000000000 --- a/apps/i2pbote/src/i2p/bote/packet/dht/StoreRequest.java +++ /dev/null @@ -1,74 +0,0 @@ -package i2p.bote.packet.dht; - -import i2p.bote.packet.CommunicationPacket; -import i2p.bote.packet.RelayPacket; -import i2p.bote.packet.TypeCode; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.security.NoSuchAlgorithmException; - -import net.i2p.data.Hash; -import net.i2p.util.Log; - -import com.nettgryppa.security.HashCash; - -@TypeCode('S') -public class StoreRequest extends CommunicationPacket { - private Log log = new Log(RelayPacket.class); - private HashCash hashCash; - private DhtStorablePacket packetToStore; - - public StoreRequest(HashCash hashCash, DhtStorablePacket packetToStore) { - this.hashCash = hashCash; - this.packetToStore = packetToStore; - } - - public StoreRequest(byte[] data) throws NoSuchAlgorithmException { - super(data); - ByteBuffer buffer = ByteBuffer.wrap(data, HEADER_LENGTH, data.length-HEADER_LENGTH); - - int hashCashLength = buffer.getShort(); - byte[] hashCashData = new byte[hashCashLength]; - buffer.get(hashCashData); - hashCash = new HashCash(new String(hashCashData)); - - int dataLength = buffer.getShort(); - byte[] storedData = new byte[dataLength]; - buffer.get(storedData); - packetToStore = DhtStorablePacket.createPacket(storedData); - - if (buffer.hasRemaining()) - log.debug("Storage Request Packet has " + buffer.remaining() + " extra bytes."); - } - - public Hash getKey() { - return packetToStore.getDhtKey(); - } - - public DhtStorablePacket getPacketToStore() { - return packetToStore; - } - - @Override - public byte[] toByteArray() { - ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); - DataOutputStream dataStream = new DataOutputStream(byteArrayStream); - - try { - writeHeader(dataStream); - String hashCashString = hashCash.toString(); - dataStream.writeShort(hashCashString.length()); - dataStream.write(hashCashString.getBytes()); - byte[] dataToStore = packetToStore.toByteArray(); - dataStream.writeShort(dataToStore.length); - dataStream.write(dataToStore); - } - catch (IOException e) { - log.error("Can't write to ByteArrayOutputStream.", e); - } - return byteArrayStream.toByteArray(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/I2PBoteException.java b/apps/i2pbote/src/i2p/bote/service/I2PBoteException.java deleted file mode 100644 index 0024dc4d5..000000000 --- a/apps/i2pbote/src/i2p/bote/service/I2PBoteException.java +++ /dev/null @@ -1,11 +0,0 @@ -package i2p.bote.service; - -import net.i2p.I2PException; - -public class I2PBoteException extends I2PException { - private static final long serialVersionUID = 5002910979704859701L; - - public I2PBoteException(String message) { - super(message); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/I2PBoteThread.java b/apps/i2pbote/src/i2p/bote/service/I2PBoteThread.java deleted file mode 100644 index 12bb918a3..000000000 --- a/apps/i2pbote/src/i2p/bote/service/I2PBoteThread.java +++ /dev/null @@ -1,20 +0,0 @@ -package i2p.bote.service; - -import net.i2p.util.I2PAppThread; - -public class I2PBoteThread extends I2PAppThread { - - protected I2PBoteThread(String name) { - super(name); - } - - private volatile boolean shutdown; - - public void requestShutdown() { - shutdown = true; - } - - protected boolean shutdownRequested() { - return shutdown; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/OutboxProcessor.java b/apps/i2pbote/src/i2p/bote/service/OutboxProcessor.java deleted file mode 100644 index 839bfa44c..000000000 --- a/apps/i2pbote/src/i2p/bote/service/OutboxProcessor.java +++ /dev/null @@ -1,155 +0,0 @@ -package i2p.bote.service; - -import i2p.bote.Configuration; -import i2p.bote.EmailDestination; -import i2p.bote.folder.Outbox; -import i2p.bote.network.EmailAddressResolver; -import i2p.bote.network.PeerManager; -import i2p.bote.packet.Email; - -import java.io.IOException; -import java.security.NoSuchAlgorithmException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import javax.mail.Address; -import javax.mail.MessagingException; -import javax.mail.internet.InternetAddress; - -import net.i2p.client.I2PSession; -import net.i2p.util.I2PAppThread; -import net.i2p.util.Log; - -import com.nettgryppa.security.HashCash; - -/** - * A background thread that checks the outbox for emails and sends them to the I2P network. - * - * @author HungryHobo@mail.i2p - */ -public class OutboxProcessor extends I2PAppThread { - private static final int PAUSE = 10; // The wait time, in minutes, before processing the folder again. Can be interrupted from the outside. - - private Log log = new Log(OutboxProcessor.class); - private Outbox outbox; - private Configuration configuration; - private EmailAddressResolver emailAddressResolver; - private Map statusMap; - private CountDownLatch checkForEmailSignal; - - public OutboxProcessor(I2PSession i2pSession, Outbox outbox, Configuration configuration, PeerManager peerManager) { - super("OutboxProcessor"); - this.outbox = outbox; - this.configuration = configuration; - statusMap = new ConcurrentHashMap(); - emailAddressResolver = new EmailAddressResolver(); - } - - @Override - public void run() { - while (true) { - synchronized(this) { - checkForEmailSignal = new CountDownLatch(1); - } - - log.info("Processing outgoing emails in directory '" + outbox.getStorageDirectory() + "'."); - for (Email email: outbox) { - log.info("Processing outbox file: '" + email.getFile() + "'."); - try { - sendEmail(email); - } catch (Exception e) { - log.error("Error sending email.", e); - } - } - - try { - checkForEmailSignal.await(PAUSE, TimeUnit.MINUTES); - } catch (InterruptedException e) { - log.error("OutboxProcessor received an InterruptedException.", e); - } - } - } - - /** - * Tells the OutboxProcessor to check for new outgoing emails immediately. - */ - public void checkForEmail() { - checkForEmailSignal.countDown(); - } - - /** - * Send an {@link Email} to all recipients specified in the header. - * @param email - * @throws MessagingException - * @throws IOException - */ - private void sendEmail(Email email) throws MessagingException, IOException { - email.saveChanges(); // this updates the headers - email.scrubHeaders(); // TODO if the MimeMessage implementation doesn't remove BCC fields, move this line to EmailSendTask.sendIndividual(), after addHashCash - - for (Address recipient: email.getAllRecipients()) - // only handle email addresses, report an error for news addresses - if (recipient instanceof InternetAddress) { - String recipientAddress = ((InternetAddress)recipient).getAddress(); - sendToOne(recipientAddress, email); - } - else - log.error("Illegal recipient type: " + recipient.getType()); - } - - /** - * Send an {@link Email} to one recipient. - * @param address - * @param email - */ - private void sendToOne(String address, Email email) { - String logSuffix = null; // only used for logging - try { - addHashCash(email); - logSuffix = "Recipient = '" + address + "' Message ID = '" + email.getMessageID() + "'"; - EmailDestination emailDestination = emailAddressResolver.getDestination(address); - } - catch (Exception e) { - log.error("Error trying to send email. " + logSuffix); - outbox.updateStatus(email, new int[] { 1 }, "Email sent to recipient: " + address); - return; - } - -/* int[] numForwarded = new int[fragments.size()]; - for (int fragmentIndex=0; fragmentIndex getStatus() { - return statusMap; - } - - public void shutDown() { - // TODO - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/POP3Service.java b/apps/i2pbote/src/i2p/bote/service/POP3Service.java deleted file mode 100644 index 0073364c1..000000000 --- a/apps/i2pbote/src/i2p/bote/service/POP3Service.java +++ /dev/null @@ -1,13 +0,0 @@ -package i2p.bote.service; - -import net.i2p.util.I2PAppThread; - -public class POP3Service extends I2PAppThread { - - public POP3Service() { - super("Background thread for delivering email to email clients"); - } - - public void shutDown() { - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/RelayPacketSender.java b/apps/i2pbote/src/i2p/bote/service/RelayPacketSender.java deleted file mode 100644 index 1af71c2b3..000000000 --- a/apps/i2pbote/src/i2p/bote/service/RelayPacketSender.java +++ /dev/null @@ -1,82 +0,0 @@ -package i2p.bote.service; - -import i2p.bote.Configuration; -import i2p.bote.folder.PacketFolder; -import i2p.bote.network.I2PSendQueue; -import i2p.bote.packet.RelayPacket; - -import java.text.ParseException; - -import javax.mail.MessagingException; - -import com.nettgryppa.security.HashCash; - -import net.i2p.I2PAppContext; -import net.i2p.crypto.ElGamalAESEngine; -import net.i2p.crypto.SessionKeyManager; -import net.i2p.util.Log; -import net.i2p.util.RandomSource; - -/** - * A background thread that sends packets in the relay outbox to the I2P network. - * - * @author HungryHobo@mail.i2p - */ -public class RelayPacketSender extends I2PBoteThread { - private static final int PAUSE = 10 * 60 * 1000; // the wait time, in milliseconds, before processing the folder again - private static final int PADDED_SIZE = 16 * 1024; - private static final Log log = new Log(RelayPacketSender.class); - - private I2PSendQueue sendQueue; - private ElGamalAESEngine encrypter = I2PAppContext.getGlobalContext().elGamalAESEngine(); - private SessionKeyManager sessionKeyManager = I2PAppContext.getGlobalContext().sessionKeyManager(); - private PacketFolder packetStore; - private Configuration configuration; - - public RelayPacketSender(I2PSendQueue sendQueue, PacketFolder packetStore) { - super("RelayPacketSender"); - this.sendQueue = sendQueue; - this.packetStore = packetStore; - } - - @Override - public void run() { - while (true) { - if (log.shouldLog(Log.DEBUG)) - log.debug("Deleting expired packets..."); - try { - deleteExpiredPackets(); - } catch (Exception e) { - log.error("Error deleting expired packets", e); - } - - log.info("Processing outgoing packets in directory '" + packetStore.getStorageDirectory().getAbsolutePath() + "'"); - for (RelayPacket packet: packetStore) { - log.info("Processing packet file: <" + packet.getFile() + ">"); - try { - HashCash hashCash = null; // TODO - long sendTime = getRandomSendTime(packet); - sendQueue.sendRelayRequest(packet, hashCash, sendTime); - } catch (Exception e) { - log.error("Error sending packet. ", e); - } - } - - try { - Thread.sleep(PAUSE); - } catch (InterruptedException e) { - log.error("RelayPacketSender received an InterruptedException."); - } - } - } - - private long getRandomSendTime(RelayPacket packet) { - long min = packet.getEarliestSendTime(); - long max = packet.getLatestSendTime(); - return min + RandomSource.getInstance().nextLong(max-min); - } - - public void deleteExpiredPackets() throws ParseException, MessagingException { - // TODO look at filename which = receive time, delete if too old - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/SMTPService.java b/apps/i2pbote/src/i2p/bote/service/SMTPService.java deleted file mode 100644 index 3bdb8f0e5..000000000 --- a/apps/i2pbote/src/i2p/bote/service/SMTPService.java +++ /dev/null @@ -1,13 +0,0 @@ -package i2p.bote.service; - -import net.i2p.util.I2PAppThread; - -public class SMTPService extends I2PAppThread { - - public SMTPService() { - super("Background thread for receiving email from email clients"); - } - - public void shutDown() { - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/StreamHandler.java b/apps/i2pbote/src/i2p/bote/service/StreamHandler.java deleted file mode 100644 index 7a78bd981..000000000 --- a/apps/i2pbote/src/i2p/bote/service/StreamHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package i2p.bote.service; - -import java.util.EventListener; - -public interface StreamHandler extends EventListener { - - void streamReceived(StreamReceivedEvent event); -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/service/StreamReceivedEvent.java b/apps/i2pbote/src/i2p/bote/service/StreamReceivedEvent.java deleted file mode 100644 index 4cd93f6d9..000000000 --- a/apps/i2pbote/src/i2p/bote/service/StreamReceivedEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package i2p.bote.service; - -import java.util.EventObject; - -import net.i2p.client.streaming.I2PSocket; -import net.i2p.data.Destination; - -public class StreamReceivedEvent extends EventObject { - private static final long serialVersionUID = 5231936151819853813L; - - private I2PSocket socket; - - public StreamReceivedEvent(I2PSocket socket) { - super(socket.getPeerDestination()); - this.socket = socket; - } - - public I2PSocket getSocket() { - return socket; - } - - public Destination getSource() { - return (Destination)super.getSource(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/CheckMailTag.java b/apps/i2pbote/src/i2p/bote/web/CheckMailTag.java deleted file mode 100644 index e58cf995f..000000000 --- a/apps/i2pbote/src/i2p/bote/web/CheckMailTag.java +++ /dev/null @@ -1,10 +0,0 @@ -package i2p.bote.web; - -import javax.servlet.jsp.tagext.SimpleTagSupport; - -public class CheckMailTag extends SimpleTagSupport { - - public void doTag() { - JSPHelper.checkForMail(); - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/JSPHelper.java b/apps/i2pbote/src/i2p/bote/web/JSPHelper.java deleted file mode 100644 index 7100a15c0..000000000 --- a/apps/i2pbote/src/i2p/bote/web/JSPHelper.java +++ /dev/null @@ -1,118 +0,0 @@ -package i2p.bote.web; - -import i2p.bote.EmailIdentity; -import i2p.bote.I2PBote; -import i2p.bote.Identities; -import i2p.bote.Util; -import i2p.bote.folder.EmailFolder; - -import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import net.i2p.util.Log; - -/** - * Implements JSP functions. - * - * @author HungryHobo@mail.i2p - */ -public class JSPHelper { - private static final Log log = new Log(JSPHelper.class); - private static final int MAX_THREADS = 10; - private static final int THREAD_STACK_SIZE = 64 * 1024; // TODO find a safe low value (default in 64-bit Java 1.6 = 1MByte) - private static final ThreadFactory MAIL_CHECK_THREAD_FACTORY = Util.createThreadFactory("CheckMail", THREAD_STACK_SIZE); - private static ExecutorService EXECUTOR; - - private JSPHelper() { - throw new UnsupportedOperationException(); - } - - public static Identities getIdentities() { - return I2PBote.getInstance().getIdentities(); - } - - /** - * Updates an email identity if key exists, or adds a new identity. - * @param key A base64-encoded email identity key - * @param description - * @param publicName - * @param emailAddress - * @return null if sucessful, or an error message if an error occured - */ - public static String saveIdentity(String key, String publicName, String description, String emailAddress) { - Identities identities = JSPHelper.getIdentities(); - EmailIdentity identity = identities.get(key); - - if (identity != null) { - identity.setPublicName(publicName); - identity.setDescription(description); - identity.setEmailAddress(emailAddress); - } - else { - identity = new EmailIdentity(); - identity.setPublicName(publicName); - identity.setDescription(description); - identity.setEmailAddress(emailAddress); - identities.add(identity); - } - - try { - identities.save(); - return null; - } - catch (IOException e) { - return e.getLocalizedMessage(); - } - } - - /** - * Deletes an email identity. - * @param key A base64-encoded email identity key - * @return null if sucessful, or an error message if an error occured - */ - public static String deleteIdentity(String key) { - Identities identities = JSPHelper.getIdentities(); - identities.remove(key); - - try { - identities.save(); - return null; - } - catch (IOException e) { - return e.getLocalizedMessage(); - } - } - - public static void checkForMail() { - if (!isCheckingForMail()) { - EXECUTOR = Executors.newFixedThreadPool(MAX_THREADS, MAIL_CHECK_THREAD_FACTORY); - - I2PBote bote = I2PBote.getInstance(); - for (EmailIdentity identity: bote.getIdentities()) - EXECUTOR.submit(bote.createCheckMailTask(identity)); - - EXECUTOR.shutdown(); - try { - EXECUTOR.awaitTermination(1, TimeUnit.DAYS); - } - catch (InterruptedException e) { - log.error("Interrupted while checking for mail.", e); - EXECUTOR.shutdownNow(); - } - } - } - - public static boolean isCheckingForMail() { - return (EXECUTOR!=null && !EXECUTOR.isTerminated()); - } - - public static EmailFolder getMailFolder(String folderName) { - if ("Inbox".equals(folderName)) - return I2PBote.getInstance().getInbox(); - else - return null; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/PrintNumDhtPeersTag.java b/apps/i2pbote/src/i2p/bote/web/PrintNumDhtPeersTag.java deleted file mode 100644 index aec3a723d..000000000 --- a/apps/i2pbote/src/i2p/bote/web/PrintNumDhtPeersTag.java +++ /dev/null @@ -1,26 +0,0 @@ -package i2p.bote.web; - -import i2p.bote.I2PBote; - -import java.io.IOException; - -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.tagext.SimpleTagSupport; - -import net.i2p.util.Log; - -public class PrintNumDhtPeersTag extends SimpleTagSupport { - private Log log = new Log(PrintNumDhtPeersTag.class); - - public void doTag() { - PageContext pageContext = (PageContext) getJspContext(); - JspWriter out = pageContext.getOut(); - - try { - out.println(I2PBote.getInstance().getNumDhtPeers()); - } catch (IOException e) { - log.error("Can't write output to HTML page", e); - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/PrintNumRelayPeersTag.java b/apps/i2pbote/src/i2p/bote/web/PrintNumRelayPeersTag.java deleted file mode 100644 index edd48a419..000000000 --- a/apps/i2pbote/src/i2p/bote/web/PrintNumRelayPeersTag.java +++ /dev/null @@ -1,26 +0,0 @@ -package i2p.bote.web; - -import i2p.bote.I2PBote; - -import java.io.IOException; - -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.tagext.SimpleTagSupport; - -import net.i2p.util.Log; - -public class PrintNumRelayPeersTag extends SimpleTagSupport { - private Log log = new Log(PrintNumRelayPeersTag.class); - - public void doTag() { - PageContext pageContext = (PageContext) getJspContext(); - JspWriter out = pageContext.getOut(); - - try { - out.println(I2PBote.getInstance().getNumRelayPeers()); - } catch (IOException e) { - log.error("Can't write output to HTML page", e); - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/ReturnStatus.java b/apps/i2pbote/src/i2p/bote/web/ReturnStatus.java deleted file mode 100644 index 23417308c..000000000 --- a/apps/i2pbote/src/i2p/bote/web/ReturnStatus.java +++ /dev/null @@ -1,33 +0,0 @@ -package i2p.bote.web; - -/** - * Represents the return status of a JSP function. - * - * @author HungryHobo@mail.i2p - */ -public class ReturnStatus { - - private boolean error; - private String message; - - public ReturnStatus(boolean error, String message) { - this.setError(error); - this.setMessage(message); - } - - public void setError(boolean error) { - this.error = error; - } - - public boolean isError() { - return error; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/SendEmailTag.java b/apps/i2pbote/src/i2p/bote/web/SendEmailTag.java deleted file mode 100644 index c74d5487d..000000000 --- a/apps/i2pbote/src/i2p/bote/web/SendEmailTag.java +++ /dev/null @@ -1,61 +0,0 @@ -package i2p.bote.web; - -import i2p.bote.I2PBote; -import i2p.bote.packet.Email; - -import java.io.IOException; - -import javax.mail.Message.RecipientType; -import javax.mail.internet.InternetAddress; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.tagext.SimpleTagSupport; - -import net.i2p.util.Log; - -public class SendEmailTag extends SimpleTagSupport { - // TODO make all Log instances final - private Log log = new Log(SendEmailTag.class); - private String recipientAddress; - private String message; - - public void doTag() { - PageContext pageContext = (PageContext) getJspContext(); - JspWriter out = pageContext.getOut(); - - Email email = new Email(); - String statusMessage; - try { - email.addRecipient(RecipientType.TO, new InternetAddress(recipientAddress)); - email.setContent(message, "text/html"); - I2PBote.getInstance().sendEmail(email); - statusMessage = "Email has been queued for sending."; - } - catch (Exception e) { - statusMessage = "Error sending email: " + e.getLocalizedMessage(); - log.error("Error sending email", e); - } - - try { - out.println(statusMessage); - } catch (IOException e) { - log.error("Can't write output to HTML page", e); - } - } - - public void setRecipient(String recipient) { - this.recipientAddress = recipient; - } - - public String getRecipient() { - return recipientAddress; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} \ No newline at end of file diff --git a/apps/i2pbote/src/i2p/bote/web/ServiceInitializer.java b/apps/i2pbote/src/i2p/bote/web/ServiceInitializer.java deleted file mode 100644 index 24052823e..000000000 --- a/apps/i2pbote/src/i2p/bote/web/ServiceInitializer.java +++ /dev/null @@ -1,24 +0,0 @@ -package i2p.bote.web; - -import i2p.bote.I2PBote; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -/** - * Starts the I2PBote backend when the web app is initialized - * @author HungryHobo@mail.i2p - * - */ -public class ServiceInitializer implements ServletContextListener { - @Override - public void contextDestroyed(ServletContextEvent event) { - I2PBote.shutDown(); - } - - @Override - public void contextInitialized(ServletContextEvent event) { - I2PBote.startUp(); - } - -} diff --git a/apps/i2pbote/test/i2p/bote/AllTests.java b/apps/i2pbote/test/i2p/bote/AllTests.java deleted file mode 100644 index 42146bba0..000000000 --- a/apps/i2pbote/test/i2p/bote/AllTests.java +++ /dev/null @@ -1,26 +0,0 @@ -package i2p.bote; - -import i2p.bote.packet.EmailPacketTest; -import i2p.bote.packet.I2PBotePacketTest; -import i2p.bote.packet.ResponsePacketTest; -import i2p.bote.packet.kademlia.FindCloseNodesPacketTest; -import i2p.bote.packet.kademlia.StorageRequestTest; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -import junit.framework.Test; -import junit.framework.TestSuite; - -@RunWith(Suite.class) -@Suite.SuiteClasses( { I2PBotePacketTest.class, StorageRequestTest.class, EmailPacketTest.class, FindCloseNodesPacketTest.class, ResponsePacketTest.class }) -public class AllTests { - - public static Test suite() { - TestSuite suite = new TestSuite("Test for i2p.bote"); - //$JUnit-BEGIN$ - - //$JUnit-END$ - return suite; - } -} \ No newline at end of file diff --git a/apps/i2pbote/test/i2p/bote/network/kademlia/KademliaDHTTest.java b/apps/i2pbote/test/i2p/bote/network/kademlia/KademliaDHTTest.java deleted file mode 100644 index 3cc8cee64..000000000 --- a/apps/i2pbote/test/i2p/bote/network/kademlia/KademliaDHTTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package i2p.bote.network.kademlia; - -import static org.junit.Assert.fail; -import i2p.bote.network.I2PPacketDispatcher; -import i2p.bote.network.I2PSendQueue; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; -import net.i2p.client.I2PSession; -import net.i2p.data.Destination; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class KademliaDHTTest { - private static final int NUM_NODES = 100; - - private Collection nodes; - - @Before - public void setUp() throws Exception { - File tmpDir = new File(System.getProperty("java.io.tmpdir")); - File testDir = new File(tmpDir, "I2PBote-Test_" + System.currentTimeMillis()); - testDir.mkdir(); - - I2PClient i2pClient = I2PClientFactory.createClient(); - - Destination firstNode = null; - - nodes = Collections.synchronizedList(new ArrayList()); - for (int i=0; i[] allPacketTypes = (Class[])allPacketTypesField.get(null); - - for (Class packetType: allPacketTypes) { - TypeCode typeCode = packetType.getAnnotation(TypeCode.class); - System.out.println("Testing decodePacketTypeCode on " + packetType); - assertTrue(I2PBotePacket.decodePacketTypeCode(typeCode.value()).equals(packetType)); - } - } -} \ No newline at end of file diff --git a/apps/i2pbote/test/i2p/bote/packet/ResponsePacketTest.java b/apps/i2pbote/test/i2p/bote/packet/ResponsePacketTest.java deleted file mode 100644 index 9d604ebd6..000000000 --- a/apps/i2pbote/test/i2p/bote/packet/ResponsePacketTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package i2p.bote.packet; - -import static junit.framework.Assert.assertTrue; -import i2p.bote.EmailIdentity; - -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class ResponsePacketTest { - private ResponsePacket responsePacket; - - @Before - public void setUp() throws Exception { - byte[] packetIdBytes = new byte[] {120, 120, -8, -88, 21, 126, 46, -61, 18, -101, 15, 53, 20, -44, -112, 42, 86, -117, 30, -96, -66, 33, 71, -55, -102, -78, 78, -82, -105, 66, -116, 43}; - UniqueId packetId = new UniqueId(packetIdBytes, 0); - - responsePacket = new ResponsePacket(createDataPacket(), StatusCode.OK, packetId); - } - - private DataPacket createDataPacket() throws NoSuchAlgorithmException { - byte[] dataToStore = new byte[] {2, 109, -80, -37, -106, 83, -33, -39, -94, -76, -112, -98, 99, 25, -61, 44, -92, -85, 1, 10, -128, -2, -27, -86, -126, -33, -11, 42, 56, 3, -97, -101, 111, 7, -96, 25, 121, 74, 89, -40, -33, 82, -50, -18, 49, 106, 13, -121, 53, -83, -2, 35, -7, 71, -71, 26, 90, 1}; - - UniqueId deletionKeyPlain = new UniqueId(new byte[] {72, -18, -72, -39, 122, 40, -104, -66, -54, -61, -108, 72, 54, 30, 37, 76, 44, 86, 104, -124, -31, 32, -82, -27, 26, 76, 7, 106, -76, 72, 49, -44}, 0); - UniqueId deletionKeyEncrypted = new UniqueId(new byte[] {-62, -112, 99, -65, 13, 44, -117, -111, 96, 45, -6, 64, 78, 57, 117, 103, -24, 101, 106, -116, -18, 62, 99, -49, 60, -81, 8, 64, 27, -41, -104, 58}, 0); - byte[] messageIdBytes = new byte[] {2, -69, -24, -109, 1, 69, -122, -69, 113, -68, -90, 55, -28, 105, 97, 125, 70, 51, 58, 14, 2, -13, -53, 90, -29, 36, 67, 36, -94, -108, -125, 11, 123}; - UniqueId messageId = new UniqueId(messageIdBytes, 0); - - String base64Identity = "piYT1uJ3O8~bBPZmTvehMbp3-Zksg5enhvIlp2X8txqL25l0WdQMWwyt30UAOVQqxGdnMPTqqjh~-zoa~rCQORo~J1gRxLwCX9LlHQqaIimJilrbN-rhKy4Xlft054wbgQjLSC-WICE4W64KDfitwRzdr7lV6lz~0KFiZ8erZ-~WPMG1CgWEku9lILQUdUHyFBguPcK9oPDq7oGBuFGy8w0CvAq7ex3nmbL7zQVA~VqILtOGeGK2fidCuuofj4AQsTcXmH9O0nxZGCIJBhf~4EWmazvxu8XVB8pabNQvRDbmFu6q85JTwmxC45lCjqNw30hp8q2zoqP-zchjWOrxFUhSumpBdD0xXJR~qmhejh4WnuRnnam9j3fcxH5i~T7xWgmvIbpZEI4kyc9VEbXbLI7k-bU2A6sdP-AGt5~TjGLcxpdsPnOLRXO-Dsi7E9-3Kc84s4TmdpEJdtHn1dxYyeeT-ysVOqXjv5w5Cuk0XJpUIJG8n7aXHpNb-QLxPD3yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWF3qnAX-p41Po~VNmOUzS-Yt~noD8-e~L3P5rZXBWf-XtB4hkloo6m1jwqphEdf1"; - EmailIdentity identity = new EmailIdentity(base64Identity); - - return new EmailPacket(dataToStore, deletionKeyPlain, deletionKeyEncrypted, messageId, 0, 1, identity); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void toByteArrayAndBack() throws Exception { - byte[] arrayA = responsePacket.toByteArray(); - byte[] arrayB = new ResponsePacket(arrayA).toByteArray(); - assertTrue(Arrays.equals(arrayA, arrayB)); - } -} \ No newline at end of file diff --git a/apps/i2pbote/test/i2p/bote/packet/kademlia/FindCloseNodesPacketTest.java b/apps/i2pbote/test/i2p/bote/packet/kademlia/FindCloseNodesPacketTest.java deleted file mode 100644 index 5773b01d9..000000000 --- a/apps/i2pbote/test/i2p/bote/packet/kademlia/FindCloseNodesPacketTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package i2p.bote.packet.kademlia; - - -import static junit.framework.Assert.assertTrue; - -import i2p.bote.packet.dht.FindClosePeersPacket; - -import java.util.Arrays; - -import net.i2p.data.Hash; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class FindCloseNodesPacketTest { - FindClosePeersPacket findCloseNodesPacket; - - @Before - public void setUp() throws Exception { - Hash key = new Hash(new byte[] {-48, 78, 66, 58, -79, 87, 38, -103, -60, -27, 108, 55, 117, 37, -99, 93, -23, -102, -83, 20, 44, -80, 65, 89, -68, -73, 69, 51, 115, 79, 24, 127}); - - findCloseNodesPacket = new FindClosePeersPacket(key); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void toByteArrayAndBack() throws Exception { - byte[] arrayA = findCloseNodesPacket.toByteArray(); - byte[] arrayB = new FindClosePeersPacket(arrayA).toByteArray(); - assertTrue("The two arrays differ!", Arrays.equals(arrayA, arrayB)); - } -} \ No newline at end of file diff --git a/apps/i2pbote/test/i2p/bote/packet/kademlia/StorageRequestTest.java b/apps/i2pbote/test/i2p/bote/packet/kademlia/StorageRequestTest.java deleted file mode 100644 index 172b1c5c3..000000000 --- a/apps/i2pbote/test/i2p/bote/packet/kademlia/StorageRequestTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package i2p.bote.packet.kademlia; - -import static junit.framework.Assert.assertTrue; -import i2p.bote.EmailIdentity; -import i2p.bote.packet.EmailPacket; -import i2p.bote.packet.UniqueId; -import i2p.bote.packet.dht.StoreRequest; - -import java.util.Arrays; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.nettgryppa.security.HashCash; - -public class StorageRequestTest { - StoreRequest storageRequest; - - @Before - public void setUp() throws Exception { - byte[] emailContent = new byte[] {2, 109, -80, -37, -106, 83, -33, -39, -94, -76, -112, -98, 99, 25, -61, 44, -92, -85, 1, 10, -128, -2, -27, -86, -126, -33, -11, 42, 56, 3, -97, -101, 111, 7, -96, 25, 121, 74, 89, -40, -33, 82, -50, -18, 49, 106, 13, -121, 53, -83, -2, 35, -7, 71, -71, 26, 90, 1}; - UniqueId deletionKeyPlain = new UniqueId(new byte[] {72, -18, -72, -39, 122, 40, -104, -66, -54, -61, -108, 72, 54, 30, 37, 76, 44, 86, 104, -124, -31, 32, -82, -27, 26, 76, 7, 106, -76, 72, 49, -44}, 0); - UniqueId deletionKeyEncrypted = new UniqueId(new byte[] {-62, -112, 99, -65, 13, 44, -117, -111, 96, 45, -6, 64, 78, 57, 117, 103, -24, 101, 106, -116, -18, 62, 99, -49, 60, -81, 8, 64, 27, -41, -104, 58}, 0); - UniqueId messageId = new UniqueId(new byte[] {2, -69, -24, -109, 1, 69, -122, -69, 113, -68, -90, 55, -28, 105, 97, 125, 70, 51, 58, 14, 2, -13, -53, 90, -29, 36, 67, 36, -94, -108, -125, 11, 123}, 0); - String base64Identity = "piYT1uJ3O8~bBPZmTvehMbp3-Zksg5enhvIlp2X8txqL25l0WdQMWwyt30UAOVQqxGdnMPTqqjh~-zoa~rCQORo~J1gRxLwCX9LlHQqaIimJilrbN-rhKy4Xlft054wbgQjLSC-WICE4W64KDfitwRzdr7lV6lz~0KFiZ8erZ-~WPMG1CgWEku9lILQUdUHyFBguPcK9oPDq7oGBuFGy8w0CvAq7ex3nmbL7zQVA~VqILtOGeGK2fidCuuofj4AQsTcXmH9O0nxZGCIJBhf~4EWmazvxu8XVB8pabNQvRDbmFu6q85JTwmxC45lCjqNw30hp8q2zoqP-zchjWOrxFUhSumpBdD0xXJR~qmhejh4WnuRnnam9j3fcxH5i~T7xWgmvIbpZEI4kyc9VEbXbLI7k-bU2A6sdP-AGt5~TjGLcxpdsPnOLRXO-Dsi7E9-3Kc84s4TmdpEJdtHn1dxYyeeT-ysVOqXjv5w5Cuk0XJpUIJG8n7aXHpNb-QLxPD3yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWF3qnAX-p41Po~VNmOUzS-Yt~noD8-e~L3P5rZXBWf-XtB4hkloo6m1jwqphEdf1"; - EmailIdentity identity = new EmailIdentity(base64Identity); - EmailPacket emailPacket = new EmailPacket(emailContent, deletionKeyPlain, deletionKeyEncrypted, messageId, 0, 1, identity); - - HashCash hashCash = HashCash.mintCash("1234", 1); - - storageRequest = new StoreRequest(hashCash, emailPacket); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void toByteArrayAndBack() throws Exception { - byte[] arrayA = storageRequest.toByteArray(); - byte[] arrayB = new StoreRequest(arrayA).toByteArray(); - assertTrue(Arrays.equals(arrayA, arrayB)); - } -} \ No newline at end of file From d268a3852c4f4ee8ed268f1b6b09a8c096e0c7fd Mon Sep 17 00:00:00 2001 From: neutron Date: Mon, 16 Nov 2009 21:36:46 +0000 Subject: [PATCH 2/2] A first incomplete French version of the router console translation file messages_fr.po --- apps/routerconsole/locale/messages_fr.po | 2705 ++++++++++++++++++++++ 1 file changed, 2705 insertions(+) create mode 100644 apps/routerconsole/locale/messages_fr.po diff --git a/apps/routerconsole/locale/messages_fr.po b/apps/routerconsole/locale/messages_fr.po new file mode 100644 index 000000000..828345de9 --- /dev/null +++ b/apps/routerconsole/locale/messages_fr.po @@ -0,0 +1,2705 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the routerconsole package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P routerconsole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-11-01 02:59+0000\n" +"PO-Revision-Date: 2009-11-16 22:31+0100\n" +"Last-Translator: \n" +"Language-Team: foo \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +msgid "config networking" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216 +msgid "Refresh (s)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220 +msgid "Enable" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241 +msgid "I2P Network Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297 +msgid "Bandwidth limiter" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299 +msgid "I2P will work best if you configure your rates to match the speed of your internet connection." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303 +msgid "KBps In" +msgstr "KOps entrant" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:313 +msgid "KBps Out" +msgstr "KOps sortant" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:323 +msgid "Share" +msgstr "Partager" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303 +msgid "NOTE" +msgstr "NOTER" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:332 +#, java-format +msgid "You have configured I2P to share only {0} KBps." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:335 +msgid "I2P requires at least 12KBps to enable sharing. " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 +msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:337 +msgid "It improves your anonymity by creating cover traffic, and helps the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340 +#, java-format +msgid "You have configured I2P to share {0} KBps." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +msgid "The higher the share bandwidth the more you improve your anonymity and help the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 +#: src/net/i2p/router/web/ConfigNetHandler.java:47 +#: src/net/i2p/router/web/ConfigNetHandler.java:249 +#: src/net/i2p/router/web/ConfigTunnelsHandler.java:35 +msgid "Save changes" +msgstr "Sauvegarder" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:356 +msgid "Cancel" +msgstr "Annuler" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353 +msgid "IP and Transport Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:355 +msgid "The default settings will work for most people." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357 +msgid "There is help below." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +msgid "UPnP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:363 +msgid "Enable UPnP to open firewall ports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 +msgid "UPnP status" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:367 +msgid "IP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 +msgid "Externally reachable hostname or IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373 +msgid "Use all auto-detect methods" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +msgid "Disable UPnP IP address detection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +msgid "Ignore local interface IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +msgid "Use SSU IP address detection only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +msgid "Specify hostname or IP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +msgid "Select Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336 +#: src/net/i2p/router/web/GraphHelper.java:111 +msgid "or" +msgstr "ou" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +msgid "Hidden mode - do not publish IP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 +msgid "(prevents participating traffic)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 +msgid "UDP Configuration:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:415 +msgid "UDP port:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:423 +msgid "TCP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +msgid "Use auto-detected IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 +msgid "currently" +msgstr "actuellement" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +msgid "if we are not firewalled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +msgid "Always use auto-detected IP address (Not firewalled)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 +msgid "Disable inbound (Firewalled)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 +msgid "Completely disable" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:455 +msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 +msgid "Externally reachable TCP port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +msgid "Use the same port configured for UDP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:469 +msgid "Specify Port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:473 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329 +msgid "Note" +msgstr "Noter" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:476 +msgid "Changing these settings will restart your router." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:482 +msgid "Configuration Help" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port (generally 8887) is forwarded for both UDP and TCP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:486 +msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488 +msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490 +msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492 +msgid "Certain firewalls such as symmetric NATs may not work well with I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:494 +msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496 +msgid "UPnP support is beta, and may not work for any number of reasons" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498 +msgid "No UPnP-compatible device present" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:500 +msgid "UPnP disabled on the device" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:502 +msgid "Software firewall interference with UPnP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504 +msgid "Bugs in the device's UPnP implementation" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:506 +msgid "Multiple firewall/routers in the internet connection path" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508 +msgid "UPnP device change, reset, or address change" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:510 +msgid "Review the UPnP status here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 +msgid "Hostnames entered above will be published in the network database." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 +msgid "They are not private." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +msgid "Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 +msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +msgid "When in doubt, leave the settings at the defaults." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +msgid "Reachability Help" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:529 +msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +msgid "If there is an error, the logs may also help diagnose the problem." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: src/net/i2p/router/web/SummaryHelper.java:103 +msgid "OK" +msgstr "OK" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 +msgid "Your UDP port does not appear to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: src/net/i2p/router/web/SummaryHelper.java:114 +msgid "Firewalled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 +msgid "Your UDP port appears to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 +msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 +msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open on port 8887." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 +msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548 +msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550 +msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552 +msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554 +#: src/net/i2p/router/web/SummaryHelper.java:127 +msgid "Testing" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:556 +msgid "The router is currently testing whether your UDP port is firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558 +#: src/net/i2p/router/web/NetDbRenderer.java:234 +#: src/net/i2p/router/web/SummaryHelper.java:96 +msgid "Hidden" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560 +msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562 +msgid "WARN - Firewalled and Fast" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564 +msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566 +msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568 +msgid "WARN - Firewalled and Floodfill" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:570 +msgid "You have configured I2P to be a floodfill router, but you are firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +msgid "For best participation as a floodfill router, you should open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574 +msgid "WARN - Firewalled with Inbound TCP Enabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576 +msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578 +msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580 +msgid "Please open your firewall or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582 +msgid "WARN - Firewalled with UDP Disabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584 +msgid "You have configured inbound TCP, however you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:586 +msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:588 +msgid "Please open your firewall or enable UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 +msgid "ERR - Clock Skew" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592 +msgid "Your system's clock is skewed, which will make it difficult to participate in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:594 +msgid "Correct your clock setting if this error persists." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596 +msgid "ERR - Private TCP Address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598 +msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600 +msgid "Correct the address or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602 +msgid "ERR - SymmetricNAT" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604 +msgid "I2P detected that you are firewalled by a Symmetric NAT." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606 +msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:608 +msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:610 +msgid "I2P was unable to bind to port 8887 or other configured port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612 +msgid "Check to see if another program is using port 8887. If so, stop that program or configure I2P to use a different port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:614 +msgid "This may be a transient error, if the other program is no longer using the port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616 +msgid "However, a restart is always required after this error." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618 +msgid "ERR - UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620 +msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:622 +msgid "Therefore your router cannot accept inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:624 +msgid "Please configure a TCP host and port above or enable UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626 +msgid "ERR - Client Manager I2CP Error - check logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628 +msgid "This is usually due to a port 7654 conflict. Check the logs to verify." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:630 +msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +msgid "config advanced" +msgstr "configuration avancé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242 +msgid "I2P Advanced Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299 +msgid "Advanced I2P Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321 +msgid "Apply" +msgstr "Appliquer" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 +msgid "Some changes may require a restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +msgid "config clients" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:241 +msgid "I2P Client Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:306 +msgid "Client Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:308 +msgid "The Java clients listed below are started by the router and run in the same JVM." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +msgid "To change other client options, edit the file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +msgid "All changes require restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321 +#: src/net/i2p/router/web/ConfigClientsHandler.java:32 +msgid "Save Client Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:323 +msgid "WebApp Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 +msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 +msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:333 +#: src/net/i2p/router/web/ConfigClientsHandler.java:36 +msgid "Save WebApp Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +msgid "config keyring" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228 +msgid "I2P Keyring Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292 +#: src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Keyring" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294 +msgid "The router keyring is used to decrypt encrypted leaseSets." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297 +msgid "The keyring may contain keys for local or remote encrypted destinations." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307 +msgid "Manual Keyring Addition" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309 +msgid "Enter keys for encrypted remote destinations here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312 +msgid "Keys for local destinations must be entered on the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314 +msgid "I2PTunnel page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316 +msgid "Dest. name, hash, or full key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318 +msgid "Encryption Key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 +#: src/net/i2p/router/web/ConfigKeyringHandler.java:18 +msgid "Add key" +msgstr "Ajouter une clé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322 +#: src/net/i2p/router/web/ConfigKeyringHandler.java:19 +msgid "Delete key" +msgstr "Supprimer une clé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +msgid "config logging" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242 +msgid "I2P Logging Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299 +msgid "Configure I2P Logging Options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +msgid "Logging filename" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305 +msgid "(the symbol '@' will be replaced during log rotation)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +msgid "Log record format" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311 +msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +msgid "Log date format" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317 +msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +msgid "Max log file size" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323 +msgid "Default log level" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 +msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +msgid "Log level overrides" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +msgid "config peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228 +msgid "I2P Peer Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304 +msgid "Manual Peer Controls" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306 +msgid "Router Hash" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310 +msgid "Manually Ban / Unban a Peer" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312 +msgid "Banning will prevent the participation of this peer in tunnels you create." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314 +#: src/net/i2p/router/web/ConfigPeerHandler.java:20 +msgid "Ban peer until restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316 +#: src/net/i2p/router/web/ConfigPeerHandler.java:28 +msgid "Unban peer" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322 +#: src/net/i2p/router/web/ConfigPeerHandler.java:39 +msgid "Adjust Profile Bonuses" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324 +msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326 +msgid "profiles page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:71 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:231 +msgid "Speed" +msgstr "Vitesse" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:232 +msgid "Capacity" +msgstr "Capacité" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342 +msgid "Adjust peer bonuses" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:249 +msgid "Banned Peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +msgid "Banned IPs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +msgid "config service" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228 +msgid "I2P Service Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284 +msgid "Shutdown the router" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286 +msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288 +msgid "If you need to kill the router immediately, that option is available as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290 +#: src/net/i2p/router/web/ConfigServiceHandler.java:53 +msgid "Shutdown gracefully" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292 +#: src/net/i2p/router/web/ConfigRestartBean.java:32 +#: src/net/i2p/router/web/ConfigServiceHandler.java:57 +msgid "Shutdown immediately" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294 +#: src/net/i2p/router/web/ConfigServiceHandler.java:61 +msgid "Cancel graceful shutdown" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298 +msgid "If you want the router to restart itself after shutting down, you can choose one of the following." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300 +msgid "This is useful in some situations" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302 +msgid "for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304 +msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306 +msgid "After tearing down the router, it will wait 1 minute before starting back up again." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308 +#: src/net/i2p/router/web/ConfigServiceHandler.java:64 +msgid "Graceful restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:310 +#: src/net/i2p/router/web/ConfigServiceHandler.java:68 +msgid "Hard restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316 +msgid "Systray integration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318 +msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320 +msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322 +msgid "If you are on windows, you can either enable or disable that icon here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324 +#: src/net/i2p/router/web/ConfigServiceHandler.java:91 +msgid "Show systray icon" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326 +#: src/net/i2p/router/web/ConfigServiceHandler.java:103 +msgid "Hide systray icon" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328 +msgid "Run on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330 +msgid "You can control whether I2P is run on startup or not by selecting one of the following options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332 +msgid "I2P will install (or remove) a service accordingly." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334 +msgid "If you prefer the command line, you can also run the " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338 +#: src/net/i2p/router/web/ConfigServiceHandler.java:80 +msgid "Run I2P on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340 +#: src/net/i2p/router/web/ConfigServiceHandler.java:82 +msgid "Don't run I2P on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344 +msgid "If you are running I2P as service right now, removing it will shut down your router immediately." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346 +msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354 +msgid "Debugging" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356 +#: src/net/i2p/router/web/ConfigServiceHandler.java:84 +msgid "Dump threads" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360 +msgid "Launch browser on router startup?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362 +msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364 +#: src/net/i2p/router/web/ConfigServiceHandler.java:115 +msgid "View console on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366 +#: src/net/i2p/router/web/ConfigServiceHandler.java:118 +msgid "Do not view console on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +msgid "config stats" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229 +msgid "I2P Stats Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300 +msgid "Configure I2P Stat Collection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +msgid "Enable full stats?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309 +msgid "change requires restart to take effect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +msgid "Stat file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315 +msgid "Filter" +msgstr "Filtre" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326 +msgid "toggle all" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +msgid "Log" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +msgid "Graph" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369 +msgid "Advanced filter" +msgstr "Filtre avancé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +msgid "config tunnels" +msgstr "Configuration des tunnels" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241 +msgid "I2P Tunnel Configuration" +msgstr "Configuration des tunnels I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305 +msgid "The default settings work for most people." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309 +msgid "There is a fundamental tradeoff between anonymity and performance." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312 +msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315 +msgid "High CPU and/or high outbound bandwidth usage may result." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318 +msgid "Change these settings with care, and adjust them if you have problems." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 +msgid "Exploratory tunnel setting changes are stored in the router.config file." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 +msgid "Client tunnel changes are temporary and are not saved." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337 +msgid "To make permanent client tunnel changes see the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339 +msgid "i2ptunnel page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +msgid "config UI" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241 +msgid "I2P UI Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291 +msgid "Router Console Theme" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309 +msgid "Theme selection disabled for Internet Explorer, sorry." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311 +msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315 +msgid "Router Console Language" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319 +msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +msgid "config update" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228 +msgid "I2P Update Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:300 +msgid "Check for I2P and news updates" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302 +msgid "News & I2P Updates" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:306 +msgid "Update In Progress" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:310 +#: src/net/i2p/router/web/ConfigUpdateHandler.java:56 +msgid "Check for updates" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:314 +msgid "News URL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:318 +msgid "Refresh frequency" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:322 +msgid "Update policy" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326 +msgid "Update through the eepProxy?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330 +msgid "eepProxy host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334 +msgid "eepProxy port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338 +msgid "Update URLs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342 +msgid "Trusted keys" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346 +msgid "Update with unsigned development builds?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350 +msgid "Unsigned Build URL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354 +msgid "Save" +msgstr "Sauvegarder" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +msgid "Page Not Found" +msgstr "Page introuvable" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243 +msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245 +msgid "Error 404" +msgstr "Erreur 404" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250 +msgid "not found" +msgstr "pas trouvé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +msgid "graphs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228 +msgid "I2P Performance Graphs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +msgid "home" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234 +#: src/net/i2p/router/web/CSSHelper.java:41 +#: src/net/i2p/router/web/SummaryBarRenderer.java:26 +#: src/net/i2p/router/web/SummaryBarRenderer.java:28 +msgid "I2P Router Console" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +msgid "job queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227 +msgid "I2P Router Job Queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +msgid "logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227 +msgid "I2P Router Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229 +msgid "I2P Version & Running Environment" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231 +msgid "Please include this information in bug reports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +msgid "network database summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227 +msgid "I2P Network Database Summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:105 +msgid "statistics" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:242 +msgid "I2P Router Statistics" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +msgid "peer connections" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227 +msgid "I2P Network Peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +msgid "peer profiles" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227 +msgid "I2P Network Peer Profiles" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#, java-format +msgid "Disable {0}s Refresh" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +msgid "tunnel summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227 +msgid "I2P Tunnel Summary" +msgstr "" + +#: src/net/i2p/router/web/ConfigAdvancedHandler.java:57 +msgid "Error updating the configuration - please see the error logs" +msgstr "" + +#: src/net/i2p/router/web/ConfigAdvancedHandler.java:69 +#: src/net/i2p/router/web/ConfigNetHandler.java:251 +msgid "Configuration saved successfully" +msgstr "" + +#: src/net/i2p/router/web/ConfigAdvancedHandler.java:71 +#: src/net/i2p/router/web/ConfigNetHandler.java:253 +msgid "Error saving the configuration (applied but not saved) - please see the error logs" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:54 +#: src/net/i2p/router/web/ConfigClientsHelper.java:67 +msgid "Start" +msgstr "Démarrer" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:68 +#: src/net/i2p/router/web/ConfigKeyringHandler.java:49 +msgid "Unsupported" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:83 +msgid "Client configuration saved successfully - restart required to take effect." +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:89 +msgid "Bad client index." +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:94 +#: src/net/i2p/router/web/ConfigClientsHelper.java:17 +#: src/net/i2p/router/web/SummaryBarRenderer.java:359 +#: src/net/i2p/router/web/SummaryHelper.java:371 +msgid "Client" +msgstr "Client" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:94 +#: src/net/i2p/router/web/ConfigClientsHandler.java:129 +msgid "started" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:111 +msgid "WebApp configuration saved successfully - restart required to take effect." +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:129 +#: src/net/i2p/router/web/ConfigClientsHelper.java:34 +msgid "WebApp" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:131 +msgid "Failed to start" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHandler.java:137 +msgid "Failed to find server." +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHelper.java:17 +msgid "Class and arguments" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHelper.java:17 +#: src/net/i2p/router/web/ConfigClientsHelper.java:34 +msgid "Run at Startup?" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHelper.java:17 +#: src/net/i2p/router/web/ConfigClientsHelper.java:34 +msgid "Start Now" +msgstr "" + +#: src/net/i2p/router/web/ConfigClientsHelper.java:34 +msgid "Description" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:21 +msgid "You must enter a destination" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:23 +msgid "You must enter a key" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:34 +#: src/net/i2p/router/web/ConfigKeyringHandler.java:41 +#: src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "Key for" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:34 +msgid "added to keyring" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:36 +msgid "Invalid destination or key" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:41 +msgid "removed from keyring" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "not found in keyring" +msgstr "" + +#: src/net/i2p/router/web/ConfigKeyringHandler.java:45 +msgid "Invalid destination" +msgstr "" + +#: src/net/i2p/router/web/ConfigLoggingHelper.java:52 +msgid "CRIT" +msgstr "" + +#: src/net/i2p/router/web/ConfigLoggingHelper.java:52 +msgid "DEBUG" +msgstr "" + +#: src/net/i2p/router/web/ConfigLoggingHelper.java:52 +msgid "ERROR" +msgstr "" + +#: src/net/i2p/router/web/ConfigLoggingHelper.java:52 +msgid "INFO" +msgstr "" + +#: src/net/i2p/router/web/ConfigLoggingHelper.java:52 +msgid "WARN" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Network" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Service" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:18 +#: src/net/i2p/router/web/SummaryBarRenderer.java:82 +#: src/net/i2p/router/web/TunnelRenderer.java:253 +msgid "Tunnels" +msgstr "Tunnels" + +#: src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "UI" +msgstr "IHM" + +#: src/net/i2p/router/web/ConfigNavHelper.java:18 +#: src/net/i2p/router/web/SummaryBarRenderer.java:198 +#: src/net/i2p/router/web/SummaryBarRenderer.java:205 +msgid "Update" +msgstr "Mettre à jour" + +#: src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Clients" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Logging" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:19 +#: src/net/i2p/router/web/SummaryBarRenderer.java:88 +#: src/net/i2p/router/web/SummaryBarRenderer.java:223 +msgid "Peers" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:19 +#: src/net/i2p/router/web/NetDbRenderer.java:256 +#: src/net/i2p/router/web/SummaryBarRenderer.java:124 +msgid "Stats" +msgstr "" + +#: src/net/i2p/router/web/ConfigNavHelper.java:20 +msgid "Advanced" +msgstr "Avancé" + +#: src/net/i2p/router/web/ConfigNetHandler.java:119 +msgid "Rechecking router reachability..." +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:148 +msgid "Updating IP address" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:166 +msgid "Disabling TCP completely" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:170 +msgid "Updating inbound TCP address to" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:174 +msgid "Disabling inbound TCP" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:176 +msgid "Updating inbound TCP address to auto" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:185 +msgid "Updating inbound TCP port to" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:188 +msgid "Updating inbound TCP port to auto" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:200 +msgid "Updating UDP port from" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:200 +msgid "to" +msgstr "à" + +#: src/net/i2p/router/web/ConfigNetHandler.java:216 +msgid "Gracefully restarting into Hidden Router Mode" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:218 +msgid "Gracefully restarting to exit Hidden Router Mode" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:227 +msgid "Enabling UPnP, restart required to take effect" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:229 +msgid "Disabling UPnP, restart required to take effect" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:235 +msgid "Requiring SSU introduers" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:275 +msgid "Gracefully restarting I2P to change published router address" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:293 +msgid "Updating bandwidth share percentage" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHandler.java:363 +msgid "Updated bandwidth limits" +msgstr "" + +#: src/net/i2p/router/web/ConfigNetHelper.java:39 +#: src/net/i2p/router/web/ConfigNetHelper.java:47 +#: src/net/i2p/router/web/ConfigNetHelper.java:50 +#: src/net/i2p/router/web/ConfigNetHelper.java:57 +#: src/net/i2p/router/web/ConfigNetHelper.java:60 +msgid "unknown" +msgstr "inconnu" + +#: src/net/i2p/router/web/ConfigNetHelper.java:165 +msgid "bits per second" +msgstr "bits par seconde" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:24 +#: src/net/i2p/router/web/ConfigPeerHandler.java:33 +#: src/net/i2p/router/web/ConfigPeerHandler.java:35 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:69 +#: src/net/i2p/router/web/TunnelRenderer.java:235 +msgid "Peer" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:24 +msgid "banned until restart" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:27 +#: src/net/i2p/router/web/ConfigPeerHandler.java:38 +#: src/net/i2p/router/web/ConfigPeerHandler.java:59 +msgid "Invalid peer" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:33 +msgid "unbanned" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:35 +msgid "is not currently banned" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:47 +msgid "Bad speed value" +msgstr "" + +#: src/net/i2p/router/web/ConfigPeerHandler.java:52 +msgid "Bad capacity value" +msgstr "" + +#: src/net/i2p/router/web/ConfigRestartBean.java:36 +msgid "Cancel shutdown" +msgstr "Annuler redémarrage" + +#: src/net/i2p/router/web/ConfigRestartBean.java:38 +msgid "Restart immediately" +msgstr "Redémarrer immédiatement" + +#: src/net/i2p/router/web/ConfigRestartBean.java:42 +msgid "Restart" +msgstr "Redémarrer" + +#: src/net/i2p/router/web/ConfigRestartBean.java:45 +msgid "Shutdown" +msgstr "" + +#: src/net/i2p/router/web/ConfigRestartBean.java:56 +msgid "Shutdown imminent" +msgstr "" + +#: src/net/i2p/router/web/ConfigRestartBean.java:59 +#, java-format +msgid "Shutdown in {0}" +msgstr "" + +#: src/net/i2p/router/web/ConfigRestartBean.java:64 +#, java-format +msgid "Restart in {0}" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:56 +msgid "Graceful shutdown initiated" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:60 +msgid "Shutdown immediately! boom bye bye bad bwoy" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:63 +msgid "Graceful shutdown cancelled" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:67 +msgid "Graceful restart requested" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:71 +msgid "Hard restart requested" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:72 +msgid "Rekey and Restart" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:73 +msgid "Rekeying after graceful restart" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:76 +msgid "Rekey and Shutdown" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:77 +msgid "Rekeying after graceful shutdown" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:96 +msgid "System tray icon enabled." +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:98 +#: src/net/i2p/router/web/ConfigServiceHandler.java:110 +msgid "System tray icon feature not supported on this platform. Sorry!" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:101 +#: src/net/i2p/router/web/ConfigServiceHandler.java:113 +msgid "Warning: unable to contact the systray manager" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:108 +msgid "System tray icon disabled." +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:117 +msgid "Console is to be shown on startup" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:120 +msgid "Console is not to be shown on startup" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:129 +msgid "Service installed" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:131 +msgid "Warning: unable to install the service" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:137 +msgid "Service removed" +msgstr "" + +#: src/net/i2p/router/web/ConfigServiceHandler.java:139 +msgid "Warning: unable to remove the service" +msgstr "" + +#: src/net/i2p/router/web/ConfigStatsHandler.java:118 +msgid "Stat filter and location updated successfully to" +msgstr "" + +#: src/net/i2p/router/web/ConfigStatsHandler.java:120 +msgid "Failed to update the stat filter and location" +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHandler.java:137 +msgid "Updated settings for all pools." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHandler.java:142 +msgid "Exploratory tunnel configuration saved successfully." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHandler.java:144 +#: src/net/i2p/router/web/ConfigUIHandler.java:36 +msgid "Error saving the configuration (applied but not saved) - please see the error logs." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:11 +msgid "hop" +msgstr "saut" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:12 +msgid "tunnel" +msgstr "tunnel" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:14 +msgid "hops" +msgstr "sauts" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:15 +msgid "tunnels" +msgstr "tunnels" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: src/net/i2p/router/web/TunnelRenderer.java:40 +msgid "Exploratory tunnels" +msgstr "Tunnels exploratoires" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:46 +#: src/net/i2p/router/web/TunnelRenderer.java:60 +msgid "Client tunnels for" +msgstr "Tunnels clients pour" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +msgid "PERFORMANCE WARNING - Settings include very long tunnels." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +msgid "Inbound" +msgstr "Entrant" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +msgid "Outbound" +msgstr "Sortant" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +msgid "Depth" +msgstr "Profondeur" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +msgid "Randomization" +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +msgid "Quantity" +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +msgid "Backup quantity" +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +msgid "Inbound options" +msgstr "" + +#: src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +msgid "Outbound options" +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHandler.java:31 +msgid "Theme change saved." +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHandler.java:33 +msgid "Refresh the page to view." +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHelper.java:40 +msgid "English" +msgstr "Anglais" + +#: src/net/i2p/router/web/ConfigUIHelper.java:40 +msgid "French" +msgstr "Français" + +#: src/net/i2p/router/web/ConfigUIHelper.java:40 +msgid "German" +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHelper.java:41 +msgid "Chinese" +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHelper.java:41 +msgid "Dutch" +msgstr "" + +#: src/net/i2p/router/web/ConfigUIHelper.java:41 +msgid "Swedish" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:63 +msgid "Update available, attempting to download now" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:65 +msgid "Update available, click button on left to download" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:67 +msgid "No update available" +msgstr "Pas de mise à jour disponible" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:75 +msgid "Updating news URL to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:83 +msgid "Updating proxy host to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:91 +msgid "Updating proxy port to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:104 +msgid "Updating refresh frequency to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:111 +msgid "Updating update policy to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:120 +msgid "Updating update URLs." +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:128 +msgid "Updating trusted keys." +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHandler.java:136 +msgid "Updating unsigned update URL to" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHelper.java:75 +#: src/net/i2p/router/web/GraphHelper.java:115 +msgid "Never" +msgstr "Jamais" + +#: src/net/i2p/router/web/ConfigUpdateHelper.java:77 +msgid "Every" +msgstr "Chaque" + +#: src/net/i2p/router/web/ConfigUpdateHelper.java:90 +#: src/net/i2p/router/web/ConfigUpdateHelper.java:92 +msgid "Notify only" +msgstr "" + +#: src/net/i2p/router/web/ConfigUpdateHelper.java:95 +#: src/net/i2p/router/web/ConfigUpdateHelper.java:97 +msgid "Download and verify only" +msgstr "Télécharger et vérifier seulement" + +#: src/net/i2p/router/web/ConfigUpdateHelper.java:101 +#: src/net/i2p/router/web/ConfigUpdateHelper.java:103 +msgid "Download, verify, and restart" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:107 +msgid "Configure Graph Display" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:107 +msgid "Select Stats" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:109 +msgid "Periods" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:110 +msgid "Plot averages" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:111 +msgid "plot events" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:112 +msgid "Image sizes" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:112 +msgid "width" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:113 +msgid "height" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:113 +#: src/net/i2p/router/web/GraphHelper.java:114 +msgid "pixels" +msgstr "pixels" + +#: src/net/i2p/router/web/GraphHelper.java:115 +msgid "Refresh delay" +msgstr "" + +#: src/net/i2p/router/web/GraphHelper.java:115 +msgid "hour" +msgstr "heure" + +#: src/net/i2p/router/web/GraphHelper.java:115 +msgid "minute" +msgstr "minute" + +#: src/net/i2p/router/web/GraphHelper.java:115 +msgid "minutes" +msgstr "minutes" + +#: src/net/i2p/router/web/NetDbRenderer.java:59 +msgid "Network Database RouterInfo Lookup" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:74 +msgid "Router" +msgstr "Routeur" + +#: src/net/i2p/router/web/NetDbRenderer.java:74 +msgid "not found in network database" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:86 +#: src/net/i2p/router/web/NetDbRenderer.java:135 +msgid "Network Database Contents" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:87 +#: src/net/i2p/router/web/NetDbRenderer.java:135 +msgid "View" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:96 +msgid "LeaseSet" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:98 +msgid "Local" +msgstr "Locale" + +#: src/net/i2p/router/web/NetDbRenderer.java:100 +msgid "Unpublished" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:101 +#: src/net/i2p/router/web/NetDbRenderer.java:108 +msgid "Destination" +msgstr "Destination" + +#: src/net/i2p/router/web/NetDbRenderer.java:118 +#, java-format +msgid "Expires in {0}" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:120 +#, java-format +msgid "Expired {0} ago" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:122 +#: src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Gateway" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:122 +msgid "Lease" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:124 +msgid "Tunnel" +msgstr "Tunnel" + +#: src/net/i2p/router/web/NetDbRenderer.java:137 +msgid "Not initialized" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:143 +msgid "Routers" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:145 +msgid "view without" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:147 +msgid "view with" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:148 +msgid "stats" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:183 +#: src/net/i2p/router/web/NetDbRenderer.java:199 +msgid "Count" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:183 +#: src/net/i2p/router/web/SummaryBarRenderer.java:150 +msgid "Version" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:199 +msgid "Country" +msgstr "Pays" + +#: src/net/i2p/router/web/NetDbRenderer.java:222 +msgid "Our info" +msgstr "Notre info" + +#: src/net/i2p/router/web/NetDbRenderer.java:224 +msgid "Peer info for" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:228 +msgid "Full entry" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:234 +msgid "Updated" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:234 +#: src/net/i2p/router/web/NetDbRenderer.java:236 +#: src/net/i2p/router/web/SummaryHelper.java:385 +msgid "ago" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:236 +#: src/net/i2p/router/web/NetDbRenderer.java:238 +msgid "Published" +msgstr "" + +#: src/net/i2p/router/web/NetDbRenderer.java:239 +msgid "Address(es)" +msgstr "" + +#: src/net/i2p/router/web/NewsFetcher.java:80 +#, java-format +msgid "News last updated {0} ago." +msgstr "" + +#: src/net/i2p/router/web/NewsFetcher.java:86 +#, java-format +msgid "News last checked {0} ago." +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:63 +msgid "Peer Profiles" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:64 +#, java-format +msgid "Showing {0} recent profiles." +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:65 +#, java-format +msgid "Hiding {0} older profiles." +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:70 +msgid "Groups (Caps)" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:233 +msgid "Integration" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:74 +msgid "Status" +msgstr "Statut actuel" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:111 +msgid "Fast, High Capacity" +msgstr "Rapide, haute capacité" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:112 +msgid "High Capacity" +msgstr "Haute capacité" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:113 +msgid "Standard" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:114 +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:148 +msgid "Failing" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:116 +#: src/net/i2p/router/web/SummaryBarRenderer.java:249 +msgid "Integrated" +msgstr "Intégré" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:147 +msgid "Banned" +msgstr "Prohibé" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:149 +msgid "Unreachable" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:156 +msgid "Test Fails" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:168 +msgid "Floodfill and Integrated Peers" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:230 +msgid "Thresholds:" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:234 +msgid "Definitions" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:235 +msgid "as determined by the profile organizer" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:235 +msgid "groups" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:236 +msgid "capabilities in the netDb, not used to determine profiles" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:236 +msgid "caps" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:237 +msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:237 +msgid "speed" +msgstr "vitesse" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:238 +msgid "capacity" +msgstr "capacité" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:238 +msgid "how many tunnels can we ask them to join in an hour?" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:239 +msgid "how many new peers have they told us about lately?" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:239 +msgid "integration" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:240 +msgid "is the peer banned, or unreachable, or failing tunnel tests?" +msgstr "" + +#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:240 +msgid "status" +msgstr "" + +#: src/net/i2p/router/web/StatsGenerator.java:58 +msgid "Statistics gathered during this router's uptime" +msgstr "" + +#: src/net/i2p/router/web/StatsGenerator.java:61 +msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate." +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:40 +msgid "Configure startup of clients and webapps (services); manually start dormant services" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:42 +msgid "I2P Services" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:48 +msgid "Manage your I2P hosts file here (I2P domain name resolution)" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:50 +msgid "Addressbook" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:54 +msgid "Built-in anonymous BitTorrent Client" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:56 +msgid "Torrents" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:60 +msgid "Anonymous webmail client" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:62 +msgid "Webmail" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:66 +msgid "Anonymous resident webserver" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:68 +msgid "Webserver" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:72 +msgid "Configure I2P Router" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:74 +msgid "I2P Internals" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:80 +#: src/net/i2p/router/web/SummaryBarRenderer.java:344 +msgid "View existing tunnels and tunnel build status" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:86 +#: src/net/i2p/router/web/SummaryBarRenderer.java:221 +msgid "Show all current peer connections" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:92 +msgid "Show recent peer performance profiles" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:94 +msgid "Profiles" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:98 +msgid "Show list of all known I2P routers" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:100 +msgid "NetDB" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:104 +msgid "Health Report" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:106 +msgid "Logs" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:110 +msgid "Show the router's workload, and how it's performing" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:112 +msgid "Jobs" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:116 +msgid "Graph router performance" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:118 +msgid "Graphs" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:122 +msgid "Textual router performance statistics" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:134 +msgid "I2P Router Help" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:136 +msgid "General" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:139 +msgid "Your unique I2P router identity is" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:143 +msgid "never reveal it to anyone" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:145 +msgid "Local Identity" +msgstr "Identité locale" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:157 +msgid "How long we've been running for this session" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:160 +msgid "Uptime" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:167 +msgid "Help with configuring your firewall and router for optimal I2P performance" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:194 +msgid "Download" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:203 +msgid "Download Unsigned" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:229 +msgid "Active" +msgstr "Actif" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:237 +msgid "Fast" +msgstr "Rapide" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:243 +msgid "High capacity" +msgstr "Haute capacité" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:255 +msgid "Known" +msgstr "Connu" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:270 +msgid "Help with firewall configuration" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:272 +msgid "Check NAT/firewall" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:292 +msgid "Reseed" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:309 +msgid "Configure router bandwidth allocation" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:311 +msgid "Bandwidth in/out" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:328 +msgid "Total" +msgstr "Total" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:336 +msgid "Used" +msgstr "Utilisé" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:346 +msgid "Tunnels in/out" +msgstr "Tunnels entrants/sortants" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:351 +msgid "Exploratory" +msgstr "Exploratoire" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:367 +msgid "Participating" +msgstr "Participant" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:373 +msgid "What's in the router's job queue?" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:375 +msgid "Congestion" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:380 +msgid "Job lag" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:386 +msgid "Message delay" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:392 +msgid "Tunnel lag" +msgstr "" + +#: src/net/i2p/router/web/SummaryBarRenderer.java:398 +msgid "Backlog" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:73 +msgid "skew" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:92 +msgid "ERR-Client Manager I2CP Error - check logs" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:94 +msgid "ERR-ClockSkew" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:104 +msgid "ERR-Private TCP Address" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:106 +msgid "ERR-SymmetricNAT" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:109 +msgid "WARN-Firewalled with Inbound TCP Enabled" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:111 +msgid "WARN-Firewalled and Floodfill" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:113 +msgid "WARN-Firewalled and Fast" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:116 +msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:123 +msgid "ERR-UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:125 +msgid "WARN-Firewalled with UDP Disabled" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:360 +msgid "Add/remove/edit & control your client and server tunnels" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:360 +msgid "Local Destinations" +msgstr "Destinations locales" + +#: src/net/i2p/router/web/SummaryHelper.java:369 +msgid "Server" +msgstr "Serveur" + +#: src/net/i2p/router/web/SummaryHelper.java:373 +msgid "Show tunnels" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:384 +msgid "Leases expired" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:384 +#: src/net/i2p/router/web/SummaryHelper.java:385 +msgid "Rebuilding" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:388 +msgid "Ready" +msgstr "Prêt" + +#: src/net/i2p/router/web/SummaryHelper.java:392 +msgid "Building" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:392 +msgid "Building tunnels" +msgstr "" + +#: src/net/i2p/router/web/SummaryHelper.java:404 +#: strings/Strings.java:33 +msgid "shared clients" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:40 +#: src/net/i2p/router/web/TunnelRenderer.java:62 +msgid "config" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:70 +msgid "Participating tunnels" +msgstr "tunnels participants" + +#: src/net/i2p/router/web/TunnelRenderer.java:71 +msgid "From" +msgstr "De" + +#: src/net/i2p/router/web/TunnelRenderer.java:71 +msgid "Receive on" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "Expiration" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "Send on" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "To" +msgstr "à" + +#: src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Rate" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Role" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:73 +#: src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Usage" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:117 +msgid "Outbound Endpoint" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:119 +msgid "Inbound Gateway" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:121 +#: src/net/i2p/router/web/TunnelRenderer.java:162 +msgid "Participant" +msgstr "Participant" + +#: src/net/i2p/router/web/TunnelRenderer.java:126 +msgid "Inactive participating tunnels" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:127 +#: src/net/i2p/router/web/TunnelRenderer.java:216 +msgid "Lifetime bandwidth usage" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Expiry" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "In/Out" +msgstr "Entrant/Sortant" + +#: src/net/i2p/router/web/TunnelRenderer.java:159 +msgid "Participants" +msgstr "Participants" + +#: src/net/i2p/router/web/TunnelRenderer.java:165 +msgid "Endpoint" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:205 +#: src/net/i2p/router/web/TunnelRenderer.java:211 +msgid "Build in progress" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:205 +msgid "inbound" +msgstr "entrant" + +#: src/net/i2p/router/web/TunnelRenderer.java:211 +msgid "outbound" +msgstr "sortant" + +#: src/net/i2p/router/web/TunnelRenderer.java:215 +msgid "No tunnels; waiting for the grace period to end." +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:216 +msgid "in" +msgstr "entrer" + +#: src/net/i2p/router/web/TunnelRenderer.java:217 +msgid "out" +msgstr "sortir" + +#: src/net/i2p/router/web/TunnelRenderer.java:234 +msgid "Tunnel Counts By Peer" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:235 +msgid "% of total" +msgstr "% du total" + +#: src/net/i2p/router/web/TunnelRenderer.java:235 +msgid "Expl. + Client" +msgstr "" + +#: src/net/i2p/router/web/TunnelRenderer.java:235 +msgid "Part. from + to" +msgstr "" + +#: strings/Strings.java:12 +msgid "addressbook" +msgstr "carnet d'adresse" + +#: strings/Strings.java:13 +msgid "i2psnark" +msgstr "i2psnark" + +#: strings/Strings.java:14 +msgid "i2ptunnel" +msgstr "i2ptunnel" + +#: strings/Strings.java:15 +msgid "susimail" +msgstr "susimail" + +#: strings/Strings.java:16 +msgid "susidns" +msgstr "susidns" + +#: strings/Strings.java:17 +msgid "routerconsole" +msgstr "" + +#: strings/Strings.java:22 +msgid "Web console" +msgstr "" + +#: strings/Strings.java:23 +msgid "SAM application bridge" +msgstr "" + +#: strings/Strings.java:24 +msgid "Application tunnels" +msgstr "Tunnels d'application" + +#: strings/Strings.java:25 +msgid "My eepsite web server" +msgstr "Serveur web de mon eepsite" + +#: strings/Strings.java:26 +msgid "Browser launch at startup" +msgstr "" + +#: strings/Strings.java:27 +msgid "BOB application bridge" +msgstr "" + +#: strings/Strings.java:34 +msgid "IRC proxy" +msgstr "proxy IRC" + +#: strings/Strings.java:35 +msgid "eepsite" +msgstr "eepsite" + +#: strings/Strings.java:37 +msgid "I2PSnark" +msgstr "I2PSnark" + +#: strings/Strings.java:40 +msgid "classic" +msgstr "classique" + +#: strings/Strings.java:41 +msgid "dark" +msgstr "foncé" + +#: strings/Strings.java:42 +msgid "light" +msgstr "léger" +