dnsjava-2.1.5/doc/ 40755 0 0 0 12131352540 10740 5ustar 0 0 dnsjava-2.1.5/doc/org/ 40755 0 0 0 12131352536 11534 5ustar 0 0 dnsjava-2.1.5/doc/org/xbill/ 40755 0 0 0 12131352536 12646 5ustar 0 0 dnsjava-2.1.5/doc/org/xbill/DNS/ 40755 0 0 0 12131352540 13265 5ustar 0 0 dnsjava-2.1.5/doc/org/xbill/DNS/spi/ 40755 0 0 0 12131352540 14060 5ustar 0 0 dnsjava-2.1.5/doc/org/xbill/DNS/utils/ 40755 0 0 0 12131352540 14425 5ustar 0 0 dnsjava-2.1.5/doc/resources/ 40755 0 0 0 12131352540 12752 5ustar 0 0 dnsjava-2.1.5/org/ 40755 0 0 0 12131352524 10764 5ustar 0 0 dnsjava-2.1.5/org/xbill/ 40755 0 0 0 12131352524 12076 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/ 40755 0 0 0 12131352533 12522 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/spi/ 40755 0 0 0 12131352533 13315 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/spi/services/ 40755 0 0 0 12131352524 15140 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/tests/ 40755 0 0 0 12131352533 13664 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/utils/ 40755 0 0 0 12131352533 13662 5ustar 0 0 dnsjava-2.1.5/org/xbill/DNS/windows/ 40755 0 0 0 12131352524 14214 5ustar 0 0 dnsjava-2.1.5/tests/ 40755 0 0 0 12131352523 11336 5ustar 0 0 dnsjava-2.1.5/tests/org/ 40755 0 0 0 12131352523 12125 5ustar 0 0 dnsjava-2.1.5/tests/org/xbill/ 40755 0 0 0 12131352523 13237 5ustar 0 0 dnsjava-2.1.5/tests/org/xbill/DNS/ 40755 0 0 0 12131352523 13663 5ustar 0 0 dnsjava-2.1.5/tests/org/xbill/DNS/utils/ 40755 0 0 0 12131352523 15023 5ustar 0 0 dnsjava-2.1.5/Changelog100644 0 0 137266 12131352005 12155 0ustar 0 0 04/10/2013 - 2.1.5 released 03/18/2013 - Fix DS generation to canonicalize the DNSKEY owner name. (patch from Ingo Bauersachs ) 02/19/2013 - Add Name.canonicalize() and Name.toString() variant for omitting the final dot in an absolute name. 01/04/2013 - 2.1.4 released 10/25/2012 - Fix the Message constructor to not raise a ClassCastException when a SIG or TSIG record is seen in the question section. (patch from Klaus Malorny ) 9/4/2012 - Add support for RFC 6605: Elliptic Curve Digital Signature Algorithm (DSA) for DNSSEC. (original patch from Marcos Sanz , with some local modifications) 8/31/2012 - Add support for the TLSA record type. - Pass hostnames to InetAddress.getByAddress where possible. (patch from Ingo Bauersachs ) 11/15/2011 - Fix the ZoneTransferIn object to properly report AXFRs; this was broken by the changes in 2.1.3. (reported by Thomas Corte ) 11/3/2011 - Update DSRecord constructor from DNSKEYRecord to generate the correct digest. (patch from Marty Kube ) - Also update the signature of the DSRecord constructor from DNSKEYRecord to not take the key's footprint as a parameter, as it can be derived from the key. 10/24/2011 - 2.1.3 released 10/17/2011 - Add a callback interface to ZoneTransferIn. (based on a patch from Nick Sayer ) 10/10/2011 - An exception could be thrown when attempting to look up data in the cache for type ANY when there were only previously cached NOERROR/NODATA responses for that name. (reported by Niel de Wet ) 7/24/2011 - 2.1.2 released 6/9/2011 - TypeBitmap.toString() failed if no bits were set. (patch from Jeffrey Damick ) 5/24/2011 - TSIG.fromString() didn't handle base64-encoded secrets with / characters. (reported by Sten ) 5/12/2011 - Support verifying truncated TSIG signatures, as specified in RFC 4635. 5/10/2011 - Refactor EDNS Option support to allow for custom type implementations, and add support for the Client Subnet option. (based on a patch from Ming Zhou ) - Add support for the NSID EDNS option. 4/20/2011 - Add missing support for the HMAC-SHA224, HMA-SHA384, and HMAC-SHA384 TSIG algorithms. (patch from Thomas Corte ) 3/9/2011 - Add support for using alternate JCA providers when generating DNSSEC signatures (patch from Jeffrey Damick ) 2/9/2011 - 2.1.1 released 2/3/2011 - Add the ability to set ndots on Lookup objects, and parse the ndots option from a resolv.conf file (patch from Oleg Tsvinev ). 2/3/2011 - The 'file' command in the 'update' program didn't work correctly. (reported by Olafur Gudmundsson ) 9/15/2010 - Change the Android name server detection mechanism to avoid false positives. (patch from Ulf Dittmer) 9/9/2010 - The IXFR code didn't do serial number arithmetic correctly, and would fail if the serial number wrapped. (patch from Alexis MacFarlane ) 9/7/2010 - 2.1.0 released 8/17/2010 - When rendering a message, if records from the additional section did not fit, the header counts were not properly updated. (patch from Klaus Malorny ) 7/22/2010 - Fix LOC record parsing to allow negative altitudes. (based on a patch from William Kocik ) 7/21/2010 - The changes to TSIG verification in 2.0.6 didn't work correctly for stream verification; specifically, the state was only set on the first Message in the stream. (reported by William Kocik ) 5/12/2010 - Add support for determining resolver configuration on Japanese Windows. (translation and original patch from Brett Wooldridge ) 5/6/2010 - Add support for building an OSGi bundle (patch from Markus Alexander Kuppe ). 5/2/2010 - Rewrite DNSSEC support. 4/15/2010 - Fix a hang that could occur when using the dnsjava service provider on Windows (initial patch from ). 11/21/2009 - 2.0.8 released 11/10/2009 - Fix the conversion of NSEC/NSEC3 bitmaps into wire format. (Klaus Malorny , also reported by Tom <808131@gmail.com>). 10/01/2009 - Properly initialize the Date objects used in RRSIG (and other) records, so that any unused fields are cleared. (Klaus Malorny ) 9/25/2009 - 2.0.7 released - Add support for detecting the configured nameservers on the Android platform. (patch from Arnt Gulbrandsen ) 9/16/2009 - When determining the nameservers to use, if the sun.net.dns.ResolverConfiguration class returns an empty list, ignore it. (based on an anonymous patch). - Make the Name, Record (and all subclasses), RRset, and Zone classes implement Serializable. (based on a patch from Patrick ) 9/15/2009 - Add a constant for the REVOKE DNSKEY flag. (patch from Wolfgang Nagele ) - ReverseMap.fromAddress(String) should support both IPv4 and IPv6 addresses. (reported by Stephan Fuhrmann ) 8/08/2009 - The escaping code for text strings should not escape semicolons. 6/23/2009 - DNSSEC signature validation incorrectly used the TTL of the records being verified, not the original TTL from the RRSIG record, which caused failures when verifying records returned by a caching server. (reported by Samuel Benz ) 6/15/2009 - Change the ResolverConfig.refresh() method to only synchronize the assignment to currentConfig, not the code which determines the new configuration. 6/12/2009 - The TSIG verification routines (TSIG.verify, TSIG.StreamVerifier.verify() now update the Message object with the status of the verification in addition to returning the status. 6/03/2009 - The lists of servers and searchlist entries in ResolverConfig should not be static. (Isabelle Dalmasso ) 5/28/2009 - The canonical form of an NSEC record was incorrectly computed - the next name should not have its case changed. (David Blacka ) - Add support for NSEC3, NSEC3PARAM, and DLV records. (based on a patch from David Blacka ) 9/17/2008 - Fix LOC record rounding. (reported by Klaus Malorny ) 8/22/2008 - Type 4 NXDOMAIN responses were incorrectly cached as referrals. (reported by Luis Silva ) 8/06/2008 - Randomize the UDP source ports for outgoing queries. (based on a patch from Derek Morr ) 4/25/2008 - Add support for the DHCID record. 4/18/2008 - The prior change to allow creating Zones from AXFR-style IXFR ZoneTransferIn responses didn't work. - Update the service provider to work with Java 1.6 and earlier versions. (patch from ) 2/19/2008 - The Zone.removeRecord() method threw an exception if there were no other records in the same RRset. (reported by Yoyo Chen ) - Parsing and formatting LOC records should not depend on the current locale. (reported by Klaus Malorny ) 1/31/2008 - When converting messages to wire format, don't include name compression pointers greater than 2^14 - 1. (reported by Carole Gill ) 1/24/2008 - 2.0.6 released 1/22/2008 - Fix an off-by-2 error that could cause an infinite loop when parsing a Name with a self-referential compression pointer. (reported by Carole Gill ) - Raise an exception when an invalid label type is seen in a wire format name. The previous behavior would incorrectly parse invalid names, and could lead to infinite loops. (reported by Carole Gill ) 8/28/2007 - 2.0.5 released - Add the ZoneTransferIn.setLocalAddress() method. (based on a patch from ) - Build jar file with -source and -target options to provide compatibility with older Java releases (that is, revert to pre-2.0.4 behavior). (reported by Stefano Bagnara ) 8/26/2007 - 2.0.4 released - Update SPI code to work with java 6. - Fix an argument parsing bug in the dig program, where failure to specify both type and class would cause the specified server to be ignored. (reported by Stefano Bagnara ) 6/12/2007 - The SPFRecord constructors incorrectly created records whose internal type field was TXT, not SPF. (reported by Stefano Bagnara ) 3/7/2007 - Message.getQuestion() incorrectly handled the case where the question section was represented by an empty list. (reported by Karl Auer ) 2/15/2007 - Properly obey timeouts in TCPClient code when the message is read in multiple chunks. (based on a patch from Francesco Vivoli ) 12/4/2006 - A cache lookup for a record would incorrectly return a delegation when records for both the queried type and NS were present. (reported by yosukear ) 11/28/2006 - 2.0.3 released 11/27/2006 - The Zone.fromXFR() method should be able to create zones from AXFR-style IXFR responses. (Bill Kuker ) 10/25/2006 - Make the routines that convert between the DNS and standard Java representations of DSA signatures public. (suggested by Klaus Malorny ) 8/3/2006 - Add a TSIG constructor that takes an algorithm as a String. - Add support to TSIG.fromString() for specifying an algorithm. 7/30/2006 - When converting a PublicKey to a DNS record, allow the algorithm to be specified, as RSA keys can be either of the RSA-SHA1 or RSA-MD5 algorithms (based on a patch from Eric ) - When converting a PublicKey to a DNS record, allow the type (KEY or DNSKEY) to be specified. - Update the DNSSECVerifier code to use DNSKEY records, not KEY records. 7/30/2006 - Added support for parsing the output of ipconfig in French . (Frederic Bazin ) 7/30/2006 - If both "search" and "domain" lines are present in a resolv.conf file, the domain line should be ignored. 7/26/2006 - Add support for the SPF record type. 7/21/2006 - DNSSEC.digestRRset could digest records in the wrong order. (reported by David Blacka and Mahendra Jain ) 6/26/2006 - 2.0.2 released. 6/22/2006 - Add support for the IPSECKEY record type. 5/18/2006 - The result of a Lookup that involves a CNAME should include the queried name as one of the aliases, not the CNAME target. (Jon Lachelt ) 2/13/2006 - Loading zones containing RRsets with multiple records didn't work. (reported by Olafur Gudmundsson" ) 1/24/2006 - AXFR requests could leak file descriptors if the connection failed. (Can Bican ) 11/30/2005 - Add a Resolver.setTimeout(int secs, int msecs) method. (requested by Dmitry Isakbayev) ) 11/30/2005 - 2.0.1 released. 11/11/2005 - The InetAddresses returned by Address.getByName() should have their hostname copied from the input parameter. (reported by Praveen Tammana ) 11/7/2005 - Update remaining DNSSEC code to be compliant with the current spec. 11/6/2005 - Add a Resolver.setEDNS(int level, int payloadSize, int flags, List options) method, to allow a Resolver to automatically set the DO flag, as well as future EDNS features. (requested by Rick Wesson ) 10/25/2005 - The Master(InputStream in, Name origin) constructor should not always fail. - Correctly handle the case where reading a Master from an InputStream would throw a NullPointerException if a $INCLUDE file wasn't found. (reported by Lars Petrus ) 8/22/2005 - Add Address.getByAddress(String) and Address.getByAddress(String, family). 7/21/2005 - Zone.findExactMatch() would throw a NullPointerException if the name didn't exist. (reported by Hans Zandbelt ) 7/19/2005 - Add support for binding clients to local addresses when using a SimpleResolver. Also add the -b option to the dig program to test this. (based on a patch by Bruno Dillenseger) 7/5/2005 - Add support to ResolverConfig for using the undocumented sun.net.dns.ResolverConfiguration class to determine the list of nameservers and search path; make this the default when it works (Yannick Meudal ). 6/16/2005 - The inbound zone transfer code failed to treat port 0 as the default as it claimed to. (Bill Kuker ) 6/15/2005 - When doing a zone transfer with a SimpleResolver object, the timeout was not properly obeyed. (reported by Peter Bryant ) 6/5/2005 - Explictly register record type implementations instead of using reflection; this should prevent hard to diagnose problems resulting from partial compilation. 5/31/2005 - 2.0.0 released. 5/16/2005 - Fix the code to deal with TTL 0 data in the Cache. 5/15/2005 - Add unit tests for many classes. The unit tests are located in the tests directory, which mirrors the org.xbill.DNS hierarchy. (Matt Rutherford ) 5/7/2005 - Fix several problems with empty names. (Matt Rutherford ) 4/23/2005 - As per RFC 2181, the maximum allowed TTL value is 0x7FFFFFFF. Change TTL.parseTTL() to reflect this by silently clamping larger 32 bit values. 4/22/2005 - Attempting to get the name/type/class/ttl of an empty RRset throws an exception. 4/21/2005 - Remove RRset.getSecurity()/.setSecurity(). 4/16/2005 - Change the internal representation of empty records (that is, records in the question section of a message or meta-records used in dynamic update). - Minor cleanups to the Mnemonic class. (Matt Rutherford ) 4/3/2005 - Change the Cache from being periodically cleaned to being size-bounded. (based on a patch from several years ago from Joseph Shraibman ). - Remove the FindServer class. - Added a Name Service Provider interface (dns,dnsjava). (based on code from Paul Cowan ) 4/1/2005 - Use java.nio classes for sockets internally, which provide a number of improvements, most visibly improved timeouts. - Remove deprecated dns class. - Simplify TSIG initialization; remove functions that should have never existed. - Remove Cache.setVerifier() and Cache.setSecurePolicy(). There should be a way of enabling DNSSEC, but the existing code doesn't work. - Change the Zone constructors/factory methods to be consistent. 3/29/2005 - Use java.net.InetAddress for IPv6 addresses rather than a custom class. 3/20/2005 - Fix several bugs in ResolverConfig on Windows. (Brian McBarron ) 3/15/2005 - Clean up the synchronization in the RRset class (reported by Daniel Jensen ) 3/8/2005 - Support the BIND misfeature of loading zones with no explicit TTL by using the SOA minimum field. 3/7/2005 - 1.6.6 released. 3/6/2005 - $GENERATE statements should obey the start field. 3/1/2005 - Add support for HMAC-SHA1 and HMAC-SHA256 TSIG algorithms. (suggested by Olafur Gudmundsson ) 2/8/2005 - Add infrastructure for parsing the output of ipconfig on non-English version of windows, and add support for German and Polish. (based on a patch by Piotr Kochanski) 2/7/2005 - Add Options.refresh() (based on a patch from Th Kuhne) - Add the ResolverConfig class, which is largely based on the FindServer class, except that it's not all static methods. Add the ability to refresh the current ResolverConfig, and make FindServer use ResolverConfig. - Add Lookup.refreshDefault (based on a patch from Th Kuhne) - Truncated messages aren't guaranteed to parse properly, so shouldn't throw exceptions. (reported by Caleb Richardson ) - Work around a TCP bug in whatever broken nameserver Enom is using. (reported by Caleb Richardson ) 2/4/2005 - 1.6.5 released. - Records of an unknown type and length 0 weren't handled properly. (reported by Olafur Gudmundsson ) - Fixed a bug in $INCLUDE handling. (Christian Sepulveda ) 2/3/2005 - The Lookup.run() method should be usable more than once on a Lookup object. (reported by Joseph Shraibman ) 10/31/2004 - Add partial IPv6 support to the ReverseMap class. (based on a patch from Th Kuhne) 7/7/2004 - Implement the $GENERATE master file directive. 6/28/2004 - Canonicalizing a name created with the Name(Name src, int n) constructor caused an exception. (based on a patch from Nigel Tamplin ) - Concatenating names caused an exception when the prefix was created with the Name(Name src, int n) constructor. (reported by Nigel Tamplin ) 6/22/2004 - The DNSSEC digesting code shouldn't throw ClassCastExceptions. (reported by Mike StJohns ) - The label count in a generated SIG/RRSIG record was off by one. (Mike StJohns ) 6/8/2004 - Rcode 4 is NOTIMP, not NOTIMPL. 6/5/2004 - Fixes to LOCRecord. 6/3/2004 - 1.6.4 released. 5/26/2004 - Properly handle text mnemonics in KEY records. - Add support for the APL record type. 5/25/2004 - Fix a bug where parsing the text format of an NSEC record incorrectly parsed one token too many. 5/18/2004 - 1.6.3 released. 5/11/2004 - Don't store the number of labels in a Name in a byte, as the maximum value (128) cannot be stored in a byte. 5/9/2004 - Add support for options within an OPTRecord (loosely based on a patch from Madhu Siddalingaiah ) 4/18/2004 - Add support for the SSHFP record type. - Fix a bug in the zone code which would cause record lookups to fail. 4/10/2004 - When parsing paster files, handle the fact that class and ttl may be in either order. 4/8/2004 - The opcode field in the DNS header was incorrectly parsed; this would affect messages with opcodes other than QUERY. (Madhu Siddalingaiah ) 3/20/2004 - 1.6.2 released. - Lookups could return "referral" instead of "host not found" in some cases. 3/18/2004 - Fix NullPointerExceptions caused by bad empty Record handling. (reported by Dharmveer Jain ) 3/16/2004 - 1.6.1 released. - When loading master files with $INCLUDE statements, the included files should be opened relative to the current directory, not the directory of the parent file. 3/12/2004 - Make it possible to use a Tokenizer without leaving files open. 3/4/2004 - 3/12/2004 - Add support for more record types (AFSDB, GPOS, ISDN, MB, MD, MF, MG, MINFO, MR, NSAP, NSAP-PTR, NULL, PX, RT, WKS, X25). 3/3/2004 - Cached NXDOMAINs were ignored, which caused extra queries to be sent (reported by Damon Hart-Davis ). 2/25/2004 - Attempting to load a zone without specifying an origin failed. 2/24/2004 - 1.5.2 released. 2/3/2004 - Message.isSigned() should return true if we signed the Message with a TSIG. (reported by Shobana Sampath ) - Implement NSEC, DNSKEY, and RRSIG record types. (loosely based on a patch from David Blacka ). - Change the representations of sections, rcodes, opcodes, flags, and credibility to int. 1/28/2004 - Attempt to better deal with OutOfMemoryErrors when creating threads during the resolution process. (reported by Joseph Shraibman ) 1/27/2004 - Change the representation of a TSIG error from a byte to an int. - Improve error messages from failed Lookups; treat SERVFAIL as a temporary failure, not an unrecoverable error. (Joseph Shraibman ) 1/16/2004 - The master file reader should propagate TTLs through $INCLUDE statements. (David Blacka ) 1/12/2004 - Add a MANIFEST to the jar file containing implementation name and version. (Harel Efraim ) 1/11/2004 - Fix a couple minor bugs found by FindBugs (http://www.cs.umd.edu/~pugh/java/bugs/) 1/8/2004 - 1.5.1 released. - LOC records weren't parsed correctly. (reported by Harel Efraim ) - Lines with only whitespace in master files should be ignored. 12/15/2003 - TTLs weren't handled properly in the master file parser. (Jack Tavares ) 12/11/2003 - 1.5.0 released. 12/8/2003 - Change to the BSD license. - Replace the deprecated Name(String) and Name(String, Name) constructors with new versions that properly return exceptions. 12/6/2003 - Make the J2SE javadoc link a property in build.xml. (Ville Skyttä) 11/24/2003 - Lookup should check that the name, type, and class in the question section of a response match that of the query. - SimpleResolver should check that the message id of the response is the same as the message id of the query. On a sufficiently busy client, sockets can be reused fast enough that late responses can come in, and should be ignored. (seen by Joseph Shraibman ) 11/17/2003 - The Lookup code didn't handle CNAMEs pointing at nonexistant names. (reported by Joseph Shraibman ) 11/11/2003 - Store a weak reference to the Cache in the CacheCleaner thread, and kill the thread when the Cache is finalized. (suggested by Joseph Shraibman ) - When a Lookup uses a null cache, the temporary cache it creates should not have a CacheCleaner thread. (based on a suggestion by Joseph Shraibman ) 10/31/2003 - Record.hashCode() didn't return consistent hash codes, and didn't ignore the TTL (which it should, and which Record.equals() does). 10/27/2003 - DNS TTLs and other 32 bit unsigned values are now represented as longs, not ints. This is an API change, but allows the full range to be used. - Add the Serial class for serial arithmetic. 9/30/2003 - 1.4.3 released. - Fix a bit of code that required Java 1.4. 9/29/2003 - 1.4.2 released. 9/26/2003 - A Lookup shouldn't die when receiving a referral response; it should return an error. (reported by Elinor Chang ) - A Lookup should distinguish between timeouts and other network errors. - When parsing IP addresses from text format, treat the presence of a leading zero on an octet as an error. It's unclear whether it would be treated as decimal or octal, which means it should be fixed. (reported by Marcos Sanz/Denic ) 9/17/2003 - Fix an off-by-one error in the Name code; labels of length 63 were not accepted (patch from David Blacka ) 9/2/2003 - 1.4.1 released. 9/1/2003 - The Update.delete(Record) method needs to reset the TTL of the cloned record to 0. (reported by Edwin R. Rivera ) 8/23/2003 - Change Record.fromString() to expect an EOL/EOF token at the end of the string, so that extraneous tokens can be detected. The master file parser was updated to this change. (noticed by Bob Halley ) 8/22/2003 - Changing TXTRecord.getStrings() from returning a List of Strings to a List of byte []'s was a bad idea. Change it back, and add TXTRecord.getStringsAsByteArrays(). (reported by Blake Ramsdell ) 8/21/2003 - 1.4.0 released. 8/20/2003 - Add the ReverseMap class, which contains functions to construct names to be used in reverse map zones. 8/13/2003 - When looking up a one label unqualified name which fails to match all searchlist entries, don't append the root label and try again. This is recommended by RFC 1536, section 6: "Only if the name, so generated, returns an NXDOMAIN is the original name tried as a Fully Qualified Domain Name. And only if it contains at least one period." 7/18/2003 - Remove lots of unused imports. (Jared Richardson ) 7/14/2003 - Fix a long-existing bug where empty records (in update messages) were incorrectly handled (reported by Kevin C Miller 6/22/2003 - DNS types and classes are now represented as ints, not shorts. This is an API change, but allows the full type/class range to be used. 6/18/2003 - Quoted strings didn't handle \ddd escapes. 6/17/2003 - Fix an ArrayIndexOutofBoundsException triggered by load balancing in the ExtendedResolver. (reported by Norbert Desautels ) 6/1/2003 - Add the Name.relativize() method to convert an absolute name to a name relative to a specified origin. - Add the Update class, which contains helper routines used to construct dynamic update messages. 5/28/2003 - Replace org.xbill.DNS.utils.MyStringTokenizer with org.xbill.DNS.Tokenizer, which is a far more robust and correct DNS tokenizer. Convert everything to use it. - Fix text format of TXT, NAPTR, and HINFO records. 5/28/2003 - When constructing a record, check that all names are absolute. 5/27/2003 - 1.3.3 released. 4/26/2003 - The master file parser should accept BIND format TTLs. 4/10/2003 - The Inet6Address class incorrectly parsed some addresses. (reported by steve weiland ) 4/7/2003 - Records were not sorted properly (reported by Joseph K Shraibman ) 4/2/2003 - Fix off-by-one error in Name.compareTo (David Blacka) 3/30/2003 - Add the ZoneTransferIn class, which performs incoming AXFR/IXFR - Make TSIG verification of multiple-message responses reentrant. - Fix incorrect string quoting. - Make records print on a single line by default; add the 'multiline' option to use the more verbose format. 3/17/2003 - Make the routine that converts an IP address from a string more efficient and correct. (based on a patch by Sean O'Neil ) 2/12/2003 - Fix an infinite loop that could occur when processing a response containing a CNAME loop and an rcode of NOERROR. (reported by Sean O'Neil ) 1/25/2003 - Cleanup and improvements to the ExtendedResolver class. 1/23/2003 - Add the setMaxCache() method to the Cache class. - Check for non-absolute names when creating Records. 1/21/2003 - 1.3.2 released. 1/20/2003 - Certain responses with CNAMEs weren't being properly cached. (reported by Sean O'Neil ) - Add a 'compile' target to build.xml, and make the 'all' target both compile and build the jar file. (Jon Scott Stevens ) 12/22/2002 - Check for SecurityExceptions in the Options static initializer; this was preventing the use of dnsjava in an unsigned applet. (reported by Peter Westerink ). 12/15/2002 - Converting some types of records (TXT, for example) to wire format could throw an IndexOutOfBoundsException. - TSIG signed UDP queries weren't properly verified by jnamed. - Add a method to render a Message with a specified maximum size - this method will properly truncate large responses and apply TSIG signatures. 12/14/2002 - Move additional data processing to the Record class from jnamed; make jnamed use it, as well as the caching code. 12/9/2002 - Add the Lookup class, which is what the dns class should have been, and make the lookup sample program use it. 12/9/2002 - When caching a message, a response object can be constructed immediately. 12/4/2002 - 1.3.1 released. 12/3/2002 - If a subresolver of an ExtendedResolver exited by throwing a RuntimeException, the ExtendedResolver would throw a ClassCastException. It should rethrow the RuntimeException. 12/3/2002 - The Name code didn't handle names with non-printable characters. (found by Serge Sozonoff ) 11/28/2002 - Fix a potential deadlock in the WorkerThread class. (found by Serge Sozonoff ) 11/26/2002 - Fix a bug where looking up names without trailing dots would fail if there was no searchlist. 10/31/2002 - Fix a bug in searchlist processing on Windows. 10/20/2002 - Record.toWire() and Record.toWireCanonical() do not need to be declared as throwing IOException, since there's no legitimate reason for them to throw one. 10/18/2002 - Race condition fixes and memory usage improvements to the NameSet class, used by Cache and Zone. 10/16/2002 - 1.3.0 released. 10/11/2002 - Add Name.getLabel() 10/10/2002 - When cleaning the cache, catch ConcurrentModificationExceptions. 10/8/2002 - Cleanups to Cache.addMessage() and the Credibility code. 10/7/2002 - Fix problems with search path handling in the dns class. - Possible race condition fixes to the Cache code. 10/6/2002 - Fix minor bugs in Name code (Bob Halley ) 10/1/2002 - Memory usage and speed improvements to the TypeMap class. 9/25/2002 - Add the verbosecache option. - Significant memory usage improvements to the Name class. 9/23/2002 - Memory usage improvements to the ARecord class. 9/16/2002 - Support for NetWare's sys:/etc/resolv.cfg file. (Scott Villinski ) 9/5/2002 - When looking for an rdataset in a zone or cache, seeing a CNAME above the name is not an error. (reported by Andrew Houghton ) 8/31/2002 - Changed the code that dynamically loads record types; hopefully this will solve some of the mysterious problems that I think are related to non-English versions of Windows. - Clean up the Name code. 8/28/2002 - Remove support for bitstring labels, since they're now deprecated. 8/16/2002 - Address.isDottedQuad didn't check to see if the input String contained characters after an IP address. (Marcos Sanz ) 8/11/2002 - Querying for a nonexistant name with exactly one label didn't return. 8/10/2002 - Add Ant build script (Blake Ramsdell ) 8/6/2002 - The AAAARecord constructor was broken. - The Record class now implements Comparable. 6/22/2002 - Significant speed improvements in the Record class and its subclasses. 6/20/2002 - Add Zone.removeRecord() (based on code from Adam Cassar ) - Add Zone.toMasterFile() (based on code from Adam Cassar) - Performance enhancements to the Name object. - Add the "-t type" option to the lookup program. 6/16/2002 - Update lots of code to use Collections instead of JDK 1.1 Vectors & Hashtables. 5/28/2002 - fix some limitations of name parsing. (reported by Tasos Kotsikonas ) 5/4/2002 - added the 'sleep' and 'date' commands to the update client. (Olafur Gudmundsson ) 4/29/2002 - 1.2.4 released 4/25/2002 - Add a constructor for building a zone from an array of records. (based on code from Adam Cassar ) 4/24/2002 - Reduce the memory usage of the RRset class. - Add a new factory method for creating a Record from a String, rather than a pre-tokenized String. - Reduce the memory usage of the ARecord class. 4/23/2002 - Fix potential race conditions in the RRset class. (David Esposito ) - Fix potential race condition in the WorkerThread class when two threads complete their run methods nearly simultaneously. (David Esposito) - Add a new factory method for creating a Record, where the length of the rdata is not explicitly specified, but inferred from data.length. 4/22/2002 - Improve name decompression by not requiring a decompression context. 3/27/2002 - Add support for the Delegation Signer (DS) record. (David Blacka) 3/22/2002 - Record.equals() did not properly canonicalize names. - Record.equals() should ignore the TTL. 3/19/2002 - When a compressed name is parsed, it should be added to the compression table, so that future pointers to that name work. (reported by Blake Ramsdell ) 3/14/2002 - In jnamed, AXFR responses didn't have the message ID or flags set correctly. - jnamed failed to respond to messages signed with unknown keys. - jnamed did not sign responses to signed AXFR queries. 1/21/2002 - Handle empty domain statements in /etc/resolv.conf. (reported by Blake Ramsdell ) 1/1/2002 - Minor performance enhancments (suggested by Christopher Brind) 10/14/2001 - Add support for the DNSSEC RSA-SHA1 algorithm (David Blacka) - Add rdataToWireCanonical() (David Blacka) 9/27/2001 - jnamed can now listen on specific addresses, with the "address" keyword in the config file. 9/23/2001 - 1.2.3 released 9/14/2001 - Creating an Enumeration of an empty RRset caused an infinite loop. (David Blacka ) 8/9/2001 - nsupdate compatibility and a bug fix to the update client. (patch from David Sward ) 8/8/2001 - The results of ANY queries were not properly cached. 8/4/2001 - 1.2.2 released 7/22/2001 - Added the -q (print query) option to dig. - Bitstring labels are now canonicalized. - jnamed implements the DO (DNSSEC OK) bit. 7/19/2001 - A string tokenizer bug caused TXT records with one string to be incorrectly parsed. (David Blacka) - Added Name.getLabelString(). 7/17/2001 - Started implementing Name.compareTo(). (loosely based on a patch from David Blacka). 7/16/2001 - Converting a AAAA record to wire format was broken. (David Blacka) - Inet6Address did not properly reject addresses that are too long or too short, and also didn't properly handle addresses with one number after a double colon. - Key footprints were computed incorrectly. Also cache footprints in the KEYRecord to avoid recomputation. (David Blacka) - Added the -d flag to dig, which sets the DNSSEC OK bit. 7/13/2001 - KEY flags were incorrect (David Blacka ) - Add routines for parsing a master file from a non-file input source (David Blacka) - base64.formatString() didn't work if lineLength wasn't 64. (David Blacka) - Add support for the DNSSEC OK extended flag (David Blacka) - Allow the caller of a Resolver to add an OPT record to a query. (original patch from David Blacka). 6/30/2001 - 1.2.1 released 5/23/2001 - Automatically determining name servers didn't work on Windows 2000. 4/13/2001 - Converting a Name to a String does proper character escaping. 4/7/2001 - 1.2.0 released 3/21/2001 - Only cache relevant data from answers. - Cache negative responses more correctly. 3/14/2001 - Handle TTLs greater than 2^31. 3/10/2001 - Performance and memory improvements to the Name object. 3/7/2001 - Performance improvements to TypeMap (used by Zone and Cache). 3/6/2001 - Lots of standards compliance related fixes. 3/4/2001 - Improved class handling. - A few minor CNAME related fixes. 2/27/2001 - Referrals weren't returned correctly from jnamed. 1/15/2001 - Fix some signed/unsigned printing issues for KEY records (Pasi Eronen ) - Add routines to generate SIG(0) message signatures (Pasi Eronen ) 1/8/2001 - Add support for unknown RR types & classes. 12/3/2000 - The target in an MX record can be compressed. 11/18/2000 - Add jnamed.conf example to USAGE 8/27/2000 - 1.1.6 released - The high level api wasn't properly initialized. (Christopher Fitch ) - Added a routine to build a SIG record based on the results of a DSA signature (Pasi Eronen ) 8/13/2000 - Added 'clear' command to update client - Removed some deprecated code 8/8/2000 - Invalid binary labels were not always rejected - SRV initialization didn't work (reported by Chuck Santos ) - jnamed failed if no Cache was specified - The Zone object didn't handle zones with no NS records. - Added support for the NAPTR record (Chuck Santos ) 7/17/2000 - 1.1.5 released - CERT records were printed with a negative keytag half the time. (reported by Jakob Schlyter ). - Printing a KEY record prints the key id. (Jakob Schlyter ) 6/25/2000 - A Cache now contains a thread that periodically removes expired data. 6/4/2000 - update client syntax enhancement - add/delete/require/prohibit/glue no longer require -r, -s, or -n. 6/3/2000 - update client supported prohibiting individial records, which is not supported by dynamic update. 5/21/2000 - Win2000 support 4/15/2000 - ExtendedResolver supports load balancing of servers. 4/2/2000 - Minor fix to base64 decoding 3/22/2000 - name comparison should always be case insensitive (Darrell Kindred 3/5/2000 - 1.1.4 released - added Cache.setMaxNCache(), which sets the maximum amount of time that a negative answer is cached. 2/10/2000 - update client: add show command, catch socket exception, don't send empty updates, assert tsig ok/failed/unsigned 2/8/2000 - 1.1.3 released - Added lookup program - FindServer finds a search path on Win95/WinNT 2/7/2000 - minor TKEY record updates - FindServer should work on Win95/WinNT - Added 'make jar' and a jar file 1/20/2000 - Added AAAA record 1/13/2000 - 1.1.2 released - dns.setResolver() clears the cache 11/7/1999 - Added EDNS support to update client 11/2/1999 - A key starting with ':' is parsed as hex 10/28/1999 - minor TKEY fixes and TSIG updates 10/5/1999 - misc. small fixes 10/4/1999 - Missed TKEY in the type map 9/26/1999 - Added TKEY record 9/25/1999 - Diffie-Hellman key updates 9/23/1999 - dns.server and dns.search are now comma-delimited strings 9/20/1999 - 1.1 released (finally) - Change OPT to type 41 and fixed related stuff - Change license to LGPL 9/16/1999 - Cache & DNSSEC bug fixes 9/9/1999 - A6 record support (and IPv6 addresses) 9/6/1999 - jnamed has limited support for SIG records 9/4/1999 - res.sendAXFR() is now obsolete, just use res.send() - jnamed (and Zone) support incoming AXFR - Zone handles wildcards that replace multiple labels 9/2/1999 - Bitstrings are now compatible with current BIND 9 - jnamed (and Zone) support outgoing AXFR - jnamed uses jnamed.conf by default, can specify port in config file, returns NOTIMPL on meta-queries other than AXFR and ANY. - DNSSEC can now verify records that came from wildcard expansion - SimpleResolver handles AXFR REFUSED - Lots of EDNS updates 9/1/1999 - More bitstring fixes. - Added RP record (from Tom Scola ) 8/29/1999 - More bitstring label stuff. I think they work now. _ DataByteInputStream cleanup. Should handle errors better now. 8/26/1999 - More verbose options - TSIG badtime bug & better reporting - Large TTL bug - MyStringTokenizer.setNoEscapeCharacter() 8/25/1999 - Imported DNSSEC code - New options: tsigfudge, verbosehmac, verbosemsg - Added utils.hexdump to print a formatted dump of bytes 8/24/1999 - More bitstring label support 8/23/1999 - All data now passes through the Cache. This should help with DNSSEC verification - Added basic DNSSEC verification - Fixes for handling data with TTL 0 - Started adding bitstring labels - Added support for DNAME records (no processing yet) 8/8/1999 - Started adding global options (Options class) 8/7/1999 - Type and Class ANY should work correctly now - jnamed and Zone handle wildcard records - Cache returns wildcard set if name is negatively cached - TTL can be converted into BIND format 8/6/1999 - Updates to KEYRecord - getFootprint() and renamed constants 8/2/1999 - 1.0.2 released - WorkerThread obscure race conditions fixed (patches provided by Tom May ) 8/1/1999 - Added getResolver/getCache to dns class - RRset now has deleteRR and is better synchronized - Cache now has flushName/flushSet - Resolver.sendAsync returns an Object instead of an int - Socket cleanup (patches provided by Tom May ) - WorkerThread's idle lifetime and max threads are now configurable - HMAC-MD5 logic bug 7/5/1999 - 1.01 released - fixed a hang with ExtendedResolver and Exceptions 6/30/1999 - dns search path should always include a . at the end. The only time this bug would show up is when querying for an unqualified top level name. 6/29/1999 - update now ignores '>' at the beginning of a line, to allow easier cut and paste from other update sessions. 6/24/1999 - Use an int instead of a short for the message section count. It would be nice if java had unsigned types, but since messages are also constructed from zone transfers, a larger value is useful. 6/23/1999 - AXFR TSIG bug fix 6/18/1999 - 1.0 released. Yay! - documentation updates - my birthday 6/15/1999 - Restructured update's help - Added 'assert serial' to update, fixes to query keyword - Added Record.fromWire from a byte array - Added LOC support 6/14/1999 - Updates to multiline parser 6/11/1999 - Added Message.newUpdate to simplify sending updates 6/10/1999 - Zone file parser now handles $INCLUDE - update now has a keyword 'zone', which sets the zone to be updated, if it's different than the origin - added constants for DNAME, A6, KX - added KX support, abstracted MX code to support KX also. 6/9/1999 - update should handle timeouts - AXFR parser should allow 1 record in the question section 6/7/1999 - Zone file parser now handles $TTL, and complains about invalid directives. - fixed a few parsing problems in update - fixed null key parsing and key flags handling 6/3/1999 - added author javadoc tags - added javadoc comments to Master. Again, not sure how I missed this before. 5/25/1999 - 0.9.5 released - fixed another null pointer in the cache 5/23/1999 - added javadoc comments to utils/MyStringTokenizer. Not sure how I missed this class before. - minor cleanups to string parsing in update 5/21/1999 - fixed comment processing in update - fixed case bug in Section handling 5/20/1999 - 0.9.4 released - fixed the same round-robin bug, hopefully correctly this time 5/17/1999 - 0.9.3 released 5/16/1999 - fixed a round-robin bug 5/14/1999 - 0.9.2 released - Resolver routines now return Exceptions instead of null. 5/13/1999 - split WorkerThread into WorkerThread and ResolveThread 4/25/1999 - moved files to org.xbill.DNS - Cache round-robins RRsets before handing them out - changed the way ExtendedResolver decides when to send queries - various reflection changes 4/21/1999 - minor WorkerThread fixes 4/19/1999 - 0.9.1 released - WorkerThreads should die after 15 minutes of idle time - Address.getByName/getAllByName handle dotted quad IP addresses 4/18/1999 - 0.9 released - Finished javadoc-ing classes in DNS.* - Server should work now - Zone/Cache response updates - Zone/Cache accesses should be more thread-safe 4/17/1999 - The Cache supports ANY queries - More javadoc-ed classes in DNS.* - implemented toWireCanonical for record types that need it - Message.toString should print better output for update messages 4/16/1999 - jnamed wasn't looking up non-ANY queries correctly in a zone - SimpleResolver should use TCP if query length is longer than UDP packet size - More javadoc-ed classes in DNS.* - MyStringTokenizer moved to DNS.utils 4/15/1999 - More javadoc-ed classes in DNS.* - Moved functions from DNS.IO to DNS.utils.base64 and DNS.Master - Implemented search path for dns.getRecords functions - 0.8.3 released - Restrict number of WorkerThreads to 10 - ExtendedResolver timer code fixes - ExtendedResolver race condition fix 4/14/1999 - ExtendedResolver reentrancy fixes - Names are marked as qualified/unqualified - FindServer looks for search path from -Ddns.search1, etc. and in /etc/resolv.conf 4/13/1999 - 0.8.2 released - More javadoc-ed classes in DNS.* - The message ID stuff from 4/10 broke TSIG, so it's gone - Changes to ExtendedResolver's handling of child Resolvers - Too many threads were being created - Threads should now have meaningful names 4/12/1999 - NameSet shouldn't be using wildcards, since it's not correct for a cache (a name could match a wildcard and return wildcard data before the cache learned about data for the name) - javadoc-ed DNS.utils.* and some of DNS.* - ExtendedResolver allows specifying Resolvers to use - SimpleResolver and ExtendedResolver share a thread pool - ExtendedResolver and FindServer bugfixes - Header bug that actually caused the 0.8.1 release fixed - bugfix release 0.8.1 released - Messages weren't being cloned properly - Resolver didn't handle a query to nowhere correctly 4/11/1999 - 0.8 released - Resolver is now an interface, implemented by SimpleResolver and ExtendedResolver. - added ExtendedResolver, which sends multiple queries to multiple resolvers. - jnamed rejects non-queries 4/10/1999 - added Message.newQuery() to make building queries easier - Record.fromWire verifies that the record length is correct - Resolver.sendAsync() now uses worker threads rather than starting a new thread each time. - Multiple servers can be found by setting the dns.server properties (or from /etc/resolv.conf). - Message/Header doesn't generate the message id until the message is sent or the id is queried for 4/9/1999 - added setTimeout to Resolver 4/8/1999 - fixed obscure md5 bug - made Resolver(null) and Resolver() equivalent 4/7/1999 - Added simple asynchronous interface to resolver 4/6/1999 - CERT and SIG bug fixes 4/5/1999 - data lookups should use class in addition to type - CERT record bug fix 4/4/1999 - 0.7 released - DNS.dns uses Cache - Added getAny* to DNS.dns - Cache can return information indicating partial success on lookup 4/3/1999 - Cache does negative caching - Cache follows CNAMEs when looking for cached data 4/2/1999 - dig now understands -x - added DNS.Address, a clone of InetAddress - Cache can now follow CNAME chains - Cache now expires records based on TTL and doesn't cache records with TTL = 0. 4/1/1999 - Made Cache and Zone extend NameSet - Created Master class to parse master files 3/31/1999 - Added first cut at Cache - Changes to RRset to make it more useful 3/30/1999 - 0.6 released - bug fixes to DataInputStream, jnamed - jnamed now takes config file - Added basic EDNS0 and TSIG support to jnamed - Added basic EDNS0 support and IgnoreTruncation flag to Resolver - jnamed can now return FORMERR 3/29/1999 - 0.5 released - update client: added "echo" and "log" keywords, "file" can now specify "-" for standard input (at the end of a config file, for example). - added support for BIND TTL format - switched from CountedDataOutputStream to DataByteOutputStream, which extends ByteArrayOutputStream. Same for Input. Should help performance and allow more flexibility. - minor server fix to authority section 3/28/1999 - 0.4 released - fixed compression bug where all pointers into rdata were 0 - server sends authority records (NS or SOA) - server now loads glue data separately from zone data, adds authority and additional data, and deals with truncation. - fixed a few Zone bugs - added signatures to RRset 3/27/1999 - 0.3 released - _res was set wrong, so the high level functions wouldn't work. - Minor additions to CountedData(Input|Output)Stream - Lots of DNSSEC stuff 3/26/1999 - moved constants out of dns class into other classes 3/25/1999 - 0.2 released - conversion from base64 sometimes added extra zeroes. - original record length was computed wrong, so tsigs didn't verify. - master file parser didn't deal with ; delimited comments - server now stores data in RRsets instead of individual RRs. - various server bug fixes. Still doesn't work too well. 3/23/1999: - 0.1 released dnsjava-2.1.5/LICENSE100644 0 0 2443 11644721376 11317 0ustar 0 0 Copyright (c) 1998-2011, Brian Wellington. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnsjava-2.1.5/Makefile100644 0 0 1315 12131352005 11724 0ustar 0 0 JAVAC = javac JFLAGS = -g JAR = jar cf SUNAPIDOC = http://java.sun.com/j2se/1.4/docs/api JAVADOC=javadoc -classpath . -d doc -windowtitle "dnsjava documentation" -link ${SUNAPIDOC} VERSION = 2.1.5 DNSSRC = org/xbill/DNS/*.java \ org/xbill/DNS/utils/*.java PROGSRC = *.java DNSCLASS = org/xbill/DNS/*.class \ org/xbill/DNS/utils/*.class PROGCLASS = *.class CLASSLIST = org.xbill.DNS org.xbill.DNS.utils JARFILE = dnsjava-${VERSION}.jar all: ${JAVAC} ${JFLAGS} ${PROGSRC} ${DNSSRC} jar: ${JAR} ${JARFILE} ${PROGCLASS} ${DNSCLASS} clean: rm -f ${PROGCLASS} ${DNSCLASS} ${JARFILE} doc docs: docsclean if test ! -d doc ; then mkdir doc ; fi ${JAVADOC} ${CLASSLIST} docclean docsclean: rm -rf doc/* dnsjava-2.1.5/README100644 0 0 11376 12131352005 11174 0ustar 0 0 dnsjava v2.0 http://www.dnsjava.org/ Author: Brian Wellington (bwelling@xbill.org) March 12, 2004 Overview: dnsjava is an implementation of DNS in Java. It supports all defined record types (including the DNSSEC types), and unknown types. It can be used for queries, zone transfers, and dynamic updates. It includes a cache which can be used by clients, and an authoritative only server. It supports TSIG authenticated messages, partial DNSSEC verification, and EDNS0. It is fully thread safe. It can be used to replace the native DNS support in Java. dnsjava was started as an excuse to learn Java. It was useful for testing new features in BIND without rewriting the C resolver. It was then cleaned up and extended in order to be used as a testing framework for DNS interoperability testing. The high level API and caching resolver were added to make it useful to a wider audience. The authoritative only server was added as proof of concept. Getting started: Run 'ant' from the toplevel directory to build dnsjava (a Makefile is also provided, but does not have all of the features of the ant script). JDK 1.4 or higher is required. To compile name service provider support (org.xbill.DNS.spi), run 'ant spi'. Replacing the standard Java DNS functionality: Beginning with Java 1.4, service providers can be loaded at runtime. To load the dnsjava service provider, build it as explained above and set the system property: sun.net.spi.nameservice.provider.1=dns,dnsjava This instructs the JVM to use the dnsjava service provide for DNS at the highest priority. Testing dnsjava: Matt Rutherford contributed a number of unit tests, which are in the tests subdirectory. The hierarchy under tests mirrors the org.xbill.DNS classes. To build the unit tests, run 'ant compile_tests', and to run then, run 'ant run_tests'. The tests require JUnit (http://www.junit.org) to be installed. Some high-level test programs are in org/xbill/DNS/tests. Limitations: There's no standard way to determine what the local nameserver or DNS search path is at runtime from within the JVM. dnsjava attempts several methods until one succeeds. - The properties 'dns.server' and 'dns.search' (comma delimited lists) are checked. The servers can either be IP addresses or hostnames (which are resolved using Java's built in DNS support). - The sun.net.dns.ResolverConfiguration class is queried. - On Unix, /etc/resolv.conf is parsed. - On Windows, ipconfig/winipcfg is called and its output parsed. This may fail for non-English versions on Windows. - As a last resort, "localhost" is used as the nameserver, and the search path is empty. The underlying platform must use an ASCII encoding of characters. This means that dnsjava will not work on OS/390, for example. Additional documentation: Javadoc documentation is provided in the doc/ subdirectory of binary distributions, and can be built with 'ant docs'. License: dnsjava is placed under the BSD license. Several files are also under additional licenses; see the individual files for details. Copyright (c) 1999-2005, Brian Wellington All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the dnsjava project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Final notes: - Thanks to Network Associates, Inc. for sponsoring some of the original dnsjava work in 1999-2000. - Thanks to Nominum, Inc. for sponsoring some work on dnsjava from 2000 to the present. dnsjava-2.1.5/USAGE100644 0 0 3515 10464463454 11101 0ustar 0 0 dnsjava v2.0 dnsjava provides several command line programs, which are documented here. For examples of API usage, see examples.html. - dig: A clone of dig (as distributed with BIND) dig @server [-x] name type [class] [-p port] [-k name/secret] [-t] \ [-i] [-e n] [-d] -x : reverse lookup, name must be a dotted quad -k : use TSIG transaction security -t : use TCP by default -i : ignore truncation errors -e n: Use EDNS level n (only 0 is defined) -d : Set the DNSSEC OK bit - update: A dynamic update client with some extra functionality. This can be used either interactively or by specifying a file containing commands to be executed. Running 'help' lists all other commands. update [file] - jnamed: A basic authoritative only (non-caching, non-recursive) server. It's not very good, but it's also a whole lot better than it used to be. The config file (jnamed.conf by default) supports the following directives: primary secondary cache key [algorithm] address port If no addresses are specified, jnamed will listen on all addresses, using a wildcard socket. If no ports are specified, jnamed will listen on port 53. The following is an example: primary internal /etc/namedb/internal.db secondary xbill.org 127.0.0.1 cache /etc/namedb/cache.db key xbill.org 1234 address 127.0.0.1 port 12345 To run: jnamed [config_file] jnamed should not be used for production, and should probably not be used for testing. If the above documentation is not enough, please do not ask for more, because it really should not be used. - lookup: A simple program that looks up records associated with names. If no type is specified, address lookups are done. lookup [-t type] name ... dnsjava-2.1.5/bnd.jar100644 0 0 2431024 12131352543 11622 0ustar 0 0 PKÛA‰;META-INF/MANIFEST.MFþÊ­WKsÛ6¾kFÿ£é!ÉP°*»™DׇtìLj·½ôÐÈÔ#þ÷îÅ—Mz#€Å‡}ïÇ¡åœÿÖI£gìG>.N¤ÇµPãÏ"~)̘ø5÷À•\¤üMt\ìFÆÀß r(_ãR;¼»ò>›œl·[n2Ü2¹EAcÓD܉ÈD¼‚)Ÿðl•ÍY.˜•éq>ºPŠ-¥Çb£½&5ó+éØ/·LX`%VÂðu°xì‚P""@$Ç´ñ(Èå,h¯ö¤eAEöÊ0·•:º-âø×|4Gýp~ýñòêÓÝzË‚@œñ‡=¹ï'>ùk:a¯.²Lû¨cþºòÇEìåFxcÞ\è„g*O¥æÕÙpðqëÛž'ÙE.Uץ˻;\÷ÈuÑ1RÆ¥2ª…ѽ¶¾‡î«/7€ú0Jè^lÄŽïÖŠgÂâ3.Âøñ6îQŽ í{7¹ßg@8Å)©Á—V¬akìÃqë zìÉZêât{óĬ‹ïÝqwb¹\ã8·Òïy[pFådõìÜd!+çß—\ZH®vx‡Î®ôFZ£×ùûezw5Æèµc…rŸ æ ÆV‰¯{ ŽŽUž\H‘+ˆž‰X™[‹ èq˜í èX‚ã~ç#&1}ݹD#è_ÓÉøZ8c0 %$˜BÓ·“Ó³é»÷ggï¦ÃÁÕ®/áœçX;³óÑc)qˆ3¾÷‚PSœGQ+ÝO No*±ס®â4³Õ·žnžtÍ,TEˆÓ¹ÓniÛ®¢R9ÄéÖBË#ÖL)G[TtG—TÉTµ× ö·Ówg˜F©6Ža¥Ü†XÉÌñ„K¯`þr[&Z(žƒÌ}âQŽ:$4÷—½–H¡LêzN6¶‡Ú=œ„ÎÆ3Ö7OXä)ϱ6 ”1yÖÀ3Jd£ 5(=šïyØù5BXÛH€SÇX¬êØí{h0ŠlåWa“>Ëè%nsUwõœ9Ôhû½ E×±÷¹–ž+‘klc6¢žÌZá±¹ör -?Ò¥½É›š×äÉ.~omÿ{´+IÁ?j =ŒŽpN:D§¸·£DÏt, 6àøêœù…8”b{›º¥Vd+?ª\F8àH¿NTƒñ½)œË`áŸ3\h 'oïɤk6âT©ÌBJ³”inE7âdbœ;_N˜ºW‹¸·ôDHÒ0äjKB†6§8;8¢j —&Û[™®p} ÃAÜÉù.†CuR’d8•v?# +êÇhÆâ¬eB'åÐcÞ°-fGÄBOÅ6Æ2‹©…kФW¡}‰_Î/¶ØoȆƒÏ–&-ôÍ8 Êì«vKÝ[h4ª#&2%v[/Ixd´õþ¼B.Ñ€)³¸ƒÜäMÅ\‘©¦:î¬Å4_¯ ªÕVÅîÊÎV“,;R3j2éÂû…>:—Sæ|„}Ô¸‡}»¶^Ê:ïð"—1D ?”g™ÉòìÐ ‹ W“¹Ç¼ ©^z”pЩ_¼y€Ê}…ŸSÐ`©OÔnSg©QPD£dlÆ«Om=”RòDmðbÃ#RÝ5áïG¯áy‘ÖV áàín ΑHÔc+l»™ð«c]˜ø÷ÛëÆoM).¿ž\šN>èúð×IEùÙÝÅíuïÅJþ¦ü)«H²À4i|IŠÔÈPú¨®Þí× b«¡Ô”WÂsdñ:Uà‰{›c¢ê›1b ?üÝ$*ÿ %]‡ƒ&A ]w¾w*OÿyÊOù$:CŽ3y¿I–ŠŸuyÄúçÈSxˆs€|8þV,t¯jºGœ'õ}<ÀQÃ|‰ýÏáQ1ý8ÔjËy÷}h¤Ï‘^ÚŸ­IPwû,!Q——ì«qÚ‹HÍøÑ ¬ó¤g ç%ñ È䉀L‰(ÿ§W´´ Gv=av.@tl>Yÿ)wO–¿û8ûæˆó²2*úa‡ƒáà_PKÀ;²÷›PK’|“7LICENSEÝZmoÇþ^ ÿaK ¨œe'MÚÆù¤XrÂÖ¡ I®ù°¼Û#·>Þ2»w¢Ø_ßgf_¤eýV!h­Óíîì¼<óÌÌ}ñ;ñ©ŸË­¬×J¼Ñµêúâ©ÿPÖiÓ‹¯.^Tâo²¥Ý‹¯^¼øúã«Öð}ùüùn·»|Ð…±«ç?Ì=ÿâw¼ôþúö§;q¹¸¯nWóûùÍâN¼¾¹ïî®+q{ýööæêÝ+z\ñ[Wó»ûÛù÷ïèIØâË q¥ZÝ뺋ð?³p³™pkÙub£d/ÜxPvã„ìQ›¾ñëDk¬ª„U[kš±¦ÇUÜ‹^n´¬^Žô!hèTÕˆå^Ü©Úïò%°f\­Å·Â´øEã=SÕÇ¢{$[m¶{«WëA˜]¯¬€TXª‡½ã°6Vÿ›OŒZ2¬å pîÊJ¬ìWüRÐÅDµ’¸æÝä{º%_A Yó>QèïÆ} ÞBjåüéÐë`MW iUü¥cÁ+º=ûËj³Ù˜>nÞ;=¬ýFþÈ ñÚX–d;Ú­ÿdå&Ó'[ÍÂ63¾gúܯ5;e+˜ÑÂZ$†îý¿+1QKXŸÞ‹Ûø¿±¬ØÈ^®Y‘Nvc½¢Ub·V¬¸,yó‰vvš ÛœiÈÂVrk½¥­ZÝB¥[ekÚûì›8çó T䵟v7@÷d Ë*·ÄžKÕCµ†A'Û’–¦ÿÙŒ3q†Õô/;;/­ÿH1ºi7+J?‰;¨GH¬ÉÙ7Ú9vv9l^w‡kÄ$âmsèt[«Ze-6à¿¶¬øtÈÆ4÷“eÉÒº¯»‘‚¨½D§7š€Ai‡yšãaœFˆÁÈ;Å}üU„„V¯FË/À<š`ÊÍò_ðŠcñe¿÷Ï`—±ãpi­ÙàõZö<Å <¤wôªŒÎÅOºðk+¤ð:âýªé%ã&wEm5˜añÂ]Wp Ü'·ž€®ûàÁÝÑF>˜7ªÑR ûíôîïýp;^%„W`¸ÛF6@—©;¹ì"&pUÎ’7Ö2¸•ÌXQºÀÛ ö¼¾ð¶fåÊa ìÃjŠòÆ=Îpõ(7[œ•À}x½_I¯^n· g?"º:³;/Uq¥¬~€6” ­¸Ù¡/Ð1§4·òŠˆÂ/¥#+öœ BÁGòFg±Ù(4vk]¯K„€Õd«UšmJ> ý„¸ z66þ†=‚½Ë芻QTNÃF8Ît#X§WºÇ1Ƕ?Fê_í*q¨Â Aòì`BÞ?d«6Rç€U[iÙeH7|“²ªÛ#(ú¬¼%܆¦—u¯N¶•5'ªL¢I³Gb‘†”iKë¿"œLà¤å"ÅpydRcÀ˜m“(´ÛÄ4ìÏM`,i+ã5ÄËðÂÇ.P2PJ08»KˆîÆ%à$àI¤'ìg,< â‚Obˆ?"ÉÚœŸL%%¡!¸æóÉõ— m¡'HÎç11K·šÅÍ<'HpUªC8Z®ÈKÙ±Cí,-왢Œ}0 €˜h^ee‘®—‡àª'ÓT†³òü—¥JêŽVw  Ø®Èg‰1¹½ÔÆM IyT”\jN¡áï”=§I¤¬Ô|UÂÊÄ •“îÀ‰ëÑ1à#7Œ¡s¾g ,²–zŒŠ˜^7:&n㶺ÍèÊi?ÚL¢7SN¯zÎ ðI²k÷¤KzÍPºeÜ^ÌNô#OWáøifTª‘0ssp®XCž¥‚c^*ÆwÈ]TD¤S¿p¤Ž® ´îÓ9ñã"#4}u!~ F'¿JJˆLÜ>õ·=Y•AW‚µB…–a äfÂÇÌD7ܪêIž8ìš&>Ò›þ»€Ãµé×gàFvE5—ÙËnØ?k­ÂoðÁÔ„ïÇÙ>Ttd¬Ô°·%Ÿ>¿æ·ã‹¡K8í¶“ðúôbû<ìøI eÍ7) B3½>:óD¶g°‰vúSa§·’°øÿÃHgX§¶*•!)ˆè|%u.¶þº…Að±ÛZ>(fƒI$®ÅMÛ!DvPPÙÿ/@ÆØÁÛ'!C Õ>2ò¤Ë‘¼©â¹r»í¨X5=ŒÏª&< ÂÕÔPº·¼TÉ»”*NhÚ#š“Vs°¶€ !¥S^,‘àÌ£Ž6½ Ù˜Ò’Ê^w¸ ÝÉWÈ!ãž NÅ gìÈ1^ˆyKnK(ô"ÿN¦ôÊ !W’þÌÀjÿ³œË2·Æ¹g¬5ºImFbYþw8€ܹQtÛN­|v€Ö¢øg8€Ê§@“…Ý…Z½Ø¨Î&ÚÇ›E«l˜ÓbÏצ.™hU,eCÔÄÒ$Ç[H‡‘yù¬AñJ6L>#]¤u žF/L*ÆvTb6¾¾·ªl4]ðé¹ÏhwLÀFùÏ¢ž`ƒlâ—8mð±CëÁÿ›œ±§u·ÏñA·*×O¬•ÂÉ6Jys·¦C%å @„³—9ŸÉsÝ^·"™ID_£ÀÀ÷$ +yr.,éçè¶’3ÇaññO³éØeq¬ïeêMõ5|È’;¡äÐ=ùŒ¯<])_òpÚ”ÊÿëDù¯‹Ã­rU$ÚE€+ uxÃòìtfvŽŠb.gÏ*x{EpÙ(bXUI9Øc‡€á‚¾•qB¢#¬¥ŸÌò<¬ÆMX¼Æ0F ¢›’R} Ú¡Hkþ2ÇÙüPuÍ9¡Yò…P6’Õg‹›ûù«ëòq`½S$†cˆ¥—G•ñVÉÐ9Ò/›­Ü+–®¶” —¨ÙÕIåVIê$—û´c¼ðwá[TŸ£ÝrŸÓŠ>©]v;lÒ)騛ŒšÀ`P8öeTF)³Â³–¦þåž”â»è'î6‰ôiGKè6£åÔUÎÇ[PµŒ¼°è›…Šâ„¦Úða–òÑ› ;ÚæÝsŸ,ÔSÏ7±%QÂÞ¯}G vB×…Ù™aøZüY?mÖO£ZÔ8~ xts¢9/톡)Rñ¤É"ºGkó„.4¦Ô(ê©ÐõýÙê¸+½Ü6RÜiOZÈŠMäW¸eÁ/“4Ñ—¯W”uO}±Þ¸|û/Íÿù’lÉí>|JQ~kHcqvÅô ?÷Ÿ¹¤ _uL[‰‡D‘E%?ÄîH•»­V]ãrâß§ƒ%MHÜtö˯³Œ‡ÜàÉp‹Ñ6”ŒE-~!ήLÿÇôåB´qûߟ ®ø¹Ìu  p TI’PQy½œ Sì¸=þ1a¹1àEt`eçh&æßMØ„ïü²÷!¸ñ[_°1'ÝÆd'»K•?£áùl’ÅÑÊäãæ8óŒòÈtî¾È!Aá…:Ô義ӓ›%ÒÖkššG¯ÈsÌ_öøùUü²CÖƒ1ï¯aAð—¦(·¦žT•_³Š3z!})zþï ‚ŸßBŸ>R݇:–139WæB"÷Ì’prÒŒ^-‡ìýŸúdö ÿâîúÄ‹>‡×Œ¤„¯ãxŸ¢Swü Í(Ê>JÛÿGÎɺ×ÞR!¢Ó3‚ávýj„û: kô‡_"ÆÖKfùîøj8ê?PK™Å_I{(-PKÛA‰; OSGI-OPT/PKPKÛA‰;OSGI-OPT/bnd.bnd­VKsÛ6¾óWl“*¶3“Xƒƒ,k:θWN›CuˆX<ôH§ÿ½KR”u<žŒ.±»Ø»xû+t" „Ùί/z |¥åæÐÿýgïOÏ>œÂhüŽûýOÉÛµ¿ eÒ‘Þsñ{ ÈfF²’„õG’z]Žž19FjL‡yP+¬{àQéXÏ^ÕÙþ‰Fv†p;œ\Á"„jz–eëõšíüÕ·d‚Gå0mݸuÃ\«Ê#‹Š)‰ƒY ¸Bç•5Sþæ¯vÂú½SÖgýwoàÐ[C­<›r[Õ_B÷à!Ör.rd7á0xÛÚº»š|ÑÀ¢T”ýÁÀ[8(¼ÃàHœÅâ`hKXnÝ¡ Lh‡Š¬ŽŠ¹h‚*ŸîøG¢Ó"Y”)ùbA~qzþм®…xÕŽÖŠyt+E­æeQ‰|L˜WBÓÊ­!;üž}’V¶ä]¿º@Ÿ;Õ¨øÈX«°a$´‚…µUfQiYo•S&@{X¾k™• ÎXÖ¶8­fEæ]þ¤…Ò.7V«|˵ø¶M.M®£Ät‚-ßuÕMIY]]ޯ׷ã”b…&•XQk¥¾£Ð³° =Pu¢SÞüQdU £æèôÓ-X9ݖ³zûkQ"§.Ìöý|žª1´gÕtÿÊÙ%æÄ6åxöÕ·™e{—d¼©¬ éÈïD|ŸxS^SûY±;¹{Á®ôì¨ÖÇÅÖxè w\|$ó(ïÇM£æÄOvòñ´7 ¶3¨•ÀkurY>ŠØGCXytTrV—~ð†MzH±£ÞQrãêrâ“äëÜŽº®(Cã‘?œ–jØ–šb¦[:Ú†åtÕXµ¨ ïII—ðçvˆ#[m*á_ºŠZ™»)ß‘¤Ûs7UåxCiÕîc³RΚMàŸoÇé{ö!y LJZÃ\™¸è-@ˆšú åáópÂ!ìb•@ÎèH‡0l¢ »ÓöHK0Œ­_,RÍçèho½mñP9hó‡_<"ø5±îدÃ;–Œ¬¡á×øÿ9U<âÊýbϤý}¶ù“+þì£#Y‰Ùyý̱1T1ðº`Ká’ÿPKÙó/ÓIf PKÛA‰; OSGI-OPT/src/PKPKÛA‰;OSGI-OPT/src/aQute/PKPKÛA‰;OSGI-OPT/src/aQute/bnd/PKPKÛA‰;"OSGI-OPT/src/aQute/bnd/annotation/PKPK]„d;-OSGI-OPT/src/aQute/bnd/annotation/Export.java}ÑÛNƒ@à{žbà `ÍúõPB7¦‘Bj4Æ‹)L uY,Mã»» m ö ø¿üÌ@ ñ;¤H౑H7"¡ D!Af…˜jZ–—E%Éö@9ˆtÒ •Ï”(Ú[ó|µ*x©ãÚahi³ª¥É8æ*Ž%Ò•í<Ø÷ÌÒÊf£,™eBbµ… ;t/üЈ:¡¬2‘’À³—ŒÜÝÕɤ4æP×T5{£iÑ K® Lƒ—Æ•aMô©>¶<± \øžz šöXÕjÔ±XÚÞÜŽüà¥9ˆdQÇÆ_EªÄv»–¢l÷>&ë…¤;Š45Öã˜=;îzξc<ļIp,Þ@dâ$†¤Ÿß´H‚[h¸$úX¼¾‘óÿªÓ¿!§ýÆ×w·Šõƒ”¿ÙaÜÿ‡Ÿ¾ûOÿ©}PK Ô à<zPKécb;0OSGI-OPT/src/aQute/bnd/annotation/UsePolicy.javam’MoÛ0 †ïþD.ù¨¡ » vh‹®ÉÃN´ÍØ^eI“ädÁ°ÿ¾×IV  XæË‡/I9Î_¹â¯m•™B±16r¬­¹O’ºqÖGúÉGVšMù_T-_. -h_Õn!ÊÙP¨sº–‚¢¥ÚDñÎ…N•x„ ­¥3æ„ʶº@ZŒ^8"“¥69«ëüœJ¼“;D=²9“[ªøØ³®¥ÅŠ‘ŽòGñg ‘3ÝY).††/*g œØ#d‡*ò`}¼¨h}mJjjc=åf$AÑgä7wÂh{„œ6d)\ô¾úý¯·Äq«µ=uâÏͦ$ªTôc¥VéJ}˜§TÙ“ ˜vP~#{Ê|A“ç‘ÝMÑ˯¶Æ(B›WrhXkò…}bGèV.Èëötý*ï"»%Åá\.’—ÉúE"Ô8Ï®_Ïú>=lv»y²Þ³/%ζƒëýÙ‰ÚÞÎ×fÒúVþ[!™þ$„gûé¿9nì‡ûiVÓRúpDÃçÒ~Ž+TG–âÍo³¡+ωé + ÌèÁ<®¿}òž‡NìùÛ·À_{î¾ÁS),¯\?«ŸH·ÎÏ5]A Çl$3 aìÑh$³D¥V†ï&4â¦3’™k®Éäv9TÕLJ—WÒ~D‡ò“wLµ6LË'RrAZUø¼ÂÕ÷ú Ü.Ú¡´ª‡ÐÅúÅܱfrC}'ûF†-Ëæ¼çðSQ«wàòŸõPKSTˆÝKyÇO¯J^¥(Ë]ÓŒ% à]º9Rö½:}$ª1o–Y;¿+Ñžëí·ù$¾óú'Ùnz„5Ø ¼éHýPKݨÌ`lPKçK{;;OSGI-OPT/src/aQute/bnd/annotation/component/Deactivate.javaMŽM Â@ …÷sŠàªu1=@*ZpÑú×^ Žqm3¥DAÄ»\T³zá}<¾Ý =îBöÄg‹ÌQPBdëb?D&–ܘ q¸âm‡ìÿ¹¹öÅ‘DI}“)ícÜÓ®ªeÓ¤¦hqô$IÙQ¯}ûÈÖe»Ù­S3ÜOŠBXh¼ #X: ‚—½FÆÀŽÛe]ÂfÕW9Såì§’MÊÙo Ÿ©ßÛ|PKYKoªëPKñK{;9OSGI-OPT/src/aQute/bnd/annotation/component/Modified.javaMŽÍ ‚P…÷÷)†VÙâú(%´Ð~Ôu”[:Wd "z÷† kVg8ßoÄúŠžoB¶âÆ"³çÙÖ~=ËÚ§q¸àmÜýs+í£œDI}—s:ùÞÕ»Mã¢LTâÔ‘,“žíËÇH6KÊýq˜ñV) ‘c¡©Åš ók5ð4 WÈ七üg l`‘~„C"á,~çë…º½ÌPKob^^©çPKL{;:OSGI-OPT/src/aQute/bnd/annotation/component/Reference.java…Oo‚@Åï|Š'íz·¤HZD‹ØÄã°Žví²K`11M¿{w)6ÝÓlÞ/3ï½èÀk¥ÐNÅÎ!¤Ť°©Ìr)P¨©e1=Šá6qèr7ZŸÅ¨4©¿ãvZIÎèÙöBw½žX³Šª±Ï1ÓzrÎÑ^øÉËr>±ò*Õ(™1¡°ØEã zú´ˆ~kU0q qä.|ó¿'£°6íhÓΧ5í´+¦£iwÇu…Ù! þºöã·ÀókµÄâÄèX®’`¹¡dnnï‹M˜«Ð7DVqÅr>Ø1ßjWÙµ Fû@âÆÏ~rñ¨êÞúvÕfPºÉ¾º‰ž‚h~Q+‘2±Óz0±Ç²Ã=hdt•=ey÷ø@šäf™‘*›¢¡S)9‚ ×:ôx‰ìZÅ?XÓÇTàÒÉ ‚Ñ»Ð%úo9é;ÄôÖo§Ö—õ PK@ÕI'ePKÛA‰;OSGI-OPT/src/aQute/bnd/ant/PKPKÑXC9(OSGI-OPT/src/aQute/bnd/ant/BaseTask.javaµVMoÜ6½ï¯`ÕC¸±K'×lâÀIS @Ñu¹øBI£]:ZR%©Øn±ÿ=Ã/­¤•ÜMè"‰œy3ó†Ã™†_øÿ³µÀrY2.íj±»FiKîøW΄bÏWƒ•ÖŠÚ­¥E¥7Œ7¼Ø³JÕÆô÷z-ò ÓàV@ûí¦ÍkQ¢æÆwÜÀ 7_=¥ZYC6Ò± e6•‡¸c·ÂœÒÕ]ªÝ>ª¨íjz:fÄ?€\’}÷|z4v k0:[Kš%Å,z• œÐÖe[éîVÝŒYe±þ°-7à…‚?c'f&½üÈýâøk{*¡ïŒ<¨ý¿¸;“?:êÞ ²º…Õq»âµ©B0–ãõG~5¸"woêr¼ùÏI, W–¤çµ©â-땼Èj†Ÿ*&ÌUnTÃEAoÙŽ`„t–IÓÃ8¸ß:(•(ï,3!KxXWôÙųåd’=Ç)mlR4mnü2}qNäÈŒwÉY:–䌼œvq{|·H:ÍË–Ë#¹lå"½æ›éTœîLݬþÿóד‡åXc´ƒ°Õ#þÒArþ¾çRIQðzìòžÜ[úqýá¡€Æ …ŠŒSчšKò~ú4%ÓÔ¦ۻ„Æ (kÙÚ©ñ½ØÉ‘7ÈE[×Ë)ßf‡‡qay!l Æ Ò`’DzÛ[ó<ÃsVñ#¬Ìö‰è÷’¾Wu«Hàë·—ak¸Ý>\Øx×Vv“ÇL÷Wûüv¬Õ(˜e‡ ÅÅ>(ùÈ«ƒõq"Mަ£Y­Gï°çPF›Álˆá‰[ 1¬ žÒÉ6žš¢0×q›œrCÞÄ `°“þx2ìã¹þÌÒ0žÀ½q£$ –Gˆ~áâØ9ã¤ß>'!´ÕÚÐJ*šýL²3s–ÝÊ,Î*™ýâPKžÌn­o PKR˜W;'OSGI-OPT/src/aQute/bnd/ant/BndTask.java­YkoÛ6þ^ ÿ3†AnüªÛ×¥éÖK:tè%[2 ÃV ´LÛ\dQ%é¤Ýšÿ¾sx%‘rÒ½DbI$Ïááás.$[Z]Ò #ô§½få²Y•´ÑÇ÷ïÝ¿Çw­šüE¯hÉEùà¸_µ×¼6•¡ZÈMI[ZmY©…¨rŠÉ’íúcËTŸO'ÊrÏëUÌbØt&Å_¬ÒÃ5_–Bmø˜4´°ªæ­bÉ›ò½—¬ñrµûeÍ+RÕT)ò´Y]PuIØÍš|SÅLÅ?÷ï(çZòfCH%v;Ú¬Žmí ^3|.¡÷ŠKÃÖ|ƒ"mÈšòZ\÷+Ù‡Šµš‹F ZBN¼+ÁW@Â*˜E1'z+Å5ˆ‡z:õŒ¼XøšNHrrBš}]Ïãv,ŽÝSÉ5•«gb×RÍ—5 pÜï)™ÞË&È„å&þÀÑüìýpdÞçaD& »H]ÌÞˆ@«˜žÅƒwoZ~Êïð ³Ïò«— @ÈÊ Ó®¹p¼‡srT¥2=[&õÇbÆÄílAfZîÙìV4¬¹âR4;f ‘~‚.Ì[8D®'­ŒnÜ{õ¿Œö%C˜Ž~>Ôþô éy¨OÓ¹õudo –Ó$¸hαÏ`À’D^»Xf§R ©ÈjoÜ¢[(r†ËÇÕ28ºIËÙc¶¾Ã$®údk!IñR3IÁ·zŸ ÈKË-Uo eƒ<¶‘ÈÓœMc ƽ™$K÷<é´ËR‚bµýÁňÿÞçs°F Æ—éåu¾&)7–³Ž•·ª®*)?–¶u#4‹×´}ôÝ‚|÷x>Ò}Ì'ÇÈ)!Êx°{›ê>BÆž­@7¼*¸ ¯YÔãj•ìD.§PûsA^±.ÌV´®ö55‰G–jÇäqÏ›ªÞ¯@·LW‰Êk廵`ÀEÇŽ`Ž£3ûyÍÁࢤ!IÜÁiÜãòˆjn…—Ù!ìðÛP•Î+ú<2¨r>@…%^AÁ?CÞg‡Dˆ¿gÔÅàÔ}¤YýH%캥úýæjޝyªŒ»A ùÂî*ÉW_ùÜß‘æÍ%Ÿ<À¦Û'û ÓᕨŒ  O‡\°'K%jÈ…Îlô»µe'ûÂaê_Ãã‘QEY³f£·Pqt”ŽÓPíñwæRÿ¥jlWø ݱŒr±„ÌÚœaB’É…Xg²pû•ÈÉæÒß± Àþò–E"û’Á9ùîvÀl¼ŽK»ÍìQ/ £NØ#– ÐÑ~7.¬-NH31 9Åú&ÝtcÇì´RrõÜoÒ&¢ –ÿª›hÍ廉ÿ2ΔžRʰ>¨›i)þ7nh“oè‚aFYÌl>K8æ=&çZîMè“Áÿn_kÞB5o°›c특ýË5¯k"®˜¼†¼È„I?}lÿ–̦ÅðåÈQ%ÜSNUŒt§6°³Y†Ü8e7¦Ï\¦EýôÉ˱F¿+¾ælÊ~dýT¿vr½°»Ñ—[åp˜àäfY4B“|ž›sƵ9Ñé¹ZsžTÌzËb[¦udss.å¸ýÌl8åzh"gì’ç¦í7Q™fä]ÕB¥={b’ÞQ§‰"‚p\ÖŒ÷ßâ™íyîÀìðaY”ÜéÐà…‰ùD ;#N•-Èð Í=’GR6íq†bì¸7Kw¬á6o°5Ì“¾Ù {,Ÿ¾œãé)ÿ÷|¥Ûb眅{Ì¡cʈãH¢3¦^$–.|)†ozòþ´š­.ðž0&É{íréACá˜u\"ÑÝ4HHFMv÷ÞàÞ÷“ñÏ8~IåNn¬ÉôÉXâ†]Iù»¾ÖÝ~l 1Ô°9ÔXIÓÁÍ‹g´!èhÖP“„¢pG l\Mzû#ØÅO:÷˜íò·RW´Þ÷­Óœ‡à¾»À·ñúg¶†ÀÖ€EZÚhp“IdÒnÔm7 ù¬M‰5çPèÝ=‹H9p;€˜K$Ûdä&R1ÇQ1^œ•h7PƒXù,•[Íö”}‹I|Æn)|Nbw2V„k»ÄªqN®äêŸ+ß o!ÿ2Žºèñ°Wlý«Â¬³µôýëűDnƒx’aÚÉÝI¥dÝTfuÕñßr&4ÚPiÙA:9Ï0 &Eôw¦=B/–%ë]¯Ž…1Õº§Á<£ ¿"¡¦Ç9^ñ‘@ü~ÈäƒJÃŽ¼2ýÁFN_Ÿ]üöç‹—¯NÏ]h2 _¿ »D×ÑI ¯vB¼ÞR.,^¾MÞVxtšð­…¹¢)"Y‘;äŽöÇã{œ°ežâøœ)½þð4Á”ìëœÖ-¥ªU±B¬-=ƒôböþ›}ä¼1¥îÅÿüvö ¦Y7óÒP”Ê{¸Âº´›;å×€o+íá‡òÿ&@öËøpqcJœa¸„½x ¦Pá+|wNm'DN)8îÛ¬©k‡Þß+W™jéEÖTTN±FåñHbòb¦ìXc‘CX9ûJ4˜öõ[u0¶JdØ‚Ûô¾ØRmP§çî­[{RåCú-z¯9û¹Ð+ãDÞQîìä$éB\°-™ÞT ’QC°0GpX"ÅëAàÂ:I‰N*8Û‰–x³"dÝfV¨ªBšµMÌr|`P1΂#µï)2ÌϪ(šÙy±'Î,@ÄYbµ +˜Ná4ÿp¬½RVd·6å0 ; ¹ÓÄT q9=§ÇôóçøxŸ2lÌ6žNýÆß¢-ˆoOóí}máÌ㞪Zºã†ÙW·4>¢çpt9É­z&乸7a%2ù¤\–¢ÛYjD©cEøÜض€¥ÇOÑ9ëXqlZ'.<ƒ Žáð-*+ïc„ŸQOYnAÆ>oùïÒÐ#ƒ6ëÁ”¼CÏðË!ï*‘äAòÅtBÒU\39ê\éÍ_¾¥Ë}ÝwGì”áúYèE¬-ë¥Ú‰tDZjNe†±HAÖ4TahóßÅæq=˜·_T[ûvòa÷)ÝŽ%†áòèÓ+ãe·H$E´Ãšà t;ùPK¶÷Uòƒ˜PK¼Cˆ:+OSGI-OPT/src/aQute/bnd/ant/EclipseTask.java•VKo7¾ëWLöD9Ýs\p(¦.l gj—’h¯É9+[-ôß;$÷Á}9é^$’óøøÍƒS‰üYì%ˆ¿k”|« .4^­Vê¥2áIW†_\ vjT¥ßk7ÝsQ‰ü 9S:o$=ÖKµåÆí—y©*'ƒDUoK•C^ çà.< ÷ ò ¥.ü&šW@_eÕQ „´Jï!nÉzóÿ®!«¬y’9òìj þU9üõwUÊÏ^|[«²ðâZ¾ÂµâÔŸ³õPÓoBü^}vtMùÕä•ÑWKœ¬„h¬‡´É-6h{{Q0rr4ª dNä±5àÁšWâÃc¿{Ëeå5Vü‡ö”¬ü§vÀFàš.]—åz 8…€ï%ÞÇM¶æ´ð‘ø¢¬'hâfBͲ£ѱsïí^X©Ñs5qؤɭϙJàš„j:>fxPn3õ»™@›áaî²Vú¬fëéÝBŒˆa˜Ø¬+ÿewÖë ¨Cò4ØáÞ_KiWÒÏÆ0DQPl*iñÄšüÿYÞ^9ÛÀ“Qšµ•F|öt¬ç/ÞåìúçœmÁ%‡³B¥J„䯞éÉLm‰Î Ç•»{©ÎL æÑºN»…º’Ÿïa÷ij¬j$‰Å¿Â›ÂnºÙ:SRÅß§cG—CÍ x<Ⱦ§)Bƒ@jE[2B )Ðo’@EíT€†6%q­óÓØ^¨¨BR³"é5/A¾M̦Áz-îÔ?¾Í~†_Ö£>ºá€)MªÅ ]R[çnuê2ùXßÐåØûÿë)±Ÿ´í„¸´­ð®ö`Gì;Ÿ› ¸ì¼üÇèå%<œÊN]€—KÍ2¸)Š˜ÆÊ'È(´Ï%?*Ðï1â¯r„s/éàqvaažÖÄy:NIŸ½-ü˜Ë)rÿZò&ů›óØ eXŒ¥šØŒGæYjª2 ›n0:`­ò†¸Ød ¯uæÐ'ÆŸÆÊ ã‹zR.~0‚KT…1b¶^‡œñ BõŒ!ß‚cò»˜2CzÚ.ÐòÓ·…1ééÔØýŸúÁ¬ÂBeŒ˜ihǃÞd ]öø}æbI(ñd"EQ– ˜ã?·ÐâÌo¢ÜdøŒ‘¾£ïÖ ñ¤üíýÍý]Y#±Çj¥ÌÆä>úO¢ct ©çI4ÛbÖZ¨ç7¯è—)–¹hY%“ú} Ë7_ò?XEܬ9+±ÏãøðŸ‚8pñ“0(ráöeŸÈïÀ0ÅD'xÞa*Špì F6*>ó°1u£ØQ0m ìÁ "[%cÛ PC[“Ö¢ÐgÁn%l¹Žµ3g1Bã5ôfâg–Iê’÷¼å5`šü!š hEºá¼ÌSˆ£8JÏÐŽø—| Jã˜C?½}¿¯Xà@ËËåËô/H­iCjú0øá¹\ Rò”ØøûPK–“ÏPKY„9+OSGI-OPT/src/aQute/bnd/ant/PrepareTask.javaÍVKÛ6¾/°ÿaVhÙÙÊA¯[§E’Í- »ØK/´4¶ˤ@RöÙý(YoÒÞ*5ä<¾y²éNlÄ_•Ãd­²D(ww}u}5›N¯¯` «Af(@oÀåÒ‚vüÖ`Pd Š‚6J£K4N¢aAn€¤ANKŠNì“ ˜÷bGç¤V¢aa•EÏbP™(´BÐÊK¶b '¼€['÷¥6¾ŠƒH¤N¦w}Rådá‰-Y›m"J‘æ˜8­ Ë8û'Î.XW²Èº2‡[ £¿bZû©¬Ö…L!-„µ°0X ƒ+v>:T™…÷ÂÖ„od==Ÿdü^=“殦®É(м(•ƒ9lDa1ì-·¼rºôJy´ÌH¦db-dIÕ°.§pÛ’4‘€hœæ©.OãÏ@»0ž)U\šC|.wœ KßX–ŽúýÊP™Œ<ñ"®žëŸëåsÛ„Œ<‡u˜Û Ѧ Eϰ6dµªöh«úýw°ãÞלNâÓš<Ø%4Q>kƒ÷rÙ1q6ôËžHX\MˆUQK|#øç Š {&l;iL/%´ vîÅÞ¸!U«¶o•Z‘UŸ'ñ,x vd;,¨Ë¿wì8Ùv-DÂ\Ο™¡Áê€;üÓ’¥QMXÏgóÙj¹œÏ` Åž@+B°ÏöÚC@€ø´à`]³ƒ q¶!4y@ú öüš¢8â(3 'ñÀq:¡×ä"Xë)¥ø€Fam 5 Ùã‘@aÀ°ŠÕécc]€<¡ÔV.×#£u;‰ V{’ÁÚÚÇ+ÝF¼ß¶lu­’ó×og_¨ê$iÚ²ÖT5zÙQD5èÈ(è)þq¡|~êšïÄF¥Ýº3•\¡Ö(rùíÝwf8Y­”*®E,Xg_=ôã\Q4+“9â î2þë/23l6`ZîÒÛ|É6©ýwí¸~ë.b±¸ÍM‘ ½NhÅCˆ>‘I7ƒH ,7ÓXîæYû÷pýùÚ˱HŠŽ]YÐ8G鹿Ö<7’äŽBv‹Qþ8;gu]ƒºÓ0G±Ë"G½W¨0T{ï Óbª*ÉÆi¶×¦p\™˜|ªÝu¯×^ƒnÙâY–Bšú^Ý®IÝúÑpÏnòÎ]à×Ó¶€’W…‚†—o :<öÒ÷æÕýÌqúc$Ƴ{£CüÃhMÆû:žæñŸúÖˆ»U¸§\L4ݦâÏPK'ç¦ÁPKŒD;(OSGI-OPT/src/aQute/bnd/ant/WrapTask.javaUMoÛ8=Ë€ÿWXÔÚznšv³éèb‘¦u€Úhid3VH…¤šd·ù﩯¤q$!5$ß gÞÎg(öb L¼oäUæB¹£ùl>“W6Ž]Н"—:ÿãhjj¬ÉØ›µÙæñv;­kë‘ÆÇ~¸îî°Sœ!”+!Õ!¬Ôr³Í¯Þƒ²O¬ð0¸i7µ,XQ kÙG#š a÷ n¨Ò²¿„2 N W œe"û>Kþ•Ö½\É^%—ÂØ$9f n؉1ânXãúJü4Ñ­kZGûÚºîÍ%TRI'µ²lX¡S€p»Cðwƒé¡’JÈZïF¸- !ckcd,jòçºmÖ~FIµµ(ñn•¨-ø|´‰3wa_"+Æ} Ùq¸FÖ„ éÆStžžiV!¦e\š…+˜ã@‘mÁ} …ãY޾Æo¤áˆI=&8ÓJK“JÆß"c„Ó&”‹UxÖß6—ÑŽ'X•ï„=CîáGÓ’ Ù™ÿ eÇY‡íWr¼û9”¨YpiûiÖíñÞ(M>ó¹ Øaií°ô[¦Ä-â3üì·Ä5?xÝÔ¢€•4Öñ”þœcüÙëßÓ%K½"Ó‰K4¬‚WµŸŽSº ^Ç)µçr¸Ej[ž½Ž†¾KŠrÉB)—,Øž/U?0N‚2 øí˜…à]ŵ{ÿÿžÂ;ÆC6âæ ŸHÈI;k‡mòÂ`jº´ùÝ¿ýý”Ä«•ÓlãW<'è’/XÊ ï ”BôÀž=c¿ââ3Ü{õº'ÎUŒú‰É#=Hb1¢,Oêš»´¾ø6Ô‡t9F#˜¸wèP¬Æé’aû/ DGï[í ¼ðm\þ‡öÚE"=Xàf8OÉŠ¨Ø­ RàÓ<|íÇG¤“ÅýS8íž›<蟤ž$]oYwYL©Ñ½Ò®ˆ»<"p­ Dx´~T<3~RþH,ôÈêÕa{°‘¼G€ƒA§(?†~G½‰BŸãõP˜Dœä1Ì›¡YöXhúé'Q°J§ZUrÛ º†Ž$ƈ‡$Gfjs·.„R¨6ÇcÚå©óp ‹e¢9").¢øãoUQ·eÂ~ZNƒšFØ^¦¥—i$á ¬¾M…D„ÇLáøPKà„V&á PKÛA‰;OSGI-OPT/src/aQute/bnd/build/PKPKŒ¤$9=OSGI-OPT/src/aQute/bnd/build/CircularDependencyException.java}1 Â0F÷üŠëRp.NÖApÑýšœåðHÃ%‘Šô¿›Ö‚›ßrðà=¸€ö=žs¢ºó®î2‹kŒ ¹¶`c„=«Í‚ÚR ïÈÛ×a´hL…Eø‘·²5ðG­.IÙ÷—³Y½y1ÒjåÍ‚'ó­*?1Qq0•ú= È0WHåFKúzlaÛSyd2PK6¡¸•åPKãyñ:+OSGI-OPT/src/aQute/bnd/build/Container.javaWßoÛ6~÷_Áz@!§š<ìi¨›¶Nà’&s¼¥y(‰ŽÙÒ¢FRñŒ5ÿûîHJ¢9‰w÷Ýñ»bJš}£ŒÐß+Ã’´È“´â"ŸF|[JeÈWúH.““Yg§2\àÞ¨¬RÁ3’ ª59—…¡¼`Šü;"°¼Õ–¬îo~×rqs“›åõo‹óUL_V‹åçùeL./Ζóå=l-—×K«ÿ4²Ö¼ ‚|â‚‘ÞZÃÞ,б¾zËìˎέQ¼xèꤺ8¦òÈ”æò¨SJªPéFɯ,3¥Òí…jW´|çðbûžP)äGÏ ÍQê‘jšL:ÁYÜÐÒ+¸†XÁ!š@¢ R&4;– jøòýøBýØb@ÖûÉ”&Ì|¦[Mb2ö’±«°¤éiTŒ-îwòr,‡];ˆc~Ûò¿[wg«'t©˜©TÌ”®ï°<«Š\°Ûý6• pa=ÇiÚáÌŸ®.‡l;íÒµ·Í Ö+¨â!Ó¶™ù]` ™ÅݵM¥Œ‚Âß:ºNmíH³a*„Án°›„ÚÐ"crÝæ¹[ýÙ‰‡¢V׃Û9ðRÔ0`?xj^²¡zs.óƒÉNZ…!ˆºU€9ÿ8Ô`zrâÔNÈU¥ ѹƒÂvÅN ¨C7ÜxYKµ…f9¡šÐV«©ÿ~t>ýët ËFº‡¨Ÿž ý~¨¦e<µÙÑÚšÏCÓVدóTK£è†šÍ0µCŸ4l†ØÓF\@öÒw‹cîþ«ÅñC' €< ž*ªö ¹Xn¬VäEqÓ\¹eÛÚ3!+ÄÌd%r²“êèd´í#`+‰½=gºÌ ‹J‰Uid+M^Î0ùh6Jî4Yü“±¿C©¿äÚ¼k:ÈyåBû­};Åt%‚/aŸZÔÁ6FÓ)™+Fv»–¿È_!c²ƒ[¥b–+‡Õ¯@?º íüö¿~!¢eBó<ÂÜõj/ßGsçœÒ6e%Uš5íæÓÅuß0¥šgTˆ=Øê’e| ¯–"¸ÚV€PÂ<@MÒ·¼Hu/+›Ô\Úß^ºàíçæ5!gXjBË>ˆ.£9Ö ùèé®·‹¢¬ t£[i›úú¢Þ¬ÄuV­×L±| >YåÞ´»áV€äwyѽ/ÖküÇêÓ¿Œ'=_Fí{iÁåžiöL¸Ûàˆ‹"”Bd*OŒKxƒËR3 Pqy#›p²&Ïà¢{eµà›¤Œ¾ã0ŽÆ?Œ'äõkg-Xñ€#м'?ò†«ß)Þƒ>in::Q¯;º¤KnWËùjñëý_‹/s¼¥-Bûä'£‹«žÈO£ÿPKáj­(¾`PKúFs;)OSGI-OPT/src/aQute/bnd/build/Project.javaí=]wÛ6–ïùˆN·‘Eigú²qìŽc+­gÛk;Íô¤99”Ù¬)RCRq4ÿûÞ@€’töe9g™.€‹‹û `‘L®“K)’ÿYÖr8ΧÃñ2ͦÛ¤óEQÖâ÷äc2L‹áãmçM.kÿÕ²N³à»ß“ßëMSW2[X5š•,?¦Ùù-™Ôi‘‹Ô²ª[²t<,ªË4þAN²tQµ[…—Ðì´õAw¥š”é¢NóKæ³ÇˆÇââ*­Ä$KªJÀã“ Q_•2™VÉLâwüÿß’e}U”"ù€S/Ÿ=X,ÇY:QuOËâw9©…üTË|JOdUA¥?<ðÌÒ<ÉDU'5Ô9¯Kè†ÐÏÁèÕÞ›£‹{û‡'ÇçbGôxzE–Œe¶óè%þõh cæåüï&™Lrórÿ‚·¥„•4ïÏøoú2+euµ—eúã¿émSGÕ°‚ý}y|ðêðhd:ŽEZ̧›UÞ?~%ìÊ“|¦*r·Ey]-’‰ös£ßrÑqQà EèY”r‘”rzšÔW• y¿È2I¤øBMÕ.|›ÊÎV¡íˆ\Þˆ£4¿–ÓŸ“êê\Ö¦x+o¿Èë$Íe¹+hÖÐv¼¦ø&ËenÁ»7ÄWi&wBU,ˉl€† RñM€%YæÀ»;0{EQÓjêvgì—ù4“Õ]°‡R<Ų^,ëõåꤼ”õz‚MóS&Y.šæu ",Üi\ßø ¾UïÞo3çQËð(­j›ö¹›e’fVMFÐ^Y&+§<¢Æ^àê}¿Y°f‘¸k .q–ê­ üµõÀAÔUYÜTbô h§ø¥þT-²ìÀjv¸RZ ÍèµÇ"¨¶¬±µ×˪}‚±ôgIVÙ@  š¨SYõ›î5%€ák\<ü,qšÏž‰WÀãÇ žo’r*&ň7§YZ¯`Æà-Õ@܀䆅‚/¦¦.þAŒÝê…jüöŽÈ¦Îª·ºÐ‰Hë[5u¥Í9Âé7¯§ßò:T¦“ZŠE: ÷¿³åÊúËñ æï’'«Ïro¸0{Ötà“ÎD6L+*½µåÁçéXä¬HìÎìzÄ^cX!³‚5O/¯jEô–~C”«ª«L}U,/¯D:•@+VÊ*x(ËI1‡I˜/êˆæEQXÓBu¸‘ÏQ£,6‰ûI†Ü d"€W™˜j]9\d{UNØ:h[ðeYe¿·6h^Ôècžêy6Äð\ôÄ=ô»®Í·Àl$²¡ @I ¸H/eŽN(ÐTªz9›…™+û–cÇ_‘æ °^±¿Õ¬ð*ùÝAE¬Ðð;ìåM’+4f,gh¿@ù%:k•lÀ¡v‚HMó,ÄÑÙ¿O›(   õµU±DùË¢ ÏUëÃð ]Ï÷Tëj)kÅQw¤sv}ZžV¬<_ä¡WùJ!ž.x*Íî£^¯†£ÓÑñÁùÉqÌO(ë eDú¿–)ê†Ü6¹,Ñ3•”•üÄ=,Öébkx-WP+6>BB£Íâ:/S˜Ã¢ÄM*ÕÑly‰Ì#XŽet<™Áj¬Ih"¾.§D÷…~Å}B#áœz ¿€ƒu;X•ö¸ézŒ‘Èô/Ö0¦Hȵá?Š'¢ZN®Œ¯™ôþ„uÒ뤟'bsJ£tsq|Z‹C÷¬l„IvðNɼª¾)ØîcãÕq”¢˜B¾ÃxQvSÚl/qžiZ¶(ǃ°0žŠÙMMºp …/QÓŸÀÀC–W_Yü¯*KN’Üb`Ý\5Â׸{}#žú¼ô-·Súq¬«Èt©•ul³¾~sÊN‹¶¨¾£•@ ©SÜå`½_ãPêj€S3ACñ„–Ùñ÷(éäâhO~$oqa‹9cY(Ñl®Xr{%0iXÄP±¸IÑ–¨É‘4].2rRU Pø„dDëP€×%p²ØgZ/5© èÞSV92Òz5?78 ›/Øõ+9¹–qÑ¿"o|³,ÑN1å+Z—ÆÇœï&Þq¨®;!{;)H$×ñ“X†ÿ`•ÏÅ~ZöÇ^–õ›7ÒÅÊVE˜6e©ZÈI:–£á;ç…ñ÷gÊqŽå4¤[þ"õ9§ßUä 7$éóUzyZº@6ÞäˆYYÌÉüióB'cá™+ ÉIa-PßÎé’mV Q™ |~q¶w1úé×G'oGçmû%ì¤yùæðèàtïâçˆìv·1“¾¸·?þôóº{öæø>5ÖÿA_¾9>8oE%ùhq«óª¹"_Q`©“z4y²d¦ud¢2J2kPdMs¦½çh<’[YSòEJ«™q•Ɉv|R”o%24z•db‚IDP[ÝQËYJU¢BÕnI“ðÃÚE«¸ Â3xâÀ¶ÃâqË“M6žM•ïCÅ?šBßü1Nó[v\4  ·e:‹GнPàÍ‚cšNU#¹\”o)âLøôã,F´¦ˆk!êg=Þ'~‹Ž1ÏD÷w =·ØæÆZµœEEËÝNGÇçu²PŽÞó[9w ãu¾ÔAK?nÿI‡aE¸(_èá˜Ugc»"…vT‹A18D-ˆýÌÃTÇôÙÓgå§:’6»Yû¤caþjJ¹´!;_M,D(FÅQ)@ù(hƒˆ·²ëþ’dK̰ò¯ À‰É´‰uJ­ï3J6Úá–°…~O}é…Z!£Ì®©”*Tžì÷CP À î÷p-W¨éD=ÝYCä}ÀÖÀ5°Hžº¹±þ§€+ 7f¹G†Ôé7„áöƒãU¬°·…Z ]¢œ~ÚhÛ$ ÐäÝÆƒ€Õ5a­·™Ðç'»Éš·5'Äs»"¡øub¸ Ì@Dvûoõ¶.bÆžØ8áègmt6‰6êPïLÎ@>æRŒõ ‘ÌŸ²¢Ð#a…¦‘•¿å›ÅLôƒCüüWu/ ç¶F@zjïîªvMš‡œfú ;çÊï»þ‚ËU«8³Á§µÙ£{e(nI3ßÊ^ô óÏ6LÐ {Ô#—(zÝmÌšÄÄ!:­Ø(Å­§ÝcÇ'¼ø8„É+px¯ewtøòlïìWZv4¼¯´îþÌ>þy1:;Þ;ºS§»è9>”¯$ëÂ=è’€»% ¯Q/ÖEJ{-çcOpñPBGë2Xõl|»“Éšs“”9&±ö^C½tA;ÎXß4J?™¼óÍÙÑóCГI,®ê)ùR¢ù_íé¢Ìn,@¿¸æ5”eÁ<3 š?u­‡¤:Qெ³³“3-3Qoá°­MÁM‘éps”.”¼„ÔÔë¦j ÏŸ"E 8IQ0×D†ØcÌDóô/ÚéÅio¯YërãYÒtH®$ìŠM`'¾¿týv1FƒÚ2€Øå°‡\Ín£{Û˜J¯x³&uàNÍžqøÿ¾ªì»6¹‘ª³UaMü»Ý‹}Þ¯Í&´ºi›Þ^šû5ëuïFPî¶¡{• $Ô¼—j›å~ÍØ;ñCÑÒPuWK~i¡ÎQܾŒ™¾k÷µßÐ ùšÌcý]ŸeRáNÜ ft˜mê¦ '­h†G™üÚ)‡Ḛ$÷9ñ*JÁÌ¥•­ù…¨e– ÌâÔ¹Æ4"׿)ÝìðÒÁT Óê~^Ç{Ÿ}^ÈŽk¼‘–Ml@7ê´Ç°›Í(‘,²Û@gnO÷×l€‹¤4϶îÖ̺½v­˜ÒF͵Ó2¬&#iÁl«üÉ5+§šI`·Šºþ„àF®‹f–tJeR^VïÞo#@_y‹€:­UßË(,Þõ㮩ÚÞò°ÌmͶ8ÇýêVb¦Ýø{`æC`© £ù] CK½¥eP…nü2ý"üz›O»›¬u`ê [4Jšö,q÷…-E¬Qg¡|i»þþ×5Sêp‹/Võt7Íëüm¢­ˆÅ†™Ì/9Žÿ}l+ä!,ÀË$Û+/—x²E³2hLô¾ùƒ{s«qhQPVo¢ 8G4E͘Ú{á‚ìB –ÐÆ¿ß½Œ?—“`‰­Ž±ïŠ¿~µ¡w›sOxj¾{¿¦TïÝö‹ µ#Œ®ì¾çÈ\‘ã¶³äÑæ#ž Ñ:,Wk¬ó'Ì«f÷*öÈÙÇ #`¦‰ÑXÎ3};;â/>Ç´+Ó¿o³Kò/Ò¼Ó4hjú“^Ô0£ wœŒ‘GÃT£%™”ÅA1'WG$=Ï”ÿÃ:–ã6ª¼ªÓÕúOJñ{Ò}ìŽ>Ëý#±}g££ÑÞùèltz°\Tca@ÍÅÂàê7ý§þWEH±¾~e=”•¶(ª”¢¼v)Uš4oîq’„ƒ1 ± úH*Ÿ™þñÞ“]“‰âlHñ‹µö¢øD¹h¹–Ià· r{(þ¹­P~×Ã…j5Éß–iÙ›vÚß¶ 1ÁÄý‡Ôun±íp—2¹öZhœþZ;îUŸ=ü«´ZÆäy\Ä\¢á}éz ,†ÈôÚoµÞ„r"z™+$@tá—fÜfë n§Y4ïÛ¾¤®„dIçÀø.[?ïËœ-vY:e‹Ž>õ³?ߨŒ†ú8MÕÅj°Ñ@MP&éÚ·M&ê&ÌÇÁ¡Ã|6F(ò/ 0µ¥=€&Ý·C˜¡íö¼g–¤YÅ¥iÄXºA5\ +¼tVu›^ ê+B(~mb©Êªß%ã‰ïëïmò½}!ÜZoèä€ÅÍ*ïY1L#Yš£Zä2®òµ(Ø•Ê QLÙ„ø[ÕuÒ•SFÕËŠ›0­Uèh)D“xäç©ekœ1Ÿ‰0/@GÁäéÂrN# ÊÔÀS™´?~Û=7W2§L4ÚT+.1bySùeˆâ›@EíjÒaLîRÉA/'¯É¡„hVÌŸ/®½u…#GÊ*ùPÜ‹Ì[ê8Wc€©ª•¸LÁxHk…ûùÐR‚~^¢ïW§å¯@%¾=—T¢hÁËGJbùÉ6e8ËÆÕl$¯Ÿ¶æo‰¸³¦¡Ø‘:UÈÈeÊ ¢ ¦z˺‰úUÎXÔÑDÆÆ žh÷ªø»fx;­L½ÅwQÛâ¹ßàSñýûH®S8ÒÎö`–6ŒÌ•wÉÙAõî\–Ž|ðM:å7Œr¹»§= j_÷뉕luʉR¢êdBÇšÕ¡w?)z6;4­ZB…U´†»öo®RPðæ˜’>–FÞl!ç*Ô–½‚bæÞ–ö P‘»U7¦4WÛ0g¦ý¿±óÿÆŽ6|-=Í;ŸˆE3…裧;2*¾ÀD¢%øŸ²ŒB#h¾Ö¶Çãxs?±ÝGûè´õ~9 D-|…KÁ÷ŸáN_Äd6ã+›Ø„£Ó£“_=“PµÂ<¬3äeÉ­±ûCÿæü¶ýDÊî»íJ‚àOÐÅ>ãv¡Ý÷ïoÍàíÑk6ø_ö ñ—¯äϽ(€¡šq\)a÷xø`|Úy®,m?¢1‹wb[˜a‹÷·½€s·‘„\£ny‹§Û*½Ø±ÎøèPEÛÞî–·¶iŽ:ô—÷î28|žP¨Ê½ûë{Å•/ó¢”ûh“öTÏb:Þ†Ãò«Yo˜µ× ÚõôÝ;肊ÁÚ¤ßPþö‹Gj“Ü£ÏØy´{+æ´ªTø7ü˜ž€cj …©+ hçSºÞůp±‰îhEJ´%¸À-™€Žj‘¥dwØš©1MIÞÝïÆYÕWgC…}6æ“=çV|*j \¡á¤N;ŸÓR8õ£¼0ö~ÜõƒÆ@±]UGf:ÑÁf,QÑj Lzª'&Féu*¥.:•(šÓÜ0Ûž2˜àA•–SÊv%¨?ÁÌùÆYCïºÒ8Ÿl ŒnÐæ¹&hýð±j†Î×CxYyWk<×hkY'ê÷æ¾YŠ9Ñìc«:“é‚Î\»o&“}WH[°^¨CXœ3‰ÑT¨C‰ÉËП²ÿ‘Œ±Ï8ROq»¢ˆ§Ê÷˜&ñy°œdyaùÇî÷y÷^9Lµ·Õ@^ønõfQØK?ŸßÍŸð±Ií“$ë7u"W!“”8ŠŸŽñx&`ySö¼öDµ,e;y ƒ©c) fxÔaxö®Ì ô"Üòécüw’Š1´²ZN®W|ffj郦éŒv´Ôê®)ŠNVB©žÉ5α™©+¼†¤Æs‹0ÊÇái¯+Õµ´½?<¼ÙÚ™DBÂÙ6kÝåä-²=Ñ d h·4^-rn-„î[=ðíïê¦hAæ—­;=^. _SU§œjCËý6—Ï Â&W8i߆óm)†E¡ù!NÀˆ,ÜipÛϱÌ}µC:í`´;x%{óf™î[Tô³áÆ+¾·…L¢ŒÎ`›ñµ4v΢»ù 7:­; ]ׂϚ3_›\¬ „öŽ›¥ ë‚ô”¾Fä;~]¥ÿdµ¦›wF‚ðnÑ@‹}ÙµY­GsLØ´ ;Èæý+>· ï»ëìZ2³‹¦áœÍ‰=@õ£¬¬âO’<à» ‰óUUËùFÏÉýö„í¼ðNnâ›’fÕÝXTNe&kwóoøPýðuZGå{%T ûsC^_]!Äe»va)¼õQ ÌU×D•â®Ýu†+ÎÔAbµÝB LÛV`FÚlŸ}Ší<¾vxçÛV§I¤@ÉJçY+±A`* üÏÊ'†óYÑW ÞfbŠ´@YÇôùù8xÅžæ ¾ªnK@ {BKyÚK õ^£T–³©Ýœƒªö6Ì) [ ùQæ"ÉÍ9ÔèTl©„Ô:¨„7Öêåw}`ÚivnN?u5z\ÂÍ0Y ØäÈd§Ùß®ƒ6ìú}q]ªÄÍæÞs;³œá¶”%'õˆá°hVi³Í\¶Î`SÄÒ•ÕâÐèß,t·óÕ•(|‚c.Æ3É'D¶ƒ¤ÍA”á{›˜\l±+©Ñ7g/j?ì{G¯ûÙÅñèí謓bI£uŠj¬ÈÝyí“…>Z\fÈe©¯h»rÇ0P»ãšŽöq,š±é3Xž8^p)X'ÂļÂþQ+¾Üuµ”ÆzÍÁà#ëR¡e ~cÏQdÓÊ=Aæ\õØë94ŽïÚ8Ò»k¡`ðÊ Øiqêîf>T—Õw¼7ãu@[hv%u¢N ¦óŒÓù"£ó(—¥µ7+¤Ÿk`0®¿ñ•YÓöÑ«Lòûù¬=ßM¦}ÓF(ò§wSâu°MI:ìA…\s £Nlt×”›}ÃýãW‡gAߟºJJßoº´‹{(ÓŒ²ãî®à6ŽFÙd@!@v^×9õyç)ýtäCEñ¸Qb@ð1vB•)Ë0ƒåAZdºÍıˆ¼£tÚ]™ÑfRnóÀ£ Zÿqîi½ ^‰ª.±0u «X…w²²·¦Y÷wB _ሂútujÓ–âƒ]kBÕŽÒ§¼Èl¶¶Ç!éLu`ê‰U¢•uBsb‰•GâŒgGØ)‰=¿kO=kÌ>õÌ–±-|÷žªJÀþF¯öÞ]|ØÛ¿8<9>ßò‡q§ãÈž›©ÜÔN™¸ŠR4} Oy”×0ŒN¡£‘KÿxšyP˜ÒcÕ¤LxDVǹ$ ™_œœ°óHÝv fÿjÑv·©¦ô‚ÍýŠ4@z˜7‚_£VT´×›לn€ÄØ¥êWûnãÛÐeɘT„ð0諯Îkj¦zÇx(9}Íî?.ÔíTYù_1 îKRì7Ê,iËŽ·ó­9Zcß. åŸj]¬Þ_º÷"Ç–‰rŽp¥5sìDÁ6ÙáÉ%ã±÷-tÔ%‹ëÖáúú.Îæ`W//‹úØU/OÄ©FÞ¤`9 ý¡54g+Dk)7wÞP9séæ8ä…xj÷¥‚ ôWe0JÜGdG€¹owÓì3óljoØþqNý³²Óªþú£pñ±Æ2άsŸÌ¯çV“13Ë”Ø0÷ƒ¬áTﺦ®…;¿@G G€èéæ”âzíêaÏOçR‰£d™OÈ•¹·Eëþ5‹ŒÏô@WAð~6ò>kûŸ;ó½d]´Ïnh¼óÓ}ú ïäR¢ ¢>áV@}‚`äVf4:¹7êAû}G"ö£¢—ÿÃéÞþ?ö~AÓ7­yøÚ¯¹ ò×LÜó‚&0iÙ¤L×ã¡2>Z"Ûž9žÝ4w.N1–o #öõh%|x½w|ø tÙ_Fgç‡'ÇQ•ÒlãÀ½ÃÊ ?.yãPˆ!«¤Rbýçè¤áéÙá/ ¯wOÜ\‚ 2ËCw<–Iç Ξ¾'òÝ p‰#`béæbF–鎟ÆÔÏUé'Þ/Þ'›@úôU›’;Ãý³WõU‚['Å|A*UluÇ•/¡d‡'ÿƒŠ\ú{Xºýú]GY“ñr¾Ð€çIumØýáI0• “/¤>èþê;~pûººTê¬ÁfäUànH#8ƒhǧ×g{øé/œ•ýÛoÕãþóÏ;[øc«ß÷ÝÓÿ~ÿ¤ÿÛoCÿ×Öð¿­ŽüÁÞ7ßó‡JöÞ¦¬ Àeƒó×ÛžÛóá´8¬Ý¬l'Ãî”RÛð{ùæõééÉÑáþ¯@ž;O¾k]õg5ÀÞC=@’@Œ‘½.Tc¼ãv|ÇZƒÆC¿c|×è3Óí¹"> 3$ègmƒHÀ ‘“e-Õ¦c·Dx…àÌ*ˆ/‘Ö™òj³Tl3JøÐ?k3Š®š£J0¢íß=à)‡ÀžÊ¥‰Îœ¢™Qæ}µjË¡ fó'•8£T—9BNßøh+‘R+¾Æ·íZF¿}#“Ž}ŒÇ™éTÓþ‡œó¼–cöÙ©aç+{X(æu²Ÿ—c¶ù‚¾¨vž¸5š‰mQw’¸]Š3œã¶W¤ }¼ùuZƒM]S¦X”à°ù,GFV¸G,š^žÑÙ@4PjæºÝXÁ0q%<ÑÓzg=ÌÉþv¾\,à}õ–sª~|X¨Óª»õì†9ú¢çC8ÍýGô©“/¹Ñ¤z•¢rç­M‚‚þÒJýòº@+ÖHĨëÀÄŽÀê8,:rØE1'ճНÚÂ´Š¼°ºWÊK¼G¯D×V4‘]a'd†”ààt´ø_PK7Ü5 I%Û¢PKËIÉ:0OSGI-OPT/src/aQute/bnd/build/ProjectBuilder.javaQËNÃ0¼ç+V=%r? BBŽP9 ¶³JMRÛòC­Tåß±JZ¾¬½;;3»Ö”÷´C ¯Þ!a²%Ì‹¡Ý…Øke\* ‚e;AêP¹Ûz­ ZÛP#…ìl¹ò’ï÷Ø®ªB{6| Ö‹QÈÝ}$Ext([ ù}* œ=Ç ³‰ç'C¹ÀV‰"ëuäÂæ+ïvÂ’”†Ûo•Xÿ¡•Ͳ9^JæÂ¯’ @–ÒS\×5Ì54¬8PÞd›@e;½ÊôVSŽ dàGØSnhêv$µ¯çYŒr¡[xfÃÛ;tèž"üAí©¶<ŸÁ óF‚ÄCjøSR¿É6H`h²ƒ²¯m/ï)@·žå%VÁ¬Q GŽÚ‰àþBûL$·Å VüQTI×kÓ,6=ŸPKvšæˆ9éPKíh…9/OSGI-OPT/src/aQute/bnd/build/ReflectAction.javaeOËNÃ0¼ç+V=9€üDâˆÄã gIÜ:¶eoÒJ¨ÿŽ_¥©Øƒ½Ú™qBĈ >BÞ›÷‹ÒC×4jvÖìÅ*¸fä¿5Jâw×å•ЯJ"’”5ã–^+ R‹೟ó"]㌆ÔÉO±¾È+3'A]žä§*Ýh°ŠMжÒSѤOCxÚÈœÿ‰­V €'”1{÷v•Á•ÿáb¤¤i£¨·Ç¯'‰nc7ÕÒd˜ã¹Êæ#ÒK ÍÚÔË>»?ÚÌ•YíY%µŸ[ÕÙÒ°mN´x;/wpõÜüPKž!ŠAóÖPK •…9.OSGI-OPT/src/aQute/bnd/build/ScriptAction.javaeAn1 E÷9…—CU刋î[q‚ŒÇPÓD‰g!îN˜DÓ ¼H$û?ÛÁàŸ9˜ŸQH÷nÐýÈvX+ŧà£4B¢81’6(ìþÈ5aì-# 5)Á#ÙÎ*änK'r’ fn rìÙ ;‰ìæŽõ» ×@%=?Óº¦òóÕoUQÏ_Nº¤aóÂ[Ô§CÖþ‘wÕB'ÏÐ…0Ÿ¡ûŽþH(Ê¿€ËIVÙ0ús‚¯ Rh–žíJK¦+s×î]=PK™ÊX)ÇPKõTŽ:+OSGI-OPT/src/aQute/bnd/build/Workspace.javaVÛrÛ6}×W ~¢\•i_kËSY–cO×µÕq;N"Wbà ·ñ¿wqãM”Ò„$,Ξ½Ížè ý­4.Dž.JÆó“Á€m © ùH·4e2=>iÍp*V©‚ew¾4ŒÛ¹8YãjP[–AJ3ähìó"œ-R©WÌm.ÊgÉ8ÕšùH PKÛA‰;!OSGI-OPT/src/aQute/bnd/classpath/PKPK8O;2OSGI-OPT/src/aQute/bnd/classpath/BndContainer.java•WmoÛ6þ ÿá’…œyJ>7u×öÖ¤iãÅÆ†  J:ÛLhR )gÞÐÿ¾£Þ,Ù’Œ‘Çç^øðî³ð•-ØŸ‰E?‘ fLÌìêúôäô„¯c¥-¼° ó¹ò/®ëS‰å",§•^ú ôC¥Ñ׉´|Õ­U™—Èfr5”9AÂETݼ[ŠE²äòpMðÀWfÉsÈ8 !õ >Êh¤¤e\¢Ú%pÒ¸nï–ÿ;= .™c™%”ÜDZ½¥ïûál6Î?M¾ÎŸ¾O¾LçOßžaßö¥¿]=§íP§Z½`haoÄÙôu&ºQ‚t .$!Tß}Á}½ÏN…+ŒÜ7GSšQ‡WX“«ïpî¸ñóò®náîòâ"ßr ¥]%¡3åàû>ĵ« &Fð×äñ Ô¢,0. Üü ýZ¢­Í¼W³;PJ “¹ûdy-pF•ïÞe‘„Aé›ï°WL.1òz×;D¾ï,C©irÃle¸ÒJòI—×ÇÚ¹ÁQeeø‰k (n µfÛ{n쇽ðÜ€F“›“±]®Qczœ—°@®Òs”lMS  Ó"ú ú°+faÍœ„J´›´¨›¡RÅ%ÕnJ.ìÛ¶iµ*ßê³( áU"øÑ% ç—×ë•opjNî,¸66õ¸!ŸÞØÖ¤~$¸¦¥·}˜dɪ ,ÚÒ EY( ‰ñ›w9Ž¢ ±ö®zÍÂU¯5®Õ½«Öèˆ6CݘmŵZÓe¦|"¤wþ)Yý³•JD+¶Á4 —.gpÞVŒ_ ã:x”‡"Eá‘Ê«ToÀÜý´»ч ±ÀiF­cG±ö/‰%ƶ¯Ã ø›J[“[J`r JfÞ‘V§ï§ FûJc»HæÎÞÛ•’Þ—1j»Çnì——0Æ–¦ÒS—U ]½‡ÖRJrÅ ²”Ö±¯}ű2tŽN´Vš89ÈÀ:vãwwÒËDÖ¸‰Ö\ òuv }n†Q‚ øÑmÝ«YTb2däB΄o•›*αŸê;¦ƒ(t7žïÊ_JêRò¼÷¶Â”GÛcÝëI½: 74.(¡“ÇlÿAEÎådoNµèt*˜žà‘mÝËŽÙÙη1Ò`PòÛŸ?M'þôñán2šÃQ²¸‘&£î˜ë‚5yâõÜÇL‡G©PV"ÆEâ&þv$Ôêh¸C{䩛ׯ˜~ô4Ž›Ð-AI€ì¹£~{äeª—÷<ÐLoÓáÅýóûÙ¥=bXÖ¸,瑊.éZ¦ëÖ ÐcUZ彯–¹I{IãÉ?!Æ–SîÆVn¹ªþ0~€abÕ¯K$R2K=X†¾¶äú¬Î(t¯sÍÂæì³çiå³ò¯F›hyÐhçRy#«ù† ƒ‘¢–7t>}p7á†RŒû5^e¡Ò-¹ŠPs=핲-M^ºè¹yQõ«¡<¨pã§êA•O»°ÎÎØeA˺ÿE”J8!Ñ„š§”¨wû9Ì9=Ï[PÜ#Š >s5îmx úŸ¿§ÓûÛÑp~ûðµ7+;.I¤­Arõ­u+¹åLÐÁhÿvÜY¼Çô‹ŠP4¢¼ÄèïPKT±jÚÖPKòS…9=OSGI-OPT/src/aQute/bnd/classpath/BndContainerInitializer.javaVËrÛF¼«Jÿ°á% "C÷¨r°%§¢TŽ—©–À\k¹‹`¤i[ÿžž}à!Ar%8È&0Û3ÓÓÓ@#«;¹!!ÿè<•+S—•–Î5Òo/OONOÔ®±­¶Ý”TiÕ8*+ÛRÙvÆ«•g—³1jãÎÆ(C’U§t=><œ¹ÀÜZ¬œù–’>ÀI”ãH¶Õ)RWr/•Fu„îëSäBk-ù®åj¤?2vŸ2€…?©å•Ôê(ì[¥H¤VæN¬Èˆb¾íˆ2e_™úW[“NÌ< E®:“àIÓF¢V`W’gæ…³;¹3ö`ê¬qçâh;QI#¬ÑGÑ5µôô š¢¥uKyD¸MÆ»¥8lQ7N¸ÚC œßÐ!uù¢øx•ªñÌKÔ+$rîÄ+&Òá~­ÖkÄxÊŠPe DE9Q!¢ ìÖ«a`ëÖî™—ÀžÙ“¹8=i:Ì ŠÒbīܿÍxTÑ#ô~•8Àta¥4형Xß/Ð1sŸy¥8"e…‚¥ÐÇ7,ì›ëñCào‹k(ûi,–—4¢]EÄèJ¼thCþšÖ²Ó¾Xòt¬àROpR,¹›JY×“Ž ž.CrÐ}FަÂ×™¸’Zc\A¨ÞÝ#\zšÒí•Sa³÷D¿Yæð‹‰æöVÕ#¯,nÂnô­ð¯sqó3öûM¢,Q·$É—ß¶ö€µE«¯?VÔóï—0Hñ‚G¾,CÆv6Æï'þú@4²Å®K9¥—\D)Å;~Ïù΀ }<fs Ô6áA¡Q™-aG~kkñ=ûæž{)°Ôyù  Â"“q9²¤µ(R<¬¥ÓzŽ©0ã YÅ4*_w‹;WÜÄË×oßþþC¹.½½…ͦXžÏŸÎ×â L°8’ÆB}çX‡;p5ýްe”$W¸ÿìX,×J|¾^\,“¸ž¼Ga'¶Òl€ˆ²“6Ë ¶HU 3xáñë§â… [4Šm韯òǯ†XBñ@µ©¥j˜Ô±ÙÆyZ›õÏ÷QPRäÑ¥¥+ç·je­&Ä">Öö¸æÙM›–:»vãwAüøØ¢çŒÿÝ̧Ń™Ûnƒ1…¥u[Ûé:·¹J†ÔƒyeùÁV¾6¯ÿÇ”ÿq®“ÿìPœŒ—ŽfŠ.ž+4«j\ð_‹Ïý^Ý?uàq¢pnn2÷çÑOÎzÌyPòUغº˜Ø×230éþ9¦§†7 Hûòœé‰/_˜äƒã||Ýñé²+mçË6æµ)?‘n¾%L âwÙB|'å½xÐö«²»~Îò`žð‡'‰?Øöé*Êä¿Ï7ÄÁ=ÏýÃéh¡õb’þPK"Bµ£8ÏPKT…96OSGI-OPT/src/aQute/bnd/classpath/BndContainerPage.javaÅûoÛ¸ù÷ýXg8È£¦×·Äv¯>xq–d-°ë¡ %Úf*‹IÅÉÝò¿ïûøÐÖl§z‚Kä÷â÷&™Ñè+3BÿkNÓ8ŒªTFõâøù³çÏø2R“zKC.—ÕA!ç!‹ž)FB²P2%r1eàZ¡òTó%kƒ¹‰µ…Û2Ÿópŧ2nåt3£ o9[1¹ÈRjƒQ+½mŠÝ²T·2@ˆ¹¤Ù‚G[az/ò­|V<ž3Ǩ*6ÍyR[B9•%ùœ§1˧ ˆ±19Kã¾H5å)“èìN³4Vä“шr [âŸ?#îõ½‹ÔÐ{mC$«¸HÉ(’xõŠd’ßRÍÈi¤ñEHB‹·“r4„eA÷ØSðè×tš0/™Æã:À…7,Ò`)b–¬¼ç%2¥ŠÅ\®Œ~ÿ÷„nÊ÷BšW/_:ý¼$6£y¢ è@i™G¸ C¢ÀzDs€ž2ÔlJ—ð3IžiÐŽ'ðÊñ¶¦Z7RÐE-zqUž1tÀÎÁ?àT0 ¥y’t+ðLJŽAg˜ª¢–èÕÑ3_Œ(¯$E¨"ÞÉ5LM“O¢beP¢\Jð¼&*Èh†ÜH‘T3Žw'MI$ê—k \Ê4×Z¤5©qé}ΨYZe~þ¡4Aa é!š,Q·-^þ ‹Ü–Rv¹ñO¹æ4ῳ 1sUÝ¥W°5O3|Áp˜jyÿëoÝf_¸<&æ5·Ìêü6bÕ‘öVÂOÎTÍ›*ž !˜>îçMô¬§s÷ ‹} ,ib?þ…à#Sµ§ ²’B;Æu,"j<´.éWv:U"„ŸZ`¼Oj~SbPª˜ƒõæ-~`ݽ@Š$hËÉè—BqͶ™­Nª@\€Ö¨™¡œŒŠ·’²U9X´¹útžÿg<®ª·À !pƦ´ˆý^È¥ûìî€PM ÎÏ’ÇæÃ¿„‡—×£þéøËéxôóù—÷£ñ¸îrøü¯@ ?L.Gÿœ_×0Úù¿ ¹Õ¡#˜Ïn™ö]:ðz,Pë3žÒ„œ™LBV}›d¬ í`‰èT89VEr8(Ð0ÅTÎùO6rªe†ÊÅõ’Yü¥ÎÑÏ5¤*œ hY>ÕšF ,ºÁ룣9ü[ ¦äó…Þ†ø¶eM#—äZ`¯¡+:nE¦×€bÓ¤nS‰?šŽË–÷nå«Ì®+ÿlr9^VÙÛêrR%ƒÎ`hÛuïQ·iÞÀ@&Éšuš{Óˆ‘°Y‹º[Qg¢m·O¼ùû†Â6-k†›á ª©\qÔhµžÖ >03¹Öhø>$è%Û™J«·Ã¡Øj€¼>ñX/‚Žš&­žåi ƽº_N&ÖsèQÚ]ÑKôvØ|>N*‡UJözM² €•Î ìhbš/õHV»ª*V 7°[ Ó?NDiןµràךÕÀvé\Z€[g*ÏèÊ4ÏОÆëÓÝr#áWj'Sì! Ël1t—ÀBã”å~°VoýÃgÄeù.ËoÂáå}ºÚg$ƒå¤¶Â|v†»6ìÍL_s*%½¯¥ªêóý²Ž$ÞEÌ–°ÆUø¶XדÁ„œæZÎ4±ÀcGešˆèk;. aç“ê+È9_¯%tGíbm»U¢ 9Ž~;^·×C‹M¯sõam«³c]K¦ö/:Ÿ>Š—ñŠþ‚¦s¨ñ®bÙcƒžŸˆ$!T¯Y Ök œ³&ÀÃF¦-ã`L§,©G Èúx»û–¸³Ä>ÜD°ùôîϬç÷`ŸE3óiÌî¾YÉë8Þî8Çû"œ§óR^“.¾EÜbŸF"ÈcAñÙõd¼WÁŽãií6+äè]³íÝš#ÍX|qÂÚÔ5†Þë=è¹zÒNäÇ=ˆ ¥tÇ&$ÞìAÂî·È_I‡ø *£/NÐÜ䇪 !»ã òn—üD:ö½CÞ‘ÎOC¥ÛifKÙߟL@Ó8KôÙ`T ?L÷ò=òËwÊeS!FS•_rƤ¾ßˆ&r™›êàŸÑD±ÇXK²¥¸e¦Á¶åc“ÐmOд;W»ÍFX‹%`ÖÞmÏÙF ö(Á¥Xl(G™!ž2·Ôû«{`± ñüØí$ :1›­`›lÉtÖ£«A¬$¡a·üžwœ¥qý¬áqŠn7ÖCy,´µ 窰ØÝùƒ'×ßaÞrC!W.ÖB¶±JÓ!ãñ¥Û‘ažs˜öܵØ×ÙÜ("ö$×°bˆFF—lW!\ €l“ú.l{f°3¿“¨ @²Qíí­k¦Jÿ90ÁDÊ`šÞãê{$ CÙ 1ÍôÆr(íÒÞáÅá…½‰z×¾«Î…=¬ßFh öfŸ’‹­ò‡XÞE…ç/8 j/ð°×¢+ý ^‡GO¥ùƒáÅ#u2õ‘'PÐaA¬M?D¨9?ÞF­úÜZ]œ¼ zäóç'p¦‘X† æöF3¼ÉS®[dö~îüú&üGïm÷s§QÊ»÷NZCsx”˜n¡Ýzí =TåDû³KwA =šd3ÉÔÚ“`ä'ÂÁðâúÃØíoÞùç›n*‚4ѬîŒ}v^¯~<šìÚïÞ¾ÄúB²]ä¾e'½‡•ªV¾6ôQßï†ëü“«EÐrá ¬‡ªêÊÉG„ß_ì¢a1Û¥fá×.ÂH§º”Ñ^xF%ø:©ÝÃŽŠ+8Ž»®3‰2PK ÔHXx”PKÛA‰;OSGI-OPT/src/aQute/bnd/help/PKPK·­l;'OSGI-OPT/src/aQute/bnd/help/Syntax.javaÕ=érÚØšÿóç2©jÛò–›Û7wƒœ0ìN¦sË%Ð+­Å6gj^c^ožd¾ïl’-`{¦š®võÛ·sX˜“¯æŒó—(¤úصô[ê,Î^½²ç ÏÉóÎÔ£Ðvôƒ³õï|:£øD>âÃ8öX÷‚™Íž,¢±cOÈÄ1ƒ€ —nh>híÐ9uÀ4=7M|÷í×ÔvM‡ Cßvg$çuKM‹úg[õq Ïv=胉KMvê›aH}7§Ó‚·Øn¦;Ó‰hêÃ`õÛ?³ûLnmÇò)ÌĺC€´€qÎTÔloeuâÒ{ÑwïUÞJ·z]ƒa»×½iŒFƒöùÕÈОoìJCmÅ7] âÐ#uè$$á-Uϼ)1]À$#P‹pí¾×ÉÁg3rB~bäH‡ÿˆ^yÎuŠ•Ô?W~;ÖO´Sýhÿså9gp#ÇyÆá®©oOmêë{ƒF÷½±¶‘#×rèM°œ=àÿלӗ"²ó«n«cÜ ?]ž÷:íæM·qi¼ Å!Éð¹3ÂvD†4Ç© Y·z^:âcVåÌUœ¹>ñæº9™S}êyºeN§Ë?eI\!ªö·”_‚´ÒbìeIëEŘ™+ƹ%¤ÙFBË‘f/B„R¦ë§z[‘d[ÑèóÛ›U¥ùgÔ—Ã 8FBœØl—  /°CÏ_jdá{_€ú4âù`Š8ôEt¡˜äYÇ– —‹g]´0ùžo@ùÒAx/Â{ré¸ôÇÊóÏ$_o6³ÄËM(_zèq#xo#æºkd›|%ú~Km¡ˆ7…Xo4GíëÆ ÐGeôi3Í0­ÎÅ^cÚw&Ú}TÁK(žºõî+M}PË÷žÿ•·^äXÄä}hRœ{î„âþýZ:É ÖJƤ5☀š'ñoiuÚß×^=d½AiXáÎZV‰¤ÝĽÃ( Ó~0Ú-xç-`+ )ϯ‘”]¤¾Ïêÿú[x`Ê7Z=óü÷dRu>“ð{ƈŠÍ.~éöAšƒî¾¶ À›‘ñ¾7(A›M ±Hp î[ϱb"$æf5  Ó‡qì DÀOd{ÄDPY9x„4ÈÛ„•† ´Œ©a@£Ç^Tsi8¦¦h_¬¯š … £êŒÑÐØfÆpPÿPhˆvàŸ[ 5æ!Ò<¸ý{cÀô"3 8ðPUZ¶Üó‘¾÷l7°­$ÇïÃp°np>Áf´ÆHܧùpntãYdïþë¿uø…i|Ï ÕLKÉ>| hàâRh:Çš ó0ˬ$A‚{«‘CÇãÿ÷uõÀÓÐ5αÒÙ#ôŸF÷½î„M£ÕÃa D"x'aò¢Ä&èÕ;@Þ„7!¦h# wG]Ëó eKz‚9y{tDzÁ=°x¦¥‘F€ÔÐÈè#ùÛÛ¿¾Ë2ŒôžBݽþ§Aûý‡Q ,–¾=» %<Jxȧ)v$S æð(§¤ÔU³ÔHoøÞ&{“}rrtt")å {mÃæ ÝG]¼Û &¾½`{XãfPÆ,þ7aèwY°ÉÄà5ÒpÐàî ë@€îr%æò‡€ÄN è5¯Pð&ÐN s J‰v>Zx6So¨k-o¡¶ã˜7Ç^n6Y܆á¢vxx¯‹P²ýÇaÓ³èá¹k•“0N,0vP»™K$ÃéH8µ'1™(1a*)¿çS€r’V ¬lè «€ Æ BWʲ§SêÃ3Ø H/®¤,ø£ï 0:°kýÝ[´ïäŽ xXdmÄ@Ô’`«à˜.Q¥Í¶‡-q+ û:F¨>Ó _ þÍâøvz¢½ýQ{÷V;>ù:©•u¯.ÏÄðŽ(#Ýè3œâ$tì uºŽ_7¦ƒ¹9¹á5-s ¹7GÔ;¢³íâ7f-^D>¸ÉTI1ºÍ¨ÃŒBoŽf~àņ­ *>@’ñéï(p‹Œ—°”¸?3]û6OFľR ç-à+fCè0Ô¡˜28übŽÇÔ_8úâv‘5l’o•!¼«'ú‘öÓOÆGÄ]£ód 'üØÕØ«$=Θ8s©è ©<&'Û¯ìk¥£- …Q6ˆRùb2XÓ EäŸèYÿ\ácŒ>M‚nA>`ô¿D¨K®Ñý¤Dcv÷çÒ»DVy“ÔÝMCwzÍF§ýr*ºãMLGÐúF›Äñ„"SB¶Þ#ØØCÕM𜗌‘u¡]Fl’vµÝ½8tŽ\)KÉÈ_ÄáLGLØQv q6à}º±ï¢Ø®óC0˵Ím\'Õ††“"UšMmã Yln›¡Yw@ñe£Û¾0†#1ÊÄrJ"4D‚R“’ÌKÇY¢¨<ᘿé7;êZ„XWL·ðÖLE§žãx÷Ф8NY±å¦q5g³!Öw™( -ÿ’1;¸È‹'ÙÚq',a*¥jîmÇAŽ÷`ÜXdê{s¶E¹Ú¡H/u1>cO‰ ' 3OölÍÄV”…vÖ¼¶ ƒ“\#·(~«éÎ éÈÛÒr‡}äÂuÕÈåR¬s]Ü%%én@µ¯f¯UÂé2óà5Ig®x\@X.k M,ÔcßdÑðÄäayŸ,ž\xñ¨éõV§sF¼@$cé~ÄO2µQ'§úqžÏZÚãÏ#qo¸MŽ–5.D¹j2û;X!#;ñ]Õ/ÍIoX §ûÜŸÿ xB{j|UCL«ìï š‹w½žÞé­63d›!BL qu†¶Ò”¾aaF÷ýU㽑ZWÇtgÖµ‡=òîôïŒ4‹åˆNu×Y_ ã/§?è5á°7H­Ga‘BÑB²uýáÇw"Oã¼TÂ#&m¹ —¥Ü‡FÇh2³ö¢Ýñ¶bn IõV:Ø¥à¥óà“Å`M.ļ2F·P0l»Ê(DöTDíc15qÌ,ÚX¤ó´5+D’—hTKãía²*ŸŒæ=·¿‡¹=ø3«ÃŸÓ“â’™jã`zšq;0~¹jŒ–ñÑh^!ðîu{Ðë^ÝÑ·ðôŒ:‰p›†{gûž‹ñ–¤.È 4SÙи£0ˆ$æD,‚xÜ\Rÿ ÒË×"…™·Äi¶šÕcýèð­k¦©ðc–ó—!U Å1\± b’õ#ňH™4kÉ(hÕ­Jß"Ï~É(þ ½7ïíð–Äå G¶…¡¢é¾'‘kÿÑâcŽ›˜ód’GKÍsìÖèègÈT• @XI±²¡3ŒN84µúQ¦·ñúÛ¢0éUŒžÒb¯Ý}ß1F öZÀˆ˜|,’w¤­d֪뀥ç‚rk‚ C+Œm9®¿¡çÜaF–42ÓG?2sP;Pìòëq¦¦ˆg*MÌÈDLMµ=d—’„ó‹Ää„ö"^,óFÖ'æ4ˆË %¥è Ý\ëm79\éa1sÈA–±uEÊHFY1È›²P0ˆ ý†PÖä'EH£Á•Ñ\4:CãyÔèÅ ñ¥7ªÏFó{[–²ZÂÓÁLÿÔ7g\#PMôyòµib(ÍÒ@!RY ZÛ^ˆB:ÈÞ °™þvÊ)ƒûhò¢`6¼µ­X&ñ hâZ€¶¦so.ƒGåÇ£ ´jh£µUqKØËqUÓÊWAç+£?häm´G7`赌¾ÑmÝfÛ¦¬¾2Û{>Ò‰W6j_½«ÑÊZŠ×sz/íûËÞ={üªßjŒ Œ»•‹¹]-@wÓŽ ¬mИâ6k¾ªþ¤Nš`pc:iOWÄ ï dÏú©H^¬Í°ÀCCKRX-2ŒOÁ:bƒ‰!T޽È~Iï-‡BíË=¼^¹•¡¿/fVHvlt7L]M—©”¹fè Q‚•ÐȆȴ*-•Ãæ‰4mÃqlëVó´»m5?6˜Øk*—.oHU¹*Ú+Ü”«ë'§ú[}ÙŽurtô÷£Ó““cÎ%âbÛî¿õ Œœv³}Ùï F7ýFógp¤sÀÐZ‚^´'mv`¦ÚçoÖQŸå,D^wÂŒ‘˜Á,>8‹³ò#9Г™.¥èü,Pn\UÂJ\8ÑÌvõƒ¨ùk»Ój6-4þT2R`vs×M‡´•:ïmñb|,‰ã¡G×W:^z p˜ÈJ¦G®UMÆO…>|Oý³âJj4¹Å\Y–wNÅAIèۻ4\Ö:W …ùçæWÔ&Ž#@$*8:iX5&©ºž8/†iSw ¢@2ã¦;u'Žðp»åE¨t`<$_eéÌåÙ IBŸyq\›q˜ƒæ¶LV¥§Vh*DÀæç‘3g!¶÷Co'´©)ëŸ+cÓ×À·SÍÏ·v·Ù¹jÏ€5^ñ› Yк³ÁÎEƒPbY›šÈ¼E­ÁƉžw×ÆÇ—Ý5ºÜ;ïœ>$w Ü9ÐÎMßl[f°AqoQy±¦=˜„±Yy™“*?`HIëóì­ÐäCcpÝnâ°-¬ÀÂ`ŒU yE44¡yþîx3½ãÍd¸t˲ðƒï•ŠUðáCo˜?–‚ê ­åÃÁHÁïUšZ8j2Èi¤†å@ÅÙzpž‘•£]Ÿ+¿âù1í-þÍŽ¿çW;>•õFF—¥Ìv ÿTèCH]æTð@ϱÌÆXJÍ’r«†ºÐ¸,Rh.`‘2ï‹ÙÑázlŽ‘¼;ÏóXÔ"Õ\µº:Y€ ¢>h¸º‰,Ä.Êg®–]©aÓÃdÅfÖ,íäÃ"T•ô|RÅ!.ÖÕ¡“²feh]è’F–^Ä"¶`{(F•ÁØ ¾Ú‹Øgq³Í.·Þß(ŸH µæÈbUÇè/èÑ/´'ú–ЦŸq_¼Þh^‚°:È-R»ß÷¹žÕ“Øk`\ö®ißÒ\6 sO„lf6l8aãðŠfÕ ´òB#ÞgcWÕˆÀ#žÇ\ϧê²'ÂjØë°$`i(mÈD(“öŽÌ9È«Ê(cŒÆ[{r+<Åñ·ØÆTãÇ{BŽŒñ8šª¦csOMÛIØœz2å¡jd7¤=ÔLèdȆEHÓµzÜ'a±j%GZ“uj„G5Še!_ûqâE""Y|Ã#b9ê]$]«¢¦wc$LU K_šq• ¨ÅDcAq~z‚D,,"Û(žÄT×íaû¼ÝiÊ{‚2î¬eáóã•{-Îû‚à1!mêXÞËr·¸ [daœ‘snR2ëksùT„#Ø ²+ã 1`*hÎ!VšÚ˜¬‘™Gs‚™ráåkka¹J‡™`Ø^mÇ—µº€ ²˜x«É¥ïœó=ªÖòõ’"5KJ’=!÷cq·W.÷è:c«é¤ \C -U‘Œ¨•þ:E(øê¤–GFXlâB,þßJʧbpØÞ•¶ßzS©±³Gãöœú3Ķ™µ€EŽ .¼§4yäFpŒ¤“ïH$8Fujû€x€¹7}<ˆYhа©ªbQµzbœÂPLÜTãïÁ 5êûž¯•a7MLûOûȦ}äÓ–sÖœó-“B )ràöSÇ2c ¹’¥odtí‹ésl‚YA,JiŸ2ŒO¨¡‰ë+²Tb• ‹“Ô1 ¢îoYí$Xã8ÄÙ8p‹­ðTqKêv­‹Ì.û¹ i˜Î‹£9x=ìQOÍœZ 3ͱ–]Âãõ7Ñã;žrò½LK¡Š#òëõ7˜)«À¿¼ÕÞ°ÄÙvW üVS=úgòïö 4{ÝÖU;+<Òà5ù&Ë8°Sذev ßð3!Ü\–…î> #ß•"„IpÙ•‰ ‹LèL<׊찎txÈH,yü„t)/tffJ;2¨Ï/IÆ ™º’ßóS0 ð71ZÁ…Ÿ5Ã&²2 5ø6‰‰¦¦J®æ_ÁR©Š‘I0RÄíÇ9g9E"–Øp§÷i`ô{YDÛ½ž@ò"÷5ÄnNºp¼eN&³Ê[àõ‰;™»Ìb7£¬×íðÐu¦µ=‹3U;;UʬH‹%žõO^ÌÜ ‡mâ-lI§–LÀ ö³cœU˃~x†»¾×¼>~þ¬wîþ“¨S„Zñì½Ñeº?gÄ„øÁ2 ‘Qá!ЬK ¶¥]’g$¹½••m‹2dF]ÊS­¯&ã'03aÀu>&k±ºªþ—›À”|?Õž‘‹F»sÓû9õ([DRÇ%ÞWv§M½£ý”QÈùOì°ÏræaÏ*úæÞ×IÌ‚Dåv¡;žÎÉŠyñœ §_fc®ôð’ßÐ" ÿ~¨þ ¡e¦ì\æâ/s{ûÁÓTÿä=Tò ýÞ·C¬?Zò~hÄè2%ó>¤úú¿—4 þ÷C}C¾rÈ ƒr5hAHÝá»—L¿ð`³N>‰H¦Lšñê–-ëq¤¬ð•0Žç…‰\ýF,I@ñ’„ø64„e-5Ää’kxبþT­vÙø9 F`ÃÈQy´•åõy=I T–l ×L™ãÙAÑ4>Æú› æñ!EùQÐÌýc÷Ù;ØGU~†÷mÕXÎ 8±áÃç |<|}Œ$T@ðJ³ç7‘Êþ«ÈùŠ<¹ì“o:Wá‹,jÀZ)™Ëç×P.Aø&Œèbt3`’«Üž`ø‘Ò¬r$iÝj|K¡É"e®ah2… Ûä _è™:¹4F vhV.E¿¼(ËÝžñq4h|0 "ðtC‹/IÊwpkau_)] 7qd.ÊõèC蛪Y‰¢•Ýt@·‡¥(Y ç[PДÅA-.6ÆJeÌÙ vzNÕÕíõ³„K ?Ò¨³ š°ö™žÁ«L”3‰Š>oÝ@ã/­pûF«Ñµ›‹øÕôw°¸³D5L²œÙ½ï±{?Q©¢Ãáõ;ÿÏ{ë\½og¹5¼t>!²ÁŸ×ã«ÄƒÞ¨Ù?Mp5=k‡ãÂ'ðõ Оôãeíq›þ¹Us;) âx zÊúWWMÀÅ3â@:“ Z°ÝÊüX,nœzXŽñ\T˜TèÒ²—v½pr¹\©Š¯sÏÉíx*¥Pò°5æÄVe)ö 1$uÅ&·•Û²In*ü9»°N¢‰« w§»áÕynˆÁd·ˆÀ^dÄ.Þ…HÞÈHžÉB‚f`‹à¿,¸S Ä=12Éj‰<Ì21}+gÓÑ8–»›üÊm6<¸êö`Î FíLC¬¯¼ÞXû#`‹¢x)ö‹aKìšš0uï,æHøÕ²ÙL¹ñ(uÀ¿W?Õ€~ýmÉýÁV†Ÿ†#ãR$²¶Ó°,¼pÑr 2‹Åމ¥ÃºòÖÌ{ËΩ»ï5tÿt°ðáVg•¹‡oKÜñÌ~ÉŠä°¶Js€+Û'ãÀe!AÙwì¯ìÚµ8O¡%Ðϱ™Ä¶Ôx˜“·™XG:íñ¹òÛ[ýX{«ã¹z|‰\;ÔÙßµb¦2÷u¯œz¶ òK¶¤kÄÀ(÷ú’p s@:‘).Ée –&J”G¦`wªÿ5Å#›zÚ®¯/‹÷lú³ˆ*MlÜvO⤟éRÆ™ÙÊ¢ö¼Ê–eJµ tÊJKîmîV/Y£\Ž7«¶’r'ž1ŽwózõãÜ|¨Ÿ®a·‡8™•›*ëÇ78J–âi-vq#?‚3T"fÀ"vEN­RŒX'À>*ÅvV¯Ÿ½þöoß¿kñWoø75³›Ê wz}ª‹ßZâ¿$nW¿4?ñ›×5äF§¿6¿PýƒÜnè²·rg{|Ý:Ržø …€ÔÔeíû+W²ãœú" ÷±Àžâ7eØ^ñ¿É}H«Œÿx’ì%>â9©âwšÔg~p: zùÃM"Ö(·¦ëºú!¥äšÑ¾+Ð$nJ=•ÝàyüSL©¸Hxÿð”z"V S¿1¥ž‹£ßõÔC©§bð8õcS+à㰘Ѱóï%7'¢$ñº²z|q›:§ÖÕÿš­~S÷ä¾²z ”mµtùƒÐ½)²©aY øÀо©’  ÷÷Wÿ PK0À½»·JmPKÛA‰;!OSGI-OPT/src/aQute/bnd/jareditor/PKPKWQ|86OSGI-OPT/src/aQute/bnd/jareditor/JarConfiguration.java]Ë1Â0 @Ñ=§ðÌà 0²±!$v7q#—GŽ#*îNÄØíï7ŠOÊ tθԄ'qµsòjjj9iq[)2:»›}š°¥H„X¨w¸’]´®’‡‘‹V˜˜kêpÿá7ÄÂ7üPK<#ìqŒPKX|89OSGI-OPT/src/aQute/bnd/jareditor/JarDocumentProvider.java½VßoÚ0~Nþ ?†‰¦íöˆúÀÚNbZ•öì8G0KìȾPØÄÿ¾sœÊM‚uB2ä|÷}wöÝJ.~ð ÿZ!ĉJã7JÔf†²(µA¶àKK¿Ûš´Éb¹,-ÄBˆM¥Pà|ޏ,f\@Œ°Â¿;X]q ¨’qÉÍ)Úu>ÿ:ݲJr)˜È¹µì37ZT(œ½”)F(98‹e£ƒÍ_aÐÚ‚T‹ALŒTøÝH¤]]!Y áXj™2žõYßÏ¹Ê ' ȸÉnz,¸¾fÏã‡1V¨¯2P`8eË À¹N™Å* Ã`îa¦é£ÏqŠäþEZt‘Ñè˜õ²Dë¸b‚«)_B[ùYU¬Œb3ž[%êJÿÑ ­Á´h¾…z çF¿XvO ú¸P¢Ôª&A³®¿9c‘÷fRYäJ€ž±O2‡Çº‰Fª¬Ð'{fŠpë‹ü=ä ‹b3·Üùˆ8œpœG½µÛzÞ“ZŒ|¼°îìK×o‘‹îy§ -º"sm‹‚&Ǻââ›ÈÎ%‚`sxx©´{çwþmŒ†JiêG"|Ò)äŒjÝ3]ÖOªÊó×íÔ­ã:Ý´M¼ãð\«ÌERnr&E'MTQ^–çÍq–éZ º"%¾Q;ÄÒ>@xæ„ýi|[†¢²øö:a ÐKø/ú×ðÙS]tRMÎ"²»G7¢WNFÔö‰Zƒd¤fì³-ýmßM÷¶ÕÉô¾ß]=}¸<¿À}¦HŠ“1¯;tuà¯?®†Æðõ¸B6Š^PV¶‘±£û^íêiP¶þ;ƈPjÇí?“‚Kå~°Uã~¸å±W1Ý!QF¥mžS=é„ÔÉï0±:§`/Ã}vu[;–6¹¶ ·ŠCLþT"WivWVT‹2Ýì&ü PK`v¼ºI PKQQ|8/OSGI-OPT/src/aQute/bnd/jareditor/JarEditor.javam½R1 „kü*sÎ¤Ê z,ÃÅöÈr “wÇ÷Ç?.\ì~Þ••Þ±cÀCQ¶mpö …×(;cü1EQˆÒY¦Þ§Ì¶x«ü¡b¯+”JÛ{ê1g¸G¹- à2ìÛ¬‚¤OU˜­Os5?úÆ7Í Âx¶[²b߃¾2äX„(†ßAõ1,df}ígÏg–›5³ |òŠM³û¿ÆE*G IâÉ;–UÇíì=ÌÖýG_Ò/ã]“”©® NÑ; aTÞÓ0G^ÿ7—ÄbÙ«1­µ€ÎA¬sÖ½N;Ä „*ñÜi.æ PKˆÿÔ@ïÏPKÛA‰;OSGI-OPT/src/aQute/bnd/junit/PKPK2£$92OSGI-OPT/src/aQute/bnd/junit/OSGiArgumentsTab.javaÍWíoâ6ÿÎ_á¡Ó)tm¸›4i×Ó8Jo½¶À Ó}¬œðÜ;²h7ñ¿ïq^À$k«jš¿4®Ÿççßónb<Ðý#Ñàú|îÞ'œé^«Õb«XHM„ ]"+p!Á• D"PîI¯^(áš­ Fd~f‚M «9¾Ÿë&msÑ„KÆÃµÑ '}I“À†ÍCЩ ‘½ ã( OÏâÄX@‚ˆ*EƳ¯¬/Ãd\+ú5ð¹"}_iI}“’¾`a"©f‚±¿[W¥4þ? ÆiDfZ¢‰¤ïyÓ»ëápBÎI?ÐlMµîäæÏ¯W£»«‹Tý5ëGÒv7ÃþtÐü>l÷H·ûn4nfgß=‹Õt8O=|{fô«óK¢µà•ª›)˜xõ2úÒP‚*ùÍ5@ÜkÙV®›“@j`´‘3}Å"¦ãÚÉ£eÖþ,À/ô‡ÍþŸN¦pJfß=ù;½¦‘w`B˜9öD²Û,É- ¨–Ä>g~„λp1U¸ža&?x8ÉÁ®¥m]Ðb Sq=U†ì»˜?ÕG¯ìUç—½¡mo§4t, #7V §aÏÃY‰Za3¢\À‚&‘V¯7¹Û%ÞøbLú‰g!p@˜“è¥À+tâ—ʸ{r’©žiZMŠhjßèšb‰‹{dMT [0DñŸÒÓ­“ìYfrНÁïS æðÙÔõ§núIØ‚pÁÁ-$Š¿¿á¸§«*'ŸØn®ºp‘÷‚·"_¬Z#vÃ.ùøìÞ•B³P;áÔ€haú—d°†”-(×ìÚùqelšä&a>YÛç4´RÆê¥Ufk%PÞosÿ™ž‹ ¦|eÚˆË7ìK-tlåpœ™Þ~ÐÊøÖÎÅûWÎAC:Å9ÉC½Äað™|8D6ëªðU‘ç˜Þùo³IöM2¥â´%™íT|@Ö¾»Hás‹ËÓôv;Z÷Ö÷yš›ÆónöT.€*@ŒÉ¶nîGòþ½ éÂ#SØ/:U^0+¯ Kåøªm«z·ÿÊQ ÞKÛ7!n,Ãâ¨ÿ'=äùë–ü·dÿš:¬ç7n#¹/^&ÕeSÁ7øšk妣u2¼»Qÿvxü¤q2 ;¤ü Ü¶þPK’??ÎÅÏPK¬‚299OSGI-OPT/src/aQute/bnd/junit/OSGiJUnitLaunchShortcut.javauAN1 E×É)¬Yµ›\ Ë. ¡¤ŽIS‚9ŽÔ õî„é°Aà­ÿûOvõøî#îJîÀÁ:'ÝÙ1µrBÀì[ƒ§ù.=¼ŽÕ£ïŒÇùXD±+ÐY‰C³Æ‰Ž0§ÚȂފ\^â$î/øÓšUòOýfû1ó¥)}¸ÒÕUI¬™7Ó¾pSé¨Enü`ÓvgÍÕšQ/E •Ì:È‘VÅàßRìâ5~¹Tº«MH»0L¿~²ž‚ 7-{µ_PK=C~ÃAPKMbL;HOSGI-OPT/src/aQute/bnd/junit/OSGiJUnitLauncherConfigurationDelegate.java­WmoÛ6þî_qÓ'Ùñ”ïÍ2ÔK½-]ÓdŽ»bŠ–Î6ZøbÇ+òßw$õBËòÒ¡e€ØÇçî>G—,}d+ö»Ñ˜,ò,y09׃ߔ…ÔðÀ¶,áE2º8xc4ö]ý²«SÁK…IZHL¤É5ß`°.4ÉpaVÞ°ßà!Ó/M; ‰`&O×(C0m0 ÃEøhgJaV<ïÒ¨ôÑ„à‹¤P+îöy}oÊR¢R™Ìy¾RqäP¤˜EÃAi‚§ ¦ÜÞÿÂß~ ¨ï*¤WE¾ä+#™æEþ®˜FÀ'y¦P`Iÿ‚Ïg{'‹LçPçãÂͺœ{- *lQòåþ†ñ|¾/ñ=Û`|ݳ¤áÓ°Áe‡^Ëb§àŠê3}J±töŸ‰ÚÈ"Ÿ8_¦šs&W¨#îÙ‡p~¥,4E\ßàfò¯O€[& E:§r¨/À8®]SNV¶:7m]HØøÏá§u÷{¥q“F'%¥J‹<ަp(¢áEm\©LIÜ;„zˆªÙ½YZ…ý‰\åš´l žQ¸BÐãô Sc}OäÊl0§-Êó©‚w\éóQ͉ÑùvÓ88ë–6·¬µ>™ÔÆKóåú-)GÅW§"õ÷K N“‡¬Rš¡ e“Tó-£ä&äà .™:Ú‡+Â&™ð7Ö<v \:WI*É8x]#Ú$Ç]÷”Ån™7öZîƒ`‡gÆé’u r²õ8J|°{ˆØÜîº=r1&Ø»ŽøÁ9š° ó[=k<ÌÙ"™Ì糿›NïÆ°dBápx„¿»q²,޾D,£¾í›X¸º}Œ{úÓ×YYq”FQÙ‚Èá "ú;;Âá'zÓ})Ù^%ºð~cË*«è%ÓëCâØq‚–m?‰mΫT›ªõ×<ò„³QYøŽuc`°ã3¤L§kˆÛÓ‡ÃÑ+Ú½¦v?—,ŸÙbGõƒs÷²fäJ’eÿ™Lg³ÛÙ"×"›.m¥?ê­ ñ'Û¢«ºUUY’fKÜöÁ7ј ÃmÏÜ Ì_ ïEHî$Y=¸ ª’!jœuc¼ó\1‘a‰^£¿X%ðç©0Ba$»ê^ùÀ$ìÖœJ[Y¨Ú›õao)°$6ã®Àò v­/k±ä’LŠeyãI•˜ò%Ç,©Þœ_¨pÿ_º÷†PÈÚM4i…>Ýýú.cÇ7ì4GíôŸÖ[T]Æ)Nhw—·Ä± JÎË]á°Ã5ke/Œñ¾»„ÆM2ÿónêWßÒcÌÎÑÏ\œ‚Ü]ý HByÂ5[XA®sºÑýÈVbD.Kx{4 ¦ÒÌ6œÙ‡÷w“ù¯Vð_PüzœAêOóä£ÜàôSÅæ6z]¸úVòäV;©ø?”‘OÿSÖ«økq±’åtXŸV8O‡ðÜ=v6âvºÒc!›>Ûé`ØWBUg|IUå.Ñ  «F)#5Ã%±M@¿Hž¬eí«ÔZ| þ|íAõi’å„Ì?þåѹ­%¡u#ÐσPK×\m+ÉüPK–#93OSGI-OPT/src/aQute/bnd/junit/OSGiJUnitTabGroup.java’ÛJ1†ïó¡W])ûEPj)–‚è*^ˆÙdLÓf'!‡*”¾»ÉºV´ÝŹÉa¾ùçXÆ·Le÷1@Y£(7U˜BTc Ô8Y×Êz(ÔQ–Q•ÓA·7ÑqÐÆl£ía7"üðšEäë™Á7%£cAôqm‰]¸ rUEkxÿÌ*”~ ð'¹pÈôߤ¿£÷„&ëR쌔;`àÇ·«ÓönÓFRÑ.Z¥BQÒÆ(èžvF¾7ç’ôË+ )Á%Ex`öGl™m‹?Ï‹É ž§uídlƒïa–lÇþÃÌòü- ëfù0ïñVíÇZµ«™ãN9ƒ¹Žbfš¦ëõè;L[¡}¶<Úâëú@È|PK$) µB+PKÛA‰;OSGI-OPT/src/aQute/bnd/launch/PKPKÖS…91OSGI-OPT/src/aQute/bnd/launch/LaunchDelegate.javaTMsÚ0½ó+4œL‡8?€¦3 ô@'4é„é¥Óƒ,/FDHiEÂdòß»þDØNŠ {wß{Z=mÎÅ3Ï€ñ_!Nt+îµØÍF#yÈE¶çG{”*þrþhlƒP2w c!¶^£<@‘3’Bâ³*q8aŸâÿ•.©³PÇYvâ¥Jƒòs$W>“z0„à°P2‰ËdÉ“ûDIÁ„âαûRÂdÁ+‚NûAê„ÞFŒž'´¤—¹5™å‡¹Íü4ºÙeø8ùó·âÍ9çQj9G#SV5$ZUÔ £·2ó–£4š‰ðmÚ0L Ó§yêâkÊV…Rpnm´Dc©¤üŸ0ÜYóâØ‚éû«€¼¤ykÁVE¨x¢²L³¾c`Œ.¤Mf-BSPˆTT6(œ¸cX–{…ѤxYP£,WÕ˺HÆí)T»[ï›wLÃK7•ZÀâ¹—¿V ýž\ 1·–ŸÂœè³ú®1®ith‹£@Í´=e[®t€p']ܺŒèCäEó½K_V]îZ'È7t\{#õ¥”1 l¾ƒÒßCÊùœÔÖ—¡ãûÒð­¹/Ÿëß™àHöΖ†IÇ2··ló°|`sæ& i]˜(#ž/Ò¶%5>! ÖåÂÞ½ªßð.×wóVnOk.õæ”ÃO~€+nö¤ÓÔO¯¨ôV³q5åöžšÑŽí ·tÞãÙÇú(ü{}¶Ú°¶IŸ®7Û>BìœõõÃÓuˆ‡&ê…­¯èpŸ.˜ÉÏûèPKI Ã¥\FPK2Wá:1OSGI-OPT/src/aQute/bnd/launch/LaunchTabGroup.java…ÑÁNÃ0 à{žÂÇ M}‰ÃT&Ä´ Œâà&& kã(qê»ÓvcCb+¾´j>ÿiœ€z‡–³PQySÔ˜½ÞΕrMà(ÀѤk†ªl‹ìŠ›ùèrâ5ÕÌ»®Øw#gسdÿælŽ(Ž}êûTÈUí4èS‚õ ž±ºœЧ7 U’ˆZÖCNöK)èê·gg@GB¡N¤ÉÃ…Ö;‡5[0Ãc‰Î[hØÐ´Kƒc]êì"_^Aº`¸O#èôS½_áÑæ†¼¤N¦³«®ì'P¶ÿ¸ÕÓrDl†ûZ÷5–~ï"ûþ¿FTÉM3ð7hç§×D2L½ŸÐôð¹UªUßPKi]Ôª‹PK2Wá:+OSGI-OPT/src/aQute/bnd/launch/Shortcut.java­WKoÛ8>¯kô o¶=»n$.à"µ³µ‹=EAKc›ŽLª×»Èß¡D=hQ¶«C¢ÇÌ73߼脅Ol „ý•i Kјe"Ü {=¾K¤ÒdËžÍ4é­RìðÀS=l+^—ï¥ZScž¤@C©€ªLh¾z‡ãß!$šK1<+>¹X¢Ù2¯lËl]hÜ›ÛÇ8[s?lCtòGx'ÅŠ¯3Å:]9£³8$gÝòéý-Õë;™.TÿÂæH“Ne¦Bˆ¥|Êúç éŒ|}›,¤ŒÓÓ’Ö‡ù%ÂL{…·‘¶ÆŠǰq‰ä£’[»%‹ZD² q™øj&´?ˆíŠ…@Ÿ9ìA¥t2‡­u¥ûXX«,Ô™‚è´š¡hq-ÕD$üÔ2L™>I²eÌCÆ,MII-AÍ‚º”±Nþíõ^V¯| ð±×üjØQ™iš(.t,‚~N‰C*R VºýÁ0W}±ÈJjŒ"‚#ãd º£è'‘cW²$Hÿx„ô]üÂógÉ#R|ê|´¼»*ÍïdM+¾|ž’ |Ÿ5ä°Âà+ ÅÐ>q•j[¨Í«Y“¦EsÍ–¦>-r3òªf°ÿ |WиS!ó¼ŽC+`ਘ«† š’ƒÊK× Ä)‘{mU¶ûI[APkJà¡& Ê‘§y¡ñôâ<µ˜©lW¹iygëÈ ã¡ ®Š"ª­Öß¾%‹ÙýŒä… {†ì7»#)”ÉW"~àâæææ\×M ¿í.âÆ @lówduŒ÷¯Í¢rêa ídäHsoÈEKëqÖ›s™lK:Fh·Åo»š+ùðFÒJÑV’ÜD½4ÉwXoúYauð®Õá8LÏl#aþ„Á®¸ˆ ê ³”³A¶B¬pBLƒc¤Öyh.g;L­ÍvI“i¬Û :U8fŠ}0×xÖ[(\rA«',Á]dz Z/}K Zöȴɡ݋%hïwIy³–'ËW¢7JîSâœ:N›CëæGdUD<ª’göŒ€=©ŽÀ~5§k=ߨÚ0x#«áäV,‹õIÆ*V;HLƒ–ryù3ˆþV+<#X'„£sï†øïCé-A¬õß½yÓ';É|ç?ºÚÈëq>Ì46óë¡;¨Üþ¹“!½],¾þ|ü:û<¾[üœÞ~_ì÷~e,NË^Ígs1M§lghCp‡¼žÎ¦×Ó‡ùõû×ípT@”E‘øÌ°3—3¬[P)ÿÇtΟwÍlüa›Ð=i8KÏJè àÕêãnÙÂÐ;¸&ﻑî/Ï\hÏŽ®~ð”ÿi£G¥è™ÁÎ´ÐØ nÓٱ᧫ÝeþÌ?²/RÉpa"¿uôr’×'×ÄùcïêÂ9-ñá›à¿2ð8fzá“’»îþ4Ôzš§é)M›þ¿4³ßjm´JZäœ=;ä• U…öÒûPKÖ^•’y*PKÛA‰;OSGI-OPT/src/aQute/bnd/main/PKPK˜ˆ;$OSGI-OPT/src/aQute/bnd/main/bnd.javaÅ}mwܶ±ð÷žÓÿ@ïI㕵ZÉižžT¶”ʲ”¨µ,?–œ´×vs¸»\‰6—Ü’\ËJìÿ~g/È•œ[žÖÑ’À ó†Á2ž¾/“(þÿ«:OòÙx§ù£?þáHË¢¬£wñ‡xœãÚ¯ò¤vÞ­ê4ã_¾‹KþC™\&ùO¿¦Kú ?5œ¬ÒlfÖ2ûÿ!ÉùOUR~H§ ÿ±NªÚý’¥“ñ,YfÅMRò_ad³t>ç?Õeø’L³tY1Âu|É~¸_&yR¦ÓÊóùCRVi‘KÜm?xðÇ?D¢W€Ò´¾‰ê"ZÄï“h²ÊgYRé#ýsqöô,:˜Í¢¿ÃÌŠi4-‹$¯£yQFõUZEõÍ21*üM¶}õ2ùâ_»ÑÃñÃè+ü¼ýÇ?,W“,8Y\U 9J>ÖI>«¢e1Mª àþEáyQ¦y}^—I¼ÀŸQ±ª#ùìEç7U,Æðî‘(]Õq p'E‘%qØi²¬¡ý JÏã¬Jhè\ÑyœfÅ{ XÅ_Ë2ý× ví]2­á7ýW’c‘ð>é,Â¥2„N§ùe——Õë·j<øà€±4”'×øs¸ñ¨ù\—7fi|°ô¸\åC„f–Å'GC$T1‚öG|ʤ^•¹î°z$ö’i=¤.“ú¨,‹²nŒ«ô×d¸±Ñªô9šÆõô*)´FɆÝUµ,ÇKœ»,΋y}—I” ø¨˜NWe™Ì¢A´ ˜á4óÆ '€Ïk`QeÂC\”Çi–ˆÒ››PׯÁ¤*2`¦ôiÃnSMé½K ecœVOÓXEQÞ ùñi˜X³`¨ÓÑbUÕÑöàèCœ­Î´×øg?®ËxÙ@Û›› ðYñ3À º£0Âu`Lú}`&htwííwëG™ÇïKþž¼`îÖ—Y2Y]Þ±'ân½ø&×wEÇOãn½ Ùí®Ýx‚@îÖE€iÝ™R˜;®ÜpïÖqdzÊQ î¹›ø:¢ Ü­/Ëd~שù'À¸#ýÎ4"ÀÜ•Ÿ-‹;Î @¸#Mç®Èx 0îÖ $¯»õ!Ü­WIvç½öG€q·^,âiyG¢˜§äÖýX£)©*§ºTöÖ#_a¡1([e]ýœÖW + ü²U •ìð!­d88É…˜U©þ‡zn Úpš'»¤¬(DzqØc¤5*Ô€iL‡ ‰× ÞVã§Gǯž]üòäùÓ_Žþyqôüüäìù£5#; –aòÆ(R¿_ï¼µ¬²l䨞Á ©'€¢Lü´º¼ñ(ÚéaüWWçIýëíó¢4>šœ»°ó÷ƒ—vÂ}øô)êDv \ÙBE€£¨Q1ÙxfFã·Ô,Û+ÒKÎøhUý•Ùx’%Qí]%ºAÅš{ú­/õXëlÝÕ¥ß*Ócç?1¯m•©eE0”~ ARúA¹wˆ4Í¥)‡€ ‘ùÌÑÒÎÍ(ñLK-ßy犥9÷c[}ŸŸWÉÉæ¦GÎìó"šÔÊâ"ÚˆÖè£Mì¡QººN‰ŒÓ”ÙÅ)ªË;»íV¶·Yct’º[9ݲ ‹ >´ r ÏriÚê9Kæñ*«»aº†2àzn`ìPr3]T—Ñnd€éc©Ë77©±„§¡À4ý—9´ÿe&êZû²S%¡~ÑÉr†Mxdûß5a ¨/5eš›)[6.5µ›´¬Ÿ#ú”† ²ÃeRvl3hOë§„1]̼ŸøÿŽA?É`;:ȲáàooÞü6|ýïÏo7Þ¼ù ,pðæÍW¿}õð³3›|õ]¬ò¨gá×ÿþêípü`C7³ã6#°•‘ß ×ÀD£—P ¿–«1øÜž AÜÛ#ÎŽŠx#´tÛyð9,² Z„ z,0ºÒ ˆÆÐŸj™¥µ„Íñl“ö* ªç•Ló¤ãÀ‡5?ºÅZfNXárìØ¤_‰!v±7F”>ò5Ùó»Üútmyx¬95Æ, Œ¥%qHî"³Ô;ÉçÅPt\Â÷†Ïƒè°,ª 7O`³žÂFò!qP¸ÆÒ:œDïâ’6VôÑáo±É¦uS«Òàôƒ 4zû]ª^l{pH¿Ýn½{D\!=á?†ÿ˜@lˆÒðkˆ•q¹=$åào®f@ƦqœÆËñQ¥äBE/“ªX•Ód?Jð=,tVÓÊ€C‡%Õ1Ua+`þÇG®Â÷É Œê`3ÿHn‚¸êFTšµ~гUXpG–M5Ð`LÔУÕs’/WÊKþËr\,“ÜxÝ©2fñ¯¿"yÿbé öh•]µ5ûÀò]…QÊU\͆Èá±­1¬‚*9Ä1 Ù¸Nš‚Šª» ÉR5|—šîÄl{pƒ75ëãñ×ÍuUòèF<àÎAõ²¿Š 2³Ì»øpMù±ëì*=<Ðø„}ÄdÍ–}[Š2Ó®¿¥›¥eK?0îD£w¸> ~Šjgj1š¦KÛ¬Ëénë°é6pÝehe¤Õónm® šëw8ÛÑJü½íIm7/uO ¶Äÿ¬ lÅž[fÜxNAJæÉp3R‰š—1Š^]È¥¡L—æü" SÅ>°†€{ÓeØ ÇuçyQã*šE Hä¾JLé\ßÒÜyõ‰áCÝé‘c·?12HìÇëX)|ûwKplúE‘È€)×t€5,¶àÕ,Ï~-6³Ñ¿É&ôN°¿ã‰QÑlCé±ÐœA㯌ðVkúeÒˆ€$§kQ‡Š½¡bï`¦[•à•g_ÆÇµ6˾¿óšÍÅ.Úì5~fÜXq«YÆI»n/êm¦{qqýǰ˾v禼ð} £Y‘>ªhÁÏ‹;´`ñ¸`ý!7Ìf½%+uÕ5’¼éÓ^{/5²,whöpX3ë°7<í<½Å%~|ÇÏÌ“1ï?Æ•>Ég®­s–;Èyˤ¬Ó¤òI뾩»0ENŒUF‘¬—‡®Ëω]26±F:l(æfeŒÆ’½XÀG MõQ³+ .4’‹¬‡[®óQÓ¿‘"¼/ë÷¨Ú>ÑÃS­—¶K;ØÛö&­vHúOk¹¹{§(Þ>C¢šwó¼å¦¹ÆfÙ½IZ›c#Õ¨½±ßÖ× ÝÙñ\S·.Üaòäm1‹‘ƒë‘+ߎŒÉ5`I±#Kx™r¬F“uD1D9œüÞÔjñ¸ö2ÚIüñ´Èë8Í+c‘»»ƒâoi9]eqͤŠ7½út"úKsiÀq<>ò83qº?ñÌä7mþDÓ•”¢p¢lCòm×QYilÆÀ§•þÓ!8³¼î·k ¯Š½H² âBª•KÝÊM#âøBå±ê½@ øh>Eè‘w °Æ[`šÀßÅ¥wƒo:2^¼Ÿ¥èMçX®ÇåÕFˆ¶™M­ß9À#ÃæÊD­oTÖ¥kßónǪˆ.; ìÄæÖêÇ&³çÞrKÕÆ¡ãÆÞ(Ñ2ŠzHª|‹ºkü²*Ùóë¶è,=¸.LwÂpun«õÆáGÑ» øÆ½ç¿\p3<ÈãìæWxy|pòì—³˜ ÍºÃMA¤`—SOYŠ£4&¤e?Ú‰¾þ:º·öÑ5Aù9¬â6Õ?©r ½`#œ.haÆÇÕ¾Ùb'zRè9”0+^‹! Ü…‰®’Jò.›•¹¥°Ë¥ú§ø¡’z0ò@¾‚µQŸ³tž&0×Ñã=j¼ý–_!Ã7)`(„}]¦µV›´Ýõ•…ìÙ†=VK&Ëd›e…hnø;ãó\©™r½VA÷‡æ¢Û–‚žø)ÜÇBåg“_D¶o™Í¢C€»…̶½£fN! r}®–¶ ¦—™<=×î‰^] Y{µ»@È‹>=,u…bsŽL-ÖóF¾¸Ú–[_qh³ÜPÀ%tQÞ`ïëBŠ«q”ùÕ¤SÙZ]cD”–ÓÜ=çÙþé ™0bTÃZ´A‡>4MŠæ–Þê^oï/‹§'0Ç>îëË4xˆÜ!ù•ˆ<Åì¡é¦‘Ñ$‚ë.¹1&f@!cÝÔ<[E‹µÂÙ˜#ÔˆCö=±ö9¥Ík±C7¿%Ï89Ó“¤¾m‹?,_°¥ l›W/žØÖi;4Wkº¶}ÐʦëÓUTeИ^ì†+A„ÿª=^¦÷e‘Ô»î3ÅrÕòëÌñá W¶6j¹Z€úf?Ï`hr¿¶ Ña™À2…~ RjYÆ7UGÓq…À†š>¼¦4³!TÐ1Æ“þîöãc:²†‚(7Ú0ë‚:ltÅk—lÿÜt&ÝÍa iÊFA—ŸŸ–×ËD‚VaÁè«-÷dæø«°asû¬­+,¤Z&S’£¡áUï¶ÔÓÝÞT£‚SS¡2¢^ìò ±¯»æð¾ÀÐô°òÂ#iÅ_áOmÊe³†Z €)išK%>+§8}bâO¾Cæ%ƒðxÌN/@Ñ­vÖã=«>°õòˆn":Ѓ"Ó||©9¾†&fˆ>ETþ+ĹOÚ‰øI„-~Šð€~´ñ½3%í”$‰®êz¹»½}}}=–ŒÒ_·‹Y²ýÄšQž¯¯p/k{Ÿ¶ÂÏ™%‚Øâ±FØJ+bôåÚO@¤û€º-ÃbL_ðícž¶èŸ!ãvÉ(nÛó­I™Îo`ÒqžÎ“ª†?³”þ£fx¯‘á=¤çCv³õ=ƈ—Æ^ ßz£V×èþRTi'<ü-eb˜ièsO¼­uT_vµ¡«¥þi4Øfh‘âѽ=.¥°…&¦j³OÚ|Rçu@­q¢µ~:zyrü/ü$b¿<ÅNžŸ_¨È/O±g'XD@ûÖ_ìèðÙÉ‹söÝ#O¡“ÓGÿ|!{ö_©WçGçªÅ?{cÒ ÔÓ'r”ùÖWêðìôÅÙó£çØâ7ßéþË"¢<üñ蟑j´‰è²öqXxýð¶/0&¸NÁØ=›` AeaŠËÝ´"&?pd0·ŒäçŒî •ôê.–ÉÇå- "÷^U¾Xž X\A ³ÉmhB,#?ài±Xy’ßfîôâóƒ³l]À{ÑÖCàï Dœ¾W,ÙÌ|•µgl–HTÈ0#¹Ñré÷ˆ¸µÏmÉ ËE/"ø=R‰°cy¸MÂ|„*ˆÀ— –›022«9æ], È=îS³‹}R»Ë'n©(t‰Ð~õDm4Ñÿ“.5®-—aœùÌñëcì»–ÛJà)à¹ù 7“4)£êѼz¯Yv=U¼wC«’ØÂX'¼òCª²õÁŒW‘C`ħr—‹Ôví)›­úÄv [jªCßä©ñáàï/Å"»Š+ÔÔuý<αnÖBÌ6°ÌÚ”*ŠóÙ,ÈuVbgàÑi¼Ô'Í¿%UïG"¿2Å«áqÒ“£·ZîiºX9{yñË‹ƒÃüpä%íΑ€ ú_ LnŸ‘H”k60.“Eñr5È14ÂBž¯=!H[/D–óAGÈ®âj]˜Êvµ~ôñwi]â€m=œ¦÷›cf¯áÌÀÁ¥=$ü“T 6z®q®ÏŠ<¢Xý!6õž­¤Ê®%Y˜•PròH-º˜üÃË^ t 68°ñ0xü{/•ƒÙ?›™WCŽ6Œ½w¨ºÜ½˜_U¸„½¤Û5YœÊÁÄš¸€*½±‘æ ö‰ßM”ˆFAÇ Ýˆù ™kí40 êÞ¡R+ ‚E muµ…VŒÞ{%æ1æÉsaÒŽÎyÑJzá':(+ýF"r±GÊ‹vô^¯|l)Œ…ïöÎa¢Jîqå(囂Þ%*hÜ:©ˆ~‚+5,“ )ÉCîNòYòñl>¼¿}¿3Uô;ïðŒªGu³i¬ZM„² 06#o:Cõù*"¿åß-Ý3WE;+¨¬Ôgü0¯Vê¤nd¨8¤IP~¶É“Ú«ÉV=á@‰CŸëÛîpÙ‹ÂÔ£ˆ ÓKSŒ«ÅéIT{¢ª?Þ›{̹¦ú{÷ E v¿sþçÔ#‡Ïì¥OñTAÒQsÆ»’NÙZ/Q´…j òA³¼Q+ް¸4åžHM^«Õ¬ë’[ÄqT½4}*OÄkÞâ‹xÙ¢AoAé±SérÖœ+t· +Qº’Ÿ×›µdú­èµ…“Þ£2TA|¨þ“±~-#V¼ý‘ ÄG?b·0n²¡†µ¼!F¹ýúoÁþÔ2c'8½2ù&Jp¹OÁ§’B›€¶ŽE\¶ŒI~òÖï©hCI2ws ¿²äãV ×öÅX–jÝ{ùüwèÝœEI„âmÂt73êþ °ù4Z /ÝB°ãT~DïÇWqõ$`ø:!‹êœ$÷ ¨”‹¿#µ¿—vÑ.›¼ì†V@‘i¦Ó8~»3KÒ]¶¦ƒ¡r= 8S#ïsH†• ëQŠ]Û”ârñáÉj>‡MºšÈi6ß¶-š%™}ŽŸç7Ï«Ð<·iTOóŠŸæj2Ž—xæ|]òäÖqóu@nû»#`q(1ÉL>Ľ&~ÌøÊCMIÆEŸšÍ?´„9ºaµkΠ HM·¶«FÓÑûÑýu{i*Rxy•̪;/‹êNLFÝŸ!h+Kå·à¿2t!‰§WÂe ZPZûu¯`Z^}ŠÆw†Æ / »·¾D\Y{’¢é™ÃàÕÅñÖwæb Yëk­¸4ÙXßxž¦o¾TNÿ—¹–\v2yçF‰4Úß3qãËVq’W°,Òiж:(¿ZšƈÑJéJ×ï¥ÙZ“,bF:67M$®ÓKÐŽiýÔukM[Ò0£“ô;RSÜdˆÚǃ}Ñ6Ær'ó¸¥1²ˆÛÛVBT Ót–”ê@’SÚÚžOuøÔ©•òs€8…QvG»;8¢èß-8)ÈR—°ZgoȺéŠñ‘kÞ¤NWÜÍFÌ'˜6KþÇÏsŒ¿s}GYE¾·±ç\4º«bÁ˜iíö[{¡¨ÑؘÛ©áçúnkëË ZûŸtéä•Ǻí÷PÕÑÆ1b’TI¡PîEâk”Õé½³l¤4)Ї 6®él†Â4.6&ÔÚô®Y &J KÛG–¢Hï&ÕÒ³ñÞWܧ.¿èðñ/íàBµÀ-y½uªRòóÓŒO_’°ãÔ|¹þçì—^§XÛœ:Î)ÀYž Ýüë×îB¯‹ÏûEBOwÖÝ­™T—’‘KÏjÈ›-÷wa´týÐæönûʙʌé: Â2[cLþ×¥ø»mþFŠ4ÞºFf¡¦]Ä©lÏ2ä«y°›¥ÔT · o„ULØÀTàµ&÷(Ϊ"¢_龕 ঔ ‘ÞÃÆýš.ƒLë°*IÕ؃î0kÍ-–k;Fxê§6Ä2Šš)ßèÈÿ€´MÈ.¡“Uâ»×w¾ù¶¥,c¢4 îA³¡¨Ç˜3¨à>΃#™D]ºµK;æ Î¦:’§?•åad½"¶Ð>!-¢.Óêh±¬]úv“Zù–zD'9dÑz· ¹ÇÍ:L;Ò9j¥dàlÈ& QI™`è]Ýu´aeK¢?mýù;´¦ÊXm¼˜Z_ÈDzI#7ú> ´Ï–ß`=¡îAb±Î »îx<Ž úË{ù^)l”>L¼2®.±mvLF·5M‚¤¾ã&b­´ú• õ 51míäµZãÓ&-þ>¨‡Î}¦ê–é 5·ûº¿ëNŠÂ*&·ÈyMßÜ|‹B«L ð:‘YaÇóýݪªÓù:ÎÆ¢CÀŒÝÌ' „iÅ?ÚfÄ[܈ñ±ºÇñ]ã* ovC¾àOÝ€9œ‡ó÷Dªgk+íçÅë=3r™¢iîþÎ}tM1=Åý¿Þ÷jÈ‚žÖ|£%6÷Ö‚õëÝKO@ð÷üû•¿§´ i.Ë@ȤÍSïϧ ôñËŠvš¹äo»‘ç4¡Ña¾Ë•™”…ÐäÑn›u-¡¦V›¤B/vˆˆ·ì›N×è„z8c• ­¨2&Ú«Âø6ÜEá(Pµ~# ì¿Ð㞸ì10ûÎ[ó!Ñ‘2“£ ÑÒF´­/×ázôÿ2úMþøò] ] Þ/ˆ“ŸJ?‡oº6]3¦iXMº?—±/QÑíüzÌ}ÌH¾»¸Üýíë{ýBž9ÛkøåÌËIô€û¶¸r££­ÿË ’X"•ì*Ÿõ¾QUR™™pQÔoÒxY>µý‡´öN‚·sLŠ"Kâ\5ÊßX š7ói¶r/6hÙ¦8Uc"ðslÛ:/ ݹ…ëLVìé=‹èá–i‘›äµÏÄyÂR¿È191B®$††Ï òΧ¯°Žr¥0m,º®ó­Þûn5°+yÒ†2:ŽDèF ñÈiSqé =mHpS°[çx;²0c÷Âê8Y:xð]:@š0ŒÝ=±€âŒÉ/ßo O^=úìè—ó>9{vrøüàÔo.¥ƒ$Â;4åßcŒ&ö°ãʱMibl¶:^*¯KWõÁÆpëõÎÖ_ßn|?~ðæ¸Â#A´Ý´Íòf=´ê9%ŸJI§Ó—ÒÃR ǨOÍð¯`!ÖY2ãLøÐí³ -“0ã˲X-‡Þ£]ÝÇhš;¢È13¼Kd2àsµG+.^&ô£L@8@sš¹¯qâŸ0í3ä7Š|˜öj{a·NªwR·>­…¦J“jĉÃàÕqY,åI¤!°NfÂ(hwo$Û]kü8Ò“ú3vER^&úhŒ·}Ô‡¯½½Í½‹Q¦X-É5ñ!)+ÜÅÇã~Õ›PÔJ¸¾{q¸ŸŽ^â…>Ÿª‚Öµ5­>Ñw ÐP~ ÛÑB»¯£(ÌK Ö=@~FÄlÞ~ò%nÃQ?­A«%Wó¶â%)£÷`ü„Œ*Ò ±’ø¼ä²!‚ÐøBwFâR¡Ã[ÛJcTèÚUõ'Ö*vIÿxð€"ÂNG*>þkZzð$dÉÁÌ1MŠ-NªµK«TTª,kd÷ÜE2`wF}%þ1ž’Sê"Y,Eô_½XNò^ä•bš‹Væ¾Ïþsdò† ±¡_Ê¥ì7U¢·lŠâÀg>ž%YR'gùÑÇ”G;# H‰¹RhϵßÏ×5³Ï< ÓJ#ÍÓt>W¾3Ò³¥::O˪ӽ¬¯~ñÇq*¹Ý/`+ŠH•5´œÔ•vQû×ߨîéœÏª\fÔᵌ7L:bÆ¢&F§îo7 ô1¥ˆ÷iB£FÜa%kœ\æE™B{=,7ýó/®s3Çã (!˜â1”h2GoÎ7¶v~SÕÉb M7D§«ªŽ®âIô<º€¾ZqRÉŸ×ì¼jvÎO”ÿÆWÉ<×út áy75–)uuŸÀÙ[õ0éC–d‚*U޾Z:Ú¨°Ö}êñ#EEôw †Zî­BuF·â#ˆñ£MÑ— ×:‡€ ”ÖŽœb¨í­Ú´è‰¸:xHÑØsØA°†š-¼@ýýþÌÁìÕ‘0bD”ÎÊË,©HgWÁuLÝ ›l—hï#´YÒŒ•´Õ ¾ËÍÚ·±=fp›¼¼SÕ3? 'vÅÉM‘ð"ÐHÖ¢wß=üë_ì³7F4Tšû"”ðé ˆÂ]&½‚¢ðéÕjß Ol9ôinêîb—ÅÏ4Bœ_”Œ»ÒšåMT¶öÉhŒÚ12ø‚Êóe'åhÓÌUZ u¯šMvæù·—«:QƒÜ«_é?BgÑÜn! NêpY½w4·( õ´p¯îAªm]IÛÖ½C6îTC&øN€ê¯ÙJYTj±f8?«» ÆFËxa%Š'-c»º·]^÷ô†28;k ‰ÁÅ•-›‹]<ÖÔÍH÷„Ž‚¤É1s5ŒevÆî%1"T$FÄ…¥&.ÓxÆïvHÒÌwLV—¿']6I³5Êr»ê>iû>¬ÆsAÆo5ç(€eh¿Î“™y)¬íg•ifßc¤?K+²9†þˆ-E¹dZ–/&é,“÷!㎀*b®Æ© ùÝ÷Ýk„Ä¥ŽïFËè Ý>€@ÆûçwKèUϲ …®uxðÀl6f&‹ª‚‰‚-™7é)ðšMÍYÁaW›ß…NG(-p0©¹¹œOAo¾'¡ËdY0køñ²Löõ/*ÕüÂѵßà®øuV?¢ËgVeöõ¥N¾&KiR‰I•ãÇhˆ?¤a_l|ß.?Op£öÂ|¼mv’Ýа߷`ÊWTån”„csv–Žf;kít§ÜKèo•"¯~‘­.Ó|ŸFÐ,lzY íbc2Ü›ÐìŠ`Ȱ=a:™Óƒ%¥U×­Ä å2”YÁi¿\˜%ŸZ’J-—ãiœSt¿Ç!f J3«‰ !j+Jָױ˜ú]dlìoÔ®‹x,ˆÚèίŠËÿϳ±Zý ãލjŸS‘†•FÜËÒg@ê°A\½w)ÈÄ’…Îh+z莄æKÀt']™H¸OŒ0Ea¹µF™ "H‡R o´ É¢:¿Ë”é|HŸÊˆ§¢Žgó ¯ ½DÔ‚Tá¬o^? Õ±â-°þquÅÜø3pk@Øh‰g“POñ•VÌK\„©®ºtˆC€e‰·Óì…ÀÄêita|ÈÓ;Þ:#ÀÂÏä<ë ¿ó}Ë“ÏA±õõl[ýÈ]ìo>oÁ”Û]?¸†?¶l ô¾ìÉW¡õº9´¢ëp×J…±C)_Ô¢ÚÀ& eüš$À{~©²Ä F…y…BWÈùV»`( ¹2ľ zÆò8O¸”zÆ‘¢Ïâˆ7†àl—šä¶ãår[8ò¶å¨·gÅužñì{ôíý©úZ~À?ë›e²7Ió¸¼éJo¯ÀjÐGvèŪ*êEË¢fÔY;@íÚíd`ÛÖÔîAÓØeÒ»±½Aý|íc”|ƒõƒgÂT<2eƒ„Ö©±æJ"?XD¢W¸Ù*·E=²¹V’Â|[¨ ç†/ -†(¡‹Îc›Ê¦eŸÁÛñÜM²ÊC×j)€ =YqÐé€ûË«—ÏD"„¶Q‘ãŽW†K €=2|0'ñwÈq-ø„]lÁøTæÛ\Œ¤˜±?d$˜cVn×u#M®]>:¬rÖ*ÀsÛ~9­«`‡ Ò.¤V¥‡”—Øäc1±_]\%°!‘M¯ Q¦`¼2Ûu®’ò¯[ÁQBJ&Ç TgJvbè˜_ÛÛœ_Þ “;¦Zoü±/(ªù§q†;g2ƒâ ×X¬\þG†P˜EÓvðh£I# ò°š@þ%dWœH!:Êl>ŽZcfVÂWgBÙIo¡i"duµ<ɾØÅ!õÅÚ}¬f “É.Aqm™ÐK·¯Š= õÏ:»¾ÒLÓ¥Õ9€idª C†àC6 Q#§5xÃJ^+¯%Ï”Dzô^à*p,a"Y~º… lmóˆˆhrä#ÜhS ç?·ñ‡i fhgÜŸ!ÄÝìæN!wîÇU’õ¼_=xÁvc(X f'Ð=.²Ù~ôÖüKŸöñ:z*#¿É·Tfý Ê#¶ý oV$­T&Óâ2G7­Ô޾÷ù¥ðÙTz°Nl€h&7uƒ$é€4ƒ…á$:3 q·ÌÑ#M€a6kõFËA1†üÇ^ùN8€Ô5äAN<‹qu¢ò =ò±\y@lfî^·¨“½OJÕ¡ÎŒÿC|ä~öôèÙÑÞ. û®Pc£¤×l:y¯J­{.Â8;{®zŸVG¸‡¤9)ýÆ99ŒWÏë¸wìË…u•«œ:q 唲õÓÙ.GÆôZ]!¢NdSzë躲C6ô!ݰ*É…ø”y+ËØ@¼¬¬X»‹ø2ªV 1Q^S²yÄ—Ã|ÕZÍò™! ³˜$8бŽk+x„¯râä5ÎkâM r‘RÑU<;Ëælʺ&ö†@Ç,-=Nq‡JWN›Ù²Òu˜Ayu¯´û/nâ$=вŒtÔÛ3>~jD~v¶I?Bõ·PI t"³#1Éœ™ f:ä²ÜÜ£õ}r©pÔÌôH!…«¯©‘‘CÞ{¢"cï…=Œy×cƒÐ•ߌðgUŒ(mkǸVq"ÍútcȪÄs¦ ‘´KÉLóÄÎ'Í<>´®$NwE¯·{Þ½lΣÆxV0Hã·œ†%\æ&–ÄEq qñG›÷öiPTÃðWñã"Ø\·ïˆÖ¹ `–‰c—ײŠñrHܡҩ¾Š3)xÎ÷ºíôè ËëõÎ-xt[Ü õ<ZqS=&«¹³¬-ËÒÞý©#6’ `¡4¸6ö”#CÏ¥î}R?Ì‘5Ì{ñ@´×Kk§o¥£Ä‹ªæ†*ÞøöS™£AR› ï,"¦dP#Ýíp> bCº¨×¥ÛäRÒ–päq¸ñv,QsƒV”¸Á±}—Ë׳‚\}1¡ONªdré"9M3``mê©P$WI\: Æ ÓòlUª;ã˜g{Ø! àc¨oFÿog3ð=ÜÙÙaV“€F†12ŸÉ\eÕ°!½Ž5&wÎu²VyéÝ +ÜKDc³óîÜPÈÝ.Üjn‹ÏâUNYp–Y»iõa¸d÷Ú9rÀs´rÿmŒÍRU)H ·Oö\e¯…";¡²WÜô^0äK<jyRî«ã„j˜B¹«Œ¨ó‹—G?üë—O~øñèüÂ7àx %¸:oÏF+t–ÃþR€Ø¤FW­–Ý8œ…´º±‚ê7Ä1Í5u«‘0¤ÑM5Õ#v9Ñ%µÆJ†pY‰Ò{¢FŸãÎMì…jÆŽ#3±HsŒ¬ÍŸÎ ™#qT–¤ ê5ß6ÚÏCÌä_a*9+ÑZY•˜³MÓ ¢é`°†t(†6Ü`ËÛˆ+¦¡ïè#âXåh–>ÔduF9×,7+dÍÛØåÖ»t°}!b"š]Ó²í±Mln¾uDó@˜eÓ'ÅÙñ.DÙ#ÂÝ®ðÎ2BG¨w!{a„p*Õñɳ£s÷ê‰YAJ+*ôÏNÎ/útFýIq³¾ Œ^+µåVR¦îËuðQ×¾ö´i³@óK·¬6ø£Ýà]oçÈä•V]“†ó™´Ož™{ªØÝ$ݾ^õt$EY÷¥ÐþÝÜ$Nö„ÌæÕ¾·Ç~‚ÎUõx}¬ÊZ²€¯Éw¼)Åà›ðÏÿPK°Zf#¤-0íPK’|“7'OSGI-OPT/src/aQute/bnd/main/packageinfo+K-*ÎÌÏS0гäåPK˵‡¤ PKÛA‰;OSGI-OPT/src/aQute/bnd/make/PKPKhVB9%OSGI-OPT/src/aQute/bnd/make/Make.java•WmsÛ6 þî_Áåv<{lûµ¶s—d¹[¯Ë®[îú–a™‹,i$•—kýßðÅ¢hÙÎðÅ <ÒˆüQÀÄ_­¾¬V|+a6ÉmS+ÃþO‚·F–ü—Ùᙂ^èMxÕÁhPO2‡È̽+å’׺֪i—¥ÌY^ ­Ù=:fßG 妕å ;-K§5³&÷¢™®´Qmnd]MíÁƒQ²*¦Ìý^]1Ÿxßä5 þ<âØ‡Ab6RsÎ}Ÿ$ï߇3^€ùZ¶…¬t6æbµÊ*x¶ø7Õ*ÿŸÍmݼîv½ÿ]·*Ö¨:­3—s§qðo'SÃPÈñï 0°, 7Äj”È!»°êlüy>IÖµbúàw•Q¯op ¤Ç>Ùö(A¸}ûyˆ’"‰™¤gŒ?‹Ç™èý¯q2Ž“oð:·he­¹ÍÝfû¬b ¹fÙ[ƒTð¦ØÞPê?¡V‡1† H’fBíÃÓè]AS©Ûið7Q¶Ð«— HmætG®d®XãJ§«Ë¸ž:EnlÐßWÐóxxx(%º´á7$ûúTáaáípÉ|¬Ó£Aœõ´cl … tC{?-XÕ–å±ðƒ$…}…6>\°µª·ä_³‹³á’L¢ë%ûgi6Óp"¦UÕž·ãÊ»Á7;–S…²ìî%‡Æ6œâ äJÕ*»ðEÐE{6cʰ€ v€f†=o b­ljkLç©ëqn9sœÇ|b‹¡ïþI÷W÷䩦2éÏX%Ÿ0›ÁΠݺŸƒS=Q§c8UÂ9M).ØW7ÅkÅñ Uãi• Ô$ŒOëñĸ ô–Ž™>£ÉLJÎÍ›ÖdýÛ×=¤Ùö˜öA z»êþm¡ÂŠè !gsӮר©—-}/ãÓ8#Y,ÁÔºüp‰¥´å…ªÛæ¶n+$ >&L“Dõ3ü™3ÍK¨ ³AL&'“”ÕÃd9ªkN×&“Ÿ T@ÿ?_²wïPö+û8Ôž=ÈÉ$퀯\bœ³ù‚R=Öí6±jÄEŽ~Ñl¸•ú—B}‡ž·Ì"éA7;«0‚¶¾^rÑ4€«Qd6¾cPj8–WDðqWxwÃAw1äCžûCÄÆq 4 qШfjGnÖ_êÞ¶£%ËYD‡]Mh%dÜ»w{o8ô ßÐàI:¥»…ªPæ5lÌüþúË]”wû©]3@6Bé”NçÞgC–ZÍà6ŽCªÕ3›$—•šøFà÷‚ç³´uÞæÔ`œ«H¢Å¼0èµêq®`[?Áomƒ+=~pî…zDúS5A;»Ggö¶œÛÌ»OÐì6D—çâ亥E½G½ýPKרí3$PPKºPÉ:(OSGI-OPT/src/aQute/bnd/make/MakeBnd.java•UKsÛF ¾ëW <‘µº¾'uf"GIIlײ'—Ìt–$D­Mí²û°¢¶þïH®LQr¦ÅE&ø|x¸‘ѬäÁ£Èu)ÖòßL&jÝëá^>J¡ŒøåÍž&xUÕY¬ð;¿Ä§gà<¨º8=¿8´ªÀƒ·Zå¸JµxMÈkU@QKçà %9Ó%ykÔ¾S]סRz çF;/YûÏH–JËHå áZzVçw7.>Ïá,jDaÖª1MRq’}û&Ò{iÿUÌ’Œ` >‰t&ØÉJg\ZÈ»ß),¼Uº‚§À^=m½£|‘ÍoM´} ÒV¡-äJs%ø•5óï6 Ñ—ÂÒãûmƒ”}Ú}fcQ¡O6âô£¯ZBú*!ÖY»”-²l/A‹>C:Ôu_ø ¬ÅBý‡ÀÙ8tt>kÁ³AQ,=ƒ­56M.M æú]*,ˆ-í ¨Ç6-7Kc!ÙƒŠr2là ™ƒ2£òi÷ך ¦–ü{¶KŽªã—¾”Q}½¹P®µÉÆžžÂW„Ò€6‚£ÅƒFZâr,$+ü 5l6&Ô娷ÍhöÖè@VRi Ã…Ô-,¨.ëíØWéZå94Ö4h½B'öÌv£\¬8Ð^Ñ‹÷ÏéˆÇΚvmq(8.º†¿£$7ö8ÂÉ:8ß5ÖË4HÏEõT)]Ô¡Äq鯎åáÐ_wõmÓw´øÛ¿©€‹ËóÏwïçÞÌWw7çó)$Éñ2žÝ‰žØÐ鉙tÜÚŸ”ôIZ:Š– ì@[ï1 lURq{4ßÒ6ÑþdƒÅci‡«·ZI·hï;0Þ†~9á·ðšsaìx·ÈOÐÂãˆÉFÐÕ´Þ}U~•&W‹¿^]ßž:[$£›1*J4aŽq¦ÆÏlœ¿édyš¼ü5`ìB/MÚñ<ûÊúK¹¦6ÁIòÆ­Þ]è»û8òbJÈ€øsÆÒŠßÚ€i‹q”E6y¶×JêÍâ wí¥ŒÌšœOî¾2‹ð‡Ü±´Ì·óD¾MÞÈ4{³v̽óë‡RnðˆÉÜé=gN¿äÑfe‚§!›V“vѦŒt’šqÏ¢ððlèaÚüÏÁ‰GŸâÒþíFP@O€µÃŸÿ³xšLž&?PKË ,ó†@ PKŒMB9)OSGI-OPT/src/aQute/bnd/make/MakeCopy.java­TMoœ0½ó+¦\Ú-é±M¥¦J¤JÝ~¤r6f nŒMý‘dUí ˜eYVÊ¡sÆóÞN×ï&,;@®1Lgˆ+Æ*çê0‘žÄçº#Y0³Ê˜îÖÓc'}ɨ¯šñ :ŽŽAm²>n®¿‚UÜ©ôÜîkIÝ‚ W9ŠpøÀ(1ô.Ù^IÕ`é ûߨ©,ÎÇ1ÄÙÜ"°ZH…n‚˜>æþ¿ƒÖÝ8Ã]RJÔ ¤|bÚ@ìÆÇ;ò‚)‹ÁíszÝtàÉ÷̤ý&ú·]í¢gPKŠ0mP —PKÛA‰;&OSGI-OPT/src/aQute/bnd/make/component/PKPK%@‰;DOSGI-OPT/src/aQute/bnd/make/component/ComponentAnnotationReader.java½ÛrÛ6öÝ_h¦5kig÷­N2•%¹ÕŒn•w2‰7‘Œ˜"Y²coòï{p%H‚²Ýì6 â\qn8P†Ã¼!ÿ±+H°J¢`‹oH¦Û,MHRœPxdÊ \аuapAØ- IßL¼,a?ã[Ä8ÙŒ¬cŠö·]Acç#òÅFUÒÇI’ržÒÄâ¢Ä!Æt¤ù†º>pnø a‚@¶[Å `ãˆWƒê=o”¤½œ_W4‰¾â(ò½Àç|pÊ…Ò‘ ˪soPBîМ¥!Éó”yŠû‹‚ÑdS¥º%Åu=ö}@òÑ t*WÒ¤hð/WöBN³ŸØÍ)Þ¹6íá5–<<´cÚ„­1ùp¥V‘âµ\ù¶äf4‹IE#¿ãüÚZlôâ€O3nb8þ»ðÑ}‚·`*Á œ©¹.Òˆ¶8³¥.8Dcš7XÉXšVP’[ˆzŒá{{µAq|Œ–³Á ñh‚2iÊ9Zƒ7EÆr¹´Õ'=¹­b#}å…|×4Ä,°amó7‰O9ümJ#.  Ý3¯Í¼ÓØÿ³Æ…Ù ÚXØmdŒ;ðë N"\û¨dMÊÕ¡áJ–Þåhø%$²šD«€a·îÃþÿ‚‘.j*³¨öðÙ‚™²ªvƒ÷BÞÀÞ\ÃF¹ 2Ìr"ú9DÄ?iqm‚ºÇ*¨¸€ùµgÏIu2ȇY«y•¹Ê+yµf¹QŒt<+¹byóü€üµÃqî•)v1íM†¾mQ|€¸^6™Ï¦Ãéò_ÒEU| ¡‹:¯ßv,¡š³4 N,lç½>$°÷{ª~×™Ö y ¡á´w6öR+Zl÷$:£Éd8õ–C7šVê”÷d¡.†‹ËQèP¢“xdÚ¢»g÷û³éùè·w‹Þr4›~šÏÆ£þ³éºp¸M&Jç&ú[&\gq¶ú ¾õáŠçŠ[ qüÙÓ“~»Îç‹Ùåh0¬•ˆc«Îs7* @ÄØÅqÝUø€ ô.'‰¤]Y¿‹V»…ir 2¡5K·ò#OÔEê´þ+ óœ“)zÑÎ ™ŠnJ®0ˆI²)®¯NÝž)“SAàONáßkÔ€…é£#ß /H Wm•<ôŠ'¦ž½ÃãÃ.: ý&ýoˆ€%>Eš“÷Ò½+to TÜRZX|q+o€ÔHé½oW›Ke5(©°¶’ê* •ezþÇÔW^‘JnL>­Ðþ&¬W1Þ¢UWWÞÑ-“xð9¥pxí•8çõ——ùn×ýVº¨Ú“ÇÒP/,è-†£”; qðá5 o&¢R 40ç¯;Ì®¥VËìhjªîG?åÁO9¢9uª…íÝFHÔqÇs>D%ØUˆšaÛR)DÚÑ%Ï j±ÑÜsu5 ø‡j«¤÷Cõ5¶jì™ ›¤]Sýuij?TY“Ù`t>â%Î÷©jAÖ„‘$üA¦eÈýŸ•¥Îâp¬%¼<¯â ^ÈîDÁ[€Ân=ÔV쵆çåZ±ÂÕ'™hOÛ\€‚Úв?'1í9åÓ¸·jYî5vN¥ƒm°aé.óþéCZ§w„õq†€ŽÌ§9ˆ”„äšWÆr:`‡5èQQJýckæ¶9‚W¹}^T”Óm“©Äš˜vŽ•³™­¦ònÊ7©^•r È=õYRrZïwà/‡qo­âDãÛ§© F WÏÏ.µÈžë>YÕ¡Á%¬†Þ#oI@=ùn•ËŠæU×LÊ2,ñ¬KŒ­vÕRI>¥,R´æ:åÕzqŸ”®Ås¸c o¡c’»8irƒ Ž$†i%EFG=»lâÖ¼»lYþ}?/µmùê÷•ߢ¿"ªâQ“ Ž{l³Û‚¦LÇ¥}›øèô…eA˃yEí¸ì¿ 2)ˆC_VVÅ¿ Î“šÓGîo{ÊìhŸ§5®Þ;e˜tES mwyV|zMcÈo.'’û|hÙ[ü6\Ö˜á{ª@÷8Ð%a¼²`Á-¸?\xšÇÇf6\ô"×ïUÆÎF0Ôp¯ ïçõÉŵèçŸÑ‹P§8sTÞùQÉG‡¯ìâÛ ¯1óQä%Žwð_b‹³ Û"ßšèâ ]4_2ÀÖ*èäÝx9š¡jF]ݪpyebqèå1*³9ïˆôÆ.*º¡ÿýTï¡´õ]DT׿I£¬!+I&+Ù˜B•¢ÐÑ–¶NÀËÔPU2 h>ežgßÁøÖJ=¾~­éа WišÖn¼àL;.–ï?Í{Ëåp1uÝœ}ø÷›«£7Á‘9—i1EçµÒ’jí½j†íΔ¾ÅhøS¥!ÅÙ /l«Æ“†o‰¢ù é¡ýbQty—ŠU™] §îDS×™IT™o¥ –lAó dDØUæˆQß“n:ƒì[ȺŠÒ=:ÜŸ Ž@n¨Qš@.ÇýÝìFŒ©>µ8ƒrC½#⟽\µrÖœ*d”ÓˆžlãvÀS½`_!>uq¢/¢tßXyꢥÂY×ð½z“úZYöz¦1­¸u99Õ¸ùvIn!Ôa\s¾Z5û`-²?"´zÈ:~dsxì‘3:}I g²®P´±üò¥}‰.nh†Æ`š:Uᆎ…«ˆò £w ¬Ž@ÿï)á¡\½!h qî‡[r|ž¦§PËÀ;øðÙfë~Í0Ã[…ÅLJQÕëqUûJéõFfe/luËg;óë¸|Ui¼ªi;ÕW­¯d£Ub­œÍV^BˆªFð÷^áQg›ur3¸qx¨kí˜U€³Œ$Qåºð[ÝwsÛz+»ÿë ª:F# íû>ñ³ƒ3²¡‰‹L×µ{¶˜æG •Ãí£DDÂçÁ5™Æ¸gnCÊfyãúÚê£ÛÍþ'’•É»M®nÓ˜ôÕ!­~’·¾•G€JݹV–àÉÙÙøxrx=®.—t†¢ô ˜ãéáŸOÇǵåÓØ¿èì?ÀMŽjg[Ø¡0xij÷§×“‹Óqârå!¨Å3@^\žß€¤Öˆ­|ñ|Äó‹ëÉùôð´ 1Y¡Iö£çy1¾¼žŒ¯jD 3ù,!NžÁÝ!Ò« ‘00Ì… `y8${Þž·ûT<7ãË«AG8ŠgP~t>=™üøþ’þùâütrô!‚ÅŸ‡wë”þz•¼çh×Ùù1š­ã*ÁÒf?$X€ÉME_$X€ðáyúz<6Eí¢:PµîÌ_p®ý–ŒÏ.®+†¯LèQE4@¶f/ìãž~yt¹Ê·@’3´Ú9ðë'6E…4ÇaŠ$=@dP¢5¦›bÆ?JäÖŒ½k2ªnÝ*º0ÂĹåÖŒ Š´®Qå]«ÎÚà•ýŽ[×EÛD“b¹Ͱ͗éåÔ­úî¯M{Nó)žäjŒ´)ˆ“Ë1‚TÖïù_ül¡Ír¾© ¦©¿ý¶²//ÏÏNÃ,w ‚=hÔŠ.ú¼÷y ‡†ÃoBüÿ£àòjѵßQwÿC¸Ívá÷ç,Ê_aêy›$-2ÚŸüÔ‘Y™Êrû¥É&#ãÇ€² Ü’¢\evgþ=LZ kV~ì(XoŠ™º'7xõ·$XKo–TsHG‡i­ó]ä…Ù]±3”x*ñzÍ/x´¹uŽ È}È@=ái ÓãÐ,KRãÞxêÆùQä¯3š9‘Kz½NÂwGóIõÆÖÔ©ÚTDä…ñŒ>žÏþ°? oGd—|ùÂHðÐÆüºãô¼ÇeÔ3’Œ¤ÝÓ$]bØWUf—l(ˆ V0±`ŠÖ ”Ë¥¶ÿÞj3]¶,¾ æÓ 9n¦VP| @õ¢$àʽUÊÆLc¥6ƒZ®ã+fLSY?¥RMa³;j=žuv‘¹°¢5HÌã Ì €•¼Í§ÐéõìQ. MK.C^¨ì§¥°±f[b¹~~?¾üàN§ç<§óò„Ë›3pµõ1þuŽvp=SØ\„4·Îƒ1§jIYêÞ‘nLãŽK$3ýêl˜ÔF^¨>r—ŠÀ¤$¨–rÚ0í:íDáFn8Óó‚ÇW«ºÉ 8þgΘv±3ãBþ„@·QÎTUœ•$êh¢p^`¸T²pI³d´Y}õˬý½ó«'¯'Ó“aìð}Û!Üu‹«YÕ¨5· -Œf¶ži& ÀŒËmoÛ¼€½?R.³…òÍ(lVXvÅöùó4Y2šÎ¶Î3ù 6F…¾*p—ÌÃ=IsÕœÀe¡`ËþâÕeµ!È"®–KNyÝ$€(.yÀPpÖ®þÌ(w†¸ZÇ çŒ#8Ê·\3êÀ ´ tÖQÔn=ðÒñˆýäç©ÑÁÖy¬ÎUđŠÌ?à‘åÒÃ9ÍÌ>ºÃŒò8xIÓ;Z=ÍÉúnáµ'˜Ë€ ×+Œ${ÄldwMé¤Ä1U*Áüî}P7Z,ê;¾ËäËô"ßAtQÙí¶ù(phÍ5X¶UÌa9L3^6û®¤‘±µ .v^í¼MÊ)´|¼¾ÚÝñÍW°;y° N‘ÛÐ&ãOyá*÷ƒûëòQSô®§i’¶×ûz“øÁÀ×Ûz öÉË þ¹2{™up‘…{vaIf"Ë<)ÿUŒÚ¦k²²ñÀ2l¥¥@uòmJ>'ç¶ô“KºÿP^FüôÁ¯ýÒLTa¢Éf LÇ*¿®½ÂB«Ø®æ"ªÔfÙzɉÂÓÍшïÍ-˜d^]0ú=Á.œé2LyóâËg5†eÀ†eT¦Ö¤ÂÊl º#Š6<…Y^gðw*Í pKtDn ‰kLošò10Äikˆ1Z«+ ˈ÷IϪ; ša 6X‰q›K²„UdY)ò[^™”jõ}vs¤ 4ãe= Ä ®Ù_ 1U›‚gEÑ S¹ŽWÀxUM¬Ùì“ã«"°¥˜fAFªGêqÙЫÇeÿäÊV‘Ý©Mèbrt…ú¦öGC’­|& "f?M~øÏÛœ²£¦sÖÝ(ðc4^~7¾¯ºš ôD¿¤aŽl1S{èào€x hÌî£÷þúäõŸzÕàgµáN/ŠÞÁ;1"z'Fý=o·úÇ÷jÔ_çó×ê¿{Û³@€ùElŠüõuùíWçÉBg«ˆ²Lî¹@@X§X—O5ÿZ6³ä0‡£LÕÆ5ÙEq¢ q¦ìʪÂìDó#Õ1eqè=vˆ:ÝËÓ5}6Ñ@€¸D'•Öˆñé˜L€ S§ Ò%{”ð>¥ÿ¿S¶öð.NÒçФŽÍÜ¢×Ųn­_ðéx´:Woù=pÉÃNÄ$[‚:á±ê4S×ZÌR LH2Wá‹æ•7X\ÑVço|Pq_”hpô®-ã7 S³Çê<üñ¯»Ÿ)Úâ;Vâ¹Fqâ-…Y‹ïÌ•3<8qÕžÿY³d¡#ìT~ÁKã‹+:ËŠÃ*µ¤.¥ó-ê­Z†Òk¤£é}oT ŽKïm;[0×Å5õÔ§bÊ?YYóXõzkñ»v=“’Ú2ÑZnÉ­˜1}”vJžRÒfÏɟȈ̱„hÅ3$7rZƒÉ²Ÿv߈É"õ¿%P‹` «^ù B¥áæL¦£øî5RQÀ‘Íõ$[Ñ€i„±\µŒk/€ªiöZ^;¤Ó‘£†Õ4ø|v(vôžb_ÛM¸µöuà.6u¿ªêœP¬~¡aSØG½§­ÃÈ»"2·lùšM;ñ¡<.oQÀÕ¦]+ d!‚1U#„®j¨õYÈaå#Ã(Ì;åöƒ &! Î‡ø¯@…}E Š÷P‘•.eJ±ë±¡/(`-‰Æ‹ù຤aÍ«ŒlhÑÛ3ê›cå„4Ä6ªÔZ¨ŸX«æµvŸv¥ä„Y{y,täÛ.߬³Ú8y<Ê™­o3îNw]b3õv¨D;TS˜&³D?Í3ˆ¥yÞãrÔûÁä/å%Hä3÷>ÙŠ5ó»–æs+=r6±#†ýØxð£V6”—Ìöðàx¾å"ÂæC„ÃV€ ƒoî"Ò‚r $Gõ,(Û"’2Ü~-s—î(c^ƒßÔÇÞžNŽ¥Vø|ýáb|åñ,e€âWf6ò–uãLûbk¢Žcë•~ujm‘ ¹:^T›ÄXÇ*¤x×)”ÅR 3~ ˆ,°6‘iè&‰.ôËžP¸³WÎÇ_¾|üð‡=¸Ý †LØÞ‚4pªV³ ÔcDÁÃÓU^Ž2»ªD åXÉmM†—›…X–†ªÃX¤TÔÞº-ÕÎØ£–¦xClcVÞ±”$ŠŠ¹äg+PˆÊc½4¡ª-Õ‰ïÊxÌ o¥d*¦¹mí¢5è,sÔÇ£‚~½†Z¬ø:¹§qˆß dòôªòÂ)˜ÙsM4nعïd9ÆJgIJÙÔ[,yî¥tÊ=.Àà‰Í¶y½ò²¹ëBâ `ü쨻%ði’tû ¸Ž ¡°!â´#C‹aQ–Gð¬SK4„p>=ŸÛHUÛ'µ…r|Ue-ž¸Dð¶0~J੦þ=K’ê:ÂÖ¼àÚ'@„ mŠ b½˜^g»òš×µÚóþ•Ìä÷‘ÈèŒæ"‹U3<û2s ;ºb²ZújH/–¾­¼ðs`BL.Ç'ãËñôhŒ' üY'o]¿ØŸb-szίs>í À™:ÞÎǃÁ»’r›l­ªb°½Ãe [T¹mIœ[9ÂîÔ‰?Þ «©áG•êcЧåyâûéA5Ë3 –G“ß³üæº jùç%¾jù…ø vØdùðEÒ!¿ua5‘ò×.5¼ ÈW÷áªP–z_³0âJL¦Ý>A%.ÍѾeÙ·ÈÂì°­PSiJÛ­òû–—Ü¡››é†!nèåëb{Ëd˜= ÒÆkZkˆ°±ý?|âáá:Æÿ‘%Í ØgÕŠnlÎD»ãSöG"Tj¢ê¨mÊÈš)Úë¬UÎ/½»4Y¯¬æSÑ,~ß³ÿVbÞ””3ñÊ´¿fð²ò¹Ì‡ç,.þJ¯Ê¿Ìú¬;¼YúuZM„On¥@gi†uT˜K˜MÞ‘Þ®}ñÀ˜=èŽc¼§çµRV§pÂŒLd4ˆ²ó§·çy{¶K«µjSy‘©D±xÈ ®í°Cß8/÷ ïlª?:œ¤èø,‰‚ÿj( Ë2Ñ ?kb LfìӑΕb#‹¤…·¥r-\ƒ5ñ>äQ_@2ÖÄ-È…ja"pá„`a‡EBÏŸ öÃ:Ä#ì7?²ãQ™ýóR˜£V1ð\î˜âÃycƒ¼Çßã;n ¯…s“Ö«l¶©€µh° ’ógAÜ>ƒ"øŠãÌö©p¥õ`±Ä‹…eÃmp°èX¯ûê'ü¿__ü PKjŒ÷‡YPKÛA‰;OSGI-OPT/src/aQute/bnd/maven/PKPK*Y3:0OSGI-OPT/src/aQute/bnd/maven/BsnToMavenPath.java+HLÎNLOUH ,-IÕKÊKÑËM,Kͳæâ*(MÊÉLVÈÌ+I-JKLNUp*Î É÷É$–d(Ts)ApIQf^zt¬Bzj‰{Q~ic^ŠcQI&PG‰DR!©8OÓš«– PK¼ØæˆelPK®zL:,OSGI-OPT/src/aQute/bnd/maven/MavenGroup.java}QKKÄ0¾÷W =ue)êuUX/"²°>nKi:[£i’IEdÿ»É6µ]Ìiø^ó11Œ²={²VMÙ±Õ*ËDg´%ø`=+= Y^Là¤vh{Á1’'œu[ZŒÚ£ÕøZ \2ç`—œTîµhÀ!m­6ª¢+6ÌÜ –©ÈtÌÌ[‹=*¹VÄ„rOø]ä©U¾˜+O=á63íTõðO»—ô“Å8€±š£sÚŽË‚ñýPKÃCÒ$OPKöTŽ:1OSGI-OPT/src/aQute/bnd/maven/MavenRepository.java­X[oÛ6~¶+ ‹Ü:jº·%M€lë† ½dÉÖ=} %Úa'SI9I ÿ÷ËLI”“X"y.<ç;²¦ù¿tÅý³Ñ,[ˆ"[Ó 'Ó)_וÔä+ÝÐŒWÙ‹“ÎH£y“lÅîpÆOí8+&71CWnÄïÇ;FHmÌ?'ÌMêʾ¤3ÐÄ«(™n¤ ‰q×qB^²¶ÓË¢ªJFÉ©øGrÍbl–´T,FŒ;ùü…¬˜N6 sïÎú3¢odu«ÈÛ»œÕF Ÿìš+*fÒü?%‚Ýv&Òä(™´4|IRÇ›<ƒÕMYÎÚI£ö¯ÑÉ´]ÿŽ+ý¦ëÑ3R+`‘¦—²Ê™R•œµÎéJÃ'X˜¨´Ë,3€ %.+Iz‹H¾‘䨋 =°Cع†¥¨¬F¿Ëª©ÏEq.5_Ò\§`üÀLÞT–ʪÇÛã¸/á¹/¹(,Ñç£/s+ôókx3fí ðB,qÔ}0áÊ.“ítøÖ¶–4üB…¨´QŽpA,°Ésuø\%s »w{"Q§|ÛÃNXWhÌ‹¢/uFÅ¡!HC3:´XÏñÁÄTÅ3P/yâ×ÄÿF\Âú^èQœI1R­Ù{˜fh2®~å’嘡ÒYøá~Û™qQffìu¸ì øª¦Ô.¢Î¥¤÷»É´™%£€öþRà‰S«$dm¥ÓÄL¼xˆOƒ²_¶Žç‚–÷ßA9&¸¦v^L7#†y¾ä uo—nºûÇ-Q›n¦A¢¡/Ä 'ã"/›‚)X;.Œ˜}îÛ@z„2ñÏËÀÑHrˆuÁg_©LF´öš£`#xpÿX¸d´( ÕÆ ˬlxpsød·T ,…ZíŸäí] He…M*ºèn©"˜p(ÙÐ’Ö ÏIæOb¾gÿÛÁèÖØc²ÄÓ,°Û9õQE ¶A–…±Sغ¤·‡n~š°bÅaS£4Gîþ"æéš&(CÀÄSžu@Ô•ÉY)F©Iýn\ño€å/³XkcœM'gĤ%—[L Ælg%"5È“n2LlPõÁ—hacÙpßY^­kŒ°${ÑoyŒàx‰ãbuݱ1Uœ[’9±Å&I†E—u ³©L‡ÁŽçí~jû;·™kA›‡]lh7Ü.xT­@˜:a(beÂ7²Ëªá4lZÛí•ÄFù±aËÀù •$>fa†Ÿç:=©99;%Gä‡€è ¼ÿt0–×]Ofe¼Àdjlã¾Ô¾ôêw§eÃ"q³/x7°;ýÄù­×*T*+™Xé8ðŽÆõ ¸"™)*X^œˆ(F‹›ÅŽ¡I š[Ø!»y«ÍR‹ß´1ðpŸ(Æ4Ñe»9Á»NÿAeÝ{2S&_\”%[Ñòά]9Lä‰95¢b¶@©¦6Ç^}c„ˆý5E2žÕ\£rÖvRÁám¼±…ɶ©=ÈæäàÕA¿©EŸ=±§}8´'_Û²µ+WöÜzNœ«àÓ5ÉH§ëçÓ°AnÏeÞŽcéé±ìSºÖNÇúéíÕõÅÇm:Ù„¹$’‚­Ó¹ÎzBFó‰­GÎ/\]²‚ Íó¸´Ð‰ÿg÷r!lkæ[ß°X¶È8&nK"ðÁg´‰÷±À3ÅS1 ¡Q3èÂÁ3ïi튨/‘g ‰@Œ€Lb@¥ ~º³&~Èwln*“Ÿ¯ï•fksca•¹O“Fq¾ p¢ )ž2²õ¯d{C–ô!>ú†«ÌÑ 3ïÁRè9lû1ùó…ªÊF3{¼è刖ããEÔÕ“²’û‘åRën¢Â$YÐ’MmìEþ¾zGten°ôA™½Æ &lÝtbÖúï‚=¨òׇi{Xïn­¾÷<ã—œîÅÛf·ØMS¼`p¡‰p¥¢¤J_ˆ‚Ý}\b¹è¹T7ÐM üg35 ¤þÝ^íÀ?²Ù®{{ãd«f¡ìèôèÁÝ΀@Ê_φ'‰žRímQÀjÛZqÒ½¡b3bnV'ßY…Á:™LœœÝmî Œn§í„½†‘évúPKý dEº—PKÛA‰;OSGI-OPT/src/aQute/bnd/plugin/PKPK‹Q…90OSGI-OPT/src/aQute/bnd/plugin/ActionWrapper.javauQËNÃ0¼ç+V=¥ùªJÅÐg×Ùƒ³¶l§-BùwìÄyÊlÉ“ÙyÄrñÉ%i²#UÌêV*Ú…j¬qŒ“Ìx©Xíxƒgã>Ù݌μc«t• ?ˆGwRAêÙ¶=j%@hî=ìú÷7Ç­E‘®±A #ßÄ9 [^±F‡$Ö›yh©Ò¸7ð@ ÷õG»’)o’îoª¬³ƒ4á]yß`;ëOïyKÄ®LtÅ񮃬 ð‚"ÖS>;ó"€î¨œ" CUë¸Ö™³‡Ç‹@»è"M.‡Gµr—?ϲLbÈAÊä¶©j(e Ôj ë 2D1 <ÓÖ(¹>pÒ.W{Ó4œªäö¤ªô¯».ói§g|)· "y!’ªä­Šoiº$j£¢‚:§›\.i¼xEn¹¸6£Õø°yA³´>u=$‰¸¡`Nå¬-“ѹ]Ī><8ØßCèâ Sn°â%–%œ)Á3‰ jsŸQ†2º (¹O2¢çîïåÅ<£‰›rR© wаzæR Ðün<5£ÏzYíðЬZ*m·Ó'VðXP†3t®eK4}óîÕxr9¢cÔq.¯ð5~C©¼Â‚¤ˆ2PÃâ4 m)U¯mE¨b –;-Xš‘xN ¯%¶Ó æ%öéz!XÝ,¸0€(X¯ì?ô®Ì‰º£rEk8¬®¨t+BE6zÀtÃnÜpš"«ÁÇÑA×G¿•ht—\s´î­,r"b;½œÐ߆nú5vò0êGi-àÂuŒ¹-ƒZfýßX^)<ÏÈo–‚½³ù'’¨(wZZÈIDu…ÀÊ<Î Ø]y2¸ŸM.ߎ&ïzFüá#úÜÁGóNè}”ØGêG¤óP×éì†l´„ÔGÄ¹Ýøåf?ƃ&½¨k—™‘EÆY‘¨Óî¼û_‘Šç?È)Pð”ª8Ê,ë·©Zp\¹$Q£5H3¢ Ál– æ2a¤· û¾·’„tH¸È”Ÿ(œb/“mµ3DWú N‰L͵òüiÓìÀ‚fp*(Ó³¤7„•ɺÒ%HæÝ@Çê*àmŽ!Ðþ`­™s¥>VG§iÛVxÆZx¸ö@jtEî Ñë…p£¾øKÁW–¹Quêôìä&¶Î„®¡ÀæœgÀò¾ßæ1¬ñε•„¼a{.4“u>Aʳò)$’.íØ×È>âÑlv6롚¡Ï{V©Çiå _FÝJœHÖG°¼gId2DÁ˜^ÞçVÓ¨¥Ú Ð0úI#tƒRºÑB‘ÁuÃëàôÃf2œ¢ ‰‡v×·ƒØä«óF7°ÀHrh Ƙ焙÷HKÃ<ó"QZ˜ÏMÚ‚0"°NPÞfŸ!pè)êÀÏS¤tK¤rê$.C†´{2 œÉ&45XZT®Ç˜²ÖÝãÉ˳ ›@†ù4Æn]ã»sö…íòùUßT§ÅbA’óÊÆu¯w6ë”Wó…4ë&ç1Î!Îi¤áèoìüÍ:õÑÊÝm£ýTT·ØÙ»3Wn 4Ó¦‡Í£ë6\ 1l±2þ–°œ2]™¨°³S·X0ÌÏJëGÇ}+©ßŸÌ&ãÉ«G¢õfÎvÞÛ°lcüÛ€`A+Ó˜xÀñ ©Ì3|¯€A!T¤Û±-d[øÕ„«ò06‹ŒîHiýõè!Gƒ¯Dbš œ-ëXaFô…!g$Xƒ6Nd¸ýد ÔLÚ¨}Ï¡ä]ÚúS»L´pS!+O/g£éÙìârx6m²ó%5ÑRžßÍsÏšZuˆŽw²ÓE?læàlúWã¨#êôÛÖëž ¢ qÆ#SŒÛ¡ß£z-Z_â-“;H*ÜÿòÅÌŒ©4³º»¯ê†ôì¯0‚Ê)IÁsšñn–! {Ü€Tßî„v/„vˆJvÂ×ù2 O&ãÁ&²øJ­®ÞtÇÿºÌìÂì¨ÄÇ%zÙ«ÃÉ5ã·IáŠMðŽÈØv"=ÿ×¢*#>0A`ÔJ¥ =¹®êqðåzÞÎ{@¨4=y‚ê ÊTè©è¶rÏwPºm>^vt'| Yký`ç| h7†·ÉÐzï0[ÎÝ|Ô­qSyøŒÂûJå¬ïÃi½æÿ‹TIÃo­Œ‡y¨š¨ÜM`û¶yì¿íRé¶SM¤Û¶òÜ¥óÐ×F@&9l¸.6Aìz‰ßVMKÊúÛ,£/§Gˆ_‡êÁf:,?‘ëóØ}p æTï :(ßPK÷qu(PKÝY(;*OSGI-OPT/src/aQute/bnd/plugin/Central.java­Z[sÛ¸~÷¯Àúa‡J\ªícœdêµvÛµ½õc†"!‰E°(Çíè¿÷\H€/;[<8"œÎåÃaª$ýžl)IþYK¯Ë,®Šz›—ç''ù¾b\’çäÄ9‹?å=÷^Ö2/â7w)+ÓšsZJœ¶óŒocšy%(¬à4ÎKIy™1§‚Õ<¥Â¡Ö[=oQ]Ê|O–ùN/Ö‚m`—dH>êÈ…Ã*ÔÚÖa׊؉Z9þ2¬YÃfÐ…ì8™hg8ªn48ÓL²ôŸ8•5/õÖvç‘€ùÓ‰Ú˜¥]© Êo¯nIƈ`{ Þ_n§¤tSdG9õv¨< rܽ.h õˆ:b]÷^¾y£'Þ•-Ê3Û¨(ï$†Œ¨ú»ÁS&O€8Î@‘Aéò·Xzw·ß.?_ÜüzMª]"(ž+)R’! Ö&mrÓLÉÈ4¬²DÒ,6¤–n$ŠW¨jœ•ù`ïåY#¢ÎYÔ)e×ЉPüëÚÝB½D—z|­À›ÐAB›cG•Eàx¤Ôl¿¢…„´Ê˜Ô¿>†™záún?WèÚð@åû¦`Zû·UÒî†BÃ8NRt‚7ùÂý+¹d< …ƒ±õš±‚&%9àÒ¨£[†›ês žª@žƒ*=3Îêp)LjE´˜eÜM^ýXtO·¥4÷v<¼B¥ØÇ¬–£Ëìˆ+±P”ÑéeR–Lä|Ö„ 8óræ;r:‹ oCŠèz$?tB9UP°«5ÌHNïm­Dæ°i¨¯^ÌÙo½H“X‰'!èwóìMÿ]'…ˆü €¢üÉEYh”$T”}jÍ2ƒ@-X…™p‰ )åR!õeƒû%p)¶"Î_ð|]£A— Ô—ÙZÿII¦h·U×ã’ì7ËfJ(¦“6…3¡ã–Ç`4þcJ0ùùç¾;LŧaU§„:‡•bÛTgR â(LŒÆ-›C,£´¢|ÎÊ5M¨¼–¡pìDÄŽÕE¦ !Ù°Yô’òuÎ2öE<Ó2ªÃhHA)§PLI]–d ŸÅת9g-"‘iÑ lòИÛFt /o>]­îs<Á’l¯ 5¤Þ]4{;SVñÞqQ-µ?”±q Z—ºaвÍÚîèƒÖÐ0XRÜ4Ýiš¾õrqÖé;‡4ÛšË$÷—Ð…`2w‡#ÊUh(ÈZDúŸøúþþöþlÒX©Ì ÀæøîËï¿®n¾­®¦7^ÕïGÍEɆˆIî§g ò€}ËýC?vqÔ5ÁHÞÙxâü6iöÙ›}QÕåÐÊÔžÿ{ØšMÝ6 8/æÎárú´C„ ܲB›©µŠ/•½_Ô’ýe‹]!tZ†5ÀÚïÞòQWñ®ÁönÙmøùXs¬Óæ·2l§!Ô pš†ýkc{yøàvÅð*7:0Ü ³¯t¿¦`·eZn4DÐyê6Ô@š†Ò@ÛC_·°· ¼ìâ±û•†q°|¤¢¯ ØËÝÈýÂíz}£ÖÜ|´ (Mg¸YÕ¹„ž}R™\X ¸V8íÖÈv[ûÛúÇêÎ:±â´.§µþxç®1·#dX8ßëUÅ»×¥tOX·ßÀ,¶ÍâpQ)Çë¡“=$ž¦ïËÚow(ú±â`©‡šmsKÅd‰ž²@O®RÝÒOŠªËžä¥ˆö=ÄÔ.BH²ŸHB¦§µg:[––ƒÞØ0ñI{Mkp&çqøàÕá®ìt޵ ÎvÈ?ìÛ±ÚKíî_šÖîäôdÏŸ!rðÖXƒ/M| Ë œ«gþÓ`²€”v˜ÀÉŸç´˜ñž¦¡SÚs¡pa¢¤ì}%ñÉ»áŠr†ÎÏ~†S™[2ü'êÀî³¶Óãªö 1ÙÞ"|›!Çrfµ›¦œ/ ÁîË9[8bŸKñ”ÃtC{á'#¡^^¯…’Ŧ´Ü"u‡<âöP¡ÕVlk¬®w¦ªdD.ýdY˜Þ§ÆLmÿòãT÷ÉbáRtÑŽôÖÒ<Œ>Z;h®µ‹Vh¡Ÿ¬ì%Î…Ô¢ êÀF—¬† ã‚|$ ÂKè]"ú[ Lƒh®±†‘cÅj 9L!¥Ö|$ÀZ\D÷>™¼û~裑©qQ£y[ë8%]ÉÚ–uÛ^mK¦Â·Q‹ZïÈ)y ï`µÚIUÂ/ÙK =M—ß9@ßX¯ÉG(þðñ~Ë5¤äï%ýQA>¢YñJRÕ}Ãt‹‡­‰æè 5àߺá,ÀJHívbû«ÿBp¯7$ë‚~$¼êœVÕÑsëÑ]0å,bPob¨ òj¼í¥ŠA¦¾ÃÒ&\B(VQQ2ë}¬íÖªaƒ)ºÚÌ/H’éXÚ8|ÿ|Öì$H?9vŒÅý n˜ÇW×wŸ¿­n>­nV×½XŸ²G[ŸGÍá¡›çJ; ϪŽ"°&˜æŸ+ÿcÿ×ÊêÂ1©=({Bó?Aƒ`0tÐJ© MØbë‡/=CQŒìÇ“ãÉÿPKÇ÷W¬± Ú&PKÛA‰;&OSGI-OPT/src/aQute/bnd/plugin/builder/PKPK@+95OSGI-OPT/src/aQute/bnd/plugin/builder/BndBuilder.java­W[oÛ6~–á…œª òÚÌEZM½ÆN&ç‚nZ¢mÖ2)”“¬ðß!©›¯ë¶æAv¨s¾sÿ‘xAf‘ßrMñ„'8Kóãx’³4¡ò¼ÕbËLH¾‘Á¹f)>©…œa§,SÇBR,©¹Œ©2R…r®Ù’6vì×ê;¯2‘å&±f‚«Á”M°P3fѳ|’²Å)Q ]ðäÂE…賦ýVsOáYda"DJ GgS%Vé¹O }àð9¦™É±É«äQiužQ]¾ô;çFX=1Ï‘_½ÿÂxâw:*&Šn¥÷úý°ÿμõNOÑœð$…®LšTöìËxNãTÒ/OAo")YœBÂáõý.>Ô^¬¶-Gúø¹7ºÜEŠásöï}]·Ф:—i™S¤Š ‡ï¶TŒÏÚRRŽBCڠȺêÖÒÛc ÛìÕã½QÅSVnD?)‚Â¥‰†)ã$Ec-AÛ»¸\õÃèqÐ÷º¨=aášê¹nŸÉVDÓ½0Ã^ôPn¿Þ„»8ÏKCH×ÎJ°ÄtâÈ•þàƒzOá¨hI• 㥌ÓQ¾œP˜HÍ‘¢+*™~qIÔò¥˜(‡ˆ–î£kA1X-Œ5üu™v²XQÝÓ`|¾û†ãqï2 JþYcÞ‡ÑàökP»huØùu¨ÛEoÏŠðšçè¬îâcv®£ðqt7¼£ ‘ klbb¹b“sŠŽ+:Ã0ê.¡Z>=H§y*¡öBƒöǃâÿ¢W^Ù çƒT`Aì_½ä†$ o®4Ê f@ 7£dªý0γ̜?É¡5”ßιš´;-c"“BÞ®+ç?Qå ZQ¬#"g*@ۖв²­tˆ­M ’)ݧ»««G;?E §yê’à—X®4ºÛäúÆn€jÛ¾¾§WSˆue»ì7¶a f¤ÚÂNÔ"hSÃuCIÆÆ¹k; 3â.ãaµ¹và1SäæùõëJܬ«YÂ*ÃæŽðÀôÜo‚h—û«¦HŠ#„N¥n…h9ÄÊ7’.ˆjö½òžQܳhHô"7ÛÄ QñÞïÁ5hHHl³?%y I·Ôby´ö¹ªHàˆŽ®Ìô„¢…q³,WïðÀÝøŠý]ŸÆ©PåV¯gµ1§1x5G:vlßqúœ¹^§¥Â;ÔFo@+@geÞ˜:W8Œ¢ë¨´äšúÝÀØšüâØö=b¬Ò=2”R@’;˜‚à-bxNÔ®yðÏAæVÂø‚þŸÕ¼ÿ$7zÑh0ºl:²/ù%æNê#JÒôMÈnê™ßyÝØÆÍý·ÙÐõl­4Ûx›²I`êƒú&‚ûáÍíçÇßÃèúØ2ˆ7·AM¡Ö·šbÜ®ÿo”YÅÐ%ø•ad|NŸ¶oVÅ(ýÐúÚrx‡ïöñ­­ÑÁP_Ôá.¦çŽ A•=xraî^îJÞˆ«ùõn­[PK'ÿÌãPK’|“74OSGI-OPT/src/aQute/bnd/plugin/builder/BndNature.javaÅUQoÚ0~N~Å©{ …ºÝ3CÚÚòÀ4¡­¬OšŒs¤Þ;³ºnâ¿ï’0Ä`ª´ˆ“»ïî»»ÏvÎÅ7ž ðO…C¶P1ËÓ"‘Š- ™Æh†a(³\Ú$ E*s‹LhƒÌ Õ…hÙäFgWñðßFEáNñ½E+ŒÌÔêØ”»ÂàD¡œÌÝÐËø‡À*A˜‹T )·®U¼‰&Å •³ÐÍ¿Â0¸$¨Ó$^¹ý¡ôÿ$ôõE%êSe-{EI¿cvrP¢i·xHÏ¥ŠÚnïAuîÙß//ƶFºZlŽö¶K9 ­í‘ÿò¬ì6å }›¨a÷ŽÚáïGVߣn1ëð7PKˆë?f•PK@+9=OSGI-OPT/src/aQute/bnd/plugin/builder/ToggleNatureAction.java­VMSÛ0=Û¿b;½8D9ÚRè!=ЖÒéa:м8Gr%9Àtòß+Y’có9õLËÚ÷v÷iwвkZ ÐïµA29©Êºà‚Ìj^æ¨&iÊ•T®è’’Úð’L *jdgOª‚ +y¥‘0©(Ô²V 5™~Sò ™™¼Àö5S¼2\ŠG`µ0|äÈ.>ß2|¦ùô0§•¡³m¯.)CB™#³¶ìARo¸äxƒÊFþK|¾±Q53µÂüqXÍÉôëÌ)â9¶Ö5Ñ;ã_R]ÏP°ù7ª¬âiUÏJ΀•Tk8“EQâ uŽ=Xš(Œ†AGð7M“Jñ¥»_çzvšìn¥ lA&¤Øùb‹$—lÔjÄ8û^Þڳɞ:„†r×FãSZJžƒÃ…mðÖ#q’ðKÈÚ m¨`(/aHyI.¥‚,Vöþ‡÷À @– CZöá“&㨒„Ì©>Á[cŸúÄË èõ¶ÔÜáMšýXûP…ßuYúM—PDvÓ ˜è#Yc³õ^z¦•]j„‡ÛæxœÒÊÒ± D#°ÙhšmT-†45r]µIEö7>ÛÖ«éÔj4ê‚Ý—ý¬þKùµ‡y4§¢ÀüÉZ7ÔÍõœ‘0Tº>ûu<ì6/™sMÖå}ÐíÆ×*2ÔüV—æÉÝ4y­(ciX®§ )zx0TÙk¨œ>cŸ²q4uƒ DS?à¨b[ut¨¨¢‹ÞóÎe$Ìéï1Ñ<Çܦ r‰yL%LÈ&—^éÞïêp‚êÎúÀ òÎýAĹ–ê…¡aGÅùEO[ûÚa|Ó\;D;æ¸ëzküÎN,ØhR¢(Ì|ÛÛ<6¢ëÑO"÷4ääðìçéçßÓc‚jZê, ÏùŨmÝÝ]8mÔ3Âùu¸xsÒFlvúÀì]LôN\ª½c²º‹žÇðnÜ¡k–|ô$ˆÃ6ìõ|Ç×FÜEI»ë®Àk²hÏN÷Ï®Ã0öS/Ø+´pÑ›r©ô0Ïï©ùR-·£–/Q²ÏáÃ\›Üsqaý”Jz¶h/’lŒ6‡¬÷»˿Vé?PKÃpoCâ PKÛA‰;&OSGI-OPT/src/aQute/bnd/plugin/editors/PKPKYk;AOSGI-OPT/src/aQute/bnd/plugin/editors/BndCompletionProcessor.javaµT]oÚ0}ϯ¸ª*5‰{,êc•ŠÄ U_*Œs ÞŒÙíVñßw’©ÒÔù%Êý8çÜã+ç\üâÿQxd ²\™Ô Séuý ëÜXÆf …’¹CösÉ2/ž}ê¿S Œö¨=wNºª¼©ßS®PåU&/J Šªá«N‡f+ôÒè{k:g,È2´&D£á{PaïK^ƒèÔh£#”Ü8®žæ (Hü§9ŽH÷£Äg´°©>q…שiØåÒ¡ˆª‰ž§±è åo@ãóÙŠÙo²æ…Ýݎ0Œæý2yóy\Ò€!ìúÀÁ5Bl¸*Ð…Ñ¡°Zœ.oc¤©}ÍK „¼4;a§Éð¨»9Žeèï§hÃ(>þŽeïæ~’μáhÏõw.®á"®}Mz1ôZL¡ÎüŠ*¿Ä  ¥â¶žr :8¦`© ºÝËÉt’LƳ¤wù¦pìuúÂêZîn„m{{Úænωqÿ¶<Ý.ñ ÿ½2ÈV2cE^m„d˜ £t9 Äs¡´¥7 Ó\%²¿×~5}Ê´'aìnÜÎ+¥rä²Y ÿuÑt+(Û[žêNQþÊ?óEFÝ)ÖõGŠëæâÓ<°úÌ_¯•Fþ4ïðº}3½¾ÝÀ½ìÞši]ã삇À¼Ä¯î“ÎnLÎêk2‘ášW¹9ø›v¥:¼0G:1½‡Ãà?PK™éÏ(³´ PKn»k;=OSGI-OPT/src/aQute/bnd/plugin/editors/BndMultiPageEditor.java­X]{Û¶¾Ž~ª=k(ÇaloWUÜ͵•U­x¶Ÿø"Î<˜„%ÄÀ ­õ~ûÎ@ ü’Ýn¼HàœƒóÈiò@gŒÐ¿†Åw"ó¬˜q³”©ôx0à‹\*C¾Ð%¹ŒwƵþšæXax†cå T³˜%Ï5‹©X¬˜–…J˜8ÛD…0|ÁzH¾ÜÓ„Å)§™œõ‰q4KÎVLõÑè•Ù2“ÚÈÅ‚™¢ùœ'Û¤gt-‹m‹¬x:c¦ODÁû'|šAhPñ´Ï‰0™SeYovvdçÍ /î2ž$£Z“DzVd†ŸCŽLìb–b"Õ¤1~r,‘±Fˆ¦>ÖÇs*fì”k`gŠü2°$¹âKj¹¢w#ÇvÔ!Ws‚õˆ³“𥄠’cÆîŨmM–JÚ¿ñ &ê^ C’¹ÔLTRö[RÞ!•{¡!êãVWç %èÒ¬3–¢R–k#Èùf‡+tšP²@_¾¶rXéeоŒ=­—ìBÓJ4–×EÎ`d\ ”Ðç®´A÷k©tÕbš¦Ý1ŠÌœk/ç±W{ "ï‰ÿ´,Ù%+¨9IÀ—” ´6iݾ¥ä)I¬ÜM,k¶µ¾ðñþ:$‚­Ð3!£wyùp,)û Ô`4º/*•Ÿ8®©È ÷YŸ2ƒä(<²"vK€ñŠ›ŒÕXIB aUL7“¯ Ë —‚°QÀ‰RRØ>Ëœ ûØKn0<ø6gYvk|å3´ Îm\ÌÀ½4tòp—ˆ"Ë@e+ÌPSèººÏ ñþ“!¦Y&Wš@·#FB¡a.!G)ÎÖ_£húâÞÞ·¡¯´<–ÐÀ48r©|sa¯fÐmÇ.ѰvÉåõUüþÃûI`ìßOOmK&®3{!›ñ°vª¥bH?íØÂìêʬŠ3$¼ç‚f®Ù}´Û’kyþÝ)Ìn„8S~øpq2¹Ô³ÜÀH±‰ŸQ“ΚžÑ¹æH`TÁºˆ~d4eê)*çjhTúÏ~ ¢ï¦§§Ne÷†2Üï¨ÇÇ2+ÂI÷ï;ÜHdg;£ð¡n×<5óho¯ŸÄÖòðg¶>[£Ûýß«Óí~M«µ•Sì#Í 6 è:ZÐð\AÇP†3=|^Ÿ>x²ˆõkI4 ßH¶–éA­CÿŸªôϲ®*ÝŒ?»J+GcGtR6[s³Â~¼½<¾øpzJ~µŸýgC .ƒÛ…-³{šiö[ºÁöˆ2Ä«p6~øS-ž¯' 0°uÝ› È¡¤a æAcQ][´½is¾¡w D½É‹ëm"Sö}Ü|ûÆÎlP'µ;¬5ŒëR„cŸ"â¹c"™‡œ fæ2%)×DbYVîŸ%´.Å\wÕ‚®= î„gÖQ^dÍIOà0ÅrÉž†b6uãÅÕ"}KóV˜_j’ʤ@·m±B¢„h }fg6}&…E[ ÷W¨ho{¾’ìSPŒ@¦ =ÃÞCŽ2-I‘§eF—òl…߃~“‚ ¨Ð]`Nj®;Wãˆû·”²à çxÌ ŽµÄx©ŸòÚQ½B¦Á1©Â¬¡Ó6Áõu¸ÓÝ2ö¶cP uXvCÔ…p}TBý+ÎiÀ@8ã z±É¿Šæ@Ü‹JCeÞÓ‹×µ£€»?Dö„éDq‹‹#Oz%evÅsk`ÅÁAÒ†Š„A‰Oa'`¡~•nÖÛÍYŽp"jPê8`ƒDÿíÛžý?$®N‘ÏaqO¶ÐfÏÙ6ûq𢪀2É"!ÅëŸè’B®È™ïFp:§ 2 zY5½é6“FžQõ]bêþ¡Cá_íPÈÌQbøÒ6ÜZ¶MO&q "LÉÝRÐonÏw|ÝÞ¡}û­*nÎ’¬Pjl½¹ŠäXüUà‘Õ7ôF(ýRýUÉ¡•G+â6ýZ޳ 5j‡-3W‹Úǹ‡1I¿‰X-çz³uÔ!Þ"“Ö Q÷¡o*–4«¬´ïÈY¡ ¹c­u†­=úÁ™ZÛˆðïIÐN×ßA=3  vÍìψ,­µFÅL¡„=ô‚Xš%EV!˜Äõ b<®]Í™piãr“è›[tÎ ¯Ûh#mLá)b±ÖJ×ǵ§Èá!9hž÷VöŸÖúzï <«pIÙ’p Ôèúr Ašþ¼W5@‘Fî„Ó¸–›,q£eø;jä´´­y#ž›º˜ãó‹Éíñé‡ËIÓà@)ÆQÄ »§Ð(ðÒI¯E2ùÊ{v¼(„pGÖo˘BtÒàB¼ûôÙã\»ËnîR*¢k€Ür:e•íøíŽ; mØÜá°ÐÞþÞºu㌉™™ÃÈ«W}—.Ž¢Ö¾Ô·ioÕ¶Ô¸c·ŠÙ¿ 8§tw“®§ {kX|›ø´1Ž}=tùÄ?Ç|©ß^Á³ôéÃ.}Oµœ-Úz¨¿ˆè—ñØ9Ó­0ÁÿWZÕ[yÚ®ÍGýÚ7šCrcnĺ¹ÿ毸)ööþüÇ|»^ß¾úç>}þåqüÝË›ánüöû7ùõæ&Ü᎔¢k<2yÝ­‹¼Õ\XÉ«9T ‰*…ã9…3ŽbVW¼#í¼l¶bñÚ<``åj\¬÷"Y•;ºŽ1|Q k×ÎRïí©‡ 5IÎ‡× ú˜²‡Kè¨Wá…Æf:4°«=…FhP軚T°H¼BÁЦÜ2£šÌ>j–d›ûr ǧ…oJxkµŽ†xe“S…ÆÛwÒø”.öLÊ5ÒéœeÿPK`ðXÑPK.~ƒ9HOSGI-OPT/src/aQute/bnd/plugin/editors/BndMultiPageEditorContributor.java¥WKsÛ6>K¿õ¡Cyø'‘,ÅelYªHO§' D ࠒNÇÿ½»ERÖNy±ðøv¿}»ÎYò­9a¿–Ó•Ližk!)O…UÚÜôûb›+m‰ÒkÊ“Lä†Ó¿^XÂ)K¬P’^Þ´CRÁ2µ6tÊš±ÛžÅ‚†C§pĶ2qfÍ™¶­?”þ¶â2ÙxuwJˤmÕ9Ϙ}Qzû¶!¼£†z…_`«ôßm`‘rŽ'o\¿KUnÒi‘Y1‡ày׫_V‹Ugmò–ÿ°>4Œaí5üú$ˆýëËË>¹$S&Á(C솷Ġ×)on‰z!ëL­XFÊ06Ù¢Wr,½²Ò(*]p“D¬2î`¨\@ó¤E™U„ÛÝ^—S5­’:T -Ï 2½Ý Sñ ™ŠH )Mƒ#wsb4]÷ób•‰„$3†Œdz”±F¢†X¦†¼#©äŸ~/×bÇ,'²/=m~Ì«!†móŒû Üb¾z;ÍdkúшEÔ5hóîü§#ÁÍë™"ç°’^â´{RãŽ^kê·…–¦Ê©ùZ¨7ò]Ø»Xƒ[gQ]”ý¬0)_¨Z"‹,#⥄aÜIe¿VÊTïEÖÜúUÐ(ìRúŠDà”\—v…cïYI”··žô“ÿù¸·°Ö\‰W®“@*ùá+Û±±JΗ)·•’¾:eu5\«AøQ:Xeh§DJŒ·`ÇQ6h ¾ÞUp\6è’CÀ}é-|Û½Þ)ÎÁÜ]ã.Ãå–·u€qïëaÏYb~ñD{ð4 %@"ÿ–ȄçÞ@ ôÁÁÞ?:­Î¸^ÍF!(÷î™ðVýÆdšA¡"ªwðòÒñäqO0a ®¢Nê¾DÚßÃRËúÿ4áùi<ë`Šw¡_L:Ñ£xú»ç¸;Hw"ŸÍÿìÂâ]èçèSí9ù.DP¼wñrøøØÁŠZIS¾„OãF øÏÑat4›=L‡‹‡7­xKðÔŽ"O«æX?‘¯®Qì›·{ͺ¨o²v¯¤äßËF_Þ´]Tǽƒ¡›ªœËPâ ëæ²Î+rálöd¾˜]ÀAäèö³ÄäO^xŸ^Ñì›#£0̘™àPÖ‹œ•Êb‘ŸÁÃ(§2bE~^0Ü¢/Ü$Zä8Ôc;ƽúƒn£ öW'a¤ûLë€TÒ&”†Óûålô5ZÆÃèaGûvÞŒq53ñXM¹,‚ÿúy&[ÿë“pxë2ãà¢ìƒ¿â¡÷½ÔAs˜Va^ŒÕ½VE´þkC§£åp<ãpö]9"¯”¥iÐ æa‚ F¡ÙúÅY¿ö¢nô'âÐŽ™ 8ÏýÚÿPKçXÍu&wPKÍ O;5OSGI-OPT/src/aQute/bnd/plugin/editors/BndScanner.java¥UmoÓ0þÞ_a@b +ß»!mmE´mÇ>lr“Kk–Ù‘ít ÖÿÎÙym“ž”.¾{î|Ÿ»$,¸c+ ìKj€.EH“8]qA!äF*Ýëtø}"•!ßÙ†ÑÔ𘾩6¥ZQbžh ß#5ðÃP•Æ ë~Uø{vÖÒn$n ¦áó%•zÅ]Ô$]Æ< AÌ´&ç"œLPsƒ5™aþs¦¡4üê\ÖS¦*€¯@õ¥ˆø*UÌp)ÈRo‚žsë¸gž£Šîý~Ïò¨ü<•]6"9-,½rdw}KKè à¡Ü«ÐŲ֫57 ä׺yPí À@€—åù-ðZ)K)c`‚p]a½`Í !íR`R%ˆ‡µœ’#ü{z"Ùÿ7¦þ"ê/êÈïµFÜ6v·~׉ô^Iº ó­1 ”t–Kºø6>ëϦ~·•¤¡§Ñg.2Ž^¾zÙ%9ª?‡“Åóp77¤Bg³é칸Ó’m¯S‚5ëª=wñ5~Ð0€ˆ¥±™9®òDQò`øáìòó"wÏèsRýk&†{ìé /µÌ1fÉÉÜ(.V]2r Þ“;x´ØBƒ™^·¸y~­†ª+ª»ÚÓ M{g‚Å?AÑ5°”.ÉMæ‹Ùe1šNöTÒÄÊĶW…^< r…=Á7P!£Ùs~ÏAmxýr•ÓhÐŒ†šº˜N¬ªªhÛOŠo˜zÏa޹aÊh¹¼ÍúhdÁ¸þ„#wb~qP9ø_ò]üGº ëW=ýö¨=s¦ˆL,6,Nñ Þ¨Œ\Ì`ýî$SÛyEÖg™k±¾»#@»¸0öLEDªP_ÞÞ­òˆxuÒ >Ù-¨mì…òÀ,ÔKÊ’¿/U¬ö÷·£9ÉÚc‡âT}qJdÑáôyýº~eÒ–hE¶Tù.ùý÷<%^öî—3€®ÀxX¢‘õ^[Kj-Ò8ö[ ȵå<›ArëîxÛuÛýH4«k çÊ¡—Œ7š 5Zºd#yXë{W0~|ìkw‡ª}…DR¡®PI|×ß“ Fc+³î‘ãcÞ&«’ç$5žC\óÛnžäPõÛ|æo;¿PK–— R¨ PK–P ;GOSGI-OPT/src/aQute/bnd/plugin/editors/BndSourceViewerConfiguration.java½WmoÛ6þî_A¸_äÁP³-æØZgÀ±ÅþM8Ÿš ²l\*ž­óÿBØ_ßüÖ9´ ÕJÝÅ´vq¿ŸóPÓš/ÕDiËó…@ï:`Þ½ÌÁ¦ü|ä¶ÍüLèƒQoDn‡‘ñI&Á/h[Y<;¾˜5y¦+@µzMr`ã«òߨq–ÔõiŸj†`6-’J`¿®sœãEÜ4(›-îæ±î{ƒÿ€ä莮aàÄ*’kœ˜Ñ"xÏÛØ8í4íYŠMÃêù¥lÆø[‰†uóozZÝøô@NÑr_¦pǧl¡bÂ%Srô#m‚Ù-ë5ZuÏ}Þ²ky/åæ9w´ª][Z ††R½ÕŸ$€æ+Þ€ÆXp­†²Óa©ý,Öôˆ&lÍZ”™â z®Ã÷ŽSÞé˜ç̶Së9Ù*F‘´JUŸ¶¥öwóè2ö\ÊŸ0ìœ\Œ;Åeœ gBqvr3k¥:4|TݶÌñc·Á|´tÂ΃Wße’ž0r¾„ b´ÍVµùþÝ})¹vÁjt[?ŸÔ¬Ýýº¯×‡ê¢ö{¸G„à­F4µ?‹½JöÇ¢N³ŸD¥yð£&JÝXÞÝ!¿èÈ.k®˜¸·œ¥¶o*3-ZJ¶²¢˜‚ü¾˜ JëŽÏÝâ9ZfH”·ã§ÝrΧÐÿ í¾Ú˜(‡wW¬'Lô7qÇa¤Bv[l75=ü PKÑ':ó]ëPK•¬l;8OSGI-OPT/src/aQute/bnd/plugin/editors/BndTextEditor.java…RËnÂ0<Ç_a!IF=£ÒÀ Ú ^‘q–`0¶åTªø÷:¼) ú´ÚÏÌ®­)[Ñ 0ýðÈL–D _qI äNÛEˆ¯µ2/é†ï¸ /—¦2&¸¶@–sÊ€P渒5çÅó“.qðíž³jôÀÜ»i?œa&¨µø]–“÷÷0®‰²´øªõƒp8(º!ÆIèG‘W(o|q؂ɔœóÊZ‡Ž%lkõç„*Ü^Pe¦D"N’¤‹¢ŠP¤rÀBh¼Q¼ÄÌuî—a÷Þøx¬×`ȼ{†Q§s*3%ÃŒ.µ–[wì½á:lvÄÒ ÑÂhl”V– Òha·à6éâN§™òv>,Ú¯Í+Óf$,íPõ`Î%¯«A.˽G-ÉFù¤ŸO¦iQ ŠÉtü9ŠtX„Y/ngåøqà÷A ‰55«Ô.¬³:ü…šü¦3/·C¿PKåBÑKhPKu€s:4OSGI-OPT/src/aQute/bnd/plugin/editors/MacroRule.javaSKoÛ0 ¾ûWpÀ€ÊE!ôä²5l¶v·^d…v´*²¡G;`ðŸ,)žÔ$m0^l‹ü¤©ñ'Ö!°ïÎ"mÔ†ÒuBQÜÛk³¨*±zm¡×E.Å`þjGjñ·¥ÚI4ôò_]d’¢¡½éDÈ ®‘‚—ÌøÊ¸îxx€Ä*k`þTø´xfáÞj¡ºO®mQCKPøRdH½(Pë‡þ İÓû"ÑF³>I•¡¦öâ°m…¡áÔË%†é|,xŸ™t^—¬?o™fÜ¢¾çL)ïÕÄgN-”îYSŠjd›}!ßñù%\|¼ÈqSÄ Pƒö ªÎnÉuÌ Ø0 Ú‰¡ÌOäA™$ù«©¡. §ÐhVyûqû·}N½î!!ÃxèÏ»›Õíúnu“~BšaÓ÷™Šnàä讎îÀ ô@ƒ®¾Ý–m'ã-“…‚Gí„bþBx©°@´Cû0ŸÂ={ [¿âE‡€j¦½FŽ[Uv%Þj9ð¡‚!ùdMsˆ™¡þï}³P"Å¡ƒ$ßú½U%KoÙ5û»Ò'E—yuÍ‹¸eUN~W ©á†Ý³˜‹ø—Ië¦Ò<7wõ¥×1¦9/Æ©KT¢’)ªg—¨*4¿ÃŸ!¹IŸ¨›L;Úž×K–bÌRÍE±“äžãÊ>-ïá„ïàLé­È±‰Øø¤âyÖàí„Äp•U’óÒœ)‹TòR+ÀGE¦`&ˆ³*²™(´äIe¬™k¼ƒ@gÉ –Ã1Wzÿ\ŠLõ”PàL¥dO-Šh4±ÌJ3MŠçg3烹óîYæÉ›æŠF^«9óæhÁY ¼ç)7§tuÏ´ñ5êC\²*×ÑÈ<\ y›`‘®¢ÑZH}Ì{ˉkª+^dâÁ±n«ªhÛF?W-†&%_B¤à ¡Rå9¼}Kô¼ ŠÅ’ähY¥º’˜­¹›þ:]]PFmfW“ÿRH¢Ô( @û¿'V¥bî¯ÈZàñŠ©S ?=lë7ç,11!Œ³qá;Tó/TÊ>ÞpS‚sºKg0!QM.|y‡”[Ñ5Hëø†^ˆ®ËQÂ}jŸÍrÀk·qdfZ@*‘iŒjžgÀ\aȧ}nYeQ›2äÐó "±ûÌ )Ø3$onÊ–Ó1WÓ”Ú¨âIN)äÛ£zÔ¼¨°kÈÞs÷ª{SC¿A¾¿BgH=†åîáDd˜“[œj>qjÔ×ì÷ÇZ›‘cn¢¡m†E6 I³ØxÞ©S©ÿºÆ,Ë¢i3?¹_ÏÁNHÕ΋kàYÓNU•(#º›49ÿ8»G)y†NŽšÌÀ æÛ-ýŸï`‚°uÛµ[\Ý•ú‰Àjy ‘ÚPa{Wǯß'›^ Þwž€æ:Çzf|fjÕxÙ,ÐDÐx`M©L:QÛk„Ãv¸íœû°IÛQ5îXA¡p;‹Lð¦y5Rjêf2åé->‘™@7ªµ}KF=¡ýÚ÷‰^ ãÅk•n'Ž9¤«ä‹ ¤Úc쯢¡¹kF‡IUÉ6ÏŸíZZÿ0²lºOè½[| [Ÿ)DÎ÷í8+N¯¸[÷ÙðÖg 5† ói¼® û}/xF[¦msr–`«…~ Іè §¨CbN£®´ÖT h½ŒÌ书}Uˆ‚S˃;÷m¸»óºÜ­Éa/v×SÏÌ„Ê1Û®áí“Ðð» OIsj®K¦n£áÞ­]xC0Ï·°ÀT3ç„•¾Œ»«r[X½x»Ê8¿*·ÛÿºlÂz_ é]Fòê%œäE»¼Ðòiò$+6 GëÂï’ÖöÖRŠÒo£I(s~f°J\R:®vL£úØ©XÉÕ9ʥ݂©Û<ïßÊQuI)¤¢?,ðÀdAAT;{ì—hþºD¦ÏÁ}ÖèíWŸáae+ÛAo‚JÙ:Ç0 -Í㻉+ëx6=ÿX\N/¿-ú»ë€½…”étÑÑcŠ¥5¦wÏ݉6zÑûáÕʬCÞq‚Àåñë=eã°·_¾éOöW$â¹ýÚ[žmèϾöÂþ`û‰ù–]\œ]ŒöŸûk~úc~¸;Õ†Ÿàýr‡àíÝö6¤4n¨Ѣ΅ä´_ÑЉŸÏ..G[4é ³ÊìîSuôwÃüÅW ¹Oߥp»}=÷žÿPKë÷8›PKu‡:0OSGI-OPT/src/aQute/bnd/plugin/popup/SubMenu.javaUKoÛ0 >Ï¿‚Ëa•WOm¯I[,ØeVCzzPl:SëÈ‚Y¶!ÿ}’l7Ží¤Éxðƒ"ùññI’,}a öݤs‘QYØT–ÒÊIñ¥,•g¶bÔ^Ð[e©Ó‚Kô9g)R–^Š`#í¼à)¤Ófv~® ŠLƒÿ¹gÂ!+ø“{&¯gFq±HàîK)ÜçÜú`w—·ÀÝSà ü߸xÁì+Ó?;‘Ø¥ác×è¤2Á–×°^´•¨HÐN‚rS¹}~X¡R<ÃðW×Óƒùñ 4þK“vT…Æ*Q%NW¬°èÖ©)§J±ßÄ×ÑUkþIü´›Ìªä°,#9¬€Yª¸4tx'Pk«uç?·EÑN Â5SS.2\?ääl|VÃ…õˆ€k¸l;yÙuÝŽZNÃb(NZC\~¾þi K· d»D†ÂxÖ†Y¢yt$#º“Y#u7»R74YÙýÀ"´œâS:»©§‰;¦ÀBãT‹¨¡ãÚÎuP‘ËD àÕö —ÌGuœÄùÕ€S~ÀSî<«99N··D[ü”ƒ©ÛŽf혅h~šÍþÛ/¿’Ã%ÞyÀ²ßSŸËû Ú0‘b™7xñ¾Ì..` ²>€(3J)Œ?‘>Þ¾yiÎ4×gW'i@}êÃ5ÖS’LíN›í¼¨–7d”t7T#y©€´À¸Š™jçÔÍ!á=8³=M4¼<تC<†.‘ÿ‹Gpñh¾ÍÁMû$îÅ»ý‡Â)|ëŽ~ç8€s¸Š‰Ðšg´}î^@­<ªªTß½=¿ÚÃûw8¨ãνs`˜­ d(PòšÑd·ŠM´‰þPK¤wò>èPKÛA‰;,OSGI-OPT/src/aQute/bnd/plugin/popup/actions/PKPKæD;:OSGI-OPT/src/aQute/bnd/plugin/popup/actions/AddToRepo.java•Ënã6ð ÿ0u…ÚíÙI°n²¼XlÒMÑ‚hid3¡I¤œM ÿ{‡”dI¶îliÞ/G)‹^Ù ý™Y —2S‘­¸ S•fiÈ"Ë•4³ó³ó3¾I•¶ð¶,ä*¼˜5Q™åÂ#÷h¥W!F‚§ÃHi 5•éM]ø˜+“–o°‹ç%aŽõól9¾¡î4–ñ¦»U –q]ì(;}´Fæ(æTµ³Ô[á1Qðe¨Ìªt/Í–‚G f Ìãø/õƒt‰Ü ´wËŒìÜ›¼E+fþ=?‚Å\àÓ3±ª˜ŽR(Þ« ƥ̮dùxq‘?À|6ˆ°hù•ЏqÉù±¡~«x 56È3³·åÀê÷ú«ž@°w~¹™ 1>är( —8\Á§ý]VÁ†åÊ® ;™´J;p‚MBâ{¹'þ®Ð~+Þƒqh•c Ƴv-!Ô¡›ò•i:@šŒK|soÁ&q¦¿³ Y›’_]&ûõ8äàoÔ<á¨a[>äN”ø€üê3î  ýÃ{g~JpuÝËP˜_´VÚP~ ÿ‡âí.auLK.W•¸†OÅ®Ã7nìåƒÕ$} \&ªHÀ\kö^'¶º<ª—”†,ŽçBí>Ÿ¢Åœ-³Ê‹ÞbÂ2a)ZtŽÎÄ’ 0xJJ•~5)Ox3”0š ïrI¬±Ÿ=7U '¿ßïýl¼7Þ7ãTæXò…~ØbÆIÞr&Ô â¢x*p3cêN×´0<ž )6é&·ý&Åë¼KQVgxR/Pë“´r2c¸¢a'uig=C> 8vi¬ˆ'•Æynâùû)Íì)g½„²)4&t¥¯ƒ{f×a¢Õæî!?/Ÿ`ó¥Q‚.4G¦>?Eûn˜e Ñ»É;H¸dB ŽEÊ5 2ýÞc©²ºK¢5_~F˜ú«{ëß{ê‡5z\»"çs™Š_ç?`D³³~ÉM¡³u;<¼"v ¿ŠnpW¦~›æv‹î½µ×“2Ô›•ÑÊD RY0–ÑF•ÏÜÜãÑA°»ÿ»ìzð˜›5“+ŒË•f ‹‡’Ô·uÉ+Q]MÅÛH@µ]Am=1AÅ>;ˆêóC–¦T³¿rF™ŒÖ½b<7wĆÊAgÜ<ÛSÊ >|¨ciº[&#T ÐhÈ"›iŒ«dU·… Œ‹6h¯;è³2 Š›Ú£¸r¤1Å–ð| ãVHéWÈ&Þï— ‹Ú5Ý¥WríwMÒÄ 4M àáš™ïø“ºqÖz®sgžädòLÒ<”9oçqÈe(dYˆ÷nÅ%ÿ°öÍæó[ÇÚwž»Ý—HáÈ@g'?Ú¶ùM@?ÿPKØ12PKéD;>OSGI-OPT/src/aQute/bnd/plugin/popup/actions/InstallBundle.java…WÝoÓHv%þ‡!'Ý—»GÒ"¾Š¨ÔŽŠã¡ôacO’¥ÎÚÚ]§íú¿ßì—w®ˆØ™ùÍì|§cÕ ["°¿zå\Ôe×ôK.Ê®íú®d•æ­P³Gøºk¥†lÃJÞ–‡³1©×¼±ÄÜÊe‰UÃ;…eÕJ,%ª¶—ªT8åú±`z¥¿æÙp¼EùS žoŸ´jÉË…dk¼måÍÞS…rà »s>aõš‹ñv¼äN»~Þ𠪆)çBiÖ4ozQ7$Øà…¦ƒOóXé×övï°Á%Óÿ>:ÈÎß󯮳¦­XôwæaG€ya%,Ãñá!}Â!¼Rˆp>FþMö"÷´Â²GÌMËkHÀùÜg†¶aº•–ìÞNa –KÔïpÁúFçÅÌüɺ“K-¹X93_šu$#ð>0µJÀsxQ÷ím+4Þi¨üó4j6ÚÂÝã»ÀÜ>ÔÕ5É{¤(¡<ï‚.“s¡×ó=N‚`Ù XêѦSîQv½Î6¿6>RyqñÄ)p±Éøò! ð˜|Ñ7M@½àJŸWq`¬½Ã^KÉîSoùXªïjŠòÿʘ›¢”­Töº–¶Ïƒ©ûœiy^3“¬°^è ³ã•R·†-‘e.øÐˆäÖ :ÿúåÂòÝi”‚5ï[¹Žü!¢Ä»÷¤”Ñ’ÈÀg¼<ßö.ýÍK矈˜y‡•¬®óù@~l&‚IîðQå¥j³!fÛpîùä‰jùÙ]…­0ŒÖ¹xL§AheUYiùóÉ™y@Ý[OzŽÝ­`rD <ž³Á}ÿÀãpu®Î־ϋÁ–K×ó¾à%Š Aâb\=Ûùg×_Ûöh{žaûH•p½ V­ò‘xùTºô …:=,öX‘æ(öc„]mYzNhA3h嵨ܧÖÕu<¤[[I¹©)Žÿ‡nx]l¥NP–×[&žj ÛÁëg¤3 [ðöPðlú†øA ¼ƒû±ÝüËWyoúÅÔÜ÷‹”j¤#ÒÐ,'çCWò$²þˆŠY–í‘ûêûR”òt2VBÝrªŽÜÕAVŨŸ¿€¹Dv3‹¤ß_`ɺEO> [ߍ˜¥Ìµ+œ”Û+˜¥NZYñÄMÑÍkTŠœ›“ŒnŸBb? £—î¼1ugéȾӭºQÃnèËl…Ã_Þ¦²aˆ% ®HÔ½V»ù/B œQ‘ôô»xš 9 .ú‚uámÜÐeZž£07Åöv:ró6Ÿ8˜g;îà6kò€ Ï%mžQâþr ‰»UgÃ^]ö]G]H}cRPˆ©ô¢Zauƒõ„lúó›îì˜,hC{ò$¥Ú¦Dƒ©]˜âê+ª¬£S’œß>¥|îïHEK\ì‚át?ê1¾‰:"Í??âÆ%¶–­sÚqLs9±"/íâErÜ“M¾ñrÅÔG·ÓóË©»Ó©Ùis+]«ˆ»¯ï_®Oxû†Ô dã¶©qzØ_$ṳ̈ÞÍoôciNceŽA3I‘3¯ÉÏúøPK}ò’­ FPKïD;;OSGI-OPT/src/aQute/bnd/plugin/popup/actions/MakeBundle.java­ÙnÛ8ð½@ÿõ 9ñªíë¦)š«@Šn’m ä!È-m&2©%©¸Ùmþ}g(Q—mIn;>HÎ}p8)øÿ;³Ne¦I62LUš¥!¬PÒ¼|ñò…X¦J[vÏy(T¸wÐ\ʬHÜb¹¬ô<„(©0RB Fe:SG®ŸºŸñ ¦Ýg¬@o%”‰¦(•zÓL$qmMóµ½DLCeæ¢cÇóÍ™¦Ù4‹n û‹?Àq&ãâ&°i ;¿œÞCdœª§Àœ[`ÿ½|ÁÎ?ŠnïX¢"^ÙŸv ÊÍ`쑞ý™×{{ù¶Ç>vÞäò›ÎdP¬ýÉ× úJĬvŒå.)yÐÎ#·J»Íü×aµÎÁžÂŒg‰ Æ¥üV?Õéˆ JeÙ«C&³$·OÌK ¤e™½9À¯w•™ÂäÜ.pu#ööu Ó³å ©—doÅió¹øŒC«è˜ÓkRi9#¼ ¾Ä£!ü“ñÄWZ‘ãÃã‹ÓçŸÏÆ[åôP °´ø>d7J?˜”²©ÛÈ«›Œ‡Ã5a®B—ÞŠ3ü2È»"O£N\[-äœY®‘+bF=dµ‚W¬×@.,rßÍØŸ…A˜…|û‡ˆ¼ÏF¬OJý§ž»ôl—‰…•“ªN`u–ž˜°Ñ1ù‚ì<&ö~ ÷D–„¸°Ø÷ ct¹ö™Ab ÏºN,ÐlZ|2¶X JÕ&Ãdn'£ûñ“µY_6‹Œh£yRMJ°„çIÐNŠ9QØ©—s¡ýn #±d ¨ù¬;œá=×£^®Ÿ¸Æ[Y7iàbÐoªB„”ÛEMž‚¶OÁè•Ù4³£>m(›s:½ e±°r–Ðog’>~Ãâr3’³¾×éUŽ ãÃëèN¥¦­Ý.ÜKæ§Bc (ýôß"Ûùç+à LÐ_ÒºâÇØØþT#…k1x¦µÒÖˆ©÷yÏÞ R½ª¤@6‘üuÁ…‰®´°Þ¶ý9G—(•>¡sx½‹:Áµ^;­®j\«Äÿ免ƒ"BS}¢ó BÊëVsÚ ×«ÔDAeÞUNg3éA¢Ž ¯E÷_ܽ~ª$ìþJ£Û*?]a)uyÒÐ kn"c1ªßŽ9Á¡µÍ •î†â!4ÙÔ8ÕH”£QÒZSä'éå¯ w ¿ÝÅÊ…¯–fN-ð5Ä~‹çÍVº£³é½›:Ä;Üã2¦Œ(…UN ¢ºƒ U/Á>‡i5È€\ÿ¹¦Ù§r”(Ó}¿l!ô̰Ռ,8ûAꞿЙ›¦è`{myôðU㻬“kû*Ý,¨òÏA‚ÆåÓÑç–zÏ; MÞz{oÑs­¥v 0VT 3 fAïÝ$x;ɃmíÝÚßA&\3„»‰™l*ãѤ©ÏskÈ5ËŠÈÏ+üS£öÀØ0ž˜°óÖcºeÕâí?fv¡ÕʰRzļ¬ý¡sÊ~T™Œ+ kê­?}ènõ¢ÕõòÑŠ’_AÌ%*U»!„)ÇìûwVß9…i6ŸS¥7Œ×¯Ù×ËÓK¦f˜Ø™ÆÛiÌ,T–ÄŒz?»€|4åZó™VË®FÄÀŽ®ÎY†Õ–3NZl‰¬‹BÏs©V$ˆ˜K¥Á ±òs W’2ãVÈ~摺Ðd±oxë<ÎòÑÛI©Diaðö–¿æ±ßn¿ø6äWÚԥ橊`GÆÄÔõjåYäHkþø¶êöÍÝxƒë׋k7(ÝÈ£¶Õq eï"/Ù 0Aþ˜ög4ØLKô`×A£ÁnådÁåb?NÄtºö[]ÈmøÅ8²N¦:Û¨3ÕPñÕâÕÕñ¶V®³4ÅúgÊFp”ÉhÑÄ£qs@Û Ù+ ]àåN9ßúý÷ú*fŸå2L^l²íqe¬µ"ºá3¤m° ½¬UνB¨w–øça¾hLÑbßµph +ݶ¹îfqç–n3¥ß9"ïݸ)‰bëá‚› øFóá÷k.Ì­Üß¿ClÊüìÖ[§±9êúýQ;BÆoû¾|n:ÿˆ½£¶ë‘GCØ)``ÐvуÓÏæ<?þPK¿+MáSbPKóD;=OSGI-OPT/src/aQute/bnd/plugin/popup/actions/VerifyBundle.java•VKoÛ0 ¾èà2`pšBÛÎi‹u/ ðWõPô È´£V‘ IÎÖ ýï£üŠíØIÇCbKäÇ7錋{ž"ðï¹G¶Ô1ËTžJÍ2“åãÂK£ÝüøèøH®3c=Üñ gÒ°Rá¼{š{©ØI›ÙØ”¡P2sÈ„±È,:“[Ž-ºmλ„ ¬t³Åeñ¿s#ñZW¨`Êeר_ƒ† ÷ÆÎ{À ¼qˆ°èêynsUgÓšóeGÃÆÈZlPƹÑÈÛ‡ök ™@ÔX ÏÎAçJMû\c!’Úƒ„sx5§¿³­¿L¡NýŠNg³Aé@!H°NH¼‘»‘·,Eÿ¹z¦Ì›ÀMçÃ.´é·T³–ThüÞ¢u|ákÂ<%ícÀŠ,I´°©Jœú<"è}òŒ T#³âáaÔÏšB~r䃵Æ:Š““È£ýÂ5Í  qÍ­–:Ý‚À¼MZ›>KçÏ®¼%é :1U|.­åíËA“¹Z¸K ŒÇñ¥RѰÍOAi?ˆ¾Ç„çÊ“· ‰‚ŠC ã×HÍ•:˜iª&”qãµ\SãèaöfbìšE$V}ø-0+îÍéÞñäzº¹¬bÊ |ºüª´vkŸ’ #ÎŒD¸?¾qKӗ처ЎY…A¡¢×§å˜Àîá¶^Ÿ¡½Q™¼3¹ŠAÎsÚ&eâJ‹'=gÿwÄ;z(NÞ­¸N1®ù),®ê«}³L¾Zm˜-o'Û=p­¡ì¢-û¼çÕ›«<Ë(1®iÐI®Å Å=Æ“iw9v _sS/&xñ¢}*5åA 4 ÐàÉ…Ï-ÆÛ`ídw€ \ð6ßÖ«³Ú!ò›Ê£šå¡sÕL½íɄũ‹ÅÙ=/¶ê£ EwV€\–duL$[q÷S5Îûº4æFÏf·$-™.yGÛ¡”!—u%º[»-–ü~î»ÅW|mÖïVÞµ±÷K¤Â×@½S¶¶ï~ ÑÏ?PK-²ÅôH¸ PKöD;;OSGI-OPT/src/aQute/bnd/plugin/popup/actions/WrapBundle.java…TÛNÛ@}6ÿ0u%d'hÓ÷@EKZ)RKZŠ*ÄÃf=q–]k/ñï¯oáÚHYÛ³3gÏÌ9vÅÅ5/øÏà‘-uÁ*J©YeªP1.¼4ÚMwwvwäMe¬‡+¾á,x©Øh;llÉP(Y9dÂXd V ‹y/d]­¸Àö„·s É•)ÿ´‘x‹öÕ¤ ó}Öp³[…¥’„âÎÁ¹åÕç  …@U oP{óÅò …ÿ‰ÏPaÉ=ÂýîN2ÿ*^\&‰2‚wƒKZÈ,Ëïê³’ÉhD+ŒàÈ!Âü1â{tÖÆò˜6À6F°•ÍóH#ñöOs“Èdгyw:(Õf%ÉÊXȤö á>Lér0$3…ºôkŠŽÇ}E2™ÀÙb¶hŸ¾£säžYÔ‡™ õ\èMDÈê³öÓãaÞM ø>݇´F¦ ·4Jê2ͧ öC¼Ä5.ÄJ¬3ør'°Š#t¬êl¸7–•èg¸âAù,gh­±Yzl‚*@ ç9 †ÎÃ/2 ± ŒiwB# ÔÿF—W…qt#Çk®K,:öa~Úmå ÀSÉ^+mõÛFrÛ>{eH,jô[÷˜ ‰Ó®º†ª¢—Ðs«i².Kƒk×X¤Dè×ö1Üj;õ1hí{{ÛQ©iÎZ YÁ©·Aø`±æÒ‰ö¸ºµì¥ªIcŽ8õGbS•ÆÛ¶瘓é%»lRkëèïø=?÷hkÃÄ’ÑÿT'Ûp–“ëÙš»¼#'M{û7Ç]èñø’*$ÓÍþ`UÊ æºåÕ{« ×ãê5zbŒøAÙàòèsWœ{½D’¯Þò1)Vß6Ì"-ÿPK¼ /2ˆÍPKÛA‰;1OSGI-OPT/src/aQute/bnd/plugin/popup/actions/repo/PKPKšÿ:@OSGI-OPT/src/aQute/bnd/plugin/popup/actions/repo/RepoDialog.javaµWmoÛ6þž_Áõ“ª›4ioCíØÜ9vgg ú) $Úf&“I9ÉŠü÷EÉ"õâ8&–DÞs÷ðxw<%8ü¯ Â¦Šø‹ü$N×”ù OÒÄÇ¡¢œI_„÷ONè6áB¡¼Ã~ªhìŸöëcXèñb‚‹µO˜&’ø+?¢8ækiÛeFÙ½QP>ªzf-p²¡a›-òH£5QÒ&[ºA±£@¤„›¹˜>—kš¡’4ˆiˆÂK‰à#C‘'EX$QþúãÁ•ºÃŠ ˜E‡®@²þÛ;"$ì“‹šâ€Ä‡PqkÎ’*.ž]ìßüV@J¤ ýŠÅA®)ÂE”¡3¥Rý\rú–…â¯Æ˜‹¦JqvÀÊ#ì?ì~|zšÝÑ)ºD£Õ† a~1SÜ¿$Xà-‚ÂÔrCâ8Ÿyoì›/÷ÚËdlùnæXe÷Ä]ö1«ìäÁ¢/™&Dx–æN¿œ#fh©žcâ-ïnüÑd0ÿ~³˜\[rjC¥ÎHôKé÷ýxff,ÿ¾´¹,ä bZIÄWG»ÏñÜ—9D© É÷‘+*A¨1%xŒÂÌŽqêž=ˆÁÌE$×f»¦œÓ¼0eD¯°„tŒóüšÒ\Uéˆ=2^Mñ3O•ÇRÇ×?œ}t²Œ2òhRÍÛ«ê"½!³ùlli©aµÁ!O¡NxŸ»~.{]töñ5Œ®Þ»rìxi!m§kÎ9Kñ*çÅx0ºŸÏ¦ß+$l¼ÅûÃ%Ð>ÒŸÎàÞ;‚Ô¶Ü~¶ŒŠùá|1/*¶R3y‘Û<û|„ͼ:¾Õn«Ú¾üôÛ¦ÃACL–Ïàt( 3¼%oº7†>öQ3Ø“™CÅ$ҳDŽÕ~u·Ž‹ß°¤Ûš“aÚ»­ë°ù|Ü¥ÝÂ[9WsAVc,šçç:c{ú¯ ¶¸áxo͵+zšx–Œ€ÁÊåèâÜqPk‘ J“»ä¥”­‹üƒ×oš¶R%qd®1£+"ÚÙ¡âCULy/ÐòJi£µSa¦/C«¦Ì¼Q6P@/€öKš±[§Ä«i).8R¤ÂpXùÿf£éø~ùýz8ŸN®fƒëê¶,5ƒŸr‚г3¯EÙ¦Âsƒ®ÒƒÿÛjnÇ‹åd>kYHAàõÅì*™”¿w*Ûþâ¾®¸@ÞDá8hhchÑPø4‚ @Ôß`9ÓV:ý¦¨êAæ3tQŸXãj󯕳;ö¼Nózó GQïëZ°ºzKÒ¨ŒBã´å;âÕ=ÕjS’Ú¯W±ÓX2Æ 1‰ìDœŒ®x¥wÙ [›ý*Àaö‚B¬Â òÆO!Iôç "Õ$>Ô#hR|MÞø~ójµîèÆ20}Ùóߛˬ<š&ÐzùæiˆÅÁÓFåmcML+Y¦äüûɨy|:Ž§Ýšc•H‰Ýeæj0»Oµ©š¾6Yc­0„q§­¹_˜3Fû2ª@’ôÒÜävõ7€ ¡&FÑô8gR~žéC7“õ>^ôtרsÙY_XNAÍ嘣XÛeEÕ)Ä—YÎAÀNXDžœl͹˜:¢Û“x9ùPK-myêÇPKÛA‰;OSGI-OPT/src/aQute/bnd/service/PKPKˆJU92OSGI-OPT/src/aQute/bnd/service/AnalyzerPlugin.java•Q1RÄ0 ìó •\†É=à® ¹ > Ør"pìŒlÃßQ’K¸¡Ã<^iwµѼbG€%SÓÛ$’76t¨*Æ(ùyn›˜:njEÆÒz6À!“84Ç€þüIòàKǾª ôìëz®PÃsÏ ÆÕ›AïÉ:%œ†§F»èªÉ äC´ìÎ{ZÙ^pš²û(`z ê_A0S1÷jÌE0s p“”EÈ‘Ù[01dä@v×üÇD7kœŽOЖ -©Á€¥¼RuHfÝ}­w#  ¡&µ= å"²v׋h®=&•¢°dÀj+EmÁ<÷µ%X¿…²žß†’&§ºýEÕnª¹—øžàþÃÐ8Ù½ûåãڽάfO(7ëo ìà/Ç¡ú®~PKÅök›2PPKŒQ ;9OSGI-OPT/src/aQute/bnd/service/DependencyContributor.javaM‹A Â0E÷9Å,U$¨¸Ñ(=Á$3–©1 é$PÄ»[¬óá¿÷3ú; x­ÊÖE²—&ž;cä‘SQ±¡­*ÁîÖqõ]•@”« âA¢r¹¡g8sæHý|JQ‹¸ª©ÀÓÀ’–„‰~Žð´¹”4²WÈßÞCÏzè—gŽ@æ¶3/óPK¾³lǼPKHU9.OSGI-OPT/src/aQute/bnd/service/MakePlugin.java]RÛNÃ0 }ïWø‘U#ûbH<ð€Äe?&n–&UâlLˆÇkzAÍ‹ããÓcû¤½TGÙ È÷D(*§EÄp2 ïŠÂt½_ò$E"cE¹€™oM%|lÌPéSeãC-«<â›MqðSÀgW–C„­‰Ðç*ß”´5œ[tðâ”Mo?0úXH#¡¢ÖÐ1F~H3c¥Vb5ÎÔÆiˆqä»Eˆ—H؉‰?ÅÇ^ÙA•ŒÕ:ð*nEºâŽ£Ü1‹ŒkàÆCÓÞ^à­› Öû#êÍJK†&uÜ*ÂÞ]þe>O®¬L¯{¬™uR 泟­À%kÁÔlÉ+Ÿ¬† ¡“zÑ¡6øs„ço…=ïÆÂnˆó{tü°7O£Y£=[øÌËgΖ_¿¿ÏÐ6‡‡e³ ¬ñÿó[üPK#CxQPKuHU9*OSGI-OPT/src/aQute/bnd/service/Plugin.java}RËnÜ0 ¼û+xkjÚHQ4§¢‡i g®Ìõ*•%¢7Šþ{©‡7Û ­`[²HŽf†JhàL€ßV!³“ÉÄ'géfÜ’" <á Í*Λñe³å{·Ÿ SÙ!®áÝ80Âm€˜ÄÅ€\Ðà-Á!2$¿Î.d_€ýÔÓBA2ÈÑå‹9R(€NÀb&KîT·u½¸€.Ì€"ìöJ(† &§i¢ifý*¼> m=®Y¥æøLÞë²#5 4Ô¸¾»!­{ïì»Æ÷×:ªÖ2Fø¼‘ê‚:?eWø%މXe³lówÕwáC†‰”&Ót]1:å"ÝÆ ŠôSß‚¼UA•Â9ôÚ Å펨ÐK¶›ì¿¹}JȸÀ‚é?—žÖž5¬w›ÍdWçStd’»3µ«¯˜><(h˜¯Ûô±ôþ¦æ¿¶÷¤Ù±2ë-97ÌÀc½.z(zO“òÔfé]·P6^R>ÆÕO´ˆ9r“õŒ\ú•›=Z{>çÖ¨Õ–rŽü¦Úû^}µ-^òUçïáPK©@ÃE›|PKsjz:/OSGI-OPT/src/aQute/bnd/service/Refreshable.java%Ê1Â0 DÑÞ§P ¾@zzrÙl±<Š’†áî²åÛß8?yñmsÄTïq…í’1„ ¯¦æôà£h¼tj[*’IªÃ&Π“a]8Ð;P_R-àJv<§óðç«ôb†ªþ³OøPK­—Yÿh{PKöTŽ:4OSGI-OPT/src/aQute/bnd/service/RepositoryPlugin.javaTMoÛ0 ½çW=¥Aæìž¡hl‡¢ºt‡aÚaµŠdHTÜ`Ø%%i‚Õùøøøè ‹g, ðk`Êr³Ê<¹*h>©meÃî0S6›ÌN+ϺÃA«<³¾TÑýE™íÈyeMJ«B®UÊ0¹5Kª¬WlÝþA‡Rø3yf“IzÃD"88ß—÷ÀV>¶ÈÅF™Zd°kà A©vd f¥)ëÒ»÷m…·{Ó<SλÇý6·Âï n©õ„®ØÐªÅ=shJ:ø£e–îam`)ßbL¯42y¾µ†½ `ÞC†cÅ3hMøÆ­¡ÞHŸ11å Ö}··®QkZyŽ=ˆj¼ŒDZB­dSжÌ^B!‡,sYÑ ¼ÏN9¤ªÒ  Rb`,¬•&µâÍἌ$h‘,¶.-ôxãlíáÓKAKÝ3Í6Øhöœf\ÚXÀYS¶±³ôþ,…ý†’xüÈ.JÕ)´ßIök8­6O©§[_“‹³H3r½#¡@{^:çy9¤¦å×öj…g(BÕN1æ½_Ò¹µšSpÊ=¯Ï3z2U¸[,S1™Jw vÉÜOèþ§ô @x|‡.¦½U«~;{‰ê^rÅ;(ÚTŽ<~;cG¥Nô2–“˦Ív–¨ŒO ‘ü„fÃÒ%ùiëD°rïjåeOŸUuy š |Ã.ÖNޤtB;Éбfjÿ§ee­'ƒ‹ÁHµ)÷Ã"RÞu“t„%iíý7ª|ùµY¯ñœðüáx4‰o}>‚ÂÅz >rÂYcð‹cSpŽÒ•ú»§eä2ö;Óci¹Çmü¶úª¾PKéaûÍð´PKÛA‰;&OSGI-OPT/src/aQute/bnd/service/action/PKPK0—;1OSGI-OPT/src/aQute/bnd/service/action/Action.javaM1Â0{¿bK@È ¢ ñû|„ƒ`[Î9‰„ø;nØf‹ÝÑdGO70Ü¥*[ƒ¸ÌBl©¤x0F^9ý{ø*c°»6åêG!HT.7GŒãÂÛ eNÀ+S78—ô`RäÞ{\µHÐ=[轤eÂi%ÎÝü1_PKÉåDÂ{žPKX˜;6OSGI-OPT/src/aQute/bnd/service/action/NamedAction.java-ŠA ƒ@ E÷9E–íf.àªÄÄÌïl£ŒQ„Ò»k‹o÷xo¥€¥[iðœÔÍI4lò†ˆæux™²y >EÁ­¼‘ÿÎØž¾ôC|ÒG5/\¿õvoèKPK8‹(_jPKÛA‰;OSGI-OPT/src/aQute/bnd/set/PKPKŠQ¼:%OSGI-OPT/src/aQute/bnd/set/Group.javaUÛrÛ }÷WÐkÙ)OÚÆ[-k0FjògEp}çÆ^]·Lœ~ƒÞv†| -<’k­ÙiŠ)Jôà®/ž¿yÓÐÚ2ð»e:ºöµ7Ÿ{Š£ä aMS|âðyº$ö^ËGCnžjP–Ë6áq@'ê+ӅþÀ…Çÿ¤^<¼7|öž›Àï]»ËÐà~á4lŠ…3C¶ákIúp7‘Ys]wýMñ?˜ºº³š·ûj–À &ÚU…Y'Ì#KB}yI>j`˯%¼mà‰ì0{Lˆ@áŠ@… }—TFdpð"äûšúsëlн!Ê•X ÜìM/¼(霙1ºëo…^TFïß‘"„€Ö²µŒ·æœ U–Ö­‹³”£ Zx•FuHSõmƒ7.;#áŒñ¼wqëóƒÄì}ÞŠá4 ÐåqÿV³#ž€oª[tU´¹ U¼XVAEâ-È ?Æ2§£IÒ²ãH“wÛzi%¾à懞Ò-¥áÈegF@Ü„YäáñNs5ð:Ö*W1¯×ó4¹Úˆ¤ ÊyZB Oš>(ÉóVJØzGn¸…&OÞ\Ûév.rTIžŸÉ( ks™Úèài¡¾ÏÙ4е1Fs¢&/ÓToÜX}š=#kc¼KÓ9ðå0ŸK}>ûßÚiyÀhO»9ï_7<ôMŸ%æ(2fd‡2Ý­—Г?ZÓC¹«†l‡žZPèÖ9³N-ÉÜè[DL‚ìÝGTÃAᵜŸWPK×è4¨ˆPKÛA‰;OSGI-OPT/src/aQute/bnd/signing/PKPKú„X:1OSGI-OPT/src/aQute/bnd/signing/JartoolSigner.java•VßO#7~Ï_áF•âD`úL•ëtm¹R‚úÒ냳;IÜsì­×K@½üïY¯ƒw³!Ô";þ曞»ÙW¹&¯<ˆ¹ÉE©–F™åt0PëÂ:Ïþ–OR(+&Ó–¤òJ“, pO*ƒD!ìi5¶\ª¾¥p@p5çÙd2`6C_˜_Ztl¡4’Òß)¹ÉÎÙ…ÔJ–WìO6šŽØ¨e¹±.?¿±‹øqÅþŠû_á¥ôÖA½?ê}"­!D|ÚæÙ‚³ÑɈ !Øx½øQV~e“ÿ`ðlPTs­2–i$a?Kç­Õ 8†akXƒñ%»×ÕR™vÂûwÀpͼÃ`Ñ¿i*¬%þ¥hK éWì’ 1OeÍ7ÜW¢˜¦þ=jßbžñHØDòdUÎJð÷Î༂’ßÉâ"¨œ4ªWl-‹q-µ`E"³ÆKeÊ_à…cLÃñx¤åWªq#!Å%øTaú6ó.1½Ô»Ý”;Qy9%ë09íî‘•#äÍ9JI—x?BK5ÑËÙËŽ0e Füa¯}„7•´í-¨‡¦çyüÁ g3(Këb%õ)b…ó•Ò9*ÌÃÿX…¬žcôËÙMÉnž3(¼²&©KìÈzž\F]ò…[1þ:ù ÏWZ Ì4:oÀÇ:³}„ƒþ¯m2ððÄWNª=ÞHåo­k&UuÜœH]¡iªðº®Æƒ ›gámJ#ü¼U`[º„ŽòÙY§plå;îAÐPsЭQ?­ò¦PèÆ3¼ë¬ÌóŸ´-|{úlz€ÒV.Ãçg®è6 h:äÊá±[G­q¸Oïn¯O?}¾Mƒ^àË“§Àsb¢'à UÆÝ\ÖyG˜XS… õPL¾|üãìúÛþÍn¿ÝÝŽ¿î)Ò¢{ 6ú\ÔæÈ½ú ê¤6)•Öí‡×þGûÙúG[e«;iÔÊ]í4 C¡©ÿ¤W˜2o^îÿ÷ýP-à À¦G—»F£½ÁI”¸ÑHÑ™„«ñZ+CO!¤4J~ÅÏÔâfE#š×¨C}†·-¬–kèPmjøÁ©Þ³yĉ×#!DVWkú†0û2¼Œ+gº#:mÿPKkù=ÅiHPK …X:*OSGI-OPT/src/aQute/bnd/signing/Signer.java¥X[oÛ6~ϯ`½9v”vØH– N“Y‘´«³½t@KŒÍV5’ª›uùï;‡‰¢%Ã] ¶IòœïÜYÑì]2B«5Kež*¾,y¹<=8àëJHMÞÓ4å"=<íÌ(–Õ’ëÇÁùWìq®…dñ†Zó¢wî=•½ó’-Ù'\ñK–Ù‚/ÒUì‡ïªvI¨%7DLJ‡äÜ­¸"YA•"ð£V,'®WD¯XDE* Ê”pMÌHe·_ÌgxNS]ƒtø?G8uBÖù÷S¢VôÌTõ¢à™»v˜$ì“fe®È)2¦”äó¡4Õ°÷ ՚ɒ›Ë»ÙõíÕÅõ[X<óói&Ö/X2Âõ#Øpüî¯ãûÃÑøÔœ2×´GüÈù’)}K×L½»'æ ’mÜ.˜ùLF7ßÈ“¥¾‚“I;>°G…*´Ó–ôÊ\îW®­@Þyï"-8U ³ÑôQðÜ`ú+• |ð±Ã I 9^ê¢ ÿþJ˜¬\‚Ž`õù¸¡ÅÁ¤2Ý2Ð:Õ¤`Ti"J樥¥£]­I MI‰kT2¢*–ñÎr´ÃN›€ŸgáBºdz¶P¢û2ÀSö‰+­’q(^È¢ ªÎV ôäÈNȈL:Úp°û!ØbÙÎ=uy5ˆ{&.~#ùGªÞb5 €ù3MÀD]Tíï Ø68Ñ…Øâ<ó0£1Zsêl{·­Ìûv³9!´‡éÖù¡¶´|ŒD¾¡%@¶ÖþÇZjË/%‘¤~§ÝÃË™£^€ZA•iUë?hQƒ_ÏÎGS2:/»fƒãø˜¼” ¦Fþ†½ÃÌD©áp…Q)&CIÁ±¤VmàjÌÓ º—?j6“’>¾®5ð~Èèš}ïê Ü–%"ZÎE8%;•2%1¹HŠZ­âKÀ²èÏFN­ÉˆT‹†ï˜ U‚¼eJÔ2 CäÍìöúêr~—Þ\bPøËõ‚å9˛͓üˆy˜B`éÑèïŠu ߊ@ѯ;2L¸œ‚æIϽÓ&ñ7ñó5xãICŽýrE¥sì·÷¥Y!‹ÃŽmœIébÜÊê4SÃȘŒh½Õ­ã 9Í2ÍE™xaÏñ#’6’à‰dTC\~ÊX…'§mmÍ@P…@ˆAÍ ›ÿ’l<M†J¨5!&OFc›il90š˜ïÉ”6pBú,'®Œ­rÝÚ"E"—íÖ$ö»&1õ¬í83¾(Ä•¸¬i«{^räIËG|g»¹®rØ’lǹaüµ%ij»×¯Á› šÙÌ2¿"¼„Tñæå«ù7?B¯ ëÌH—¦iL[ ì%Êœ‚ÚÎ+8Œ¿@IF…Ø@5B…8ËsF T6‚7\ÌjEÁprAfóÛô9¿|“²29ùÈO»ØÙ¶Gi¢×U'‚íU¢ìNR¨Þ,ÕÜÖkÍÝJÃ¥*¿¸‡:HM÷ã*h[ʇ>býÀUÎÞm]Ú3|Ó· ¦ún=}ßv6½Ü¡P’˜B%äw R¬õ¾Š§,=Y¥U0™ÀYÁöJ¥.ÚŠÙxô“ €%_g‡±!8I±QäúuëNŸ#ÝßÐ*5)à'{ùÔ»ñÏ|0ÅŸøÎ/`gf–æLo÷ÛîQû}Ð3óÉÅe•Ø€žµ¯1é=ŸÉIÇî_OCa¶“UÞ`2Bo…ìFDÁ@öݬì}v'[Û¥‡Zk ²­nß%ÿßIC¬÷vV?örÚvýp¦°b4gûª!ßÝUøø1!Ûž‹GÔ‡yhõcÙØ­MO[³O;½¿×·-6»œÕ{‘Ý'µ^—õ‹a/uË‘©¨X6!T^TS—8ÌÌ‹çß~wßîB»RüôV^¦pFž EpÎf…oq‰Ùô3äëÈd¾Î:¿Ø2»VèjCäJ‰©‘¤G±C*ı[øa%wŸÍzC÷ŽpŠ× È-‚¼A¾`7Ú†Æï»(ô7¿˜ß:üvÊz•Ú©[1¯³UÆ~ÝÕ'·IÌxüd¿5“SéOU’e8g'ŒóŠe \ÉØ<æâŠ…>\Å×4YÐRá+ªyÆR’f‰ä¬äŸi*ß&Už^Ó’Ð;Ió…šO©¼$<"0–,O2 M ý÷¾ú$d"ßk–QøUV¹d+ª?™93JŠTé/¿ùRè_úSÆó«f"ã•$äÏ{ä‰þãû½½=`D­ÔÌxlD¡;† EnU€ý°_ÏËk&b3 »µX¼×›í>y¢ÁŸ£$K«,‘ÖQ-Ë"‘×1ù•–§Yµ „W%áëÜŠ$þœ”d}ÍÒk !,6ÄvB–e²¢k^Þ$_uƒ !–¬¾ €×˜DAS¶dt›™]WLSY²üêÃ'rEå‘¥9r¥#Ëó Ç[&äOz዆QPN×ä°,“ 9ÅÑH&Y,"Øö\ #Ú‰áÇá\ð lôL‘±ctjǬ/:â¹LX¦™’çV+±F¤©Gò[ëp°%‰R›m ØŒ<> 5¦xöþlOÎÏOÏwF”Æ`½¬´åà¡ëH$Ìe‘Ѳäe4:Îo“Œ-ÍÑÝy®ʈÃwS¤šrÈÊÃ5í@ å ðÕV—==wúó½—I4>Œƒ4òòâÝ«·“)f’Dò”¸ûz†Ò“Ñ@ˆ¯”^0a£îT=•óFUPF8â¯ýÅa§ºû– ®#¼g]ËÕbýêZð¿V †k»>pø>© ›Ñ3m4¡ºuq¸:ìCqßû¥]6×ÕS8êB#¯S=E×M8ŒÙ¿T’˜nVs!N—Œ[ÆÃvœš‰/+¿J_ÁE_\½&›Jv‹'ï&¨ƒà×§þPkŽº¡c羳܆×%‘§~ÄуMo>”ÀÈDᄪû ÙØS–£@ðñ1Ǭ0:+é-ã•ÐbÚ~¬P`íÀ©|ÂýäÊi :KÆ;¨(µ„p~OÆøGH*¤[ Ø—D,}vÞ#ï0õƒ‹Š/J™õ?|ªšgúrBDì¸ïÀB†+,h)Y?ho*v–nIȰN’ÂÀ‰oð€jN§oØÏê£Ã~ ¢ÔÙU;þÚDèÿç§g“óÙñdꚣÒlO°ÖÙ\7Æž;DÄjj V׉y=ê´£Û ¤BŒöŒ‘Õw™á—IVÑÖš¡:ɳ¯ÒN@S/LÇË"Ær U¢õå«cú~:›œœýrøæA* îhõÓÞ¹k_¬´°Oê}_VKl䉹éϸ³þiKÌã¤(h¾U½,Ç‹˜JÐŽVÇ*rÕCl6”\Sôpƒ€( rû†ÂYåªp:V‘S+Ï’ã4°2Z®Ì•+üŒW7 VŠÈ›õ[fõÇ>GÓl¸Èƒˆ»ï Òmó^Hi`ƒml•‘Dww—%_Á¿KÓëìömÁöUΛ€“r=cê4ÐÚm^£%ÓçUÊRݺv—oì¶ îNŽòæØd^-UòCõáć¿|ÿãŸI‚}lÀËcØeÁGÔëkK¤`^=ßϰ¸.™¤¸lLöÆ ›ï-CÜ;´´[’žUÛ+åLµ¬#Óäʇ͸å‰5-üæZh ö¶1±6t ~ë¡GxÏ}dõ÷N+ 7·³·­Ü[ƒ %ÛùÈ09v·7œ dºÚŸ«œÉºe¯×õ¨Äs:}—ßÞg\ ¶í²·-ÿ, K> êÃ,ód²®`Œ&©o–G££ÕBWß°¸koÊÓÕ"Á»)  ñnªpº{G…U¨íË`Áª!”‹´l¿uãôÈ›5w;qëÞœÞÑ4²dÙ,áDÝ—‰ ÝÀf£‰* Ia‡Ãó7'“w3¼ñÑS±i[G£Ï’g¿>ûçÞ³?~Œÿõé)¨Ûz›EgRÉåIcŒao‚Ààærû}•@ò°Èš2¯S՝ޏ<uÍ`+ù %Exc˜P¹ŸàÞ¨šÛx…w¶dÇüÀÓ“‚²(à[ëÚöwÛVŽË÷u'ÍwW`T.& q¥OuhnHæFÄ`QÔçáËbÅI˜PWX‰Å¥KR[™n·6`d0ÝÛ€ée“/QÔ`a®4ö-¹R]»ìs5ØR]¨?ÒK‡ˆ€žZ0Á§!nWÞƒj­&žo—ºÓެßÝ ÌUäÚ„ŠŒí'<^äyœ1“U!7]!úlÖWí~ÝÛüÌY¥…®;b„ŸR,n üê—‚¾³Ã*r‹¹8ÌÅæ)°kò¸-,!ÿA–äÞÒ³k,È •¦ŠÑsQ§àwn‘”ÐaÝì (d.¾¸¯l>C4ˆkz]É_ç?s~i{)ÿ¡MúÈÌŽ¾†Sɲ ^Êâ_ý·)‹EFi™×ww+MRìUáh²îädzãwoÈËÉÑáÅtBN_“ÓËÉùáÛ·dv|29½˜më̹ã)±t’]õ6P7ÏMÅÐåÒmÛÑ\xç˪t±åæÛÅ|%ÓolnY…>žBÕ5¿©BÔTdùQwZÍ«8}5:rxlPW¸T³W×¢Œ ë@Ý9C%þ¤„¿˜‚ÈÒµN˜|Í[Çî{ýF5ó) :(>¼¹¥a ±Á¬îC¬¨ÀâÄÿÐ ¦Ó’jeØ÷·&>4¬è¸î¢ê¾÷Ù? ,§sŠìœ ý‡Bø.VYóLY}ÑïUÔ^ ›M4߱¡ÓEÚuÚ¢Ô9+îì„N>…æú€wj¡×-Œ½|w—_弤[üö¾ýTÙ¾ÛrGþÓ-5~|aÈ8o©qÔÝlu_éV\ÍmÈl2OÎNÏgã3£?ý¡‘÷»x7iÎwñÝ*sC¨!Lm ›=x‡é~o¨”%´Î®}ê6ƒ=ª1™sžÑ$'U)2°½m…íÝø·g'ý¢AÑðeŸ t_«Ë.¦^ãôk«ïØ®z‡ö-ýö>)º,{›_ ÓA¶ÏáÓxÓ_ÜvÛ *Øm@öqÓœó6ÿx®åñÀί촢+%mŸöÆ•€D¼Ö4NÁf˜(ƒ!´úøoJÙ i4ãs¹®£ÀÚì=#ø¤-üZñh6áuJ §RdÙeÑ„®90Ùk¶SqÌI ¢ ˜\r›9ýrˆÂ¹9ÀŠX62E]U‰Qû±vÂç,ó„MèJU5Uµ*¬Â„ñ„j›ªº?´UÝ,C-õð¹°UÐWhâ2MÉÓ(çIÎQ›’Ä9U¢g¿K]¡-øKéŒeØ«’F#d•·„L2-"™6§¿C©ÎtX«9 )+¢6õØ+…þ¾S6;€ h­Ïo)AbÓx%}݆!‘ð2åb’Þ¬špG¶ZVã6ÂJ² ¨©aœ"CA\íÔÀ-Ë…Æq %Û½ccCCG¤ÂB*–12J‘Ä^ _IÍd¹®‚l€†Ø´ú‹Ð-zL”‘%2Õé—¤ú¹¹‚LQ¼ 3ÚH}ù³è€Á`Ý~UöcV"YñÓÒpØè%–êæÆ)áÚeÜxq=çxë ¼Ý-ãñ’Þ¢Øh_AÇ…hU˜†y6·qŽ‹?–}¬½Z{m¯*·}Ý[(¥¡<|êMƧG~Åx0»$ ÄéÒúV'bY¥ŒS[0ƒír¦Óüo\ïó`-ó1øÇí@È€ÚÿK@Ïy:ý"O‡v¶Ù¯šT³«Ë+8+UV+ß™ãZý°µ¶î •´…Å}ºC´ŠÂþ)¢PWùtŠIe¾^²e©Þþ¢iü|ZYÖ>ãYE•V·^Í<Í©1BR燿˜)9)ÖÁv÷­Ï$çÂ+Ò-`f¢2ß#IB£‰½{À.MY«ûPxŽ„[‘¼>#Ì4  £Aob9õúÛ÷CÐ ¹‹\×ìT»[ ·ƒ\¤úB® ¼],ò £R¼oñ9‰à\êÎ¥LÀ`vN ŽS>UñÙêàGm™óO.ª¾ E`0’Ž!ý¹+ bÔ%f—c>PK©¡üD/ PKÛA‰; OSGI-OPT/src/aQute/lib/deployer/PKPK:[U;4OSGI-OPT/src/aQute/lib/deployer/FileInstallRepo.java­XKsÛ6>K¿á!%k™qzkdg*§ÎTËNåØÓŽ“ñ@"$æíȉÿ{wNÓiy°H`ß>°»pN—·tÍý½Ð,Nù"NXžŠ-“ãáor!5¹¡w4æ"þqÜXɘn/š§½k7Tö®K¶fŸq§ÜªqµæOµ±&\a²÷ŽIÅEf„æÅ"åK²L©Rä-OÙ4Sš¦é$öY³,±ëfáËp88Ó’gk²–¢ÈÇÃÁBˆ”ÑŒ$\ê-|ÏjRb€µ÷TÃKFÏüèýéÕÛéñ¼G2Äx)69¨ ƒðr—î>Lvöv¾úø1þ´톗ðaßáo~û VEAŠ »3éNð„(¦ßK‘3©9SáŒæûþˆØß×dCóìBÆ*€2nòàþØn“+,Åk¦ÃÀ,nû±Oyé°ã–®Òж"±‚ñÑ×\UQµs­j_7F ÞuøŽJH$Ф¯¥¸Wäèó’å"ïTãcµ,X­nF3¾bJƒ©îå%¡ÕåVè¡ã+Ö”$+Ò4ªv-~@@2vO¦iÊÖ4Èu±a™®0…Á‰¨ÕñŒ¼›Ì_‘€ìÆÃJœË¿…ÊL(,ƒEƳ‰†Ýdº #\» iÁÂ|&M·àöÃó“_®ÎþœžOßœLfG-»Œžÿ`Òa‘%³íf! :'tÃ01ß$?/{rô5Yà ‘bÉ”2ΩTì7FÈ€7²àZ°cÅX‘gäå¿>+RÍsÀ òPDålÉWœ%& ûJHº˜Ü²-yE1üžÁùˆ"/Ñð±1ƒÝqcñ>»`5ÈØE¼¡zymÍŒÜD6êô;lêð”OТkªÈ½`Šm*"Œûc')]eu_ÿ[z^ÍϦ§'žê «¨TØŒ} E_ò:€ˆ>sÒü#ÍRžƒ£¡ÊO S„ ¸4‘¹ êyÙ1R .™ Ѩ-J‹Ô‚@aÅ2²-ÉcEÊxs UCb;j+ñ“ž;$ØÅH—=ÒîFH8I°X5IyV“¶·–R¸-¨hÁ¸éªþñÌÐ# ¬Qû¶J³M, ç]§pT¡Ò£*€z& %RÈ0h¨×VémÈ¡éë™HÌÉ.imÁmmý†ó<¡]i8Ô%Š»—\³•6jGŸÑeRªñä ¯ZµÍ`çʰDäùó^cöûÌhÕ£²nŠH¦ ˜\p¿§Í—Ãd+ÉúûK©k¯m½eÓ]QHíf-túšíØ>BOÄãpðË)dœä Âc®ô~9ë¤ðQÖj3W"°ˆƒŸ,–f>ÈÝÀf긢1FNì+¶¬ |T5£'ÓÒÍw–s bsxÛå'¿Änäio‡&åÒg"%ÝúÛ >¿G­ C¡àvLð™ÙnC6 µO«´ŠÆÓº6^gê‘:XŠ GÁºì‡RaóˆMA _ú¦”J+GÛ0¯_KßW`TÔ >Ök1MØ÷ä>Ö¯.³,%ôæ>ŽÁõ@6jõÁ9ÍÖ¬?g4Å^Ê’óù±?Š–Š_¼ Ó³ª×p…£Ñ‚äRܰ¥‘{¸ˆ)­pû™Ð•AFºP1™”fR&÷\’3 œq_¿4h˼Ʋâ¯Ç쯎”[+7h !Îiö¸xˆ|p<Ó¤Q†ÖHFR!n¹5È’f>Ï‚Y8!îQlšøÛ÷é»ð2d½C‚Ý÷²¨×h[‹ƒNz[+#a ƒ½ Óÿ³‘:Oºr ™N5¸B=úÅÏe‰W&rxvâ{‡¼‘ L*¼>%x•³"ü´ƒÑfTŸf‰¡0 ¶!ƒñçÇ·˜œfé¶Òí³ékŠW(8ކ;aŠKPjmÇÀól™ ,ñ¬ÉбHõFÖÌ ¯é\zj&4&ž3c,Þ,œ«GFÈëÚa6$c]*_’©¤Ðô –½1üì×Pâ”ek} «;;íLùvi­­áŸ°[àa¦_„¹eÖ¥Oh]"ËTÅ ½¯?5 ;?õÔö'glPC`÷¼ô^:úGéi¦¡7Êx6ùãêbr|~Ô©sŒ¾-òÉéÜ·À–—‰ªäù6tãÿîÊ4ñÃ×B]w¸ÎLÚÕBÍy«‘¦¡‡ådxY‘Ø[-j¾4|þ PK1C‹·€žPK#¨d;-OSGI-OPT/src/aQute/lib/deployer/FileRepo.java­Y[sÛ¶~Ž™¶T,ÓN缤Š3#'n;–ìÚNÚLêÉ@"$#¦H´£4þïg a7M£‡X°‹½|»ØÝ¬éüš.¡¿ÕŠeŸe9[Õ†‰ÑÖ_­+¡ÈzC3^eOFÁJÉTw©V¼ˆ®} "º.Ø’}Ä·e䘕y&™¸ás摵2VrÉcK`ˆ+LÄwo˜¼*õ…ëzVð9™TJò3/Ø )ØŠ•J’Ó¢^òrHp]rU‰M»²L^ÑYÁÈ_[>–™TTÁŸs%x¹$Ç'/ÇG'S<°O’¢šÃnU&£ûIÎǯN¦Ço-‰`4¯ÊbóÉt<9´ÇKºbpTŸEÞ]’ðs89½xûþç£ãÃs8_²[slïrÔÐîGT•2Û³ª*-Ãí9-\1#‚53‡O©7tŸžžèëõa{d«wåCŸl^­Ö gš¤ïvèΧñΧ½gïÿü3»Üì¤ïà‡þþ¹ ŠI5€) ï3ø Œlg$¡žvñ]s.ÔÆì[ã£Å͂ŠçD2u*ª5Š3™Nèú¹¡ZÚdE׋¥ƒ (5K<™-™J¢¬øá ’¶$àÔº(IÕ•¨nµ³Š‚-i1Ë!~øqÎÖH—F];¶«Z22c¨Ÿ´ —µŽ´kÃñâ«®#óc<—qùŠ 6ÇàJßHì6^ —¤i(¹¡¸$ww‘„lkA}Á­ý]ÌÅìï³£KCòØØŸ|ÿ=90Êàæš,š3ƒÌBë nt•n¢iŸ,h!Y{Oó!“ ó€•ëÎ(µû䉡zB~ah…‚Kpà‚¼>;–DUdV—yÁàë…mÁȼ*¥”—,'³ ¬ƒÛ%8¼Ì#›AÏh¹d™]Üõ±oóJd æòˆ»%™ÐbQ‰ËAÆÆÑ$ÍÙÝ]r´Ð’Y^èd&è³Õpð܃&% …peAà3€H-32v:øÉ-×ç¥Ê,p²/ºïèÀ"ì5¸-M,ߤã^ÁT 9IG¾J¾p/¯ØüoDî€Vö'cçuÆ^øá†¨¢Í»ñ¶x(ؾD° ÏæB[Í ¨)ªê‹fû44´RÜ£™þ Ùd±ûÞøÖÖÇF÷{æ=òùsÜæ)gxÙVkm¨µñü Ód/ñÌwG„â—Q¿×”GðÎPð©à<ÚÅ´Ô†TW€Ûƒói`²$J$>U9ƾaáÇ•äšm|2ˆ_}bhmˆ-ü£SSFN0s¹»}2VTͯ4uÎ$À'·º£ãy9/ê–xÒè˜k¢žÕågh9gR¤º Oã†L=»Ÿk%ñå´&jâ­¡Œ.cýS>'4hÊKj ÙÁŸç­YÁÊ¥º‚Õíí.B&¨=ØwtMñ’­ÌjÚjÁ/1O!5CdˆÖ•%õ0e¬²¥¨êuútà ŠñÚ½[› H›ö×~ÃàÇÎ]ø±Vp4ý^ø†ý8‰>¬_êÓ£RA /²Éø÷oÆÇ¯#"õÂça–p~ù˜Ôa(ÍÀË¡rA`>¨ ÌÖµrç‡ÄwrG·»­þ·ç€nŒ9jj~Ú[tø"2U… ›Ô«Î;ÉÛy&ª "JßbL^=K\rwåþ%ù˼ ÈvÈÓKr7ŠèdèÓA…aß|W,»ê%õ¯·Än/F¯SýW* 9W ø€ã§‹ð ÕÌ>¡%_€­ qÙ/ûÈÃÓm¥ë¶'¿²|N¦U{/ɯ㳟t‰‰ºô+L,©ö#/Ç vgЪ"$`ÍÔ‡= ŽKZl>AÀ¼ž¾:>|þvrpr|ôÒ+ÿœ^úž¡Ò.Éùf5«ÀM˜Ý°Ò ª}¿¯‰ô8/È =QAüÀ›•­©ì¿P CöÔu¡®#v&ù'ÄYOÿ¹à“ºPšx4óP®Ùœ/8õÞ¥8xão†wAïµù‡¯ŒÎFeþ®ª†#Ùêþ ‹#úbjÚ4ÄÍ6IvÐnú¤-ú¡qØÊ’žã¼lv·æ¢²[j’Q¨ƒ.÷<%@Ô¡,HJ©Ø*«j•­AtU@ A.Æ«Þ3žÉª×ŸRue®#1¡õñ‚J5©rrî¬É„­NÔLjŸÇÈ:ÿõ:§ ½ •° ûDÈöV¿Txmg*X3 š²[ˆßˆ`C›Ø…iºÍ…›DB/¸þÒäÏõ<¢Fù˜³K4ºÑn36§8yÑÍ)F5E_B5j!t™bzrAúæÐìSÍ»cd:Hâé! "‡jS–hìÅÜÉ¥&i*”¯ñï½®Š–'±êÂMãÜ8Ë¥|i(^©Ò]I—|;Åà*9*ÍDJ´³ªf8åL×ÂÍ.Ófˆé€æk‚-X3 •ÂáfÈùz¯çn&‰XÚL–ìãÀ¾áx¨žëŠlm¼ûvjàÛHSº!Ih–Ìc†IÆNƒ m¤jBÉt·¨í¯åô<(ÑE€õ¤®­ýí^cèR6ȶ‹@T¨‘º4Ø¥æi_DÞv#HFó¶€®9w¯sì“Õ6¾ÞhÍ—öK_.Ô_¯ÄÝÄÔ¦QG¢®åë7Rê1c×øn·Kê{à<àî‹uÃwã7‘γÓ|ǘöuý›Ûñm^ânûLâí%~,É~òìYç¬ç&˜X±Ò-àçnëþ_^ÈóôµñbÏZEUæK¬«3;=™2Sy¦Éw;ÿÙ“DìÞî'“¡ Ý^A1ôÇhîÓ¸²3 IÑþU¼/æÿëRíAÓKvQá:ÌÎÞ»0ì=íó;è±Ñ…†m&Fpÿ£G(™íÛ´©W]óÞ:a«w[͆ù(X¹Ûú?PKz÷]¦ôÌPKÛA‰;OSGI-OPT/src/aQute/lib/jardiff/PKPKéZ9(OSGI-OPT/src/aQute/lib/jardiff/Diff.java­XÝoÛ6÷_qÑC+ÅžÚ> òÕ&i€¥CÖ­ÖgR¦c%2¥‰”cÍþöÝQ”LI”cK$ï~w¼/žR°äÝ `¿WZÄYÊã{VÎÓÅâx2IWE^j¸gk§y|xÜY©tšy×€Ö›-r®îR³ST' óüÐÝ•ílûVß…[A5òs]/­ŒuœóÑuçNy´ûjK±ÂH´òÛãÎÇPÁdè¬×/*ÒT“lîª Kì Ôe%úéOXbÊ.ê8ï‘OÛÜ¿NBîx;V†y½ëõƒµ)¹×¹xz»ƒTZa¶ˆ2芷ÁëÈñhÑàð8ß©0òxâC´îVh–önÀÛ‹i(rº°ˆËaä-­+Ñ—ðê:.΄¼ÃâÁü8VšI¢Ûã2—Z<éZ2«Š+£Kè"ý€HžÛâ'>;…×ø‡š‘SqòÏë¡çP+0‘ça˜`g!mO9eÀV}:íyZÒJWG«Û:OçuJílùf¦YzFÉf߸kHZk˜r™m®åy¯—jºCæÃRbЯòµ0M“³;ļÁäÌ “ ®š-(VÔo5ŠôC£[ð,y¬óÚLTD}ËîsñÄð¡ë@ûA`üØo·÷¸´¡C§vôiׇ_n¥h¦$£Êß¾o&»Ï´ðDÌ\”÷hÐS³L-ñ”*­a£FR4ä.?ßòó–¿—:u±r Ú¾žk<(ÇF…•F—ªi•o¨«o÷Ü íppËÁws ¾cˆÍýxéÌFTuÙûÆßªS ’~N!ì­G `×R¶³5ÙÁÈÁ“ýɲJ„y©9Qó½Ô¦T¯÷}a°u,þªX¦x¤Sì‰êfÏÍ‘¹-èä4fÂÖ{>‚ƒS¢C™ý[¬ûfcçÃmUØ‘ª¯¬”(W…A%“¥HÄÜÆ¯›©ê¦Ãßè×¶-E^™”fìŠ3Ó"¤rŽgt eyâ+‰ü€SÐ*F"ÄæÝ!„ðïM÷ƒ+ ß§SŸcHÙ¸>æà¨…hؘÀðDt£Å/bÓïrL$îmútüé-^µ¢ø‚<íåüèM±×ª[Çp„Ò”fØ…ä òÔn ™ô}'ÔÂkgûês}¡³æŒSx×רßttèýè©¿ršŒ=Ož'ÿPKTÈël«PKÛA‰;OSGI-OPT/src/aQute/lib/osgi/PKPKm‚;&OSGI-OPT/src/aQute/lib/osgi/About.java…UÁn#E=c)ÿP‡•œD^GpÌD-•n53å¸q»{ÔÝcÇþWÕc{’ ‘¬ôLW¿ªzïUOÏ톟„ø×¡ÈÒ»fó“ûp1»˜Ý\__Ìèš~_»LýׯPØ…LLaØ6’(®¨õœ³d*k.„¥Ë%Ss ì/.<ÑçûG #—4´Ewš!t^òÒvÆ|B÷vèM-j„†,•8â¢è@òŒdgÍaÑm.x4Ä-·’\(÷Òº•k¹¸h•â–úû¨¸—{ç»–SwEŸžû˜Êû_jÏ ÃøhøïBë‡NòÂ2=l§´î$½íåãàW­ puŠ×–Nœ€XUkÓ;ÕsY¿AýC:y[xóšÒ2w{åñþ”—“Œ‚¤$mñÊR–ôP\øó1¡|€ìϪõ¤îˆ-íšPŸÔEw QYÕÚà edkÄsFšÙ¥ÚzÒÛýÄWCqÞ•ÃÉ_¨—xÇÎsãeræ3§…¦Ü¹N£q2¹5•ÃA+‡CÚÜšó™ïV1UÀ4¨LˆÞ¢êœÒÓaA8Áô× õ¾Ö°éu4Úè½Xzƒ{”‡ÔÊಢNGdþê~£`:šó˜*Ӹƈ£HXµse=Šà1Å^²Ñ‹ºáŠ­U ðgSÆÏ(–Kkåó:Ê2ÿ´iÝkça:¹-Ð?sfD~*´Rû¸¼Õ‹«z†jiÆÉ1ùPKh©ò›ŒPKs—~;)OSGI-OPT/src/aQute/lib/osgi/Analyzer.javaí}ýwÜFŽàÏÉ_A÷e£–Ý¢œdîöV²·åN¢Y}x%93YÛëGuSín²—dÛnÇþß@¡>YE²ådîæ½ãKì6Y…BU¡P @-“éÛä:’ÿXÕi<Ï.㢺Îö¿þz÷îݯ£»ÑÅMVEÓyRÁŸIÿϧ«yR§Q}“Feúß«¬LgÑMšÌÒ²Š®Š2J¢á²¨Ó¼Î’ùvô×ñYt•ÍÓ8:¬^’'óõÇ´‚b3¨:­‹rA-*#Ø¥À©‚$u””i4-ò:Érh)Égê5Â+Ó«´Dê"º\SõËuN‹YZÅ€}­ª´$Ükñ¨r ](£ôòL«*+rh©@`³ô ¡‚I]—Ù%ŒIEM \³wè"©§7Y~ÁèäE]­æó5BN?`7àü.ͳ4ŸBçÇÔõYôctîQAÛWÙîѬ¨+êhZM“e:‹þÿŠ=Â_ò|õÕWw÷“U]<¬ËU ÿú*É×_}õ€-Êë8™.ÒØ€ŸÔûëP3/’Ë髎fìÊáÂÿdzYVÃì&ó‘IVQ–W`ŠŸˆ.ª:)ëè}VßÀÄl=ÜŠˆˆ·îl‰©†-ËgÙ4AzÈÓë+ìækM |t°(ÞÁ,ŠúÞͳ:-„§©šžÏ£K¤òeñ.-/¡QF^è¨\¼…®Ì *ÕQ@C®ÀLÐù5j4V,Ó²ÎRA\@ü3Y XÕËUm”@h»_g‹eƒñ&y—ÄYÓj½ÉÓÚ}µª³¹÷Ý›¤ ¾«Åå-BË¿ÈO‚9]æ³8Éaµ‰Ñ×5õgXêï²iÚø&ùZ|0O>~$ÐËÕå<›2k ®„<8×¬Šž•Åf(á÷¯¿FR«°Õiô øBZæAb'E}P,×æË‡²Ú×_´Œ'ž‹%pÕáàà×óOqõ.lï›xžÃÅ 1$½ýMúÆuìbf߆/_Îî½|ã_Ûüw|WöXu2Ž“åÑÙ‘õ[üý葱uÏCXÄïIª¨2ÜÞoCgwW®ìMZUÛÒí[%Õ×½p8OëªmùÀr¯€oßs³=ZF¼µhAUP1ÝߤšX®éì«§ÕA2&EÈ D°¼Ã.`­«Ú¨Žh³:—«|6O ãeRß´f`€ŸˆM(+»Î —°6œÕCÂ!-AjÁ¨ÇËFC5•ƒ4‘sCµ»Ø? Š^ ˆŠ\M ÕQVÕ_?A™š/i¨°*•Åþôfé}`9̯ ®tYó4 3K‰¹ØXfû›t÷²Ê7*/sÚú9¬žÛ×>\,çé„wD™ ð>)wȡޗ Säõ6ìTµ‚ò{Äg?Y‹?“²ÏÝè|™N³+µP Fà8QF~•?†F’…!¾ÈÆC2Ÿ[`×§9õ ž'yv•ü»Jþ§%PÙ6À+‹÷U4ù0M—$<êŽ+ù!‘?ˆÌŒþ²+5ÀªtC„ õ7¨!ÇX7<<~vzvñúÙøàßÇ?OFÑ@횞“¿·6Ñ5ÚÖ0Œ²rä¢ «*¢Î¨ÆÔßK„W󺵇H ÃC”¡<8½|úpC¨³ˆiÒ²\‹•Ãíømº†]~d\ùbÖR⛤:©¾š”L“ª¥Ô“d‘F9þñ0:ï·£ ãV×ð}¢Æšq]ˆ9ÜP†w¿&óUJå· pŸ¿Ö@ëÈ^ö~`  ’žÌkÒ ‚“:‰„ʳ‚Š4’×iŽ£‚ü!CLNÜXeLò‡§ŠèÕ22VÑ»"›Éé¶®“ì*Þ‘<ÑoùÆ<{4Ý ÄÝòlHr¿€R׊l×Ã'ÏOžM^._œž9Õœý*—©Ò_HµzÏÏŸ/~Ù–{‰ÓkèÐb’^*Oìö‡°ÉŽ\¤F^9[ ¹#%yŽHþs›¥U$¹Ò³ùêÔÁ¥øk†Š~WN‘˜°Ýv'LÎ(@½:ɧiqÙÕ}õðqð0xçÐ šØ÷‚©Ëu šTި˔᛬‰ ®o²jÛ߀짱ݪìôÚ^“;ý­Síð9š¢ý êõ˜†&€¼rÀs¢6¶AtO ['â÷ 8sTµŠÒ–Nã%°Çú¼qô¢„ÑsWµêQã­ýæ³Mò áó9lÈŽqg=z2o&Ÿ*¶jš•.C< Øm0ûÍFzN4…%¥i!~‡¬ؼoð…YÖŸ!=cD‡F³#BˆÀiµÙå“â=ðõò-õYi£vçß§ºKný¤2»Ûì" —Kè£QÎ×7V@ÖUdá1ìúpé™o\v\F|5Ÿ‡HWB´F÷Qíᮼ‰Zž²M£’R¶:šON.&O_?=<›àf‚RîYƒöy¡Þ¨½éN¸G0ãÙ̲ZW%»´ª^ôÄ2_u(®f}*têXó+Ð.A,(òþ†ÙL‘„ÍÒJ[P ­¸9EyåÈé$f14Wæ³ôÃéÕp+Þ Lk=Šî‡¦Óš( ¹Z]VBˆº?ŠòívвäQ–¿Mg,&¸d8ÜîœzgZJºÃ6žÏ‡j˜ÔGºØB—®þ=]ñÀ˘£y–^%(!Kj€a•G ‘,²yŸ’)c‡ùGT­¡¥qô2‡ ¶8é-Ñ ÙŠ ã.d^žLçÙ²BÒ¡RêßSØQäìhØ`Æ$IC(ü_'%lrð¨Ön0csܽxo˜à‡Õ6Ûs¢«²X!ØÀ6¨ÀŒ@‹ž=á™i]ÒöaŒ:ÔgU‹\i«bnÓm%êÄcr‹VN§\œ»Í6{€«I¾­½MqÖŽ± lµ1n<>³5hVÙT€i‘§¿Œl5º!äã‚v@¶óô3b G­%*Òî¨ Uqm/³mc@6*!.´)ý’Mçj¾*Ví:tï¢Ì¦o×wšÂ‚RÛ•$ iL…™Í'þuaÑ*31—^VMKØO¼8ò¬ç‹µ¿é«Píµ -¾ß©%¢’ ¢äADy³‚äÊ›„¶ªh'/Ä&µ§½`\8¬‹ðffS^ï³Òq>›È•£9ù±a\mÔ1„¶^¼¹P'ï {Ùµã*VKZjУdÞN~U t]Cl–fZ`• ›¿/Ê45¾ ›‚QPÁX8;‰xaì$MXþíÃ3¼#äH@z†ÒÞˆ”ˆ†˜.Sà‹¤SL‹Õ|†:FˆÕ£òZâR"¦ÊÄÈÛºÀ̦ -ÀXÝHH0㎉B0Ĩò¨Œ¤ÿW½ÍÑ2u©-Þü´É*i£ GÙGº„¥+wDŸ>EË8“úóÝ­íèÑÃè~péÛÅäâÎëü:Ä+…T¥U±*§éi>G¦lS±®§ÙLø¿AKšÞ‰|’9 (šý|–Ï‚¡ûÑñÙŒ fs5„lGÔ¯…±ŒƦ<Hé¾ÀgÀˆYå¹õÙ¥:p€#e¥(?)u‰‹\|W°ÈBèZ[É"MªñÐÆ²1{ŠÛ9³imÁfFÜ48–PoÚS.×moølr~úüì`rzrôÛ(\%ÀDÛqúß+ø%{’ ö~Óíæê}*¼­çYE*Ÿ}6@,E;’Šoqc…Iæ¬Mf†nà®YÙ„ïü¤Km4½ÜÄ‚ANf¨„ ºì½ŠÚëP‰Ì¾‘Œó°¡i4×TVàN„6 \T¶ŠÕ¶º FhÎOsuа Yª(ßÞ%î!ôZ:úó9yË3SÚ­Ve©NŠîbKK’uL@BLPºDÉtZ”3¤Úœ&ÔY-å9DZß3 M´6¯ ¢#ƒáÍ’pÆ£ºYQ·¯¯¾~ Ê]ÅöPis`P^>§ùCì>—íî!ºóPû^xBŒK“ã8ŸÄÇã“ß&篜žžOø.¾ožCɪ‚ÙsAVÓµ¾·¬8’9åÅEß_Ø»ü!s5Zƒ™Lëätò÷‹³ñ/“ñShÏÒÂh²[qצ݃³ÉÞžû;_WuJ¾4ª©¹‘³OÓx²1ôëÍ÷Úêç³¢Õ·ÝC=Ÿ‹ÓÓ#¾'ùlg Î~7Ô3g"Nž¾>Ÿ_Ÿ>=üépò` 4J¼Ö.²Ez +#««ž¹­íÄø¡YÒH.Ôb_c øyïS–Oç«Yº÷)ýÀ?€&gÈ4×{Ÿ%Þ댳N¤wMâyš_£Ó ñµ ‚ëzf1ú‹šB iœ3­NËŒô’N¡°Öj¨”EAæÔ¥b°UÇîœë„gÍ ‚V@*æ+d2{ÖI“W;2{í@m¨ŸÜ=¶¤(‹±Q˜ºã9J¦3ÃÐÐ:-£ðì }­&íÃ`õ½u¶p ÄØ:Ñ{Ž~>9= !ǰ\üºçÆêŸDÖõ7ãÃ#’ºoýÆÚuKsúÓð%Ú`ÜoÆÀ“Ü6ÉW r)EêÇGÑåzG¾œ1ûŒ®qãÂí-ºið$ÑŽaÐ'ìŒãÕ˜åÝHfÇçvtCÂ×ô‰\¢J Å€âQveä ‘—^³kP(ZŒtdV›†™¹ÿvüäôèðàd|< ´W¸0kްa¿|cOÂs¶&U*ŽBÆúó„л¤ŠžœŸÀ¤¹YÙ-Æ~oöTtwyó®vt1Ø+Õº±î¦´~ßÒÃÉyy¹Ž XÂXØÜM;ˈFŒŽËÌzé4ìÉpo¨_äéˆ,¨8züáÀ{m, ƒC yV°eBÚ2ä¤G¦8…Ξ"Ü|Gð4þÖ_;ÕÚÜ´Î&ǧ¿N ³‚„>Éc W£ ¡+vúMþ(¥7dèi÷¶ú¦ã(ÑCBWdoÒ›ÖƒF¬f!©TŠ¡ÝìM‹3>À¡®1‘Áp@´ ÇhŽþ‚™{覩ŸH|•A|’, hlõ”_B¦OÃà‘—+É7rÙÈI±2ÄãQT˜]­E””fÁw¥¨#…9Êó@¼i‰©$²Š3‰-ì[ódJ0x•<&À"鈀—D»#Ašd-E§Ö¬D j.úУzDÿZU²¾í߈HpˆÊžk#åT"âßþûÿë/ûEyýÓ"<æ¼ Ów°p« Òæv.²z®z.SlذµÁø25GÔ‰Y¬ 8ì"»ŒÃ.á@]˜)‘Òmå´;¯­Á'>èAžŠP5[‘hØoGöZ·N1äáE‡ñì‹ N‡ ¸Œ¢­]Óß]úÆ“ o¹Å[Å€‘£´P­¦Ó©†]«Aê1’“Qצl®å'0,`™o0\zS¨Ã§‰ƒª„d‡“Ópæh`&¡ÖI}Ž•Ÿ6g´ø5«³ £1bŠáoÔY”·ÂnÄ+µòw¢¿„Åc{€­Vxç¬@R„]a60-¹Ì6ESʉiËåLÍó…Äó¦Ü`*Жì`ÓÝkÐäÁvR^W/^ùOé í+•-ŽI¥‹°<Šy ÊÞe‚‡ÇÒ7¨È1‰Z%œL£XG—:ˆ<3%•”|uèü²ÿ’S‡»ìSù,íFmˆÉBDÓž%9›¥s<0ì;_ž¬®®°Ó—̹ͷöÁª_Aî¤O˜@iÿ©v‘;˜ê¸µ* ó×Fè°³*®Vöñäb¼sxòÓ h,ÔuL'AYo×·rý–6?§ç?îœ>»ØYï‹èÐA±0/ snŒ>˜ì@¿6xÙw.ƒöR"ß.Š|Çê2N–K@qˆ‹ üQÂsJÈ•3¸;4>ÒÑãÒPæ|¼«S¿F†å„¥{Øš›äè–-ÈÓG_êhò¶Ð™9ù`[É 6‡¬¼0›­”Q6ddŒ×"½‹§¢Jž´9:gì˜í+¶CЙ(ÆAø¯¬ò2M¦7É%Ì0J ™[¡FN)¡ö&£ƒr{R˦⸌éö‡!g1GÛÉR:È“˜>©&çïù¼ƒù—*-` *»7öŠ;jXȃÂñE™äU†‘C£ÒÈìœ×½£WÀ¸–Gg÷A¸S¦A£X‰[vÂлÌV*¡U“¤f_1ö÷ÑŠ‡Öå“h^±£»Û­*0Ê«ãòØK¿JQN>~APä ¤#Ò(<`À²­G/Ûž¬èä³#˜©ãb†ça3ŸÒSg )ýËö\| -ɲJ3I c{íÅd`Å_C„i©°íÙCp¿EŒ6å7°ò”µ…xI½6› O Q-¤ª©Ï-ù£üƒ€Ï!zµ)Òä“7V™«È’Ø®9Ç•('´2 ð˜ÑÉ|Þ l Ï‹½¦C ˜|§¨úĢɩ2¼£¬ð&{Q® tº†æèÖ,’½ÂqhskhŽ;NÑe ™R#‡ÁÔ܉,,z1€cuEÇHGêPZS›At}M‰ÆsažtSØ(¶‰ÐŒ òdQmeÒn•÷©9‹öbP¸̱»ñÏ.WSB8ךøk[ÙÕÚRªá£9.w;±Z³4ÈOA¸‚Ïk‹¼‹€ZzÎNè= ¢H8-åS¹”¯”Ic´1ÈÉM ‡»²lÆKW±uˆÒ¢! ‘²1–Eè«n áÀµª‡>’ŽA{ŒlÓÓø’¼Óg¤Kí9ïÚ:?§0`f•Îv¹iãËÕ‰œÚl BoµÊƒ£òâ•رuÒQŠ›`ÛsY&kõ¥ay@s.žû°>¢º)V<áí½{>ë£*ø"{ ø» ºÁÃŒjfuÏÒ@ü)¸€kº„òÌp<ÈȲ„™Ôekâܯ¥qßf`s_1±¯Yú¢§U2‘;HжM¿ùdZ˜F¦v‚3üá"¡™ð!k­hå#;²‰,ˆ”ˆ m²ê½+ÿ Ý"¤ •Ü‹7IŸSÉ/¤ÏÅ0RðºàØíQR2Î!Iœ‘•2²í¦\‡¸  ãWbû²GNëJÜö‘7ÖÏOxä?ëÖ/±TÓ‚Í­ÛÇOØœækÿ†ZƒCê?w̤4äðñ¬@_]Qïä"PQz´.Sôpmî]üÞØŠWËYR§Jsò)S@ËèÿHgèJg2FWê$*¿}´ôôôäôâàôÙo΄.ï¥%6›p9ÜR¥½WßÌ.½C·Èµ”9PƉ³ÉŒ”Hžã‡›tú–Ãê9ªO$áÂ`{òíÄ„•ÒÁJç|cG!¼¶!@ªö‰á!á‰I%2¸hŠ(3ú *|ðnÓÆØ˜Ïß1jGh&{zŒlŒfþ5b£ÞÓ)‘‡Ö‚a·mJ‹1ÒÊ/aºý«üNÁøÛÚcaãpbå{0}Û‘’/p–FS&Ú! ÁÓ4|¼.¢\{<Æ|o.¼@ ¤5Œò¥a'ã¾Ú“î´ê0:9LÀNéTæC*PÃïõn×gŸváјEiøÖ+À¡+{¨ÈÖ7[^íá^ªÉM·Xë(z8è3U®q_÷!7'ãZ"v`ä»´鲜U9 F"X*†5qö= Îøµ³”ˆHÍÄeP=7¯ŒçùÙ6‹U b™Î4ZÊlx¢ê@2q2žã´ª(áÎ ]…Ï¡Œ®b%IV"#¡ÃàÄÒ¥AÀ1R6u|+}3Œˆ-SŸ(iËðëQf1Äפ¥Å±Ä@¤Úä}‡Ô§¬’:™9ä‚PŠÜ(bh8‚¦t ’ߪ¦EJ)×8Ê¥|LÇóÙäÓ7¯1«+†I,'R[u2.•‰Ãî!tËéÚ}0°Ô—ÒX/2•s Ík¼nâX{”7Ç j¥˜¾$HÜÖW$vXh<¢ð/wÚÃÃNÔu9½*çN½–Y€–ІW¥‰0 (5žÊZ)3ì“ ;WŠØþÛzÑ™q‘à&L…Ú}Eïsa#¢÷±ÆÉ‚÷DظLì‹cê:¼hÕñÆq¼ñ&z gAn¼inHú¼Ãe_¼y%å5„*y ð5*[LGèœò²x.( ƒyòYR΢ÓóŸ3Ùme2x_äp $/Mú¾³=DÚ–svGJ*§¯Eµ‰jª¯Ø§€×É%ìxooÉTŒUú·”óz¹i†­tÁÑ*§ËàUIÆçDç–TæaV02á(¯<éùèGÃdco³å3o ® Ao;CE•:K¿t £E˜ÖäªÏ×[I:)è¬0›QUé^E·1!}ö¹Ð¡‘Ë8¸ó¶\?a­åžW1«×mk´${ægÏG*íy3•âclÛ½ü.M°iÓ—NVMiåá•<åɤiò+ Œ5NN_»I³|wH‡þÜ‘/ƒƒ—°iLƒË_/.Ο<¿˜¹•5 œ3J¿ EÿêV9L¸Ù`¡4HN¥mWβAdZ¼Ëšpƒçc$ä›|iW²«Ëµ´6vçŽcaófDÓ˾U™ì}Õ¡ÏDÒa!iÙŒm'’©w&ñI9¯ùGüþÖ¸esùF Žübü&±ò:4™ƒ"º4ÆÑAý°°“Ÿ1B÷Ð]¦Ã6‡O©Ãí³a•ÉÚb•Oûu‡R©æÝ‡s'°w&¹Þ]Mñ©”''•…þ"É™|3ÏÛðkóg%_,t8’³v\0–¤MÇ>W…Æ [wÛâi¸•£ÉÝm„àOÛØq+lpLÝn~Æ.í)UÜÌÍHßèGEŸ|‡åo—Ê;$„MßçE:ã[ ²xŠ÷q¨i—6V4ºúÎ~BäøZj«D•Þ´g¦O. Ð¥œé4$³(GäÚPÅMv³Ä»ÊšGVÚS©èU´Œ3¦+êÁó³³É‰™¿RƒêåWcÓ-YâDiüƒM„2%”H—l‚ôÕ£Qƒ`­FÚH׋”Œ6j6Ù·ÍŽUË!#SÜ¡yÐ ,R†t,óÀ~ ,_,µ!+‡‚‹ˆyÛ¹NPÛªû'ˆ¦¥‰ˆ¿4^Q’¦öÆš”Fåµ-36飳E2- ç~|Ì‹ží{ÍŽ†–¬|kz£>ö}ÑóäDÛÓqe>F‚3á…UŠ<Ÿh÷†RÀ©F}“Iðm5}‚oJ~+V¤–“ñ•ú57ÆeF2áO™^¯æIóvcq§æ8¢3ôõÐkRÜÕ…I[D*¾î+–Ö´R'Ír!‰K—x\‹«è6īغ McºA]¢;ßüž]}Æܘ Å&å1Ùp©&Ý„Y'ë{"—V÷‚*/>æe¢þ!_Y!#’5áÖ*,ØÀŒfÌ -D!Ãí¼y@™F6¢[^V‡O‡׳És TØ}ðvCªÙ‘ðKå1Çœ'§•ñ~û­9M*ÿXóÜÏF¾ Ã0Ó¢Û±ku1Ÿé’c>|¦MÝYå-¢T¿C†<$g \â‰4iˆU®2µ›ŒDŸv ‡á‹<”Ï›£±ÖëR³ú.wJKµ²i5„Ÿ˜ÖhÆÞ£Û$;°î¶ylÌåi§èönw]¹5žúÅ+3k•¨WËyÀ_¾¬îŽð×à À‰£Z‚/$bwƒdIIcF!iÊtu6WÙãamJЦ÷í®úÞ«f¶jÓ%>ÚÅš®ÆžæL߆/Q=Ö‰QÙÛ{f`šmUb0xì¢y)jÿ ï’¼øö«2ëÈ^]|aÓ¼SÛ·“öl€_¦"¡ßí›öYc+vÛŸbˆÀj)‡ØúÜ×n2ÞÁcu}®®êYìLtgI~m˜éÙ7¸²Çfý5ÍiÆî¢ñѧ‡ZUýwÂg¿~(ãòŒ­†YuQ‚àX/žGjQG“cØï&OMUÊy¾XO³’Ë¢,m–à–‡‚”U™yýæ÷ÇŸõªä%ヌWÅŠò˜èKîag¼ZÍ”¡)B” d>ÙÑ@@¶# Ù|†?#6Œ¨þY I¶$ÝÃæä¹° ðBëN½5+È3ŽãâM1ùNé¶’–ã¾m°ïÉd [4„Ð…Á¢mǘn. qŽÖuaÑóóɹ+ƒ6xV×åæ·w‰°8ý¢þŸn¬ã›%ÛLW.F]ÏÊl&˜¡ª8¦­ê!¹QªªmúžÑAÅ?>;HÔŸ)Ñ•yïßô¥³žh„†ˆkVä]Ò 5q(Ó+S¶òÄ¥b‰^a2 $ùÈ\õNÎH(±ÑD\>`Z3üYE×æÚ¡Ü‡ýˆé—tT)õõ¶,kC@€TfYé¼y+¯xñfP7¨ÆñãÑnQ*®ØL½÷ΗsϺ «= ÀíJ‰ëÓ/Dö憇Ê}N5X#,€ €Rtõ4é›wŸ '½xÁ çöÂg–Á„>ìÿÔHdÒð‹EjÿÉ^Ž¢jXUt”½·¢Çkð9 ùÛépã°³:Ky}¾Ú\fÿyQ¼­,öjfE—)mºÈ¶a äƒTØ–%8e´YOø˜×8Óu—ß7¿_I †ûX~ËŠßDäȶŒà¿Ï¥‹YâÕ«Î$ë¯e{Iæ± pdØY±´º”·Itf#¹ÏÙ³¬¢¡Œv+*Z”+y’àY U—™_0æ »i^(ß-”dAÄŒ‚>ZòªŒ¼¤ùåõŠn E+£_…£–Wܸ'’¶ÆYaâ6j•Ç€$¸†ýñÃAkºYº‹<\[q#ôÖHc0(À¤Ì)wùó•ù³qj^©£‹›1„æðQ4É{B‘Ã÷¯öíâß»Å1*ýÝ+—Ýi,ûªÈ µX}ác{Z¨žnhusâÄ¿œm›®Ý$§WœugàÊžEûÅœB×êÏÁ]X˜ÊÿôYfºlú»o|¤‘ „öûÍðÓfÏ«>ñ'™Í24¡'sƒ1@ŸáÀ»Ï Ñp=iÒt_[ôm}P(_ v#Z<7 »Q°aS¯©ÖüDFáÀñ0¦o'zNn#?ÏžNôiÇS8»•„ÑÐe4l#Ë’|˜wÈ„Zu5®×vG —Œé?XE{‘ðS˜.ƒÆ·`ÂGؤ×]IM´Z“=ʧ%é£=Cö/™%«íò qoÂ÷¸ó‹»²Ÿ¥³$¯³)Lâ·ßJ~sS\²®DŽ ¡»] ޽‡±×·„¸iTB¡š÷dû"ˆÉÔ´$ŽÙYõhuõ›2CÁœw§ª¸3]r9©®þä¦ubµº}ŒªsªWsnæ²>Ò mÐe<4·oÕЕù›¯.gÛº¹™b÷¥&dž1þøñ‘ är/MAÐP{ÃÓIç^• k«üŒÖ“9÷68uí 'Ï8Ñ„œ/YDõhã¢\Cqu†$œ‘'© ÄÆ‘ÑèÈÝaÑó¼Ýã&hGNÑï¹óÔê‡môQ‹{ \(ÂÆáE¼BU’î›-‡*ÄȘÿ2'¿Æãfý*<SÍþ@Eµç+µüTäÉr®:s‹)N€‚i’|˜5ÞùB=!4C›„ûµGë5¹e Iùt$Ë“O[Ò1‰y[+šŠ¨J* “O •õÍå'Ÿ† €¯×›‰‚b{¢‡ æÓÌæ§0lÒ››1[îš‘®Í´³-Ýt3÷„,¬þéèìa¯EßÚ5Ù½èΠX eC:Ó 3¾Ècx69?=z~qà¦X+zjROŠ´Vâ–h%'óŠáLLK°3YÔe‚>\ú¸G^çLµeû²Q~64LªûÍÜ:»2Q‰€ñh@z}ÄöÕä¦D)2¢'Ö5\Zø‘oäßžÄÝìþ*[wÞK<œ×>_°`tËIV“/ó9uà°„¶²a!¤!HüÓ‰G *È{>Á£„d %g½b½üC™ E2Üg^s¨¯Ntþ\|ÆcÜñc…/R-3³µšOºç°/ÕO˜w7­A—ÁúJói±ÂœÇ*ß)Û!AÒ„²ê8­“§IØÝ²|°ÝÇÙª. r²4¸}Є•[ª(YeÉ­8´Ã“Ùc£<ÞÞ„é]9ÌQhtH>òi$< Ú}³ÈGžTÞ2¯aÞ‘zÀì¡l§Ó²¡CŸGßöl øôu< R,†Èâ/¥ºj„KD$2 6€œ~ ½B_-²æW¤OhnÐbx‹&¶Žüp¯k—¿8w>ÔJKëò’½£,›ÎQ¶jÜà#˜P#0¡Çѽý‹Ç¿Âí|ª¼)NŸüurpñúlòÓälrr0ñxV ކ/þk÷Õ½Ýí»ðcÿÕ½íý\w–†ïß±i'3e=[›ŸCÂCwn¼Æ®‹rÑA1ŸW²XWU¨Óé×îy|êó·ÎÖ”$4«ŸQrkHbÊrÌ»„¦â³“ññ$¬K*)Ñïh¿#„=Cq>(rÌ&[Wqÿ ø4ô¨„Öã˰:8«uÉ,PåWL=œ¥¥lAù‘HÉðé¯k5º>²ã":!ÉG§¬at:dkD„*D"@o®Ž›ò¿T ;T*#µ•¿*öàã Ûâ+–£o¯“¶S°/…·FÛþ7+0jV$¾Š$Óè ˜´vÒ¤ßãñÉÓñÅéÙoÛ#Ùa‹ Z¶;"OCðÌÑ*ψܼkoTĪp3Uaên¤»¢ŒßY.€uN©¶Máí“% ÷]sÕ5/æÐŸ>Csÿøh»$ÿ˜•®Ñ9̧óžD²aß[ZŽ´Ê¥Vzxrpôü©/ÊUöMÕ4̤òv€m³‘N•Ù|æóµ¤×mÂ^¯˜D|Hè}Ž2LOÆxvñ~ÓЕ<Ô Ó¾÷°ÌuxºÏ&Ñ…vùE|]«åðû®ÍŸA†ø´ºS”É>úv‘;ˆY{úÁOî“¿w‘»ªiÞ¦ôៃÜ%žÿŸÜÅó w¦¨?šÜŸw’8…ð9äÝË*“®IaÜ„¦ñ.ô§•è©ÌÖ©nŸƒ ÑHá÷ZaxVÏE3¦bFñ¾èGh‘N¯å‡(öø¤µþoHþgã£ÈٞѾ´ÜþÆ õ϶ף™±‹|WËæeU,ìàÑ¥˜ØJd‘Ä4ÅW«×ÐsPÖ3qNq%šyvD¬Œí¬@i*l±ZM1±¦,\13N|3gIµ<–2šÅñΫí»8s›âÓÀÇH¾Z,Ò^¨Çƒàqwà°ãÿœlc¶!Èu–wí5g㓟'½6ìVÅÅ FoÊG :l€ß·Pj‘„,¯"‘HŸd7ÜI…*⯺Ø÷þbt“µ.õƒ¿Tµº²ý‹?ä‘»çÎ!#"ͯˆƒO¿Ç-wx4»#Ý2È=Z÷›ÃûÄ¥~=³àðˆ-’7EÙ2KfÑ,·Šºs`–…Qô†‹¢‰V¬j]ü_CŽLÛS'ßm(Ei¬Ò"-Š^õ°žÚ`Ñï;,‚8(`b£±žFÜMPñ¡MõÐvôÌôDë6¨áÃËL²÷¡¼óU!ð'ù*Aòƽq{r¿³/_ÒŸÀíðoâÞŽým1÷cÍL–‘pã2Ãõ[œ‚Õî%¾š« D2;àá‹ÊßuÁ…ìkØœ½PBR,ZÕ o„6¯—нµ©2¾ìIJŽRÓ¼)Ч7x9•Åñ͸º& Äo8Åèä­û[¨ O£ðûß¶¶1”¿$Æ—[þíM—¥ÿSÀ™¢.¹õzKÿÞñ€±)rŠ5T¥§éó#eWv†¼‘t›d–Ôʇ+xQ'|nSQdì©áwjøÙ6"Ù:ž\Œ9­Ñy[Jiék: ›uýi¤™ðE,¬=VÆg#œÕ›gÂpV’':n˜&G¼‹ÓÜ®«Ãn•N¿ï"' :W͆rÓHØå¿(-õ…Lþ9Ó¢Dqe'ó„*ºL§”}ç"ô»)%ŒåM"¼Ê’i½".f ÷`ú "Žžàå?µ ¯Kø±^Mß®MŒ˜Û(úp^MoHŠwm=9oú,š—¾²gFjÛ {Ï‹dæ ; fw!´Î¬ueßF"åäØ ˆå\Þì^§V´ëä!ú¶³$«%½XŠŒQ¶X*ZKqu„,ýhE~³žõìôèðà7¼=ò¨¹>÷Zj°ÒZ:ïãrƒ[êAÝÁlp ¾ù]n‘îcf•íÄ“S´×èÆ*®)Qá4t·‰Š¡ñ0Ø4®ŠyXqeøÃ©H‘ä‡ âòÁ5G¥œ{í%ôš›Á¤\hÒûæw~±¿¥fÊm}ÚÅo‘ÉTüFfð7÷~%ùzkÿÁRèã>¢31r.ö˜d­¤›™Ù'³3» ‘]N„W q¶#7$Ç‹$ì{ò!/óÁ¾peï™-Çq‰¬7šVãìÄâªèƒbçúC‘¼Ç½² ³$^¼úémÔ4”˜üIý£ú¤FšUŸÔxó¯ê ÁöÀ8XƬ¶Ð ö£Lªg˜™B$D¥Y¤¯Å„ n;B•(J ·ÓjÍïèàž«{CÏ›H¨4çB3Ž´nöÂÌËËaÔ4-9MŠ[~,{²%F|ÇWRèü@AñÁLÃôjaò˜G¢‡p:„>^'ó1§aRÌ8lÔ«ï3³ÊíN®òÅl†f¯ËÔÎí÷òL5éÔÕêy)Ôë¥Ì­M‰Œ²WͽK–ñÜÄ«hÖ—nÓ€Í]/c¥`µ4¡AW¼FnׄZ‘=ZáëžÛÆÿñ|röÕ€ÒÆ+A‘ Ø)<êâ9ä%¡Ð¸@b>Îú£(ÎôªÂ…W»ê2:ˆ1±™·]eÖ=WnŸÅˆý2>=>ûù9Þ ³t"N­†¸MOÃUž&þ{÷\òw§BLåøääôbŒ^>-{ÚU²’WE³´š–Ù².(bxYðÎ%€R1”‰ª"Wîõ¦˜¿OÖ”v¥ SAoe}¦78 Y7œ²V5E~XÚï4pC|”*\IxÚvŽO™{HEš®ýÝ6ÃI§ï¡4ÝȆ¢ëmíûµÆ×ˆLŠU£V##¢e¹YQ£ÔKA 2ô ÍãÒ…WQ…n¸æ,ŽÎ ƒè²E!à¥W¨¯áõ ÉÛ`"ü ï÷ÈŒ«áä}bÏAs¨Êij Ƙ†@‘ÀF—º*ÁµÄ˜•ªæ˜nDý¢¶*EÃ@íÉJÏ?=w?½|ùÍö?œ*=÷Ä·ßð×v¨n³óªÉxs´pIA°çµéø¾îQèêtžŠˆ×g‚±D8Ÿ qA?Ÿi˵w½­šÜ½žö3g'–—>‘ø¥,aŠmKõÊQ0d­ÊM1Ê– þ ýýq e‘fÒ¶á+”PG£^ Ç@=Mª™Ø]©ª½IJ¥‰[ÈTÚX®ÝrÂKŠOô=ügLЦ›tÐEÍŽÆçô›ÍPnGð— föt¢Ÿ°Ï1¼m¹Jqúý3/ºùÎÌR_’fÑ“7BêW´ž|ɾôj -„£ï  [a9ÒÙÌìµeÜX&úb:ã¡ð>VäË´¨¨ªÉxæÊèÁ´˜¥¬ìÒOµøŒî«lL9¢‚°T ›2Ò„Hà¸çä6t'X‡{cúO™]±-Ò›—ÃQóò˜fë›{—zÂŒ¶9 I¼@ùþ2¥u[VÀÎ{ÌUKžfÁàq„Eˆ“5¼-Ì7†è¡ºö‡õþƒ¸°/ ˜ØŸÛÌvSC˰&È"Øà1ÞÔŠ†_Š(xgb§¡ÎÞþ‰9ŠÝl3¸Nå|þúÿPKë‹nš9PK¯Ub;+OSGI-OPT/src/aQute/lib/osgi/Annotation.java}QËnƒ0¼û+Vœ Eþ€æ¡öÐcŸAêÙÐ-qbŒe›JQÅ¿×`L•Ô/»³Þ™Y«Ž¬F`oE*xI[Só!¼Q­¶p`ߌ &kʤl-³¼•ôfµ€;ËÅP#ª+¯ Ìx˜úᇀ;;«¹¬aq$kp5¢OL­}G/å+»Ø ´Æw<ú¬8)„›µ¯¿£ueÇóÚ:ö¨1xl¼‚¬YP¤ ìù¿ÌùÖü #dÁèpìž:̇MdrBÎóº49ux.‡ÇV'40nfûÙrì;˜­Ñ>;!i¬R£í´ŒöÚÖ\{ p É]âî ùœ‘·c¶´Ù2Æû]§”Fc>˜–ŽÃ¤I'«=VGüL²X̺ØB1˜8ÿ<3†Xÿ‚æÍºÅwB@6á±n‡Ì+ýë*-²i(×bÍ=ùPK(N2G<PKmqb;(OSGI-OPT/src/aQute/lib/osgi/Builder.javaÅ=kwÛ¶’ßó+ÞšJe*Éí‡=Nì­c+©{ãÇZNzw“l-A6Šä’”·õÙß²¿lgâI)iö,Ïi#ƒÀ`0Ì °JgŸÒ+¥ÿ¶jY’g—IÙ\eÏ<È–UY·ÑoéMšdeòè™Q²j³Ü[ö[Z{ËkvÅ>{ßüžUX._pD.‹y²L?1­E÷¢aõM6£wÆ=ˆEGÅ,_ÍÙö9kÊU=c;Q½+Ò%‹¶v·¢Ñ"ËY4ü«âguv“¶lûŒ~'ªøí9›åÐtk´e ɦ“ψÍ×´¢œž¾9ºÐmã!0ÿ‡Ã0F1/[Á¦À+ñþh–ÎçyÙ°ʵⶾӸŸ¼„é_–s>¶Ýè5üÛ6 t\¦ KdÝÁPƒ+JVÕdϱ¨˺£hðÚF]Û®é=¥]GqÇßL_H÷úAï¤ÅÜÔ¼ŠOê½FTÐj”ÅyˆË¼a­"¬–ÖbíksRªVm½bÖ"¼E-W@ ë´ªX¥ ° pa¨µÐ”Ö’ùT”·@æ´ÅUÍa‚Œõ¢Ëé!Bã?;=(‚yyV.]Éò–ÕÙâÎ.G°8jÝI¥!,‰É²‚^†^s¨ÿ²ŽaXÍ–÷¶x…Q¶ê!Ù×PÉ’H™'CXò©¯Çý¢)â¡ÞM“]î § ’ÔÜ™vV¹$ø<Š^±–fE-áÑm‘ ³V‚ZlhY~‡„Ûn 7UˆøJXòߟ°Á{%cÃø½)³¹6šTˆº´§ŽN}•”€HÛ&Ú; HLY?lyiô$!ª‹PÞÚ‰ô0«Ù¬-ë;WŠ.4Ñ/`ò%fÉñKC¿ª_‹dÎrÖ’nzFV*ÖÉòÓ<«½Î)a'Dr¹jµŽõWñ¢×Ðò'4é:aïÂ!tÃ4 ï%·AA-Wf߸o MìN9 ÇÄæ¥mäùh'zžæYÚìEg[ÑV2䶬ç;à;?—ì-Þbw L ƒ÷ÒsY¦UCàÛ&¬[|Í}Ý$IÈÅ51ú‰³ŒbmúAý9m®AžöPxÒzp )h Î ÉyS 2ÞQÈ€/Þ[F5³lqh¯ÈOd#—`4—UÆP$ò媘çÌ•k_(+uŽð޼GŽâ#DI{W!£+‰ø6ÍWh¬ÀÏøèøìôüâãáÑùäàâèíÄãVá$Zü ÿNØ­`øñ@m0ô#)™ c'6ÅòÈAÊÔ6ùk¶,ÁÃgŸAâàÔt髚Ý@ÎkÜ/0ׂBL ¢ZÂÁíç¹4¨:ëDhºøÉÈdz䵞,„ÚüV^½š!+ûç°fUÖÀ¯ ÿµº±ÄˆDrÅ0í¸s÷È®hœÕê:!‡ã¨€nQ¢MޤÉû˜¡v\U‘ØRh:_Ó¾H€œUE‘ÃEÙF·)̆v,.S:º*‰gKËRœcCE“šR¹O3qê‘Ý¢ç·|±˜°pöÙ® –—ÜY1­ÄoN_O>¾œOK,•&›xµv„2²qplƒC£‘Õ`­Ä^¦ÕéÞèâ„D×Lq <ö|3B …¾€æ0¾&¸’L@†É‰XF× ûŒ8[¢}‘ðq—NPe‰&QÚÂËUË”t£s]õ”T‹ª…Ù@LÆÀ+еF(UegJ»Š^iAÄCÁ­u·™q«-ñ°×¯Ez”Ùgn˜<Ô­â5F˜¦;9½ë×׆sdû¬/îZFÛeoÚûÞž»nu 9‰¾&FÀýÅ dBŽ—wÑ‹“ÃLÅúaÚºš E/t%ãSñàtúêhûôìbŒûËðF¡ñdyÉæs6W¡C¿hK5 ÔŒíýŽûAV ;ƒE/CŒ"ÀG;Ávüeÿ|‡Fk(™ gtFVù– Ì.딪¾¢¡–»úË\ÈT ?"ðÊ¿ŠÅk ê7«Ë†ÅG¼Dí¨mGîûT™ßDÍ`:Áà™™Ù'!Ý9ÇØÍP*îx+ÙE[ã-¬À¦úß·þ<ÆÒ]”`Sú} Žæ;LQøLêýh –zÛÀˆòÏäº]æ¿=X–óUζ± 'F×N+ŒîÍÎMÞà[à§ÖTm|[<‘õ0>â«Kڣ˼  jé@lÁY `Å.2¿µÌGéÜH>8¥0S €&:ÕD,¯í‡¯Fv9ÏjÏàzÒd ëûå&À?Ï9S„’~èÃRõnlR!*#èÝozú—Z³e?aYÚÔ³1 &÷Z0òùA¡:R±V{±°åªýÜßúßøKUp=ð¬p{í_§öãŽÐ7@koÌT‰ó}“E<%‚¦à“ªÝ¡ÐÄJ<À?v±©¾™Ö¨DFµ ì£êO/°Ýw åÓ3 ÿ¬õp×—ŽíŒÆ¸!Û®ãG¤ûcqøÜ¦5ÆŠãO. `:7)“iŃ¥gû?G‡z^B4[„¨¯ïNÀŠæß ,àžèéá)fî¢E].å6FÎ3øÕøçOKFoý6³R¾YÝ´o¦4ƒîg”yÎÈgêÏ¢“e@KXNà»ë#¨ã£¦²wÕ=ÖGSõqÙ&¾ ½PyØÌofÜýó…ë mÄd£ö™r°³æpUÁ„ µŽ­zUc]V"Y$½ðþ¢üè~‰Í‡®ï¾=‘°ÉöUÍXÍcFøƒû…²œÇì,P±l†›ûglžm6‹³Fý46ùA²¼ÊnxJ“ꢾàD.pS~¾ZÍÃSMÖè E„²¡UEq.h‡¬×Dím6c^ŒPåNÑÅŠ;ok$"&ˆÕl̆¿V k|ãÁ4}ý`p¬úXV±7­Œ¹¡O{ïÔŸ tÅ´º˜ä.X¥Û|ÿ½™D2ù'…¤åf ;ÿù§!ùÎÎÞî_Lœz–6RšH¡£2D{sƒ¢›fv6m”E~1"A§J”!„ú„6ÉA©P 3ROP´jqÝ€¬ô>&‘Û2…‹»5›0Úœo† t~ T¬©´s|<[¨%‚E×$oN'ç˜,âÚŽXþH ØKÑ_y_7]óé8n$¢»à¦›™ôƒ–5í3 +flg·¬øFÆú¼É)Ü)UT YfjÃçÞâþQŠ|»–¾*˜—ÐQd§Q¯ŠY´NÝäÁS2úGI·¢È6Ü’â= j.IÌþ“*¤th§ƒNCpƒöøˆR_Œ18EQ\yÆŒÅ`H3ý$†gÏ*y$ÝÁéÉÅääbÚå ZT2ì„ ª“ #[ŽÌiäË‘F¥A ˆg†¸ÜŽa¤ ÒÞbúí%)7xîæD£Ê2» fÁ*ÁÃ4VQÖ-7¡'ý¹h¦þ‘²Š šKj3 §wk¶—ÿºCkõÎHÍ`­|o.-òU¹BÎæ{‰Çiý‰Í•)ÚÄîµGÙÇúÂ2-jô^4㦪®S(kADÃLÏ]¨å3¢M©`ÛôQ†×Š"?Þ ZtÛ‘ý±Þ«/Qs)dƒ^j£*¦}Îr¨<Ц¢Á06ÅëÑ¡C¿‘,lÜO,ÀâªÑ.šƒuÝ»4f6“Ù7b_â½h€¢ª×wi.ÊÖÇ0¤Þ÷ß›¦£>Î^Í"§ÉÈã½W’à¶äÔŒ]•âÙ¦áó|þˆ¥³ëÎgAÊ+{ˆGæùm˳8˜Ö´Aï‡5æˆÈu@žHQd+3Œ¶¿@†|•Øà(ŒhM™=›ðú$²Œªœ—eµ³IrˆÔ,€FG¿ïðµÇÍgŒ˜[/ª•¬a¥Òð$퓲=(«»„2‰¸DÙÑ Šbg§ÔDY¡‚)X½o±ëO¬ìdnÞÐÆÚ°ã†MboØèë–Ä …0øº©G€!™(À[÷Ä^ÀœÞ5-[&¸«ŒZ´yäÙ?ê•oÉÉ}!üƺ2„ƒ¬-^e ª®pkÓ+6xäÄ©x2R6…Å5jÝ pÿet[bNe¿6 3[e„ükô++„„Gæß ÝbHs<,rÇSƒ0¡–q3†Ë ÊBiQˆ]¹ËDÀB‰0f 8f³²Æ°M.P¬GÚ ()1û¼‹÷o¡u ú£‹#ñ¥Ò®ñå,ðag7´¡.™“h2CDǧZãŽ1†)‘àSA•8æÀ‡ðµî uÉOÆ GË%ëÕ Ï´Ùç…wz;ü2bËç¦ôS=Dèdð—câ‰ÚþTèTs?<¾8ÏÒ«¢l0LÅE“i&næqšj$[ k6ʤà%%¶Ù¨6 í¦Pçl‘®ò¶˜´wþÿˆô×8%ô:’õ ¸“8R`\ìB‚ChSðV„2¥\Lu¡?¦ÝV g÷ @õmúsãìaé;cï÷žžç§·Ô;~& ††‡]‰M=‚KnÅÔ³3n*ù÷Óç×¢Ðö S¤kì:ûqí<”ËÅ5ÛzÇnJ:¥Áð3UÒ·Ù[pqg…©E;;5ÍŒ€·Ñ%¸ž†UÎǨ ­ÓGøtD¤ûÚ #ÍHñ³=ÜÛ—]øF• £6+`­rˆNTž}b<ëy›¶G´ËJ6U*e ÞôeVˆ³Ñ«k;=¯e#õå7i¨ Î¥øÖ8,ç52Ñ7v±É÷â½B{ô熛NðšîÑs7ƒÙ;rt´G&þX“n‰Æ´ù6J$Z -ÁÛá?Ý^z|ðïx·®0ʱqµ#öÆëq±±;áGÅMšã9L1$LÆ&~ Ùyf¯&‹üž×xé¸U˜Gê"zãpƳŠ\ê±Aáíï=vaKñ|Rj¢â*AÁåÁEœu‘0Sï üø­@‡—ùFלD¼÷ 7ÿ:Ùp‹ÒçÚuª–Öd•Z]#}U›€|+PÆ%+å»ñä,D+iÚ´nL{ˆ h›ÊñÖ?^zïžf2 »Ñ7Ú€Ûåpº£OF¼D;šñd(n@ n):8þäbC„›µ/ÁœÄ¤¢¼Ý÷ÐY´žššG¸rbÌÜíFL¦xn‡Œ•r(t"Kµ6)bDA¼G‚DC„‚G€ÀÄzsñrû_t È»ú9€ý´ÀÁ~ÇS(Çl‚ ãÏžL =ÄBÌÕ.=½ÔâLˆš;‹?Û»x´—î ã9‚¾J²Å»ŠÕЊŒïß7vñ>PÁ‚(QŸvf~¡ƒÝ”9<Ò‘áq¯9[`Ò]téFe ­˜j~ݘý^9ò?xv|i´ÜÔ`£Zts]®ò¹{ÏŽøÚb@$RÅŒßñÂ×p’¸ cLaheÃz#9Ö\b´Ì,ti¸¹Ö½Ük´òPú«Eþ'™ü.vÝÄŒg|€ò?§¨øõv‡[ƒtöŒÌEd^ÊEÛ5åjúH“âáØw‡ÁÈî!è<ØNƒ=pSÚž;4‹c·;‡>5õë*ÊéjvM©´ƒ"‡±nxK¦Õ|dN#µÐók, )=S¨¬‹ áOgÒq°Dð( vÍõ¼Þèç÷à êNñ²]«#9z™xj^dêÍø»ã–LÙH±ªŒ‰Ùæ‡ ¯Ê ™‹j·cû]ƒ@ø[ïR`«ÚøÍÍÍÉé’½”ôéÜe‰€ ] w­%d=¤ çp ­-5¢uª|]çˆðÈÎï—ð#2\ëPÇQoÊü†8³‰u.˜hyÖÁu‡,Êqp\ÿ‚£'/`!p=)3XçMl"øðù…€¶ ¤QÔp@ rÑʦ³šøKÌÜBÍY?V4«Ëþ…&ld¯^#• 9Y^ž¸™A€W§±õÌ g±™zDã#D9‹L“$©ÏG.˜ÝÚmà‡|ð0•νabåm ^ù¹=Éâýç•Ð= nÿQŸ‚vA½+AˆV?¤ ÉdAàùƒ¤T+µD´‰lˆ|µ ¸pןì'¸ðô§[„öw»Ï2l13»*JL,1cù6³F4ú$_oD »±dó¦*`ëÊèO/œR·]Ú¹ó·†oç‽+>ßÁ<¯ñ× Ý‚§ËÍz²#<г±)b8…A££ÏÐ@šZdBÃèôÓÔI˜.m»Ý%Kç#œ€¾ȪýoÚoutA¹ÃdÃì(( à:Õ«:Ƥƒë´˜ñ+u>±D(¿g‚ÃÓšôlékÁ„u1 ¸'Ž€O×o8¨°:@›Ùâj‡©>mwp˜œƒ?+„Òsu¶Z¬Ç”8“Ó9mŸ/¥ƒ}Ò°èbø|eD2iñQwÕù§$Œøi—ý¬þöÄíwî>€'ÄoEÎ|qK@Ò ½ÿ ^³WäYÁ"¼>¬##¿=,mEÒ‚ÄyGÞXxÊï„й/²Ômû5»ZåüdtÐ臼eDü„†ÐÇÇ“‹ýí£“—cížßNmTÈ@2ÞtøùtŽõu ³saK¾Ÿs DlcÙÊ8ó©Åæþ0êcP¹VE…Ìm–Ïgi=E?^ó’D¨ü\….B¹W<LÁ'(çÜr‹m{>ô ïZ`‚ ÞÆ­.T'~ê€9‹X;´HkÃ(UN„²Ô-›¹W©nzÀÄwy BTAkïí)³kLGÁÀVÅ¿öÛø7k’dÊíÌi»D[É–›ÅØý¼ŸøÄ±/™”Ã{äk¢¥ûóa”E1.L-üäÙÃ\e›·§>ú`avŸP~>t²Žµá$NpV>@^q6u5 ïþsüÁ דHÌíàÙz=É·).yYB?eÓµtï7^Ÿàkõ=ã¸Õæ}É4 WBbF\4€”PŠ0—^òâ9<7=ò_‰¾nûŸ_@ˆ.²­\´Ô6”4#_œÊ@iýžYè ºëˆb~OÔ뇚‘lëø‹F;åtòÝ jÑ9ª¶ô–2'ã2'£ ›Ðl—6eþ ›ºÈƒ×«iÞe´1v…a_¢/>aλ?P$©Ó‹õÝ äÞ_PÖg‡cHÎX€Ã©ÀáÔT×ýöv²ì¾ßJ?×Ú†ì8tË®v%^bðøzû›sN€(k¾¤²ÎèöÌçÏSÐ[â/þ¤k{ŒÔ a·Ñ Ãp3“U¹aöÜþ¼–_ÔÚ½ 5´'–9¢Ý³ÚÈ;è@ Tá¢sRÀÖ.wKu#'–Ë8ŒˆYŸ„Ѭ²ªΪnÝ© jYÎ¥5¾žUzɺYfV™Èj^ÖhÔ“œÎN‘ù_ºH¥ã=*u¡ësðÂmÐxÜ ^òýØTyIU úíR¨ã{)¡ã¤ü«!Vá%ÿ¬œíOõ%O­wº´Éá_Á±o´ñ‚\+;AÆýŽ•óeï&»p0™¨EVì«ëgù¾öJë—ãÇ Cçµ›Yñ‘|Ó.'Óƒó£³ ó†e½çrö¦Î¿q§§oÎ_ûûëî‚þ†ºwHk=òT÷ !Êú[w{rxznõ꿉Wfÿotïžv «F)jUÛ'jåH›oL×é¿¿8}}tf\X¸¬à s¡_Ñô49™N|{Ù4´pœÎr®g\l¢Ð\9£/¶RáônyYΨ5Å>ûdƒzNkø¿“£E( Å‹ï µë©ªw× Š|õ¸d$Ô†×-®<÷ºÈ§ç•Ÿ(ú_Ò*©ËUu4Ãï͈iÝf‹tÖzéVE7/u§ÄŸƒIûøÑçe^4»[⃭KT™àÀ¦àÍ$e}5BŽL'·xÍÏM¦jßÞÞ&·§zO?~2þçñë)4\¦Û]\4cЪÉv*|]ÎHånÐYªAÛ7?~|üñqò¹™oíÙÓS§EÏ—åœåâ^ô=‚ý|l”­i/fjM9kàÓ>«öZD¦îf+É$_?óóµóÅV|ŒÙÖ€Yœ¢Vߺæ4 4CÝOŠI1h(u¸ ’\gMm÷ì"X]i­¨zu¬9×vZ5`ý±çq_×îu¦dm0.‚•û‡c8}8>{Á¸¨ ³eSäVuÞ‡·;œ{¶ÒMŽÞ F)à-a!È/W«(Œă˜f¥ž›£àÔëÃDu36¯£¿ çÈGëÜh”±-¥åÓõ(kÚ¡|NE»Äâ]``üžn¸l6äGÄLš¯cMI39Ê5çƒ-$C|iT Ãhº¨†à®¥ò¸—Ìî:TößæâO6q• >_qç®èÛàÿ+f 7ý6‹Àx,¶×oÿý PM³CÊ jòx rÄcn<<Í_]WÏ¢÷!PšÜß|÷‡@ƒ¾5~ü~ÐÓ6ÏŠO»Â4Ô 5ýŸÿ–³½®‚µhiñ/ô‚[giÎmSÛ9»sqƒì> 8lZ.Ú[L…¤EŠž¢iD½ô#‚ G£»fœ)š RlH¬ßqž5ÜÂU³ª-¬õ·+úyë}“/þÈÇ\§ÝJ J(ߞà zyë?$ŸN+éM|·iɇ¾E˜'S4E€i$R«f$0EFKø¹þ]yÍ|zË<ð@°ÜÆP{ þ ãä–ÆeÏßÈ‹ëtb…q/¬×*†Ì75•˜pâ|–»×I ‡¾3a~4 *—Égüô‹ÿRÿ=O½_& eмi³:^åmVåüIt´ ¹)³r‰×ª;mo™L‹‘׫Sö„×elUòh¼ÃƒÆ-.*Æßáÿ%­ß}à[Mÿ7 /ÙUV*4â>(vüâ¬Û)}u•ñœ ™)õËþù¿ÚL$뙇—ñ•oŽìo­Ëº‹ö+ TÑ’Kœ5kðŠ•:ù? Áo„µN_ɘâcÏywÂ3¹õ¯Jø ò_DB޼hÚøÂƒG¾§óù1 /éÃÞ-¡{X9(¾ Lj/à5¯ˆá°JÀò)NNÁwÅ?`6Á¬O¿ˆKÞB—Ð:›Áº)J¾l*Á)t 4¶[ÑY#÷Á ±É›s&Äôë¯E~t¹"B¤–6{ª„³î«%o^ô$–yîûÁoíò}—üÐëàùV‘¦"8Ð9œg½ÿýAÝÝ{)Ø]|d°¶{í‘N´WŒLU¿üƒ“¶á›ªKõqg¤¿-BèÈé^8rÙ˜wô‡®²wMý«.«ËáP-)?êKüj`-ÎíÈk‚ÔÝ&yø‰Þ½ŠÞÆôw“¤ –á}‘¢ pðÔSgŒÃ ö×Åå&&gáUW¥¸°Xzþß‘ÔH[—VXu‡JvåeçöamuÂDÜœcà,>¾ÏVagñëÚ[«/û¯«v:tûn®V·Ü ¾“!5ëHE0NÐÝ;+X·Ï ÒB4IŠôÉÇM¶³ŸÞµº=„|:ù(µ!Ú¯©.j%Á·k¾:äoHò\œ{#àþsyV'¿ã€Ö5ÀofõÖ±¤1 æ•Êöƒ GRÕɆ¸êÿmæúÃ-å’àý3áÊ›¤HÚã¶î´MgŸ.j¼ín 6bÏø„³"*8Êr¢3R_~Õ!><¨Î¹píµ—øÈo÷ˆFöI&´Ãw¼[+`äŽÍèàÂ-×gÍ£¿WÒ¾\]]cùLÞ0PðÕêÇ`AÝæSVÑçÚ@<Š,ž†¥5Ê ¿1ä >wÿ_Ý/g™ vë68¶Ü©•º_ ÕëÈHùcÉŠ>sß#²0WB4EMª!¨-wR‰J5í븅IlÞfkó¼IKÖ²$Æ‚D¢UÈ)Û™Õ%}ý,n€ÞäÍ#·È Fúl|t:}•É"å6éVâGjüQÔ”6Z_5ï>ØùkX*/òØ‹žz"|÷‡ð^à  £k³Û²Ä¤Ž;ìbµ¤ÛOý_û!ÆŠÊåÆîu©¥®”ÑñzþexŽFÃ\!CŸòЬÊÏž$O“¿oOOöϦ?Ÿ^Ül$̉3iaIúäƒ1ùV 7¥Ûœ*X^ËŒ2Ê{¢z¿ &^ðuàœÈPz×dô®`u¢½'÷X~ª¸Hk jñ£aðPŒÂàWNEGÙ²âkêhIß Š‡½þ¦Äà!´3®+Âï%'þÏÁËG;Á—õUR6WY²¨AŠß–õ§DÜ´y¦È½ïÕú8Àe£zƒ÷€™Ñ@߆ïë÷EXo¬/ÑÉÈ> 2ò;H7!ã7$G ðX[‡“"©‡ –úéþ /³âëXoÍ ÷r7ä¡cÖ°ÐÖ¥Ù­Ó© £ÿH%?MÂÏäá}…ßý¡õs¿CG”q]öIÏQO€ûQ|ÿnZ±Y¶ÈfÜImŒ°!zÂ2 ŠRˆ‘ŸÓæZ{#|L×¥N§Ì<›½<:øøódÿpr>Õ;ÀÿqÆ0ý)á¯õûÿ PKùJoÏ%øžPK­„è:3OSGI-OPT/src/aQute/lib/osgi/ClassDataCollector.javaÍJ1„ïó9Ž ûžtõàQ÷(z;5c³™NHzDXöÝÍŒ?,PÌ!„¤¾TU'âpô06Aö›XF¹êº4ã@¥¸í²ß’Ñ6†¶˜Ý±su}ª^£øé FÑ^Ô1£”K·³,::¥ îxúáÍ ¾¬ýob™RÀµr¯†ûï?¼Û}¿{prÙ=x ?àåá¾9Øz¿ûvĶ~±ïwŽ÷Flçð`çh÷dÞoŸm휌؇Ûïöw°æÁáÉÖ Õ;úxp²ÿ~W¿€;ï¶Ž7‘[Hå]@ù˜×¯ ë7ì»­ã³­£¿DtÙ¦*ŠóUˆŒ±èÞí€!EQñaPÄ< †šº‡AÑÓ6læKNÔ¬,jà}>‘l¸UUEb²½ŒojÎêøbÄÒXZü5šñ©/Ó*‚j0Çð熧0†¢ØW0†‚±Qp«ÅGuo”#$z¡ 4­ÏÓ<ÎÔ` ;þœÎNâqÆO?AŸ?³µ[]ek,/rÆ¿¤UÍóÚFðëuª²Ž èødëàäl^Ÿ¿dOöØË»ŒóILs»´˜òú²˜x=·ß¾ —ßèöóš_ðÒWë…®µ—±ƒìKªó­®ó®È/Ø Í'ü {¶ùüÉÐWÿϺþÛ–2ïh!GðÝdyÇ®ôœê¼ÔuŽë2Í/|ãù_c<)Ï&GüÜWm}M×{O„ U\·ÉXžÇ ïnñ\·8ˆ§|+ŸœÜÌx¯U§Eà¸(2çfaZm«ºŒ“z££Î’á—qu4ÏëS*¦ê¬NbWÕÅ,X …£–Ç?‚D°ªÌ “ÓO²œšýÀ«fý¢§7MÒ†ýÞd;%A+V¼ 7‚˜Íâú2Üé4Í‹RþÞdkãŠÁ«b^&|/Íxx$_À^0JåBUÅDM^…+Lx•”é¬.Ê*ÜGÜšgϸ΋§m1§¯\J‰.Aê'U«¥ OÊOó/e1±ÙÛ¸ŽwŠ M( s2ÑU7Y>Ï2Y÷ˆ â JùÊ5"ÈȾ‘ FºµjcéÒ Xº4˜¦)R Øè‹o®Í¹˜ÅeÅiˆÈƒ!À*‹ëŠíî~Iø gÇD¢äõ¼ÌVÿJëˆ8$Çðî=ïç³y e<žÂÝ æ#v¿îí!x§ÜQÝøÙ£1¦$*f<7JÑ@0Ë×Ú02M ad-i%YQq«£ÛNÏÈ¿*îD"llBr~í–Àh‰øå&à°Ñ‡~dxÓXßê™ô¢j9ÝÁ‡9^ƒG™,)ô]\]Ð-,¤pvj*mU5ÄtWuÃF•Š8)ãë šœÇYÅ7кء7õ%hRL ËÅõ4¾ÛD~„O  •ôœ D•' ½¿ìlíínomïú8Š5¨4X:(À^gWq–*ÿ6Ø»85]Xj€Ó\.‹ÁÑŸ\ûBŽÛƒÉ­ 0—Ò¼ŠsÎ X Óô'2²@Æü—¼Õ×m†.¸yô‰ðêë‚§X¦ O@©@ã¹g˜¹vcí®G(šîÔÿ¿8»à5ñ~õ9IÂ’Ç ÀJž%,rÐô¼,¦Ô° ºDì,vf Y°x^S Ï ‘Ñ1†z}ÉàÊ„ŸÇó¬ö µ% ßMö|Ø.Æ' *÷s¡&±õ{¢Èt$Êôj ƒIPûSYÍw·–adk´þ1RšË„¸ºb@YaÐlbñ9¸lDbKÚŒÈÌ€÷qþ¹buÖK^±Ë2­ê4Î-@{qö™çc^šÑ™•U1Šú%¨sÎγø¢êVѺ‰‚@»÷Å$=Oyé·´eùÈЈÝL¼ 7Êk²zÏ„¹ÓÃh" PYºCóP ï“e^¯üD·%“ˆZló‹4·°ém“KÚï®—R³ îþ‡üôà€ €ÖˆÔ¨Dk50×<Á§qÏ“ÏÐ ˆb—F4õ* Q„!/yžð¾ð®°.²äå_jžOD°Ëßí­˜:ʱÓ×ÔTX¹Mß°5/qt=izÊ`‹ÓÞ¥<>šR¬þzíb /Áìô“EW=M?§ßU»->QDé3Uét–ñ)ØKU‘­ jöš·s ßmÎ|Ä4ÀBú&°¿°#•(ª3ªîåÒÇg©ô)zá®ZjOtqû6ÀðñU .C ´E°}ËæŸ€WxÍÓrâm"7L®â2ÉØ-Øe‘M¤ž™Fÿ¢ÍÛ¶ähf¡ŽÊyRGlÿœ¥0P­yÓ¦LZ{ÛBµëb% &ÏU¢ ‚˜ÐùWÿö6U§¹¡…ußBÄ»/Ф &õ¥ˆàD*¾E‘·áq=Ÿ¥“ìf„Ü4ã…–^ñìqh»²­åÈÄ£ˆ!ñ%™Q#pTØ8÷O"vTq$P©Äi„†Ú„ãv^€@`w‘Áˆ¶d<ÿÑã©A­&iœ|ö¹Ð‘$J4CŠêBZÓbIè"¿ÀÀòX¬¬+ .–ÄÜ. ½KT†âžer{ÁDTw´3Ï]væ(}KÕE@Ü™—Ò'vaù[5ÀÏk.¼ž]!1Ñ„ööwß½‰ ÒBa¹ºÚ²£w.9èi Ê5g—ñ­è¤‰K [± ¥éw€'ÉàìzÈ^W‚”­ùDÑUñ™Kya­› è½*Àö‰³džáêFÈÓÆybBºë_{\iàÕI!x˜Ÿ#ÇeÚþB[cÓ ½|¥–÷& [8qƒ%ÌòXÅ´UÌÒˆ-ÉŠK»ðKƒwº¡à’á;ÖÆ’oÚåæŒ…EcBïrm<~ç·Œ3Éè"ì6Ù‹—ÿͤBT*!Ë‹HÚ--‡êËíÝ×ðw”h`¬šjûch™*>Øf2À<Ôfú=Í#·=)qhUËT6ôÛ¯!íûkÔ`[݂Х³ëiéuš§õ›¥ˆÿß” éæ°î¥UñAçW€EéèW¦+"o—.¤T£;'‡G#±Ö½ Lˆ·Gˆ`~g 9ɉŽäýîÉw‡o»±@JtB?ùáîa2,”/Å5à¼DÕ\\ûgY³ev†ê G‰@;x ˜ 4.±n–‘5J¾Ñd>ËÒ€zÄU@òäì•ê¸+öPÎdkáýT¬aÄ@X ˜Ù/¿(–9z –¨6i :€AMG ‰<=*îó FOdˆ™zGPî¡]d81¡¹ý©¦¾×ôí¥N{AùfŠËTÖ@gG—quÀ¿ xöδ„”hçQ.j‡ReQèEy‚#þú>Îæ|0 ñ‰†Ð-ˆÞ6#ÓíBì`…›ªæÓˆ—eN:Xµù`écŽQõ‹<ý ÜXM¼W—N};ÎŒ›ûërsœ2Œä%õ€¿ÎÛ•ÉNýp*Å"yª¢¡»ù¤;Ý¢L¯P]¸amíýµDªÞU±»íαèĘø¥û)¼7ßžVk{àE;ÝÆ7>e9ü†#T‘À_i*«˜†IÛr‹þkö7à·ÚåPh7VWÔfÇ û,4"†û¦ÁÝ-¨ã ýªM$U¶êÅÖÜ9[8!£f·ÿnSsg“÷¾¦î½ ÕöÀ¦"œ2Á5þ£f-ŽømçÓXbzö‘fª @»ÛÑÀ„:C=Ñ¿i×dPrþ­¯L„F¾®mZî6ΖûãO„ˆJÝi&ÚÂÏòÒÉ’=vêÃïαÒo Ìp!]Êw$ë}©'³Vþì‰Ê´éË».ÒûR‰ÒŠ~U¹FbJ„ŠuúØTzô%JÉtK>ŒÓ«c(Þt°ìx‘Z¹'{ÙÐZ‹U¦„)Ÿë^îá.]l„ç…Ç)SÝDî%m¹Í 0¥˜àû‹ôŠçbÉXH®Ò˜´±5U܉"7Ø}©á¸%­½+(‘Œv€¶•PWb›¹‰›q†‘šŨ‰³xÞŠ¤®‹H*¥f<¿¨/ý‘Tò@É]Eó1Nxq.t½×EGöVÂÓÈÊLÀÍmZD2]j=Q_åF [êEwàžøk·qŒa¡F p¾A¨È¸Žˆ_ÎtC#žŽh*4ü†™Â8€>b,î,xÀ‡†¤†e5iæèyçHðéÎ Ž] Ùî64sfs‹bvó.ª©qêõdÍaïÙ3a¢Å„e½,|”üX0|<ûÏ=‹Ež×ížç§Äùëõ.Ѿgx^µIàŒUY w!¾EBˆA51Eaim(Zã9Á„QÒ‹÷u¬ð¶O×án@r:楳cgÊXtrв›{oš5bþG±aö#ˆy ¼ôˆz•=DšÑÒüB«ºÇ rP°_ޏ½}àÕÌÙÿ ΀n¯@ue\£:Â%„‰%:ö8¦õ]çžbÈ0aÇ¿õü»*iHK iîM'õ7Õ€8gÐTfB8.תùÏíÉÇÉS]’Gˆ¿O«\ãpp³÷g!ïnÀTè&ûq<2¯?YšÜDòú×çñañYš—÷@Ç×öÁxíçW¿:}è*~Xü¦ôéÀë¸9Ý·wÝÂ9£¨î“8öô©\².\l„x ‹3 ØKÕÀ L ´Ç@o­¼7°ðþ"ž×Â0΀ö½ˆ³­òb޲Ë8€ÐÈ:÷üïãvÆN‡CŒ hØ’}•‚L-A Ò–÷¯g%Óü«¡Ü™6~Ö•ñ™?÷JÓ §Ö‹Önç-/ˆ[ÉU ˶‰3lhñSêÍ ýtM}â`~UÒ´l©¦}šŒ 4¼È Ñ ÒŠ}F¾8Y¿#«AÆÁƒ—šžÌ™¼¸¦ójSrìÇ\œœ“¬¦ÔO“¤K–Œ(Ì'eý¼RÙªSf5—z›ªàæLÍñ¢§jÆLK—)ÙzLcLn®ƒ“s¶gbt†Žl.Gic2xSð‡?„¸Û¬âamÂ4þr.~òÙó>+`<ÌÔôZ§’S£ø“’+=«qª<@~ÆX•r!Îf‰Y(hJ€À¹ •ÉËpÊp˜Óä’œC³ÂíôNý躃Òfö™8˜kkÒ§ÀeFÕS·• õ¶¯(ñïoè’bëö½YE+"ÏO1‹•Õ…"Æh%ج_3q<{²Ø2mºŸª½*|ãeOK@öæYv3À:Öš­·ˆ‰ŸEúíÿš3f…½4›ôÊã²Ò³½âå_ ;æ•<a3hb¬•qâÀÕׄ"ÔD1"ø'ªn$8èíù9ôÅÆxé–þwt]Ƴ¥Çã¨('¼`ÅCümïÿýl÷àíþÖ;%0 ºÉNàˆÐU®/éîYòiœæ”˜èMåç´Dþ r¼plØSDç“®¢Ómü‡êg¸Ðª(›$žÃ£.þÝyÂǃ®Î®{vftN[íѧ™–ï;$Û¤‹ˆqï®QŒ–›Mnø/¿0ë½È îȬߦÀä—ÎúÖ6«ñ'+X®¬¥@¤¯3}0~aüÙI Ô™…VÂa=î[ˆOWv+aFy”›  íýž–£åP5¤œe¸ŽÀ×IF”t˜ÅNú`mÄroî3>‹#œøôàtÚbù{3¼Ñ® s–ÅÀd“TºÖ ‘Ø‹v)¢PFÍŠ*%Ç ÜQX!ß éþ•U:D„T¶~žÕ¤g=ã¤Ö®UIVð7{Ô»L/.V4gô„¯©Ãgl}šç…†WÔ·:ê!‹âó|öß>›¼|§tÐý§E‚p¬õ<`2Â7)ôÚ³šâý½ãÝ“ãSC9·®JhïgøS&­ÈÒÝÍerÉ ^ƒÔß'§äY}; :pá‚ò¸ Þ»WŒÛ‰ãføWJäóéÙLáá9³Óº·Hß$¶:fìµÞ6µ¥703—9±U9ÖŽ0—»ŸðûR۸رûXùÿ`¨Æ¨í™ƒXÌA,çÀ¼3’ÅáIØ N‚I•ÇOC†ˆ†%Æ!Ìø…}à¡=ï9Ió‚í‚x1bàe!óˆÜ0ÒûNâ À>ìq·ŒPŠB›ÌäU›ÝB×ãé6F}Ê#rwÏ3Ð6:bìˆIhçÅe“®äd#kÕdï}¸íóžþ`žÛq=MõO;ñÊöüÉj­sÁŒß³²u ¡@‚p`ÖpÙš!õ²H«jÙ§¼ “Õ‹œõÕÈÔ+¯­Ì?Ňî·ÖàH³ëHøÍ ,f”O‚×^›„%Eùô) òû“Í@Ga®os§ÇV æÒÂÁ*½¸V0îš<·Iæ(2›rkâ LåšVOÄ»i-Ä•dvÐVaßû lÚTTâºÅk'd 5S5£YÈT<5´/ "K¬+sl¾Øhq\B¢ñÔ•»~ Ïž5`œp“’Þ°o,kÜ2(z8i÷€)«­4ÒE2Ú @׻Ƴî<"ßÅó]O1Ûó4›Àh«±u·³|Ývy½˜«d©cøãÒ··ª¶±»X¡`(ÞœÓÇ™Û íVÃ=šƒ®Æh d‰@x6JZño7N|MýãæØ÷ظ‡C/uè4´G¢àiø“lZ®À´²jCÏJólú-=ûze{çíÞþ?ŽÿóýR”Ê< djʇ€¼‘ª˜×úF*ðö›{‡?§3qUâ¨ËÒ¤»Z±.úh´‹§Q•UõtÄVFìÙˆ}=bÛ#Æë$2™Ú ±¦¶¾=+…­q§š™ï5líÊús¤V-v9QmjIÌ–¢¥ºÞt¨¨ä¤q°ƒ3˜ºë{c0b†’OþJ3 Ú…¤ ±£n6õ6w?ÙBÅ (®UïÇæšTòpk#qãõíE¯E"nÓ·‹SÐd’žÓZAof:¥v›Õ­:LLÞº¼(Ïd]õ 2{OÖøê˜] >Sg¿5¾Jg8ß ómÐ ôÔæYZ‰j3ð$Ë›Û72¨)ùÊÙŒ3÷3飛o2¨ ;k\ížàöþÙÖÁNLTùjÞMú4¶Ó@|^pŒ¦xDŒ[pùRge'OD»´:àÀê“жƒø$_ ù‘m)·p[]\ýŒ-­¢Ò£Þyvlä¯~=|õ×Ò”[AtýiÀ ÃiP¤ó.ÿЬOŒ„2šûÕ±·Ú9Š4dù]wËÈÏÜí³ )ýc_‘yÀÔðáãö»ýÿyb|Úi¶sx°s´{²lh|^ºµ$ÕGß=T[œ9Ô‹vfº’¹’ ÂZFÉ;—nK>àC|¬ÔëýWfzRO^Õ-Qï²Hå.¢ž—yesÿǺ-Pt.ûž€\¦Ø>>9ÚÚ9ñƒèb':‡G~‰#g ¬P˜"i‹ö%Ó™¶ˆ#´ˆÁî~D‘rëF9,q!ÏhH}XÁi&…Ù"Ñp(\ô*CØ«K®3!›Ý­G˱]/µ¼Ðì¦æî6ŵê±Âù½x²—]kžj™Œ›ômÍôy1ªÆ%]þjyèñŠ•‡ !}Õ†¤*uyG¢ø£iE©ÚïcͪÀòßÈå!Þ¶«Õ PÝÄ-Òsá)1/6“YNÁ3¢–gKV(žÐK·˜þ¢˜cðmåqvóÆÆå‘ÉÆMÒUør?Áz-»¢µÜ-Á@ÕÅ•îVëŽO§‰[Àð‡^CžŽDj«EŠ÷ˆúÀ|¸¨v4†Øc¿OE¦ÂKÎGøý¦9]q­7)…Pãþ2_UÆêЇvpøÍ,í%R<_’jÂf]*2GˆgGÕ·QÃã`»¾à§j=$‘i¶¢Uà‡ m|¬¸J¥AC?(Ï©ͪ”`DmäàB¡ÁÀ:0yßàro°+xر.Åc’Xp~÷G{ò²Ê›Û9å$š7»þûPKxÃhHJ¡‹PKë–~;*OSGI-OPT/src/aQute/lib/osgi/Constants.java­›ÿr›HÇÿÏSPþg“ÔÈ®ýw³Þ ‚‘Ì H‰÷êJ…ÐHfƒ@ȱsÎսƽÞ=ÉõðK‰™ÎVT•رðGMOwÏ·›É>?[¦¿ vG«ë4ßFï^½Švû4+”?ƒÇàúPDñuƶìéú-¼µ?¬â(T¢¤`Ù&™¢¥I^I‘+ÿz¥ÀëæmùEy«èl%l ×*¶7êßÔWµ—½ÏŸ“"xRƇd³‘ÑcPDiâ¤ðIÏÊ/¿Ü*ûêÛ×ÊÿþóßwðGYGã2åÍÛæ]¸°a6/¸4¾>×Χ{E%[¥ûÏ-ݤKUó…ê¶åئ¡Ý+ç¯[åjÀØ«wX¾í^ñÓ ›s긆åcÀZº΢íCkªO§¶{ÉÀAÁ¶i†ñ„fªžç¨þŠyîÅl[>¸YÕu—zžÔ}a¡®×ËsݹwéÝ÷³N=Í5zr°Îò0‹ö<ô0h[›»æ°Á]tÂŪ¡ [zF5B”¥rÔò(ŽiF!Kr†ÁÚšj¨çž`Ó0ˆ£¯Ò¹3Õ2&ÔóÔõðGö,H¢ Ë‹ËrÞRgBwtðV°Ã¸ÃG,¨fëÃäS&/´ZºÆ]úûÜp©N?QmνM­…áÚÖŒ¶…éHvÙ?PÈ×ô‰…îmš¨ÓËŽ¬þœ»(4Jé0r*i!¢ÓORì‘NŸ¾ëQw¥‡õXö¥D„¸ê”ÇðòÎö•¿ÂN²`Ëcxt—æÂ@F¸öHÅ»¶Æâ|Pc>¨s{Y…›[çö¨ 7¶66V0Û¢ØÚLØXÁ줪ÃhÐC µ(ÂÁ€v2®µÊÁSËv1ØÒÁÛ$ÍpXK3ç:/¢ž=wE+DZIÖ¼ˆæé!¯lÔºÁ ™jJŒ0(¢uÄ YcŒ[ú”œ?³ucbP]hô8YÌ /fé:ÚDl-4Ú¥°vúr,Rž­Ñƒµ[ÆBåéÛ¶X"ý4…0Øó5Õ£—f{>ˆãœ %¦¥ús-— Gy´M‚ⱂåâ5äŸ!Ƈm$,ÆŽ=ÃÀ^ºwy&…­QÚ9,c1U++í.Ù Šˆ÷ºK"Þ›zd[¦dÓ¨°U=J“X¸iTLLÈ—9_2Ų¾b„Ç(Þ|Œ0°eVB?Î-Ç…ƒ<ÌŠH|߀õî=ŸÎj)7Œ®±ùs^°Ý¾j:ehd¢×hD¢s/`ÄáÑ ’5à—™5ðq'lãxNº¾E?Rñì° w.?ö… ‡‡\@£ll{NYS,]í–ÆWÌjsjuó9µºyB BÀƒ$Â($‘dÿ….ml‹Ÿˆœ Y¶JÅD궯êZ–Ð ŽDj ŸW]Ë(Úí…3‘.[$ÎÙÉp¤ÃÆ8âÈn²êæFÁHēɓO ù£Éº 3ÓòYÝ_ÁÔ]+9é6IÓ%åd„Ñ6zäØLuì^CšÖƒ4Ÿôµ>)5:iµu—×U²¤V‹¤Tu¤•N¤–<„KÒU]ÞéŽNš˜œì C?œ{ vƒ Ma'çén}ä´Ävymf“ÓÊA:œ*Ò$nß_­OzhrªºH§é Õ.Ò¥œ§éþŒ\ÊòoÇ,¨fÒJUÑ”|ÏÂh…ÍœðZñXÞ¼+ëT^[áÝW”~’n”œ?UŠT‰’–EÅIôb½K9T3&†¶Vƒ· ìZGH7ÎNÃ3ÊcfœÙSÅÎü¬?î»”TíÀê⃳þ˜­öÝ™ÙÙî,o#°ÁøÂO“›È‚ììM}53Õý ’·ÊOÿþIT= µYêpÇ|Í.ím¥ÖØÇQ1ªõÁ/ˆ^"à ·:Þ$ZöɬÚH²*zKÕ÷]c<÷·lFA¨Õ¡ß¾e«Tûræ,—ïI$Îå³ê\¸giö ¢IGø¸aºÛÉZh(¯T˜U*\iÜ6žï÷˜Eâ¶ñ“TÏâ@ª‹ êŽë1—,2MÊ“žÊÜÈ ®pÌÄn¤Ÿ¾ÃJö$·ÒbJ- A è'(ú¡˜èÖÔ¤¾maÖ&‡ßY‘&’»†ÒÇ÷4 ’=°1EäÂðŒ±5IB€|ŒòhAI‡P[å!ÓUí®üö2˜›æ¤$z>ðo%EijÍò‰Â`>ïˆËs5âŇ ”\çJþ“"'¡åÑWa«bÖ4,ŽáPœïãhX"9&tò$SÂØwXÏö°&3Íe&Ú^­¥Ä÷(?B„·g»â>KC–çâ“K¦jMç\ Hoš/pl’Óèh­\•‰aúT`)?óSÄi2ÚDq!“´Çk—UÐ0pBÕmAÝ„Îáäs¼ŠÐfFIqý% ³I³ú©ÔMÉÌìø9¾1£öܼƒÎçÑŽ¥Ù  U±CŸOldòr8x¹¥Õ©³¼>…7’o÷µÈæ#ühó0÷…þ?ÌnŽö V>à~fÏ9HñN×!;t4""$Åc-’íËGÛVeAÎó/i& ¼Ój"ñN±"áiáŸÝ$i„´öP¿tJÒ‘ ôä’Ž'gÝÂù¢¿Å’saHzb¶ßž].ˆ¼îï Šˆb£KXrr.êI·xÕÁüÅ×ÍâÛºý#PÂå žOBþú+¿ò·ß„g/æ®Ë›œ À÷²‘ei.P—ëk!-c–qa91ZÍ$öí«^/µªÆUo3OÄëÍaz÷FP¶5«™óþ3T6QÄŠê—e‰²PMC_Öã¸û¥ï -Âmó;?"š×5´°û(f¯¯^W¾z1SøKO«˜½Lâ4(^ hζ,{?ìE{² ,ø?Ó4fAòâ=€7ß\½ŬN'êÜô—üXSÛÓ ÜåÕõ*’l`S]ìÏ@¨qZËP°UÖ‹¬õUì“ nd]ñ_ÖäŠ(W¶75:ßÛŽu‰ÒD¨¡ó7=ßåÿ‹é~ygLï„ð[åçwŽiÏÔn•ÑÏÂÙJ]hä‡öy¡Á”,Ô!ç÷ûöD¯äœègÔÃÕò˜èç²~{õPKa£*4 U8PKE;1OSGI-OPT/src/aQute/lib/osgi/EmbeddedResource.javaUKoÛ0 >;@þÛ““n ;,˰W tÀZìqÚЃb3‰:[2$9i:ô¿’lWvÒmF`Ä"ùñãSË~±5ûRL ¾L¥^óÙx4ñ²’ÊÀ-Û²”Ët:ëÕ†é=¯œ`<ªêeÁ3È ¦5,Ê%æ9æ_QËZedX`‰ÂhèÎ~GÑro0Ê™a?o%*¤XCDæ³ÌùŠcnO¿ÅÅ:Â;£˜ó5Άnb .bMœËÈl¸N­Ìî¬; •I8äñú¾Umˆ²d…"øŽ'`6Jî4\𢆟µÈwV†KáY(4µ pï‰õ;¥Ø>İÌ&^·’ç°SÜ`|]›€Am:§—×W$L½ÍqPŸ_0Òÿ‰'=†§¯Ná™KTZ X› }ÑÙŠ6Ì´ —5/òøSÔ**é劋£•yŠû^…Ö·\PalÒú‚˜ —Õ_£ö€î=·éÍuÄ^o·¡Ò@ìµN².Š& >q’”ë\af¤5låQÐfä!“EA*ñmË!Š(ꔸu}éÁ, VbÀ=€ž¦i­6Õ²­d¿_ŸjNhžn|‡ÙtêQ¹+L‹ÉjOœØ)Ž›´ãkd‡ÒYºªA¸ÉsPÃyûßUÑ:¦²­x^°% Éœ¾Óî³GÜNJ ùzÏÏé™3Mý5“ ±=ŸUŠ2=ÞdòfHæqz•ä<±†½¤¶+í`O Vã_/ˆãûP×Ëäñ TÍŸ§÷_Ô¯%%¨µIn¿%¼/ëÇ–¾Óî‡Ñè[ýK6ÌÂÞ»ƒÈÛ»øÈí¤[‹Á©†W¯; @Žc¸œÛŠ4ƒAî ÆŒ~PKµ¸D~>ÁPKÀ†;-OSGI-OPT/src/aQute/lib/osgi/FileResource.java}UÉnÛ0=3@þÍ%r-°nuS H št99ÐÒÈfK“IÅq‹ü{‡‹hYBj’HÍ{³ðͨåÕo¾Ê¿w˜+¦íZ,OONOĶկÑ_ü‘3¡ÙëåñVç„dÖðľqçÀ¨€j»•­$·–^ ?ÀêÎT@,a ÊYš÷þžžoD¼ žütF¨5'g¸_ã?1¹ ¿ 3 Äm„e~M/hOõìÃéÑ7ªí’ßRÝ‚¬‹u£w1Ü[í®u§ê«§ Z'´Š ¸Î(ª`¬†ðÆÄ¡uÜáíQ‹š®:!ëâ 7X9SZ •Óf_ÒT>Zkt~©Û}Ÿ”á`,~AˆÇƧŒekpŸVVK<InË@ÿwV–lK¶“ôüà8«Õ·«o©dù ÛaÿT¨à•zÃç§'§'|WJeÈ7vËhe¸ ÓùˆPÁîë¥Ó“²ÊÏI.˜ÖdYh£ªÜpY§'ŸÌP)ÝïÜI¯âņÞmð+™”XA Ø0«žT–V• /voïB`<ñøü¬œ6ÚÇl¹¦69q­Uô¨{ù` !Ûx6’3!pqDm0ˆÌ¾Anã@]C€iÊZÚ²b%µ \ñõ!5èVÞ~üQ2ÅvÞùNêHhþ¿ˆøÓ†™8ýB.=»0"¶—˜Mk&4ÉÆ×$q)QFáf›LžLÒÈ>:bØÇ‡âœ4`Uæ¾’Wi úÐ}:¯ÿª,[Dgu¦ßEÒ$ܹ–Š$Ü²Šš/çøsÖØPlÐé…ÏŸÜÖw¼=e¾eêO“äÃóÙp‘gôÙëX\cd”•%«dòõ+¤ó¡J¦€ÝÌǧGéô¾9øæÑ€+X³J˜ƒxâ‰ý0ö.Q2j¤ wè #ѺÏGdÝÒ4 nwꟃCŽÐ%åËY?yÈoä÷tOª¶=î.šÑ fmÓ?Ü»ãݹm{`|÷ùÞžo©lÚâ9ÖW%Ä€Áv½£4—»’ H‚>x˜—¦§î¢Á²Ç[Â[¦·—rǦí 'ø¯ÂÆ–¼wZb?VcØõy⨠OŸ’ÄI¬MVä ×a€Óažã–Ð?o6IÂ]Þ<á¯ïþ­ä+¢Á¼÷wŽ˜æ&w܇‘{I7£Ç‘šãÇW›¾7~ʼcåÙ2œVàrlæ³øâ!KÁr°åÖDLY¸se lÕ ÕãÌïXiSVÉÇ»Tx_ºC½áÄXbf2#Õ®ÒEaÔ÷ƒ]@XçÕ0úØàL‚ÑõÀvì€MÔ+¸Gù|P`3Ljh´ x”(Fñ5ÞUk­O± ¼…ïíð¢P§!nz‹GÙgoL€ÅùlKOŸ Þ¿lµM?|\\/®.ÿþ½ü¸¸ü´ü¼èCÚ4iÒnÒÔKc!©°Ú]ÕDCOËʸþ4øx¸Wáæ0ûñõ PK1xbÉ« PK(E;2OSGI-OPT/src/aQute/lib/osgi/InstructionFilter.java…QÍjÃ0 >'Oá]J Ã/Pzƒ]Û¨®šjslc+…nôݧ4¿][v06Ò÷'9€ù‚ ¼7ŒÚÒFûTÑ*Ï©>²ú„hòú•,®nå0F!„fcÉ(c!%õæÇÆ0y×”P-Öè8©‰¦~ò< ‘À8ç(šÞ« ±ñÞ"8Ñ41ÑAeÒ팯-‹;Š×BKI’e¼§¤g@µþ¤CŒ,éÏ£œÆ,ƒ>¥¡_t¹‰îƒ‹vO*ïÔ}BÚ©âÉ=~cÔ[_z~öá¨k`³ÇX `]!—rËeßKò<+ v`Së.ö½îH¦ôB}ù-o⺤÷ñOl#>˜O†¡% á mÀ¦›•lNæeÎ9ù%o`”tM«–“eÍi>+)ùïóg†æmÞ Vå%ù2ûFçíï9Nο^ÿúïéååôWòŽTô‰þþúÏcIá<ß¼½jV-SrIyÝ5súž8£QÓ~K × ¥QÄd!…|O ÖŸuÀpœlÑZ£b Ê[2<Ö DaÌ꺤y5‚`0NYcÐ$cX¤Ê×TAŸ2°Ïø¢(øßØfʃQe½ƒÉy{^lÁh±¿6Ö%Íy])ÜKå¢#¸Ú‹÷×tQ_ÔíuÝÍWçO¶RU[–uBœ;Q¢¢M&:Rp´+Æ3œEë ö8N"•wýÒ௠Ðiê;ކ;¹ŸÓMËê*%g_Ìþš‰à丟”ö. Që#[ÄÌgŒRq²M&“ è¸Èf+‹—K{²)™BJØ>@vêþXo¶6#´äÔæ‡r6à'o“zÜS™gÕ¦ka†ækÂ@o›mÏó„TÊ~ŠzOÖ3ZèÃæÅšörûzúc“·«ÉÿÕPêB¥:ü#¤,W5¤õ!YzõJἂü}C’_¦—P»`›8³ij,br⎠Mr›9©2õèú±Í Eó㯛¼%.ú‰†¶]Sé¿”œ »Í[ªë§²°–BÌÉ h¾EÓ¯K(áÂŽ¶R-—Ѱ‚ØÄ‹pÈ躼äɈs0!ß¿gd=ðC^Š!é~Íè $ÑubÑݯ]ü_¬]%ØÑ á°ReÆ»¢%¯S9SÒj èòù‹½ªÅ¦•d• ¹™RWÕÞŽÝ~L¹œØË5!9%¯‡¼ý¶fáJ?XBz[ˉCC)çä~s@ÇèèRÚÐ!žXy¨o‹Œ ±•ll‰¦¡SÒ6ÒÈÓWO N}K›»†µ.Cݦ€x3éH£yI*%:3º1ƒ³&:ÎO®§?]œO/ÎNO®®³óSðbßßuŸ€öêÊò8ŒÓÞB­=YoÚ°ÎÚtD_ÄPo¡kãP‚ô`–}ýöó}¼÷æ²/н1F6ö~0)R òP;vézØË±q¹”pŠU%sÂ`gUAï¿,’—G/}лæÎ¤"ï!Þ|þl%Šž›^|rZf›Ïy]µ9«øßé6)Š˜ÉpÌ èo"Ô‰‹T*3+d.v‰üuE·ˆÂZ󎸼ûNr¾èÁ¡(ÄC Gïº(ƒÚ>»`ƒ´a˜H&úÁCcù!–ŠzŽÑ­mÙ{êª(÷Õ¸ !êÚ5E†1”¨~ä-8e´^89G§O$wP_%{l{-yÀù¢•ÁrÎ=Öé3‡e‡8a£ý ?/Š^çñµL÷•ºšÏÿA8`®Z@>l€$y“åâ}Bµ:4è‘åì¤j›m„qŠóäÕ>Š™+pǰz(»¡À‡ÄD¿Å° ’#†-À¹}Õm)I8,|çX ‘’äÒ”s³ê?ó²ƒþ. ‰éÑë|¯Üä‡ù°³© LèßÉ®. õÑ×ÞJe2ˆ†42Pì#&½XG°ßò±³zC+{ó+v‡U×hˆÅ˘¿éÚËFÞ9ÖPÜÒ{Æ[¾ªCC­±‘͸„fÌYgG¯$zhKk;„‹ ·V;2û &¾€÷Ìý¥k{[×]km®íOÉÂ;ÕÀ!×$ÿL SjÚILbl¾"IÏrx%.Ÿ´¤mHSHLÚãÀOF¦äluz|²÷ß´UIjT]Qeè¿å|e}JÜÍ…ƒKÇp5¦¨UÁAf`W¡-“ÎPêÔ^(%ñ 7ë÷HA‡ªÈ ¬ï‘Jå¹(h½a&>=“ t*,é*uïJì¶-cåøèˆ\ݰ YSL[ ‚ù /F"¥X¬ó[â–îØfa§…T,M¼6`¤ñƗͬb|9”S}±?Kÿ¾Ç§Ñ({Ò©*jÐÊhóe‰Ðÿ‚èæ&:òôÌž'Ķ/è}+qœd,ldäþæEþ7“Ž%®ý͸ÿíOÊF'?bAí6â4Òè]™]g³+@£q,½¤^`óŒ³9á›|N Á|(yµ%@æ¯ÁœôÜÂ]æ9¥¢B¢òJ ,ç@ j[3¼%4ÍuØ â›)kHOèCËëoGƒyÞèü©ùÞÅvúÇ”XöóKŒ:ptiPÛŸäêa×~;GÓš^Òv$=—MA§Jð$jþ¬›¥Èoöqú ZWý¤Í†—[?¤äCŸOr&Tͪi ‰aÖµ»«>îd¢õ–œ† /’¼pHv£K⑃—/Å"ùOˆeŸ aPN±]Î`—¡_˜äð«wϙŕ/ƒžBÙ/h²h[ÌH›ß¯ÜsŽÊWI‚Pdà5ƒ{Ù—kÌÈ?lh£!JÒ¯]ˆsò]–ö¬ns¤Öv”Aò®ï &~ùâÓG@T/'Ãg>Üí½Ÿ»Å’5Ÿ)cÛ³ OŸ€¾>†ÿÞš¹‰ÃÃÀ‚¿Y6_åÍö‰t:Áe¨nƒþ…6mrxÈRò’¼-Í,ë/F;·á‰µ éP_œF“Çà…Äî^£1Ûþ‘ÃÇNsಥöAšÓ¬Iöý£U¼°w›=œÂBŸ€û]Ú®ê"ÑPÙ§“ÓÏÓë“O6dp-óNì^ÃÛ7¸Hà>ŸOñè^myK×Ù¼kðæïš­é9+K榠G_ „KbWÞ¾úEººo›<™˜s—IPÂD°ðçÏ[‘ŸÒ×Eö놸¬³~¯ÙL‡§ãrÃŒf>+KºÌËi³ìð!•AJ>æUU·2Ì¢o^Ë¡KÄ›ûCøŽÆmq‚j¢{¨Ä u©&HEp†î=ŠA³ÿÀ6ñø”w™;‚3æM}í»ã,]ÂÆ.y¬¤½B˜±2»ã‘áIÁNÇŽÜ€ RŽéŒ¹öÁ—}#®­Aö%8lq‹â³6pÊã=VˆôÅ.–í=δ(H^–b Ò?òc•˜X2Øžàø+Çvã­ÿ°`åènŒÛ  éCKj1„Mß*É_Õ]YXÜH¾%Û°&î f÷`´°ö5–Þ¬;ŽiY&øÂðRòU-#Y¼µˆÜWDºV ˜yǃ}+:}|o¬ïºEäF¼ÃU{¢IJ9tEÅ{De2¡;ècd¿(ÿâÑ;o!¯w=!XO>IË}L`¹®å’HrìXQ§ú ‚~“¯J‘úC! ·ëb§Â°ˆà8:"g˪n¨GÁ–NGOðÌÀ;Ot?¿N0÷ Ö¼¯± õˆfÈ[Ш꽷‚xˬ—oxØa 8 ÆŽ>Qއ!äÛSÑGYP-•ÝOèwª‰y°ªŸ¥†xô±Œóvuève•óÝ7ÑánÓ­Ýw`ÏŒ÷5^¼ï×½«\ z?}N0mš|kt*)gjCçå­3; C’yÏOtÞʘ‚»š ”5þØQúYVI¸ ù¾·3”9$¨²°ÓÉ‚R‹Âª 9¿O3: e‘G@»W2sÅŒç<Ϲ#7õ£™ÇÈ(øê¾-¢=½õô¬.‹¯bG¥+ ½ûê;[°Ùμ®oi¢Ð‡Zý§^«G^’)†Â×$ƒïDkC¡—FßU*d¿;úÑ×Vk‰¹ãÁT€u¡63%ÈÊáø~i€;ïÆu¬¯a9´2¤ªgu±…N¦ÃÊì¿ g 11ëªü˜qÂÙ²¢EŠOd‹pû£Þ»ºù¼Ú*j’ {Þ,¥qª`iZIî¨SjN…¡L–ó®„ÒP˜nÏí¨töý܃¹ÑÞ“¹wÃ2û»*3‡°uSñŽÌzjðïPKN½€Ï[ 4PKæ†;,OSGI-OPT/src/aQute/lib/osgi/JarResource.javauRËNÃ0<Û_±ê))@ŤŠðnº¤.‰Ùë>„úï¬ã’:UñÅ^ïÎìxǪ¾U ÞaÙèUi}­gRê¶³Ž`«vªÔ¶¼ã«.¬]AÕ(ïáE¹ô6¸ klчáîG .b«ÜLŠOrÚÔ€rŠC)Î\KÁgnç`±‚6Ú—1|„DqÊ`gºi‹qHÁ™¡ÉIõåj–M¯v­¿4®ÇnP޳ >àwV¯aï4a± Ôb¨Z°¦@g÷Ëù¡ÂŽ´5=w$MXuõ€…ÉH:4Y\üËø|$|rN¯5ðŒ îáf¾‹ ¼—Uc=¦ä€ËUisÍškŒ d‡T1í‰ÎãÔf<ý~zþÏ«ü+dV÷1·¼¸7ú%ÑkÞ¢o ðºxwûsM‡du†˜Ïø¬î|Ìy÷]Í?u_®ë4s¿,ùÿDŸôGäYTñĬf|¹àe•¹¬ùèáï¿bÙOeq‘&ÐO¶ŒgeÁVe1ãUU”{¿H«æ™Í✕|•Å3Î.â2O3^±4gU]¦ùYEàNc@€9Àƒš+^Ö)Šó^$Å2Ns„Ëå=ÁL3¾äyÍæë|VŠ«qMðª:†^\¦õUÇç€pyVLGP”³<^B+Å*nÀ‰K(x§"KãÊø `u«ç,ÄöŠuM?#vŒ*Â6ç¼/+‚—ðàv …—ñË‹šÍŠ¼Æ¾eE±ª"*„ÿ<úú«Õú4Kgl–ÅU%`6¯Ø[AÛ’]Cq¸~jè×r¬¿I\%%åû×§¿×á©<ã5H~:-ŠŒCàšgq]óX_IÔ©ÐÙòÈhT´9’ÍEQ¤Z*ä àŸÈà‚I·º˜ä‡I»;ú³ßåQ ³P}¿7aù:ËZhPqT%q vàDW]08€#“ÀÆí"7Í£¼½ñQRK3V‡:aÎ/q‡#£ðØ ýÍ6U.”Yšóø’×ë2×ÅðûHÐÆ†ë8b/ÓüoÏ[°E‘Öó9pku £‚ý0߆CƒjmöFlða½×À¼«NG¢¡q§ÕiTzØÁ>¹¡øq—ïøokžƒˆ*ʳ}Mó„±|d§ü ù–îyžŒÚCÛêWÉ«uVo"Aš%P{fQ>„€„Ù!DxÂëÙ×i\É×M¤!ÅËv¹H¡lH=e‡„N”ñü¬^„ÃSçg4•ÃÇ'µ¨»³3´¸'– ¹œÓKìîê^MØž³˜O$i¯V,”º$T}5Y²‚ŒÅ„²£È5aÏ@)4=!&vëÉ>ììX0­êƒìÁæ¤6ÛeÝHC½‡ïþÀI±G £Ëâ‚“âÕ,^qЯ³ó ôÇ‚!ð/W@*’YC .vBËR(gŽ!cï ¥9fˆ«£ª¼4_sÁ¶Àìð~/ýöÔ\»ïâZ'FXpY¦y\ƒ ž0÷ïõs8ÛwÕ"UÒTº×ÇÌý‰%ÝÄÛö„ÌþÈÀ`¤i9rÃS—-·¦3ÑÚ««ð²GsöØlÈ(Üž¨ªšC4›SÐVT`ºÕhíàHXħ±lQ¶“k¶i½5Éáà ÝÙø`8ÛeO|e§Ý²×¾²7ݲ‡¾²Gݲ¨ÓâÓÁι¿"@¯†Ù¹F~xÈŽŽÜ °Þé© ÞþÞ·ÿmë@T‘Më„5âop©Ð^gØÊ¢ûÌwi(-Ïù•Oâ¼Á—Êd’Âî<’¶pBåáЉlpÿ:ÍçiÂé €™CõUo‚› ¥)±5€ç5öðÛÿÆ2t©4ü¨EΑg–Ë~_ÄÙ±¤Ãаb#àki¾]Q=2E€Pøö*5%N¨Êˆ´?ÒœÈ;bDÆ1Ô¥°LŠ‹å”Cõ'#d²D3$›‰oöéÝUUóå6ľMÿŒ>RñÍâTA¿×8PØÒÕ½ŒK,¯ V—qšOpGÖ ½Ñ)!×ó€!ã;º$U§ƒÕ1p¡´9Q7^W¤¹#ƒidVW¥Jé…˜4Ÿeë„oäQ=‚Ñ]Æuhà¡5èPqÖ·ð_Û˜ú±Èp¤„f)šj‚§ž”e|õž5?éAíJ“AO[ÒNÌ+ù·k/S­ýi9bØ”¬‹Rã—RŒ¯ª£T~&gi´ˆ«WüZOFÍ.›Ž–(Lèi”Sé¡|ÚÕ¾"ºÃ±‹„”±Í³~®GD;|iq®¾Á'É9½’ËÝVÒ¨–?ì{$MÆüÆZtóÆ¿NÖˆ†=„oXÜ"$J·´{lÚå|£ƒE›ÑÁ§mF‡èŽÎ†ñQmmÒÿ§Æç.ÄOç éÓùø\ý$Å¡©šÎQ0±¼%p4eþIç·-¢qCvþ¥¥…¥u®0Rnìãi7¬Hkª`ÛºçõÇ¥8tøöÊ—?Iî¯ú­Y} gÑ |±h–—›u%2Û_Á÷Á¿ ÛŽùk¹,’tž‚Ù¢GY¿³ ƒ: Ñ8epД©v34ÿj&Ê ë%ðÎ˴ݧzQ—k æMœÑÂ{{ašÐh’7·7vI0=•EÆÊ—ŸÉÔ®g"SK’tä“Èâ6ôg}™Kìñ!Är®øÁ<⟠c¨|<`ó¼ÇúX‘Ze,‰hWè<¢ëƒ70=ŽÒ>2Rë;|k{6¼0Ñ ˜xטEÝIBÈlãåõû\ŽcºQŒÑë4!æÛ4ßå pOÇm1"lßšMD‡·ëé­»º]Íàç‰À<=ä2tñî_KlƇôáèF„˜‡b—1eIcw\ÙêjÂûôÁ—ì&`âêbGÓ¨ÕÏò’b0KgÈZ΀–­ˆÇ|ÊÂ\qºìúF%Ž™ô˜ÇŒ< úKŸîâ§[ãh-Bn7–éL-;xò"³&/QAõµH« Ý=OàdGÈë*Š+”ÙÔt'ôÓ‚´ÈjŒ:RðdjB`>TGøOÐ5J¶Î¼R±Sž¡ò |ZEÆÿÉéÚ"¨Ìeº¦pÓ0®ï]g½'ËFü·5Xpató‘ðªNU²àê G5D#B*­©‘²œ‘8I\ph¼ñ Ð6Ùg³*öò3ëgis‹yÕŠ¬TêÃMjqÒ¼,‹¾xÌ]P°ïа)…ê‚BÐdŸ€·q$£Ò!µ_ ™Cz}vÄÐh¹1gõ«Æœm ƒ¬Yð .0ŸT¼FôHÊ<{óÊ,ɼV­Ñìm cÃme?9ÌSæÄmG>žöø¨ý†-ÁªôV¸Ü4=± ˜žTÔêYD ª¿§àfb°=‚Å4g'3ªÖ§"c=܉7FòÙ•` =ë#ƒÈ™ GÝâ$qšÄF*œÝ Ìïÿƒúð_¢Þ söżû†7G>Uk^ÚúÛ¦hÀÒŠ 㸙vì”Ïp¡†¥˜ŒÅENY”LñÐm–8¬€QÍÿäWŸÃ& f¼”¯“± QO ñ3‡|CAFót“ôÂBŸ)½¶†ôúÖ'NŸ¡zLjQoPŶò©ʪw ºÇï‘=µ•|uKI1û¥d¯ƒnJÒ •i$B„i÷˜XBï¿cJ€´ 3„ÀFY€w·ŠRÕ­–„’´Ïþ°ñБ!ÜÉ·"W¬f0¤È´9§ “ R¼²´S„wKÓ½oßa_7_·6ÖõßÖÖ«’QÆ:‘ON«"[ל>øríXNXµôWoºÞF#¾]¨Û‚éO1í]ðQ¶¼Mq)¯ǫǨ—¥ûY÷·m0Åþ5üªþ¦Õןƴ¯þ ™3­k¾8kŠfïΘzaœàuµ9^¯ œ`L:­œÅ܃)+‚šÅÞ’¥µ¬àvûg¨HjõV÷ï6ªˆ’Ô¿¦%XiEyµõÈbå» l úrÕ3²*“„’?P¬\Áu|œ$ÏŸ/—fS´ö”—Mºül]¢ |Ÿ.ùqšõ¶Ú®qüصoV´+ÍZGˆÏ¶¯]Ã$ðr­˜ìO}’Ý^ õ p›¯ß7âÊêR,ž(}°ÉÕÔÑ]-ñ]9¦žGãömðÆ£g‚”U¢ØÕþ b»6À&s•þ£—Ÿ€¤Ã^Góïi–Ìâ’6Þ+Î{ïÑ‘›ÙÕVõyLL. m½§¤;‘7“h€ñîä[ ÏÒ ž7p»^êýë¬*LJPâHz•¡ü;|xC_cßW‡Ë¯ëŒaüLæÎçG¾Å®j‹,³¬²’ÀZôì@Œoѳ¦ÂþUR“VrÜ$rÁ7 ø6û5ËU/ÀÛ<‹³'’ý7.[ÉŸJ.N±åY+†E|ÁMÂ]z†µEÒXù¶<î.[݃b s•„íÍa\wÌ5Ú::$[ßB*”®ô¤Nh óKv ‰_aëw¿¥ø¾h'VE*—Üba{ xáqB+rMÏéN¹D¸hÁž¢€iévGrU¯† JÆ#¨ªsa€¦ÍâÆC/‰Pê «®x¸*ù‘~Ú1›æ³’Rô×]ãkÂí¯ã+ºu³¨õ=¨ñ`—± ­ÐÌîb4™H,& ÜüŠGA,ÓÿhÌà(É‘‚Å0YSÞJ»ÝöŸ‰ÿ+Zlgòn]I´ÉƒßÖE=>¹-_Œ'“ñýëïonFÆ«ñj( 7ä}Ô¢ï67Ÿ»ÐÎ>JdhJv1hPãûÒb¹ù+Š­k‡.;8˜°vlþÿ†M§ÓÏ‚yLà;ö;ìâ¿Ço>ÐéŸi2P®¿µcY‘N>“ʧ3¦ôóµ\F£Ûxtö8ŸìîLþ9½Þ}{s7ßÃû—ꀻ¢_ž¾}÷âõ+vã[ú“¨ÜvÙÏ|ÿ¶µéå…œhJü"e’9‚ò­+ö BÜâD§Nä[œçÔŸ\å1Ödz"«—éÝæš8…”UgÜØºëµ·×¡‘(!­`ï©M)¦ ú+¾º aÞ(áâ §é xW<v"ÿâ lÍ™ß<ûí9p@Æ©ßËR°"wööFl²³·9¹;в_Ï¡?^>à †éS»›]š«Ë}Ny‰3[vìóbÌË}Ö’ºNKŸ{¾ ໽Àwwï|Ò¼¯ºÇòÑ#¥’çµ}á<¸És䆵ýN«9rÆF®š6½Æ[o¡i9 ƒ«9ãé'> ¶9CúE碮—vó–ºW¼[€`µßIïªS6+.;ÕÓ³…¥¾íkÔ‹;îÁèR·ÎdÜ%D%pgP~„Y*\SªjÑ0p*:¼ì4½ÝGÚñ–EÒ|µ6Ä®?\àŠ†«ÊÝ @­ÜSiï«Ãw ‚LBGé$oiu“ÏB‰²·§2@ˆímêÂE”|3Kb€Õ_¯k( Tà1ásY¦5µ øU .lðóûg»ÿøR<ýÐfYQñЩå+qz›œAˆ¹ÁlÑWÆh¥ ¢Õ¿4Ù÷Tõ2NëgEÙÙæÕ”už×Ê{ Úšöæ«{LR›Ç`f%ât[o¶¹n°?ù¦j'a{“}ó‹[d0ï ÒøÑÖV~¼LË"Ç£ÈÔq½³m¿=¶þ6ÍiOˆ¬#~¬÷Ò¼G™BÇdÖŽ¸œ'¿ESúþMv EhÙˆÂèùû¬áZ® û^J¼¯µÌ3ä¦ÛW;;~»@¶/€C’Ñ-Ù©¦OA“Oç.“Üzµ$}‘ýf}¼3&Æ\d©2ɱ¬9IçžµæF´OV1ŒNk×Çö ß\F†P-ž#W~~û’­K•IO.Úx‰5£Ì %¤u6@ ,'ÅqœáZ!O†i–óõ†£S¾áµj ,6L)çNÐóv÷71¸ƒà·öÓð™K;苦®[lÁ‹Û§š«Kb1îÙ`׆€"—â×9t¯‚¹noG 55$)í[¬S·Ä_ŸDÃ`H'±Ñ¡¦£;gç`ˆ¯âœb‰`DéÀЕ ñ[nÞ–£:™àÐɹÝé]~‘kó äxó«–Å,E-¾J•UÕ‘Q£3´òGDIòo:íébúà\Ÿ[*QÐ[.Ôé¾=íÓ©{¸Úê8 /©¨d~`LÓ‹MÇRêM†>ÐV€iN¼¡Ë²‡Æ¹Äžé{‹¼éöä=qÎ]hÊšŽ™>írL/K=²wÒeä9Q×—ÍìŸÔS_¶hO^s‹ì¦Söž~êTÎ-ëeÔ‰ºtdÜ’g50˜ØÊ^ɰGÜi€øÛ1•˜©¼v@Ä(°HÇwbÛ HJúqzà߀ÃÃêø<Æà¤LìþÍw"÷N "6QÈíFJ—©\§ò^XûGCDøñ§óD¶b¸›øWr²Q=9UÇü“—(¯c)#|â ÅË¢;…Ð{©Æ¦íÊG½àž5°ƒ™Ã`±ƒEÏ­`L‰Êd[%eKÊzŒáÿ¾|3H‘””ʲÓ>tW•(~Á`0Œ ö(ý‚¶8Aÿwhñ»‚lÞUÍ–|˜Íö‡MAÒ$-PÓ$ÿÜÿµÊp“|½ÉI‰Š¤iQKŸ6»ªnß”Õþ ý÷—äòùòòýéýûäþ«$Ý¡r‹?%{\çUýÐÌÞXÿh«²š±ÿU´í¯*½Ý£´*›ösy( ² öÇdhv”8ÄãÖ8Ç5.SœTe[%í³.Ó/Þþ‰èÿa!{_êÞß.’¢BYÃ; eÛeàLÛ 6c]J¨•†º†t9Hñ´Ö@YËÑR]i å0 åH •ºÖ@«a@«‘@k t£ÖÀÖ#®$Эºt5¨°µîÎhÝÿ¨ÉÃ:(ªrÛźä*޲!¬/iÊl^ZL‘Åj¦vQX3; ¢­K&¼ÅõLóî% ±Xsþ¿¥"¤‹o(£¿4d[âL¡&¼‹ä·ß’Ûä?gªÏ寃DŸ¥oEʰ2ÃÏŽLº RøÈ¡²MþC¼•×Õƒûh_UErñ{[“r;gTÏùóœ*Q›Tµ´áíË’Ÿ1²??)ºWn!Î.¹ú!²'c›µü™ÅŒÍn1ã0"4ÑbFêÊÅÉc¢{Òˆ®ëCÚÒáDÍÌæBŽ( ý×0–Fëï/¬¢‹1f`SÔ7ˆ‚wÍ·ÑÍ»Í7o0„wÂ,‘býÊ«ÀÜVyô·¶K3/ù{D5AŒÁ¶_âõ:ˆê3$ˆ¹ E•R  ¤î…Ï!üM˜i>WÖ©d€Ûqe™J‚Ü9T›?pÚR'Ë'~IVÄ ãñ.U½:Áü NÓòR/bPk˜4úlx|Â`NHq¥§D\…­ÓqéAdÖCêX¦ƒxA\(ÄÕ)D=ŽëS"úÇ1·ÇñꔈþqÌìq¼ö#†æ®™ƒ†0³‡ðæD`þÑËìÑ»=˜à2{àîN˜{Ðä­”yAu^¨!›+ãrÆå*ÈšpXÄÄ/E~þ,ÈÅHÀrY˜Ëã1]Gݘ{`öb”l,JVS¸ç› êý7u™05 ßLº"a2R‹Œõ2Òª0ÞXˆWÇ Ïõ&ñ‚`¤i«+0Û—ý}LxŸÛëGØxZ¨-Ä›0â÷”ã7 þ6 ïóY;îçz´ûf‘p7’„Žw bTh­ì™31ï…âú4ÿÊ e h½8!`À=€2 ´^ž0°B@FY¯|€á=;•†¹gö(®O ðÏìq¼:)dÀA³Gòú¤ÍË›Ár¡%*&6ÌE³‡ñöThÍÁ»S¡¦!‚Öî*à8yb$’Ä0“5aÖ.¶~æ6"ð›ðHDíöó…&îªY˜¿i(&tŸ·fÁœ¤a°r1»r>Óýœ4‹€€{4”oÇOë¬qq?Í¢$à6 ¥„»jý  z=A¹…·Æƒh{svåZ¤Œ4)ªÅ¡@®­ö@˜UÙ•¦@j w¥ŒÑWþîr.úX|ó9 Š}@q“ö©ï4†%é`W%Ï©´ò„´*>©§Škú'ÞÁÈĵd²Wcÿiイ¨•FRa\öê0 g´u9’œ¨*ñVÑãnÇ$*mZ<Å?Ú Kw»¥ÆÔíK`4zëHЭ»¥êíÖœ ûGôíz*ÃúVQ¯©ß©)}3ÖzS¿#y›8{ƒq”ÙØö‰4à°é…œÖ‚º¼ª¿}Õ–äЫª~# ºl]ª€YG™ÅtUK[3—σ¶#jŸCœ€ÎÇZ‹üœ‡†<žzì#!eª ­\€¹8qg©o]h™ '£)µE˜ŽS0¤ÇÔFf¡ð=ïÙOβÐc:ÔxÐÞqÍVõR…ML1`MÈ2×8C­I'lZÈ2Ó@CMK(bgŠ%ÑHnH¦I«‰ŒW­;œ»‹³ÈæÎ ö„‘^ïøl4ä=b|Dâ—GgNݹ±Ý#p؆Ÿz²!‡uÙh07®{ï4Š÷°W@c·12«çajè¬ÊÍ·ß pj»;jScáEü4†¤\‚»£¶5C‘2ÈÓQÛ )æìe©£62ƒ¡HŽÿTHÊLljT¦»PŽ™yºœA}%¹Š©5Éå\6^0ÛK‰œ0¶]¢A•ç n“ ¹êH ~o§‘qÇùPŠ6:²„Zi’†Â@f¥ŒL–ò€ÄÔÅÐÄÔÜNݘô×w—¹Âá?³½€ ÓŸ,™Û\¤† Ðÿbrÿ*Å:3)Ö ÿåñýg¶|0”¯©Š´¡'' ¦„•Ca [ #VÎÂè—•@RF’¬M.Cϱ²p›“@ùÏwˆ•ƒ³HOå?Ü!VÎ"; ”ÿD®°Ç { ŽÎ¶óYaY~JDÿÈ!;/Ìè£Î¨ '5Ùé5žŒJA‚\ ¢Œ#;clóêdĤ¡sÉÒW'ïãÈÎ2Ë^ ¿þ˜´TêLŸŽò 1?Q§OРʀÜ3+/Fi¿€1Âöš#k(s+1Æq$1†X'ÿ«ãí‹ÃºHÕ>ï[¬3ÿU:'°X§ý«l:N`)°’4Vx:N`°Ç'÷â—ÖMÎPÙ'ÈxLº„Ÿ=d'ž(õêÕvOÄ(`ã픓t:NÀˆÛÉ&Ùtœ€•¶G OÇ ™ah¤Ö«80Í AhvÉaÿùY­ÇW–êù !^ÌgžÖt£'‚ÔqÞ¿ÀÓovf’.ì{p˜Ïí¹|!LµÎ#° éJmC‚ZÀº(µ™†o™†6'’ ¹Ÿu91\ðj/¼d›a;Ý@ÄlÚ¤E_(³‡=—mÍ f“¶ª~eoµ»cmét_bÂDaþf©K¶†S‹RMÖ!)_»û6ï¼igGè´ !­§J¥t\˜áŸë8‚3Wµ0F¨ûÀ‚]¤ÜÂ|UçM-uÊ &z,Á$ÈuúÚ£OߤB¹œkÕò>52ÑI\tºfRñ’ .1jeeGêŒ7I.ÌŽö*Q«NѦzÄ1þôckŒ×ŠÌo}CLÍ]‡Ó™·?ÿë@ÏÒytùNòêPKöY;žÔRaÍ«|‚ùJXG"XÆtTŒ…”-(ô¤ÚH ß©ÜÏ…&]öòphZ¦²”8£‰F9H$°,𑉱&€Úœ*WÌÈ£ÂJÁb§ä™Šgb¤ìx¤¾ì€‚§ò#€“Oʼn'6íÔQæÍX½sN»k²Ý»5ÈQgws ‰çÝ@ÒXÅÎ7D9J)§0.,›‰—{ÝÍRíÀoŽRgu¹ §Hd0CX•Ú ŠOZ€”š+ùpоœ€œíºû¬Ñg¡‘“Ýœìºü8"-<~´›ƒ³ww?&’ȤænïÇÃDÄ–±¹ûûñgÈa¹e@nîþþˆ³êpÎB^ªÜR·égj̯¸œƒ®ó;W#yÑ*Æ7'cœ®`ìlFwë£Åsd«Ç==ûÛšºÃò&æNâ?œ JCZ](Kb«%¥a”D„4ÖGKD+Döz é„ðÏÛ<%´NàWš?•B|&éÞåp‘äÇ‹x ¼Àƒ> Z츸8ÎY)¸Ø*Á¤€._G lÅp%q¾:Á–.Åɤ¡£AÂ…S“F‡~©l•Ž,_I*Ò˜v–+¸{æi«Tgõ=„d EF„ÏÎsJiÏúÕç\„`äï|µÏ¬DèêTš‰ª<âÖØ¶Âg«1®Iׯ)³2µŽl«¶ú,½7t3V ɽ¼gV]H»­X\®2%lg·èüÑèJ t;š_q‚²¬fVáÃÞqÛ6uuhI‰¿ïˆòÐо@¬â\ÜÕ¸=Ô¥¦°·^™¶×â°¯S÷ {c”]™§…ŸqzàÃ+U$6;þ+Ío¤c*ÀˆDÍËÃf§„O¤Ý%t ” fq¶’ Â?¨-ë°¡¯¥;É‹ JÜ_¾]Iî)a¤Ü~2Ã9:­¼Ãü¶ì<_YÏ×s-{’ïÊŸ–ú§•Õb=Ovd«µ‹>P¿.Í“•ý„¾ÃuK(PóîÝ»™˜ZúFò@Ìfð‰üVŸË³»>…JFn·©ª/‡½”%¥ süÖåF”呺¡¯Š–ê‡|LEò€(Moåà¨p’/ø…ŠQVë­|¦…@·’”%:Ñ{xÇ+—Jr`G¬ôEÖLŽ:+9›{ŸAã§e.TÞÊ&¥šfn<ó?ìÛÏ$¯Á*~i®œMtªì*è»°ÝÈf? ‰ówBÕ¬Äj‰”ÝØý»ÑÌý[··Åd†,¸Ú¯Â,˜&?¦U¼©à¹Sb){þX‘ÌsIª °B]þ»„°®J^ȤïQ„4{_]Þ,úÍ .äy0?¯+»@xž<ÑEŸ/F²•2à³ßôOl—ìOi«ì›—Á!ȵî,ðûƒÍðØ;–¥ÆóQ`¦ÒâZyþŠf`\Ò¥ð‘Ô-ݘÉ\O“Ì=]q©JÑÿÒe›.ÅŸäÌH‰„’Jå›´F¿líUù¬+%æØRâ ÝÌÍioö8%JJ7¯*%‰¦¼üŒb¶–Kév¤©b¶D‹ÆˆI<ÀœOš}Ï„R âw™OÌ1«sº R¸'…¹‘»ÿ²«5!ñX~!‡7êÓg‹üïýHI>??ÊCƒ3úƒ£ÚÁµ;ªàÕ>­Ø-üžk=©ÛëGJì/¹Ì„Üñ„zž°QcÔPñb–øI{^›‘ªûÑ–m’òð)KU}²„Ÿó*825_[°–¿î÷ àÒ7Z¤”ž-9TÛÄ âúæóúT:¶ÐJÀ ¶æüe±W*øu ct_“Ò² ‚o•÷9ß­ÙÈÑ0}Ô hâ#¦yc¤‚Xý­ÀåV¦a ±°° +/®Jv•D€î®zÒ³ŽË"ƒ7!‡'°=¡¤ B¥ŒÜ:&ʺbÄ•wá–hÄ=÷hEQ»«+õiŽMÞÍ™Àßãú¸®ÙÕµÜU§xÏ·Ì,Ç”¤2ËÔÄ­šÖºDŽc¤Àt[–Ép Fl³^•Å‹sÙ¢v7ÿÅ°ÙÆÞ?#ÒN¿°ÛWéå”UÝ*cã= M F–'«k=' Ø*áºElð©^̓jD›?íHºãË{È5F:’£÷HG¬aÂù¨òÏR,‹‰b‘™„¦ëË)eÀ–ä¾ ƒŒ˜É–%—®K#>¶óšÍCUV_ÂF!Š¥Gïùã®@äˉZ…$§¿lk´‘Åöé—_’·j/]s…o^Ê”jmIþ³‹_Å3ÌcKqŸ‰Òâ•Fúx‰5µã¨Á*±H=K#ûbŽ´©Ú|Š|n+•£G>vY>¶Yx—#7s2IèBÅî$k„‘—ð÷ü—å\ºVžÕO¬zíp;?²µ±³*:Ë?®\K™C;ßsûƒ0tˆô„ˆšMŸ½OÐtYh9$¸M?…RþøwÅL8;s“þh¯ç}FF9¯Jó‘Ätô1Y˜÷ªý øçg„ÊHGšÍ”Õü²>é"« t%Á؈Ž$x‹åš.ð¨JhqÝÑÊ/¹uð°ÑnôÝ3=‚›t©ÒüÐ&)WqÆJë'—j¿ì+ʈ”¯Ú0ê !_æºòU¯5Êèþ="ê­l[–Ìÿõ(2]˜‡ö{̯´¦D+ÓР‹û ïU­]޽41f™+l‘ànoé;t­ÅrPôW[ÅšB‘ ubõÕÚÔ?©‡BU-—ç?–B‡D¦oþù÷¿ÿþ·ý~ÿ‰‘ÈÖ^ö×ûåÕõ§´½lù•­j(¾ù)ùK²ø¼|S^‘® s¥æ~ SÅ÷uçî|©;w¿zi@ÔäVËó•K÷ —€Zd©aÇ÷UKëK‡¬‡È§õG5Yî—;Ÿ° ÐôùÉÈx_V`Ä"Sôèñ“)šu¿¶Ùù@%ßè¿P©¶²aì3Â*uöGÙå÷à6ôJ-}¶ºY¼u¾¼i»ÂÞOoj¶ø­C!Í‚wÉ?‰TpÕIÜ0ÂêëU]dÒí4¢»Îl¬„õO8ÑgC:—#4¾wäï½s÷ < å¶Õs×M÷EfÎÃáå×#¸˜úôJ]$¢­XèDø¦Á¡У5¸ÌÌ‹N{‡¶¿kïàz?ÚäÜaÝw‡w`ÿì¶ZÇ>€{jµ;«¯¤Ź“X/ˆ—ã?Á*œHË3Û 5´…sa¡oƒÑ·ÃˆºŠ*+Ïqnõ‚gí/ÌôðŽïÖw‚  ¼ÄS&ªÑB‰áÜ|Å3Ã_Ah¬ül O&™Ù®¢éÙd)Τcà&jž†³í¤Ñ %ùó‚ÂØîÚÙMÂí¤ŸQÑ&º£4ÞE˜ÛIãhq{~CYLJÆý™Ž£,öÊïb˜u*št¾x<ôlµ®æ: ›05þ\Ynf}¬ê XÆhÙJ¬ë°Nò®]囵@áŒ.áÎi.7ÌcÅà©Éë n~WÖ‡›íQJþ3“šlʽEQçiåÐdƒÞ­xmb¥É?Ša~†1€ÙûV½Ð–ÎqÄ9ðòGSà䣩I`Ý{ϾßD³þ2Ø/wQÞˆ¿æ–6u7‰pí«…1AXŠdER¼q_’”/FJìB$M"(?b¤¾´úKXoÑ‚§A·bF„¢ÕG ‰S~Äžêà#_’Ž3*ŒÔC%HrÏl× ™P¨<bô—FŒ±Ê#ó¼SzÄ÷¡Ú#¨ÒÞâ#îø«¸õŒ–yK»þÈX¯*7‚cãc fé-Ò€E Ü‹W%t9í¡òf½•:¦Fƒ5Š£Çî0za€Ta8˳’Ó`q{Iu>fX­º‹>¾;ƒå©`-bE=‚ ‚õà¡/ÝN»4Á|;Ö¢O²¾âäÒðSü âfÚTM_e¢5†ê@ÑDw¾«\ÿžL·//í ¤Þé®;ècv®dÛ):š L¾)H4˜5ŒU¿aT=yj$Æ ®GEºæ²#8V©0à,Zó!;5 Þ„Dîªû2}&/T‘&œ'NÞ*?è$ëK·ËSn“*¥Zõ¾I+ Ì‘$'*KSñþ} ¢d„ZÃJ L9RXSЭ'ÎH¼ À¯0‰Êï¨Î¾ü*릻ƒTwg©|w;×8‹ Ù]©™ÇÉ0Ùî#_à>žçN.»•Çb$²ûÌ…Ãþ ýG–)˜\q&=9×öʪ^³³¬MQ»ì˨æf9”Rml’wÅ’ªùÆ(–U4b>ãÕ¢ÎæfVsZ¢©ÕŠn5< >Å”“2ž;|n'Ô2Yz8_Râ¾¼è3Œ‹lhÆÝ:ÊÝÜí¥›÷|¢H£“õ "1qN—kÑÔ›÷ìdñ'ÖNz†AÉSHebÔÒ—RšÅÄ ä4C2õë…OCÜŒæÎo³Ù·ÙÿPK 8F;,%¢PK»}B93OSGI-OPT/src/aQute/lib/osgi/PreprocessResource.javaS±nÜ0 Ýýê&…qèzÈ´Èõ:t(:È6}§V‘Šªs(üï¥Û‘} PM2ßã{¤H{ÕüV'êk$¨Œ®+Nz_úÑ;$ñKýQ•vÕ{ùX݈ƨÄÁ£k „#±O¶ â¶„ª¡ø[>¶Êˆ%(pºí3ôð,éPøùÆÆ ŸÌ¯må+9^l°œìÓ ÑJ¬¸úâZÝiheYîu¨q“—±âÌÅ3%ƒøP¥Ð„V' »““Ç05ƒŽ !hE}!øñS0ïß‚,Y]ÄýÃÝSž´³Y‰t‹¨.‘|¤o„ Eí"±«…þu‚ü¸Ûí².sì;j.ô“Â5(“~–~@miÊósZ”,–ÑïíK¥Úæ¯ã<Ø •ù ð’µ=¶»Ú#¨–±Å¹å S(¢ÚæcN‡amOÂh;±Ež©j?ó§Ü0û³6 äÈ|ǞјrS\:“Ò²1iøGðF5ì_Î[5Êl Æ•è™ÁOhì[Œÿ¨tX}±dgb8oYiç/]«HÝŒËS‘[gËF ˆv$_×´†çØl§¦mÕV•«ì¡ŠPKéP¤wdžPK*|b;*OSGI-OPT/src/aQute/lib/osgi/Processor.javaÍ=ksÜ6’ßý+àÙÝxäŒ)çêê>Ø–¼Š¬l´‘l­$UgSœ!fD‹CΤd%ñþöën<ˆ'gäÝ­;V%Ö@h4ºý6ùâ:_q–ÿwßñ¬*çY#VåóÊõ¦i;ö!¿É³²É?wÞÔ¼ó_õ]YEß}È[|¯?È–æu‘­óknÕð>,x]󺋼½)auÁ*»âyÁÛø·–ãùõÁ¦ŸWå‚-ª\vÑ6 .DÓ2¨Uñ54-Ø[U|ÆŽ›Zt9¼ƒ?«Fð|^qöÛÏþ>»|óê »Êë^–õ¢ê ΖeÅkúŽ5KVä§ÂªM€ÕÁ?ﺶ¬WøþÕÉ7Gߟ]þrqöý_N_¿cl2yÎFhu2L›Ø  ìýs¬q7yîtËĦ*;×å†q˜ý¶ºc·WeÇÅ&_@†A¯Ö¬¬n:VsDKÞÞvÿìôÝå/ï.ÎN//OÞÂoèþ{x^¾/Ïðª+п@;+E÷BV?Ä÷¼m›V £;€voÙQÛæwvÑéÞ8˜Û¼­áo±#˜yÓT<¯ÜnxS].ÆKu- k¼ÿ¸à›®Ú/‡´rÞ‹îä#ô’úݵ=À¦JÔó7ó|Ñ:½¬úU©!kŒ|ìBó\8¿%F°Ôt2ÙËV¼;š‹¦:¢w1üz?d]ó5§Ÿ… aÅr$u^ábÚð¶+¹™‰yã¶pž/ÚÆê,Ð ÐÚº¥ªF’™~`ÅvçMQ.K^Œh¿¸eýÙX–ûƒ+9 Ô¢×ý¬^ LÄ}6y ËQ–yǻؗC¯Œâ ÒñY¬5=ég ²8U²©* 2{%MuºÌ·¹¸ÂvØûRÉ0ÖÀ¼Ôª5nÆ2ÝSŒÎŧ"¥aª5ñ|J€±ˆBâcW¸ªôVè õ!ðîªÔP²¡!PÈdhÞž-·¹›¦,˜àÝ•°ÛÔùÍZPu‘Ñq°•nƒjy×·õHÏ—ÍÆ©].ÙT÷°ÛWÕžùfAÇþ8á•à±R º™$š Ài½lbHšiɱi9,:¿«¥ø&/«7×Ó=·›yQUÕT3ùÙ{sB"dº7ÓPG†¢ I©³;œñü¨^;UmWEe«ÙxO;µ %tn™ûáØFª.fM0ªâ‰/.%h5VGÂvÍLŠ„— Ù:^‚AñeÛ¬gz“³»„N/ÙGöŒjÙŸðéš šÊzìKfãþS  YSÕ¨ fL Ì,ËXÞ®„Ý’.kRþ™A·Öy7ÕU©Âs‡$SÒÔ]bw*<ê4%p"=g4ý»÷vlAè¡':Ždïaø¾c7ã×D›=µ'ËØã¹(&.¯Úæ–´ëî_ƒ £É36ºÿßҥр²«¬»wlÚ.Q÷Œ3gÅ:l)”'šfw£ùbEŽ*ã<ß(3çoö…‰àßÒ†MÂM^õ<.ûLQ*3#åâ`ÿñcYï1´*MÞìÍ»¿”Ln %6Óeô¿†÷ùZ6mÞÉvÕÏ}ú÷Ïïú p'! R'}½¸â‹k^Läl©­Ñ?‹—¡ü½jV°c‹ G)ádL©j®¶ö &ý¸Ê{*˜êšÄâ–ÉA F*YwSU!Í a)Іb:ìª?ä®eö´nðkjÊßòusÃY^U T”•I3,‡­ï¨%ïpzڎݖݼ¾í}¡$U‚*@$zoDÓ· î½taĨG‘ŠXß𳥎ÇïÄÔû"›Q˜¼ò_o”}Ùrî~Jhç!| û„¼kZ³ÚÊ®ùl¦{Y©ŠËa›ì*¯A€¾×Ý0ÙìA•Z–Ø&–ÌhRÄ0)JöGXç&“HšFù¦Ö`¡ÓIRíg…k×Hœ1ù²¿ÏÞÝ €—5½b¼UëzYŠ e8ˆêîŽQ!±¯Ðõ5H] à%º4 ²{­kH‘§¡d»Ü—Ä=Y° ÒF;¬H™vÛ°ÞÉv@?ÐÞ`¨Í6&¨ÄÒ¶AP WÕZf¥Ð6 _²+T.­°§©-5¡cR– |n¯°Ói e±YYüã›åôÑþ£½=vÈž&ÈzY¶¢Ó•D?—*ÁôéŒÕic‰°` Xÿ*²nÆÿÞçH”,›Dè¶ÌÌîÐ>Á6G×Ð=“c[Cna˜ž*]ŠpH!1ÿª]JÒŠE1ŽN5rV¡a¬Yj£—dæÆR ?¡ñò†×Òš›ððñ×_õ;ë9ÉWªw¼PmØv`Z*yŽ·Ë|áë ìÈï£Ãû–÷“buIâõB–á ñuÐF™.\¶ÌËC{þ#! À¾ÏñeA=ÐgXÁ'y¤Kê ,ÇS²}ƒÂ)+D¨³"Ù,Ë/rÑ™’#„VÝwÒ3¦ÆÜš³ÎÉrœÿ'j8 iÍ24pyÅ暴4ô×ùšëoHņÃ7Ь%ì~°¼òµ[-.r-Ë=ª»PÄ¢Éôàä¿ÁÞÂå“äQ}Ç9œÍ¡°hH½e¤Yu¡ÏÎÔÛ“îŠ3ËôPÜÐ%,‹ST1†ÛB§¾©Y@Îkw¯#eŽÂñÃ-¶©ÌX¼M ×€©Öˆgí´û¬Eÿ†«¢Õ# …»_Ay–˜™ï±`l×éÕxµÚL­W¢s}«Æ²®ðwTDw@þy_uÃÚxS)Në5­Ûò®|[gèp=¹I}J¯x°´Ž±#çù5ÿº.¦ö 7›»t‰wÒKgÜQTÒeD€¿ìTõ»qŒ¢6|J–~“fšÔ ¸Úú'•G2;¦…Bq-~_¿y}ap2Œx?ôƒ½ý-€q|û0Ú†íI#¾ßk›˜ÑÁÐùp/7%y<½8ºüö—W§oOŽ/O8‰ÀËD»ýLKe¬””ùþ#ÇC3¾Ìºæû·g9èçÓƒàyϦ“ïT2Ñ?‰É §ÎG'>@½†7}U0Ø—ÒBÀÏk'î]”Ë%GvAjV-ÐÏyˬ«¶E¿FPj7ƒ‚Í>Ä­+pßùý”†dþäeå¨P Ö×åß{ž`$…Ê5øJ·|ž·×@ Ä© ©?¼ý©^ÿÚÓÓƒÿÐK9ÂU ضl·Fð'*‘i(‹‚¸–ó”"8|¦S]Fé ™0¼=>>É'šO‚Ò~û©e!òŸOq‚Ö LA‹Ð2ˆëfwjY*ScZù‘“xvä”BÖ2Ä‘DžfÖ"%×Z UÆNk©/H…¾å€¯ßð¶\ÞÑû4˜9€ ÍIÑpéàWK–ƒ>ÒrZ: ø”¬õ‘4­h¡†UsÑHÉ–<nÉÙm.Ô*¿RP ! öÀ>iI•‹A³£%>ï˪×>Š_ªþˆÏ<~s~~ôúÕ(ÛćT_+¦”Ø´bO€zÖ´ä°3Ãì>¾6D>ûþ•m˰ˆE¤Ì¿¸ÙË(ꘈŠ5<&dÂ0Âfñ‰d‘ç 1àMŒ‰gð$†í°ÊgTL¬jÞïfRØü±ÒÈNoÛ²ãÉ’*V?¦Œ|ˆnê¡Ç2y2 4gx^?# ýha¡Ú1_íe˜¬“²Ï*-!ÞÃŒ÷ÿ7=ÃJ}˜¬`#óß9œ$ÔyËóë˜óÁ“6¤æk9DÔŠ•¢rWÇÈVµÕ/lø·e2¼Ú•Ã…ÒÇŽï(mt>Z³L)u²¶™ñ–±§ß`ú›Îבh±3xP5˜(€VÒØóe ¹ÄžÓ´à!895tl‹õa—XÌhu¼¬™x Ô$¥vÍYsË[²êíe6/`¶^Ž/Aý@£’Ï•=–’õRØÏ–eã¶â©7e-#tÂò–FËz°<Œ´¤nÈqša¿fR*Ž· Kf8’ë·4´ë0*óÀöNàCÃËÒvý@÷†8I)IQ5/·t{£U[4¶0Çü8kqdÍø€ëЫ[²Â]—$Þ±èÔÙ¥²—ÀšÜènmê·“ šíå$…ôˆ£bgK>÷@§³Ñ/k™cér…µÙWqÚ1÷\)Û÷j}-BŽP[Óa\þöQ)vª ZµqHË—-Wnfàv?åûÌ«ÛüNè ¬é[çè«nžæhššÒ-Ì'Ý©ÅU^¯häi1ñÖPݤÿ33GX0˜Ãä]1ÆM>hŠ€†NÆõMÐ.zŒMæÏDˆ°î¡ôƒèèAShøÒË™õLjÕ0ÆÂ¯55€ŸŒCp¢€ ê+ÊðÍMþžŽCxÔ_ô­Ê³4 ÌT ¥5ö?Ððb¼·.)‰Ý”kôÖeÄœcøx&§33é¡K<–Ýñ!j'§CaÔZ%ñhy¿5èHª ¬ó;©6à·Îøp‡ï´kÖ CÒ '5Ùi€Þ¾Ãž-ñôX"EVYæ"¯* /e½ÚÃý0ª Îo@ˆzw𲏓äÛðÝë¦û¦éë·l7$nÄÜ–IË^Kö˜ªOé#{™q¢ áØ*[Ú2·u@3–vKÿs£!¤·˜Â}`(ŠF7p ~{šõ'_Hz:dÀ0¦`€)ÆdwÞÔ>Ô=Sœñ²\ós óRÿêi䠟؈¾í¯^²Kei+kZ$Ëž‚|Æ5µFm&Øyºï¹˜ÞÞø`‡ÓBä±p|ÆÍÀ[G7 »cˆLH¨p&fM©›¯öÀÑ¢¥­Lª;)ÉÚî@!•¨É#Žv^®:k¢Û‰o(ßfÿ{ ÎÉ7¼8yuôúòôxÏs~عUdË ~‚~ü–´T¦†ïØö‰Pbþ…£;L{œt>¢ü­C»²G¦T¢iÁûÕ†JÑ”ü¼&w‹ ÅÂp\Ï]å]5b[®ä›ÁnEî(\´ÐxÍü Æì¹n°ÈR×P"•=_šÓeYm,ã n÷ÍNƾJøú €Ï.ÀXí ˜Â¢¦oyµ‘ÁÇ´ârõKÿIQŠë”B³´Õ‡tvUX,öè±ÆÐ×Vv2^ÄøšgÂû³ß8wßÉ f[¼¼És“RÓ¨r{nÖ"ÆünAåAâP1<±vjå4º{˜š2£HuU9™×Hu <¯W8vÜ¥ÇM²‰µÞB5ËÃvü!ýl(~=4s*ܪ£Èæ6ÃcÇþøþýoïßgïßšÌ$êl²=JÃ1Ü=ÍÀh  ¶Å3YõY\# ãS­P±øè?%Ö»b#˜Á®ƒ”ó‡Z1(Ö~üµÎ7™ÔÛTŽY¡Y]£!m0l[”+ÌÓjKŒ2S©•r£›±Ó þg¶cÆÀÆþø[ö‰vg¹E¹E`eõŸ”ŒµÀš?Ï)j²`@”ÔÑfTݵwÞ“]`–Ô¹9ðCF’Œ>ÕQ¨‡‡¬$ßë{ädÅ—Á¤¤É'Q™N¬ŒfÌß?»É 6 ë¨y·–럳W˜š ó>U#ÆÑ¨=bbÑ¿¬’mçû#Ýø&—’¨ûSm6°å¿½â­,!ó³ñ¬¤v¥|h@°Ç/y‹4Jù=2Ø ,xŽ{"z†R^4 PtšVƒãsÌe÷Ìiœ’UíìÑKJ5õ1¦aüú¯¶cñX¢Á€ÎNÈWœ¶Yù¢µVáRfíQåV„™~¼3©EL±.Rþq#Õk3nìLÛ“ëž:ª!5€±A5aYX8*·ã=¤)E VSH|µãh˜Cµ‹tÚ5¾LF±æÛÄ(„¼˜·ûæPÛ´ö¢aÝò Pâ–¤¹±[^s¶ªšùø!Bx ÜqÑ`ÞWÎ2C}0†Jcë/í2/3ö({¤âTh1¨ôa=˜¥YêüâHN{šu/¥/^QOÉ U¾¦à4@^{=Ãî’aJæ%úZ5åöó|, Ût=¬S·Êð˳½EFjJóÂ’‘%æ=d1°Jù¡€õc<¬ ·20I”õ‹ÊuOmvüèàєۡº›# ËVÕ¦-@©³;Éd›¾-ˆ Ÿ>(:6Œò¤&@UPçÀH㌙œ`­6´×V.¿‚¡ä1Ç$L;%Ô"ÁM ãí7Ä&•FÂ)kyÈN`[н\ž4°ö†# ¥Ê÷â¢n¶n–¦t¿šIqbÐâ0–éÔ´ÅfQ*‰^^¢]ÜTDl•µï¤ýŽM˜¹rˆo÷ýßÅùi/Yê¬9ëtóÀ[d#GŠI>{ÿSÅð±Ni÷ZÚ†sÅ‚ò†ê2¥2M­ªÉ¨«ÏF°nò¡l³„¡¬ðD™ñÀ¿óæîp½˜LŠœlâ?b¤Ôgd“6î fGjÕEôV«3ööV%Ú·hA3!‹F›L#ó^XçÑ‘\ÉÑ ¤ÒE‰©K pá+:z’–NÌ÷¹|îFù}udRç^ÂÉj㜀™2é®Q8q+ü›2ìQ$ü2[³ß¥Ecô•Ùà“îùp6‰6¼³»× ÓQ<¹U)Rš‡rÜäðâ•øoœÖ4°°æL†KŒùþýÝŸY±N <œ5”›ŠÿÀ[AÇÅÞš¯{< …‰¹â#öÛȱH¯äÅ;蕪㟭R*Kq\—ŒñEI?VËÈÅ”y×WC(ð¬ÂìP:ɘ¹u¾K1Ø6¡^6¿C}Jé7k¥þãQfÜßæF „Û‹@’{|y±Šl?h²¥î[˜Ï¼Nä–»z‚0C W#‰R½´ soÐð‚æµ"„Â’w&Nx ™;+К˜øÉ4ž91ÏòÍP6òI~S€ƒH&³V¦r~£KOø±ŠPg¥ÜÚî9¬Ñ\wí4t$F|Àw]¢ÞÊsâãËéF&ä‰ÓV?l_JÒü!® aˆ Þôbµ°6ðªYaZ Ô>Ä#±lMýã“I<Öõ‹/ŸeÂÚŸ¥ N|éHOLh >&å;>æÔNÊN~ÁžFòµwÔ(n¬â8 ÚëOE(zò|’ü&oZõ&þ®Nÿ?ÐÉ:ÆÏvxÀþƒN ¡×‹«¼=ê¦OÉÿöhòÈ|‰ï‰Uqäö•®Ÿ-˜ð@¡t†Ë7ß¼Vz´:RzϨՑ,Õ‡4Hú逄÷“4öb©Ÿ6!-/œq|ñ^X‰¾‚f4y(ÄäaxuêÅ ÈhÄøI?”Ìu^5k °•ÏT€{7N¨’€Rö[wʘ^ðeìõ¹Jx´ìí[´x26âC ¤!²W¬‘âGð¼–ÎÆ ôÇѳ)¥[ë§ŸÃñÆÌ0åû”åÛA¥´ãM{LØ`r*zBiTBÉlƒŽÑv- Z³¡ãTF”Á[ªÎƺ؀G¢lÜs¾©Pû¯¹íì©`…ˆ¤êECóeä¿BAñ„]¹Nd–§té@vèܪä‹ûn塯ø:£¶½Ðñ`¼á=Ná|ã— 6׊Jíg€{oìÃýÇBm£ÑPAô)àrKõLŠuÜ}¡büÔ_Gò›PÞ}ùeìˆ]Uì§òçTYlŸ«%×P;ܺRÝÏ”køË¡Šúpc+’‚ŽL~7®ÅVŸá»ñXjÆOíç …‘©„97Ê&r¨L*Èfç°Ýì€-&äO7˜ÅÕ u$9$týŒÆRÖƒ½d:dNSïîź Ò²íIMEx¯÷ȈÍ_“ãhoM¬A¨m4¥YûÑ£þõÙhÃÄÈðíØÎß.1³þ€kÎæÇóM¸’ëçu›B|÷’7>mŽYa}+o7)µ:|r NoQʪˆYèµ³‘#¸P«¤ÿ Ö²:þúé«§OŸzÌ£€=îöÛŒFI="P™öT2r?¡Í(z`ÆžÎrÌR¾½A;¼™®-¬‚l€6Œè»Ç>Ób‘mJ} yŠÿáñW;è®±éÀµ:{)“¶¢x«’λÐ?Õ5fTqûUóÁÏ˜Ó <²¯òVÆ®Dç–OÙ¤¼1³gA{4 aépí›±} >ðÍ5‚JºFla„–($GeÐOúÄçžf{öŒ–½V Ç6Cöìük§Ù›—Èïf~ŠLEr þ%(ÞºìE8™M¶/?:àÐjá’j¸æÙ@åÜè­Æ/y*¬‚-f±C\@:†,U˜«ƒ±He0É$<çJ`_ÛqëÃÔjH±¬¾Yö?ì˜&›Ëƒ›Ué-f5þØPlD°+ žb#ü¼VÌÔ·3ûK0q9‚°ÐþÜ«`ÖÌÌŒDn«Á ]_oº»à|{}Ý É)²\P¡&Ýô‡ubÇá ‘®}ãÁÍÍnSùÝ ð#Oçm)äÍÉd“Ôí%¢C½@—3W gCÚVêøYž›¿ïß©¤“ ­ ’xíaѸ—7¥¬tËØ¬ÑI11+˜)²Lf›Œ­ª¸ßf0i8øS& ÜyÙ–áaJ)/ÑýT›ú•E¹$6òê{`€ÇG—'¿œ½ýø ƒ“'OÊukÁÎ2)-ÔnIÉBm,?b N¢ Œ`eÃ`¨[A›ÇýÑ­Hy'§îªsIT ˆþÛÊ»+ŽÏ̺߿=£Ûä!¶Ø=>›úF¬Ðu+Pí§§?φË"3y–¼ÆQƒ›ºw2™?õ9„SÃú6PÕk)ê$ülÿÄr© ð[,Ó£qÑöú¶l(îó˜Ú±™‘£ÈÇ[GPt\j’Ì Ã]©}ö놾½âK™½O9@îw»Ø7pÈž -E<ŸÃÙÂäŽ÷KÜWÑ6h3Jq¢[–;…œ„fbFßÿØ0^ÓIo†4æâ huÙ•¤@…ДþYÛ¹óit ¶s9)ò¢¡”â¿$OѤwOµœ¼›VLƼŜ#ÔCÜ‹ràÔ¶†ð‹Ñ†òÖ0²6þÏézÎþzôVÅ#s¿V=`¡îøp2/f(h„' ÅÉF*6âÝ2ÒPTÆÛ£ýG3¥"Ò,˜)ד!8bÜ\¬(€›^aÚ«¦G¹¦~S€»©ã^K7LÞ‹MËM ûâï}Ó=ß—ÿ€ú(ÿÈç‹ý‚/õk­å|”? ýÇxú_ÿùgoænª»ý¤‘¢ŸÑƒ-¿Ã $ξMYtñ²/°EÇÚ5ê ‰{|Ì1‹2Ùz‡N„½pÕïyVðŠwüXγ]ø mç|&¸“§äÂ"žÌ wC¦iXF$ËüöuÒ™Òu­ðÞ9—ÿn÷°Ä‹]šÒ£iŒèÔÖ w¿þ*ñsÖ0†"R|ª:!pøBáñF:• ö`h2˜NSvöïÆ.$" ñ›Ež‡ž>Œ_Ãb&qÈv¸wN?’’©ÅÑkœaÂôZþôàPK%ê0#Q’PK3E;)OSGI-OPT/src/aQute/lib/osgi/Resource.javamŒ;‚@†k6Ù;L \ÀÚ‚Âõ# 8Š;›ÝY!1Þ]4j(ìþçç±¹`O€»¤T|,%ö¼¶Æ¾z g¼aÉR®Þ¡OÇ`§:lö%…YÜ­É*ç“4^A<¹…Ï ÐS1BUo¦†¼²8˜™ÙM¸…1°R^']’þû¼.ƒ¸Œº•–;¦6/~¤Hº™4`>cxžÑ˼ëOÐÅ:³æaÍPKU-ætªPK6E;,OSGI-OPT/src/aQute/lib/osgi/URLResource.javau‘ÁN1†ÏÛ§˜pZD›x•xÄ„Dƒb|€² »£¥mÚ)` ïn»°¸kôÖ™þÿ—fœª>T ^"£Ô´’6Ô4‚¶Îz†wµS’¬¼š:9·„‹+MTZ…oËÇ%}…Ä·h8À¥÷%Š$)¢×SQ¼²'Sx`¯R)Š3ª)Ó’zœ7dªàN„£¸˜æÆENDT[°M¯.ÇÀ·ûóÅìP¡c²¦zäèM†ÉìéäCò)&°==Êqß:ºÁ¤ÔÈÏŠ›ô=ÉÝ!cgi {OŒå"r/iäÃ=Æn²²î³Ìó_·ž!]Û”/ퟟìš6„ëaÆ›Û?JgyõCqwßáC§>»[]ï,móã?ŠoPK§·œZPKB˜~;)OSGI-OPT/src/aQute/lib/osgi/Verifier.javaí=írÛ8’ÿ·jßQÕ%’-Ëvœx2Iœ¬b+‰fmË#9ÉîŹ-ÁÇ©!)Ûšu¶î5îõîI®_A€¢{v¶ê05ŽD6Fw£Ñh@3oxî)ñ~ž§´ø§­(û/þü§?ÿɟ΢8%¿x^ËZ+/òæ©ØþâÅö1Ó+öJ½TíŽ[¿¦Ñ9 ñ~6? ü!^’4öÏ|z•Òp”vè‹ßàÁ?–@ùÉ‹IiEé zà…þMR'èT(øÙËAûḙûÌÿ}õŠÄôŒÆ1²CBzùÞK&WoT­?ŒÂÔóC@°´þ€¦/U=Yæ Mø§Ûµ?僑T†-›V¡W:ü¾Ÿ¤/aȲ>åtŽº‹£?óÒIÕfüqÅÔ‰rÙàe}quHxsð ÔGŽ[Ê›Þ<ùÛofW˜äfÞ âO£( ^èn?Þª ‰Þ§¿Îý¸2ò³ØOi(eºí§ {‰~ ùBvöÌ}#Iꥠ’G^šÒ8ßT§sØ>èà§ùž×¼Ei £éÌh½¶»·»¶yrÒÚX<@ëQÈÔn]–UR»–ø7Mü›wƒ¿7xç¯ø +ó)ÃûysíÇ/wƒû§~ç.Iýéñ€ã{|Çø¶îß“;Æ÷ôŽðÁ$'0nß9Æîã“1ߥìðÞ‘ eê/[xã%~r kBub£Ö°Û??,z7¿nòO;äÉÓÕk=Vµ¶oPkKÕúᵞ¨ZÏnP멪õã jmËZO7nPëUkSñ^ÔàŽ`§ƒŸ¬Áç_zS9 b¸S/ÓT¡ÁÒéÔµ*M™Dóx(>ó* ½ †iâ'-¬NE¾-õšWÕ¬|ýüf•¥Nçó uNÇ‚/eàâ`§øDiL“ ÀM&+ìïf£YV5?‚aЪ>vUÍOoÛ3*Uk‰MvvS6N™œw0CkUø-£ËàŸ´/ƒÊáŸò¿eðÂôÃTÂ`·ù_wò¦«À¦J•Wª$å̰Ç75ÓÔÞPNͦ« Y;Ï*Yk|«äô¾ùp¸·ß9hvßvÇ;ýA·w˜5ûýN°Y2§øqM®ëÄ9G§°odð÷ƒ7½ýî.ºå_Çýîá;Ý©}öÖ~k¯ýçÆÚ_×¾¬ÖÑ;Í=i¬ÔJÚ‘üÐÛ±}Œ°ô0›°ËX#FËÂÅ``‰ã° ˜ÅØôÿ«Âª‚”ün¬Ê÷¸a› ù~ÛÝ?îô{G¿?­µë—;ׯv®ÿ¹S*èWûíÃw¿³Öê õë““ÏïwFͲjˆé=4Pkþ{’ \ÿ\o4×÷ߊÊb=YîS×_þ¯õ“ÚIxŸÌ7 €‰Z/<S^¥Ÿºû{»íþÞQ{÷¯í¢6Ý·*ÍþÑÂùôÛõ׳³Æ£Æ ><9Y{ ÿRÉ:t½í­Üg—>Ãñ…ý©DéûN{¯ÓÿzÔ>Ã[œ$î›R˜Íp‚û¼–ù_V+~ÜûkÇ9©Ý3áEj—Ó{øáàM§ïâó½Ò{r2ªÆS î½“Âû¥±UM±Þþ|XBàÂýý?8…íÿÿÁ)änà¿DW*RxÜÿÐéõß¶÷™÷IaÏéõ™$ô©¸fD˜D r9í’h9ÑâÒÅBõïËV+…|}ûµ½{ÜýØ>wè—ZJ\ï“ÂÀûm±Ä”Ë•\§3È…ÏŒR—¹ãdÎ0˜Àò²E´Ìg ˆ²ˆ–­Ò#Qz”I‹ ™xôPQöíüf vXÂ>ÙB<îŽ6)°ÞEÞ9hÅkwÿVÃ8é¾90^íùc?õ‚¡ÅAvA‚¼_ ¨Îô4JøûiLà èˆ ¢³ôÒ‹)|æ8â‰Yw ·‹Ê‹é©ï…½ü}1À߯”¾ìqxüBà›óþèƒèÐd¶6¿"ïée@Ó”ï;Ç#ºÛ—ÝøÀÓ($ïbo6ñ‡&¥û~8\èÍh(‚ÚÐ7ì 8P{6 Ìׇ4UÔ»‘òŒƒF4Lºõ‚³½ÁúcËðþ|(º>‹£a˜F 0n^ìËч¤îÓ(I ŒŽø^B¢3|Þ4Ìšø0«wàã(Y$)šœýxõ)ŠÏEŸüpÔ÷/@ˆV`|]&?b ¿0áQOŸi_µ/»‚Š7aù¦šÆ/N°-lËö·#­Ñ>è&|·–jÚ|Ôïívƒ^߮Ԡͤ¶ýìœSv¥Q –' ^l?+ö«Ý?øºßš¦4À6#h^´ÈÅt襠çðï<¡ÄOÉ(¢ £´Ð@2£CÿlAÒ %4î†4IZ`({vAt‰=J/#oZ9^<ýP;9dßOÓ€’ÃL¦ÑÈ”t¬}jÖöEí7þ¸¤j;˜M¼Zq£ æ{ÛOÂZ0„l?!§~j¿´‚o=Fp[ÛÝqè§‚ìY2Ü<'Gǃ]Ó¦ø3©ïºÆ»£6(ç¿-·sGÑ%vE[ø…ÌfC%2ë`ƒ!G&ƒÉÑLÉo¾žy± aðáÐ|¹õ㆚]Èç‡g1îòmmZXˆÀW6èí'kEèÏžnù=ììöÕ¹z¶-:LÃÔŸO‰¿õlÛ·'Èúl›øÛð‡‰ÐCÒ>؃WÄ»¶ýÄ¥Ù–’)ûQÍhœú¶]È™zgÚ™œWǼ_¼¸Z…ZD:WC:ÉUŸÖq·´PM΃@ú¢ß–àlê´e¤,oª5ŠpWP¼0^dXà}®w90™ È‘´Æ4•éƒ*¿‹FêèïœéÎh¸pcÊŠ ã(®×Ž¡}°¼`\D‚ Ú· ‰Ž€ ‹éf½ñ#žÈœ«é8¿e1­ w©õ®ñNùa––£èÇbñžz#ðúêˆ@o:@Àß×ebfK¬ Œ-²†ä†AKf³£êw~þÐíw¾r” ò €B&·Ùë¿í·ßt¿¾ï Žõê#Ýãy“=„åÎ$Ç™2‰²ãÅ m–±Ÿ}ô‚9­WMŠÖîÁQ¯üU„`¹&³¬Ë»nuïï0…wwËù›wÝrço…&5¥âÙœwÍâw‡=&³—N”Sc0Åǽ½iÏÓhmLC3?4Iãù&,ð’æ§&ÊØ¿8rù#CŸ´DL¦Zzc Õ¤Þ;ý…SBÊ$ü9kÓÅ€‚å(ؘ _ë§§ kxX7Þ4$JÃøçu€×m¥V°Shôä×`TÒ!X¤ú¤!>°4Š£!L\7¼O}”¥dó&Ÿ“Yp“ Ÿ…vJ6{Vð¹ÅøÆ"KA¶©ºÎÖ 2ð¥ñÆg9~¶g¥öpw¿=`xלóäb­©âji×™Æl-‘ Á›þ–p–}6öÉ|ÆŽr2*OZÑyut;^å=B³üaT×1UJMæ“î¦È‘¡rÝæá°.™SÍ‚cʪ¨‰µ•¤xðÌdrQà@k6Ïl°‰YÍÕUKqÒX%˜xËÐß Uæú7–•C¯dù—X˜l6ÿ£Ùw‡0ª[t‰žEÊ¥Cânc[8e‘ZÄxè5és1Lˆ¤Þï zûpòë^·ßÁ]IX¸¹ebQSÙ®¢¥:óÁAò‡cçð­0¹1!|Nþ#1£óņdYfY,œ6i_µ1MçqÈ$Ó\­®¯°ÙƒC/õ/èn4¢äùs<±€_‡øµN5é+ðìÿûšð?‘üo× ¥‹¸_Ë‹Gü#Ôgk”l¶ž´«W…5i¬*L;ÃÍ­Àÿòåzná­-’yWò«1y‚c˜[gÕ ÏEÀF‘@]ë}Ö¬‚S­äÚFI…†]NåÏó(¥£c<Æìãáä_e¤Ïx8@-›/v@;Y)/à LZ#aµh£ý©Î*~tå×´‚wƨpj$ë!ƒ¯à8 cÚŶšä­ÅÑTø B†"µ¼¯².ÉÆÊV¸NTW4,ÀRΜE9õ/嫱ƒb½ÔƒÂH³ òð!y€Î½•MG—OÛ‚\AÙOcl3\˜•æQaïÁ¦K™¹@»M Vk¿‹v-q&$΂ .¥æœ.ÄÙ«VíãNЮ—”N+Œ2¨¦ÖïQ‚Õ—¬µ±€AkµZ%œÍÜï<~0Y¸î©Ö·oDÔ!±Žéî±uÆÄf.í½ÜI±R@{so\…ùvyBí-ZÄm|š$Q|þÈVÕNóà-'4€i3z`â‡YéF”,`1uExÍ*ŒzË 9á‰er-©]©5Ðz]©`„½Ÿü`4Ä] :¥Äcñ AÆ‚ÍçÕQMnË-t>2uX0ódê-À“ ¤s¸‡ÖëRÐøL{­s–ôZ¹wÂó0º ¡Ë"ÂiÓNf2«z嬱|ݯn6ÕØCr9AGUŸ‚ŒÚf¤ù掎¼*"'¯ºÙω›e…]ô&Ù0i.+&Iæ"ÖÖLrdÛ™|Äõ#W XÓ° °)`ÇŠ‹>Ñ>s¯*ìhNgŒÅ-‹ßyêÉ×VÿSUÎÉ7 ðg]þ#»G„ Qp‚ȱ¥ˆV϶ý2 JžjÆýÞ I ¦ÝpD¯zgõG­‚LIÄ!yƒºÄ³œyÃó<ö\L8,ó¬äj.^…Ëb¥N_Þ©‘Ð<(–Ž)?RÎ2!€Í$-õOW‰{T°pûUJeF»½gDϼy2޲û˜øæ>’DCX6ÕMˆ¡ðºÁÔs²é¨ñ]„—ž-ášÉ¦ÆH¾§XT±Ÿ®`Z1Þ¢ð5É£õGô©µØ{}ëD(pµÙЮÓaÄZ\É•“B£–òVeNh|á©Ê«ô€¿]S¯ :]¨ïÒìå÷#y3c?ÎÄmÝœ“ Àíá™{wX®*´|a ˜ãñ’l˜Kéöš„DØ%bžš ¢(ãv¹ZÉ,“Ö¡«÷lÜK½ôápî@Èøcuí—Æ`¬±ŒNRŲB[Ñ©É+Är[Êt»2¨ºQl>µñÞ™%v|ÒXWF×¹*E'²I ¼¾’…³TŒT ÂTmùóÀyࢄ&]eEû—3ø B ep¯EXrŠæ)šÒ`8˜dâöésÕ̚ʼj)<êÃÿ8ƒŸIƒE“\‚Ñ’ˆûß©wNÉh>aAùC×3ÁÉ8"Þp”¥HUSÄJËûAËsN‰˜~…4šgD¬;í`š`¿!žÙÝq@‹Ç£Th1äÀdD·xz0ãÓè‚¶ƒ ®„-W+«‡«!<…&cÒ ,V°ÛS/>‡A@Óæ,âx’I4FÒœ0NB³dÀä(0ÔSâqÜR>î’Â<2š¾&ï§Óéž‘$šRà2,*Bx¨‰‡Y0þ–gätÓ4ZZmœ€ê0‡¯KÆspGÉ„OÎcl\¡Íáâ&&t´,È0Fþg1ÎÈz~<³ìÝ”²%C6b0Jùð^oç·&^rË8øR0ÔyoÍgË=k2ŸìÉþ9]1_Œ|ÝXjägÆ©Ig:K…T 1up(I#^À—Ér̲ˆZì˜>V é|à`pÓ£ª’õ‘wHŠüÌha )ž`¦$†ÉëBØ…G³- DŒu,Õ|ByE”Ùg5Å7Ò¡S¯2óà Öo˜›cVÎ * hóô‚¿Y݈ia©!ápš!‘Þ}‰!áu4C"'Ak%•yÇöËRÆPieð“9ŒÐådg.#fGNy^lnÎwµm7b†9f’—86×ëßb xó[ùjÍÖߺ{Á¶|Q ›ô“#:céë,bõ ß’KãUІÃ9t>S,ëUÇ bÅv×Ö€SRj v'l'æyˆ™8ÁU¦AÌSŒpF2¸yó•)ãBaÌi+®ör5`!¢>@nµ*}ÖÚ2ãÝš°ö²Kg¥ÙQøLÃTÁ\|Pla/ YÒ‚ËhÌ-Ðb«ì8¦TU6¡8¸VEµaÖ´¼Ô,-©[ÁÍé3`&ªìÖã••‰k~ÇõŸ•}šŸUŸægîi!ôl#Ö××"çºRPffó°¸–eyàýá]€|Hì UðH8WÒÒ‘“ž¼3;Ï•õ2ûÁŽ=^âlŠž"Ú&Œ=kê“Á1ÕÍsEç¨Ù]]9$„P¼ÃXWk@Fñïs=V‚¥II$ä©*x³ºMŽ”'#qM¬;3/$å,{FÕã Õ–1±º‚™!fˆÙ`3l….«_C[È8QǃB®I£8?8Š¥µèdY¤]Ÿ:þÂÒ!Ȭð$ÙaWe„Þ~MÁ‹ç²p;Áÿ\?/âi;G¯m†‚!Ó7§,C¯‡úÙéb˜wÔT#–ØBÙaJZ¨ùÈ”€\‹YâêŠcÃNötG~Êû2ò¡–üØì6 ¢¨[ˆ‡‡×RèwvŠM‚=Õ†¹¤´0ã£ÖM -ú|Rì»,XÜÁ1Õa1ª²³7oÂêZ6^ Z)àšñA÷úñø÷ðé´(âjÎ|Í—Ã^õ%0ó¾Õ¬V—kàeâ|ór˜êêb·g=¦È·q¤ÅVÛ9yÂt˜=ÙzãMÞnaŠ#SM+W9›b^£©¨.PS,›lÿ¢x^PFßú±qR¦°Ëæz|:Š€› ˆ×/¼“Yc…fpÌ ½»›[Ã;"rÜï°¼ÆÃCƾ¡8 ´Ñ!»Œ¢^øqb ³Ö÷ë[²ÅôÃd ™äýG‘‘Ò´ßWZ]†FUDå¨Ô¯l¢m²{òœmæf:ñ3 Ö™2o®°µÃ¤VðÄ¿ƒž¦T»½<,ù‰/VÖm™³³ÜÂo¸“HULã;‚òH,ÖäW§9'¹ß”¨›ÀÉ Åa h>ž°]ŠxÊ” ãàèûw `¤;š§"Å¥O¦ö’3–o‰ä³ ŠlÛd¯r‘”]Q(!?¶,0³3r¢ÌàzÃ|oÚÃãeuP~S/¶!Ñï—Û›&Ö†ˆëóº¬ ‰^DZ¤›ð9ÃS¾[꯭YwÖ¤š‹¯¯n_ÎbúJ}S%7›¯‰éœ¥þ‹…àÚˆ&ÃØgÎp±:~XÁN+öŧ–ÚHƒÌC\ãÛ…S üF•$ÿl)"q¨‚q‡?°÷L+×ÐR®Æ£ÖÊ#ÒÈè€äÑÊ£l ×õAtÇxí.š®E7Ð*`Û»†‹¥Pß‘¥Í|–޽Ó²Øñ”x 9ƒr‹¹ÛÖ N”n£¸(”gîh¿?Ò‚ZSûe bÉÉÞÄàqÉ5 vuY¼êòŒH‰]Q™„† •¦ñd'*ÌÚ씦œ·m'øAU ¾àDáu<Øql}å;'zµ&v*Ññð²»7"™üW¡7eïkÙVÿ$ºÄm¬&òíåŽ:7Ë6_ò-33-¸}Iq£9Lãh4òü–þ“¹‘G^T]c5n†XÂ×T‡q%åÊmqœv’4¦Þôyvy‡ÈÎFx±°­;ž~’\uà!Ün8›§† Évl™+šÚ®-*ëW~¡}3% +{,úoMœ–€©d)Éü€púÈw"¶Kƒ©(o‡šKÀ"ÕIXT¥ü)/aS«¬‰'sï =Ð{©îqaj¨]åR¢hr0¿xÆK”¹àKP÷É¥ïr6xn¸khg jë¢Z^ã±Ðkæ­ÁÇòÌæŸ ¨hî¡7½ÐšÄ#šøHQw½ ›°2Xñì><¸–J©‘ýb50{ —× ]4ÁEà5QaôBUÌØL6“.f”§å»eXÅœ¡ o6‹£+ø0ÀIh’êsxÁ‘Û8 Lr,ª3Wåz.¾L†¤ðñÈ"<ò¨–ü£€ŽÝ²«.°p&ú¿ æ3&‚*Q 6‡˜+NGµFž„üÆqž ¯•?¾Ó1½jª ÌDØöÏå}*ÕnD6ã.(nù[&òãeìf/Í[Ž×-G »ð[ð¾£Z!þm=äÄ;ÂИÁ« I^rÒVq0™êÕä|-½‘všŒñWääì9ó0 °©Õôµ¯CÔÎÓ0qÌHh‰Œ;ç]·|ÄíÈy¬ µUvOXrÒR±4OÛ_væ¼`çn’0dÚ¦gœ#2ÚÈïŸÈÂË NÿŽ u‹Ý¥ÂÍ$úv’ØIX²¡Ä”%Ï}^qY´÷ÿuÅüX¢+" •Í?âw,”žÀø4Õf'= ÒÂæŒþCe‚ÅjçŬzKožµË,Ë Ihº«ROëºt²#¯xºs~ŒÄ–¥R%“Þ°¢J=u×ÓL¼â ª…ÉeÔf½xa‚©cR;Å&¤`äG„åôí0Züf5Kþy—Ê¢ò¯6#*ò233*@K ©£ÍîsEØï8¯R†.óÕ^vµœÖŽÙÝ}Ƒ˚`¾@/<¿‚íDÎÌ sÿ×›à.eyRá,G¬ÆÐMÔQ&¿,uÜqéQb* Cr€—ÄÆÆ¼Ê¿}þBÄ;σp{úÜ '{ÎÞÉã|¼ï:/^»¦TôÓœW:e¾ ‹#€òù²£ð%çþ¬@à¿<oMä`É7,Ó^® S¶dÕ—+nY½©FVWU3¶dD»6t%‹2c’Ë“ñe|ÀÎbÊÈ2>ÀŸQ„ )Û<ë“ÈÖMu–2“1„Ó¸„@dû +ä4¦ÞyÖÛܸh¬ý&U=£ èôë*-"­ËX·ÉÝRÊÅZQ!ѵuŸ¢“€WïŽý™} ËØoøŸ„_ÿóŸàóÿPK©¸îØiï’PK‡U£´ÅŒ#ïȪ<üŸ†ÆY$oU’è9å#xóÔ±®Ó›12Š‘h„%-@>ÿ©*?»U€i·¡¢8lÈ¥Ä¤Ì ˆž!]íÑÔ W%G˜Ìœ#|ßPK…"W}þPKC˜ˆ;,OSGI-OPT/src/aQute/lib/osgi/ZipResource.java¥VMoÛ0 ½È`srVÃÛ9i7X ¤@Únë©ÃŠÍ$ÚlËä¶iÑÿ>J–Û±³Ãtpb‰||¤øá‚ÅØ}+5F)_GBmù|<xV©á7{bчy{«Ô<íß”¸Å—þ£W^؃ñ¨(×)!N™RðÈ‹ï¨D)cÒI1Ã\+¨÷ÞÆ# Eb×°tÔäZ61I¦‡ºYë½ÆŸ¿ ašy h‹zaœ ¦ A¾ÀJ]B^¦éôptàc´&Çg«âaÞ}pÜ]-ó¢Ô$‡,Q`Þx¦„(ų‚åÝâ%ÆBs‘7#Q—27A1t›šÖ‡!“î¶´pô¦=˜“ÙÎ=ò-ˤÎa˜Ý:@‡ýél2`Li¦éÇ_ÿºäiÜ0Iù+C°{zÔ®šÔð¾†íðžŽB…lQ `X]Ðÿ± áži„^T¿G~̹K³‘‘”§om€FU¸”q; ʼ-SnÙº™ÁFHy™¡dÆÒÅS{˜'ª.®Ï€UÅØá¨(•Ûˆ~E;¦VBâÂu v¹:¾Â5ÅYR•ZÐ%l–©½ºlú ÍZ1ïPBFÈN'ʪ½ “u}¦¼¹³Ìi‘Ó~1³b‘kž—xˆkæ{¿Gg®¾r‰±rO¦†Ü²íMó ›Ýå7Nxa..áÓ ¨I–V¯¦üލMÔm¹ÕÐç`-`úõ°}³\7TH_Ëò(oÍêıózèd ÕwˆÍ-BЬ/xÅ£8Û2ôÌkÉ`ò°C¸¹úþñqyoCÁ¤ß•ó*‚†«µ)Mmªûkm 3EÙ"eYhLB@)…œÁ Ø«…Z¡RôÐNÕÚ'Sä·B_‹2OÎòm™¦¸eé•Ü–¦Ø~ÞK±¦ ´óÃtvòù»~W[$û›æ“à ú&èS=}`ÜzŒÿnt[ym‡fŽ¿Rüð?£Ç_PKoKGÄ6 PKÛA‰;$OSGI-OPT/src/aQute/lib/osgi/eclipse/PKPKm‚;9OSGI-OPT/src/aQute/lib/osgi/eclipse/EclipseClasspath.javaÅYmoÛ8þ^ ÿk,Z)É)íÞ·¦94M[l€¶É6¹îá‡-Ñ6Yô’”“ÜmþûÎEÑ”ëm»wÛÔÌÃá¼q†ZÑòšÎ¡?µš5ŸBÍyÁÊš¯;zøàá¾\ ©É'º¦ÅÞÑpªÕ¼NOJ6g·æÑàámq»¬‹•ŠI5|,伸ùkYTbBâ4ò(Áy©ç°Î0é÷ö> {ä—!zÁÈk»%²’â+5áÍLÈ%Õ\4¾š²¦J­¨^äïøX· Õ¬¾; ”AÄ¥•âÓ`‘ŒV†uM%§0© rµ`w„JFø¼’UdÚj ¡š”´¿V1ƒ’ÃRæ—ù÷b :A‰¾ÿÀÖ¿=#O‹È÷øôðáƒU;­yiåìvtÚ Mþ T0”†]•ä•(Û%kô˖דoh©…¼#Uzúx„ÞB~Õ(vsÖ€TMɲüÈ"F«E,ÕÔ‘½á çÑál¹í× ¦’9êK¦Ÿ#Çß’ÔJ´²d*ž>&°ò–7׬ú‘ª…ñûÚKëúòK‘wÁ÷üGÁßrµ·b+ÖT`-•€=‘’Þõür»9D«Wmg¹©5ƒØHÉÊ£8ÇDËv7k²[L_ ówtõüRKÞ̈ý ÷[1©9K©ìúƒKXc{¶O1oôˆrpˆf1µ“*@Õ:á%ÛUa]ò™ñ†Ö]’é{uþËÇ“g'/ß¾¾(ã©°IG—˜Áæq^V`ÕR·Ò¤×Š«R@NŒ²³Gñ_^ÀyB—}ûÁ¸=`7É¿b;wLôB/¤¸QvKòT43>o¥9Y^ß–ÌgƒøòäãÏÎ7žFVˆ“æý©s~¯î·“þ`˜ØÑŽÎrâ¤ð2t ½àªèluÜ¡s¦Oi#^Ò—ñnîy¼Àå¿ïÀ×mØ¢ ÀQMa>}¤á±2tSdá~LFÉcø¦­k7wÿ­­ð9Åg=j襒Çb†÷Á¤Q¾fDBòå °•¯fÜ/g3B‰j§}¤ ýkøÆª¾ ²ˆ†Ê¥’ÁÈr¤ ¬ÐÚjÔB´uEæ¸:ÒI>_`]6æmÁè„«8A™âyµX¥ø`w¨GÜŠTÿ·hÆÏµà•óÃAlúôá¸M (šCqÂõC‡2+¢Õ]ò7áç%˜>ÝNˆà3’}‡\»…3_eyʇ=à{¡ßˆ¶©¼YlWo„†hž‘IºÚÜ7„˜+N¦JÔPó_`¬åýÑ„£‹uL˜¦¶ÇÈ7ÜÁ{Q1,W`áŠÕøÅd„ï ^CYYŽ“î‡zywEçïé’e›RNüž€RÞM†’¡ÎúÅlBÕÚY]³9­OäÜŠâ—ÖÍÒ§U!o*2²:*; ûž S?<9‚ç^+¸õ·¬™£¢áÉþ~:O§HCŽÔqqÍ–õmHAmÒCED¨ÖR9cTøÍ¡Gb*‹ùlÑD®qoÇh3à î‰S“˜=Q²œì×–Ö*Cª|CðÙhfˆ¼áòÝ8<$Wç¯Î}pÚª’¡d<8ºUÏLÛwJÁ÷zÜ$ܤƒ˜ä©q;¦Þb Êן9Øbr8IoÈAþÌÈ‚®±²à2JoÑ0)’ý…?ÏA`“RÇ Š’³ÕÕéyš‡ È~Á2}±1оí(hU|‰²!…qO )Ën^–_±ë¾³Êr›~L2‡µžhê;rCmN¨®ÅH…¯DÜ4ÛMꀀü†=®k8‰—+Ü(ˆ èPtAäj8åçBT„WŒnEš2scÑ×çLÃÑ>Wæ2£â³Y„'†ÚM=÷ ã §œ-M„×|úçDø7ŠìnìÞXüö›_pÔ?Œ³~¢ò+C0vÌ)–Ò cÅ$>Ê#Õô}£1'`-…¦‡Ú%öšÇsÝý6´-Îd/"þr´f¯Pº×`¬ìñácÛŠa­ Õëé"-µí M>Ô²…JÑ…ÚKS…ÚZS¹ƒªþ·qdbr‚íQÉ©Ì6 4Ê«¶2Û6zA€ï\a7ÂCƒÇ7tû´DZEpŠ›^`·è¡O@³·ƒOÀQri»ÀJü’A#áGˬ­IQD‡H ú}Ü{K¾¦šYÛu¡a~Щrýµd5tHkÖÝ»aâ$lÏâ©[Fµµ4PQ8Ú© ®ºö%ËÉ£GÄO» &Öšdº•#;ÚÐG‡WˆC±S°NfÐVdÕ0_Aµ¥Œ†²§á~îÉÝ#vZ4VÏWâš5ü?P‘ªN_ѳ‘XëáÒ7 TyMÆ‚ªw@ «JhΙVãsX 8v« ùF‹±iB;s`Ùó¡â£FØ™p¤¾¼SÐ LÊ|¶Ñ5t¿o¢–×åñã t¹[ »}2é/} y£†ÏP{fÚx²™ÂŽïx´§¶²‡ûK9œß³»ð…Î[3 º8¹ú”æ~®ÌÌ&Ù¿NþòÏ_þ½ŸfÅ^ô›ƒ¨ Rm†;¢~3w%I ®—sl¢ŸäÉhq—uý³wT—Ø-QZºXÚ‰d¤.ÝÓ-Nµ6Eز˜KÑ®†±PI¶¤ YHûÃíÎA sšÈƒ× X«eëÍâE5\ÛΣèièØÈ2zΔý>›Sγ䱑"woo!V„ÌðRã±»Òp«››î%+¶Cψ ™Èˆéô´m̪æ ⤇~eÖˆ]ÚÙ5¸èXÒ•?x00Sx{„]Y^ኡŽ|ÓÒ&Oí1ßïæÝE .ù‘ÖmËßg÷Ãö·ÚÁ¨/gvºô5TËU#HÝ9nªÓ$Ààmb̼ÛÄ;>©DêïFÐÌ-4Áö:BÅÕºÝíÇÆË’îõåqG²‹Â^Ûâ.)¢+ü>#ß…Ï"Yê-&¸Ü¦¨Á Mã”»Hú2l “òZÇ] OüµJ¯¿u ÁàßïPKkÖejìÍ"PKÛA‰;OSGI-OPT/src/aQute/lib/tag/PKPK¤{;#OSGI-OPT/src/aQute/lib/tag/Tag.java½ZÝsÛ6ÏLþD eËTšûx°l÷réÝ\gâ¶Wg&7Óæ¢ 5E²dÅwÍÿ~»Hâ‹å¤åxÆì.vû²¢Ù½e„þ{'Yšóe*éíâé“§Oø¶*kI~¡÷4åez²pIöQw’çêáÓ'ó““§OÈ y·aä½%YN… 5«j&X!¡dË ¾¥9ùÏõ["kÆRò­$YY.$)×0£ [¶",g[X¢Èí¹ÜÀÀ†Š¤Ëœá<=‹JYó%ìB¤äšÉM¹5#U]ÞóL%ÙÓüŽHÙ)z´X‘[& ‰µär‡â¥Jpx"á—wÁQî哪„•”‚ÜïâVQ,—¿° ¨•5)U­Ö™‡)Θ?}Rí–9ÏŒNpü0ÞÆ¯ ¶RÈEÏhsÍçä5Q“ƒŸîàÒRÆ¢ Wô¾ƒ‰-ñrÝÞÂN»{z«ï×¼ó^ÓêBsž ®,c-Úe…Mú쪽½§ùŽÙß‚þ/¾W½jDk,uI ¶'¯ëš>ØÓ’éÂP{£'ú ˆY|$$•`š€uξ¡’ý³¬·`j`nn4 B¢—¿&p]_¯V›Ív+Dzss3™.1´ûàu‚" Yï2‰¬%ÆPgi3q®o ¸`Vb ޳¦ Æð’.R|Š›AÓwCeÌFßò⎭þ1$ê”øº]¤ }úݶ1;§±ÛTCÎ^H>f*žP"˜ŽVHÂpB=5aüuËïYA¨ ‰Ù¢B<™’4«ýã§_Dµ:ÑNBŽÈÐËü»°Õ³âVnðñé%y5u}†®V-ɤ[ôÿ0#öOrJ¾ú0}¤•lÒ†ÐÚ£¢‰ÇiºYõ‡z•Ñ‘‰`I#Â"^¯VF­=½/ùʵ€Ùé{hw­€éìÙ²mµ“‰š¬gýbé苯I¢½èô½Ësj5“»ºˆÈÛG*KÍ1™þ![Bß§æoÁü·¬îÔËFJ¹‚Ìe‰ªâ“z%ŽÎt‹*¡Ê%?ÙµôVLd@`M¥.¬Ê #º‚.o¥ä4R ZÖTÿ;NMÍ cÁA¯3bê5ŽtM ɉ>N¨›F ñ f÷²Ç1;Äa]@BôAÓ Éõ£r eLË”5Ù€pF#PEcq˜8Bi?³£á!ž­ûâPL3<µAËDƒfê +| °¦»\bÄ)J‰?yÁV» ³@$wS‹ …ØCGqéR°¶`m¸™«ãùZS%çf`šz©³g±€’ox&yYÐúÁô4=;Ui¶Ð"Š“q5˜eú¾(ãt ÀÞøOœ¹¡5‚3mʇ¶¥¨”6ð¡{ªBô®Ë ÏWà~-še»Z@Ù—? #¥K>!Þ×\‚•ľéH¬§‰ ˆ žËäåLÍú˜Ib?Gì­œ7Be‘?4!B4ábÍkh’s[ÄG˜'X±¢Øø«Î‚u¶éºF 6Ðôš±Ñ’ ùån¨+ô*WSP”à&°Î!Š–%¤hh‹ŒÁ¾ÐÒÏŸ“#ò””Ó´‚)ûuGs¡B±W|àÔU¤.m>¶€i#=a¿)óδ³õ$E‰*¹×¥Æe×$ T®_‹~$þ}·^#—õSGÇ1zbÃàr$aÃÐm•ƒ [jG!5ꨣZÁb{˜Ù IµwôSíS=òs1±¥Í YTû™!ã¶fÕ‹‹Ñçêà£=SiÕ¥\L‡]=n $˜¦³ÛÀ83ZÙ-j[IøÆé$$/zǼüíêãrâa~Ý•…™¼˜,B éâ Uöñûu¢æNÉ´äĵ”~žø¤Z94…¾Q§ã;¼ö“m”¶©]ÿ/—¡œ"çŽ"ý¾µº¹WÒmgÍœµ•Ìvئ„ŒÌ5´µŸXp%§äÕŒü’¯M[‡fX”jôŽÖïh?_Ó €uèÈ"tñRm€ñÊN6ðĘî£O}ðôܯA—uW_̃ÕïFDˆ¸ïHg‡ŒYéA­íЏ‚gP‡©Ä¸*Vk´¦)•\ N+»Ê –ÃŽ¸ä,¨9UÔë0àF;ÝØçl-õÝž¯ä¦-øÝÃ:¯J<)R³ð¸ËŽˆð\¤°n›DB›wôÖœ¸á‰?= „{?@Šxû á¡È•K’ß~#É›F;)ï7°;eî$›b„R_©ÏÈŸÂ@z<€Pa±)Z=/ƒ({ŽE&Êæo›‚AÒ8’îy.Qùùé%ùsdhY3z·ˆ1»:ÀìöK2{~€ÝVƒÜþ2’›i~‡˜e=lNOGòp’ÅPÑò`[¿ž7k_}°ÙwZã€&8GÝñÈ÷wrÃG¹«ûÑ|$dm’}˜=˜6É^d¿Žd=8‹ÜÛ\Ó;fX4?˜ØK…cÙý†C?—ggQû«!2œë²”óªfRL‚b^PÉïÙ¼žp¦rSæ9S'<PJ\Áðgã•›ØÉ‰™…Ã3Sƒ¨3w_²ÑLfª¦Ù‚ ýzKµïjÕ}ÐÕãcǹîg-Á°ß¼÷EÕÆŠÖ P3àý²bæÄE)Tqµï9€ÉJž°54áBÍnŠv¨tgäUOõo^3iò»¥y ”sn^’¯õHu Ðån±€×ØÆµÙKм¤êÌ«-IËž’ɪ£ D¿]S«:CEš•ÎpJûêE­Šù9^j0u ÐZ.ˆæúäkË+.‚7HASãZ@õ4¾ÂìMàÉ¡/È&1ÔLÜ’ºÉoú+‡ï:Ô„sj¶¥HÏ—FPW€WùC²¡ç ²˜ÍÛ®^ëöv‰ŸuÈÃé8Œª>L(8سö>S(™­‰ÍÚÉɤÛ\[uÆl˜¾ü°»,ËœÑB½¶¥£ufâ­q¾¾pÖ¶Öx¾vI<½„€Ñ/Â!i ¹@Ó (ÊDlYïØÂ÷Õim=w΋(–•´f±âÀ+õ¤ØlÁ°-Ÿzÿ¦ô7$ŸŒÊ§Tf;ò Rk¡`¶ô1äýÌÕ¿¦ k>'+¾Ve„zQ©ˆZf Y`Wƒ¨ö}| µY œ¶À^þ=3¯¯ ¹E+UáždFOîjŒ‘¢°Þ„YRç-Úäã6/Äs¥;hlÕù+Šž\-µÒA;ÏPðcó.(%.Àù˜ÅJ"HÔhYIt©”g‚êW³lx¿q¼1 Ž //œ“õ°´lÞx¶ï\ƒPÒ- Ràß&¾KéyW± Èn™¸#6o?Y)zƙ dØE¸ŽX’óŠj¤;†§},Ï%Rw¼"g_yI çm€¡èdu+4ù¹z‘wi—Ïat?®nŽ(ÏíhÖ¶´ýd/<Áü2oE ¥È÷f1ã5¦ìyóÙÆg+Œ8¸VA<<;Ž(³§GþÜ-c5p£Îc­¢3Á>âC°ïsV;¨×Èɵß5ꢡ▲¸®'œŽÄ…Öñ¤&”Õ³¸OmÞ[-ÇüÓ÷gÔiZÞ2óåÑà:=§/¥ùÂ4_uù =oËŒæá‡IÇCæ"|)å~ÝÊç‚ÈÉ1¡Õ™è…íÿÌÌtþz¤£ÿPK§Ï•” Ì1PKÛA‰;OSGI-OPT/src/aQute/libg/PKPKÛA‰;!OSGI-OPT/src/aQute/libg/generics/PKPKB_ï8,OSGI-OPT/src/aQute/libg/generics/Create.java•QÁj1½ç+渖’°ÅK¡öP*^¤‡1ÛÔ¸2‰"â¿7³PÊj³9$3ÉË{3o,ªÖøO¯«ÀÚA ÷h«IÆwË‘®†Ž°ÐÍŽ¶/È_WøjVM¦ xCÔËH¼Ðì»ÀÄóï³sxÊÀÿ?(2Ýäë*¼¢FÖ·\·Á)*©4%,‘»‹*ÿS~”»«ö«ñZçªZ{ªú¹Ýïr`Î_êfë“rG U²…I¤·³ÐÇ!q?PKÁ<ûõfPKÛA‰;OSGI-OPT/src/aQute/libg/header/PKPKÖDO9.OSGI-OPT/src/aQute/libg/header/OSGiHeader.java½XÛrÛ6}÷WløI6‡ÎLûdEžºi¦Í´M“&?‘+oAÛj¢|{7 ¤HIv=ÞñŒE`±ØËÙÅ‹Wl‰À>6£ŒÏ—QŠ,A1=;ãyU ÿ°[5’gÑùnÐã_b‚ǵšÞŸý"Ë“Õ -¹jæ!ÎX]Ã_Ÿ~å¿iEàëÙÕ’Iš¶\²êõ')x± [¿Íÿëk¨˜¨ÑH›A¸eYƒ’–ÊF-VÍBÑdÙdª7fûËós³îœö`EÂD¢•ã.#DDð9åµý€˜o† S„E)r&•Mµ“vu5³C0†Q8r¸p?KÁrÍ0™Ÿ«ß+\Ãh6r´ú0qŸî¿VŠþrVU˜€,)¯ÁW#kvm¿˜”â[ÂÆ’ßêq#pC^èˆü‰ld¹™wcÝP¼”Ó·ìÖ×Ì–÷ÓÅÍò_>eÈÃ3_³¿-æ +—K>ø `6Ó€oߌˆˆÄåãI”a±”éx¢^MZr­o2‚7yzLÚrU^`ÝdfnýǦ”˜|V¹Äÿ%å¿(ÖïºÀÁtÞú8eÌhÕ«ÝhRzÖ+š—e†µÉ aÏ)UiÉ‚e5N[œ=F8¸Ù è^Ë׎ŸeœQ&ìd4Û]a#i€JvGÞKmï8§ïdm’¶‘Ø–(?¡©,EW¦ ´¸‹³úîÄ·ã·Ò^ص/_Z(E¼þ€ +³ãIßbE†µwÊQtÇDA6ƒ·y%×Ö­!4uòŒ¾Õgó5¦"¿)÷0ˆËw©‡d;:ž>E(©Ø£:. ÉxQûÐ30cÛjBPÜž0§‚˧ ëôG, `!ÊüQ{zçÜöŒàýÖt7µ„9*GÕ7Ê!Ô&¥™>â3¾¢žl:ŸÆÓûÙÓõìÇ`TŽö³Ì‘‚Å©W²ÌÈ®à]wϳ.ùÙc›LPl0WmSȹ'å3ÈÔÄÈîw\[¥ ¯¿ú´ þäɲ­ë¿4u4ò]^\îÚ.ªgN ^GjÅ.å‚à1εÉW5²] B'ùpePtR›æS§#•¢ÁºÓÓ€ì ]^›ã•öx²ÍFeK­ ‰ÛÞTµ¤Ûs­OŽj 4õN´¾µLdqJM·Ú‚pÅ%à=ñìw ¨Ë°OVªþE“Ï $,ø¨›ZÎè( MÁ¿g÷VªÝÜuÇF8W΂!Ø+¸›KG«ŠîD¬¤OTE?}Õó•òÂsÒ ûn*•æÎ£çÛ{AÛn*ž©—ǘë[AÎÄÊh÷s‘è{¡é;•P¤±1u·„J*»ên®_h¶"äè+„äóèP¹µÝñÔ´ÌCèÅLAüÔ$Vd7Vug''´2Þz8=Ÿêà >sPP=UöÞ)nÖ_ê=mï•aÖM ÿu©ç=ù ©Óïëí‹{´9yËM'vÛl"«Ã½ûû¦µÁ‹½ø«‹©-|Ú2åŽà»,Ã%ËnIJɱoïc¬$/‹qo®ï Rˆ'P¯©ÌÜëc®Ú›.ŽTMZµmT—Ž=ö\²Ý×$) ›³ÿPKZ„ WÆ@PKÛA‰; OSGI-OPT/src/aQute/libg/qtokens/PKPK~X94OSGI-OPT/src/aQute/libg/qtokens/QuotedTokenizer.javaVMO1=‰ÿ0å@v ZÁµ°H´ê¡R¥ Q©ààl&—w±½€ŠòßëY¯“@‰åCö̼™yóìMÇ«{^#ð«Þ`шi]<˜ö¥>ÛßÛßË®U~óG^ôF4ÅÇt; ªQ¢•&‡®Ÿ6¢‚ªáZÃUßœýt¨â*xÙßc×F Y3ílÒ0û5Ãgf_%œœ%^ØqÅM«\QlÚ¶ rÉš^ÉŸC±q_Ô²Uøk! ^w¼B fT ^‡xï–Õ‚«ÜΨòš³ ¡Þc–±°c ô–¹o–‰9d e ²oÈ™…jŸ@â|k¬ys©ê~‰Ò|}®°3¢•Ùr²À²×¦²5ê wÍX(¡‹! ŒÌ’!–êŒk„‡µºKØdwõÿÜ .KFN qsÞhÌ)Ř„P$>Ÿ){ 6n‰&°íf ®ƒ+Í̲³Îƒ ˜××°šw~~ízgÙ‹Ô1ôR4(k³Èò< XîÒ~îçs«~=u©ìÀÓÝ,êcO Ñ d!ÇùV êà ª8å­/Mˆ::°B¹_¬WU!´?ÚЬŠ`»tÅØT!'ºÚ‰ Á`_zZð®C9³¨äªV!ñcD!}ÇÚÆY>ý¹€ ;ǵÚR)åÐÈÆæLøKpU’wª‘ŠÌIC+âK? S-ÀAé+n;LàSº¾Ä öàåÖÓc)2„å ç¼oL Ü&mµF:U¨]DéŽýå…ý]fù(õà'V–'pxZ–;‰”Öèý£Hô (q?9› ˆÜ <¶bklm K—5¡û…÷CÛñpüë\¤*§tžo©!Ú'··“Èäv>š£ux%Ái¾™ä½Ê¶$±z}7wPcà\o cÜ?ye4ɵxûà…Jšü%žÿ௩8òQndŒW뚢â½vc1ï6n@˜M_&XÇ£Óœtèí.´ôivP§×‰E»Äç¡Ç×ø´8Çåõ]hsªºˆµ\£è\³7vá.«ÿGâãºH¯dß|9œ‚Ïf™7“Þ‚Z%D¸@¢Á¾ÿPK lF PKÛA‰;!OSGI-OPT/src/aQute/libg/reporter/PKPK[XC9.OSGI-OPT/src/aQute/libg/reporter/Reporter.javaÏ¿‚@ ð™{ŠŽh̽ÆÍÍăs9ꥈw¤Wp0¾»akúýš|mÑ=Ðà¹S² —Þ µQ”¤0†Ÿã5öh;寮‡¥i»²atGGp™/àm²>r$%¿ªpð6p,kr ÖZ@ñiUÌî…²@¶½PJ ¨ÊÐé¿;pÒí$vàIoS”ÿ ÷ã3Sd²2Ɔ0§U”Ý|ÌPKd(dÚ§HPKÛA‰;OSGI-OPT/src/aQute/libg/sed/PKPKÔ„9)OSGI-OPT/src/aQute/libg/sed/Replacer.java-Ç1€ @ѽ§è¨ àê VÒØ`S`2Þ]ÿòòòI…‘–Ñ9¨¤ïÀFRÉ(µ³”W6ýt¼¿¶îR š_™[›þU©çhž¯ùÿY;`RÌ—ÌB1LD©•qä7âL(önÚóÔNȤÏÀžýÉD×s)r’Kn-y€‚ü´…¨¸$_…2´:§QÐ ´ä9˜^PÉs£Ú¨$HkªvºvØÅí×—÷Ü90ÕypFTËÄ´%J¨œ%W¤‚ ù.ª5߸]¥2h@Ãx8ÝõÙôvÖöå‡ÉÂÌÞ@¦¼› ëCô´†—pâ03ê(ä`é^6²Du6Mfþà._ù%Å$ÕükèV:]«•±óÀgì¥#µ=%®tUŒ „:@|ÜàxW9XZîVf¤Œ·6±y˜6 ó,Eß+%ãZCUÌöÌQ;?ëbjå >ôp#xÛ¤·«ðÈ…Dè1~ƒxìœ9ÕÒâó°„Þà¤(jYu×7±¹T†ÈÑ¢_½¢U¿zx¼„GEqÛý!Ê>¤yaÆúÙ¶_"9ܲf{’]¦ºßö^N#ž¸ƒNE}ýì?|ÃãQ;9 Y¤TÞ¸ãòÍú"ùD`äù.;X&¡Zú· ½§§C>ó7$ßo,óŽkGEâfr)'oOÈñq²yO.’’Âø„å9¾.ø™ý,–ÂÑaA|:/²äRú¹ªD‹M=9?9€o³.q ÙÒ¨Zߨºòß°,Ù"ʽÝÂi•Ú.dp £ÃÏL.?‰7®Æ‡6±dÛÉvòPK“h-IBÿ PKÛA‰; OSGI-OPT/src/aQute/libg/version/PKPK¸Šñ:,OSGI-OPT/src/aQute/libg/version/Version.javaÍVQsÓ8~ϯPýd7‰'i‡a(¦×)Jö å:Š#'*Š,¹-wÓÿ~+Y²eGnRžpg:vv÷[íî÷­½Âñ<', ÎÃ’sš¥Ï{=º\e¹@×ø‡… ,Ìɜ܅»`ZSFc3Ì9º(#ø3²$©àè([®pާŒ¼ÐÖ—è¿‚+¡)fˆ¦­_K|åÏ7»Ñt;·8Ïl·3‘ÓtÞvûY`FJ4¢®¬Œà x0ÇŸÎ&§ï¯ÎÎ?MÞ¿AòüËËY?€ÿ¡óîÛð ððßÃá×ïý x%ÿ¼îD°$OM"sÄÈzŽ2·¹ÂæAñ›Ý'13}wúùøì¼ŠPJnÑß"þíäÍ[  ?I0*O¿\]¾ûûxð»þ‰HÞeñ.ºd·©jž„¼Ä‚r¤Ûyït—Wú(º+ ˜[àùÀ´¢s?TÑ0KeµMÂI[--ËøÊV驲UÙÀÞÒo•±Öí«ýt©iÁØ£›µzôØ.¬Ñv8zTzÓÚ`'XÄ èæú©µ sS¿ùƽM¿³ÔÜ‚UÅ"Ïn•Þ&Œ‘9f‡ù¼ëùø.&+!âMÒÚ ñ_©Àw(è4Ès¿êsT†ZF<°û9Îó¬Xùã ulcØÐNTv¬‘βqßF$ŒgøÈ:¤öIgÚ’ëiŸlH[†Ûim‰”§NzHz͉8‘Íl¬‡œˆÞ –pݲhg`­êŽ@8¶;°’|3P3b?šò\ñ®™V=øjÈ”Q%”õ%¹À|q”ÍHç;í¢gOÑ?ZÏ»h¼¯ ÿk««o!*‡€^Éð‹uƇ^Tê{ˆÚ‡*…çÓuÝüú[¬2-só ´Tšmn|„ÎH‚ &šJÜæÃÇìâØlq¨N©•1€iÊ´tOoÃÀ[cÜ}ï¾÷?PKN¯GõFPKQP91OSGI-OPT/src/aQute/libg/version/VersionRange.java•TÙn1}6ÿàð‚'I-ÈSUB%*¡©¥-Dy Qe&f˜v6Ù)åß{½3@Ô"±Ì¹>w9皊ſYÂ1ûQ+N³t™Ð 2-‹A»Õn¥yU …± £µJ3*xÂŸé¹ Võ2KcgLJ|gY3V@¶—v 9!´N“õ`ÉÊ' Äk&àI*&âî}7@yñˆ4øÐ5Åô)Õ¾3¥¸(Ðl4½CÜ=Ӹ̫4ã¤C òg±¸ yN:ø¸þå: wãÙ|òmús~;›Loðî˜Ó—ÿOjT{ˆ:‘mÓ‰ÊAæJ¤E‚¥ùŠŒ:È>à¡C)|æDç@è+Sñš œCÔŒIs‹—ÁœJW˜ä."IäÒZ1˜ÓD”uEúÕ‚ŽéYrÝlúÁ©«Fì*Ìà‰àÀòÓ‘Mß…´ÅÍ˜Ï F†ÙÞ4¤'ÜÆB&ømItºĽÈ:¡Öjëì“,ã ËF"©s^¨ñsÌ+¥ËyË:_à¤ÝÂTb”TkVàϺGù€Ác¬Çßíùm*['ÑóLòp¾CG¶¡ÿ˲Ì8M¥]gઅi Ÿ™|§™EœÕÆiï÷å-¶ž¹A7vø{µOvî«ÒþðDíÀtl= &¡;‚SÎ>~ªW+_.f!êV].)«*h‰˜©š ®Ö€º—Ý&ä= 1x[È‹¶Üïrpç&N¸:Ôû˜IáˆÄþï-g$ñ96Ìøl·0þFïÚn®‡=3áÖ“ÃñdožV_¿^,—{Å`Ñ»ÇÇiCÏkÐ XENuмÛÿÚ‚ãê¡À%jî ØþPKùDÿ|âPKÛA‰;aQute/PKPKÛA‰; aQute/bnd/PKPKÛA‰;aQute/bnd/annotation/PKPK]„d;!aQute/bnd/annotation/Export.class…TûOÚPþ®(ˆ™/æN§²÷ æVK}L$3þt;RSZRZ£Ö²„%[²?`Ô²S ‚“e$í=ßwÎý8§÷kýþþÀy1Ä0Ï[ÄËF5Πô¹­™F\½h˜–íÅCðŒŸó¸ÎZ<[>b= ‘Û·M¾ FóùPe¥{¥ÛÒŒZ‚Á[Ró…ýl†a\1¦Í »ÄuGHPò\XͶ†ïPΤäb6"a‚`Un›Ö%ƒ”ÍI@NK2î¿ra丠$LSä4E“äÔOJú8¥J˜# .*ºSígºô<ÍèÒR²¢k†fo1 Gc%RQ̪ðb‘aöïA¶M¯ KÂKûÁJ°ÊàIv5¦£7Ç•üˆbÍ‹ÃD/«è¼Ù àÖ©Ÿš°3¼NýLEc7üØÄc/â×N§“ ÐÉ>%K4t^!™¨¢ ”ˆày/ð’ºå†0ª ƒº½AuÇNHxMs·•Þpû–l³Sãû¼hÆ´fˆŒS/ «È˺p=aV¸^â–æâ.9ÙsOJ|æŽn3À}‚±ÓAšºÎ·ŸѾ‚V3¸íX¤8; $¹¶•¸nÊŽ«‰ôLǪˆÍíf¬ó lºu á¼cØZ]”´¦FÍö:%-¦¾ ya ÃHyôÜ57ÃêJs¦®U.Ý JZ.o(r‹ BuKƒóª.ê¤X¼l÷eËÉʼ«’/ÉÔtÒ¹„ݳ¡ï@>ZixЇ0Fx¼ß"ìÓ„o÷á)Â3}x–p¸߇Ð],s˜=ŒÀý­ü@ä$tÿ–C¬…‡ÁÍ`¼…ž…^Ñ­…7_‘üÒVØ¢»ŸVÎ2õü¾Íº¦ÖIõáá&d"&°Ý%<§`.4€›ƒB©¶z•«`‡róÿÊÞm³{اuž¢¤| Æ!2nH…YäþPKr2¨–ÛbPKécb;$aQute/bnd/annotation/UsePolicy.class…RmoA~¦…=Ï–ž}k_l+‚ZÎúú¡ ? V@’ÆO˱!Û{ä¸kÒŸeL0ÑÄà2Î)*$^2;³3Ï<3;s?}û௠̶Ň(”NK·¡µŠPùÚùØ—g¾§Ü+ BúB\ Ǻã¼o]H74°@Ø™xÿÈ,^›„d­Z|W&Ø• ´JwŽ ©×SZ…¯ ó¹|“(ùmià&aã_ø›Hym¤°L Š +lÜ",œŒ9ÖrÓEòMkØ0°NXžDKžè÷-ÜF†`tdX]IXÍå§LlbËÀÝ¿f0ŠYØÆ²ç — Ös¥ÒL ÷,ìaŸ»½žÔmÂá¬n§\ãg§pŸß=dz`!÷ ýf„‡ ¤ø¥e5ê¶dÐ-OÆ“÷]á5E âûØiÖý(p婊/K׫.Äå ™Z¤CÕ•MÕW Ÿì³OØ­ÌÜyM†Rǯ5y)¼ˆy³ÿŽjÆ ¥J±^'lÍNhˆ€Wĸ½Ùñ²'»ÌظêI%çgå, ó,I–L<þßydX„ÉúßÞ"ø;øëÜ^úŠ´M¬¦ ig€;ìÚ| ý‚ügÆÍáŸ&k`ûHãñÐËáð,Àa½ÉÖ®q$ñÏð<6?$^àåoPK•½_øyPKÛA‰;aQute/bnd/annotation/component/PKPKŠA‰;-aQute/bnd/annotation/component/Activate.classQ=OA}ƒÂ!Š"~$ÄÆÆ‹µÕ1‡(Gh¬–sB–»„Û#á¯YøüQÆ9Å‚D‹™y™™÷æmöãóíÀ Ž=—ê9sìÍ«¯Œ±N9mÛÉÔ6Îb§çʱ‡MBm¬æÊO”ùÝá˜cç¡D8[uI?Pì=6¡®V#7ÓftK¨¶¬I2n ’ŒËØ&\…ÿt%ôJd³YÌ÷:aÑú\ç‡^fœžð@§z˜ðÊSJ8×ú ‚D»8Ï-š¬>ÙDÇ‹œÐ ƒ("œ®'ôÕlÄNö.ÖÏÛ OD±¿˜æ/+uÚý‡î]“@Ø(J4à¡,uK¾°€Ê2ï,s»ROíÉ¼ÆØG9|1qôPKÞv’Ý!úPKØK{;.aQute/bnd/annotation/component/Component.class”}OÓPÆÏÆ:”É«ˆ (Tê â ĤtÅ4Ûìæàsé.Ë%ÝíÒvKøjþáðCŸNÙ .Á˜fÝù=÷¹çž{îMüüöˆ^Ò^š†åøçv$ôSU×¹R~Ä#é+Ýõ›-_ éæe”¦Fç¼Ãu«†^:=.ÔQFË}5‘Ãè…ŒRNÑ8´MúÖJHÕØe4nú*Œ¸ŠjÜk n1Ú,ükY˜Ÿ.;¥š·4ÊZß‘uÁh$^R£IDŠ7!¤ ³ZrŽ4šœq7òƒ FÙŠåÔlÓêÎA EБ®è™2öá¡•·*2.e³)ê’GH;c–Šö§/ŽQµKůåRÁ6‘e‰Ñ´ë«3ÙhÝê˾']¤J[Ec¿`å5ZÅO=Qg4†]”-§j[ÖÀØHK‘!ÖÈm êÜd¿ÇyÔÚö"FÔuŸ$ì¦ÇÃîLE6ÚŠž`ÙÛü¸{õˆ~Ÿ1ÄáÜÆñ0n Å/ÆhõÜxB퉶ÿošæ·bæ£Ù«•÷z1VñÛ+¤‡íe{÷c+¶2šwÚ*’MQ“¡D¿û}CsW ï¯#"ÌG„ä©N|5­ß`íœ2 F¥Âhið„*"nìêàqËMd¬^´L#Õ£²µÎp²Ãø¥(Có”& qÇ1DcàÛ ßIðx*ÁÓàÙßßKð<žÅß?Hð2øa‚WI÷a’Ay_’Ö!dé s]ËFw`ô„˜K››¡§—æcza’žCX¸îX¢­?BJN/ ­á»ÆzK¡ ,ýª[ÀkÚÆÿ"¢7pìzKïè}Â(èíþPKkKºÑ€PKxOe;8aQute/bnd/annotation/component/ConfigurationPolicy.classSmOÓP~]©€C'0|GÙRG|ù°…@„ŚʒÅOw¥Ì’î»–dÿJLjFâg”ñÜf$óƒkÒ{Îsz^žsÏéÏ__/”±¢"Á°ÂßE¡c¶ÄÉ…ðCº¾0m¿sì G„æ†/ÝvÄö·¾çÚ=I†ñ#~ÂM‹¶¹)¢ƒæKî1¼¨ÿÒ ƒ8Ÿ"7pÒn[øRÛÜÝß™o¬×÷7-†—FK¬UmÏn¸Ê Š †ä†àhHé`˜4pYªY¸ä õËÞ¬0pE»R+62ä{Ë@ i ªw ¨hÌЖڜ t†‰º+œÝ¨Ór‚÷¼åQ3Ùºos¯ÁWâØ¨CÁ$ñ ?º]¢p½È!åu¡8R«:æñTÅêêJ ½nèt , ÀáAÀ{¶Üc(]mt¯uäØa¥6ÄT“W¦ÆÜö¶‡ÜOq4¶ – ñŒF{5é†Ç»Ýʰ*/V·ü(°-W^ðô*Ë2„ú¶h¥xÉ¥Úº–¦: ùÕÊZ™¦­Ð¯”\›‘kTR“rrV®‚ô <ƒüorËgýX3;®œaâS1¸ŒA.Ó©̤¿Rú˜²šÉ>rV3ÕÇŒuŠüJ’À]:u’²Ìº[åK{=(Y&»¤ª–çÎpÿ20M±®âäNÌâÑ üõ'Ãs}ä›o”ÒE³*9í(ùs<^ú|-ûC!CÃ- r”È"¿êYV:Çâ°Ç%°Ÿ&žÇ²üPK«3¹JµPKçK{;/aQute/bnd/annotation/component/Deactivate.classQ=OA}ƒÂ!Š ~$ĉ!ñbmEcqˆr„Æj9'dɱK`„¿fáðGç(< -fæeÞÌ›·Ùϯ÷w8ó#ܨ—ı?6o¾2Æ:å´5~dgskØ8¿Ã*rz¥{Ø%T§j¥üX™‰ßO9r „ˬûK¤õ ùÁS«×%Ô‚l4t m&÷„rÛš¥SÆTœpû„fðo_"P m²ˆøAÇL¨dÔmzŒP$ÆéôRcÎ|- WÁVïvrE¨çW©-BãÑgëh.´ƒV.¶/ ÕbÂNæ®·óݘg¢8\ÏÓ·zÝác¿Ó v$òux(Jݓ̡´É›\Æ¡ÔsAᫌ#ÔpœÂWã§ßPK¬"?"PKñK{;-aQute/bnd/annotation/component/Modified.classQËNA¬FaE 1FããÅgO1Q–pñ4,-²;C`–„_óàøQÆ^ʼnº»2]U]É||¾½¸Á±‡áR=§ŽýúÊë”ÓÖø‘M&Ö°q~Ûõ«æ¡‡MBe¬æÊ•ùÁ˜#ç¡@8[½þ²hü@B¾ûØh·Õ`E ÝT›Ñ-¡Ü´fæ”q}§\Ä6á*øg*‘—B›N#¾×1‹×÷â:;D¨uSãtÂ}=Óƒ˜W™f„ó`mî.;¹ H¼óó,¡þõÉÆ:Zd‚fÐCÂézAOMGì„w±~ߊ9ÇÞbÂB*´[½‡Î]@ØÊKÕà¡(sK¾0‡Ò²ï,{»2OíÉ¾ÂØG|1qôPK­3ù!úPKL{;.aQute/bnd/annotation/component/Reference.class“}OÓPÅÏØ ò&ˆ (D*¾'“ÙM]R¶¹ð¯®\–’îvYoIøjþáðCOG`e.Ñ4KÏïÜçåöy²_¿ü°‹÷YÜȹßb-͆:1]¥Bíj?T¦¶Ú¡’J›5y*;Ry2‹aÉ3÷Ü5W5ÍJãLz:‹ŒÀJÏMÕÈ_K‘Z9¿_˜¶{¡uÝñUsO`Ü U¤]¥Ý –n lÙÿ{-æ'µ LP)·%²õbí°dÑ›"D²sî{´JÕ)UÊyÛÀ,)l'5Ý€rÿÀvJU› ó¤Vh¿$… G¬]² ,N.XÞ÷2N¾ö¥èX¦Ön§)5{;GUX¥Òm&gÊŸJå‚uêX5|u"0›Û4‚©Þ° òÔå 0s#Ú Ü(bðhÝo*WÇ6™û;âÃÖǽ›“¾\Í¡Üæñ—®´ÆêaÜñäg?ùÚ‰ë¡î$¹ µXi¿%ýÈo²wÇH`Õ¸ôšÔ\»œ'ûØøGh5 |ï"I°ì|½.°<8ÁéNšqkƒÏ‹l±¢Ãé3(³_t¾V "ùXþF0ŠdaPr·0F¾“âqòÝO’§S „Пgk±²ŠÃ8°2B”J—ÅMJì˜ðó¨Š×6…æÖÕ¥´Û•³ü÷b8„ã,Äâ·*Nà$£Mëg˜¼µÑØâb ûûTÜ#4©Ù}T9ÓTìÅÍa°QƒùR‡-oX4,Ÿw‹é]ëç0#)n¿³™| F}ô—àMˆL¹ËF»£^a„ Í'¥Å !L)P E¤`ŠIsD¬N«°D6"†½/i›)†)Äì§i<ÈqÂóòœ5Ñ’DߟQqçØ*ötÒ–~ˆvwût°PX¨¿QPÂO#ŒG”íÚ%4gT¼YôuP?=­¥láÚ[U¼M¸¶Z4“féi'Õ£"ªÇlýßI’Óê*Þ…w3½FzL?Ó?NîСnõ^ï›Ôp“ZÚL,¢ á|ïîï:3ªgÃ$ÁINO¦âÍ)—‰Sˆ¯PMéæp7,Û)l³$1|íLÊàû[|zfÉ’ޤ{þ/C_ú…ð„‚J_ìŸ6RcºƧ82NÚM\„)>>«âsø<+¦e2zšÃ¸Å¯ï‰\¼6qIÅñ%v cºd*îæ*}EÅ\V°Óo—~6_Ãl_ÏÀ…#ÖVñ®Çm‘ Û£KŸIE×…1]Dj÷³¸Á<û§LƒÏí…]~ÀL¥ˆ!J¼’”úóö¦Ž•!„0ÏF\œëñqÝŠàÖ†ñM¼C<‹£!|›yöÛNh~G”õ» šWXM±C›0ü¾0üA‰á’|á%fv4¥ÙvFs&ÅõM$'…™%ÈÎ1=%NmJ/>ý½¾~É$˹8à^âÄ5ë*V£Šg·Íáã]îÑaq‘ SxT\ñ„æoUT£Jœ·¿Wñy²šÓN¢Ç[Ãø 'AD¡/«øþNêÈ“r|3+»•ÑôxМ¶FÝi½:£Û%”q+çÿ þA\"¹^ÅU"4(~VKž9Ä¿jù]Ãw¼®ò³–O#ØÑ4‡5M×±îøn¸Šõ Ë ËMOIÌ~ÖIO"p÷jlçór‰ˆFú Ì` ¶º»án処§±>Þ| ÛæÑT†¡Ü¿AÝj¬‘X9}K¬vóW†"W{ðj+â Àï\¼·È}” ±Ï¬”º'+\`¯]dS)È_[—ÙP r£È ŸýÒµi™tmeº¶­0]3¸ÍÃ2ø;‰]!~€wÞ6·,£mjÊ¢ýrIôñ‚èƒ.¢°îÈY+UÔ»Ïãóاà 칂®ÚCYô楃 z/¡–âæy )xÛù–ë×+¸ðÊ¿©6âïÆÉœñÈ Œ—Ë…×åÒë=ôU´ŠqÕ1êí”ìå÷í,ú!–{J’§ù}Žq<Œva£b^ÎÎc :c܂ǣ¼ß[MJ~–¹ï ï!iu ¸¹á/iÙ€úu¤ŽÇçîmÎ"s½L´ÍˆvÇË7gñPk ¾90’Åzêµç³xÓ㨤â[¨Q%,›ësx{o¼&‘Å;Žw\|åE) !õÞ3ÛÇO{–›ã>ºò~·€­r’tÒ¥},üüÛ…õ™¸›D9ÈÄtSç¥]@/­h}˜ÓæˆLÉAÎ0:âC2%:>,i´ 'ñÊʈւâcL}/'KnÕÈ”œzâT0)Sà5â^Ï}RÒΤT'•îðšm¾Ž‹ÇkŸœÃ§ÒgjŸäG_ÈâË×ðÕ…¾¬’†C¸—Õ.à|Ì«_ ßp9ÃÓ\ Î_EÖsbN:ñW"ÈÎë¸Fžé«½ÎjÌã[ Zƒ—°¹>( ×ZÑRÈ⹡–úŠ,¾7ÔÜo$ý^nÉ⇳ÿ¶p¬ƒe3•*SЙäèQz1®ӥ¿ì&Qœ¼¿x?’þvºþ†ÉÒÓÃrˆßO/Ê”6òHø ~ÊÄNz]),&ØÏ½ž.h/•¶´á;‰_¹ÆÔ.“aãU¼T:f¦h“–u9-/„ <ÃÄÆ¿öÇúM)V†X§—Àª–X3üΗ1 Wð;É“?’'qÁ“?çxBÎüuÑXt°™¿¶(ÒàíÑàÅï”ú‡´þçPKºiF{*PKR˜W;aQute/bnd/ant/BndTask.classY |”å™ÿ?“ã›L>®„ AБC'£¨HD1¢á’"N’00™‰3ïzU©¨õ6õªõ`bŒŠ=,[ÝîjÝm×ÚÃu[Ûuwm·Ú]·«¶ÿçý¾™$ÃDý~Ì÷½×s?ÿçy?^ýìù—#OZð ª"+{ÒN¸-ÞŽÄÓáSâ­‘ÔV Å‚ yK‘”£k«=ÑÕ‰w*Z¶D¶E±H¼3¼*ŒÆ;›¸ÜÆѤ`´»M„Ec—J7E¢±IÈ:AÀÙÑît§£‰xJPÒÍÓi>7q'ÇcÝ£=éh,ÜM¥y¸lU´3I÷$A0oyîpNót{{,’JuGÒ›É*•èI’™”&zÒÝ=äe¥Tz j9í±hwŠ„­h|³“Œrµ|áÒ­k7.ZÒ²p•`Ìú|]üsy&MÏ…jV Лޅ){èÖ2·q&’JK4î,ëéjs’­‘¶˜£L´Gb«#ɍ޽ÉÒ¹†pE˜nc*&Y8RP9¨òüd2²Sõ`¦+‡£0ZßêlŒsßlT¸oa•ðëÛ16Æ»oÇÚ˜€ÅNoŽÒà‡´Œõ§³Ãiç͸0ç1 _LK$;ÑîHûf'œN$b)÷dO4Ö‘Û©¬šl” 4À·mÌÃ$AµGó”HûÖí‘dGs¢‹Î‰¶¹æ:Ù†¿§0„–%‚^<Sõƒj’… ÝÐÁÑW³:€ÅXbáTòT¨ME ¯I$·2 Ú§átªÓé¤W$[œvº»&4ÜÁ5-ùǽ­M~,¥‹¢ñ™TÖåjÁdÀJ¬²p-9ÂA­8“q•2\»dz§à¨JRË5<êÄ·E“‰x—£œ×2ð(‚2^oãllŒ"í…C²ª8´N-²mœ«6+´ë’º¢ÍF;˜Ã¥I§;‘¤Žy*Ç¢mawÖI†Ïð^šjÖYØDõò¥3þv’~0·üÍ.4p°@¶Úˆ¡K9ww;Š …ÜvДG”ÆN0ƒŠN‡Ò;ÏFTÍŸN¸;ãCŸoÒ8ê±QŽ@Û±ÓÂŽl™]­›“‰íšm6Î×€cðgUšñØšdˆh ]¨v‘`âP‰s›4ç­îlüT/D;æNUA MNº9‹§:8%‹žãò#’ApÁ…a@RóAµ¼ÆF•j)¸Vû:¢# R05³"p¾fáFÁäÏÛgã&Üìæ‰Je rlÖØY±,|aœ‹œp"Õ {x^è>›³PÀdÜjã6%;JÓ/’d,+vã5ø¢ÄDâpò­¤”î´qȣy°ŒË oPt•“n*Ç=¸Ï½DšáÅÆýx@ö£c~,Fÿ††œlNÄbŽÉ$f…ò{ÈÆÃÊo¬š*‘H·*¼ß´ñˆ.ªÂ«r…Hö˜æà㦀¬óã[‚ “ÉD2ìèÑ zæ ®àþ`4žêv™ªÐß¶ñžfDi‘H:A×L¦Ýož*>‹Œ…},6¯ÚèÃsЏ³#ŸIËÛL°Xx>× äìågý˜náE¤í¡[ÔIð¦k°½lã;ø®çóÜ2Ád˜È§FR›Ó&/ôà÷m¼‚Ð,ÖÆC]°4Òm|Ý¿³ñC¼ê‚ßPÚÃ<6¸`N þÞÆÔôhj…ÓÁ ¶+±´ñº"©AéÜüdüØÆ›º½ÔÙÁàHéÖV¾»ôí§ªÝ¿(PÔféÇ8åù¶ŸãÚx$¹mα¡ü>§8æµÊñW6ÞÁ¿2¾SÃâ»"´þ`̨п¶ñ= Fƒýø­ßáß©™A-×'ë[òÜ}Z$iõ?l”!àÇÑpD:—-ü^0¥ ’h{ãVœÉøoTèà ˜ß–JÄÈb…‘â­sð'ÍÿÿW¨(~.yãÔñg ÿG+,¼ÿWÎ9/‹t9~|ÊAƒÛªþb¥…nïZœüR¥ª) ERb [æ±ùk¶”ŠEVÛ"±gù¦<’^‚ é—2&åÌ-f˜H¹-¶ŒrÅW· ŽÂÀrÍdcËXáòhŠPNΉäN¯°¥ÒÄv4¥{‰.ReË9„"¤¢ç;Ÿ–ø¥ZYnLŒ¦‚S…‚m¥Ù2;ABy°«'–Žvs:×m¦NÕë:AÌ-ZÛ£±X0±ÍIng—íèRÐuƒYo Zrè0;º6R+L±å09œWG1R*àõ¬»Ú/G šN³eºÌ`Ú0eÒKÑMQ§Ã¨wÃG¦éOÈ–ì"# _êXBñD:Øåí¯ñKƒÀ iLÿÙ/GsPÔ£³l9VŽs«ÎŽ{çHåW®r™-U–œÀ|¶ÀG¾Â†IY™CK>§-’¹ Ø šež-'³¤Ý¾åc™oË)ÚÓ”´Ç)ÎôË|ÖYhË"u³µ9’ZF¸È©ì‹dɰ¾(×=ú…ò¤E&¿ƒi6áÊ9È€ôüÄ|•¥ÌWY&¨ýü&vxËäkïf·0#5 Ú=1mÆ*l ÏM&¬6×,Dà|ºYƒ‘ ÙN( Ït‘×Ç ­ÅT–ª‚`HzQþ£ñЏM,¸©¨-'%½Áðá‚tQWªsx?˜3z“Š8ìB¸³;{)œ^À®½þ”‹)¿èÅ÷lÅPý…Óµ[RˆÚŠW1[º„¢Ø]Å7¦ÀÎùr—‘BpEãJ½†#¡ö~¡ÙNø•­ÐEG°8ÿäAZ~9J–lLÒHž—Nluâ©ðÊžDÚéhÕÑ-Ù¡•çL};ß– äBAsØlÑÕ¬?˜ƒâäŶ\"—êE¬£#ïFš…Ÿu~¹œr4GâAE‘MQ–MS:=™XŒ<¢Dª1HïĨ-Y§Xœ½žÎw^Z]ÿÅZ˜‹zœ’ièV—m˜\kËur} 6µãíÎ×¹l#(¼0^°§§©°ó2ÂìM¶ÜŒR‚›üª¬2¹A¾nËr¡çâ“©Š¼x®íƒ4©ÛôÐnÒØÑ ÔÂì·?ë™÷½©L³Â{·£©¡wd‹  ÞýØÞÈ7lØúMÄoZINZr_~K–ç šÿ†0Íoå4„´å!yØ4…泎¶Be¬Àœ¥ß”Š·oޏA“^î}ØÒæu“òzµIköK—–d?qÜNÐÝf{_|f*Áf¯À(þ+A)ô¿y²4Ïrïi{ÏQÍScøæÃXþŽËWä+=zã½g•Gg‚yúõ“Ÿ‡ð­“xòPŽêùÔ?þ¢1ùö”¡„ÖwÿD)ÇPz˜‘èÇ3ïäÔGÏ_Û‡iµ˜±¶GíChðµvðµ¾Vöa¦þ][¼³ÙL5ÂŽA1æó—u͘¨ÅB„±Çyìm—ÇÇAfs§'𽘣9*’”Ò´*極Ϣñü”lîS|?éF `ÎÚŠù}hÞ¯ÏaQK]EKŲ VÔU¬®8KŸÅ¬«Ó£œS[—Adæè±8k+:ûu×¶TÄù“A·ká\z,nߦ{ëúpÁþ§(Ñláßíž–‹è<ÐüM_NÉmFwÎ]S©í44`:õšFI„pjxº[Q‡$´;.ÁÑÆAH—z–˜A;]Ì5áÞñœ½Œo‚Ë9ëºi%P›”ÖÖíCc¾{¥ÅŽ3T'¸»<ªú¦aª´®À®B´Nʧ5—'N–†:ÁW?Væ{­ø{\gZøž¡)CYO]éyêê=h­Íà«\ß2€ÝkÕ/·ÐÈ·/åbm}{ûñ Öx£s£zŽz½Qîñè>áÑy£k=™dÝ'-½¾²º~<#x“— Ÿñ;°ŒË³öà°¼ÀáKÅÕÅîÑý|¯¡šqs ¯eðäúÆøøü§‚Û«‹2øÉs*yÅ[ü,ƒ_šQ}Å»fôoÜø^c gÞß‹`mƒ ȉF‹ÿÀkÉâ}ø°í/š]Ú+ «KªJg5ZÕVÿÛèçò-eªjc ¡â“ >k,¯À±Õå0µºL£ºÚÿœøØ•âwCú9 4zqQuYu¹÷~^u #£÷à=7]é}ÞÉfÝ;{¼ž· ƾ2žèú UQ•2‘ǹŽ?¸Š^”I™\)ÁF[§iÆqz|*õ‘#o¹£ª-Õ ¥Ô6Ú†ŒQ6+ UÞ¢[fòY)añì1ýr¼ #s*¥I§ì¡üNÔàX£ÛNÞU*U¥Õ%/Ý÷YCFšëú…5uï§õâЖºŒ,v1FP)§ÕõI‹Itøn÷íeë_¤© ³ÐÂà>ß”_Æ”_ÎùLÓ•L瘉3˜(«˜à­8 «±kÐÎ7‡Ï(ÎF76Y7✋݈`/:pWÅ&dЉ ßgª¿†8^G o!·Ñƒwùü aâBÎGØ!>ìäåô|™€ e.’0.–Ù|6â29—Ëb\!Ëp¥´â*Y‡k¤ ×J'®“®—ëp£ÜŽ›äÜ,b·¼‚[äMÜ*oã6ùn—q‡|†Û}%¸ÓÀ]¾ Üí 2Ójq¯/Œû}Kñ€/Îgô‡|—à2ßµèõ݈¾½xÄw'ó݃Ç}ã ßÓxÒ@Æã ¾g<Èb AM!c&šd¹¬ h\é«•rçvË'²Š«>앤UΤíE…¬–5„•·dŸœ¥o¼qïµÔ®DN”¥²^ÎfµXæÈ9ïYÇÈFBŸêä\Ò+“u´•VÑ€´É‰pµœöÐ:¥°)÷!¸TÚÙ×txÉ•ÉQ˜”M9Èm¥ €ë*¥³R¢ÙÚ¢‰â8‘‘ós´ò§Yž!íg‡€çÄxN$8–šâÇ{×L½—´)xSÉ©Œã-Ò³¶¾¡O¶+Ødd'aÃŶÆÒ¢ÙÓ²š‘]eÍÒ¼ôWûMv©«ö÷ËEÈÞ\N^¦9éÏÏÉ]oךPÙM¤c-ôQöçØ‰ôSžç)ÿ Õ ”üE–óýÌ—×ûq×¢ø®ÑïlWâœ~[ä ÓÇèœjê3s»øVDÚåJ¹ŠZVà,¹Z®a‰9”¥±QÊzºñªEžÇÈJÎùsžqéŽ5ìœg^3e Ø ÖaNõe¹aiýÌ0(\§6xZ¾–…“„kz¬tÙ½¬hv1Ñ@÷`òÚ†ªâY}r‹kÃ]ÅRUÜ@ý:¿·y…ý€¢ É~ÈÚ÷*«äk„WiŠ“ç •3ɹՏܯJõm¦bÎÕ/b‡0Õ(­õ󦩫إ¤PÌgˆJí^Z4¯“²RÖO"d‘L©§Œï Ê8Áð~¿o°Žÿ˜F}GáM#W­K3'WÈH˦i|4}ÐHÃVPî ù}¡ûpu~Ÿðžÿé}‚¶¬tžì! ¸´ÂÆ…lš~Ï‘r3âgCZÃ’lk({ ò~¾ ¿ä™_ H™'ÈIç òn!Aôÿ ’Îä=žùí‚”{‚ÜUH¹;_÷ "y!Aäî|A>à™ß ˆmV™l6åekÐt-#gO>—?²ñýp—`ŽKyîêñsü‚Aå5Šr¯‡z÷¾xÊÜ¥êžÆaýò€/Kï·sÀäøxH¯<*Ç`”w©â›|SźfC)ÜñÎÌWäšëÓÌUiÊ—È£_Ž(ùZ¦ut>­bÒ*ÖxÖã…csV>-?i•@k‚ò„qηþ PK—Ð'Ä #PK¯TU;aQute/bnd/ant/DeployTask.classVYxUþo· aÚB @!l’¤@¥E”RŠÅP–ÖÖŠÓdÚNI3q27TÄ}Ep—º+Š©•OðÉ_|òû|ÔgyðUÄÿΤKÒùú53÷žåþçœÿœ;?ÿûýE«q^A‘ÀmWÆÖ#ÉxDKÚ‘z=•0û[´ô%³ò¥uZZ—2O§‘ÐÓº˜íÑj‘Œm$"Q#m× Li6º’š±tuâ QÓêŠh)-Ö­GlÓL¤×vJOGèµY·k7ÒIÙ#iØŠƒ¡V’Íf\÷¢å*¦À« R`ƨëM–¥õKÿ^T | |*JQ&P5’zS¦·C·Z´Ž!ù¢fLK´j–!׹ͻÛ`4s£“%„½OQ*àÝÒÓS¶a&Ó æ ,™0¨ºŒ‘ˆhz j¾Šë°€ö]º½Ó2{ô˜-†&NJN£Ö‹+XDû«é©X‚¥®oY©zÃbuèÛÉ’a:Ù¥¯ëT°\À?i‡i3­iúÖ%È@(˜oŠZ œŠj¬T°B "¿Ú*V!Bº¶ni¶I@³†9:¹}zXµ Ö°:ã¥*nÄM,QRïcºf{HhɮȎ‚›ÿ?µ¼X‡õ*jÀrÎ`¢˜$š›VsLK&uܼz1&©U¡#&úVܦ€^vM*nÇ&Œ “±D&®Ç%fr²*Ú;&âfÛ2’]µl˜ÞdœV 9[è¤0?’{[UÜFRÛb‚ÁñN÷ŽÏl¨UÁêX*ÈØ¶«hK·¸ay± ;e{îbGgüY¡V©ß¬¢w±Ý´ÔsÚ}´©¸íl:úoÒzõ¤a/™±ªGãé÷`¿‚{óÂwµTÜ4Ô“ñt›awËœNˆçÆ +ˆ Ìž„ê*:ÑE´qg.°…=Âl4/tîŒÝò€ÃsZ“i´!;µ« xÑ^™·ä$ÀZ¥FJÅý AË´TЬ NP­qÖ¹“k¥ ÂÏÈœzlÓJ^RÑçðB·,“3ªÀâÛ ¸í)ãfUt‚ð¤ÌΗ¦…ãC‹»sN¶|’Ù›Y¨UõK_á«Im3Ü {è¾ÙÌX1Ý-•£·ù*©E¤_1¿†ÿù±À§Â·"x¸+äg§r§ÎYÓƒPÃPÑ>ˆißbú9G{+?*JPŽJ>g:+ÇU˜åœ1›þŠ0‡ï%\ù¥gñÏÂÂYÌËbáwX ŸÇô!„špnånø붯pUn©)ñ—d±¡¦Ô_zñ4ÊþºâPŸECñº²ô]À¶v©õ—V•­ÄŽůd±ûüòÙêۓžSP«åªcõŒ§»Ý×3ˆ„Ü1³H»þ Xãq¥ýÃRßY<ä÷äé-UesæÊ1¢="púJ4\ÅãmüyrÏ ¼yào÷½8ˆ—/E¹ýŠ\VâõK瘓}ìº8Í<üɿ㹜îqòæcžª°˜ï+˜ÁµÌßzæn3æ¡ói¹€³h!³–'¨u’ß@(û‰6¿`9~E D¯a\&kþ¢—¿ùQ"ë³ÏÍ|®>Sñ;ÞÄ[¬Ìb¼OÀïÅ bzgX¯µDuï±Z 8BùdË>ìLJ gä©ácòæ2ëÿ >¥ÏðyŽ?õôU$!K[=„/ŠÐ6ʯ#[MÍ5®Y®n—|;K4Òã׎Í7ÿPKH´·Z Ä PK¯TU;aQute/bnd/ant/EclipseTask.classWYtWþ®¢Z²ooZÉÃfÖèÝOöu,û¬“×3FÊÊè®iåÂÕlÄtŒ¼në®e ¬ÍÛÖ#ãVØúÌœéîX‹ ø¬I#„5X¯a-Z‚hU*«K]¸UÃ-h ]`}E¿~ÛÖ/J%C¸ ë%ßí±Y@tʃ¨†f4P…”™3F çÒ†=¦§³†ôµÉŽë¶)÷¥C¿;c:›R«F¦ŒY#C²@hp6cä¥IN1»,{:©Ó33FÒµ¬¬ãI:¾Ì)µJhC qÕ©aºˆ4m¸Ç=ƒ©t,žª‹Tâè áì  ›¿Ÿ†]ØíaËD9d2-Ä® •Ôg†&©Ï^ì àÚr ½¥Yj¨ÛFΕ‡Ü+°ÝóRÖL'-gÚLž›–Ü5Õ¦‰;Bî“‘= po,U¾5´¼e»†Ii‚ 76æ*£5dÒLgð\޽ĖS¾µm° n¾àJð7ix³¬šF‚+îÅ[5¼MFc-OûÓŽ•e!Wê¼CÃ;ñ.‚Ò¬³©BV «íÖõÝ,+£ïÖð<ìYtÈ)Ãj¥%‘ª*˜&¼ïàvîjІàƒ «c>h¨Ò âQÚ¡^ÏÒ0U¥-½³¼àºÊ~ŽN±nYq•÷1¶¾—ŽèØŒm]½X•á'–Ú½¢•[¨lÁž(z(u“Mˆ;4¹Ì)‚—[SuÐÉØVý6\Ì/½CµñXñ<ÖÏ ®øx>‡/ðyÖc½¾ˆ/±lMöDïm« âPéœü .ðUFy%UÃ×ðu3g̺µ…_jG2¾©á[ø6¥e¬œ«³SÖ4Æ¥ÎuZ2WÃ÷$óæ©þ} ?P•1£;#J³SȺ•'Ü‘­›· ƒIÅêFÛ˶›ó§ÀÝu0V°ÉwóGžVÆQ/n©Ñ&•8¯Æžz“”ÇáÍM<ËÙlYGP™;f5r,;ˆç|ÑΞÁÏe¦ÏÈÕ ~)˽Qú_ñÊBÿµ†ßà·t«Tê%pO¬Þ«W§i.1Hðßkøƒô{3ý>lن§§}Ž+˜UU¥¯46ZÏ"Nyö¨Lhëjt’cÚ2žZ9û…¼îéÙÒ²lVê’ØJ›×p½>9Äqå“COÕ:Ä?NjÝ\¢‡Õ^Ž&ù»Ž»q¢~oOÌ#’ˆl˜C[b·MÌcã6%"wÌaËu{+Û( Äö;D´VbnâêNžjîÂÝürn  ¶qíçn»”æÛÊûÔZô&žDüy„‰":ŠHÎ!ΓuBJ/ŸCÏ"ú&ä¶GÍcŠÌý£yÛ'"ƒóxå5jzt‚Ô¶«HÍãdd´ˆW1‘ äý<ÞR„^„QËeV¸ÎV¸¸Ë-àOP—šç+7r«ãÎz\dz°ˆ·¡äÇáD'¹6Íãí‰Nâ¢sï¸DÓj0>T’ÔYs™c¶2ùÃóxìÚéfÑ!ºðqºRååþõ ÿD¢vÜÊ´sÞÈ€ÚÑàôáÀfä÷0¢Hó¦Éo–ázˆÜòûƒu‰*"†Ÿðû,¸Žü‹ßc'^äàûìÆ ôˆ öPƒ½"ÉÁvö‰=üI‚gˆK‰Ðƒÿâ“øµ~ýxœ)êã­&ºùÓ<ûL)q<šLZŸ|°ùë¥ñgU’^SIì¢ß. Œ\Æ;ðecï>G»ßðQSËïøpŠä+ åë2w=7mTUp…`ÞöÓøƒˆs¿‡”Ú»=%µåêIUOr5G§ÈúêÀ<®¯•®^ â~e@TU¢ä•ùŸ*ó/’ê—cX©âƸ—üáÎç Éüïè,⇕ +êÞbåUºyÂeÝÂtIƒ’¦xS0dC% û•†D˹‚R§Ã´sD¡¶y\eÔÕIزñÓ2ÖÃÔCÊî^Ä3‘ŸÍãùáËØ,ºT»,Vð‹«ø•çzn~÷ÄVÄn¦#€ŒùIª;Ê£A£tþI¾ãË ì.«ÒÍ;R•&æäñ'eàŸë¸¥ÖÀ šqz›Kþ­‡¯ÅºŸX¬‚V™+ð·úX=µX:±Ò«`5•°þ®îüãÿPKÝŽ¥})¿PK¯TU;(aQute/bnd/ant/ExpandPropertiesTask.class…U]WUÝS†iù,%-µ•¶>ÇŠU!ˆÒ  Ð6)•jÕIrIBfœ™TXË>øª¿@ÿ@Ÿ»–†UYK}s-ÿ€ÿFÝw’4‰Äú›{Ï=wŸ³Ï×üñ×Ï¿¸ŽÇÚF­»¥@šébִйràZÅìÏq¥ØÒOYþž†ˆÀP³ÞMË—êNÀp+ʇ«vA œIìZ-ÓvLuŽ t.ÚE;XhMl Dn9Y©£Ý4œèIØE¹QÚOK/e¥DÂÉX…-˳չ*ŒyÛ¸šøiT“2C=}å #ÝÀvо†+Ž—3-×Êä¥8NÁ¯Ð)Ù…ì Í.œ5ÐNçÕ0Lš´ œÇR“¶ø!µ‡. †Z¥À.˜uŸtŒ ['æe¯b”>ådÀë]™ (ŒM$ZúTՈ븊1 ×F^¦g`1Óìªis„¯;uÛòó h\95i` Óäá–‚åB‘5è®[n|bKìÀp%è;m:~ÎV&3Ò÷OÇ ^S‰¼.m|\wJkÎÀ¸AÿüfÿúbÍSÑ~ËÀÛ˜gÕ‘ÍjÁ Y”ÙÆgÃM´¬)^q‹x‡¼öäaRÊH£6Eñn¼‹e ïÑ¡¦ 7qKà”HÏ .4½]«Ê °‚4¬2h'o ÜÆk¶(h}°†P°Š9s3fUÃG½uq2ðìbNåzÝÀ6ºë™<‹%þ­Ÿ8)Rô×Ê=I¤ˆâ7¢Œ·@i»¥Ømx ª\Ë[þ‰¨ Þ6ð0¬|OºŽGѧøLÃ#Z×6_´‘ÏÃw $+³—ò¬ ›¿–ª™´JcƒõTÞs¾ ‹S ÝmH÷Pëd t¹µR8Ÿø¯2UÁ­5Ü+/o7bîÔ*N@ØÌ_«ü³éY]jX_qðœM´I\Qišn‡nmÂÅZ˜YÂS¿‚÷¹×(ùnòG –1ô=ö1²}ÄLM–q©Œ+eLcf{êæútEíuuµ1]Æ› ‘h¤Œ…çàçc¡ã)®E;žã}ßðáBçL´³ŒÄïèå&Q‡;eÜU÷~øûO¢|üà)úSe|rŒ~eã‹_Ÿ…nâk–n{Hj5tº‡´zév.bcÄ,†0Çù?a¶s)ýG¸€]ž\"Âeî+´'Ü•( ÿ@¼€{'0/ÎÅP¯® §ý6NB^¢.ž˜j;1 ëË~@gqŽÝ®vƒCZÄpÖ ‚ÇX‰V¬"\«±‡¯µuF#rX<6àJ½€&œæx†ßç¨qÍx-ø›|è℈ ” kE Âáíy&Í…ÇÛϾÕNùUq%9*ìk˜Â…_M³®ÖßÜUƶši¶}»KÊ;)]¥¤ã+gp6äïî¥Î>ßÂÒ¢Ô´ãµ~5¨‹¿ÄWרJüˆ³m¦­ž9lÕøÞ |Í´W°Õ9ÛÖ5ŽÍaKU§²õ¯óíPKìqªÔ`5 PK¯TU;aQute/bnd/ant/ProjectTask.classuT[SÓPþ!€”;ñ’´@DñZ@/‘kŸÒöL Ô¤“¤ˆÅ?à33ŽÌȃ3>ø£÷¤á.í4çd÷ÛoÏ~»§þþø `‹*:¬…RÀŒ“3,'0æ=w“gƒ´åoIˆ1ÄÏ»',Ÿ ƒ”¡mÎöÌMkÛ2lט¶ <ÅP[rrÜKs?``ë Õ£¶cã •š¾Â›ts\F%êÔBfh4m‡Ï–>f(ÈÊ8ÃuÓÍZ…˳Å{dŒ¶ÏÐe^ybÊ-ñž%7ƒüj'Ë‹í:¾„V†~×ËVÑÊnp#pÝ‚_.¨dr'ÈZ0´)¨BµŒtIèdPÎV§ = u¶?e{”Õõ>‡e­K¸A¡!´`9yc)ðl'²s¯} 7Ó\ÍÛÛÜQ…t*i§æ\¨|ÇöUF/ú…(·Z5ó"[J_ˆ; îB#Y­b‘;9†Á³Ð¹ŒP#¥_ŠŽÎ’ I 0ÔnÙÉТ]!l úe–pïܬd›±êz[>IJºÜÇÒ<σ¨ ºv~0tóbxM Ù*P#ã1žJxBZ^Vð ÔçªÐH“¢­ëÎ瑉mLÁ8ž“F/º¦O‹²ìLÞ([¹g,F›”¾.ã%&%L04Ÿêp2 ¦ÂQ-’.ÁR`e·ÒÕ-š›ah?Û†ô†ç~s›#/Eé¸Rº+4µ­æ’“Oöy0q|ãš.*K),ŸÞ»éBVyÉ-yY.P ×Î\•!A€>’ª’þ *èGCñ¡.Ð3Fºœô¬£7ƒV&0‰(»a@=«Cc#}¥ À54ÑJ¡à 4GT-!Í/ò‹TˉoˆÿF½XöÑþ½‡hY;DïÚuõ7ËæÛûÐ0x$Þ¾cÈLÒfdVÉ}Œ®~E“I›"2y€WG»á&1M},o(LÚJŠÓÌ·A£u€îõ:1†.Bvc=xGÞ4Ô° 5Ôc9*c„Êx7Ä<ƒz¼%¤ÐÁÄûH—qÊ$ ªN$÷?F­•«‡¬ñ2*b»ªP<†YÌ]âêÚÃÈE®AŠº‚KtLp͇1 ÿPKwúì…CáPK¯TU;aQute/bnd/ant/WrapTask.classWy\ç~†=fÁA]‰²Tc`961©Z *‚xdAEvØ`tÝYgg=Ò¦±­½Ï´iSí™6 mj]4$š¦‡mzßw›ÚûH¯?ÚþÕôùfvX~;ûÍw¼×ó¼ï÷î³ÿ{â2€Ûð/E«=)K Å£!5n…L5ѧ&ÉpÏXÛ¬&5gÍ+á&g-¦„L-a˜–f†vgÜU3)aAø zT ¥,= ëI«EBq¯>W­”©Iä-·:ïºêÔcZËn÷)+‘²$Ì›¾&¡4ª ëqÝÒ85Gbj2™P­QžVõ˜qH‚´GB‰v<¢%2»< SS˜·UœÜ ÁU[×OkÛ¨V–(X„ ~ ‹&Mk3Mõ„°¯K±¤ô^ Ÿ­PP EŒ ʜы̃OÂü°׺S‡‡4³OŠÑáò°Qcýª©‹÷̤ÛÕiÛÒpa(説×"\£7[rÞÈJXi˜#!5¡FFµe±¤ƒTJEs;}h ta.Hjô£MÂÕ„ÊZ'°15>굟‘–ºþºq›‚5¸:G4k—iÔ"Œ\ ¶.\PgfGK ^Œu2Ö2H×Û§`=^âȼêÐIš”= äR´à¥2Z‰þt¢(Ø€|:ɦZÏ.Ξµ÷lÏÌ·ÈhcÔ'{XÕãbP‚MX"œìP°4DOîÒ¢4PجØ#vlS°;H5ÆlrÕ]»§®¿atËè¢ô™jìÄ.nŒkÇ²Š¬ivˆwÙa’±› Lõ¶=èSpHH™aéVkù‡3øøð22¾v_³¬nã*Èsw“íÖ>ì—q7c™HÁ¼œ*™¬15¢uêf’¶­/€~>ÌœÖ 1 +k§ÃV˜P=Ð ‹X{µãÄ0)˜2ª@ÇA eÇšié“aÉ48·©ÉQK$K‹@%¦à0â5DŽHÔ_ømïô×íS´t©‰»„„‚# ©¼Ne“PS¾^½ã1ÁÒ2%ü“GÕd7¡µà˜‚…XP‚x…Œ{²eÅŽM.A¼,vqêµÔÈ¡>“‰ã¯R0 dœdHò£jg¹fúð Ë:Yò´hÀ2Cb:@fØùÞ(Á}h×)x=Þ@¯ÔDB‹G%4ÖÎäåL¨3jZ„ˆ7)x³à§Ï2œEQIÞ*hð6 Áës©oÔ4ŽÙ Öõûð:4ió1â˜39SÀ5Z( 3 å5stH¸Pž™Û\t;rÜq;‡ÊgÚE¸³ÓÞ%ñS.€ w-ž^°O$²E{U« \_2+Ç^…>|˜Š¹RðQ|LÀ¶ÅbÖÕæß’sÊIÂà±+º„­ùfX27‰2Æx{MaúË8¤Å“¡ž”aiÑ>ñ¢ß£™%xŸ¨?*á–¹U~q欂Oã3,]Ìv[XRÜ?u{ • ŸSp9ÅÐAêÖš™Èy&aï¼ë.Ëù=>\¤ãíj<7,’0 6=¦Ñ’I‘K=xBÁ„Èù4«m(iÄ­]ì;D~<%Rìr^fÍZD³™%ãéiÛ1K„à_À ´fšâ–«- wo‡DOÓE/Nj 5sG±qoŒ¯ÝrÄ)^kQx¸žÈv’ÎÏvÞ,¤z{¶ +f ¾­à;xµ]LôfÍWÔ÷|? £j,¥íd’¯žS)jW~²3ÓÝÑ5+;.ãxË”FO¬íÌtŽ óX#¢3ëSûG—!¶V#íF|Xaj—‡^Ͳ9^°—±X’¡Ì6›ãÏᚌ_“K7Þ¯à7ø-ÃK±û¡Ã†y¢7¢Æã¢Þ:‹Æl—5K–/ˆyô{üQÆ$Ü<§ þ$tÚÄRQ' I!ç/ þ:µg‹ŠžmÕ\"#ê`Ö³[æh9õô)St*"õ˲íp“À5L?öá½8ÇÅ¡„Oväe™ïyyë¼Ríù…™ïrû»”{ØýóYÉ·ˆ-¸98ŽÅÁ ,Dz ¨ J°\<ª''kÎÙ¢Wò¹ ^[¡›J„š *ñSÁ*έâŠâåÿj~3ÜQ„ZŽÝ|«ª¥ktH¸õ_Wkð<ª®¢luƒåõãh¼Â‰åW1/LãÖ4î¶œGõ´™jqèš%tAŸÀ&¹¹»‘ëíilm¸„;%<žf·ßFo³Çï)(Lco³g=ƒBžß3µÙÛè÷¦= Ÿß;Æ„~·Ð.¹M#i¨ 6¦aœl¥T&Ñ™C¨‹»Žž†ÜÆqï=ƒ›„ý¸o°üÕãx-çO¥ñƆq¼åJÕiT8{ß.|<ÇHáq¤Ù5¹ì¨3†"¶EXNW¦ßjÅ•h`\×1šŒe˜‘ìc È3õìâp¼p›ð(÷ÐpŒó·ïeþ²y·ã«¸×°ÏSÂø‹D ´›daì3áßx'q”Ð÷ã]œ c?ÞhÛ܉÷S7µuà½x„¿ÞﻄNj00f“ð>±z)' ¡ë)\Iãó§d©Rö{.?ô“Âl²5vîm¤Ù›Hÿ6Ta3k'ìû·pf+ƒ· ýü¾›k£Øa»·Ï18瞎/ÙÙ+FÂÑ"{ôeŽ\”½Wñ:YŽ‚ù,Ã_…n|Íÿ Jü:¾ÁTj$ì÷sΗ‘+®X ßÌ1ÀSB~µ¢¦^¸ü¾uߥÛáslº¨ª{ 6Õ9ã«sØü%![)à¼?›åµ'{¦ O®Hüˆž8‡7p·Pá V]À½ù†ÜÅ3ýS ñæ ñÚÅH(þqaYGóe RÖžYd-ÌÈú ~:CV=KR¾¬ý”u`Y¥¶·~VXVu¾¬!ÊŠÌ"ëçY¿À/3²Î’%¢ ¯¯wøþ«.VŸßu»ÖºÉiÿÜXé¶I/Шò{¾ŸrK•îFòù¹Ií+ì’ÜŸªã,‘>V°Þ€5B+TZ^÷‘4×"J%¡f1K æü ¬Ú[•Ãì5äyr']’þ‡àO³ÂÄòL• ;0•ÍØñà¼'¶QƒÇ¾ÎY«Q¹ Û##Æ*콃Á šÏ®¦ÅÖwhÍõ¶9ê/«°Ž»Ÿ‡.6WÏõô?PKÅÿÌ'ÔPK¯TU;$aQute/bnd/build/Container$TYPE.class…“oOÓPÆŸK·µ+p òOAÝ2Aðß&a.5™†íXl|Õ:KJgº–„Ïà—Ññ¢‘øÚe<·i ¸.ݹ¿{ïsîsî½ýýçû €%¬‰èc˜2ß¾•k¸;¹F`;;¹RÛõMÛµ¼¹š±¥Šˆ1 ìšûfÎ1ÝVNuƒ=†˜¦nU¦+ÿçÄ-­úF-Õ$õ}MÕ6‹ꬔ_iEÍ`ˆ«šVÕúÕÍí¹z±²­ê 3z'– MÇvmAHgêä©ÔÞ±$Äe0¤ÜÀM†D!š2’®œÕ ûží¶òåL=IsGÄ‘ rS r8L*8$9ÜQä s¸«@F‚·æôCa¬¹Í`¯ay5³áXä¡ÒnšNÝôlÎa§ )rê²;dnßt‹³éLÏ‚e,`QÄC†¡s…t|kOA’¦ç™Íöç†ìùr«]«éçË—t•ùƉ¡êG†•Kv)ÓÛ™€…îÓ*Ãêù%Çìtò—eü÷:ÑaÊz;ðšÖk›oÜÀé‹|"U¦Û-×ô—/ˆ ½ì­Qz¥ì‡~¬Žˆó•*:®[_¢Ãè;I¬ñûP£(E1E™Ç¡q~H£ñk ý Ñbþ´~€©!á×1­X£!ŒÇC˜áv"„©¦Åf¤ŸDBúëbT7â]LèF¢‹)Ý»˜Ñ1û–êÃ=ú—)‚¬Éöý°—¿ôYDÆ–¨<^ ˜Ÿ<ƒ3a‚& )Q;Í+¤z3ÈFò'´+\>ÒŬñVÈžîoC˜8ÆüÂ× ÙØ©…$-¼åÈR•S,{ŒÇ¿À®Ö ´"o=ų0>Ç‹°HF¿<^®ýPKa°eÿ”ØPK¯TU;aQute/bnd/build/Container.classÍWû_SçÿHrB<\«µ–Š€™m­-8+0˜¸ˆ ]ÝNÈâIÌ¥]×˶®í.Ý¥ÛÔmݵc·¡+PËÖË.v³»üGÛ¾Ï{’IP÷Û>|>yŸ÷ò|Ÿçý>—÷pãßo½ `?þ¥£JCÀ|4—µÂÑD,ÍÅíX¸'™Èšñ„•ÖáÒÐpÆœ5ö™˜ Ÿˆž±&²\“qÛÒPQ[ñd¸óN®gçR\oŠlˆ¸gdl°—'«£™„d{8›Ž'¦¸¥ÏZéL<Ém·•N'Ó\I¥“Žá@ò ³E=Ÿ™%D”Û õr.·ÃÇÍ·k†ãS 3›KÓÁëw•»Q¾r˜žCñD<{XÃ+-:r;X·âg=¯!/×:ªañÿÉ£Û$Tüvõ$c–Õh4°fFKëh 4ì0PŸHwØäHwÐáÕqc­C:š5l+µÐ-±Ò^Ü«A û°{ÅF‹†--åʉ Úi3•²1 핎–-åMuz±¶:é´¿À) ›ˆæýÀ ÞlÒÙÔpgK¹ Ï6a¯Ðò7<"u¨EH‡ ðmÂaÑñˆ†Úu2Ð…nV<Ó;“ÊÎ)ÖÇ}ø(útô’ŸÕÃ=Iۦˬnjá(ݲD… î(¸ULE1}Ì@=¤™?¹™¨•1£Ò0ü‘ä„išé¸Ìó‹®ìtœ»cã”ÊË$sé žÞº‚ý&¼U’WÝ„a#B²>eeÌˋڜ˜ŽÇ4ìºy5‡—ªƒC'ŽõöŒøxçOHfÝ)Œ”ÔOø”hx{éèŠ8vûTm(¸ÚG·p³;—ˆÙÖðÜL4iÇ'ÄE¶8®º£ Œ¨~»›·ì¸^ïuú©Ç:›3íLIrs\èù´iÄÙ‚“Ùi+½¾SçrÚÌLKýªüé½³H:žºöŽ þb#äå Lá€çx©°êùaYž3`"*¨OøŒ«ž¨]ÑLÒ&Ö ™fZËÊš¾°4#o»·‹ÇÇ-IVÂø×ÁDâõÀôžŸ°Rªt|NÃæUœâކp™ê¡›döað^ÔñE6° 82ðž%5 ëœÀ 5_2`aRRë+¾ª’1Òß=Ô54¶ _Ã7t|¯óz/ |SZmÆb:¾Uh—ùœëO¤rY’a™3>¼ŠïH6?¡ã"ë­p¬;79i¥­ØeÆäËà»| {kÔm/¾ÏÜ99Ò×þ—ðÁû¡ªÑ *"5z?µŸèU5^í¿Žy?[÷}âhø¹$‹‹“/~ɆÜ,§/ø5~Ã0f²f:›9—ü©øŒËñW$“=¶•˜ÊNK˜~gà ,:©â”'SåÞ–þ _ˆÕì‘°,x×äm‰Åºl›üµD*5ZåÀ¬ø½zÈQLZ©oã]ï2o=‹Þ“çÓ=a'3,HOÚÊäl_Cy"WÅ™§[*†‚›i¾z‘Êa—o<›®¨!Côöÿ)×IݰêãNç«+îí>êý Nzl3“j]Òºp󽚟«:ä™£Ô _jä‚7åG#?òT#ß!jßA¹ ~µÆ.MÙYÙ‚­€ÖJLA;\ƶ`Û"¶Û±3p-bW0à¾oÀ=ö4­`÷˜Ï2>Ô¶„V;Ú BÀµ„ðî[ƃ‹8 -âá`À³ˆÎ€~µý>¢á"jƒo¢gýó¨ t Whºçïƒt[tѱºV‡mt¶@?ǶãQì`ÑïÄ$îB wc–Ý1B­!ç 8Ž@IB¦$!©JIBSµ’„@—’Nðún% y%Õ+Š)yŒzÒ§SÞL4¡¯§Waùƒ!’1ä?y£mš¶ŒÇ¯(råFŽÝfÒ½GyÙäh½ô½ô«ÐV) Oä-£…*eA å-œU´°—Z”…­ŽÆ ‚Ë OI7¬æ€;ø.¡¾‚ lb—ÆÚüß[ÆkËøÑÀ<öKëúi‡+àòÿb ¿º„&YøíkhØj™\íp‡îkX""›Ý[c®÷ÿóÁ<Œ‹ÿÏ;2„èa'æøWèiCì`` {™L~œQ]«gð4sö,Oçø/Ê,zÙcNá<§îiŽx’i’ãìi­¡!ñ²Ú®ä™^5óøÙå^²ð˃ÿe£zFÕñ^ê!HÕ5-”³:]kÖ… ¬HçÎÂÄK^[s4ÔŒ†êç[–ljÅè]j5ÕÇ"M‚úÚ im 7ŒihWÑ&tÌ© /k ¶´F1Ä•uØÙ–ÉS¹¿©jƨ‚&bìCK0ÜŠ žhk“Ý?7iÖ…ì#÷CÌÔ†#c7„LÿnÁ††ÔŽÝ–D"-u ÁXÌ¡ úKZ›êBàKv¤µ¥¹µEP÷΄ð¦%]›œpÓ<›™‚¼ÑЪp,̳e- *=NIïÕ †õL™uER$¨(­êÀü̉‡¢¼ÖØÌp,¸¤!Ñð–Õ5„›Â-S!…£Ò3"õ¡\Gã=t&”÷¼r‹&ÐDìz}(†PLK¬iÁVÇ ‘Å9$h’EE”ï¡£1pr–Ó¢ÑàZžj.E¥M¦ð§ÌL€{M±¨FcÔ lbUkã’Pt>O”õ.RlXŒ†ù·SYZxÑíÌÈοx¡¹åk°±†š‘˜¦Y©û&—•ó4481XWCz:f&u?šV†êOƖׄ°ÚYTÊë;Ñ¢>TÀ¥J‹úÛ¥¹ °K'Y4Ð.ÕX4Ø.lÑ»´Ð¢¡v©Ö¢žÔ+¥S,:•NƒpÄB-¼°ÊÖXKùðûX¸xôns†EgRÒ‹6˜q3ï‹Z¯Âtžx¨Ö0ÉwsË£ÑH4—–P)\jÑ2Þ·üh(Xo [*Yݲ<Œ‡o¿²Î7ÛÅ™áhBÍy‚Š}?y¶Ð+µ2—©™wë,A‡fÚÿT³ms'Æíƒ˜á0#/­?ͯ1Íé‹ÖÒÙ0+Ëlf ^˜lçqyNçXt.+Mv8fOSÐyOÀX4D‚Ø72}WRt<ÙdLyh½ >™Þ[ôºØØnS³¶*ØÈÄ}…©äÊ›ZCÑ 1×yt ]æ¡Kdl`ÑÏèrAyM¡5-å ¡ÆPD¬O‚œYÿÜ%f{=t%ø—Ζ\º‚®¶èçt ønª­™»”etöèÙÌŽë,ºž~ú`mu¨¹û Ñèúi*W¬‹F°ú t£‡6b ™Þ[tÝŒqšmýL25Ã>¥V1S7Yt+wæ™8ü\Ë3¼Í¢ÛéÔ'µh­ Qg’4fïµ±ôXŒUF¢!‡­ét·E÷°JõhF‡ØÒº•ó£Æ9 °I4wv³)r€—hÔo?» s¼2„if7…V›BAE#7™©w²®k›v@fÊeãÁ£“›ØŸ5µ°/ÝEv÷gX+vZ´‹ÁšAeÚ’X¤MmµêY˜¦Dz»_ÓÀÔv[´‡©ñœæ™ÙªÖAO°†yŸâ\i÷¤^ÛzƒÄ²† ×sóç,zžI²¾Oôâa^´è%Þļ0|h]"Q#¿´èWܶײT#kSÏåþ‰Šmaœ±úÏ °6€Bx,A‡3Lv_ru®E½)ŸK–E#i”½» “‘Ãச;x["¶ L÷®Ám½-‘/zÚZÆnÊh£É “*iÔ¶É&udÓÇôê#M˜ËaI—u•7†ë“ÓD§ìÇäÞô1öŸkòŠ»žy#ÔïÐG0š.ŽåÚe‰GÀsf2-éá욉J^>Ô‰¤&ÿ7sÿ?#µ ‹í>±Û{ñKKüŠT`‚65k—DÂu¬;^ñ t%“KWˆ×,ññ[†ª-ÁhKla˜Í]F·˜)ÿο°5|Z‹-Ðvò+Ý[zÅ›Ð'Îð²ßü£%ÞfuÏK€œ9|Άb­ -¶-ö:VÔ³ÄçŒ$¼¼|Æñe§t/ø:¢œßå‰/Ä?,ñOŽÆ§‚›\õ/Kü›«Xí£ñ-«.L9T‡ø%¾?€¯&>ò €Í©òJa‚|Ø™‘Ê’ÚØnØÍ`çòd¶%=Òk ˜Ã]A'>ž&7бÉ^z†·²œG´,Ùa:8×€TȧìÜ,!ùW äxRSƃåBÓ×´À+{ET‡–†ˆÖ…ü-ä´,_GB1º p÷‡›üîR®ßïLÝoÿ9<†ªšæP]xi¸Î¤PåÒ+ -<£4r^Ùª8¦!¼„wÏgɬñ^6í¬ï0Zr%ƒT1{zõ´êZ®jI?×yËÍ/¯®šVÁ nÉðU†ø@!ÆîüX¯ ŸV m7cŽjøWƒ>VòÇ`x8¢6øO®®@-,´ähþžÕÁhØÆƒY²˜Í*¯®ž[Íócɱr‹1K4§9&¶Î&xåxˆÇdGú§x%ðG®ÙD0=¯œ<Ô)ØÁÌð.ê_kò{%B¾ —3; =Þ3,Ú¬&±¼¥ÑH£YJ)b ¯>åÀ2?y4²š3™ð:ÖÂÌ2GÀÄ6Ò$&sÓ#M¼±Õè“)ÃQ 7UÙÙŽ0hÂbÑ*cãs3f ¼¿ÃµjN^`.†Vu˜Xþ_Ù6A‹:žPbƒÎŒI·dXvY¦µþß ÊÞþÿwAGþz š°Ÿ áÀKp%úpVäÈCîßy‹Ù T'·»Ù?\‰-Ü/ÑN†têd¬u#e÷"dgiÆvÍÖtÐs¹r‘<•­þiFûÜ®ËÆFCÍ‘($blµS8È&S:Ã’gò gîªCu­ˆ¸z‰%ëL|æ‚bsÒ€7!K.eíc¸œ2±}ô¿ [ô/æÒJ„Fv©Ñ’MÜ£›Á´ã$C‹ï8kMF0åÂd÷þ€IqZg4Ÿ‘r`Tá)]å$cêPÈU–\-¡Ýž–Èñöñù˜ý…‹™«™ÈÙ–\'Ï1&ƒM§dÿ€D;_ÑÁè2L$?Aÿ}L´94ç/þ.V-M:mî¦Ü£ÈÃÏ–d´.×[òd£>õ¦COüN»üÀUi÷rPeçÛ<òRÄÉÏÆD—¦E—µò—›—õÊŸ!Z±Îîu®?¶<ÒÚPoÚrDðþ Óâu‰"è¸CÞ æHFŸzÜÀˆu^ùsÀ§L.‹qj™mîÔÓÎõ×Á™FšÖú[‚+1¸ß}éÆÜ¹cj1®¼V^ï‘×%2ÊÉë 1Kô¿H—ܹù pJÅÌþ-y“¼B³"†ì—0wq…Àv¸Óçã÷ý‹ çœÍ9éÌHcÐdê Gg˜;_ ±/Xt¹ü0'M?ëöÊ-¸§›3^d›%o“w š” jœ(<þŠ`”áB†¶|¶ æ‘÷Aüºf3ØÆÂœ¶“’yr«|À’Û8³ãÅæ/Œ†[B¨½ù̓–|HÞŽñ›Ë¸Üé‘í‚zwÖ’»œÔ~$òʘ_Ù†ÈZF]è)zó!F" *£Íà_†\KúìøªÝ Ì:„\M—þ¶c|Šùý4˜uå÷bsÃÇŽ‹„ÜkÉç$cWc!8»¸8!îõ§'X@ƒŒ¶Ä A«ÿ'QÒ!¢ÅR¼C¿B4(Í>ÿN2NIÏW±¹ØHÆí¿±äo·ëêòys½òw‚ºû«P›ã°%jƒIhùŽW½ÙæÌé÷t÷ì•ѪˆŸÁ¡Ë\Ç’ïšãƒ>á÷Ê÷õwZÙ»é´e`ï•pìn›P¨-ù†|Îà¯ü‹ òù Z4 ¦;¿/öÇÖ‚‡k¦”úG¬3S5yT@ôTÿ)þÉþ28OõŸv®W~ŠÕž0{Ö å5ó9”ù«%ÿÆ¡WO;pž½¬) ͲÐnTÌ]ˆ†^ù… å6íɆðd—èä²QËÃË–ó=ÇsF5DVsaê¹þF¶>~'cÃëDþÈR¿ÛÃ$:ûƒ¼-1ÃÁ¯,ùùO0 ÖÜn1‡NÌf¤˜R¯ü— aóÙNÌ¥ÎõC&°òÊo @,=Ùl\ª ¶ÆBx÷4!×+¿‡›wu0ŒuðŸR¿W^Ô$V”øc¢0ÓIJñ™üìýxU(LGP×é B•>CyùXä”ÿ–`_8\j椙yšËœÌn"3R‘n¤7ãÇ|sã‘§ÛÓR½ØÜæ†c'7·DêÁ®Î·T6=¹FÍÍíô„؇¢|f`£Í鉛avÂ.Ý4ŒÏRÝ鯘 d®QzÔàÄu§qµ96ËUƒè ‚j÷M¼œÞº”Sõ‰CÕp`suøŸ¼Ìb¿´Ï Ôá–ÉÐÚÓZmn2¢O¡¥F›„,߈㫋PUd©b®Ô`M#Ÿlñª±ˆwÜyúqBQÃ&ÿ`êK»fCü‡sÆBa©ñ"‹ÃìðÙ!®˜h©#Õ$ƒ~ á¨%ÉPç¡Qà…Ü s¸”½MŸŠ®ÌbÇ­ç[X™™Åa<»·¥KsÔqjºGMë|ïkm¬%Ôh©j&(EøflKiž}Í ìj„´­7{mü§:AÍñ¨Ù‰DbçÖ–:‘Ïì=æžTCت*-UeŒë;léšgѯ鯪欪*vy^5ßìFkˆï^܆¿ÔBK-Rˆà²Í¦`5ýXÌ2 ¯:…SRpƒ^…p‹xà3,u¦âK"@Ä-•‘úðÒ°s©bܦ:ƒgRo©Z nwU¡ÕöŶ9‘Ïî·ÜRa¾’µšÑ‰W­äË, ÎþX˜SrÕØérÂLV-Õ ",ÀÍ|¹nœÂpb´WýÒ_èU«ðÍ E­±ÔZN[æÎ õ!i!u„W!ÆÚüÈRçñåW>U˜Ý´þçUà"uaš~ õ¹a¤º@]ÄVî'i†yÆò`´&Ÿó‰) Ïî:ÝŒ<.YÊx4ãàmclKÜêt‘uˆxÕ6e^71¯y WYêjöbÙáØ|Þ|1‡J½êZlŠÙNh6›×»Ÿ ¸£&Ø’§®Sgxp»·ØŸkŒ1ó-u«dvC¨iDbf[âÂï ¶OýB°uÓ5³Ÿ)9Üí‹ÿ¼Ê;,µ…Õ +›Ñ´4—:T›¥n£‰¹¤TšÖ%.ýôJÞ~sîúp“­–279-2ÍxìÃñé§$ûŸ`*0 šþcm26*UÛ,µ¥¯"‚W=h©‡ÔÃØ½wÌÞ…‡4f·C=È&õFÚ%hèAFdî–W¦Ýyq¬ß!!ð >€ö˶K‚fþ_ðDМÿNLlVáÿŤF/ð(D#öÛ’ãê.«§Do¯ÚË'MXŽž·Ô |¶À>'ŸÙ ˆVËTŒ® Áx¾FÆê¢áæú%pP:à¯1ïì!¼ê×l°×6^å[ŠwxÔo NïUZÊØÅî–«^c_ HŸe>^ù«CYX9ì Œ‚XBx–¸­ D€Æ9;s5Œ/ú¨wÙ…½ê=¶^-É;^ø?Á‡_œÏ7«5P¸)âOmé…ZÆ0)Ϩ2Üî_ Ó/ÉKéu¯KXø‘ãþð¨¿v:æ>‰¤TE°µ©n9[û}ô[¯B ÆzÕì×46°š~e©¨ód®rCeöëâ :¥üÔ>õ/Ký›ïàç˜|'›y®ýÖRß©ÿ0`imʰôÙ^õ±W•{¢¢Þi--­´)5Á ªä…þ´Û÷Ò7:œ,ö{5@x–ßS¼:OPÿRÐo…EFÐ ÊìÓÝ,Ý=q/™‘­í›@¡¹¡ó!z&sFÀ\2‹yu>|^âðÇF:þh$Ò2 HDXº¯ê‡¥0¢t³Šµ.±¯±› Ís8‡2b?´;¹YæÍ@K÷׃LF*C‹LÑVF¯)Ô2öäêŠýŒ§‡êaíO|Ìá4¶ôp ž _Õdc?ƒÎÜÌnjnM@H&q¸EkEOˆŸñÓ…œ™1#£§–.bèÖ«®5Ê7mç‡C•ðBá‘.¥ÑcÌͳýGù©ãha bP®>èHOÁ®)Ͱ'­Ñ÷±S ŒÁ 2¯ Ó9ÚÒÇèR{/+ƒMá¥&@ÐÉ7Ã@ŒM¼ƒˆ–áýÂh°¹™µ9Ó„3ƒØ, r"ã§‚;i[‘¸8®§P9þÒÓ,úBOgžg†ª^ \Ÿ7½©¾¤2‹—…¼8±›Õœ4z5•œa VâM£3Mé6¯> )_ÃJQ2 ¡JØ”€WÏÅ«Ù_„™&CÅøÊ,lj锈É,xÒ5–|NÏ·/‹gµz‘G/L€]XgéZ½Ø¾Å_ C˜zcdP~'߂㧂¦}‘ $AlÉÕ§ë3=úŒÄ§Uúó5ˆ›½úz4ç ‚‰?ý“ÛbÿêN»™à!ç©m<èÕ€v=)­‚³M°‹Y²ÔÒË4q5†“'åg`áþć÷v2•Í.—½<4±¥Ëƒœ+«‹46ƒÔèR—aþ¶0ù»ÿþÃN/á×™¥‘ `¸±Ùä,¼g¸_iè%­Í½*UÏæº‡ ½&5m» ¸0W¯Ög³j¯K¹§ì6H|vÔ5§Ï4¹ÐÙ\gSO KÏ™2ÏѻǕsZQá©cÒ £ÅÿF{õy°m#ޱÎI‹A\øžèäÎå9ýöŠîàÒE–þ ƒp]™m²'îº1[Éæœ±{ŸôYcY ö3N2OšùÎÔZ¯F¤¦cS~•¥[ÄP.ýÜR÷‰?ä©úZK_§¯çÓ»5¡:Ð3g‡~ÿ„“Èl:¶·žO8eƉ‹\½QßäÑ7Âø¤mçì&x¾VûË}³¾Å¹{lAÔÛ7îwo3Ñ0>êVKoÖ·™ˆ>„Ì-LÃd¿ôr€x‰ué3&¼þw£°÷ÞbÉuúÎ.§0 w¦Þeé»9‚õ4[€ b\w¯¥·r¼—ŽU…–ÍUGãÎÀû„.+Ì£ÁxhœSjåë¹É/Ë=ú!À»SÐÚ°=ÌS3¥P4O ÓqK·›/b±òÆæB´™ ¤â˜ßîëæP[nø´/Ä86æP‹Áì-›9ÅTÊ·†°É–~T?æ|Ö•ò™dçïŠR>ˆã)í±Ä÷úqfèì ‘G?™øè»fsÙIÿé'Ä<ý ~ÆÒÏjD6:´Šó’ÒCÒ.™ÁLñcŽ».A÷/쟵&ªË6~Î×&žMö]â¬3–‡š½úW‚Ž´oV­5éCÛJsâ|¹™™m¤Õ¿:ØÄ7´–2Ì5¯QÊѯè×<úU0)©÷Lsl9-°ôoäq`À åó¼úuØ/D!üÞ>–пçs ‘ :oXúÍÄ<¨óê?Ód¯À Þ±ô»Ü€u¾Ü®öê÷8‹gnóì‚èéÕbÕæâTŒk?¶ô_¸gNâ‚ €ð§‚ŽÝ´ŠA­ŸcC̾Z²Lx’¥~ž[±ß™C±ß¨Øo“æÔ,“?̸~VŠÕ˃Ф\ûƒý)ŸåÅ1¼ø9» Á’¹Ù`>}æ»v|Œ#y†€CQ>õ§,ÊÆ/~Iò’rS~çáw·”ßÝ©'ÞMü§7z~õ¡¼ïkÞ÷Ãïþ)¿}ø= í÷À”߃ð{pÚï!ií‡vúMü©¸ó<Ì̃ø+1óI£ð·—?ÖwûzöçOþQ®Â›b*Á›1øu,ÞñŸ½EœÆn$n#­¤#;è¨Úv:æA*ÛnL%Ϋrc^b:’ù%ø m”¦¡ÌQÜtCö+0Wã¹&PÔN34 Äf?Ls’ÅŠd±*Yœ—,V'‹ó“Å¢‡iQ@Åiq $N§ï #7R¢½”×AKФ~O BÉ9—bˈÆb“‡VûF‚qG€}e`Ý,°­šÆÑBÔœJã)H(FGÒjšdÖ°×AË)lµÆl¿0¥ #Mi%JÊ𢡠/j :,j½EÅÔX[Ü;¯"íMgì1 ]jõÛÜA{¹ƒö¢3¨ä¯üÓ‡ÝQÎFÍéÞ­qZ]Q§uÀH<TY§ «ÚhBÉ.ú© ÇéŠRíÓ¥Y>ÝsDœ®º‘ºât­OÇé†Ò¬€/«˜‹·Äi3Úo´ñ‡ÚÈËïÚnfr2-¨ÊÌt„Pò`öÝ!}0¯Ax;Šf@Tf‚å¨E¨_Ds¨–N¤Ó¨Ò¬õ£Y§;kõÐIt¯ÑN¦±•î32_F÷Ók$|V¨AumG) ´4Þî@ÑßÂÓnÿÚçÐÃï²!ç Ìü `Áí'vPG- µÓã$j‹ìOV£pz1˜°¸x›»S çaÜ“°ÕªÑ|èÚÉ); §nö2úË;73{+”¨–&:Ú7Oæe µ7N/l (½lv-KoU[Ýq³M»Z3†e÷q86ŒOSºHÂdÌ# 5›¡=:èÕZhÅo*ÛÈâ2tòwfyó <þ¸‹þ$¨ªß×§wÑG,ûªŠ¡^‹Óg\õ% À‡húÏCoúo·i¾Û´Ñ4ýÎm÷—ÖÚšº‹X ¦5‚u,î,ÔG±¨³ <­¢UxÓ í\KWÑÙtž›°¡IAÚì*ÍfúA°}êFJaÏŸ:¥Rò )˜rKWQ–F‡ -²œ-ëlQVà!‘¾ç§ìGVb?„×µ®'£@ˆÖÔÃ"' yZÐÑg>,²“êßÛØ˜K@âR˜‚Ë ú—§.p þB®ë¬hѶ´Y]•aV‚?¬u:w:{ˆ^éý¯MéïuWÕ§«½Ñ߀~:æl ^¢_í*‹ _»¼¥À.á—´¯s6Ê_ôâ3ž³Kðý"Q˜—(T' ó…ªDa]È£íyÃmv´e# dËÊõùb ¬«Ñ O ]Œ ÄŶZЭAW´ÚmOJ´…CÈ·Öø²ãâìR¯Ï»kµ§ù#LÓçÅ$óÅùqq¡™Å…É Ã¬û¼öV»cÜ`Æc.âíl—pEW\žR±€+®øÕ!®©m×™ ï×;›d Ç/ð«Ø^ž·`0{Ê¢Ôãó°Dù²ÛÅ\mÆ~Ï™1?h>$µ9Óôyâb“MÔíò6–~Ûh*d4§º•æ°Îørö˜gõ.͵z wËÝ“ü±zQ$_•¯B7†Êäx¿(ðuD7Á0Ý 5Þø±àã6x¯;à¶Ðº“ާ6šKwÁ/Þ ðq àý;èBø³ë©ö(z>†–»áñöàOÐËð/¿„?yÏ÷àOöÑ^úŽžô‚J/ŠQô’8‚^•ôŠ8ƒ~'–Ñ"BoŠuô–XO7ÑÛâN<·Ñ»â9°é5zOüžÞ£Ä×ô¾ô¡Ì¥weúL¡Ïåp<§/äXúRNÀs}%gÒ÷²’~ ø#I!å:¡äOð¼JdÉ{D¶Ü…çSÂ+_9òU‘+#òä„%ßÂóÑ]~(zÈÏDOù%žÿ½ŒÍ9VÖı9›äqc±L¬wÍJuâØ)%Ö‰…â^±•´X/ªÄ}x›…uåŠûÅ”UMzÈFé5: ë “³½HlGl¹V‹½±GÞC=ì’A{ÎXŒe°#1‚x²±¥äû‹zœc9û&¬”òaüÆ(;’&ík_g­’¿•…Ô$í«ÁíåLÿÇ›—CäÚ%m ½½8¡$q±Óõ´}\O+ªJŠŠY'®ö㢀m™¶'ÄØ‹é à(O ¢|1„Š!@ãñ,Ãh¦ž‚Ë]ÏZ˜é—‹0T" È6lT†} œåVýÜV1hå¡ñ´—ö¨* !Ùo_Zb/"»Vû²È‚­Z\<ö,åLÁ585üóñâé;©G1—_°çÓÏR/þýr¾øu\¼ºà¿^Ïoìo1çzú4[JÛF[E‰2iøtQ’?ãYÅxê'&ÐP1‘ÆŠIT*Ž¢ãÅ1t¢(¥ZÀ¬°(£Ub*‡v—ˆi†_S H¼Ôå×¥â‡_—ŠwQ’¦ô'””iÇŸ¯–‹÷oôƒ.Ϲ§ÏíÙÏíés{úÐNòé„ç}'ÄÓ†B·€„X~ÿ&e²;“Uh>—rðLÊf7W6¯<$òìŠ>ÉL¾Íçƒ|MFò??dòû2“_„æµ ¿(yÁ_jf ÿ7ƒ`‚\€òXÇÅVŠáZ92Ú%þ.Èö’YmâsȉíQ¿`µK|e{L—¿æúP©W”æø¼ùâ›]â;iÞæúrŸ¥¾Ü|Iq)!{ŸÇ—;®Tf¡mÎ^zŸ[„¸EZl¤îÉÆs3ö°3ÎóåÅeî:œŸy¥à _žÏƒ^PŸ%|ÞvÙ½~ëš@¾ì•-©U>OM­.®auãy˜L;ßÐ>´(Í¥h2HñæË>ö^ù²o\öß@C ¬áaòwÈÐrÇ)J}5¤Ó«ôE>K§ù°¸a¼ Û…wk£)¾n®Ž[%>k—ÁÊ9ØòpV *’£¸‘0º9šº§;ÓðåîÁ}}ž²½óåÀ(¾\†+r‚ Wì)æ•ð< ,µ;’ó¤ 9Šw›Çø>¯G8l7< ‹RYvËc`]è®’m¬²¿è†Äß³(ŠDÔC4S/q Äs0ž~…ÑÑ¢6vÍkh8›–ÂAÇĹ´FüˆÎç!Z9Ÿ®Ð-âBºSü˜îƒóÞ).‚°­‡³¿˜ž‡Þ¼*.¥ß£ü–¸ŒÞ—Ã_AWÒ×â*úF\-X»<âQ ®CÅu¢Ïqâ¢TÜ fày¢¸Q,·ˆÓÄ&àÉ[Å9b3¬Émèu»Øˆçf±E܃úvq·x¥×á?DùS±:pŸì.Î’¢YÛä`±]-vÈ)°ö¬ˆsÂI›°ƒòXY†^˜ÒØH §|”œ ×­À½q¨=*:X|+§Éé°ƒÅâ=9@#œz]–ãé¿^Ç£\Û+g òˆò¼Í¥[ æì‡òè>h }ðœKyô $ %ê©FÎÆ¸yâ#瀊%>¥Ãä‰(åÉÁã9¥`[b¶æfž²Âg¥;Ï*wžsÑΞÝ<ìº=ò`€¡w» y’±oG9ÁXN .ìÎIÚ6“;?v¥Øµœ„]ãÒ+ÙùÉV¤“} dwg"Ëß2Ùªt²O‚ìSÉ.ø/È.H'»dŸËD–ÿ‰ df$;/ìK ûrFÞ~û_­N'û Ⱦš‘ì¿þ &ÌO'û:Èþ.#o»‰¦g¹Òȉ²tro‚Ü[ÈIþ­º$”ÖA΂¾Ù!!Ô…kŠËÅ uÛå)E*.O/ŠË ±ïUm4²$‘ð©ä Œf/öcÚ„jÚF\%Žÿ:ÖG‹ŽC;u4quq»\Ö¹ÇÛè±â=ò‰iœøˆ¦ˆi6ÊÕ‿OižëÅ_éF ŠûðŒ‹Ïèiñ9 󈺾L„o: îC{e³< ¬G>5ùÜ)0@¥hü×Û˜+I7º%!c²¥ËOgèÇ(PIJ³]¶¶ËµéÑÆ?Í lHÞÝ…¤Ýå¹òGx/ù#Í$—çºwã7ouâ  ²È/|)ñgòö:.9d¼oòy¶ìËDÄ7°…ßÒñÆs‚ø>%¢8ÒΑ âÔÙHô€lóÀuŽ(Ž4Øi%Ï7Œ¹ c¦¢·Ï p2÷]™"e SrÝYä:LòƒQ•?Î@5û T/:U±)Õ܃PýÉA9ðï T»„êÅ¥úÏ T{„êO3P=Í¡ê+Ú­7Q÷y  Öeíòò=`3àhQr#R²/"ø~ ÚŸºáÙKúRõ¹ƒú\ _'Ïq%ü 3äs Ã8½hwöÀ²ÒFxWá©ñ4^¿‹vÊklÀÇóÉ—7Tíκ•ìólsaý#ÖËGMf“ó›0g†Zg¤ÏÝÚÈ*Í6ý³÷À^+snÁBøy'¡MæiËÄé0W €½ò8ÀÊi4°¶XΠ±³äñt”œE¥€®'ŒVÈ94mj)O„\XЀg@ñ,YM›ðûNYCwá¹ í ‘ä±Çv—íÛ ³…)ñð™öÝò1²ó@a·Ü†§ù8JYt6! v-³ah/Ÿà³ ¾ ÝE2Nî*ãòɤû4A¹<Ë> ŽæôýHÇ3ˆÒ¥ãé.ƒí6ÇxøÀ ¸|¶ªHp{Im©g÷¤l5) Ñ™ÏS5¾TwÈx­O·ËJ½"Ž=ï\È?¼>KddoþáäüF2E¹ªÚUmÄÖDh¨l†ŠžõŒb["4M¶¦¸îTõL°wºYį2ù"Â<‡Ry7¶†Rw“/ù^¬Ê#½0ßËFöïƒåâ÷‹Žì—f?K=Š)€,=5%«ßÈÔC²}ÙEç_*âLý³4ÏçÝ} °•w°„yRm„Úݺ~<à&¢ÅDô}M¼\TÌá|Ž`~ußæV½æV¹Iü«Ü—vt]”\3ù:+L–ª îìJ5ÉŸP޼”úÉË`‘/§#`Ëä•4K^EÕòjZˆçby ¤ýZHúu´Ïuòt‘¼.Åó ô¹AÞD÷Ë›šn2[rªˆÝ-yÑ„†Â”~oD‰Kj*SâpQ£Ï“F ²è:ÍÈ>6sø¶ÎK‹i¢ÁZ9)pãEÊ9=¡YØÌ7ä›] ØÇxÃì“ÿ¯ì4–ðbð,“Ád[¶Œ—o/ÍîdÉÇ4ÍXv2aÁv¬[©Ç”|ž=ÛÞo9½Ý4ÈÛIÇø§ä;ö„àìrŠÒ£QÛ| b‹yÚ{¿‚`ïï† ¸êu/,ßVX¾û`ù€åÛÛË·–ïAX¾‡`ùî…åÛ Ë· ²ÐAQù8dáQZƒ=;[î¦-ø}öì<Â^´Ë'i'ÌÅ+PÂc¬™peâWM?1‡ºlßs­à;]¬àršg¬eMEÆf§ØÃ÷\{øhßw=åŸÓíá¯ÀŒ_þ’Ùšiv¶‡uEKpYl1ÄÑ"·%ÐÒǼ'À$•¢JOÒxsUeXñÜ “=>_~—û6P^·Ñ8Sów»FrÍG>gü“=¾Óé^ñNùei– Àðd¹k·ºkW”z>OINÒ/.ÛK}}Ù(Ñ߀áì8¡¾NäÜòå¿YT¹ƒùõ­ùû?øÛÑ&g§öü] ãJ8JsW› ¤’NóvöNÕÑ{µÊ—]³Se'ÍӅ؆fC¥så[°ØoL¾Mò˜«wÞÞx{ŸFÈàþL“ä‡0]Ad?¦*ù ÄõSZ‚gXþ¦ë3ˆêt•ü’n’_Ñòѯa²þEoÊÓŸä7ô¹üVHù ¿Ãä¢Hþ4gâè„$ˆ£X S9Fú‰aˆCŒaÓÏ«\ÀÃ,(Þã*‚MWÑÕN–ì&лMn,aÎL{e%Ú+s©¿Ï>hâà”4ȧi¥3æ!ž“Ïw!Wen+õ´«È ŠyÛãªwZ_õ„ãêE–ÊOÁó½]é­ `ª¯ê×ůÅrØ+l±OàTÿ|5 "Î ¨Ÿu¨AµEíjHe‡ #ª†U¡Í˜é¸U ql¡ °”7Öú²ÚU ;Xs± o _±5Èœ=uƒýͶÚîïËÚûÃ>>3Pã=F»Ô .Uê-Ž«£}Þm :Qðì (³pA…t%]ïÊâbFjõPé¯:Œ†ªT¨FÒ5ŠŽR…4U¦Ù*@'©"ªVÅtŠ*¡ÓP®Wc© mÖª#èJ5®Áóz5žn@ù&5‘6©I) q‹ÃÌÙ¾d5”ÎWǨR°³V«Éª óƒVƒk¸Är5Å\²šM‡«©è‘4Цbplÿcé¢&Ã’uã\Øu¬QyUÎwlW³:ïS%ØS±Ð¾ #âjnÕÀ Ô­$_”¯Ðød°yŸÉìoÛÑÍ옵PM0úÞ§ <ãÅÃúdxÌFf›³¨ÅN$G‘š|uji.·ƒ©›¹úØEu:(¨%×ÞD£ÉšvUçü¨¤tŠËÚȶdjhw¨†ÚD‡vÕÄ&KeVškÚ™©%&3É ÞËØ±V®ÀЫw©³á°aàÔºÄéEÒ³ÓÎ3 Ö—·Ç·Qà[6ÿ@ðè\üw¾}á,ÌìP°¸ÿ˜}miÞîI¹jRN óåä0Ã<|«£(®Ö/䣜o¹°>GäänþÁŒgÁ¼ª‹}Öû™µ Q¤•¢RTbs/‰Ç\-ÞMc±ñÓ©ŸšA#ÕL*RÇÓ85‹&©¨Tͦ™jÍQ'B€+i‘B”£æA€O¢•ª†¢j>]§N¦jmQ ÁƒEô´ª¥—ÕbzCJ¨Óè;uªê Q¨Î3ð¬TA1W-óUXˆç©jžX¦B¢A-Íj™X­–‹sUƒ¸X5‰›TD´©f± åÇTTìQ1ñ´j{ñ|IµŠ_©ÕFQÖÛBëãW«3RÜ«~jpÄ$q£¹D¦hޏX¾¨.ÐW‹óÌ­Û,ZK4Ü(JPd#š;Š·¦ÿn Dá Ê¥ÚHªKùÈB\L'¨ËÔÏÈ#n^fµô’ä–£‹%=Ÿì;ËÙ„î¥,µÕ=û¯l£¾Å‰Ì\,]ü¾Øñ€éä͵!l Ô:ØÚs(GG~u>RÐh”Ç«õ)¶w¢Ã?æË‡*ó ©¥v¶ALuPï­0—õìTWn ëXÖÛÕÏ可QŽ¡¶V°>d•°œ'W=l}=Wù@U]·KýêÚ[ÈÏ€ª°0_Ý`Я{þÊ•n°ò¨Ø`ã-|©“GyÉã|sK»Ø {Öܧ.£‰àü\u9Õ©+ ‡WR³º &ñ2ºT]C?W×€^ŸÞêz£[Õ™êfãýn5{«À³KÔ-jökEÔ­ÆlÎE¼c`%̦©Q›ó½Í½z&ó–9­Ê`ÜnßÀ7ÆhQ\ÝY§y×FÊh¶3eÍ•Auväfìâ-Ô #&wΟHåÓu·ã5·¸£Åà’øHݾÿ×»;ÂŽ´«êŽLGéü¯8DÊ"¹˜á½æzcÞUw&ÜÉÝ“B)‘üÿV„é:¢º/ÃuDÁK%’zê~#FåMjÞ©¨À•¶|Rg¼(Eäx§'Ùâ‹*¾÷\âJ_öe= ¡cHWí¨ Ø—UâHåÎ]ê•’ñ~$%ã`d®¶cÝ;È«„ =D*Ak§éj' ß.¼8êàä?áþØöošç<õ¬×¨Ï…ê{X°h˜®t‰Vˆ9¾§[uvJ*æ6×ݪ>6.(QÉ_L<ÛÇ͘–RŽ“1]ˆøæ“žiBäó©`ûv.YæmÒ}šVæ†àI£Ë sv¶t¨}µðL«,f Â÷©¢8øûï|²ÃYQµ8_}W_Ú0;®¾^X _ñÍÔ‘soóÕ÷úÖ[ÀÿÇ1Eq-ºkÆ%ƒ±kÎC ÖwPN¾ÄÎFˆa0†=mÙ=’ù‰”¯;̧:—rt ÓMÄóhݦêî4C÷ Yº'Uë^4_çÓj݇®ÐtÊ·ë¾)gH[\ Ûâ„w9hÕ}y”eèÏQÉÿš‰ãzw;—/«X¿ö:Ù$ÝÛd“Ì¥0½ÝV@^oŸÊâÚÒìÝ“²gŒzù² ôøª@ 4r½º kó+â )© cøë=…öéSé}šà´"OŸ.zé3“áʧÈwNWQÒÆªf‰îºIG°ÝCh¦nÖga«×ÓåN©Vè¨ÁBóe’Š·{¥y?]ŸâO½®¨yçùü$ÅJ·š?ǬKGwèÕ|þZþH§]¯­,Î×çØœçïIŠ çÏOpþBèÃú@\_œb>lUXN=u˜zé•à}TaT¡BÞþGRt×Í ÂtþÔÌ¿'êKô¥Fw[R¡†3Ó)Îy [}Y¾¾œ¡­¾2 É€mÝu,ôpƒ=`ѵΧ¯#±˜«+‹‹ldªv²‚Y _a~[U(Ú¥¯Q”¦æËB½ ‚¶ ^‹ÅžMƒõ::\Ÿ“¢ï#ÝEŽÔ¿0‹Ì¢aN°ÐQíï“÷Ì;}ƒ»éW›/(‰ŠEz|œVWºwŸKŠ¡^EYãwê q½ÉN›—tΚÌ¥Ï#¯>Ó¼€†ê S¦WäN¯È‘/æ\bâŸGŸ˜ž©QÝx÷ø_‹HD+úvcžæcšptg ‚°[¨?‹NIª ‡Ü@õv¼vg¸rvOòš”`ƒ/‡S‚Ùæƒ[ áËØ&<žqݶf²¶ß³‘ÊŠRhs^‘I'N,†Š|¹ÞsßM&WàÝüÃ5i_ èŸÀé] ~ ÜÖ¥0â—Q™þÝå4O_+q%§¯†5¸Œ¶èkSpÓ.ï”ëÌÜ(éûœ/ïÔ÷›s.= ·™#¬õz;8]>’½Ñ Tcxž›raÔÀiÖÙn œyww² ÓôÏÄñ3¯¾ºé )*ÐÝU—èŽ.*ðKcgøÌ>_?È¢%»ôÂ6P>*vÚÉts1};|¤T—¨]z7”D?èÓú‰ÚâvýÔ.ý´JýVņ·`.›` nœØL!3ƒPöCb†é-àòt°É4}WJ|rvøÍ9»Ç¼Íýc¿Ï™E剒Š“Ç~x§Ÿ7îó… ÷–ž7gÿD³œƒ*WŠ] >8ÔåV¬Ò9u®Ì%àø;%‘nÙ–à^,u+Tì>,ë~:Ïcõ)Ëšå.k–«jÇêMÈÙ¦ñ%gYݳÎÄAi%ŸH´2ê'ôË]( KvyÑn0Ù“¯¹m‡þ5l†mÒô+ßô³-úoÙ¢kçàp›¨2g>ƒ,y–3ùúwæhÛ }ýÃ6§ê-·êíD՟ܪ÷Uv«>Ú–¯?Iz¨ãùŸaÐR¶~ˆrüøt; æNHÀ#4Aw\>JSôn: kž~œN×OP~’ÎÒO!vyzó b—½)Öër—¥—;,õQ‹Þ§ÿŠ'Ðbý7£{RÿÝX©ÏôçÆJñ ¼öÇùÄ"¤¿ÌÎùPKqwƒ§y>ß„PK¯TU;$aQute/bnd/build/ProjectBuilder.class…’ÙnÓ@†ÿÉfâ8 M·´¤-Kâ ,Ä%¡²I(Т ¢ªW¶3 SR;ò‚x, HHð<âŒãLJhTEÏ™ùÏ7gûýçÇ/÷pGC†aË~GÜr¼åÄb4°ÿ„»Ñž4x !ÇИhF±üp(¬ôŽAOÄ k½œ …‡ÂÑ#†f{¡ªsÈ{⸎,J4 ›S½z™ä.C? ‡"*ò(0T{Âã¯ãS‡omgÄ–z¾kí@H;=ÌEïEÈÐZFšż»0Ô©FF¬9ÓJT‡R¹oˆa­Ëû…<Ý‚}\{?Ã=)ò¸œW>€K“'ï.“Æ-Pî (ºk)þZe×’?±ù!~÷÷zû(} †½IñïÃc7«üPK÷ˆûfÑPK¯TU;"aQute/bnd/build/ScriptAction.class}RÛJÃ@=ÛFcÓÄÆz­÷»mƒÏŠ ¢OÅ*•‚›tÑ•š”4ý,Á*øàøQâlZŒPêÃÎìLæÌ93Ù¯ïOØÖ‘bXäWH8®ßpÜŽl6œšÊVtâE2ðuh ö=äN“û·NÕ½^¤c”a%ÁµEø(=áðãô  £í¸C¾’t¨E¡ôo´è¹%¨èHú2:fØ)V fJuBž a qr éb©žÄ cê6i"ƒ1†\Eúâ¢óàŠðš»M¡´oÖy(UÜOjÑl3,WþÛiÖÅ“ð¨‚a¿8P{j9CDgOžh©>m‹¤0©úýb`«:Vf‡4WfIG«2†Ê Õòþ0jA'ôĹT³Nüi_©Àm,Mg)Øj…ôW~‡UÞëÂ.ïv‘‰ §Èæ¡‘Í5Èf1N°iʬö`˜Á,ßT{ß¡¢™Cü<å4ŠbÂ*áÒÚ-¿"OÇ~ÃRBgW-LÒ›ÐX¿4ͶÓXØèÓlÆè­PKKŽŠa§PK¯TU;aQute/bnd/build/Workspace.classWù_T×ÿ>žFM‰A`§Q«F¨D"ŒF2jj3Ox:¼™¼7€v·[ºï[híÞÚŶ#Hh¢ÕÖ´é–î{›®éýš~Ï{aÛ ŸÏ»÷Ü{î÷ìç^žýÏ“O¸ÿò£@A…öàPF÷™‰pß‘L„{SÖ);­Åu? ¬v·“F_8e÷áƒV*®ÛvÊR°¬«ûPSwk[ìø¾ö¶}­]Ý ”v‹#)ÓÎhf¦GKé>ŠR,Éò¶>Ôé–U(Xš]í8ÐKß‹ü)(i>ÜÞѲ·½£UAYÇImX '5³?Ü•± ³¿¡ËÈã(»™j+(ŠD÷¶´*Æ ¾¸yBÁ¢¸Ð)À==”1’áN-ÝÀs]F¿©e†,îÆfî6º¤‘ ï5’zCŽ`K?îÕµS‡ôº¥›q½±c^¯5ìæuL%ô¤­ qN!¹öÌ¢OêñŒƒSO jf‚H-ÿ’­[ÃF\kñŒ‘2ÃMÎà ®Ø¨ÙÜÚn1l­/©Ó‡ÊÊjŒ' ÓÈì¦kj{FhDUØèÇÝôæ´ÀH’ *îAµ‚ò„n–žhš‚íÊÐÁ¶r¤„a®Qq'î pV§"ˆzSÙ§Ù4CÁòšÚ¼0É¡Í*îÀJ ¡aêÑ¡Á>Ýê]%%Rq-Ù£Y†ÐÞb _Ïx~SP[33”µóº˜[OÇõ´ã ?^N÷L™Ý `îóc§5WÅ.a)E7õÙ©$EÈ2+cÊ¢)à*v‹»J ºÝ¢ð”uÆûYbÓ³.lµ¬”À4«ˆ`=ó©Ñ‰ŒµªØ+r‹Éó1#2ĽûT´ãjÉlB*ÞÖÓÙ+:Tt"ªÀO˜¨6H„;¦ ÊÍ6‘xPe#yPA¨föþ‚^O»Sz‚Ía¦z F˜=kв½ˆùñ0#sTÁQ&WP«Ó>Gríì%?¦°Š=€c8.ȯÊw„‡ Žè“8Å%™ó|Ý#ÇuÙe_Z9—J=bÍ€ '©zzˆªïœƒï2†±™ò’ã[߈Íï] 53*ŸYRgÒSeµë¥wÁ|h–J¶T¬ÆJqRFŔ˟ђÍkdsΨxµÔGÑà©„aÙ²ôZqÛëÜ]3okžÊµáƒŠ7:†-|~¼IÁª|ÞfÑT·ŠñF+šªtèJá¯4ÌÊÎâm"öѼhå:‹w¨x'ÞEAZ:­ËºM®ÍÝ ïQñ^)²âLÊÝôãýìù(ⶪø>ÌzÑ,“œì¨shvt®Ô’ãUñ1|œ¥b;-2-Fg­ŸÓ«Ó‰ËþŸ0¤'$“Š;Iå^¾®‹?EÏSç"ü3*>‹Ï¹½ÄmŽUs¶Š¼vy_ |QA}ÍY6[e_ŸmRZzê*¨X  •öAK·Ù@ç‰õ©Ì *¾Žo°oÇSfF3L{¿~fžJæZh: ³ŒæF†,iΞ<úqõŒ‹.’J&u÷ZV°už­Ù%6ý8åžPq—˜ˆÃòØ¢ ?«”6 Hõ]U1†j‰Â“*.âR)¾…§ýxŠml.Y*®á:ãldtKËÈ ¯|†VíÞ:ßÀwü¸I3gïªø®4ÊBS?‘8>£â{r-OgS/2@§é yVŤbýšå Þ ÇG¦o®M5GçM–ü«è'*ž“kQ2­Y³ui?Sñs)²Ü+ú – ~šÕOw­˜Ÿ:h‰DÄ}w)Ø>GfÜö¡åTÏ nIp–l¸í)Ö¨¥¦†uO¸Dø*þ$wZ‘»Ã<†wûžÂûÆðºéLgƪ*ÿD2x¥XÁï¦ãV¦Û6®nçË}Ñ;iÚ}4f,&Ý´ClXXFDâzD4h–Ë­ÕDD…ëšQ¨l’»#;fÙÙÎΪ$­½mz¤Wz$ôJ%mÓÖ`\$æjl“6½ï´MÚ4½üÙ_ÿKú|³ÃÂ"ˆ¿~ðͼß÷¾ïóÞß<ûÊ#Ø„—ÔhûÒ¶LD‘¸–J%5;hODƒfÂÖŒ„n)ðTÑŽj¸– ì<¢GlÅ~Ó 葸‘Lé#Q;1-= NÉÉɨ Ãm½½=m}»;»ûö÷ßÖÙÕÓ×/pí¡ðB:¶5Ò" $-Sjð…§1¦x4ГÝâ©¢ˆ™NðŒ ,Šh‘˜• =%°´–"uË6ÌDªÃHiƒq=Ê“%­ÔŸ0ìí…þºž Õ½X†jU‹§Íwp©¸ ˪£zʰôhÛ”Ø^[³Ó)GÈ@)V¨(Çb«j¯ÄLÉsµ %Ô¦çºÓúÕ'¡ T†Íˆ? Y†|w‰Å­.ðUþyÝRwÀ‹BÔªX‹%RÅ¥ðÒJ;fíºðB9@Ç.Òí<°ŽKëüuW@©·QÅ"”ȧ*Ê zñ¼VÁ&«æ®b3¶x¥òÝ/Fç†\OHNTÒ¶´Y–66R¶סVʽAE3ˆ[%k»)¡,÷×…§Ù‚fÚké‡-=Eù×øâ“I˜ÄTÜf=Õ7’¤§ÖÑSóz¼¶¯¿§“åõa|TÁGX—?©â|ŒÂ{öïÝÓìã|\H´Äô ŸÄ½Ù>Õ35¦VÎkÊc2cGU|J†¼˜L½VD†÷3*>+ƒYfp@YÈ_Ä—86ú±°1hiÖˆÓxîZбÿï~ݕٛO«Ãìfl§³ZÍTÿ5ø_•žPbZª›å&y¿¦âëøi¶éô{^@ü‡æ0Õ‹q<¬àìTGq¶;Gô¤, ç°„ÞKf›Œ¹½ÏÒ",¥‰¼ó}1Ë<æÞìíÂéì©tÜÎõæü$o.úÔ¸¬çÏnŠ3eþã‰ÂˆLò WzOªH™i+¢·Ù4"6¬ËËPÍBdO;ì4òüR&¼¤@iV"3’ïzÎÎ|òluþý„µéÞQnœË1­WfÐv nšå¶ÖËøKžg‚HøtøÆù†õÜdÚÚk %x‰³ûÐÜÌ—×>·äÖ|¿nçœù ‚ ~Ê12×y™î?—óø / äù!9ÊN“½ÊTÏgÃæÿ¶L’ÙNž™ÙÁNÕ¡§"–ᄼ¿cvÊ‹€lÆ7SOÙ!ÛòyWŠ?âÏ þ$аÐ4Ä[®¡Åy«âþ þ*PêX3¿ 7³å˜íâmž#ÝÛë$rv¾.™)}£´•ƒ5”à‹“2{<²Á3´’Eü].ïæüzªh®;å5ÖYIzÅryßç{ +°„\•|kå*–WŠ –ŽBñŒÁSx¾Âǰò,V?Ľ¬á/WPVåÔ8Tù³ë\I»H‘4oý®©o8‡õÓ¼åD ~²xPEtÕuö4®…ß‘äup³ŒQ‡ú¬Ì‚{ÈAD¨þa4<*.Mü[ŸAà~jëÊQá—´þ®§êݽshº€ëú'°µÛ]›=>OvsÛ$Z pÐç™D»àH[ìóN¢“¤1¬GèööWî›@¯Ï“Á 2¸uŠ72Í{X ¹x '}Å“8"ð$’ÍE¢¹ÄW”õ L¹¦›KÇáÅR_i#£(»€Äò¶'¤0_éy¼½ÙëóžÇ{ÆPÔ\&9Þ?ŽÆZùøñ î#±,ƒOßGŒ’â+“,%>¯¯DœÇçš•&Ÿ’Á©ƒ—F_=Zß4ŽÕ<ø$ΜCÃJº›2x¨ñâŠ/Jµ gèÐçð^D†ß6[ÄVNž b»h£“ÛDP® • ÙI†X•¸šïk°AÛÄ`߀Z´c=ö1L‡¨!4"…&ÜÉõOÜÍÏ¢Sl`+Î`&Èñ´Pëj݉—ÄËüù:ñ*v‰2„DöˆUØ,6 ‹ˆºÅ6~3´bè@Ÿ“*I¦2“ÀM••b#Î3•%¿‚I€úûz>ïÄ­ŽWꉅsÔN›~M¯”c 1?JlµÄ&}1mOöÔor§~KšÀó¸Å-â&§‰ ò…3¹ê-vHƒŽR5»í*ø=ÅdY]Öσ³8Ïà,Èq¾ˆ?¸œ]NÏ8^š­õÈ ^OŽ÷o¸×å ¸¼E²¨f3'f0¹Ìø»óÿø§Ót¯ßIük§ï¿PK—5Ñ }PK¯TU;1aQute/bnd/classpath/BndContainerInitializer.class­V[sÓVþŽ­ Hâ@‚R uì$n!ЂC 8\N€B -T‘OE2²Ì­÷{_ûúÖ™¾ô¥´u˜fÚ¾•™þ¨N÷H¶bb;Éž±¤#í~ûíåìžÿûã/¯ã; !†¤vµâòÔ¼UHé¦V.—4w1uÆ*dlËÕ ‹;Ó–áši<掄N†Ã¶SLqÝ4JežZ*¸)Ývx*S×m­·a¸•¡»ÀͬQv9i0„¦§ög-xèNÅrežºB:iIç–ëh&Cv µdVІ•ÊøßH,ì—0DŽ6ùyZwûšk; T 3ÈEîNñ­bº Cñ‘æÈi{@Á+8èëeêñl¥W¨päUÈ2F”`ØÓNZÁ(ƺ´Ba]’ų›–BÚK—»h”ÆZŠ·)QJ»lK†sñöÕ4í•S¶e=O_¤D^qì%®»ùìC—\öÊ&È‹¶°ZÂ"RǼ7©)Òž— oÅ·b¶ÁñùŠaRõ/NÐ>iË çjn¥,JtRÁIPe†]Û¯G†Ý”â¦* ãÃ…Œf©–íªºÃ5—«Ë‚ë¨jw¹ùHu¹Zòí«›—}I?ª¦Š}BuÁ|gDgâñéfs­¶‰Œ#8+”Î1Ü(k¾w¤!ჺYqÈ8‹÷’(ï¶!fÌâ2ÅÖá÷*¼ì6·µë¥ņ¡ô" «H³U¯wÝGà“ë›1 NYËÃ-Ðaضì×çÞ¶qbÐ5ËB3ϵánJÈÓÈØTRÂ-*±­FQÆû¸#áöºþ¨`±{|Úy™·(†6uñÖ|l'Ó"ù™sì¢ÃË囚ží×IOP'¹J±HUL}ˆ!±u{ ŠW™EÚ¡¼ a@×¶ìsÍmQ%†ÔÜÜóZ\Û½¶…ðD`Â’°L#¤¡Y<¢ñ°¬ÀF‰fº]!3½~/1lB7,—Ú ×–©ARžúÖw™3‚w ½þ Ü, «³¶ÚhV]°UÆ=ôˆËñˆ¼V*q«@£¨qÀ_ž¯9ÓÆLZ@LÊøŸHø¸Áç‰*øTœ h›Ò+“²ÔõÀvîR:t^ ¾˜åM¼Q¢|‡ñ%CwðFÕëz¡4<6Ð¥¡–³+ŽÎÏâ$2Øf¤Ž Þ¦îØAÿma¯8ÌвKœè.V/A¡¯;¼“eÄoÇ*væ£]+ˆþŠØ/ô"„=t•éô“xÁ[1qØ©©ÏÐF÷¾Ä úO1XÅË¿ãPâ7úW_Š¢“®Ct¤I·1: @ÅWÇ8RôkÄ(„ÃôÜI«#ž‘‰³Ðž°£U{†Uɯâx^z‚XéèÛ+8½‚©¿ÉÑUœÏ­`ºŠìƒqò„ñP'УÄåq:JñšÀAœ@ibp‚$Nzì¾Ý;ñtW=Æx9BŽ ‰k¸îE{7ja9åÅŸ,wþØßîéMy¸ªÿ5À ¸¡.£­)¡F±dçŸx7ß1š£ûÍ|ÇXŽ=Å{k¾Æ(ó }F¸BŽÒs/!¯ù lÇÛ±šmñ4Ýó©€K ,¸Çâ{b!ø§E>’Ug’ÿ@}†Á'¸»Š{ùhyúp¿ŠÇU|øz”$/-Éõi¢ä‚¡ðuSȱ›tËS"n5„+PN{!g¤s8×gø¼‰èiz#܉¯èÄd}aߦ½pÇ3ó|…¯ ˆáOçÛÿPKåcÑ¨Š PK¯TU;,aQute/bnd/classpath/BndContainerPage$1.classTmOÓP~.C £ÈÆ« â„m EE‡/°`²d(Â?uíu»PÚ¥½cjüQ˜(¾$úÑþ(ã¹]Ed#nÍÍNÏ=çyÎkþúúÀžhè`˜1_Ô$7J®mXŽUSVŒu×Î{®4…Ëý-³ÌSK:{æ¡i8¦[6ž—ö¸%5t1,{~Ùà–#ª7ö^™7¯s?0 ÛÒ¯Y²æó»rË÷…Í}†.YAj‘"(¶BŽš$ßB"Šc.Œ‹Îß$ºBEýTì$ÛXŽ Qašß…ŽÙÆåI wp7»Gñ4ê´BRŒžû!ÆäBÐQ¬âqX7zÐï7PKõd?êóPK¯TU;,aQute/bnd/classpath/BndContainerPage$2.class•TMsE~zw“Ù,YW¢¢,°›&£è‚`Ö€«C&FA/³3í¦Só±53›„“Z–eYžôÀÁU‡x0Ti•åɃåo²x»g² ›âLuOÏÛý<ïwÿóßï8Ï4dÎX·:17š¾cØ®Em+^1f}§ø±%|.X-^žÖc(®Zk–áZ~˸Ù\åv¬aa2[·]ÑŽ¸±ú¹escMðuFFcÉjºÜ´šÜ]ƒ5áða0^QyŠT›ûÑ]#Ä%á‹øm†jeê2C®8| uhÈŰŽ!²y`ؤóó¯ÉCe&CÉ lË]¶B!ÿSaNšË°?Íåi2÷P‹ÇõÀíx~Ã#ÃLÅì\­Q5wÇ-ZVhµW„Maó¿5îrû±´lÃ;Qâ;|ƒ5ÈÕ®æ%¾A°³ýïÈãPø­š†Q†c;6;ÂuŒ®gœÀ˜Ž—ñ é˜íøŽËïzÍÀö¼å‘‡+}x%°¬ã´¸LE!_ŠÏê¨HqžÄsa„ÆŽöRÌJK¤U KؤŽs0(4»&d~ŠÛŠE`HIMž=¯c¨r¬v›ûiŸHì58ÕVËc†!3V‘ToHª‹= ©Of(à-\Ò@YÒw§ã2¨Žù†ˆâHUâ<.çñ%ðJuúT¥Ö9×Txâ !¦ ›á%ó‰I’a9ŽIÄÜ—}FU÷”Î|¬)·Aªqòn—búÿ3PjµƒˆR3,¢íCmÆwûdŸ°Þ!+Ú]Piï j²{Áßq·°tB›'E1ÒÛ˜ç$Y4çÛnÅ ¯ކÊûél·Af´CnÅ\n…KwXeO¯ ‡Š3¢Ìx'בÞð‰©.ùy„)º—²4ÀŠEy=ѬÑB¤huzÂøÄoÐÇâЯô—ÁsR¦v$ú ”h¥ÓZJŸÇa%Á‘”åªÒC8¶ÙEªÓ_*äX²›"åê(^PûË4SÍáxÊö/ýçèëNü…óÇ‘É#yFiœ¢Q¡19¹…“›4’Ó™Í?P½ý´~u S¥×¶ðº\ÿR"zó'äKWîc t•¶J³4máÝÍ]vª}E^2¾¡&ù–î‚ïpßc?(Æûºþ¸]ÜÔŸ´pï©è7ð~êÙŒÒB±Û r¦í‘4àÛ´ À¤™áŠ)Å„’÷¡¸·+G¬›£yÜìÍQöAòçgæh·TŽ>|¶'÷ŸêI‹êü>¢oËøŸª¢b MÏ#PKºZíPã9PK¯TU;,aQute/bnd/classpath/BndContainerPage$3.classTÛRA=C"KÂ@—ñ¢‚¢A±bñÀÛd3„¥6»©ì„”Ÿâø`•–hùàøQ–=“È%xIª63ÓÓݧût÷üøùí;€)¬hc⯪RXy¯`Ù.‚2—›Ö‚WHûžäŽ'*«¼(âÓ ±-¾Í-—{Eëe~KØÒ@;CÒ¯-a»N9VP“–Øž ¬œpIÅñ½¬HAžÚå¦Ä' 5Û ì Cç6wãµtEp)³ÍX5§P¶P•Ò÷È GHžwÅš#j tø˜ÑÖ·…µ­ïëõ¡"Ù¶Ï:ž#çÊÉÖâû_8-"¬1„Ó~ADÀpÚ„µ;c"‚¨Úõ›è„EgMtáC(©Œz²Ê‹j)/*ÚCoÖ·¹»Æ+Ž:7„aE;ª¥¤âÓÄD=‘E±Á«®¬WRRÉ)7W;£Î”Rƒ¸nàÚ±¶É½¡V(™¸8åàW%Aeõµã[«Ç“9Iµ.Ít`ˆ¡« 6jƒA=Š$RFˆ˜?X˜ÅƒQV"×#¿Éì\Iâ¢&š‰æ–ø{ Ýu"r1Lfá&C¼.MÜÂm†ˆ­û—nuáÖ£¸‹ûî1\ùw™x "™ñT-ÉA8¹>²¦âxhb:¸m‹@Õ|‹};rD-_uÜ1髞‰bi ‰–z×Ä"2E¸ì•u=ò^&4ïÑœ_­ØbÉQÙßÒ„²¡†Îx¶ëT«!7ý‚‰gxNP'PYT|—ž“mø›¸´_*“)4¨¹ì@Z1!LÒ(…è;…P,¦¦ ˆõªÓ+M½‹!úºÐMZ=´[@´ö¥F÷Kí¡75¾GÇ/øDò6œ§ÿ(­Ðïqv&íÉqIË/ãJÃßî¤OI¿bv¡ºu–;ñqìKÀ%p!,i»'xJk˜únY.ÓYÒïPK‹MtRPK¯TU;*aQute/bnd/classpath/BndContainerPage.class•X |eÿ¿d“Ýl†6M)²èö$÷6¨4iJ6m¡55‹“ÝI2e³»ÎÌ6-Ѝx¡à­¼E±jQº¡DêÁ%à-žxßâ}áõÿff7Év7é¯û]ïúÞõ½7ÿçîãºe{5‚5úeyLjdR±dZ·íœîŒÇú2©þlÆÑÍŒaíÐÇŒ ‚ÕYk,f$ÓfÎ6bûFõ¤›4¯Ñ­Tl·;x€õ‚ sSN,oúv,Þ_dRÆ $èýÿñ8FÆ6³A£¤ ÁŠÄl2ö¤C©1ñc»@/!'²)#-ˆ$fî>’7Ó©Ø+»ÏH:„ Žè¶‘2-Á¢Ä>}¿3³±-¦‹Þ¨Ö>$µ’(—:™µŒXü’ âÔ_`fLg£ ¶¥uHè§!,ãšÌCxŠ`1'ÑÎhÉaÔ"¢a – v¶x2¤õÌXl§c™™±Þ ;'ÚÇ2ìlÞâ$>Aem6ì¤e本ÕÛ:‚[2vž@Qg\w¢JÛpWFÔÖ'Œi¢ºõIwEwñØUvtÒL§£öxvÒEIæ-ËÈ8Ñ$-ÄÑîŠÆGÕeDM;šÉº F©ÄŽèÁl>šÔ3Ѥeè’"Ee$ï8ÙL‚³4¬@”° §(»kêeôÑ:¤PViX5Ô&Q”ôg'riá[Z®Pš_œ ëlËOŒÖ.Ï_šÙ¤žÒ-S­ýÍ€3nÚ‚u‰…DíVæ5õ´y ‘[à{ªÀ”ü| ãXy­^«CÃb4…Ñ…õAÄËgÄÊ¥ócf&¶)é˜ûušVC76P 1¥³Q=Ÿ¦žÕÒš¨ŽÑ«èž«á<<ÍÃë§ñ,rF%<ÿ”Xç£'ˆgN¯£¡B¤9è…ÜÆ…¨¦µj\*]lÔЭ¡/ˆM‚•'%¨¡›½«•Âöl^m6¢‹T ¦›"ÇFlÁÖ ..KUÀ5Äq 39)¯ò¼uUEVùŒcNPÎ45¹$°-ˆAšj~H ÛmB¿ÚØ4bgÓÔ“B¾LÃåØÉ<ãdU–4‘霼¥T÷, §`“[®¨†E~Ì*g3 züÙ ôKÁ)^ìªH°²4íº–ª‰WEaÖ6ƒîÄ•e6«ÆìUéï*e«PŽ+ÒzÒiÉÆ‰mÉZ wÆs‘T¤›CÃ(Æ ÌÞ9M]¡âÞÃä[S…ÙÅ–™Ú¬;zã¸Z±J«W9j2²ÈQ%Ž ´,«mñBÁÅ`PÛ \Aа…úæ-Ë|Jñ³ôܸ™´c ¤Wáí×0‰ij‹x«N¼Ù\4/^£áùxC†ˆ%¯™Ï .Œ«––9ñl¸>?·_‹½êçÅ^¢²µb3Q™7ÄK««UÙÐSëõHñ ÁÚy 79ŽžŸ w‡ñrÜ Ìð*>þ-ñ¸Jª×ãF 7á5Œ™‘,¥š Ÿp¿ŠÔzòë4¼^!×YæØ¸£.“ áM ¨~ïEcîêâuð 7«gLYa—qÀ â–2Á½Çz¿iL–_¦ ¹‹0)MÂÛ5¼·z©Ô¢*¹ÀÜJG…ü»44 ¬$~†÷*‰klN­ß¯ájH£¼À‘ âC‚3祩à>¬ápñU¯©=dÚ¦öQ SgM<Ûjè)Ãòƒ¸£,…ž@»ŸÙl‚ÎqŸP¶ºsÞ8ônèFÔ4L© ‘ën3匇pLpj_>“b‘²óàÄH6m&£ÛXÒ(ð·„ðIšcˆÊf‚á8ÛÝÒÂáÓÔˆJ˜A|–9m!Ïÿšî0>ƒû”Ì÷ Z[V3(ÉáA ŸÃC,Bü@£{ñ)ÙoRq‚XK…’®è%ñ2p7öY¨ÈÂx÷) ¾¨áKø²g±„>b¤gøwÏË¿òÿJ_Õð5•Þ”1â™\žþþõ…ŠuNâ›J“ßä¨Éª>âe›Juq…Ps¥¿ßÑð¾KçÑS©Fš9˜n‘0mªZ©¤óD4ö«Z7vp¯*7ësºz^ËÛ„ÊO¡dqA—œôR‰ z²2ƒŽ¦®*Á¯œ/©ü©šgæê噯ºŽhU2ò­ÀdŸÍòfíü1êEµÂœôNMýpcþœôꕯš qÝéŠ0žÀ‚ø=kÙeŒ†?âqJoÚ›M‹úÎZCø³j׊ùö üUùÏßÜì1§ªÔ3ñÖ¯³Á¶çú, }"Œ¿ãIEí_‚%eÔîK‹›;H±„öoŠ%"ì1gÐfSV ˜ÔRy«£›òN6:¦<†÷OEGª·£#ʶ…ÕSzÎQë4©w_‘œb”Ψ½ÚkI˜—8ËZNç=y5ƒ¢'Zá/$)(Ë~c>ȰH|†—>;UÖ¬HŽkžïs¬¾6$M xÿÄ7zE Ý]ëCÒÌìGéuÕ¨EÝr_…yHNìí,­«IÍÚcfoµÃò¿ýž0žÛµ¾#zeHNè @cTvÙJïc^Áßµ/Ïv¯ ×"U{Îé:¿ãÜÖUô"9]“xÓºd:kÊv§³ƒ‘349SÎò†ËýnBÐr’Þ¤ÙÛ(QY”•¬Í¯ÉjáÛ¬YÆ(OÇݾW½2ñùÚ+;F`{0Ë»²NZ‚rö,ßo84ÜÖ¤UÝsqÎ úØ.‹Ù$,í ©ƒ~Q•W?%:Ìn)¾›%"ÏZªßxŽêËÍ([{{œj£JIþD#Uí”ä|é ûäö“=gñÒGK“^aë\ß\þEkŽ´n÷–rQPžYV¼•$R­°º–&›¤™,cL–Xº2 ¶Î£¯E]àmU_8ó:;Ô[ôd”iêdÎP[ÈA³çX¢µÚ7…>¥¨~·ìâ!=ɱ׬lZhå6ÏgÃðN7Ò¼7mY9j—òFÊÏpÕΰ±’Uz-jP‡ Y®ù„¨‘»;.Fǡٹòw)W—C8.kk>µù4™ÂémÍO-à̶@+ïpÑÖò·™`À*’^M2kp*w×qGóq6Z8R“hó OR¤ZŽmíGÑÞv: 8§½€§Å…míÇ@_;†õs©úÙ!8Š]å c¼Óz’ëF6¸ £QŸ¡š ñVâÎvãÙÄ ã Oˆšã¨§ ‡¦±g¸½v Ïì˜Æs‡§0R@ŠÓñá%Ò4…}LtP¸çoë(àà4®î üuÛ:ÛîÄ…"¸ Ú^4ë‰þ²ž@$0—7¥šžœÂ+âÕ¥õ¿Üõk;#Tá:›ßXÀ›§qh¸cIˆ=Æ[{êÚ"u¼í(ÞY$U©W¨µõ.â»ç¬Þç­fÈ–Öyl)Þ;#õܦ&äx»?~dG†Õœ·øxO0\‚Ïp4l¾«€»ç†"¡¦”: 5O—Ÿ5D|Ćæ{ÊѰ‡nþÏ"uÓøÌpÛî-àµxX->_À"uJ‹|¥s·uFê¦ð¾=cï[iQ ‡žÛKwº€n¶í¸ˆÖïãn?.ÁfìÄ’Øã ¶â:îÞH~3ÄdO¹ wc;û’ø.ÃOp9~C¬?áY"’ì–& ËY¸BÖbtà9Òƒ½Ò‡«$]vcDö") ±p\‡Û啸°ÜL»)ßËy¾Tô=ξ‡ïÓÓÂòü€³ôÿ‡ø}t§ àÇ” €EÃOñ3zò­ø'~νzJs3~_"HY®Á¯8 )IðkÎ(Ç&ÊýKê"€ßâqÏ—åWud{U¹ëWC¿»wNã e“]ÍšÂ_Óøûpûþ98wLá¿Û:—JMA rÚ ¦K¥ÑNñ†Å3çK¼¥Þ°ŒÃmhê tä)„X |ª8%ÏöcòTÖñrLVÔÂrµíÇ9þê‡kiím©±­ö05Ô ‡ÿ€¸Ge;Þ#í¾?¼kКK0ÍÙ=Ôøqb|ç³Q¾Ÿ¥GÜKëßGëßOK?ÀÈW²Nâ!¤èûð®ÆçÉá Ø/RË_"Í/ãÅœ¿ŒóðÜ‚¯âv¶šGÙ2ðurù¹|‹Ôsí½‘Ùƒúöí½ï¥g.¢5Zp“tJ%íÆK%&ëy›•Ð-¸wÜ£2‘œ[´ó—¸Yª&p¸äóõîÎOg%Òšb"•óäi>æenv?.OO´ß%v)‘Xä=N×øsó³Rd£O*@'ë—Í$Ò€-®`ËVŸüy.-²¼£L®']b§y‡¥|+' i É%r©Ob­77È”‘Yî’QDj$áþÊ6w¿–¦ôþöÇG½áPK>'ãà `PK¯TU;'aQute/bnd/classpath/ModelListener.classUN1‚@œUE £­6^¬-V5&ölrÃø6 ࣌G#q“ÍîìÎLæýy¾¬à9èfòTkA‰Pɪ*¤ŽÅ>XùI¥9ãÒE¥ò.…’ÙU‚”CMðn k›G„éÜo­‚:Q‘8–yC]/.wû¹ÐIžU„IkøûÖ9¯Ëw‰bÂø/ƲØBM‘IÕƒm°cefß´kö†_PKM'qâ¯åPKIÅ8'aQute/bnd/classpath/messages.properties}QANÃ0¼GÊöVPĹ’”ö€„R+8oãM»•cGk‡RǵC8pZe<;;3Yˆ;zR‹4ªª*‹%ËJDmöš…êàämïl |¿a×@ˆ¼NÜ!"ðyû•öqKF-hó®ÉÄO•GZu' YsÛ‚Ȇ{g²%)‹Õ{8;Šƒ¬gg= Xà ë à…„›S”À¬L¿©µkÛèœ: ¤­í’ÛÚôš†T“f»ƒY5KgsÉá«?R7‘óbu=‡²x°ÉØ%‚€hd@b%ϸ£%ùZÝAmÐûÃ~$ä,µ3ç¶<4lÈÑ3¥á]/1Ç$f#®gòxi7ŸzÂ–ÔØïPüÅ"¼òŠÎÜ ó¹,ÊâPK-”¹2%9PKÛA‰;aQute/bnd/help/PKPK¸­l;aQute/bnd/help/Syntax.class¥| `TÕè97³¼@Pœç¢òD„$L&! jpÐA¢`‚(¢âKæ%˜ÌgIˆ€uß÷ª-jÝ·j­ î{Ýj]Z[km«mí¦ÕÖn¶¶ÚVÿ9÷¾m&ßþ_kæ½{î=÷ÜsÏ~ïóåÏ{ f‹×¢ v3*­ÆžlªqÀÊä»G²EsCB×™CfcÆÌö7vö¬³z‹Qˆ LR2éžF»ÐŸn\dg E3[, D,3eåbþÐîb>íŸÊ!jm0s‹žrf±h峓UÿR1iÌ[ýÖ†Æ DÃ"Cf¦dv­w Iå-ê?iMǘdS÷è•/¤mê´ÇvûìÚSʦ2ÖÚÂÈ`I÷®ÍšƒDÏNN³‡¡†ð_µ‚DÀ´„–¶u¬@Ø9@÷23G¨«»ÓýY³Xʾ–rè!£™² "íÞL:›..@¨ª­[ES.²S–5˜Š°¦ÕpÈ2ò„Ï2жQ°2´GFqÀò`vŸaf kCÎΔÕÇ©=a¬¤Nôn–2ECò×HŒ¦ýc$4ØAwP$§­™hŽÏI4ÕM«†ý`ÿ(L'ÖVÈÀ*+ŸîK[ù˜5Ä·Um]ÝíË»Z—Þ6jk êi/q–´©v fü´Œ!9Û‘ºUÕDQ¼&Â.$Ý?@Òu!BWÄ%ÑÙ2—DZ&gFí}q€øìkîÅS+q¶݇§ÚÞ:£¹©©YƒKɃ9[…Þ|:§Äöòrå ÀF‹(Y=<ù]$ã|b4ø2BÓhT-Æ"ZƒA†1;“4‹D™ŒRÖ•$ ®"ß厲{îêÐà+«ƒtÉf‡¤‚1H,wùE„1(g§¥ýaC—²{KlŽËÌ»T¬ s Å=e¨[Œb1×ÒØ8<<œáR¢'}J#Gš ³)Ìkkà:i±¨»'—ד :ˆÚ{™¡7"Œ0á¶\¹™1ÐQÂhzj^›·2Dî©.¡/ð*Ò4¢À‘ žå¬Í_G©t_ŸEi IúÖi nFØ/0#©™Dñ_"GÖ™;&çÍÕàV„]\˜â 5¸|÷ÑàNr\í’~çéré V¦7¬DÂ`w!þý™íÙóâsšãsŠÏ›ŸÝ|3ì›5p/3lÂò£—-lëòxv?ré^+[ Ù¶!<Øo§}4ò>cMJƒ²[™)³‡8Bº1ȼÌ8ƒÓYn1ý8?WÊSfybë`OKv›¥¢=Èμ`ûÔEEÑ,ðä­“KdSFÏ‘%³˜ï7³éSäôph`ôɳL¯^¬oKmk]¾Ú“œïp¤”ή×àÐà5JÏ\‰±{ÍŒ³ |1§pLs›±ûêÄ뎎 39èf_\  "kô°ÄQ¿íäd€ÛÚ—/iÌÌnʺ:f¬¤´ Q²b˜„œ¤ÈZäÙHd­1Ç®M‘ŠæI|(o±H Çì“Í”õ±Š½dì¾O;5#ZÆD¡Áå yawÑ2ù>²å«ÜLì-„OW–+UÁ*òòÈô¸ÊE^,“amkV\[¥ë)˜eÉ\ŸÉØÃNŒRâýp5ºÌYþwSPÖ0(g¡Íæø™HƒŸ LÙo;sQРÁÛ¤”ôó3ß_,—Éõ/^òm8ɰhÑ3yƒ%ö œßEÞíäÒ<ÜH÷YŠÑˆÓe‹•°QþÛÓS™"ŒŠ$$NfC8þ>n °’7”–;ÂJà:a ê8ªÔà—¾Œ0-Ʋ‡* ~M>ǃ±³S…œß"¤ËˆwA£TÕ¬ˆ†h7²²7uI±éÉ›2$vFÿ¤B—ÅKï{:0•²ÍM,îè˜oعФqÔòcùÍ- $9‰Ù|@™®ê¢Áï$óƒ™ë )}va¤P´5øˆòy5"¹Ììíìf#÷§ø3ü…’ÝÎn®vt“9[3:ÙÕàcžø8ø;ü# ŸŒ.<®PÞÉÎ×À?áS²‘ë(¢¶vÍh»ÿß$å4㿪½Ekðš´Ó[R·\’áéþäã½ÎIæ"‚ÆKf¿¥aEïΛÑÞÝiÌ›s°Ü2 änÇd6C\Áh jlú#Ô“:j8ŽˆÉ¹kÔ@;yK–\×p'UþPmÉ ÍcDkpfïN+º:µuwwvI.k¨S€®jDDp™t2‘÷Q™pWÓÍ"ñ¤‡ø­¢N©jW‘8)`± ‘ΦX2IþÒ}N.î '¥a”ˆL@"Ê‹°)QÂ=ÈUW’•œVë%áÃ4Mú“ôgN³¬CâäÜSFYKÚ;VúQîåG‚]NÈÒ¶Áê-1î¶ìP:og9FÖp„Kê·£ÎAMÜ^Âj¹ã ËèØp—ƒNHkØÊÛv[ù!òÿÆ rŒ²+ „ùÿA”Y,^Ô0;ÑÔ¸„]±´ üÊŒ™VƒûñîWµñ–ïï‡ A ªáL„¿–_f^GXLÚ©lƒìÈ–n§\Z´û•—NS:ï—.%g(Ä¥8¿o„Ú)?JŸ\²þï}yê1¹Îc»GÆL^#E~—l ìK»7Ä3ÎbE˜c,¹¢ä#«³ó9îÍXEòdÉb¾D<›E6fúÆÜf (BóÁ6"^b´{zPé¹ÙeØY LÒ ¶çr¬_Áµ vfˆ+gFk@óRmiºà!""v\Ñí33¶Ä+çIæ;S,¦6‹2¥8·(SLç|be00zbµ³L^AîOÙnqÄ—æS¢L†Ù]1¶@Û%:±Ý-`KºJž»#ñ«œ±°£)I—f#„åº5œCÛÅÜŒËwÖ’jp›ØÊ®£Û:»–´vt·y6ä ûòf?«ZBÊB¤ÖiØ‚pÕb'²àú¨ÛKµ&‡MªèÈöR´Rq2y–[Iuz“h.q^ ,°çÈ8Gí“ ÂØï¨ó/9=¦S¾Þ©"ÙZ"í„ÉffØ)lʲlrv¶¡˜f}_€0µ‡ðäÈÓÃfºØ@hR—­­l/©¹†‡Q¤âwâv‰LåBâÓœ&ú_|žü+Ÿ›4\ìW§ŽÎ‘²:œ|BÃ%/ÌK9x,ÃÅ •w®”d÷Jûâ*}/gª &Œö¾ P#‰çrœ—ßøæ‚«ÂqvTŽ1Žónå-rvÄ4‰ÌAá• I”–",s%åõ6D\ãÚ–a7ýYg’›=¯ö¬’7 ;Ž0I5ýU„¢cä›ÞqSÊÃå~ý]¡uJc­™LÚäZ½†+üz„Ò`-´Œ¢²¬¡¼LZv¶äm’†+ý’º— ÌN4ÏIÌMôp®ÝÜÔtpÓœææÙ$C¬Š«jðVŨsh¨áj’«Å#¤ÆéÞöA>±jXaö®—!Õ„3˜À1Ác°n{î:çŒP•eiZ}I)ä2iKËh¤4†YËJ‘ÓðZä˜4Nq×4 7Q•&âK)öi§"´oŸcê˜/°Ynœ=”.¤yÉJ® &{{‰‹<9í¨Ò†zšñ šÑÚàÎx²ÿuFŽ\v0ë9SÜ ä¬d02õñ…fžˆ‚óˆ‚O§. „™tÕʧe-?£áE¾upR /!ÙZÌ5rŽ IÖ.Ch*ïÐð‚jIdìþD‡Ýïæ^A1ÃvÎ3ëIݯäôʃ–Rt¨áÕ‹œ(Òo]¸";Åí^=ÉñãnD&é«äiÊ(z3ÇDa¸8ߨ¸{0m;˜ŸËëˆq׬ E++Œ†×!œ]…Ó”܉—UOõð)ŸÚPyÆèuL8vBìf.G!¥t»ÒG­=­Ö뜚^OVÁ'-é kx#ÂÞkœ©èuO5¼9ÜT¼•ä ÒÞŽpgEý1ËÕv]£LRœcVŽ ãÆˆ]’Y 9›eÜóÌšÂútÎw2ÛÑ*×ãì¸ç)=Tñ›†w"´TºË}Ù_Zìbº7Q/ËÃæ«x&ÙºhY[ܨ×ð.âêô®9YðLß •"¤A›^ÏN‘H|“ê.Ù,iì§X90dªÎ(MÂQKÐð>„I£'9K$‚¶’‡ô3šï„ÇÈ=–¸&ÊÍøÜ’‰—©yV‘lì@ºwÀ•/÷\™C^ß${xi/3äbæØ*+ë˹ûÌt&`¢Á„Ó;c#éôfbèvÔð!Ú‘’>äÚ1~ûcÁöM~û$ÝNÍ£ÁÕ¢§œ3îòö±ÃQï€Ê ;ä֚Į;¸G ø Â>åè;0ÚógiW¥5OgÒEöÜÏ#|êæÞNQ’$oÁÔ.V[SçpœC×øªàÖ³ýs4'íc~òÖ=®`'FÍ•·œøGÎà•›ã ,K”däTä3—4g‡náÁìåB¡ã• £h‘wÆ _äë€>?’ÎÊ5| a¢ówIÔðe¿u“ßú*·*—å r­#ßu¾ÔVP§Ä×ÚÀ®¸21 Ês宄ÅËN¸˜An”b±Mpô°rÒ”mäöȉ‰ßåг@N¡Øàpˆäãu„ó|­ç€øñ¬Ÿ` Zù~7¥HK"1¨8lYÁng;ò…òÂóŽq4ô¥óÄ ›y¾ø¢á(ਠ1è­á¦âê™M1nåó6ÅbªßÊûmòûm’ý69ý~ÌiÌ픣ú)Âq+Ênžøn–·NvuOJŽÕÚh¹òƒ"oÉõ÷Z®´®jø/Л/É1Ž—¸Ìå2üÏ)†š¾‘‡Ìï)dÙ?¼K*MCs9u…pD·U,Oe¹ƒ¡z8C2hà0pOÌ\b¦otFlæãø¼Mrñ– ‚drV“†ïѬô§—ø,®˜üŽŒßšä¬†¦‚5üC@ÊéR¥4ñóG·ª#8SæTò&Í-o{ðƒ:ŽUÂ=:Ë[ÅR>늕vw¨Ôb—†DØÝ(ɼ—G)ªBñgÞFU*p1௔Ýu¸©‘ºcŒ}¥ºíª•á\PŽ7œsHu‰€»¸%2®P)j “ ¹W?p¯€âߘFŽ$‡…Ê:jø‰JI”´±ÿä¥Î{„÷[ÃÏʯ¤Ú—¨™Cq Ý—£eZÿoÞE[²7Û§áç´9JšhB’K6Ù¾¬¤ °¶Ëê§@«ìd¤Ï9£‘åRµ]|-x-Xupœ7¡L»;˜Jz)ê c¤‰d‰;i²vѪîMÇ' CÙ:MD˜fe'¸*ÀõEMhœ™K&óš¹”ådŒ*:$cAa©(ÓÊà¥eY·WutNx~+k©’C\_Õ•MŒCØ¿‚˜ä¾õi™ñÔÏ÷ÏÊš4Á%ŸGìõšØ áÐ.)ÀNj™5ìõ|u³X*µMueFZIC1R#ZôDR{£ª ˆ˜L­Tʧ‰].lW/jK¤·àÒ™žuQÔ©*Ïl˜gÓìÙé@Iš”àq-qª᥄¼wÃùt‘+š#jÛ<ÿ¢‚&vGØË%¯Åh˜¾‘$´'ùÍ ®!ˆIäKÝî-FMì‰p­»ïn£cHW™NÂXíDúnNoúW½»Ø ® ºRš÷ÄÐ5½”†ÄR6ÃÁ×›x!ªÞäß’d[éx@"{/J,+Énáƒê$[±B¸+;š0†ÉΧ *iEU>+xfÄíà•d¤ä[NWÿx^Ž7=ÖøGÍÔMLCht´µõulçó%ò$±~¾AÃ{Óô2? ˜>›÷cš&¦#„¸&fPè»’žü³0E†&jùGõUò!ŽQ85‘@HtÉgOåÔ踤“Õ²‡t/à5ÑDaؘ45#T7¸º©‰¹¤K‹]{ìlqÃíwO[”î[Á<ÑG2ÁðpIcYÛÊVy5fYëòö%mÝ+Ë–hâ Uˆ£L7o:·5Ñ‚0}±šÂÕQЉh¶õ–•cðzÂ& Ë zY€Ðè ó(rK_…ÿ¬ƒJœ_‡±Ê+ ŽÊ/dÙÊÚÌäÅÍ‹É ñ‚I‹œãÅ?)•–oHzÁk)I!]¢ÊœÄg…r)ó7g¥Ì,%©š8‚ø{ [þËl \¨‚y™çmù­[ öÒ$¯ÅŠ^º+0Ë),PÇJI BVP àtJªÛ™¤B‰Ïô'ºåÏ"›ÂÌ,dø‡–O,!îâ(È=I*?Fn¬ a§ÔàáÐÄJ„ý8 ¸ƒÅn}yÈ;²&ÒV!4ïã²Ä¶ï~(œ) åLMKÚÓ³5qiÏá®t°p²}—ã%·íA‡ù'òç­Œe’Yd/NúŸ=¼3œU¾‡ jtñ"Eɧ“å{ÂÙ‡p€S:à”ν„ë;¸´ÒõÓЄ}ËÑ%—tv®MÔÇ),¦m³ˆ:¬C˜Ðà)YÙs¹[Àáø£ú‚Ò±'÷|’w˜$×)â9_*é1 ¥œ¤Ê-†¹)‚Ȫr‰?³ÃìûKÇŸh"°§ëf\'ã„ÒŒ™~à âpL5É\@l@8Ì "}o#½Ï4”©öœIžOÉ){ж$B¾7®¾_›X¨ ¥MœŠSQ)¯áÑœn ìÏædŽnllÊ Û,¤Ë­õzœKnµ!åd[4K¯™Oq§‘]æù}é¯WÎû )U¥lÐ埅бÂ{÷­“K¤8õIM-ïF˾ÄáŒQ}l£‰s8ˆ(›%Iܳ“sâ´¬|r®&Γ»]Ê*ä^mK\€0»5•âÒNåÇß­[p1;0/!ÑÄE¤ú£Ñ•}ßç@fC‚üä}q KrŠš¸ acÅì,^ÉlZ|šÒÆBVÆÐn¶–I¯—´ýT0à§bO}®]àz ¯ã „ÎEåyä´5”IÆç&šë¦Åu¥lº˜GU(Ë¿_W²ñnHé¿!Ù꯴·àùûUË E³c§\O]¶Óšø*GÔÂd°D^FîœÄš¸† î:DVô:„Ë3›ùþ’ºz˜>²×;wF´FÜŒD~/åð4¨¬-•"Vš®]¡ ’Uµá´Š Fd§"9½¢êÖ°8(ÁþŒš¸žIb²áØAsCre7²ž8+qòsq3BÛ ÿƒwÏX~' ý„12öb„[.GOñÌ´5^??™œ?}ãa›7Çý¦Yª…ïš¡¸½vƒ£âNò™þxKÍÂÀ237NÜ!îâ§p×oÔÀî°?}³¢ ÷‰­Qq?YʲokÄ6ñ†¹уƸ¨¾ã«ëN€LAÃòÒ`•_ɧüé5_ÓZeæÓüî4baT‰»˜®Çj`'Ø™Ÿž¨jÐøé©§žž© êéÙÏ'Ö!6—¬ô[Åùýö8zjs?ᮦ—UÎ÷Ù Xá~Ñ=ž^yßkïY[·ý/¶ÇRçÃñqÝÒÈ/‘Ÿ@ŽW]¼nØ—ï*ú7 üå.±€~«ßqÎ/‘,'8ï´Tà+óaùs~uçwWçw7Ùo2oÍ1‰ž½iôÏž0…ZöØåê¨~íqÀÕ±½cûÄ Ü Óªž|fnƒY²½!Ö›Mís¼öy²ý XKì²þ <‡ÅÆ?KVÇ–> GP‡`ÙCÐýóëõ>~âAô¸ºJ:1vR¬'–Š¥üÝ«CÔˆ­‹e¶BÖ„%àäX!VŠ £×‘Í#±±ÍD×—¼ö¨l?#vVìô{k²õ¼Ø±‹­’Kb—Å®6+WÆ®Ž}•p_㚯ÅnˆÝ»… !Q·Åîˆ}=v÷V¸Çí®†TKè}±­±bI>="ùtÍCðXìISaÓÓ±oÅž£y_¨àÍK±—c/éQŒ“ÀWcß½ûAµã%䇱Å~ûi€°Õk$äØÏcï–M4q‚ü*ö›Ø{ÌUͧêw±cØ ŒýõøÛhâ>‹ý;öy.¹o:E(t áVŒ”ïŽÕ:Ž×qÂVÜyÒ¨êÓqWw§Á“ʽ“‚OÑqo§nÅ}Ga˜¸³ê2]Ç:ÖêXORõÖ£c\Ç„ŽM:6oŹå«Ññ@޽¬ã|úPJE%y+*F:‹:TZG ÂD_¤c›Ž‡—ËÕ. Ö®ã‘:. ŠbLA:uLW°cu¨ãÃ:>Z&#’ýÉþ¨?Õ$5ìqŸÔñiÆ”ÆoéøœŽ/èøm¿3Ê.ÊÙ^{6MÇïéø}ßÐñÍ <âS0Yu}KÇŸèø¶Ž?#9s¼ÓgOÕç:þRÇ_ëø[ߢ›8Euø@ÇßëøQPT÷R?éø?ÖñïØÞ ö?Õñ_:þ'ÛGÁ¾Ðê¢*ˆqª„ˆ°.¢º¨B ¯‹ ºØ¹Bf'î« »èB×ÅnÁqÓd]LÖÅ” d?Ù[Su±o™$‰ýt±¿.fê¢+öEÌÒEƒ.ƒ …oº‚ÏÖÅ]œi9Póß Úg(è|]$uqh%t¦‚¶êb‘.Ú*¡µ z¸.ÚÇ€Ö)葺X¦‹Î Eõ r”.ºuqt2KAŽÑý]S‰1® 'èb­.Ìò]mP°^]XºèâL(HZëuQio&6*¨­‹“uQ¨„6)hIúZ‰³d£.6ë"hv&6+Èéº8Sg!sä\]œ¯‹ ƒ¹ r±..ÕÅå8†¢ z|YWé‚,O%|ž‚oÑŵºøZ÷ rƒ.nÒÅ->d›¸íqqÇê‡Å×·‰»·ŠÛV/*YuÈ0©aJó‘[ÅÝõˆ{ê÷VÁ1g!NÙë¦/>¸ŸC=ñ @´"CÆ…„ 9HGâx ûv¢öIîEáá>ôdPp8BÃý(8œAíM°7Ì%È<˜ ´…ÂÕùÔcµ/…éÐûÃrê¹fBÔÂJ¨‡`œqè¥ß>zÏP¿!HÀfh„Ó ã™0Άf8æÀ%ÔöU8®£®‡áFšåf8n¥™î öûi¶áx’ð(Íú8 OÂa𵿭ð*,„ïÂ"xÃÐ?¢¶wa ü‡÷ˆÂßA;|GÀ¨í8>#Šÿ ËàsXŽŽÄ Љ»À Ôá(Ü ºptãdj›Gc-¬Âz8ãp,6Âjl¦¶$¬ÁV8Á Ø'b;¬Åcá$<L Xz±) 7@žý¸ ðBHãeô{ýÞëðfX·Bï€A¼‹Ú ßÇ ‹ÏÒïwÇ÷ÁÆ7!‡oÁÉ´{y| ø.µýŠø'(á_`?†aü Š" D5ŒˆñpŠ˜…NïûÀ&1 6‹épª˜_µpš¨ƒÓE3œ!‚3Å!p–X g‹Ãéý(8G¬†sÅZúMÃy¢ç‹Sè÷,¸@\ŠËá"q5ýn‹ÅuÔv;\"î‚KÅ=p™¸.Ûà ñ0µ=Es¾_/Õâ5¸J¼W‹7à+âçÔölÁ5âÏp­ø®ŸÀ×ħp}•€ª"pcU5ÜTU7WíFïSá–ªýàÖªp[UÜ^•€;ªæRÛ¸³êpøzU'ý®†»ªRpwÕ:ú=¶TPHµ¾YuÜ[u&ÜWuÜ_uµ]Ûª¶ÀU×ÁƒU7ÀCU·Òû½ðHÕ6x´Š¢ìªGáqÒ±'ªž¡¶W੪ïÁÓU?€gªÞ„oUýž­úž«ú+µFáãçðbáÛ¡¼ŠÂwBãàåP ^ í¯†&Ãk¡½à»¡ið½ÐþÔÖ¯‡æÀ÷CóࡃáÐz_ ? uÀ›¡NøQ¨ Þ Cï&ü8dÁOBðÓÐzx;”£÷SàЩð³ÐéðóÐYð‹ÐyðnèBj»Š~·À/C·Ðï]ð…*¿ =¿ = ï…ž£çïÂû¡ÀïBo¡ǡ·á÷¡wà¡_ÃG¡÷á¡áO¡àÏ¡á/¡Oá£pü5÷Ã;ÁÇáü-¼ü=< > O„÷†g§áYðY8ÿ φ‡€ÿ„¢¶…ðyx |n§œµƒ¼aŠð±ÔÖƒ¡ðÉ„k#áÍ Ÿ†ZøL¬ŸƒãÂçâøðe8!|%îþ î¾'†oÄ]·SÛ}¨‡À]ÃãnáÇp÷ð3¸GøEj{'‡ˆ{†ßÂ)áŸâ^áŸáÞáwqjø=jÿ3áižáôð¸DàŒHgFÆcmdœ™Šu‘ý°>2gEê0iĆÈÔv6FcSäpœ9›#ô~ΜˆDLœIá‘õô>„G6cKä4œ9—ž¯Àdäj\Ù‚‡F®ÃÃ"7Ñû7paä>\Ù†‹#a[äqz¼ŒK#¯a{äu<"òzÿ vD~‡Ë"¿Çå‘?bgäczÿŠ ìŠ†±;ªáÊèzŸ„«¢{á1Ñ©xlt®ŽÎÀã¢âšh'í¢'|×F3xRÔF3šÇžè0½Ÿ©èEhE¯À¾èUô|#DïÀtô.\ÝFÏOa&úF_Âlôûôüæ¢ïâÉÑ_c>ú¢¢÷ϰý‡4Äa-„´(ŽhÕXÒvÅÚ$ܤMÁÍÚ>xª¶/~IÛÚxº¶ÏÐZé·ÏÒºñlmž£@ÏxžfãùZ/Іéù ¼P;/ÒÎÇ‹µ‹ðí ¼T»ŠÚnÄË´{ðrmý>…WhÏâ—µðJí%¼J{ÞŒWkïàW´_àWµ_áí}zÿ+^£}‚×jŸâuÚ¿ñkø]S]ƒ×SºxCõîxcõžxSõzŸ7W×ã-Õ xkuÞV=o¯>ŒÚ–âÕxgu'~½º ïª>ï®>‰ÚðÕ¼§ÚÆoVçñÞêaz?ï«>ï¯>·V_„Ûª/Ū/§¶-¨¾©¾¯~Ÿ¨~ž~_Mq9©J>q!)$Ÿ¸´–O\TŠŠçÉ—+ªé—q„)Âxü>¨7â+î’¹ƒ31ŠÆüdåàï9øÅ1?]9ø1û¿#û­1¿$¾3ÆàG+¿=æà—ÇœùžÊÁ¿sð+²×«ÿPKCqé \'¿RPK­Q½:aQute/bnd/help/changed.txt]½NC1 …wžâ µQb©„„K˜Ý\ß6jG‰Óö xw’ÛòS–Ȳ™™Û›» `Šg—°â„Þ“*VˆI"'uœ‘•jQ{{§ëº¿dK%3zIØqÊN¢xg‡ tͨPÀJP>(¶d“àòýá.#ˆbGÞu‹ºë¦½¹4•#r+‰ÇÙ*¼JC Ú ²Ñ%ð!Rè¸3£ë)çHÕ¥Ðö ´aré{w@¤D[VN“j4g·ôxuÿ/‚õ¥ãé g)Éò9D¢ÖÉÿBò|´ï¸æ÷¸jî?zò™¯ ž¸§âµ]5¶ “2ÛRóÚ1:Wk•ÔòuaŒMŠÆ¢¨ Ô”ÌIâçÇ?‘¿­mðæ¼GÇÙrè@a8“8BOÌ‹/PKwÚ /ýPKé`t: aQute/bnd/help/syntax.propertiesÍ=Ûr¹±ïüŠ)½Øª²ÆÙŸÔæ¤ô@KòZ‰l³$y7É©S[ $±Î0s‘Ì­|üé.3Þdm’—]yÐèn4FwgÙùû2ÏtU'å<¹\5]­L]›²HM³Lš¥NÆY–¨YƒßÖ•®uÑ$3U$³J«F'…~LŠ2Óub ¿üpÿ þPMbjü°IT¥Õ6˲2¿ê,iÊDÕ³:#<ã¹.]™²ú¨^ž&ªÈ¤áF«¹|\iÀ‘«DhÕÜiâ5]ê\7ú€Á0`l<·ðXæU¹zÒhK‡á¿WÐån,Æ«¥x´àg*Ï X0ìdòÝÀ#@ÅXüG«« òDL&*ouRVS®uÕ]%WS{Ex•,tƒŽg¹üëj>×ÀÃî~þ Õëó#2"ÿ¾Xš<ÃÕJ×нiòN' °±ÒwZ­ƒowÀ¸è®…Ú¬÷(î­^çjvˆæ dLÖí:Ã¥øl®;â­{2©{‚¬;cÅÑWºî_µ ¥óû¥RÝT¦X ìÒQ¥¦“i·MéH]—U 7X€²È7[°1™ÕLÜŽî6@r•¼m‹,×ç7åL”É`ÌÜèÊŽïÓÝ&©zJÐÉ«äqifK~¦ç¦`OurÒÁz’ޏ_ÊýÎǹQ`Š`iR6«i™›Y‚²ÝA-1º³ ЉEYmÎ?¨ÂÌuÝ$K­@É,Ó"áŽ/jÐ%îáQ䪮'ªYîÄ¡’&YÊLË” ¬*‚^Mu–Áxÿ<¾Mæ&G=dY  àÈe[Í K[[]l4ôîò†¬¬Ï\¹ÞTf±lŽ í6亢It/u=«Ì¿ PÎÊ¢Q¦àáNa€0Xn§Ãš·©‘ÊMãʼnfæpfqžƒ®hÝ.`I홊¢™“6.U•=¢œuñ`ª²XO ’)a’«bѪlÃh8r3­ÍY ÏêîLUAÔ &‘G]w)àæ†kæl¢f_óÞ¯nH³£&?¾«@eõ…éË Zwºz0³ý´æmžo`o‚yE›±V‘¤ªÕ•Ú8Û“¼$]ENMRy²n«uY#6°+§éèzõ4Y å§…0é5, ðå86³§âŽ ,c” ÅÃ6/ÉZ1“¸1Ð:‚ÿ aWú-“ú`AË:ù$TV‡/²‚ºÓFLÿªîØröùöæðþY9kqÙðv]_±ïÉ“?o+€î =QÓ²Ll&å ”Îûhg ¸ï Çz/K3OÃlxÓ\¯jï‡t©VUBg’U Q®_%裮”É-6ÇÔ½4ÕD¦H5°ãNÑÙ*,e;³*9¤ŸÉÿ±›òÞ‘æv÷$­è #c“IE£g¥jWƒ²0âs¡%»H½Ö3PtÆ}ö°E“¶ÓR…¥¡ìbM)0 ^~׸¢“×501‚é¦VX}”È]»i_®ÚÂî"Ú5<ö¬>S°^˺ˆí†ÛYIÿÄßùí8;~îÌÙÉü­˜´ûö<º­Þ„{K„!PûÇÊ4àƒ=7·(oeäWvÿ¸òNÂÞ%êÄævŸÐÇp>1síHÞ‰‹|œŸÕq¬aœá#ÓÏÞ-J+Äv’l´ \%•8,éh^©r}S^StüqÔfNîP³ŸX½ÈœúŸãsˆVÙY9;r¯Φ4Íþê],ïcÌN5q[Ì»’íÄ&N ÄÓÓöuø¡;ŒÍì6u®_ŸðZÖ|0:#̼ôbÝÞµÄ#@ÝC&…ªù€à¦ Ѧ#SÌò6ÌØ‡ŸMAAag¡O£ßLCPl¥qØT†dœy†ãÜlI„í2¨ÅB­ZÜÏC¥›âÀ{ÚVÃÑQsh'¾ZÊ÷`j35˜:Bõ}'^Ž~;+5ó‘³àŽõ¤WÈ«h¥%|>Ûmˆ"Qº]4Ö×`‘þÁŽ2·«£¸ 1ǰN˲q1ÑgÅÜ=©CÛMñadåz&kêŠÇ•_7碃æ$Ó0’ª¿½É*p-~0–LmNÊK•áN¼ž|ÚÎz7eµHËzaR7 ©Ý$}<1÷vN‡Ö£|ø˳±áC0|.Pu‡ã€Ô1 D×DùÁdþ¨à0F™@C„Y龜 ï|…Ð9EB&@pë`½“ðJ jW”um>·ÃˆFYžÄ´g¸›#¦mzb?m˜Ä¦RÇÍt8ŠogmEòŠÎ|ÀnÝ®ÉÅî(›ÝàÕGºój±'sÉmDr`1ÓÙó~†:cÊKÈn¡Ï+ ŽmÄ€8e{x>.ñìbš:V¡›y'ŽlÝñ=l3âMfêóîâ‡Ãd¦ƒO±îðÝñŒ….D¡+ÝÔ¬ù¬¬œ‹m³ùt¢ UÆ혴*‹Ì4á°‰)ÀéÎsLµÄF ‡Ü—ïœ÷Nv ÷Xž0€)pű³óvVº¥³\«"G$ÜEÉŸ¼„ëeÙæŽˆpÒxŠwè[]¦éK¼×7Dm#hàÏ9 ·ÛÃà$‰!/ šx_Ž£17‡2Ò¿Øë€/³³Z¡*À6@.¢=©Œ' ε‚ÊüŠ–AYÎi$ÎÚ-9°› °_kUñlN»2'ÐmÊ<Ê>ñWd´S¯]QO8„àþéÎéc"q›«uÃÌ{”¦}`†£V0x墩`˜)¦êjÃÕý%‰Ip„b>pRyóéáµÛ ƒìñå`QUM®tžNõÂXlÑÃç¾'œ´]Õ»¹o€ý…Ú˜AVŠbš`Hlv$¨ùb*QhÎû€Æ.FµØn:j½’ATÐ[Ûõ<¤@§â¤üVø<„ü¡8JΛç!WN €Ê™Î¥|!¾" ™Á°\êÊ¥Š¥j!yTµ«ñ¡ÇÀ]ÀÔd{¨Z”/,BN*»#‡E´>S°ø:5«RÅZbsÆLÉ¡÷`<öTkû…T‡# :QŠO,‘ú=iÁPù/ÑzBjIGx‹´ãgŸÅ‹øÐ ©LBʤÆ2Z‹H-AêÜ«ÙvÔ(t(å;àó "ZWi›ÒÑJ7*SŠÙ&—Œ ”Z+û¶À`h3û°`Oa Ú§ˆx¹¥»Lî—}Ñçq k6C;:ÕDw¶ÔYK.žý3Ý…ÓušÛ…€ËÅ‚B0Q¡Noe»gjAÅ@®rˆÌ/öKØŠ‰;Æ8Žtô¡S®ÚBN„áÀÈk-fì!¼F¾^ͯÑc­hʵͼXáøÐ´à¡¤£ ¸CÔ!L’âÇ ±C±âno èÌÙrоÔ?S›ŸËùÏq4ÐH!öc±=jýe2l;xÕ"ƒ~\ØF…²œÂß/%SXƒÑ}>ÃAK¢-Ì?ÚÎÊx9¹¾<­¯FÁWgÂËj;àÀm­%ø…õVhÖôQ—¥9v¬¿F5"ÌçîåמõWÓPXsn{¤DX‰§;ÀÝ$o?üxýñ6Yôî>À!¨ýå¢lÐGÝ+g*êƒÖ¤€À0]CÐ;Ô¶s(´à‡èÄ2Þ*Tï}Žó¼|d§Å}”¹6Ò<ž^óHjïjY$òo´x»º¡¾º.ºÁÔÍë¶¿œF‹;Ùè¸$LkKœTèO/[Iõúe!Š¥Êq7^•ä‰o*ÜR¡ ×XZ\·hÀùª x‹´½·gíÌ×.Å G 0_d›{ä}Šk2âÅ:¼}B&Û‘ßß{Þê°Ô3Æe·„(ÎpôJÕóóîümÙy^OÁ…XÃqÌùÚë ¸úêB„¦–î6÷ÖöI䈼íkáîõÅíÕøž\ ¢ƒx $tÆ{u¹íÕåX/¯îîo?ým¿ìxÜ{xvPG`þi|½WÄsÖwãë›Ï·W;± ŒÅê —1Ò”Á<ƒv>š­R6xçc¿r«Ofe8ÈÿŒuæÈíþ§wjFUhÀíÜ,Z Ve†ï¼ñõ¿ä¢Ó8ÉÛ…)éJÏ´yÀ¨¹uÇf«[ HÅäÐ8/†²¢¼­c_îš.šâ¡ü‚«Îò‹>¸6O~ÎCšÄlx5Êæëeäà¦Úxß!lÝþ-‚¢ ˆ:ï3ô^$à”1»òà•ÑØjXv>”€8fî®n¯Ç7[Yáf`$p ,Žäư6s*à¸qq{=¹¿þôq+âfÏ0Å*óh§Ö3¹Çœ€{ ÂË¥¦­‡.Ž\.¯ä6º³²Ëí¶Pܵs{÷ ¤‹—þƒ;ÿ½»ø0×Á-4•¡·hÐFXƒÃ÷º4aêÂápa™O¶dæ[8í³fo¸›*t³­ niør#ÅÝÕd|;¾ÿt›èt!nj¥W%¸n$^ÆÿBÆ_eqögõ NH=wŒä’« :ÜkUlÒyYþóÃæ'=µkÐök¯íEš—°Ÿö Zzt‚k¹À¬Îœ0šÆíK¢\ßWò„dETò¨§N}º‚<„sÏž: +µ¦N‘ó.Ú)l=K¯Ã[ÔÀÅXýûS÷:pS»óá6MËŽAÎé—|3 â×à?á´J:RÒ8¼×s-šÖ×É37_|[À?h3ksU &)KfàX«nƒS–µ³Æ—ãóK×\Z‰àØC–ÃHõ¬C©õ ev`•ÄÓN‘I®Rg?ÛõSï!G;zN|ÊBªŒ („õêÙê*»ç&ŽÊÞì=qÉ –tÍ,`Ùã.É´´h§ÙÎ _È}"ÒY®ùº÷jö3âg‡·\¶ß¤ÓM2‘PÅVPüfñc5~;‘ÚÝL˜Ø‡€3R4Gª¿tJšPïs(›+<ãØ€Ú)9d±8¤kKG\®A¥5žçxlC<İÇi? uEÇ,ntöãWôb·¾W…ªüBfŒrï}·Ü:ÀâœÀNÔPÂw"ÝqP`j|¿4,a‚ïÝŠ—ñ®2\|k´j|?”Kîà_þ‡H}F±ìUBUÆÞñ£‘6„‘~09Øš—§±à˜<ûm\¯ŒÑ1—? K/X5Ã,`Š ±‘¥èim-¦à­è3¾€>ˆˆÛsëÎ^½#?­X™»Ír±ÒÎí¸0¢tõÒ“îr+Àu·(›lË Ÿz ÊÊ/:ºÁy©y–tÑÐ^Ü2’«ø•ó=ãç^OŸµ'Œ_Jæw  /å𮙨ö²iÖ)¾‹CƒˆìÂÀmuþÚqعnð¾Jǧz;T§¼Ê£ÄçRêNõì.â”ã<†*–”¬D¶˜¢é¢E^T¶ŸÎ>—ËG¸chŽÃžÎ¦Û‡åÜÝÌ´?Ã_cüËLy,Ãtb$òC~ >BxÏìÂEYUp ]ÿ°wÐÊ,×@ÛeD¶ÐÍØŽú’*+(2ÿ”î4x C˜4S7Av?ò-—8ÊqÕy’üCYà…¤Ø{ÈÚ Y2å£<¸† ƒÏ0ÓÖ?ªÊàI{ùlXoÉî@{žQE{÷Qì Öç±"̳²h]ÒØè›Ò‹c‹3Ó„Åñ­œSü/åô@Ö-øó¥Ã†jËér, èUS¥@þ`WÉ71<Á"£2ŒC™ºìƒŠWT3Í~W9ŸûÛs)-[…u£n%æÈWNŽäŽÇȺєÿÉ`œ¿€[ä^¨µU=À;;çË;ø« k[/Œ¥‡öŽÐy •”±IJ—ú¬YœäªÁ.i—s£ÖI÷‹5\×6A=A‡2ø«àos†ûˆËeÚ^º?ìã’r øÁaމ….[ü )ðÕ7TŽgKÞE%4žƒy™ð­¡îdã +Ÿg'‰n‰Ò¢ç¹_‡}](ËæëÿîßÀ¢Hþ 8’‡çœ wš#b#é¦-qÄIRÚ’Áño©Âðýýýä®Ï]½Ä«ô•þ–i©—ª¢È/âqî€ü"¥4Á ܽwÁ?8¨`5Ú:DšÜþÚf~öýù‡ëW¼ócö'¢¸f•›ü]ñC‰Ö]Æ` Þ÷ág-Èñu–¿›5öÙX d9Y—ÂëKå¬ÑÍYÝÀ–¿z>ÖžÀátÓèÿý¿‡EÆîèû¿“IUØT=íîöD“w¯É¼þz†Ÿ¹ß#€#…Ü5ÿOåžÔµÃön5}v¥ÊeD6·Ž« Nâ¼³aJèóíMçÝËt´cìçaIäÀoVt.£¿D^Oíƒ~MÛ}þï×yËÀ¾<ÚšïÎ?ùÊ’ï’·›†™Øð{ßðûNÃßð&hL!èvƒ^`Ø(ðw{ðñ ›Ù®È0äùÕ–ÕIõ}:š›¯:K¿{“¾ >ƒHñ¦¸mô”Lúwo’Ì,ðÔ*ö/×s·Ç`ÅÐ ³^”gÄB Nß7¶9-@™9‡ÿÅ)â^vhè@>†Ÿg¦ÉGïÿ?øŒ»–¼©<3U%´‰ÒWŒÌ` Èç/9 ƒ Ós(m~Ý G/~ƒÕÇY Þ¦¦”L¦$´D(î1-KzTä¾âŸ™«ß]™ÂÉ0ýÃZ?`]7 voé hŠ!K_×x{óé-÷Xê¯çïõWe'D¦Ì­ò^ÑZ£æVŠ^!@ÞÊàä:¸DÛ¶à:pó>ó±ëËtôyRLÜi™˜®Š"¼¹âذ¡Z[@»‡ÖCƒíºXÛPù_´µƒÂå¥zàp8»ç®Ž·c»ô ÎðÉ ŽÉ/vØø&;\­-EÔ§­y8¾$(z2pØ«¥ñOÚb!"”’AŸ?ºü{ˆ—j‹—¸¬¤ö¶úR»’1ÃkC7Íðê3þZÌ×0çÂè­/Ä¥zåóåÇøT‰rH5Ü—|êØzžëË-ý·ëñ.Ýñ—‘¶ X©¢ÅšÓ¶â—†¥'zK$vyQoà k3·Ï ‚á%ìâ™ÃÛf*…¥a9–`>¤S?ÿ ´†TÂ!á¯g K<Ür]Áä@ uòÖ‚˜¦OÇþ¾#ñ·¬U_­ðÚOv#*€,Y©¼ÏKWm«-³Æ_2âˆæp‚x+|/ü: *`pkYæYpQIçÁÏyÖ"œì“ºõ€âä”Õ!0ò´ ülÙ‰ñu÷D¹Ë ×É}‹\vH¤S„·K$Ÿ'ß ±²©M$}M¿•ð0ŸF)‡á’Îd<ÃØ÷N³Ê€]Nœ²5%àBép*Mçý²wW´ó¦½[e¯´Ùëî%‚‘’3€ô8œ‚* wó“ïCbpH—œWNíÑvç5_ü"ûšdb@`wtÆ”,µÛÝÝÇx®í »(¸IŸÄ/êA¥…nÒ F'”à`† –(R儚NÈq-ÚnH‘‚ƒ“.„ër§!Ô {„å¤sB?Ý·»Oà„^¯RUlÊbX_¿F@þa¼ªÄŸ €å‡ qÂñ+ÿ€Ù¢*Û5Þ²$Ü”1e«±pÏO0„¯Ó7©]íê!®Ç£Á„æc0Hù“©zš*ÀØ 0#’ =³HˆmÎ=@ÆüW©ËÓx f"½û+ΤC’‘AOæB:FƆoƒí.x‰ ·ƒ¡W|bï€ /YšNd¥}Á{»ø\žÌpÃoΰ“Ï¡ÊÀ´6¨mp9[Ÿ9îkXTn²ÂÉF_C6ä¤v»Š™ì\ ¥K%Ûxnè(]ÉÛûŸêæQK=‡ýíÅ8£tL³eçÁ¬¾°5ˆAŠ9`»Óït¸ÉÛG. p¦lë£iÙŽb¶iH äÔ¨TMéW&ôÑ4»Ý#”mSÂÊ•Î)tùDʶ{„²mR††5¨ÌÑ$¥_„–´P8çÆ/Wõ«@ÙŒÃN˜Ø,YµËñVœýݺùMì[={PEàöþ§Q³0ÏÕCy<ò~ÿ©p?I«¤Ì@q¬›²ôU‡ÿi,öûÂ"ø~†£ÚR<î²®’s>’3î5ൔªL¤xTÞiîi’*s-Ê<èCßõkúu•ã!½µônü× ý)&çï ßìW©`®åÂ=ÀÃ|) é·­Á„û>ü—Ÿ>ìÂÿúÃÕý˜ŠUl©ÃëCÓû…Sz5Üz¶[GDa) áFuÛ@wÑÞ:ZO›Ñ§`&LFAðáq%Ð3ww£¹¢ßOà.–N<ªÄòn©[³V3=ÆKhßLÉ¡K]jsäþPK#ÎŒçÍÒ€PKYŽx:aQute/bnd/help/syntax.xmlãr*ÍKÉIÕõKÌM‰)ÖÒ°ª±Õ1PKˆ8«)PKÛA‰;aQute/bnd/jareditor/PKPK¯TU;*aQute/bnd/jareditor/JarConfiguration.classNAJÄ@¬ÙÍ&£+‚DÔƒƒ'Š—Qrï$½k‡˜‘ÉDý–'ÁƒðQâ$»=Ù ÕUMÔ×÷Ç'€SlG)ìÓmçXçM©+²\Š3V_“™f.‹Î’ÓDÎŒ]h.jyjYWs*X;~uº5õün8™ð ÿ+„Òˆ»Te ÁÌ”cŒõ„ ÓT¾és¶÷”׬°“š‚ꌬôzõ ܃´ é*Ÿ+ÄËJWÒ‡wÿN*z&ìÁ·B?ʯoã1òJ˜¿cíÍ“báò‰ ÉŠ'Øâ[ƒkúPK=ÁNë`PK¯TU;-aQute/bnd/jareditor/JarDocumentProvider.class•VûSWþnHÜ–‚ø¬Z°bBÔUD¬ÄjåaŠZífs K“Ýtsƒbßïþ ý½ÓþÒÎÔ™¦e¦_ûGuzîæÁ&ɰ{Ïùιß=ß¹ûïü à¾U`8«ß- ®¥­Œ¶ª;y Èízš2›³ÇWˆ‚8I6òwSÒìEvÇ,Ã1=“™Ìq‰œºàI³(¸%ùŽ$÷à³™ìÒ3{E†n¥ô5^]ã.KYdP w­ùd[ 3„'¼ LÛ**ècð&`Øל’%Ì<ׯé¥f¬à4Ãé†d º#´ÛfŽOº'¬BI„Ñ3*p–¢f¹˜ÕÅ C$šÜ5PBÚÄÛELÁ Ãɽ-UœÃyª$aËÐTÞ„]-69W 1œò©Ô0ˆ}C¸Ì*È•YÖE=´¦Ùdãa\ÀY«# ´Wæ£ó­ü² Ï)eèÝ6¹W^EÓ0®áºÄz…¡Û‹5·âØd¡œ‚› ‡¶çjÞÄ@Ñ.912%ó g«©ÙQ—]➯_-ã5áÖÇ¢¹pÆ,ÖŠ¨‹6ö–eÙT™4;EÎ1L4«ÂÝF9u-Ñ€BÚ{»´Gž4áiC‡ † ÍeÓpáIEùÂ.R¹CÊ&óÔºeó–ùÄëÑj'xŽ )£Î|©(êµ×ëð¼½Æ›w…v‡½«Q‹u¾Fd/Q8v–Ü‹S”í]|gÞþ4,Ê{† åöw©|"Eì‡jiK*b‹ Þf8Q-ª±uÁo9޾>STw$®çÃXB‡‚‡Õš®ÕÙÐ¥"Ò =Ûbô¸’ ­èÚîüyÝ´äC:ä%«b¦3RÝ‘d“hÆ{È+ êU½ZPaÁ¦N+Ë<]´s©ÜÇGšöï«p@'’’±gËÍäh“î ¤bMv!#g¹‚ÇugtÙVõDÅø$!ì™Dw$º4Æ#|,™ú„`"Kcr£[Ò6ep*¹çÐ~ Åtm’Q2‡“;É•- 劶Üu»›œ²$$ú¨¶Ðúb¡>ù׊0]Ò8ótm§7îŒî¡ÁM<ÿ”è¤ëw°Œáš’ºpˆî”ŽTœ¯¸ö4ÖèØå:-OVåÓQsãu£ÇâØ®½.Äq¼P¡»´ ´üÔ€q܃¨ajiœð_IŸÏJND§h,Ho/º`?YAºÇþAÿwÐb£êÜ^ú†éÁ-\X<¿‹›þ WDûÔ®-œÛDü¯§nÔ:ˆoTò8Iûœ¡ëmÅYŠ¡ÙAúÅpçÝü†)¢¼VóÆ«n~*‘u cî’;1Ž ªŠAªƒIܦ1†×ü ò!àu$÷ýÒ€1â³wðFãZ#4ø+®6ÂŒz`B5˜P &‰©Z*r°ÖŸ0nú¤2½Œ Œ™}”fÂcvÓ>wýU6磲{MÊ{W°ŸRIQ¸F°”»ƒMÀz »ìMwžaž`Ë¡îã-*lù´€EWzôMé uà õ=ÙH´Ñ-,-lâÝ)ºw§·`Ð öI–Ë=ÁØV(ЛØÂ£ïú&>Ú.Ȳ( j¬Ê“[Ë´ ,‰k…¾NMOÜG]2ò§øŒ’?Ç”W/y‰¯Ül¿v£|ó?PK3­¶F¢oPK¯TU;#aQute/bnd/jareditor/JarEditor.class}Q]KA=×l²:nLýô£­ T¥¸-}ŒÄ*T‚(•@'›«Nˆ;evVû·ú¢ÐB@TéÝMP#¤óp¿æÜ3gîýó÷çoï±bа¢sÏq7íÅ}í¸g¼uñv{e" ¼µî,æd`¾eç&öüÝ€;ÝÌ;ø) ;µm“ÿ‘PYßè‚]Ûc… f"TQ 1KX›ðè®MOÍYî´76UP˜Q ÌEhàa9cÿÅæ.áŽá+G¶×Û÷…öOuÂ¥Ö8+›â‰½­Nˆ&áÍYŸl’_pꜽ4=v óCeO"<Å3‚({"¼4>¹Ïñ­bX¶Iù0¿è²;ÑÝšm›èAG;Sä£bàÏMFxÕþïòZ„zâX{ÞIŠofÅ^FXF †ÓØ7ßÜmÏV__j¬Êß*(ΔD²5±¡dÇR%ñK›7˜ÞüõõÑ5êÎK¸pÇ?ʦçb›ÄÖÄNËþ1‹R‰†’/‰ 9#úâ‹»ªÐ¯Ü)ñ@] {ÕŒ¡D¾þPK¶¨WžÙPKÛA‰;aQute/bnd/junit/PKPK¯TU;&aQute/bnd/junit/OSGiArgumentsTab.classWÙ_×þ.¤‰ Ø8%± x‰AäÔKíŒeY$ìXRèBFÒ „FŒ:K×toºïî^wÆÂ„&ÝÝ6/}íC_úÐþýõ»3B1äEs—³|ç;çÜ{õÖÿ^À£x˃ fõRÎÒ‚±t"8—KëVpdì =d&s ZÚÊŽ«1Ü' 3Ôâ)=“Õ‚ -–Ksz0ËZ¦·Õ\:>6Ò3z2gª–n¤©(PND"£õƒsêe5˜RÓÉà˜eêéd—ÀÔÉZjÚšPS9­5Úx:c ê¼fv†#¡h8~2"à³­E#£#Ññj({Ö‰:žÅ¨–1L‹¡ –¢Î.ZÁE=‘Ô¬lðBβŒ4T.hZF êq±Ÿpµ¶M¸ÃFBóÂ…½ jQ'°{POkù…˜f2²”&ã1âjjB5u9/,º­Y=+phð~¤ÊØã¦¦Z°L#%ðHë=ᆅŒ‘Õ-­«mƒý-÷•ôâa”à›ŽmÇrŸ4ÝRÆtJ½jä¬`¯a. ÚC/š±WÚ?¢à(aš³šål ¾·/G„!x!Ъ  ~/u‹Ù ¨-cÐ.ppëÌzÀÁº *Ø]<*дE`UKõâ8özpRàè’!ËRã³2^œÀiÉð»î“;x ®¡‹³ Ó_3ˆtÙÙ¤ZÖ]—TîVpN*»,##çç„ä¼ÒÔ“³–\ +¸(WÜ)mÆ’4ô*xO²ÜŠI’Á 4´–4äHlN‹ËÔT£Ÿº²'¤î ‚! ³¥¨;®]±6hÚXÆ%0ªàìªF”¡9 (Ó<®à)Ù?Êe5¥'Xî£j’}R•QMÆÄrÙFePœ]3‰éÅpJSÍ0I¡™–­¨“aR·–J—53fdµÕÚxŸ‚÷ËÀv3°ˆiæ–Í™Ü{F*÷de–É1 « ímmÛLA5dóË&'Jy’è ÷Y­×” >¾¾8œÓ3n˜Z°¯ÌÁI:}Ð1ïÁœ@`Š R 7…HY5¦ã $°¯L¦ڦdv |€ tLK±h…a´NÉÍ"ç3´gM=r%®eW—íC1CsÖ+t~œ×€&Ï´RD;Šœ¾çíÓXL±DÌÂ)^! 7 –A%£™3²O2™ÔU®Qý´aΓ°‘¹jŸJ|HÁ‡ñ‡ÄJx)Lùð1¼äÁÇN¿= >O:lß7?¼‚μÝHxQÒÅEmFÍ¥,^F»K?]Œš†lrèëqô\Â*ȖؤOo1+Y^æ‰Xªd+˜¹´¥/hllS+ ˆû¢‚/á˼Q×uÚ-´S°›Øôâ«øº_ãQ°qOÁ7—·¶©/H±o)ø6¾ÃÚKié¤5k'¾Ï‹ïâû|OÀ¿9&-kä̸– FWG£©\Rg‡ü?têHæ&›±Û£­u=™lôE»|ø1nxð“ —Ñ=ü?sŽ©¨a0ÉÛu%Åéîø•¿$Äm+)ø5^aâé²XZgË][âX­ /ná7¼*p l¹É•£à5Üf†œÇ“@ë¶Ìo§ˆ}X²w6¼Ê +x]žUÚ=+›Ì—)-ZOf•£ÛBGý¹Ò=¼ ´5øþäÁyèmNÙAî2}²úìÎ*ø3ªêì§õht¤?Ÿ EätW^)åQT&«åò\æï³cíÕåë¸aã+¸Sj …g€‹ÿHÜhD%ª8ópVjν%sùİǻí¯|wðyÎßz΂ü ~+ýKØsËkào•½X‹}üU<ˆwð+èà!GY¼H¹J®ýwO\K80Ô¾‚æÉ%Êã°¿=cþ&Ûk›—Ðq+8ÎÍww¬àĤÿ5tÖ6Ö¹YA§nãLq­zuéñâRÞ¨;ï,ö]«Kä¬#ˆüÖ÷å1°ÎëHÁëcîFwAwdÍÇÚÚ:{#nÇàHý%ip ckì c‚|Ï7`?GÑŠ&¾$›ùlÁÓ8Ä"8Œp/ñ¹ÿ2Žá:%nðù¾?þÁ[óŸhǿщÿPK²|Òa²À²MЋÿ»9ª \“˜bÚo ïáÈÍÕ§Š©ìæLfÊçy¼WþL¯AÞeWË :9I“§Jë+&6†xÁTG¡*\õ‰›jâL‰ª«¨:ƒdAõ®º¥‰@}µk³.tË´ìÏ#¨÷9+ç$¯¸rÕC¬ó–mîiÊœuÚ•ÛMcçh®›˜{hþ<÷Bpž¤_ t˜¤^$‘½%v)ìÀ"®ØÀUêc‘A¬N×h­·cíckõ³[Xƒ6”}Ž™"”&Bù”Mê§‹ÎNÙVÈÞÆ¶»TbBMˆ¢‰Ïà³ÜûœÝýŸ·-sEFßãäñ…¡ö»8Mb¿"Ùýæuøïàú2~$оŒŸW`¸ãnÊv¸‹ÚF÷2ò‚wzU£û¦X˶“€gI%1F'¤#Ô˜¨«z†Uœäÿ²Y¦'U’€ž"äžBªp–u_EËG¹ó[¼Aš„ý&~g‡À—̦€ ©ð^ÅïÅ2þâÂ8‡ök~Ž£çéöZ g¾"_€ÀßlÝ¿ÿPKeq”ãïÈPK¯TU;-aQute/bnd/junit/OSGiJUnitLaunchShortcut.classRMOÛ0~L»¦íÂWñÕÂ…‰FìÚi; †"6àî¦&u•Ú•ë ñ¯ØLÚa?`?jÚ7›`Òr°ý>~ŸØþùëûGØó0ǰÏ/2+‚¾£LI|ŠNåÙ­Bž©x µ±qf=”Þj“"Nåd*‚ÑÀ”Ôu <Ãc¨¼“„¾g(µ;× åc=u”Póñ•^bރϰ4â·œ´TDwS+Æ>°H4«¬…n[ê೑ÊFÖ>îU±ÌÐ<ÖjjM[mDkfßúã_Ç Ö<¬2¬<#àãÖ¼I¥ŠlÚᣖग§^ ¥çÙ¸/Ì%ï§‚¡꘧×Üȼ.À²Ê)C'üÏSíQúD ýÆL2íÔêòn">VÛ§‰ªØ!¢óè’G×ytg×;†z¤3‹™çjþÿ›KctÊÈ¿9ZÑ¥ÐèQõÁÕÀüÁ7T¿¢ÞXz@ã‹kÛ qÁ‘èa  5lRåÏØÂ6Íe4ñº;¤9ß+5ÞÜÿ•¨8ÈD-T†–ëÚý PK50°PK¯TU;<aQute/bnd/junit/OSGiJUnitLauncherConfigurationDelegate.classViSSW~ $†ëÒ€KÔjÜ“@rÕº "*6€F‰ÝnÂ!\HrÓ›”Ö¶v¯Ý÷ÖÖ¶3Ž3~èL±AËLýîÿ@gúÁÿÑé{n.C¨ÐÉä¬ïyÎû>ïrîýþøÀüè@ ÃåLÁàr";,²ª!÷ œPO¥QT)d“£\hÙ5UÐCÕ²Çxš§ƒ;`g8¢é)™'Ój.Ïå±aÃBH[å2˜ª ÎYotNƒç ù´®ñä¬a†º6•3Ø|þƒ=¢ sl¨—à€“aeTÍòÞB&ÁõA%‘&|wTK*阢«bn-ÚQ5ÏÐý¦“"î ®«#“=ŠšœÌñ^%C°¾h9Ãý%¶È¢™ÀV5ù¸JL „ï%|‹k$9 ô$ëT÷AhØBén£KFªåfËÄwµËh&Soî¦àºEƒHÔÖ™‹O`9µ’uxVš@«h½nÛiÖ`¤Q õ6÷êß*@Ö™ kJÛˆ­¥bW¼+•pìµZyh*bC«ý6±Ãc/ÂßZë©-BLcß§v ~Ç¡@Ssp áÀmj’P{“»Ãv®A º»ïâéœÛEœ¹û­iœšÂ¹æ"λŸ)â¹àÌ@ܧܧaã­ut±Ý&Šîìrâöó´ç©+"ÿ3¼­ubtq CÓ¸<äp¿ê¾â©›ÂSxû^Ùª ð^³dÈøˆáŽsøÉìKôéØHí."‡Fø‰¨Ii¢Q~»‰÷½ˆÐ7@û ã!´ ‡CTfZp­¸Š0®Sm¸‰vü‚Ãø•ðÛ8Š;ÔOÓü:qŸPþ¦^¸ªŸ‚ƒ¨ŸuÕCËUbô>>0ùÒÈFºý…ð1¹®ð >¥8¹‚­ø Ÿ“ûob¾À—f Ѓ3/jÚ¬¨q–\óUeèô–…ŽsV§¥¹a…qÈ cŠ”ï*Q´²(¶ÏFñuSê‡PKàµ4x PK¯TU;'aQute/bnd/junit/OSGiJUnitTabGroup.classTkOA=¥K+Jy£(‚€” Œ µ†Ä”G$ˆ®¢£É¶·ƒÛÝfü/¿Hb£?Àþ ãi£B›¶ÉΙ{îœ{{O¿ÿüò Àèa˜už'±àe¿Ê_ÆüÀÚ•{¯½tÊ»a4 ¤6‚Ðå¢âÉF$øQ5æÒEè;^›å9‰_©‰Ÿ¢2¤ŸHÚo2ôæ—R¥ *²èEf}H3 šÒûI½,B"y‚aØ *Žwè„RíÛ/SqMF sæ?Õ²•P8±¢e'oþ-½*ʉËÉŸ™Zq)ð?H7 Xþ–t¼À-šGαCù.·âPúnqéÐÀÃò¹3ÑÝFŸm[·nuçg1ŒŒq†™nE? ݤ.ü8Ò¡c*ô*ÃæÙû~«ô:/‰øz:ѤJtý¿•<'ŠN\Ó‰¦T¢› /žhïŶN1­RÜbXëÚö(HŠð‚àcÒà–Þ˜z£¹³Š»@Ó•»íË0ðUÙ:z^E离F—‚z½ý“,"“Ã,c…ÁˆDܳõüÛóÏQŠÊ éª8ªðÂ3J–¨“•”]:¦UÙE‹âÔDÖi5rG*Ów˜kUÝE½%;C}z‘éiÐŽÓÊhí+œ ÿ“>ÎÒ3­_^¢/0Ð  õ2­ W0Ø&ÿ ·)Zßçú¿"g÷61lŸ`Ô²SMŒš°ì¾&& ]³ìtS„nX¶ÑÄ4¡Ëîob–Мeçèxžàm‚t¾HpÉÚ/¬|FáªuÒRa†!R1…q²Ý#Œ` £8 _½¦˜7˜À;²†ª ÐRÙ®@¡U]¸Bwé_µ‡¢Ó”ýµˆá¾¾oãPK8ö z‚tPKÛA‰;aQute/bnd/launch/PKPK¯TU;%aQute/bnd/launch/LaunchDelegate.class•UíRÛF=‹±e+‚P¾%4@!©m>TÚ’46%%&䣆@Ý’4meYØrdÉ#KLyˆ>Gÿ63 dš™>@ªÓ»’lŒ±KðŒµ+ÝsÏî¹{ïÝþýëoK0ô1LªÏsÇÝ¿àvºÞqâŽí9š¾aðàŒœ¾9Ó”ìºÁùŸ2ü'„#•"=c„  ‘ž½)42ŽMcà Múp9fCô”>Â0Œ—¡ÆhÞOo㜆m“]¤/VzîW3Ñw˜8Â'rô·2±÷˜ß“cÇXÌï±´wŒ/2ñæ$! r\NDŽðeZŽðÕ[¬¤åøðê;|ói9N¥çæäþc<ùbFàØüZö©š#þ¾oc€žã$ù YdLÒm–Äuj€ÈÒµ°ŽxJ__Э²OÁª`5ÜôuÖ)(¤ ÔÉgÏðÜ×na‡"ÒçÏF°ë×Âw(P”ñ=~ ý£ÄºGÿñ?ÄKüH¶$VéùŠB¿„e¼¢#¨Ðø~¦ï¿ø{í Qj ¥‚÷¬")ëˆ3îÐŒï#2\ú£ã°R¾ˆñÀÜ E0’«…g~7$‰¦ÿÄF'ÍBM´E%•M¥+Í£Nš¥sh20ºÐ¬tÒ,÷ iŠªúø×ÿPK†*"“· PK¯TU;%aQute/bnd/launch/LaunchTabGroup.classSkOA=eV”GEÑ*X-ñ“¦†¤T’ ‰®!Ùøiº]·ƒÛÝfü/#‰þ”ñδ•&÷ÃÜ;³sÎ=sçÌ÷_¾ØÂc Ëâužù¼µx(òÈks[‡·¢¹ŸÄy×DáYœÜ÷BÙM}Þò›yÀsÉëÍ4K„—õ8z/ƒ<™Œ£_hã…Œd¶Í0^Y;f(4â–oaSÓ˜€Á0cËÈ?Ê;M?!Pè3ÌÛ±'Âc‘H5,²¶LÊö?äÖ,/ñE¦€Ø«ØCµ¿"ú¥aÔìq*ˆ= ¸“%2 jkÇ&æÖGf¢Ú&Š Û¿#NZÙ9*¼Jù!®'AÞñ£,% ó˜2q㿈¡HÓ®ÈÚšhAÝúë&G#:|³«)ņ­¡mHã<ñü0Ž?ä]î艭'[RØe†•¡ØÝèT&q¤Ž­w/©Ý÷–†înÄŽn±…2¦,0¬Nã!1˜©Ÿõ¯ýiåÝè÷Nšò¦ÑÒ ^Ú3dÐ[™÷‚{”yµ(~IMdå~#÷¤zÅ?¾© QèeA}c”Ñ‹¢Ñ¤§È(NTÏ0ùQÿ¶h4ô¢‰+4N÷7P¼J‘áfàO´Z x0k|Ŭ;Þü{†ëŽ[èa²›Ž;ÑÃ"e·×è¡DÙ]Ç5{X¢ìžãNöP¦lÅ9ªn|ƃóúU=ZZÁU.QíUªÌ©ösÌ¢NÿvÈõû(jÕ¾ŽF•U°¦uпÇĺCgZÇ5aS×á?PKÝ®ÙíIâPK¯TU;aQute/bnd/launch/Shortcut.classWù{×=O’=¶4lÆ€ˆÙÁ›<1$„ØâÓˆÈÂ`c´%cicdIŒF§{›î[ÒîiÚÒ½@[ƒ’–’.¤M—¤ý±LÛófF²dË®ÅçÏš™÷Þ½÷Ü{Ï»÷½7þóÊ}ø§Ÿ@X?^° m2“ÔÒz!“¸ ]ÈZv¢`+¬žÒ/ëœÉ¤´c“SF‚£;²VJ3i3—7´¤1YHiS‹Æ%yÆfÆ´ ø;:'CÙ¤„! šš±«¬¬226“·i«±†bY©e]Ì™6³Ú¨efì1Û2ôé&¬Ø8”Íäm«°³Ö×ú–’ù Öaƒ‚õkkÈ«hCX@ÉÉ¡t†V:b(l§$èU13cÄ Ó“†5®O¦ –X6¡§'tË”ßÞ`À¾`æ (¶h86¥ ÛEIÜçÍTÁÒm3›ŸÉѤ@kGçB MØÊ9Z{©µ×ÕÊØ–^:b•Ù˜:¯' í²i\1¬¼3ÒL ÔrOÁNÞ¥Äà,#YVÂìVÑN‡1­¼=œ6¦Œ=ß—2 º¶V™IÚZ"kZô({Ò "Û+—9K¬BÆ6§¹t0©çlîz ©x}ABp& K`ge‡Òz>?PN]Ø«âa<"°’⨕•sREglq¤Þ² U± ûöw,C 6¹šó¥¨ ìZ^Iµin#IÃ*|’„-©iaF)×ä1’Õz½€qŸ¥o_ÂY/\ßWY†“&wé¨nÕFÃx»‚#,.©âIDݤ¹ƒÑLN–ˆÍó’6'å,`ÆŸ‚¦ Æ ºÄ2n*ÃùâN] ¾@ƒé®pI«LÇÕ4•+‘k©àUR뤊 œbªÏ›¦äÄrV·(»«j”ÇÊig¤•µ VDÛ¨ZÄ;ð.o˵þ°|9ÏfÓy¹Î <ÑQ‚Z$BGBÁd©f;³ÃÏ&ŒœQ‘D‹NÎ-ãzââ¸En;UÜ pc±!© ‹€0ʦÚ(çZI·[`oG]!—BNØÙ{2Ȳ¨—»ÁˆžÑS²~uþ_•ÞR2úò dÍ[–€ î­Å;Àp­X·‹,Éåàᳬl‹–ô!~”+x®”÷‚m¦µAËÒgbfž|¡ Þ‹÷+xŸÀ¶E9”MR&™ò|Ðí ‡óz!MjìZ<¶’ÒδLÓó*¦pQÆù£*>† l¨¯’|Þ™õо+ºn!xjKË,ZopÀ‡ø»’bà[¡bÁ§#À¯ù  ›=e>圿eËõ²ŠFghs…¨ße³ÂvOôßmäs¢û.vÄ#E츇£îK@ô7„¯¡ë*V„wÑÕßp ›äHÏU´Ê‘ž–®"z}pæÂ ÷°ª+ÜPÄžYì›s¨—e´ÚÀ{ÚJìÄzìB»¡t£{yû9LG¢\y}êƒ.2µ|{ ýŽ'ÀjnÀq¼ëüÔwˆ3,aÎ â ÎI?‡EÉä%gŽ‚jE2Oqõe‡ÉW¤VÑî%)ý*fNß»Gnã=³øm|¸ˆø÷ï \C$².°G¦é&>ÑòÙ"^ðƒIý²À,¾~jäßK>œz> Ö"w^úï¿zŠø`Sn×{Ü÷@²ˆËì¿xÝÙõQú 榉y 1#+“>7ð»¤l'æD½ §IØ3¤íÓ¼ìŸa¼Î2¾'™×sy†#‰ 6¤Ë§½(7ñÂðsü‚Þ·aœQ»Aû™“›ø%c±ƒ[BF¾¿ò¢æ®ÿµÃѽ ôy{^qc4ß§*‚®”KÆ™ª ëŽ¢Û|—tè#".C-÷ƒyu£ZĬ?¯ø¹iñÒà]?X$î ŒôÌÙÞC‹ÒQ¦°AÂ]Ö°'oâû6X _=|öñì¿… Bö—CÕ7œPù¸BCº¾Åߪ ƒþwüÃñàMÇò[ÿPK©,üz=PKÛA‰;aQute/bnd/main/PKPK˜ˆ;aQute/bnd/main/bnd.classĽ`TeÖ7~žrgn&7ƒŒŒ)€¨¡W B@‚ M$Òœ$4Q±×µƒk/±`×D±cï]W]ÝÕÕµ­}] ÿßyî½3“dP÷ýÞÿ÷¹›¹÷>½œò;ç9÷òÔ¯÷n'¢ýgI ÊÚÒXY_=°.ZSÏ7AÒ‚º¹éµ5•š× œo¨Š555Ä©†–fAyS—F—GÖ4 «¦¾¹¢9‹Ö Š­¬Š56×4Ô7 óEkj– 6Æ–ƪP725ÕkeKMm57ÏY¨Ÿ3î°²©ެ˜~ØÌñ+ÐDÒÆ£µæh}óìhmKLaøBP–[pÆôiœ€©d» “¦£"'aÙg–Mš+Èž6¶¼lÒÄŠY‚ôÔ2¾'ŽŸZ6£Â”´Q²lÚŒ‰‡Ïà§Î(sXÅÄ ¾/@î'Œ›ËOcÐëøéÓfL/ŸX>‹ŽÇjLžx8ß:QU[S_Ó< ©ýúÏF3ãªcYÈÙס Ù|×ß¡,îo·©5õ±ò–ºÊX|V´²6†˜ÚP­×ð³—a ‘¢Sï,Dƒƒ´Ÿ Îfýk£õ‹V¬jjŽÕ9dQ€ûŒž›—Ô`ýwŸÚq{±Æšïuí7jZ#ÍØÇÅÃûÏ¡‰üSêÐp:“‰·ÔóóH‡FÑh¬ÁâXóÄx¼!ŽrûõwÛhi®©8µ¦©yx6¥ñA'¨SÛ‡&ÐDôÞT³:f–¨,„ÙìÐdÂ&ëØÊІîWÖ6Ïò‡¦RåbñxÊíÑ~¬ã˜tbq›f€^+5¯ˆÆc1YACUUK<«.Ñ4šÉKZÊë—y¾Óè0‡fÓ¬w´±1V_-¨$½èôJCœý;ÔöF0œ›˜ëÐ<š*hnp3±üý:VAÙ…tdŽÎÀAÅ#¯ ©Ë^I`È*¿°ih¢ÏaŨ7h©Ñ­­Z6+­ÂÚêh|16'œaÁQ±$÷¶m޹7ùÐdS-ÆQâroˆê©1H mÉδèÐÑ©ˆÝ­mj·ÈþÊͳ {›]Kk~9*•4󀙸V:´ŠVcùšbÍþ,úÍë?Û¦5 ¸’ÆX5ø¿¦Š‹çÐZ.š¢3¼t›Nd•TF›bA:Qã¯í¤šZ´¿ŽfòÏÉB§bÅ@Ác+›jÁ\Óò·Ê«2œ;:Ý¡3èL¬:‡–ué×¶”Ë-g;t7\ì–ã®þäÐyt>YÓ4¡&ŽEhˆ¯2D¥¸PÐ^f¨u-MÍ•±‚hÁòhmMuAµ_Ô¦‹±+âÑFî`ƒCéR¬WuÃ$2±n¯ÖeXC\ï ‡®äzÁêCc6]‡x¬6fF)èZ‡®ãYÕ 3ÝT›ZÑBu¬²e1¸Ñ¡VºÔ¦›1šå5±œv‹C·z£™$›nG #Ç9÷N‡îòú4ìaÓ=xˆ­ä6ƒÚìЯωnªM÷ò¨£ÍUK¸À}ÝË}n5@ô4Çšš›8ýA‡¶súÃËÊxl§=êÐcÞXG’MsgÃîŸtè)¿37Õ¦gP?klàüçz†Û|iÕ5‹L›/9ô²×æ$Ùô* TŒ‚3_wèU®ð&Ò–ÄjÍö¼íÐ_¼ “‘dÓ»˜N]´*nºø«CïÓfA¦qÚ.w¯Ì¦¿ƒ=K˜Ù>rèô1z/ÞÜ4§¦yÉ.äè韠§²z—‚ {àÿU uuÑúj¨¤X©ƒŸ±û¼ló›Ù¥l Ò—m¸ÞeižØW}Mß`ªFä ê—¡Ýù„¨ô;¬Þ(#žêý›§jCðš‰ÚôAÄLô³C¿0c倱f@¸×73×i'81¥[&G›–TÄ0¤_Þ(” ºvÌ:ÿ73=¥Ï¤m~YšÖCß<)añ¤–Fã¶šéEã<š,ð ±¶Íȱ!á@‹œ6~Ö’xà F¶Ø Ûîïm›µEÐÖÐ]Çu"ìˆÝYâ H]Ž]™0{Û¢h®¼¡`FÞÔŽ4l±'¸cz½§8±!"ß=DO4¾œáÖôELxe4™-‚n½&h}ÑËû($»¦963MtmƒʼôáÙ¢¯èû@tÌuDQˆ¬‡Ðh¯D=²E1„iAi74ÀyâÁ%ѦrÔá™ïçˆÁŒU²A9s¢ñzŒ·É §ºÂM±ÅÌÝ‚îRUõèQÔ sH£% Ê2)Ðæ¶ 4¹[œ‡ÕêÔ–T°¥êšÐ@Qö˜Çô›ı û/8Ö°_ zÓ{¿cyå'9â`1\ñT 8¶:xhÂù# ŒEš‚¾Km1<CÙó轰߀Âþ¶˜áõ<èX^¯™Ž¨€Å!æ4§wÇÒï ©‡ÄlqxP3í±‹"Ž˜ËøŸw`¦;ÐC·d“IÓÂE´·@ ±á™òq¤8ʵ!ØÔ÷ ±á¼ª•ލbà¨Õ/nf#b6 Íjj¬eÔY¸ëÖ iŽo¨­Å”$eƒ1…ÕU]¡îÈܶËd¶1V5úFAaÆZ#:Î`”Ù¥‡®¦Õ<ëŽX)V¹8¥¬~4Q~íw#ièA¤Å1I 1Y` ‹µuâXGÇp—Û*ÖÅBbµ88[‡í³KŠMÃM(¢#Ö‹“Ö ‰45´ÄÑ5ƒ¬ô¥ŸmÄšŸ"N Öm2qº8ÃhŽæø*ˆáöuY2g‹³x¿ÎnSAq®/sýæzOäv²Å9âm;È̤`ÍG§žÉŒµƒwöñí‘°‹AÁb°ÅS_¼…Ü9ºVDl ÖaÍ ¸KÚŒ׉gñ,3oº4…mñ(^´o»%ñù@oŒãý6Bâ%ñ*Ï÷5A#ÓDÑâŒÏãÀXM÷&#>K‰[¼Á~¢äàð7þ–#Þf g 3>5«wPvBŒ-}ìt“Wö=Gü•!ƒÍT¦-Ýs*ÌŽz-sá¿;âCn˜ §2mñ$Moi¸ÿqáOñO†±ì8q3A·U0ã:èÂ]-´÷Ø™’ ñeH`ùò/~NîÓÐ×<Ùo2‹ßþíЮ-¾c{¼)mè?€ø4ãµæ¬"Ä÷ýÖÚ¢Ÿí Å×ÔRµ¤ ÕpasÆ«¿Bx–x3´%ñøë’Ï’½ ful©¹¨§l€@)il¨³%{êJ R±˜º[;«‡•-p:“¸>p‘lðo)´qVrÙÀóÛ£µ¬ä"³ù•œznðö.Øà;8U40¥Ùß TS4ÆâÍ5¨æš&0&6õ ŒÃù#PÅ6lbÄ]°Ò%FÐȮȔíÌHÐ^¿#²óÿ’ï2ˆPÞ…åŽ\aH ©I ¬3 hŸYñUh”a™+4£õ õ%Æg½àé([®-Ó®('%Y¬+;Úö´ç`ã°ˆ73ú>ÆÑ4y’C³åÉ‚ò3yoRGëä©0e5W9«œÁU¦ü†GPž•nLOž„ä9òOAy®ï/4k46®'Ÿ'y9¢M|„ehãmË©£¤¼P^”X¤aÃűúXÄ8p<`~sÌ‘—È X€ª†FH‡^ýÚ7’é€J^êÈ?ËËx@ÕÕÆËI¯—f‹÷ŸÇůpä•ò*nsƒ™;;3M CZPv²åµX0 75ƪ “ô³åõ‚ úc{› 4šy·Ýó+ÏÏÞõ’¥ê:‚nÀž–új–79òf óËiJƒ»|H7?“ܾՑ·qiÖ®i8Ç©­H«Ý¹ýú¡J¤×(hW¤SØòA‡0ó”F¤.èWÀGk ÌÑ®.o¬)ðwìñÇ…! ú¶åf ’ŠX¬`IsscéÀ+V¬`hd@eÍê|ð:p\}µ-· Íýšöûy³`³Ù¬à¨þè¼$ÙÜNÛµÄ<Ørä^²‘’å ¾E«0ƒºh}Í¢XS3nkkÌÅnzåû½™»SÚÕRèp·å&¦¡èdª-€ÙϦ…ßúMâhÜ{°3@¯þ ‚åA$áö#àAN0ëiÆÂ®ëQ#âžùZÂâ·iT‘-cdîNÚ–3ò'nË'ùÔ‡f˧¹XM]cle£-Ÿåô–&ÆÀÏs:n«+QýEcµ4Ô56ÔCÚÙòe†öÑÚZ[¾ &Ïç A0¼ejbqèR‰ÁöLúlÔ ù¦CWÊ·˜ÚÛ ìþ³ƒò/h=E£«kΫiL ® |·£+g6ϸ†‘ê;ò¯0RåBÜ1.}GþÍ‘g'HÀ]V©9òòcNó–}¶@Xà~X⟘є±3È/XmbæöWÖÌè3G~Î,Aß_-¿ÄòÍ÷c°(_A, ÊoÚœ‡ÌŠÇb|"¿–ßË%l»®™ÇáÈ%¬¼.fØ5õc›!ê!h¿åw|*¢ùgùkPþ¾«2ŽÜÉ&r`Yl•9žù‚æf+){•jãy«`¿E+z¡a`_ÛQ¶‚¹—Ó§ä€AMæ7'„UQ!Geóª@uÑf[å°_ÛßXh«Ý€eÊêØiP2#Zµ,º˜ÏUGåª0¶Ç¸º&Ç¢}d´”Ûùm•‡'®Lo*Vþ kGusT„ÕHVZÞWMàåÙåe´OóÃ=G†»ï–Y v½eXF÷¬ ÃÛŽ “øhÛ07û£Næßí`×^hîgÄÿI¶ÂÂ9ó“¡o³- ñò”Ô±Õ ˆ½ŠX|y  C’јYV9jµ:Æ?tÝU®ÆTÇb‡38ùgIRkÔZ–®Ç³×!ãa@€Zçƒä¹~X7s[Áh䵞9)e ´+èIêS`r¨SÛ¸èÝq¤LE·I.VOwÔæÌdQmKÓ Vl²ÕÙ l`8Ý>ä²L§þXUÞ.¼18¨É]Ú‚$vbÿánÉ'_£#vñÁ»gZ o¬(Â'ôùgê_ÐÙýþâßj/ÿ§Í@Ò[mÄbr>nÿ ö6·MGײð¼ÜQW¨+!<«vháù‡Ä)ŸØs¤•f䊇&Å“þw&!hêÏö¿Õ\ÙÿÖ&Á.üZÝÀLpão˜Ä³³E_u³£6 ìBæ‹[u›ºÝU%Í5UÑZ3ü”ŽÔ¨ä=v£/ãCÃTµdض£Ö¸úeÈÝ…ðÚ~ËeUPmõQs'È¢E,+¶0ŽÚ¢îsh¶º?'~/¦Š+c¾0ᤋfrÔà Tc´ ŠJnz.G:D«]g™lªLêÚŽmñ` -Zx8OópžáÈñ¿ÑûsàžÃfM*j«ø ¥j ƒbÈð—0‘²ú&”«©ªaoT4¾¸¥Îœ‘± b[±˜–oµØêA!°&™È"Xf^Œ zÍ¡[L¶)¿æBí2)å²`áæô-7ÆÂœ«x3o÷ig-)+Ÿ4з‘L›R謹Õ{éN$W½`ªÍñCÔŽz_}à…¿D›AQõ©“ƒßTQim°/MýÝQªð˜PͲ˜ „vÓÇŽú„ãÞ‚uøôˆ´Oõ» ³jšÊc‹£@%¼˜_ðbÂô›ð»Gh³kRcfùÿ3bè´¤¦¶:«ªoýl¯±4•Rߨï9ÊúÌ ú7Úì`j·)ûƒZË??9êgõ‹{8Ëq[Ýx€¶6³oª› €Ú)Ž jjcͦ—Àji‰ÕÒ°0gý¶Õq`dõ0nm9:À’/dB Ü~ÕbŠ]‡°áã£õÆ=á¹ñXWÛñ$öQ‹8h!2u‹‰UïùÛm‹½Û-ÑÝ;¡sSQMí P&÷|PïîÇâyò@‘«ïa8¨CÅ«ùÈsE¼9¤÷ÔùAÝÝñO G÷Ð=Mxm”ÜúͳGè^A½wZa·mG.Ѱbƒ(UVƄٹ=œJOJ"’@¥‘cŒóǧ‚<ÿhü¿†ë¬øNÑ…Ž.2á†5Më›W…ä…º„á[Ĥ~•rÁý !Õ,[ï/(èS²ÿPVo,öëõŽ–šFëuæÚ3¾ :âÍ.Ød8ðT“‡>ÂÑ#õ(+¤ñXï• >p A=VP¯T½2`†ÅÑÚ±žIúÛl‹øÞ¾&cœ/*pý9¥!=†ãõêI]¦ÞÅ;¬Ì}ûWRe àPŽUøÏç]5Õì¯.mijfw¦žÁQ)÷/Ë™mÔÀh¥mæ§v⽬íâï?Ïm}5HÇÿ×Úýƒ›Ö^HõÖsU¨O¹—’2mÞ=ÏÑóùØ“39èOõ–Åœ~„£ÔG!Å„Û{b汜ì-ÚëÞµp8K¾ÚÞøÒ‘®k7ZËÊm½ÕÇ™…)©XUWÙP[SÅ™¶Æ.‰~Yò½ÔÑË4zq*æN7}jÙøò±Ó&&¥§é3[[9ÐÓÛÃCº^7uƒ¯­:qôÑ&t±Ñ}´5ëèþýJæ*¶°ÿè… ØÎí´8z¹^ÁȆ– 'øàù]Œe•£Wëc’z‚kÿô6ƃ‹*bG·Äê9B¯CKÓÜJÃm Ø>¬¾¹¦¹¨@¯Õ'õñæèU`pq>;ÑÑë`Z‹ã -¶>fŒ¯žÑ9¢£9VÀÎþ‚†EÞá„K«Å°LMV£ø’© Y@ §:ú4}:4~²)×SÚ4)ÞP7>éué· Çb‡¥d²¸‰>ËÑgësåÔÅâ‹c)z÷tbkãuê?ÛÖ‚’ñÈiv,ÞdÎ${ëó}‹tªªEë[ý,³‹5U_Ìgûe™BÜy$½‘=ûOÑïÍÖ°;Íunð½¾ÜÑWè+¹ s&9+V×膟ðßD+¤… è«}¾ÖàÞƒY Þ>šÇòêzèÝ*h¯ß”+æXZßè蛺8°bͱéõWÖ4c’¬ÞClp¸ÌÉFEGÂ7fb4Ÿ$Í«¼Ùüª€»¤¶¾ z¹¤ÚÖüÒO {8ù]‘z½ÙÑ[ìvv_+[\ßç÷ô½èã°úeõ +êÓ~ømÀz}ÐÐ4~MjIty¬`°÷À Ü€…8šØŽ•ã)êìvúÞÖã„“}ƒ…|ú$cƒAýX›p%Pb ¿ÒÂàÓê'zA?)¨4sD†´yÓhæiÖlϤޙiï†n[ƒßÑò&Y‹jâÌwiùD6ZŒy,o~æ8Ûô‹ô)ý· ÀÓª£†õ«þ©G]鞣~ˆQܤß`0ø¦Aã¾­ß ê¿ø‘>íüMŒß5Xp\™™íÛ ¥ßUÏY‡|¸ob!–Ä|åïçߘâ€GD•É úö®;Æ‹ãÚ„ OOó‘Ï@¦³Ç¨[æရÙú3~ûëü,pl²e‡ô¿ô×AýH¸ý[sü(BGTèoõß…ÞÍøj…þÎÑß{ s6ƒ$[ì ÏÂìÍ{ƒ©³[ÿÒ· ¦É°C4Ct€­†Aé5μ1[ÿêè±Õ•£äjYWÕǪÓì&Ë_ùg X×RŽ¥ùD#XãžfØVÀ-5‘¢Â²±ÈÊ4â¿uíJ¶•Qú> `ä…VŽcu²vc aðaævFÒáÕôô·-Ò¢Ñ@5µìei Z°z¥vÅs¹šä¦^˵-‹k걂VWÇÚÃêæ9 LjS»ãDA‘!øÄ [{:VwÞ\»*ZoÌÛê>á˜ç&ÛÚ‹}aûW0Ë`ímí´zùGŠ.ª†V] /zX½æJW\^æp[ÝÃ{³¯cõ³ú-ÒØà‡Þ´S&ƒÐ¶ŠøŸ«ÙV‰yŸqy¬Þ¶ØÂ™Æ·Ak?pgúûåHh²R ²Á*°èð¾‰ZûC¤Zƒ¬ƒY¢zòÝ0Ç*µ†»~à· ½'2Ö«5È %æªcµ «P†9Ë…¬Ü×kÿŒu¬q6ÇÝðK6Æ$±&p(Beî&±SÌ×hÖdàkŽê¬)‚†s™‚(‡²xE’oñ¢9\ ¼b®M³ØÑŽÙ“ýȶ5UP4-bÅ-æú °™»t£]6Ðëh`5tdmC´z4#‚‘}šúz|Û¼ª16²²¦>Ê^z«ÜQÙÖtAÃþ+žiûê”°u¬™V…yg¸±a‹Çåý¦þ>‡ ߥlû#"#9ª+lUÁCšãX‡3E›!ÌqšçXó9-‹Ó&ÅO€`°MØGŽpt_›êýGAodWGc£ùNBÓ2´QëÑHqêï<è1õ7‘ýµ-qÈ›!í˜pÄî¥]ß°ò!íyÿÖÌè2²–úïÙ×Çš6sjȪÝéXçXõVƒ{ägÔ—‰.ð-O¯ô.,OlçÑŽÜߊ§bù~ )£·fô¦ÉŸ­å޵‚ߟ´¡öÍ;Z,mW9ê kµé~×6Hò½k ð&ô,xØèÔ”ÙX@ñZ@ë8~öï0½q¨Žu¼c`Þ…64ànOtÔ=ÖúÌᵂ8K^ʵNq¬S¹–íqvÇz6ñ¥¤ý)FšLôåƒgؘ­°‹ÞEÛ:‹]:Æzá ãXçZ0§²Ý¤QÃT™¤Éd` Ï‚L«e'­u¡c]Ä͇LŠiݶ.4Ê|  ŸÛkÁˆ†ÚêQ#êc+ðk²Fq )ãåy©¦LÛÚ²1ÍT7Ä\P Ô°¸¾fuÌÇ£ BòëÏͳ.ãPð?.¯p¬+ML@Æšmëj°À„‰S'ΚÈy}Ød]ëX×Y×»B¶v€³;^òd{×/ëͳ­Ðúaåã'-?xân]¬¶nb¯â1¶Åaž‡Í˜0ÖïÙ¶nEŠ™zÉcÝÙÖígņ>ït¬»¬»ALKØ÷<"]¤¡°?rˆRIÀ.w{òˆ¿ į@XXãšå7eeÁŒ…ŸLz¦õL~#W™ïШJþ•Qþ©„Â…và¬w—‹ V5´¸ ÈvyMuÌ}¯ ûëêÆ!Å‹k …Á˜ ÚÏËHí¿÷‹±ÚŒº`‰=@¿ªxiŸr¬§­g8H¬%-Rá¿{Årž‰1C'¼y;æ)¹Nü™‹%M°¬ë%ëe÷øcNê•£¢ßµ’…±¯zŠ0Þ øú:`Vj`ÍÑÅgEZÞäZ@ùŒÇ^£™¶õþÚø+h½Ûæ+=˜ù­w*½f½ïXX0®‘öƒúRðq^hn°û‡ØÍšb}i¾)Ã.2ÛúŠ¥1ßr÷ß {9ݶøÃ%¨À<ñƒcýÛúÑûÈÈ,ã]šÖÞ‡²ëµÏX0m݇÷/³­ŸØGb¾Àƒøƒ!ÛÚ‰EèíÈ€•uµÁ€hÿ5 ïô%@åPq@§¼¬m‚K¬×‡. ù´>uX•Ö— سܜáT­¨æ°]ÏËCQqlC¯&†9-‰VO¯w„9áܳÍj´·»Wtø^˜78;“+ÛEò¼#í@Wl{m…[Âs7bÀx¶{:î|×Yå¹ͧ52,ÿl[ ³°¦rÊÒ^ÿ³{cŠÉàs;°¸&­„MOƒ}œ@_~“¦‹ù”H¤¦.6­¦ŠÔèçú yµ<êi2äÓq œ†Úò}™(qV·Ä ø´Èü'¾õnÔÇ¡ÀàÀÁÀþ> šÚP¿–aà@¦˜6/qpèúkË_?àËÀþ(eBžæÙú¯G<;€Ö3U›»ò¡ÿÔhK=» CÑÜÕŽ0Þ¥¡€í Œc¢ëßÂå@;‘‹½rÓŒ½Å®B;p°ûž¥W¸ÀóQûoF`reN`Jà×^wÄM,Ê2ÄtÀfv`8fz}íª‚†úX²¦–FcVÓ3øÆ»Z‡'\8ˆ–NµüÔ×Fº×NsS„ æf渾Öè† »<8ø…6ê;0—£Ã8² 0Ÿ‰x £2îoSýö&w e–µü¢ÈïÔË$›’+É’Ç]¹¶p¸½!Ó¾Ðm Š?ÉYËäs‹üÖmÒͪí vÛÚ¨VãÐðÀÒ nxp*{–Ùôµ€ÝcOŠ"Ã}/!p´ˆ@mYõ|¾Yk>~×+som·©j$¡-޶+9^_ži‰ÇšŠAû±Ôj'pŒÿ‰$–Bž¨D¿Ç¢_q”X+¨x£m(÷=.;p‚ ½ÊS=Ããå,Š7Ô•2² œˆ…ŸT6ubE©8)í-o?¤Kñ«À@¨º@6sßrÅŒÍ)âùAí•ÕcCŒkŒÐ2ÇÚ´7A1ñ—ñgQ€¿ÈÈßK4×,s•ìlŵ9”ƒÒLÚnxîœöÜϹiÏa<ïÞ®|^»ò]Û•ß#í¹þI{ÞÏÝÓžóñÜ#í¹'ž÷J{.ÀóÞiϽhf³õFJþ'®ü_–º‹úâ¯ß¦X!~;™Ù‹4°ÑI‘Éá¯L'«"ip 7SIá4ðÚ¿} =ÐBO,Û‚ã–§è@îÃ9Èkë”ãòeÛHÌÝLC§&hØÔoé;Š4b+ýr Mj¥ÞÓî¤)ÛhÚÜÜé›éÐâÍJÐá Zp'õÝ@AA'%è4¬ÞY :w£Œc_r/Àò´ÊŹùur×KQhªl¦KZåìÜ?gʹ¼UŽÈ½*SÎ5­²WîõstC«´soÊTgS«ø"÷¶L9w´ŠWrïÎÔZ¢UÜ›»5SζVqeîý™rh'ç>”©ŸGZEmîŽL9O´Š™¹OgjíÙV14÷ùL9/¶Šž¹¯dÊy­UèÜ72õóV+ý3÷?'œ–óÞœVzÏÈ+Õû·}¸úq­BCÜMÕOAðê~ú"Aÿj¥(üm‚¾ß@ƒ !D4ˆ¹ëøOäþ˜LKÐOjý:w³ ÍB´Òá ¦ï7R'¾ ˜Fr #Z&„ÝJCMßïj¥¥V6wvÚ`¢SÆÑ8<›¢íWýÒ-#ç¾Ã¢3://IˆÜ Ô«°$mh%퇔[¸Yä†Å^{zT¡Ïú7IÕ—<Š¿=ð·g+íi¦pêãI†d­-¢;†{¹ÃD!“%ÁK-ÔX[EAR}©öêöÀ üj<ŸFt².—.´qçÓ<01(5°>iãꊿˆ?®ýÛË«äwp`Ú¸õ<®;HÈ»å6¹]8®´ÿ¡ã0ž!x::m(ôÓ0è”RH®ál#3‚|dÛh:rod[#£Õ4žN¢‰t.M¢óé`ú3dá(uM¡[èJÐTÚJÓèQ*§Çi:½@3èe´ð.ͤ÷©‚þI³ès:ŒþM³é'š#4.‚4WäÒ<‘GóEOZ ö¦…¢˜ŽéH1”ŽÃ)*&Q¥(£*1“ªÅaGÑ"QE‹E-- T#VÓRq,-'S­8êÄT/.¦q%5Škèhq+ÅÅÔ$î¥fq?µˆ'h¹xšVˆWh¥xV‰hµøŽ_Ðñ+~¦ãÄNZ+m:^fÓ ²+­“:QîCëe_:Yö§Sä:U¥Óä(:]NgÈùt–ŒÑÙr%#O¡såÙ¸¿€þ$¯ óäMt¾¼›.’Ûébù ]"£ òiÚ(?¢Kå'tüš®–ßÓ5JеʦëT]¯öÆu_ºAÑjmRCéu8Ý®æÓªšîR‹éumV×Ðõ®ÏÓ½êEÚ¦þEÛÕ7ô ú™R;é½7=¦‡Ó½×Åô„Ñ\‹  <•Ëw¬Ã€õ"qôŸ$-¿ÀêçÂ<·‰a¢)R1\Œ ãh¯ÿÄ!¸gütE+]\”o$[XŒ ‹ñ 1Ñ}( ‹C’ÓÂbºy7š‡ÆÅüò’Ç)ñÝ@•lÕ,Œ¶Š%à”`+u‹“œ(¼›ö˜!‚Cü½•ò9ÕYËÀ„vÝò£¼äÏw ÙsŠ™ö`òÉýÑE­åEÛ󯤅 ŸGZ©»3%L[â1¤ø;ðiŠ®÷dh-r(Gt¨v£îP.…¢ 퓢s@ruðV'‡öO˜ÕáqžÙA|-Â\¸·ŠK½¸räI†> ñt;ì“0ÌÏaÄÓŠwR5^È\cý6ñÒÜB4þSÑfñJyJR½Žòà¥7“ÆM*ë/nÖ»²Þw³þ–!ë#7ëã6Y þÔjNœ Ñ‚"B¹bOÊǵ¯È§Á¢ ƒºž ö¢r\7j»ÔôÞPÍûÐ ¢7ýYô€ëK/‰}éMQ”¶úo%Wÿ-C‡FU«øT°í¸ˆšèqñ™Yý»:R‰šÊ}‹7.–‹RÍ×RK”r, ª!6Œƒ°ø$b°ržkNX•êV±!,¾ôs»zYâ«òV±6,¾õs–¹¥Y‘¬°ø>!þ]Š„¶›®ÔìVct(/Û4ë°ÁÎx;ûë§ýÖF¬¼ìˆS±>[àÙnoÙañ‹ßg'¯Oh°oÃb§Ÿœ%8åƒ0̀̓‚}4,•ŸëäÙúx¬Ý–VZ¢e7†e0-1hOBŠg\ìíNAf1qæ·Gò R¢—ÆLÚ¯‘±Æ¾ M¢ô4x$«$bEÛ:ÏN|ìžÇÊ¿NJßÚ=˜,±?Ùâê$¤.bå£tÃÀÚ¥`Õá Ä4QŒ¤ Б@#‹Å`¾±Àuãh­Og‰ t¡˜HWGÞŒëâ`èŸq ³2Ô)ô.É?ÅTú—˜F?‹rÑIL{Šbq¨(fŠ¡¢BL³Ä4þº°˜#–‹¹b˜/N Ä âq‹8B4*î•âaQ%žÄý3"&žnzC,5„6Cñ¦Oø¸óÄŽxÓW«â™#ÙAb‹ån˜‹ÆŒŸ–‘faÞOÈ.H `öbä,ž»‰‡${–l´t” #-‹Ž¦Ùrw<‡h M–ìWʦ³¨Ø 5G¬£i²+î²HòW=7Ë+è‰ý[‡¹¤>­˜ ½\ Ñ­4Š7¼8O›7_ŠÌåLæV{2/ÉÓ«b½yºDþPÉíÉ틞IÔa†õ˜[íx³·8¸2N“g¦"m¶h1+6ÊSRT.#˜¡Àlg˜²›â­XšhæÊŽ©"3WFwAAª”ø{ò8dw#F ®ˆK!gO𱋶Ê|I iÜ©íed³‘‹Þ´î0…ö–4g›ì=w³ìË P˜û&$Ⱥ(!‹˜ÒGB^H‘X^ì >,Æ#¡-r?ü¬ñë<<ÉaÞ;EÆ7æàšC“5#…‘W..‰hf™<†:²”»*6<”£ò‚ú¸ ” æ’c!ÂrbB<ÇøÇr"Y¹ËLÂ4ΞQš]ÈìºâŸXåOi?\‡ˆÏ©Àz´ø4û% û×€ì_²C â[:^|GëÄ÷Ž?ÐFñoº×;ÅOt¯ø™ž¿)ýLoa Þ“‚>”ÒìØj¬vrÇ>2‚F˜»®ÞŽ}”¤ç’ôü‘/¸æ ®'{Пå^tvñ:Ù+í ìú$\Ÿ4§¯÷p­äí©ƒ}±'Q¾T£Z飰|Ô·IB=ôñHz!,w¤’,Nº?,ŸH%9é¦4ë)»Gg›Ó. ˧ÒÒ:sÚº°|&-­€ÓêÃò¹´´1œ6/,_HG=ºÐñœ81,_òm‰„:ZK¯d´}² ‘Ö#!lßO±gjcQ·ûCÌH–B]$Œ9”zËaT$Ké 9œFÉ€¸#i¦EGÈÑØ1—c±!ãèd9žÎ–h£œH×ÈIt›<˜î–eô€œBïÈ©`Ñé 9=M°~™Ü¤/“›ôer“>7J„YåJêà›ÙèmW©±ÿü£›´—7ÿ×\¸Üföó7R óþ# Kò7Ë7R3ïÉJKÎÓU€g gÓ 9‡ö—‡Ó09/mĥɗzàŸïr͈³ Ôîò¼4WÊ·¼Û¤äÛPîAkg UÉ^H¨¨5E›ÅÚò|Í{o“ïÌ-Ù,ßc\î¢ø÷Y¨~PÈðuy>ÃÛ j?äüÇ“óü¤Y ?m¥«“ù…q¨ÈuFnÿ+©ú¶É¯a0| û =|—?¹~IXõÏS]0^ÑV%XŸø®ê¿E¬­J»e¥{µMK\Ã*µ Ã*ha4sU$P1WGìŠÍ*+ÙÄ3žS'¿sgÌi­‘ÊÁ¨üÙí # MsaÕ í%TçRËOØÝKð8º ŠÌåAQ³Uí¢ëNÛÔžs¡dUþfµžw7Ï÷¹•:!©—·VùÂê½mS0£Tßä¨}#º$¡úÍAߪ8¿sÊöv‡;Å¢iYû¡é„: 9­1ÇùâSÄå M¡„†Bùàad;…œ_²Ẏ"f¸¥ÇšEPãÓÒV«è곉sxhI‡t€ïCú”Ò`Ú¡ÂzkÍ«â6‘±ÉJî”±;L¨ICBy¡Ë©SÄÎ é£j ¶Í bšï†¶Ù m—f£Y>ÕØËXdd©éh06Yv$ÉÞª•Æ;îDœ g«:ŒÝ‘œÔ+I’êp9LjžGn‡ìäÎòhdf+(Ü«’êsA‡³Ä_?òjÂn-íTâúÄùÂP$GÍR³|M,§…àò#)GF),+¡tª¨¯¬†l‹Ñ~r1äÛ)khœ\ ÙVKke Àyl Ûq½@â%§×KßÄõ]Xß í¹Bh¹JdËÕ"O#ºË5¢@+ö–lj¾Ñýq-Æó~ʃ}’ëD)®#ñ<u®\/Ê“Ä"\käÉ¢Nž"–ãºFž&N‘gгåYâBy¶¸\ž#Zå¹âVù'q—“Å€B^!CòjÀœkäžòZÙ]^'‡ÉëåDÙ*•7ÈyòFy¤¼I®‘7Ë“ä&yº¼E^(oE­Û{;Rîw¼ ï’ïâîoòù™LȯäfÕY2ÇݤzËûÔy­š"P³äCj¶|XÍ“¨…¸Få£Fz¾ËJ_UúÒSUz^VÜyÒ3´ÂàZQÚ]¡Ž„¼I«£Tw§R‹ªTUh×À|PUC޾D{›SZÏS1¤Ù¢;ÕªE\CìG‡¨Åj €ç8*U5¸ Ànž¯–ªe¤å0XÊ|¶ ¡«~26f@ Õ_‹rA¹†.5§¶<‰Î3‡‰!¹‰–™CÇlù.lQ>ƒpägÔ[Õ%­Ò0:wœõèÕí¿!Ùz0½ªFôêöu4ôŽä/ov#oãžì³Ea¹Ãvù³ñÜ̦K‰†ËYÚj#^:›³ªÓC<¯OÏEF8³€^É"`MئÖÌõ¯6«ãJ³¶© IÕ‰¥¡B˜¡ÍêäVÊk‡ê´HVBÉ~ õÐJ½1˜³Œ4|}óu MåÊO“"e‘qâ ZN'à¾Ûd96›ä3Xòg±œÏAù>O{È;^¦|ù í…koù*òkT&_§éòMšÕº@¾MGÉ¿Ðb\kå;´\¾«ò¯t¢|,û%ÿFçâþBÜ_&?¤kåG´mr£f—¯åAš»YÅ·'7Ù¸+äçà¦/hù% ÿ¸ÿŠ–ßG~KKåwt¼ü›÷6íߨ´érùºQþLw!ÿ~Ô{\î4›6Ó8žLnÚ“ê*l»`u¸“´LEælEèÃÙj-SW‹FlÕR*£«ú\ÚG]î‰$ﺭ]›líZ¿5uZsÛhBn͇ÙqÌßèMnäõf#—¢ñò´ ,o¥SKüí›VœÜ>ÍëZìïÔfÕêž7{çÐÅþ9tÛÍÊKmVˆÁÏM¹ËþBaç~°ÑÕ-¥€œ;<¦‚‚•xåZîHîÎ`–3JQDiH3‹†¨ S6•«,ªV!Ì:™æÐZ•C Üej·´¸<¹—{;¡cÌúK0M£Y ú¬ÝXãÑhÿ.u7Ö¨œzx;±Òûžd,‹³/÷v´†õ—^'ÛH°Ë‰¿£˜\ÿÍfý9 ˆ]PGlS[ÀH÷–çþXª‹},…EM…,JXpn›SÂB—°ÚÎ×Âî õ €–­ЭÙHÙ~>½½Ýúå’­Âä¨Ýi•úèJ…jƒn4LEh Ò§¨ît¨Ê§¹ªGZÆÉõ;B=fB`É[+ ­v¨ÇÑC3Õf%wÇÜŸÄúY Ì®ÞJs™¹+$½R #j==·C-rØ4îé­Ì´V w.H¨§æt_/v^¶ó»bof®UÔÕÔß3ëEÙjÊÅ5¢z§Ù=“£ïi¬6朮fÌl¿ÝšÁÈ.ƬyÞëÔ¨°z¶T Þ“¡aõ|ûGˆ¼žiç‹ÝÛž/Z¾ùúÿÒn öýC‘¢|d. $s^ös #¢üˆîÁ¦Á«íN”Õ~  ÁTûSH42s=1”©a4i“Õ(pÅhìàš§ÆQ¥OKÔjR©YM¦TYÚήK®Íº¤m».iÛïÙ¶A:F½av6D+=—j%@±b‘üqHÏÝs+žÙU›ðí]ßH?±:œ:%ƒø9ýT½ÉšÙn*v{׸Þ«·qÇ [Ô;¥ìIT+ÍVCœVÉÎssÑœHÀ]ýƒAÀ?×Ádm¥n…&·¸ÇàˆÎ³ØÈúœC+ù˜íãõŽÈs"Ù¸}0µÚ3A¤¦a…Ëó¦c•g`•gR±ª 2 õ)jøäpÐþ\ µùS 鎠8á À3óÎQ1(Ójº é÷¨š4Gv"¹ê ³†Â¤-2‡sœfÈøÎ[uÜ™°Ì{œ™C7B±³ãowºÚÄ]Øt(Å ·eQ £û—ú ûU‹±~-;Q65Ð$sØçÐh·µŒÍÞ}éíÝ‘h••ûiż¸mêÆYß•·©æF‚›ÕfËÔØT 0¾ú•×9à®s¸Ð¤Dls¹Y ÖÚ«íÛù<'01h(ù>n„™ÙzÕ&¢ƒ ' ´èfaª°0~´¹QÒ RO;˜vWq꥚¨ZIÕ*ªVƒŽ¡ij ÍBú\uÄÍZZ¤Žœ@'ªutªZo¶¢Ñx¼OKnÅi>اÓt6‡·â4³¼§™ ÐæÎe€e–8@i¶v4u§CÄ6Ý [Ñ‹&ˆ„Þ [±Ä‹j7Œ¢Ua“(iйön (/`,Ý©Œ|‹K6ëμ'ÌååbÜk³“¾˜Üçn È6žköVÇöè„CCÔ©¢§Quå«3©¿:‹¨³!¤Ï¡©êO4GOG+V Öª t´ÚhÖq;úä:Æ ò:ÆÍZð:Æ“ëO®cÜ[G›–ã%@ùXÇ=€KƒÔŸÊt7ôÅÇf—`\íÎ+èÜ33ôé¢é>«¼¨$¡#|êž[\¢òtBïå¥äéËv~Ù΃¦.ù\ξ$t%uSWÑ^¸ï­®1Óq1VŸätúè=to3>º›îƒ–´—î«÷Åtr¨M0Ó‘ü¯=ø:^÷3{J²Œ=¹x«î/ˆß½à-,b§-l^6ûèø”-º˜rXتï‘ì¡&+¡0ÀÉëÃÎý‘·—]bÆ›åCÝ+Ûc©ë)KAµª 1o¤u˜çfš¤6ArÜ‚ »•Vàz òNzIœœ\™“Í‘¯ÌÉú ƒjK¨ÜCµCi¼±z-°ìz¨±kãIÌåüòzÒL)ÍÚdÿ{ ®Dƒ[$òBy¶iªúªŸ¶BÿÿfdWsýD«vHÈ„n¥êp V^èª_%ûì˜íÕÎ ¡ÕAh%yÆpXŠ< ¢>zÕ¯“o1¡'¦ô©»@šwƒ4 ÍÍ€Ý[ ç·®Þ ½àæ~èvÈ÷!“Ày2ý1:Cí ³Õô'õ$L€§ébõ mTÏ1_ Ô‹t³z‰îT/Ó}êzϯª×è/.UoÐW¸~§Þ¦ê/"K½+z«¿Š"õ¾ØO} †áZ¦þ&¦ªÄLõ1×¥êcq´úD4«ÏÄñêsq²úBœë%êKq…ú—¸N}%nÁõAõxDý[<¥¶ˆ×ÔOâ]õsZàÂ{ÉÀ…÷|7½xOOÖeX\ñ¬«óÄSzŠ2ÝÄv «E«>DOeE´˜ç *âzš9Ïž%t9î²ÄênT~HLOÞOcäîæîDÊs#ÄÕÔÓ‹y’´1 >Ð{ƒï,5J8,øÀä¾r×Ñu€ÌsÂzú. iXZ@an* ›í™.,Œh¨0 ¶à¢Cçø úÔÙŒ2§;!y‰,þ×fµ¤NPµ]´¦Ú¢:@Ãu¦i›æj¨dMÍÚ¡QæLn)ž•”ng%ñðYI<|†‡‡-:ÕÓr8þIžëDkÍm€ši7=Ë 3Áßžíó¡ãEÅXÌ)‹Ì/ۣ`µÉ÷ú?ù^ÿ`qBÏžÃxjn©]´ƒ€Œ‹؉}0P ½ÍðN ò6·a]™ÐÕ¸Õ1“z”+z£Ó;uMB×±Ç[ÇÝηèæÒ¬bÆÔ±Jè•¥ÙaÍOÙ > êɆ²]W2Çú$?*„[çâÜÚÝôÓ•QHBŸÂði@ŠÈÕ;(Ä! }†É–&ô™\û\Ôa̸ƒPr‹>ÏÔÒçšZ%Óž˜l'/þ«¼•²‹½[o¨!7Xl•¿|Hqp{”!úB?TËóòðó¹$WïWb`–1[J"!@¬r^ðK¼eÏæ8±æE Œ¹,¬/E?[ôe¥0)"NB.ÂR‰;#äÜUaè™»ë£oH†”m¤ Øú¬7zs^§M°aø.’ó¨f€ îüóN4´³;ªÀ‚×]•н'¤»Ó(OuO€§½hºÞ›fé^´èe1pK­îK ¸ÆNŽÕýé]Hçê"º÷—ëbºV—Ð-zݩҽz=¦Ó úzKDê¡ôôô¿õúEZôÑMO=ô$Ñ[,è)b°>D ÑSÅX].Êô 1]*æé™âü-Òb9øb î×ëÙâ2}¸¸VÏ·éùâ½@ܧЇõâi}¤xM%ÞÑQñ®Ÿê*ñµ®?èE2¤—ÈÝpÍÕ‹åî¸hתÚd|wù>ïÊ|?LæN”&­‹9õä»7œwžU…r›£Ðñ…ñ½i¢xVß"î‡_N#ô­º0÷Zbì¦ÝÄ´Hßù…ôíls‰nô}‡¹›N§kHÜG³½(±×h„LšŒ ã^µ”ôrºÐõ‚r.Ç=Gl/HšÌŒz¬ûÅjŽ¥ä ¶Ò;a}gQ^Ð{7²¤h}Pài‹Ül±=¬ïNæå…åD/7¡Œ•¯à<ï8Þ‹¬×[˜*mN¤›óÖU÷8%¬·™8ŠÊ’"·cÊ–ÔÓ{³.¬ïwíx?6¾•äcdØ úð±•X‘¬ŠVêQš•¬ô`ÛJf¤,å{¡ë+(ÇtÍ¡wlÓÒí`9±Ôàˆ¥3âœ_v¹“FlH½§"ÖÜRgûlƒur#N^h°v}§‹w²¯Úù9sسlb>D¯Ñ›ÉP uÀ¨¤ë±« ”£)¬¦®º‰òu3õ×-4T/­ 9z%UéU´NC§ê5t>|´–®×ÇÓCúDzF¯§7õIô¶>™¾Aý_ô™B鳄£Ï9ú\ÑUŸ'öÕçƒg.ë‹ÄT\gëKÄ|½!-ðyA",H>/ÐÏ}3MðìpÚó TMaðÝ úEÐtW1É3«"ôw£Á‚ äà Úô ê0]fÑÛ°aØ<Í]Â_Ð/QPìK?©-&Ë-çS­›§_fmÉ_*ö|yè›m:ßkP¾M¿2·x³~­Tw)Ð÷Ù°fØVy1rÇ*àAý–Ÿ˜¸lçg%üîöò½Vڷܣȿzaý ŽkYlÔóDš,ÏL·cõe”¥/ÇÆ]A{ê+©—¾ Bòj€€k $¯3_Gcôõ4ƒ/Ó7@0ޔ꒠NÿÝóÔéÉ¢ÑæeEa”±4¿´³'„o_ý,x/êkŒÁ•Ñ>€sPˆþDÿ3í¶……Em^í7±Tú´w«‡ë$ $ÇðN|½úû/¬%ô§s2½°¦7£ý- ê­'÷þ×/¬ Q!fuèûl”àòòúsXh|¹½_–ߢ¿¼GÎÏ ýíFꓲq~À~º¯ÓcKL;¦nr̽x/ôýPrÛÉÑÒú!Ú[?Œ=|„Fã:^?–w6Ù›ƒ Ö Øõ9ã,ƒmaV"ÂÈO&äÄ—7X¸_L¤¹•zÃîFïdƒ;ÜÓ àЄ%Jmabw.NXÑ9›_£„-¸ÒJý´°em±‚.†™ 2€JÆð¥Çðb@a+äYó!6å³+–3'÷GÔñÃk_l¥îm Ýx.˜ü|´x˜ŸŸË‡%®áhÍnex|œë¿5.Åo±wG ì;°Æ°ÿMÝôÔ]ÿ‡öÕ?Ñþúg©›üJVnI:ÔR´ÐÒt”eÑJ+@ãz­eÓíVÝe…h›•MX9ôœÕ‰Þ²v£@òŸ[]è{+—vZa‘mí.ºXy¢—µ‡(²º‰ý@jC­=Å$«»˜fõs­ž¢ÊÚK4Xbµµ·8Ùê%αö—YûŠë­~b“ÕWÜnõwZýÅÃV‘xÎ*X%â k€øÅ$³,)s­Ái88œÄÁaŸ=Áž +»X Œ+Ö’ ZÕÔI²êÉ{v?Y=ä`¥îâßÖBë0jo*´ŽTwƒQ÷§.ÖQHË¢£h‚Á6­¤½è“vu·¢†¡? eV¥¹ÛIûX%VÐC‘)W»;)ÇŠqnòDÐôj-B¯¦/k1»}ù³À¾?ÕZbÔÍ¡žgN¤6ÔDBXCÒûDR6 k¡t‚0Þ™Þœ‡šžiUtÐKpÏ>íKDi Äˆô!Á¼ ¾–ºç;‡®¦Ý‹·Y5sK6[ËV-³ÔžP¹V£…7ÀeŽjb—íÁo}ˆ<»]¸ÀwlCÑ´Ìa¼Ÿt.€’Š ^¬•’æð«öFQYǸŠ*ýHŒÚSYØNk8e[#¨›5’ú[£i5††ZciŒ5‘&Z“hªu0y2ͶÊh>®GZS¨Ú:„j­©TkÜ*§ã¬CAÜ3Ó¢N.I®å%†„I /¯Î]žOÿCRŒ&.1$e!õBY&ŸeH%Hƒ€+\ð9•›ˆÞæù¶¹ÞC4N!l# l™“ÚqoFk6f|d’q’£u ›#¹;qÜï.¤Ñ€cˆŽé§ÆÐÁIãŽhÏ=ó>ÔbëãQïeÔ¾Xk½ø“ò¢ä§GzúçøÐ¬x«µNÒVë$ŽGñOîß-IžûצªÄg %ÕVÿ4µÅÞj,ÉE9|"ç5í믗]­jbaô‘ßû¹©µ5n4«L[EE`ÖqV TS ŠY ©¡c¬¥tžµŒ.³jéj«Ž6á9a5ÐóÈÓ::í4(íEåä^¼eÄ¿ÿp›ušx}ŽC,<4Å!b]:†fY§"7@ç[?cDÐe´›¨ã÷ÒB/ÞòvÏmía´fjZ§£¦)oaFroDh %ÚØJ燭3}eÒ;?pTÑö«Áx®IÿMXg·RUØ:ï¾ •†ä¾Ñö ëbc ÷LžzZ˜–¶X—vø†F]»“9k%8|ía­gC¬5X¯ci‰u8x-µX'ЉÖ:: ×sQvƒµ>M"nLîÅÆ$ZÛè©âÏB·_¨ ƒ˜EÛíþA>[ï !Ë,?½ØK¸2.8q9K:~©)㤴ÊGJ ë,÷äxeiv$ûq*€:¿J»äÉHimÄ›€­VÄmŠ:…'’½ÙºfÖ/lµ¶©ÀÍY7¢xY7·ÉòA׉î²Ö-ŒnÛbÝaį›v¿rǘC¶99`|}» ¹ß¯Ð&R×g“JXÌdmx*îi¸§c[Τ!ÖÙ°ç@¸ž áú'j¶Î£¬ \/¤ ­‹è:ëb † `Þ³é)ë2z׺œ>²® ¯pýκJHëj´®Žumê%!‘“ôäX›½C‚k‹{@Ü{îB?Ã\åïQtC[[!\-êO‡áÊBx½cÝ‹4~Ièuì¿Ý8›–UIQë>q/Dõé˜Ãý3š“nù‡¨¾Îº>Ãáµ4l6³Èh–»ÑЇۇpØ>.<+/p%ížgÉ+w~‹y#[úzSòVmb㊭ÿॶqؘï¢ô§Ñh=H`TóÙì0sß2já´n¤Ý¬M”gÝóáVˆ±Û°7÷Ðk ¶n§p? ÷#­;i´u7Åó$+AeÖf:éÓ­­i‘13“l3Ó¬‰0w¼N¹uˆõ qì±ýî4å»°l©ÂZT¶¨¼T@‘ʺÊK¬ ‰‰†ÍúØU“ÝìšÈ »¸mv!+òÐ >°Y#**Ⱥ€îª(þÿï CJšÌ=sî¹§wÎÿ~î ÞK™Â@·éCEþ Tôw¡¢nTøÔ?ûÄ´—³›ä·â&¿ -¢ µÉ¸Ýof÷øXéßÄz¿ ]~·PÓlòoa«|ßå÷âCÿ¾ðûpÄ¿‹cþ½3wuÉR‘Ìý-Ló8nô¤Tt ¤¢ ¼m´£T´Ãh‡B Ý~§¯ðªßeîyŸ-f¼®”·Û-”U„.”9Øø ÆôÏéºÁúûrëÿ)ëºû ©ÈgA&•ëì×”ß×Eyðf¿§Ñ ¯Û«J'·ø}ü÷2þË¿ôû·ø^±ïþöé×OT±ü,íj‹¬™”ð_šÓw¸™–~¡îj(&ªk»l{8g¯µÚê#¶z nöuVÀíÂ8»y<îUeoØnšnÞ+×4m+/ÎøoÛš¢õ¹ª®%É ¸J³¨ ÓÚØ¿»>n±ä‹Rý“Å£9Ó®#lÈW*åm„™ã/žÜWþâúvß—§ý‰ª0æ¯DÍ ÿS(\õMÔ%™Š©O²h Ѫ95š?þh†- é'HM¯ÉäqÊ?g,ï9õE×îî5h¼ç÷¸P°øcáŽPâ?ý)†úƒ¨ñŸc¬ÿB0ùðŠÃbI~…›ýüÊÿGî¯Ñáÿ‹5þ¨ˆêc"ŽC~‘È…ÿ‰*õ¼-ë÷ûøÈŸÄAa"'è\Œ7X¬ ÒÏWǘ›Ì"7Å®‚_<Ë-âÙn)KÜrp¿‘ñ*?ÎÒ¼€sgN–tæ¼ÉYËЭõ?Xt³Äu°È¢›en±ÿ”jus·¼³׿ߧ*ôSÜxjªS¡°‰RS¯c8ˆ±<[8\ 'pŽÍ¹É¸ÒýUïºih€g‰Ìµc8È»‰)¡mÛûÈ•æÀƒY¡¿.Á¤ÕMŸòÜEF·D꽑Ë” (ü‰i¦RL°ÜÒÊüÑj RT¬’çöéR¡k‡&Xa¨=b3+ ªR¬©­Îð‚z/ßÌnˆéªêA±¬5uó6s¤VÒÿ1‡ÖñŒƒ0Œe8ŸƒqSÍ!Çs0‰å¸žçbÏÃÃ2V`+±ŽÃñ^§>ç•…²>tBo4HDl.D²dN!õÁÎËS÷p0Uö,Ã…làe§uH²FF1D´ÉyNÓª{•zŠî­5Ú¹Bã©vÍpŒðŽÓÒ46©øIp|šÙ“=Љa3¸¼­¶½Úô_)j" '™³McžÑç1&|öÚ0ôsèôgûÞ´­–«#UÍ!as´S™Š)^g¼‚7XG!…tØô€SƒŽB§¨Vf­7J—~—f³"H‚ÓµõP‡Œ«ªk-ç žá͢Ň"îéÒüºWämÃT¶¹´UœbÔŒ>ÔÛbi}@FaP{ê˜Ãà:o ƒë¢ôÕˆr™æ-€2õ¯ÕèPšsê””&¹A݈¼;´²»Ð&Kç%™eö Î× Bmš Mûù³|ÊÝÈŠÙ0úb .é‚/ÕˆC‚÷˧nÎ¥ÊØqî%yŠœÍúâÊ©¨áMBÊÓÐÄLät\ÃV´ðì ¬àLüVŽòO2~myñ¤LŽ”3Y@É(Öøg¯„Í)(¢6j³„’&,5Qì¸gL¡Ð„’Íg°g¿’5Z†Õ›M&çò\2ygžu¤lP‰GC¬®g^@BÉ|D«¤j ´èØÚ:i^æ©ÇÛ³‰ëÆcE+c;†È®+òJimk±µ²Jí ˆËê·L°|Ô4Wi÷kñJª¨Ç®¦üN狵±¸'´¿45i“üÍØ)Y YÄ–s@Þ‰¼ ¥œ‡rÎG%à.J¼\„ \,@[‚É|Í|³¸ w°s¹‹ùk<ȇñÁ®ÀË\)À\…M\-Yƒ×ùzäºUžÙÉNìæØËuxW®òÉ<§Yoà½9s»7”±å¢uoÆc‘¤iš³072 :\>ÓÃR­Å¸ÞJµ äWYȱ/£Ä’c•æVëoçy' :·Þ­æZÆ~PK22ë¿Y°PKTnS;aQute/bnd/main/component.xslt•–ßoÚ0ÇŸ©ÔÿÁÊK·ðÐ^jÚnÝ*!mUµRi¯Æ¹€¥ÄŽìãGþû9Ž$/¶ïó½/ß…ûÇ]š h#” ƒñèK@@r ¹ ƒùËð[ðøp{s¿3Sƒyf€ÄBÒLw& VˆÙ”Òív;Ú~)½¤ãÉdBÿ½ÿ¦sͤ‰•NƒÛ›#»F¸2KáwD ×t3Yw6üÀ‘Í?°ßƒZc¶F’®T; hã!͆@R†|ÔÁîˆeY’«C $ÀцP®ÒLIX»h£4¥#ÐaÀ YT$¨¡'ÉR°™môÀ% § 1·_íœñÙ°0¼ZmÒñ)à KÖ0Tñ‰›ÂÉ/É DWÀPža•ίàã’ðü,M!ÅOëË xg%c±\k†ö7•žŸàMb˜9‹}ç(6íf:Ę'¼ÀÛ ±h¯g»@ê /ðX§‡vŽ<Ìì]Ô^޲$—%Ä@ŸxÂŒñb—ÚÁ€Þ^¥>©!m‡EŸØL« 4 0ýƒó½ã“6ê꣭“t6KWù1ÏÜqû©Û)Ž}ç÷mðFœµ·zÝ¿MÑ5Ùµ™«êÒ¾— òÉïúÞ ÛSÙÜŸ«ªÚ±>´×tÕ|fù,.´Uk°ü•Þ53sÿ\Ò¿ÕòòŒ$dV9é;£ÎK…g¦í+%geÇÚÇׇÃí²ÆÁh#dÎôÒ¾Œ{ãèâkü‡‘“öÂ6¾†?ä¢o‡×r?`·Þÿ»xøPKûðÇTQ•PK’|“7aQute/bnd/main/packageinfo+K-*ÎÌÏS0гäåPK˵‡¤ PKÛA‰;aQute/bnd/make/PKPK¯TU;aQute/bnd/make/Make.classµXûSå~N›ä¤ÉJ¡Å °pÓK,M¹J[j¹)pšš@šÄ“ZØÅmâ6ç®lc‚Ž në»ÔM•éÜœls7ÝÅéØýî6÷Ãþ€¹ç}Oš4©•ÏúIòž÷ýÞÞç}¾ßï{xáO=`!^WQ¦`Š~GÚ2»âݽúA£±_* *è‡ôƘïiÜÜuÀ[ Ô®t4Öm˜ ®kµÕbÑ®ÆDª'Ú¸Ö^iRàfLj•úi+£Í$*¶E{⺕6¹Ú•¿º¼Ð\K»]7ü œ"(¿31Gìw.#.O§¸AÃ|ÜH$õdÒˆw— ½„»&a¢VC긭„½¨`j`´ eƒhTq“‚šâg¥a2|ËÔÃD;P$’Ý­…œå>¼XŒ%*n&zyPiXŠeŒËˆ[æám†Uˆ&§š¼¸„4”§Ë ˱‚ºQË0u+Á“¨ÉÓmÉÎÓÀ*¬Q±š”½ªa-šÉ›¸Ño¢’ _Åz¦h^ÜóÖ‹€½X‡Û4l\dÅ&ã°ŠÛɔ҉äA Z5´¡]GÉ G‹Æ8TéÔ4zŒþƬ8j ¶ª¸c˜f£E4lC ß+S2¡v ï¶‹•ŠhªÝèÑ-£[lc§†]bnÆÔ©ÇÒ†`ü]îÆ1dLø­’!äÀèœØ§`Æ•¬Læ¡hØNÌ-±tO4.È×¥!Œn{–‘Ï MsLO¥ò¬·FS‚$ûIHì‰ù+^ìETƒŠ :J– RõlÄvJ•7bLˆ6Ö¿q^ÿ~3Ñë×Íž”Lð¤Hß{ x81Jf­ܸËßµ"4›æØpð¡OÁ<ü5R~Ã4¦¿/bÄýé”á§k -Qò°ˆFšÈFÄÛ5¼ïdÀRMÁŠ"´1Ó1}¢²–JëU¸Wû%Ó": Õo©xïp¶Háõýa#)¨Ïý؉Ò=Ê©I䔨ÝERM¬GE‘Dcõ)J¯_I–’÷Ä"ÝK_)ц9VYH(Fk/*˜Õ:m)é6áùJò„‘¹Íå#õšüfv89ÜÐ"Åи6­zÉUi*XP€Ýò±ñ*÷·ŽŒ3ˆÚ«Òòà$Qñ0¯Rxn±¯ ¢=|Fô|WÜè£]ŸÍ»“Ù–D©<-Jåëßlcv‹èæ6ãž´'1ŠôaÑ.?§áóøëv2ÍÆtK‘ê1v=ÉN1o‰zN²skXHD~šŠój\¸©ø2;ºtíßo˜œÅ$Ñž¾¦aOˆRn&ÒÉæD:nÉ&ÔâÅ7pNÅ“y&F"¢!ƒóÄ<̹5TrZj›…Ö†§„IẄ÷Xá回Æ3ܤô"®Q-Eï5gñ¬¨ÃßVÐ0ÎÛ“ØŒT|N(~W\`›Ç”«7òg¬ ,Õ•¿ž§Odzõ~žL ?Q~Âü4Ëš×mpÞ›íÀ¢n)è.¼q^‹z .ß?ÓíÆ/IP\YE yYïð c=ÚL$ ÓbÕž?.Xå ó×.ã74ÔÍTî=÷M.@¢ ‹„ý†ß ÷զћ8d¬K'cÑ0;a›nôkÁ5ü Î^"t‹=ñã¹ïçw’©Å.“¢i ÛÜ1Nh¯¢[E|/K)û– ·{®­ žÉ6Ù 7DEo«]á&!©@k‰óF#owâ¶ê”ž1›$,ç‹r?| „øGFr¶BÎz8K"Aã÷ÎlàœõÔÇĺús˜ü„”›Âï‰ÒÒ88ªÀdLåS-jŽ G sÓpm³¬• Ì©ËÀ×V÷$&_ÄÌUo;ÙõÌË Pþ4Ê3hhÂ"C¸EAÈ1€×|Ž!ðÅ÷Y¬kaƒµ„œ>'µ6…\>W›OÂësfpç \¬ó¹(µCH->Ý!UxªÚ›rûÜC ^!Ïðy²V÷†*|B¨Þ§!â@Èëó^B$áÁl„U½üò©$ªL1ªàèJÔ>ï`țӱ¨#ªQTj÷kSÇçµµŽˆ(Þ¥àä)±K9𢠱cx¯â=ÄZ`~Óù=•¨VÃOLgÕ&øxNÓÑÎ×é=˜/ÉG0‹š~ÀØÚñ}<€òäôú åTFô>„s|Œãà£äÌ,ÃÇðqú¸Œ…œÿGŸ¤›:2ÄöàÉyø=ØÖŽç¬}ZFÀW*~Ûü}H²ö?”UùÛq'ÚG²È9€e>ç0‹BµdÈ©«®^0èÑ+(f%»Nù\Cx¬Û…Ž<“烃´kŸÅ,éc1c½™/Aß½—pGù¼•ïØ¿•2Ç:rùÐ!qQäh@Fï`Óý"Gå´H:hi'Î.‰†_æ™?ž“?ž“ÿg îJvv);¸"°8ugwžÇWÚ+u_ÝçØ·ÔQ¾”ô7Ts7_/ÃRWµ«rÞ£¸»ÚIŒ.ð^Ð}[Ž:•‘ N#Píªv<†Ùâ©{©Z_Mò^It  ÏÁ·¶`–mÌEõ`5üç<Ù‘4iû8ýÆ}Á žÌU‘ ¬À "°’Ï«ÈåÕäç⸖¯ÑÍD’/ÓX’ûqÙ‚>ÜNl"BíäÃ*œ &í»ìçÐ>•Cûñ¼Dn"÷=²Sœàƒø^ z5äô9rÒo?‰ûNæÖO8§Òï$fÌQjBüwUŽi/J´×f™v„ ÿÒ%¸ÅÏ`iw/Ézóó ~Ù*‹J¯¶àbûBÁ|&Úœ»€ßŠ¢v 'iÎçʱt±ÍÆ`–ŒÏIo9>®E¥ä‰Š;Y_;9·ƒ•`'/[»˜é»™a»°ˆ¿KˆÓj2f3ßä;±1Ι\K#,QÜhï(‹âLJ>.s~¾´-8»ˆçr ¡ßÕäªÍÙÍ”ü+圴Y#ëÀöÚšËiþ=§ùj–á5‰è?ñ/Ù1žøbüÛUñPKdE, ÕPK¯TU;aQute/bnd/make/MakeBnd.classWkxe~¿\v6›/mº´¡ÓRºPM7 É¥P·i•Ä–¤æFS›Vevw’L»™]fgCx© "Þï¦ÞQïtÒPÁÖ ¨ˆ¨x¿ßý£ÿ||õýf7×ÝEòcö›oÎ9ß{ÎyÏùNý÷ƒ¸ÓP%Ðd\ŸwÍXÂNÅ&f¬N;¥¡F ñ¸1eÄÒ†=H7“®†€ÀEK9Ó™²’¥Át~ܲ56$ÒV"–É[±®Œs ÛÍ h¯=t §w¿€Þë[Ï»V:æ˜ãæÉؠẦcïv$Ó–m¹ûª£-#5]™”ÄZµÑöÖ–cíÑã†s«•5ZBX‡ 4„.¬`Ob=6ðädf2k¥M¶hï’cC®cÙã{Z*¢©MKÔ!ÄÃ{-ÛìÏO&LgØH([áÞLÒHŽ¥Þ‹›|Õ¸Hb$p',º¿±·|¸észŽö®Š^gÞJ§LgO)èe˜ûŒ,}X¥yÈÌeòNÒ¤õÐþ“I3ëZÌ„†m,[ü"P7dÛ†›wäæg ¤£’Àò}Ï7ˆí*bÓY³-hÕ°C aÅ—¡ä7]æåù,u!ŸË·4ÄVPº$ˆ+h‡ù¡;%®Â.&м1o¤™¯ åLq e3ieM Ï[ Þ2«ÅPÁз÷g"ÙH.Ëß1ËLE2vĈ¨ŒG,Ö†“OªDÆ2N$„ÝØ«X³oÕñ LQ/¸Dad³¦zFR—âÚ£L¼Pb?°ØÜLá£Àúh© e»qPCÏb¯XM‰¡W ÖtœŒ#-ƒäh™0Ž(Ãýdu2“üê¼´²#V&¦dˆè†5 Èåû/{EÀÊ,±uŒª3^"q£¤ÏÊ'Ѝ6EK(¸Ÿn“x©*ÝÍŽ9™™2;óv*m2˜ì6 Êå‚x99Õc'Óù”Ù¶@à (I‰¥>gºƒN&k:î´Àö2.–Ot7Æ%&`Ôiäh«1ZŽnœHc’>.d™$ðÖèJÙ•o…#2YÜÈ&”÷Lsi\…˜ä$\%ZG4Æçڒ¸IE>4aä†üäB˜Æ-nf‡,5%q+^ÁäQ}!d„º.Ú²ª¡©ê•Ä«qŠY=aN©j_)Æ-н·ixÝŠ&Á·ãõä·Å>n¸ŠšM+t{Šû4ð¼QÃ[úUâMx3Û‘mžtWWH‘ÊA¼•Þ ]×Ó608Ë9IÕLÞ.ñ¼“QáÝ縹Ö;Q¡¢GU´Þ-ñ¼—TY•Je]©q*;3§ñ~ÚÉæ—Ùi/G¹JfZFUD>(ñ!•UYí§óªê>"ñQÕ3ûISùù1‰ãnîMé¼90ö¿rñü G…>)ñ)|º`¸ÇËÄJîòšDÉeÊÝ@-#A|–,iK™‰ü¸²øy‰YÜWˆçRé5ÿ_m’|_Ôð…ÒYf„„§²Ën3ìäy œ¸xér÷KI +ç‹]%„9<(q_") ¨ÔWv˜Å‚+Q%’‡qN×yÉTQ%i©ä|Eâ«~œ<‘²œœ Â×%¾¡òPÝ#gñM2¹³“’TÝ2 l+Û#V·¢i|[â;ø.ûÄMKJUâên¢á{l«¥¿À¬žÀ÷Õ©OÑ’üª&£†=-±Ð¡7VêÏLkÊ̹‡p —bæ´Æ•Ÿ49wØ}þpµvUƒQgÙ©1ÿ¶X³ÒÆ,‘œðûa5ãÅÊ/—Sf°šÝ‰ñÉGNg‘J)]ò!àú-TÍ9:Èä]-ÛÔÊ¡’sPq°Üõ¬-²­Ð• ×¢,ΜíJ—p¼­Fj¡qµQ͹üï AÔCr§omüUuá5gÐøšîãK…Õ%WŧôÅuÞ´¨ã¯R®Ý1‡ÍKj³ " Ø‚‹}å­ˆðüK¸®áÛ¥xޝõ\e®ênj®¥Ð@[¸yÑ*œC{¼&|¹^ãáÊÓ¨³má«?Ôêµ`KëYì>ŽÏ¡ã2Ï÷ÐUýª=\'f[õZ}ñ€ðpý þÕêáp\Ó5Gu-ü²ð º¦¸?æá¸ú`ǃ|sâu|ægp@z89W Ìã5ñú{Õëçq‡ð„ôPø-Þ6ƒ°^§‡ô òð.ï;¬„> pú?OµêšB¨@|ø î"Îð' @=ÜKŸñð9eè îŸA_ëyÌñÜÖs˜‹×ëõæ=<—ºôpþ°BøµxÃY:¢KßhCÑâ#‹søV| Q¬ñðøYÿ‰+™õ"€«D#Gî&\-¶p¬îÀnÑÅ©¹{}rÜE,Lw‘jõüP†«áiÅ7®~ŒŸƒèäÉO“6Í¢×pU‹>Q…Ÿâg¤ÍQü?§®F|Oâø%9{ ãW\Õ§Ž_S#DtÇðµ"¶½ø-~‡z"܉ßÓŠ$Æfü_ˆTù·†>Iì#ù3‘üÅ'í_ÿ PK#_˜ÛÏmPK¯TU;aQute/bnd/make/MakeCopy.classUßSUþ.%ÙB‘”R.ÔB€¦±Õ*¨- P~jl’Kºt³›&› ¾øÞGuœ±Ag|¡3A™Qß:ãåøÝ$@gú°÷ǹç|÷œïœ{öï~ÿÀMlkhè0 ®Œ&ìT4c<–ÑY“NvGC£À[ÆS#jv::ŸØ’IWƒW ûÈ$/sOÍdÙê¡UH›¶€wÌ´M÷®À¹ðàª@㤓’~œCs|­1Ó–s…LBæ–„%‚1'iX«FÎTûаÑ}dæB±3¥Š,‡+:–™ˆ:ù´(˜VJæFcGþ/¹9ÓNW$×´”¬·\”y§KJ¢û§¶“2뚎×Ð.pá¬z"дd¦mÃ-äèÈ·¯íÈØY Ç%wÿÃ]:e;YÙŒËèÖÐ%ÐRsEo¢‡IIKW ?«O-ÁOˆ4è5EPvć>Þ•dü¸‚·¸†~¦]>)3vñ4ì5Â4ÚÌ9†´¤c»ÒfA]è;Ò¿oY2mX÷réB†ÇU¢5Ü`­Ö{R¡×‡·®Í9ú€ÂМ>PÁÐ7Mi¥tÓ֕úÜR…øN£ŽW•ÆíÞÃûŒÉÈf¥ˆü_5îŒ*ˆ¸V‘Ïuʇíá“&ÔÆ- |.Wêr;Å’JÉÔaŽ}øHÀ³²<Q¼O0‰y:±ãJ2é´€Ö'üÇ´ŠùF^Ÿ˜QAÞÇ 3´9½bˆa–i"ø´©žcßiØe‘éD•C™Ç‚†‡ãò±Ä›Í|‰maMÊ@WÝÕêø0X?–ñ™òùs¶pí=ƒ«Ö/±¥]YŒùW4~!p¹•‡G øJ~}Z±'¨ ú¤Z‹^V×SŽÌë¶ãêrÛÌ»¥ÚI©ÊuQKÇ)áÓߦo²0S2ïšl¬i]ƒ)ÐSucÖ°¨‘‘)ús¬Ãh‰2Š@çYíE ù®j¨'œcß5**?oÏ–gk]7›çkÙf 9«*>ä‹•SÛµÙz*ûökõ66Ü¥íå*i9ìó7”.zA?øyøëjàÌ? Ç&gÏPþ—¥ãGoIèG Ç@YçÑÊ™ m rÝÈÝ\,Y]Rpâõ|ÜïG‚¿!Ô€¿påNc¨1Ø»‡«Ïốà@õÀò¼Âx$8X•xCÞWè:Àpü‘x0ZÄÍÈÞÝÃHc`<ò?Üý¦"¦v‡Cž=|ªŒö0÷3Z°Ìó"Vw‡¢^ÅO´~޼@/9ÿʽby£”Žý Ëjµ…Ç%æ÷a©¡´²áЯüÂÛ2ä¿ß'CÖGø¼†¸òò{€,žpõŒÌ!Ït»Õ<*ŒB©ž–òöÍ¿PKÈÆDzÒPKÛA‰;aQute/bnd/make/component/PKPKrA‰;8aQute/bnd/make/component/ComponentAnnotationReader.class­Y xTå™~¿™ÉÌar€8!ÈÁE“É„€b„€@H‚D’€I£x™dN’ÉL˜™ A­ˆ—z¿[o¸µ²ÛºkA“@©×««»uk·­Õ®míÚíº·jmÝ­ûþgÎ\’L”>φç™óÿçÿþïþß{~^ùÓ·ŽX$û\° Î ^04ª:£¡ª¾àV£ª+Ö׋ÑdU]zTÆ’Ád8m5‚!#î‚C07µ/%zÂUu‘`"QLëb‘ˆÑ•ŒÅSV7¶Ô×7´Õµ6nh_ß*ð6m nV $Ѫ¸Ñcì¨ÚL&xt™À­ˆ›Ú×®¯hq£?çŠ`NSFROUúuU«5àFgŸ‘ì…ž÷H0ÚSÕ–Œ‡£=\-J­Ö‰®x¸ßTKO½ªíê2 4 &u)õ[‚}† €ã;ӛƛ¸s§Ò4¥äî · Š/É'Uëˆ$Ãý²›šcs›‘ä⤶pO4˜ˆsõÔÑ«ËÇ3[¡ØÅú•ûƒ+4 ö…»ö¾`ÿhöÍÁ~Ÿ=úM–ù…¸ûã±~#ž +³Šr˜4…JíÓÆ¼š@×¢ ­ë74´¶w\¾¡¶½½¡µ…ê/£áä *]V¾Q਋… ó…›ËšÊøË—m.ßèÆ(w¡Lpòi¢Ã ú@%iX9·²l¼å&Ù$p‡Ž85T JÊFòêÎp4tu0*/[P®4QD‹t¸ÑYÔý’Ëν´âÜêýÙ:|p*§‡£FË@_§ov*EÿÔ«$*ìÉÝá++ÿ¢B1™ênJœ1QTÆ)wÃŽ.Ã<‚ ®H{ÆLºÌŠ ùÄøàtÓµ]:6ƒ•­aÎ_à¤qvËÆÖÿ^† ½*»—ªÑ¡Ã¢.ô ¦åÓCG ,k³úƒñ„a6•5<é›ÂÉޜƲ8Ÿ cÚÏ(•UáU*Äu$0'SeA¢—!7w0“Žl7ãXg“Õ<¯;°Ó…Ažé Ét\…«Y¥˜n©Ž2­¬|¼w4|IàÏ9,Y-òª¿ »]¸Žv,/×ãelFª°åˆ[ß¹…þXV~±†›ØÜØ<Œ 7󼪡²çV·ávÖf*,8}â’šËOÃÛòÊ«wë¸÷’AB1Xš‡Áøýy4ܨá~\6V†oJ~…N´fJÌC:ö`/ãE1«c±ˆd¼ÊNHÚÅŠù#dnDUi‘ùcdnÍ4ìS]½¯Ï…ƒIåž¿`—ÎÌ5<É’Ÿ0âÛÃ]FV»§pF¿Ôð—t~W,Ú¡¬ìEÂ]Šüë,£–6˜+ʰ§uü5¶˜„b2=XÃ3Ô=y{8d¸p` Ô° SøY«üÒ1Œn㎟ĔÕÕåI>7㈠ß•L)–:¾­²WKÆR´JÁ£:¾ƒctB(£Úck.hùâlÉ$ûß’¥eL ßå¡ÈžNëÌÒ'nÇ÷]x)­W¶ù$t¼ŒW˜äÁ„êC‚ùeyÜQ>¶¨¾ùªŽ×ð÷Lø-±03¦"½qŒìüzÿ@PþE‡´–û·3QÌó:~ˆ7Øžºz®­Í6%îáü'ÁÂ4±/…B}ó æ'|ᄌ}ýL _,’ÔË©ÿD‡……xo¹ð3ÁìÏ«Õ:ÞÆÏ™WãQÚÿˆäóÈ;Ìû ¥ sö—ôÖ_o¤7Ð[ïòƒ"ûâDMÔð/ôWÈÈ‘ü›p{s,î!Êý-›žž¸Ô÷imŸµ‹2ÿãêq«ÑmÄh—2ö¿3ó•ª@îëø>dˆú‚If [ÐY¹!ªë ÆÛXËM1ãÑlsj“íc|âÂïóÀe‹DÇT&Zb]>MÓæ¤Âêp„Lqû_Âgl=ñØ@¿ê#ykÇ.]lªJ&cM±+x]0a¨÷] „Ùµ=0Öw)£Oéh¦HA&i_éš²QQê·øDÓätš ÆÙÚÝR&~—”3Æ@—F\¸.`Ú®æƒÄ]&²žžÇÇåš,P˜ŸŠ¹daú“"e?{˜QR%gª|8ËtP®,Še$ÁnEW­Ë9ÊÛ?­7ªÔQÑ^ª¢]ÃjW–§…¥cZ(Ëe…Køí4yBÕe¥¬bÔúØ+–äIÂÏOË Ê™Æš.uºÔ›+œh…²FÖºä¼Q2 1uiTTv~Mj˜¡Íú4™íˆê‚çMÂô¨JJûòÝ–¤¾Â@á¾þˆ‘—Åy\«¡´P6)5/"NÝ5¹˜ý·9éŽÅ‰q|Ö‡ÿ ï M6ÓÊ3|±(ˆ!¸L…àò1çlÂSœŽ վޱ¶¸ÔHN¦X(Î-bèÒ­Š•Þ™zgfu‰™;EXåÒ•K状x0—:q„Òg’; ì´uvŽöPf1Ðn»ÑIªÒ`V¶]¶Ë•äÓÅ*\ËÜq0uëÈ&Ñ™‰H~“Iä6¯‘V= g0çóÕ1U¾¤c* U³î ¦™ÑT¥ јs¹4½,Ïí’úö-ËÇ{"i7蘌)Ô.”s V1!n‹(oå‰Rç½*ßXˆå]nUgÜ‘ïdd%¢®ØòJT £®SXd¬+ÿ‰KÕänÕß­‹¸uŽï凊ܤ‰ṵ́îÑj4ágƤô§çfÂažTîÈ^]V-ÏÉRJè«É£lÙ+3Ö)w[l Þe¬1o¦æLxÙ±@銹„uv€y © )Ž4u瘣I擘Ï|êÖ“Q4ŸS­yN2ŸDÿæsJÈu:G6œÌßcæÞ1󙘕™Ïæo)ædæ§P Ÿ©‡£¹˜Ç•S9käSýy=§ÂéÏ"àY`>zÎ4Ÿ‹˜Û«ù;†*kTt2•. Ti2Î1)Ôß,µØî£3Ô»&ÿjüG°¼c+†°’ÃZë†PŸ®É×rx>‡MChæp=‡ ¡Õ_1„ö¬&§›=3•n˜ÉóiüBš¼Œ¦®ÁiXÇ7ç˜Z›z`#6™:6™nf¾ªË KÛ¤QTN%geVŽÛ|[F»Ësx93¼œfh¯‹q‰Å«Êœþç°ò›VNóeÀd£§,6“°—Ò]—qìàÊåVÄ‚&»j®(j=íÄCèËuaW†™EŠk(×n“ëV®¨l-=é`ˆzšÃûÃØº‰?ÛÏ¡9+&ù³É´šñ?‡‰¹„‘_jŠõ¥YbÕ(å“I¤JÒ@ÇØžò޳Š*3vö×(îJÏ5øvÞ÷{n¬ð|y·xîÁ]~Ï}ž8³àA¿çá Ï£œ8ÌÉãž'2+_­ð|-3Ù_áù« ‡Š|£Âó7œÃ7›/¡ŽÁ8x‹ÕãèóØÕb¯vìnjʇzSâ8³¨ªhÁ0žk»Á!©wGŸøìÝýXhWÄûQÈî*Q»Ü3ŒC#x>µ%@úßV}Ìö±ßó‚ãy¼Øa¯<„ïËm‡ðw¦VûmošFÿƒit5½þú^øT–x~Tð<wØ9noëPâÜv?µÃïùg5±¶?lnÿÅøí¿špû¯s¶o6·¿7~û¿N¸ýßr¶—šÛÿ]m·”»ý?'Øž é1ìjVïZ¤ÆÁ@´ÄB5Æ5Þ‚a|´çÁ;¼œüϰàØGÄå-pšS÷°Liö88)–©¦îE€šLÍš‚Šb)JIªqTÇ2Å.bS,ò¨LóqW?fÕë°–ÉgšÅÇéuÇl¯ÓáuËtGhXfZRã܆ƒøŸ“9Ê—×eQâu)%s¨N9"¾%­XæQ˜¹Á4"§}‡²æ[²Èá8|^—ýœ±Ét…Óò+E_ã$u¥¢–ªÍ«GµW#õ¢aY¼~¯V´(=)µ_–³ï–%&:¬9àu–evlò“c-9ŽÈê=˜Ê¥zoÁai°¥VÎÏ]Y“»².wemz%S0å1ô˜åTÇJ–äU<òµ,Å«ø¼šUª‹ø\ŒzŽRÕsu Ïc±^ƒö¢ p>‹r#k×:Ö¿fÖ©õˆ¡•å£ ×¢7âB<Èç~–gXt‡Xvú>ß`û)®ÀGèAH4¢£[¦¡GNáx>ze1¶È*l•óÖ¡OÚ•Ë8!& ô˵Ø&7!.·"!÷")rüU ÈAl—£¸R¾‡ò2åuì”·8þ%®’÷‰">À5ò!®•O°ËæÀu6»m\o[†l«p“m-n±­Ãm¶M¸Ãv î´%q—mwÛîý¶Çq¿íI<`;€¯Ø†ø|{m/ãaÛëxÄö+À>Û'|~ÊùgxÒ^ˆ¯Ù‹ð”ýdì·Wâëö¥ø†}ž¶oÃ3ö/á€ýv´?„gíOá9ûA ÙaØþ*ñ±*ØO«Bm-ÝÄ8&–ç­¸Ušq€‘¼eÒB b'­Ý a•5Úy²žmÀC˜Éûòn&бÉò3ÙÀ‘]>”ŸÈI9è‘z¹@ZQ`['×Ñç…=.•R‘“¶V›«.Zõ‚œÎw.Ús#ÖÎVbS·oVk X­ÕæxzLüvN´Y–ÙÔ%¬µówl`ŸƒÌá Ómá8"ŽçÑê³®_äu²¨·Tšgò «ƒýy¶=LöV¯ë°ld²ïG {°;ÒÇ´X.áoªä Ë¥Ö)7[CIÁŸíÏbŠ&Øû.»¼D ö}" :IÜ€W™è¯a ŸQ®íÀLÛýw0ƒ;­’ªÔ Ù<4Édxʰ†¢ ~äZ8ŸO…]¦T¼„ûÓǤsXBY7N1»øÔ7èÒå )©S¤‡Ÿ=Økñ½Ÿû”n~Öv­ôô6ȺơŠj¨tTÝ©PÓ­©Ò“õÄêYÞ$&x‹Þx›¨âçÄsïoý"ÇrF¿Dh›˜#¥ÍõI”zLÅ,~§ö“ŸMýÿ…¥á6®8.a¼ lÛö¤µ"Ð94V)Iü.séׄ¶ïGÿÆTÄŸb’Q¤4£HiF‘R‰›!°©ÛuKüS–ƒ–¨„‘D³c[CEé°$«%Ž¢ª}p-¨vP°RoºÁ.l´ªå<ñÙÛ¦Q„Í33øCþ~DÍ>&¼ú=!ï'„» þgáÓ—-ÉhºÄÒTÃBÙ!ƒäæF¹yníäáá9Û©¢\%W[:¯%Ý„Ã!¹f ¦É¬¯Yè—‡Y?§˜>q¦ª¹î’ëòìƒc¹«s­¾‡ÔÉwËn‹Wˆ4*EÔ?öWÉÿ¬!¹~LÅM®…ÜÇïs™œÇ¢ ÷¢ŒÎE–Îêݪ‚qįK¾1‘³|Ù”¨°Ù°ìIãbyDÕ3.e½5S}ÊÉ(”˜.^Ì•™X$³°\fçTÖs-u…}^yäñÿPK¶qó¢|$PK6“~;>aQute/bnd/make/component/ServiceComponent$ComponentMaker.classµ[ |TÕÕ?çÎdæeò’@†mPd”%{h) a C³ `ÁaòF&3qf–ºU©Z[µUÛ´nÕ¦jD@*µ­b«U»XmµÚÚå«¶VÛj­vïÞ›-É€Ôß÷Õ:ï¾»ž{î9ÿó?÷Å'>|˜ˆfªO9I1Íñ¯ê‹µ[µ=þmFm ÒÓ áxm›íŒúTÅÔt©£N²3M°F‡‚[j#±î`íÊh$`Äb‘(“æûC;w(zš†u[œlšÇ”¿ºaYÃꆖúéw¾¿ß_Û†j£F·±£v¥?7¢aôÓê¡`8_Àd++_Ëd¯t2*Û°©ìÜÊò²e5•Ë˺¨˜F;iÓøãL¨S ¹™œ²Û`È`ª.³ÖùÃݵmñh0Ü=¯ü¸âäÓXœ¤17ÃFK_Ï#Úîß"s•4EþÐZ4(ïÉJG]RúSËŽ«òµ.²Ñ):M S™&è˜Ö.zЧé”G¨"¾5cò5}س„~K:#Ã;1.ËÖA³¿] ;Fo< Çœ4ÉÑ[ºÇÚìûã}Ql}ýðYêFêú$;d×,À?.h¡\§ :Û1V£*žÜKuz3Ò³F§ZšÁTÐmÄ¡Ë^#ßÉ4ýøGŸ]%ÌÒéL: ôú£1ãlÃß)æ=ålGôV@³iŽ“>ÊT8¤A§¹äƒuCÂèÎ6c„ÎQ…±u´ÀIó‡ŒEƒN iÆa“þ¸øÜ¸!c“õ˜` -uR=Nyd«N ´ 66v`õ1eÙ[oÝr¾ˆÏsÒÙ©sNÉ=µA. å´B§É(õcÆN'5Ã#‡ëC:¶ê´R:jè¸Öê3\ÔD«uj£vxb0Üiìhí‚ e則×ìè I§stê õ¦–:cë‚ñ­ð¾\:_/ZÞ¨Ó¹´ (ÑÛ‡ýÌ)¹‘59ö¬ÑyL”O[¨ÓI¦‰Ã|±>äßµkêª5 «;t2‚»·´´¶/nolm—÷ݬþ0¥-´U§ =Å#–øÃuŸÜ”“BLeÇö‡Ã‘¸_œ,˽³¬­Ógèì;5üñ þ­6b‘¾h65‡µ sðòµNº.p²ú-é †€} ØÚ¶¼±º±eY­‹®¥ço<Ž)¯•_Ðé‹tdõ÷öÂôO¥F.9O¦ØšO7Ó—œt pò¤£ƒN·Òm°‹†æ•íá†cÙ…‚Gwâs¹‹î¢¯8énÀåqWL/µ8}¬«M4Õi¾  Ã±.5º$dšá¤aD,4—š—©íFˆîDjµ«“… ¬Ñ½ØUæïsÑô5¾.>!ȵlU‹Fßd·âBЈùÄÎî×iŸØ™#jôDú ± uzˆ˜¨ÇˆvÃ8JOàCHÐé =ŒéBF¸[p 6Þ(ë|K§Gè0€Z‹Cpù’²&0þ¨Nß1½d«?ÖÄvÑTúžN‘ çÔ‹uâmq`[{Ô9:‚3h ÷ûCÁNèÝjjÜçÃÿ«¼ñ­ÑÈv):éûC Üòñ”'uzŠ~ˆ­Ѩě²ö¸!‡+ÌGdžÀñ5AKFNäbYIâ œ¤)Gø™'a §‰G0Ü‘±£×@W—ƒ˜8 9­ ÇÑãï…Ÿ†„ÀY3;ÌSÆ„l¤¥JvæÉ|CßÎÞë;çÿ‹ø0mÊ¥‘ÿË>ò¡F‚eåÔ|]n•/@€û]Š\#µ­Y$rÅÂîI %¾3›þ Ókô:|< ÇýÁp teü¦ qçOp¨`OoÈè šå“ùgÞ”øá l5ÛÌ8¨Ñ_ ­–ˆwhwoW¤/܉ßhß3ÍÚç§ú›„Ÿ·™ZŽ»Û…ájM­y"ìßuz—þa!Ü ’ €zô}Ÿþå¤ÂG¶êôoú c_VD¬É%ìñD)_/ åÀC£é)Fd…éþLñ¡‹“µ…hŒÙ¦³ó˜ô$OŠõúEÖ)#Ð8Sc'’¶”!/Ù7G£þ­}qh} ‹œ/aßåä‚,«_)À½.*DÞÉÈh'¦²[í×´/«žãbGc6.Ö”kL €Z°‹Çȸ±!3Κí¥ª[öíí7¢1ØòüÒ™53JaµH'&™_Ú爵SºpÌåÑy¢§Ba‘½Ž®KG{¯ éüROŠ–Ê¯Î§Ëˆì·$m»—䫯ËAŸëê‚8‡`WЈ.X q£¨ÏÈò1l6S¡1R¸üœ4ÈNZ1cêUãU8ELÒözë†a^@Qq ‚ii-ú­Ã`ª~ˆ€©„N&™@æˆ70…–&ý) ô¦Rh‰áM+Þk©Ã‹ o6 *Ý5¼=}ñ>(´Ókì„úbÁ~ÃDâieÓbåbGçê¼I¨Œs»?Æ¡KÝy:ûy‹iȦ¼LóOÖ®ÖçæðÌ:ˆƒd‡b)”ñÓf1>™`«ÎAKÍ]FhdƧ»æœNÌ«×eˆ·é¯a#Âó¡HÌLº@ç(C®‚x$[’‰—oX"Ía'÷3M†› =[ŒNp­~º¸w¬`¨£lÃ’BûòõE$#ŸÜtBˆâ×»=Mµ†m)cK¶hèéÃ,%Îtúã~ÌÉ©‰?©óòðx«‹¯â«ü©‘9îZ#jº‡ÎŸ–è®ci—ÑÉá¢Lìö§pG˜3x¸·_n3ä•Þ`Ì‹”¶¼ò{3Ž'k_§ógùsrek6äÆðƒ)túnCã`ÿµ=æ:ÞHZ\üyþ¢“¿b÷¦ù˜'Ó)È7 ÏerdÒIq4Þu{5F^©æ¢óÌÕá:=þ8˜NÇcLe2hç ¨–ŒO>'ß•}GÓ]›lƒ•§‹¿L7h<ûÛ÷újk·oß^#G_‰vך±§6ˆÖö#kæ{xó½Ãòíãj#•okü5ØIJ"o¬×˜é\–u™‡d•ž¥‡©ò7tþ¦\ :¶r)ˆžï×y?Àtj[CûæúÖæ•­- -í›—6®n¨oo\Ûжyææ™CsõäÝ!?¤sBœ@Kñ^0Mý=̬AÈÇ&Ãq÷¹Ö¡bIŸ¶ £n>t;iæ.ømåïÀÊb½¡ 0¤ân\³>¿vÔ’¥é$ïôéø‘9¡äMü¸ÎGø  W¬oK,y;7®¬±1§þªY$£ž)˜Aç!ÒåðóŒ¬ô¬d!¹&—?Öù'rKŽìÑø9pt„Ýô&,n•%=¯ó òAbÌÚÅMK7¯\ݺ²au{ÇæöŽ• m.*æ_èü"¿”öQ€Ï™Ù’ÖoõGÛ€“br|ûh¶ÍsñËü+'¿’ããJ²‹Î·Ò¥¿Š•¼qäÂB~‹î©›ˆ´ìÒèEãïa·¥fxN7iü¦Â±Š²^¸1\Ž’Æ’»ÕÕ¦ú€[üIx£‰<‚AŒÔ}L®ûo8xI_ øÄbÈ¢M¬-Ô•›»¯˜¹)‹kj ¼s'|<ð¹”[MƒöÀ*Êr£(Ÿ:gšÊ|šš$\¾/‚§ãu2lƇ€¢N×ÕP&/ hj*ÓYkÂÐk¤[4Ñ™­äð .55«Ôjª !ÁßÙ Sºª4ïMbqq9ùŠ£)$YN´—ÕT–kªÖ¼[Ö©3eÄL]ÍRH®\Q£7Õ›×¢sNÎÂsà´Bv¦úÂ2óGu5GÍTä-Ž[ßœê]jžšïTuC>i (ÂÎjjBVŒ5E¶Ñz¿ ‰½¬ÄL!³Áäd‚z]-U &“^ÓۛݯÄB-±PgËGàú𵂩.…–)ÓóŠí™(™ÎbYçÉ™äšpó5Õ‚µVV\\@ª•º*£×ßjµ®Ú$èäuG#}½šB®ÖšÓ±Í…àΑÿÚ³5…¼oü7-k2RM‹É €êÐÕzµAî»ÅÕäUrNÒÔ¹!Ùh…e°g~HSçA34…´ŽM³êÔ•¡º„ØHÜ/Žôõ(mA[aA55¿¥©mPìÌšš™šêA"â ø£Aø[0¾S2«õn †;MA4u`Y_8«1g´×Êóç—&=Õ}pV/¤ÛˆË<ȃTíÈšì!yxÒ•JiÕZ d—é¡Qkl·/Ö\xéÉõ穘.w¢™0 ãjp·<<0ºÚÌ|p™ù‡c‡\ª‘1ÐGc8 ÷H}G,ú °MóS©|„’µÉ‹èf#"…óÈ_üùž.üæ“\¤ÈŸµà)ÿË/ÑPÑ4æ~sÐ8üÉüIÊãÝ²ŠÆ'§#š€É¬áËQ#u•ûibEåC4iØ´ë¯ÅzëÌ ÆYÝi2$$³$Ò‰ §Óè?%;Þ§ÒtsžRYÆf O„ùÞ°ˆŠ’ÊU7WT%hfKõAN$¨Ñ—7Èž¼ƒxy”–ûìûAj”r“Ï!å)Ïö9=ŽQµ Zu z%k´n€FWzçAÚ`£uƒÜVñ MÒ¡¦[Éæ¶û>ò'¨»­#¯d[‚zÚ:û(jV`ª¶õù4v>δ‡Æzœ%Ÿ8H—+Yö]9@52õ~ººò]ÛQòÙýt½Ç‘ ÏËÊŸOÐÀ>Ú“\—^’inÇN\ƒt§Ç•Üɾ|O~Åú²¯ÀSPrOjrŸîÑŸ —'?A÷ùô5Pˆ:(LÝ£~ê£Kð{%í ëñ~}œî¤ éAÔ~‹.¥ŸÒ'èy<E—Ó?Ðë?t£Ïp!]Ã%HR=tOÆ¿r“ZCŸç(/¢/p3r׺‰·ÐŸO{x'²ÇÝx^M—CÊ[y€nA¿o£;ç ¼Ÿ¶òwènÓ¤wS¡˜fÒ¤íümzšnÿàô = #ÍûèG¨³Q5fý1ý{ËCâgaØ ¥çÐêÄŽŽÑϰ òß@/ÐÏá¨ÇèÓô ´`Ñ‹¡CêôJ…í4ú%½Œ¯`í˜ÍZÿWXßZõWéUU­µ^M¯õŒ´VxºWò]?Ë ›tÂß‹²uyx¿¤JŒð PqUÆ›*[ªJþ˜iøcª¡E¼©:Aoì¡S*L«z VUmÙ“ ö©¨¬†;ÿÕg—¾ z'm|•Y¶ç±'è½u‚/–áÌÅÓ}îk8ˆo”ö¨î§0‰yôŒ'AMx¶6ÂÌtˆ.†©È¡em%C—˜‡ÁfICa¶.:Š:ÆN¡c,*%ëé^¯šXöz{¤ÊØ„GׅۨW­¢z?+Ÿý;:ö³æË;Ä®ŽC¬wxòÜ\´ŸGíg70Êáæq žàqÈöÝ|Jrÿnžd) Á“=ö#äMu8C¼Ó>¬à¦ÚÍSSÚwótè¸i?—Y U™† 4Ü<ÞêæYméNge:ÍNuševš‘é4'ÓÉçHvª3;-€ã»yQ¦ë’L×¥öd×e™æ³3Í+r47eš[†4‹ÂVf)l5ôQõ9+É^eª¥=¥– ˜gm:x;' ¥gkcµ*ËV‰Ýã*ܼ>Ï„´J쬪-ÁM8«U%x³ˆ—à@E5»Ešm¦4 îñä%¸ÀGü÷uxòó÷óö½iÛ}’fá÷ûpÄÐ(¼M¤§`‰OÒ4ú!Àïijt´Àú¶,vÃ6o½Ýç=pÚ'Oâù âe€Äßñ|Ÿ~Á£éEƒçz‰gÐ/ùL÷3ÖáV[‡K?¤Ò*ý_»‡NCóõެf3´Ü(Ý*Ý,®VY-?n¾YUVy ÔBnüÅVÉ: À0MgÕ²ÎBy;i)kÀæ|Pm@y3о‹‹hS”GÑvîÅ@àœÐe*Î%þ’¥ê$œÙ̺[¹ì€$;ç¡Í‚§ÛMu•§rß‘2üfèÎwˆ¿ÜQµŸïn±ë+&`óWáJ{[*¬ºûÄÙ†€8ï­<È_O±1û &¬Ëä0M-ûxoõA~P‚ƒÓÍû÷J“É^a¡£©’ªÒ”Àg²½Sà&!ŒM¦‰ì¥*îj>ƒæðZˆç2žJgs)¸Œ"ØJ 勸ÊTÑ“ñf£ûsfH.„2š*šH%ü0’àH§˜!Ô†ø0Š¿eªm8Σ$_¥Òê{DÔ§A}ÅhYW%4+ |X8éí¦ø#øòËWPé)@ÓnÇêc ï8öú¾†ŠAò ôGS—m–%D»L’´‹£OdýT5Ï&œàYÌs`sáE>xÑ-Çs/¤v0¤M¼m ¼€²Þ³ \ðlp¾Fð¼8¡&ºÜïn¡‡‘òJz0ù"· WþÖÑû|2Ávòz>•7ðxVñ¹<›7ó|>ØÏM<‡×²‘Åץ̎ץ<u©(æ³Ñ÷yìk€@³ Ï(úìBXÙÍ—ÒU)7 øÉ‰mí; 7¦±ôF3)³$AÈfö;j†­é´I«Q8±´D6Y<ÉWç@¨ÑkÞêGÁˆ»)wv86 %ö«ñ-Éê‰C«A­úS‡ÕçUf%»ÎA›&)[2ÙyL'»@ ·:ÍÌk«÷)/’JÁÝ=êçÉc˜"Ç  Åuˆ}ù ÖÌÜøfÚ “L/GÖi°)ää{ çÝEHófI–ºX Jª|b•[Õ$Ô iÚd-v–,–o-&ÕË=š-¡fP¾šguYdÊcÕ.I¨eÍ.hf ÉÏ5l¶ÅÚ,¤;BøAJ»'…_ª1µC·ú˜àWÁP›³ºÛ;±âlÝ­šÇêæ–»Çê£ÞF£ñ¨€KáqñíTè±CªUÑ:TTZõRŸ7´>kØÂÛI¯NµB{©å€æì+ÜGcî+ò™h ¬´'Ô*ì¥(Ož…¦ï ñvÙÒÐ}@ÙkíV¾,[³“f…%û& º8œÍƒäp+¿¯XfôPÌéVÝI­©¶v—´F¦:zŠÝê|P©=4¹Ê’.$CЇç*ùG¨2…“2å[2¹ŽÐÔö&k]fmuz9Ú¢2ºðHzú¸L_8lzôë—€á´Æ¿ßI ¤ö­ø½Pq-bú5€½ëè0ËR‡€q# â‹à7èJÞC×óÍHþ÷ Ù¿…îä;é^¾‹ä»é0øñc<ˆ@ñUú1߃`q/¸ô}àÄ_g¿Áø›{¹†ïç¢\Çûx%?Ä9xØÏqóÄóZ~„oáÃ<Èßæoñ£|„¿ÃÏñwùþ¿Íñ¿ùq>ÆGT?® ø)UÄ?TøiåågT?«fðOTÿT-ççT+žkùyÕÍ/¨ü u5¿¨®Áó:~I}…©žå—Õ‹üŠz—­þůÚtþm4ÿÖv¿f«æ×mgñ¶¹üŽm ¿kÛÈ7ÚºÀ¶Ç›Aׄ®4¢dq(”LT4Þ¶Rí0ƒY­mÂïó€Æå6¯Ú‰RÔûæU‡ƒ"êÏj—ÂÕCêãfàºWíS¢ä¢Ãðd a¼Q‘ ¦ÐÍ£ô‚ºˆtì¼E],WØÿRu‰º”ŠÔuô´úêŠÍPgÒaS:ái¦Lf¨3eB))JI™ÔeI©ËM Þ­>‰çDôgºY]AòŸšÜ¡®\ä¡å4[]åÈÿ_PK6Ë·_Øÿ7PK6“~;/aQute/bnd/make/component/ServiceComponent.class•VûsW=?´–ÇY7—´Mš¦‘ãØªKB‚íTiÝÈèU­"¢jÖÒZÞtµ+vWNÜ-”ÒR åQ-ïBg€áÈLèÀð3ù+WZÉ cìñÕ=w¿ýç;÷“ÿýŸ¿ÿÀ>Œ`Ÿ„ý¹¶o$Öíz¢©¿h$jN³å؆í'4ÃÝ2kFêテ%LÞзô„¥ÛDaý†Qã騄ã='^ç­DÒÖ­í— ·hµ¦-a"ŸÌ©Z1™R×´²š“ d{®4ß5íÆ’„ý)Çö|Ýö+ºÕ6dŒKxdÓ÷[‹‰ÄÍ›7ç¯aÎ;n#q«iÙ^«¹ÆW3i5_άdÔ’Œ FZ^6ëÌ×Ü0 ÷òe¤ ¹b!O£5‘„ŒƒFl½i,J8Ø{¶’L• ¥ªŒ‡$ÈzÍwÜmZíYhj©’I©]Ã#ìÔÛ³ŸêÙgr95I–òa Q³Ù4ê¦îÄUóÉg²jZÆ#ŒkØúºeÔû-ÒUæIÉ8N‹ú6S7k´Pz¹«Ùr¦˜e “ÆšmË7[Ö@œb©P!U2ž¤—–ël‘¥~/…b9SÈ'³2fèÅiù¦Ã.Òæ¡>/EµTΨšŒ³dŸŽZ†ë›†×ÏU&ÇtrÜ%…O re6™T“­Ñ…çþì*jI Ÿfv[†ëu,íY¤ ù•̳WKõb!›I±ç%ª9ö†Ùh»Û¹–c™µí~ i!’|QðãÔ…8êý6ìj¦4‹Bc?Í­N¯BÕ§Õž•5^7Bv#j®X®²ÎŽ²Û¾i%rzKxÓ̆­ûm×p¾ÿéòîk°ûä2}LuofÚt Õðxúüý®ÑQM|u³Î”T‘¶ªõ'§>OöŸÜ'!þ؃\®-¬-°eË5Ë´MŸ¤ Åg*†SN݈"‡Byö¨#åX–ÈŸ7=†"žªo¶üm’AEÄg؃-†Ïà³\í@ìÄóÏÇB:’°÷öÝÛdAQ†à‡9žá;3—eœŽïe|ÚÞÆ»1ü?! ÃÏØŽ„Ä.¦»µ=ÀK?‹á=!º‘šåxÔ¦¼£#ªhú}“ 5%,î] ò, ‡ûïÁvËØ¹ ×ö8SÿÏ¡+æ^TsÚnÍX1EœCƒy΋·(Œm.%à˜èÏ'x»‡ø7‚ØF2÷cülU6Xï'>“ÄJO aáïhOó÷!|ŒøÑ~ŒøD?NüDŸ">Âqâ3!è Íuìðöôa¦yœŸ'‘%-9R‘2:Ó‰µ“‘ؽŸJ:_à—Ìn‚úþ˯w*èœü†'ûðÛ Îð;ˆi/‘D ¿Gô¿PK’/MaŠ PKÛA‰;aQute/bnd/maven/PKPK¯TU;$aQute/bnd/maven/BsnToMavenPath.class;õo×>CNv&F¹ÄÀÒ’Tý¤¼ýÜIJÔ<}§â¼|_3 ±$ƒ…‘A +±,Q?'1/]ß?)+5¹„‘A8=µÄ½(¿´À1/ű¨$3-$ª®áƒP\R”™—n­)ÆÈÀœ_Z”œê–™“ 4 ÕN=z6FFf`:• Äb`’L PKR4az•ÅPK¯TU; aQute/bnd/maven/MavenGroup.classS]OA=Ó–ni‹[@)ˆâ´¥²¢¢$ šhŒ h êËv;–!Ëîfw–„Ÿâ¿ÐDc4Ñøì2ÞÙ.-¥èƒ/3wîžsî=wfýþöÀV4¤ÊÖËHr³é¶Ìë»æ–ZŸ^äkÈ0Œî[‡–éXnÛ|ÑÜç¶Ôe˜9Ízº;^Lݶ䞆ÃÅ&äÁ¡°¹¹íDmá2hm¥ÿ´Å`löô2n{•!»&\!×Ò•ê.Cæ‘×ây¤QÔQ€žÃy ƒ¡¤Ó–g(n —?š<رšW²žm9»V Ô9If䞦7ÿn™Š—Ú\Æñ†ÛÚ¤xgÙ’a¾2ØhõÍ`NÃTßÌ:irÒ Éw6àaä\é *ÃHÈåvàùœÊrêÔHŠFR8Ô¤¿ª¦1Üm×’Q@ŽVNÖU3ë$“Ãp70¯aŽÊöi訠ÊP°=WZ Ÿñ#†ñ“ö;ï`µúZI,è¨ã&¤±1Ì…LüÀòÕÅõûc˜è¿¸#ÿøò–ÿË)ù ™¾â¾H0ÌV’ËwD³mIÞ<tìžÍÃÐ#üÌ¿á ù†6,TÅÞCZTÍ`–i) A£H=Ú<­ŠéÓ:B§ô]}+Ô¾à\Íý ã#S£õÑQ5‡q:é8&pvúÏ0™H½%´ÂCßQÞª§kŸ`4ê™…FýCWÑ -¥1D ôGQŒU¯t˜‰ªŠ¦©"‹q—07y™P)2¥´®ÆEl˜Z0®}ÅõÞèÅq-…Ÿ('fÒ'Ì”¨õ1”©*;Ñ¡wËNa&•ºÕ5ª2K1ÜÆÄèrÜ™ïM*ƒ'Oˆ²®(Ã]¢(‰{1þþPK­Ÿ8 ŽPK¯TU;%aQute/bnd/maven/MavenRepository.class¥X xT×uþ¯fy3£'YHü°l°@H ‘m -Äb9’À–#Èâ§™‡{43¼™ˆ¸1I‰;‰'qaj—¸qV¼0 'm M×´MÓ-MÚtK·tM7×ô¿÷Í"Fà6Ò§™ûî»÷ܳüç?çê[o¼rÀ[ĪVšwg3Vx< OšSV"<(?‡­T2Ë$íi nºûÍ)37á]ã÷[‘Œ¯ÀêÒÖ´eOÅ"V¸´ow<;Khð \»p]ám@à†r¶¦{’J‹Ýf怀{¨wp»@ý@I‰‘ŒKLlâ;;™ÌÔ:ïbÉðŽXÜâ¼Ï¦"vƲ)À9 Ÿ¦•¢r e$ÌI‹[6Gâ±D,Ó#àjY?Êù¾dÔòa‰ËuTC¸f –°†²“ã–½Ç[R­dÄŒšvL>ç'½›•¤\hÒ± ”–9K ¬¸Š¿¥ò™¤c ÀÒ–õ ÍÖ°š•OoÍÆâQËöáFž¯Dw° kåùë[ Z?*m[¯£µrm›Žv„¸ÝL¥¬DT 4w“ùM ÊŸ¼IŠëX‰ mˆ˜‰{íXÆRÞÜËÏ ‹º¥‚ôÚWÏÀöÃ+•‰%i ] ¥=Å76ᬂ=eÙi·Gïa®f<»ĆnÅZiü× NÃíE˜rk8™žˆ…wÛɈ•N'ízЫc+ú¨ÍpÀË`®™kM_ÜL§ ÞÉfbñð@,ÙTíØ©aA:ÿŽ;ÑOGÑG¶ÉÈ ,k™»»??O oÅ †bmá[CØ%1lΔÃ%°jøq·ŽaŒÐoT§Ì¦zÑ^;ÛoF¸m]%lì[8 ÃîÑ1Š{yâþ˜DÈè› èÀU¢² âÒæ1{ISИé!šçÃÛ®ë3‰d&(OÆAèÁæt¨9]wâ> ïhºRÊë01.àÉØf„ðl©`Á¾ °'#¸ÆÓ ê“·€"l©|)©·»RÔÔ•C„‚#SŒp7̧B.ô¤øM ¢Ã·ûé;¾½fAþ,›ÏRÓ©Su–)³ùj:ôlòºŠˆ` ‡5šW$tLã-gâÊÕÛæåËÓ±f­DÄÚ´Ø|ö“Ùø ŽŸÁ{(šp– lh™or@Ï_ÀQ¼OÃ{ô¹ó:~Vb®:–Þ³wUß_ å¦^Û6§¥¯8†&)çƒ:Á£Ì‰8g%ÕVNžã1 !u—MoÂŒO‘Àü(>FžˆÄ-3‘M`¶¶RzV:àãø¤†O,<€’bûcò€'ð),]”]±,ìÕði‹ƒ:€'±VrèS:Nàç$‹%"ñlT‚oe˲²%`žÑñó8)SÉŒg­]ûËl\´Ò¨ó¬¬R¿PVœuK¡8ùðYÂ5äÃç§ŽûM[îó:¾ Ãí¥eð%WIÇ—ñ¦¤–¹§ Ö^^àñÛ§øhE Z‰Œ=¸SªSóL¥©&Ýi[élœ™àË+EXˆ)ª)~¸¦ägÓ•@¢ª‹Ìêàvš—Ã=\yãâ(˜Ë°þ‘ØDÂÌdmJÝø&¶l^¸D2ßoшŽÖ~¿«áw ]˜Úe[Öá09’%&¡ã;ø=º+’œL)K®Ö…»yÐï @–Û?”åöZÊmZtóU‰pTV.¹…~fEcp<“f&‹ ¥£ßŒ‡î+W´âºŸByÉ?Ôñçø -ÂbÑK ¹[ú×÷ɰü•Ž¿Æèye‘ìÿoZ´è,ôÿ ³‰4ó·ø{ W!Àù%:þAõ&Î1i©Ô?êø'™rÞ¸•˜é ¥£¤›Í´%ës2+›&Á~Ø£ø‚ãÿØXúd7¤n"®T6£€]Fãw™vyÓð?dÜ’}ýñ¸5aÆG2fÆ*6Æ>\&ÁªŒ&-‡ ÒÙ”l‡‚™Vç‰ÔI3 àu¬¥ $H¶“•4Øú¦òç ùÝCO ûá•mo__ª÷ ^—ÏaÇ+6§ýø¸è¢ß§›G·ôï"ÅŠ]ÔʸbéÝVÔLdbŸ¨hëO8|\ Ø±edJ¢e')Ðñ3F &Í[LYäDYëç&Á ™R9·±l²BbTJ•õ£>ÔT‹åÂÐĵ±†e¸c²SµÔÎmUQ6GÅZ]¬-\À½ãédœþr:³º–2ÌúD«@Ç’$Æ ª€I vJ¼gx ˜I*ÎYªZ}Ñ®‹jä-ÛNÚ¼Ì ^>—È[ºkÒLÉ»úü0 ¥Õ¼„þ¿â@o0ÊÃÅÿ+¬j¹ò?dÈý©ÒrJlÔÅm‚×ÏjÞ3ý‰¨uXv>’ºúåëͺØ"z¸)OçïÿËZúû+¶ASâ¹¼W¶(•VTÈ;¢ßé‘%¯ÈjffŒ$³v$›¥eÿ|èrØbÑ…üõ@ãÕÑÍ¿jè?5¨Uß¼2«ï%j¾>Ô£»–ò©•ßòÇ[ßø–½ÀQ®…¬fUj§‡{ 5 ®\QÜæ·Üéi=‹ëJÛ¼jÒÙ¢; p=nP›W"˜ßÜCu廥ç±j¬~ÍY4·¾Œ–Zsè8]&kÙYK‹²6à-yYíyEª\_,Û¹bÎΪâÎNÜħ›9vóé)CÜÁ~Î<|·ŽÕßv›†Ú/B—OíòÚm~ =õþîèvîYlèöžÂ-†ww ¼·Çð´Íbwº5C»ˆ­†æê44wg(‡=Ý>Ãw^ÃwZîx›ÀñË—¤Ôú}žWásµŒ¹ÛGfñ:FzÀ¥ìèa@½ô]-½·«ù´†¿«ÑÌß-X‹X‡´`Öã>†3ÂùI„xÙéPö3Ü´,o¿Eò>yQŽª(ýAXØÏ3›yמÀzFJŽá~Fo'šðâ×>JšD‚ŸÉ¼_õ)®‡ü7ƒ‘ª½I½EC[ýÁútÙn· ¯á>‡wK/åðÐqxÄiÃÓ®fÎãØØY<ÜíU¯fpI~@zq¬»úBWÀÕå?…ÏÕþNéÆsøP·nèçðø žÇ“c†~3Ý5!£&‡ã3x·á‘°’ Ÿ&²¤Ÿiç_ýsü0|rtŠ„š<½Ö¨ÍáùÔ^£v_¬Â½§°Q…æ´[…ƨe\^táV©é3^gÚÃúȘÇð9 ŽùE£¿1pò2%Hó¼2Ôg[ø£³8_E|­Ú)c€pl$¯'Wòж·ÜÝØˆM¸›±‡¡ØG Dø”À8„^<Š­¼õâ9ôáK؆W°p'.¢¿Ì€}›€ø†ð=ìÂ0ˆSÎëÁ¸GAâˆäÑP€G¯9àèë rä@" üøçÜÔò ü"aè¡~?Ä/&^êô*¾©À±Oñ|àØ‡OâG:õPŸ_!=Gp~‹{k‹ÐqdüªJÕGðk<ó×Ušþ†JêOð ªæ<6ëó¾=Ôv¾69hmIHÕ7‡?h/9uÅcTb/ÚGš{;sæÌ—w*Ã[¡Å\hÆ+e|œù ªâ®åø|Ÿò Š:ï~ ½}QÑ?UÌñ•$ûLHA÷xH"×ãê"–Ǻºü®.ß)$Œ@£¯S"ڕßuU7V×m8‰&~Ýö,Û w™ÃßÌ`«»‹¬²ÙЈpNþx7(,»óX>(!¬9èíÖC†&!\ÓÚÖnÔ:}qÌ'}þ“—oôÎ@o“T%!ýBÑE;X€qF,¸DY,ºa? c‚ˆ;@ôĈ˜p7£:ÆtÏÐ2Åæº!'8ó4Ñ+Ý™b¥¡éEw>£œ(ÔèŸéÄ*5ú:È¥FKŽjð8#§ãêðþÿÆ I"ù ßjÔc ÿŽÿ ä»™ÿ©pô ³dˆRjŠAqÎú¢þÿ—:­t©ÓçñúXýL¯‹ƒ£Í4WáÉÓÊ’eÎê¢%!D•’þÍ6…K…Ü⮟Ÿo«ë¨ ç„{PBQRÙPHQ›!i¢Ah}„r§ 4çv0"â¿Ðåsui§0jøµN2 W²›÷Eá7¼L,7ÜŠå¼d¹A­‘GÌ 6O|ïwͼãŽi¢Qkô¼ü¼á.åÇ]Ìà=¬uqt”¦¿—‹ùûI8 Í|4ñ³çQòCtüG8ó>ÌÐ?Á°} Å Î|–OÒmw2`tDÑmÏçk‹Ÿôô E$õx2€8¨HÃÍSP¤ááYýŠ4¼ÅÀªUb‰ ¥¨' \¿T…õ'\)38ÕÖ gÅ2É©Sƒí—°²A\wN\?$“%ääJƒXíäÉ`ëy«ÿîYq£ RN4ŸA‹Óo0Xyï­w¼Ç,Ú\hm{Ë òψŽRútªj†Pª¡0³Ò †¬]á[¿†n$Ò†íŠå ^ò ¯:‚| ÏäÎ —v¨·ŠÿÎn2äÿ ¶„I> ó…CÞÕÀvjúKé…Ì—N/*¾´]+‚|¼eŠF˜®©âC®ãu°“ÂÆUä Ëi|i˜ÀeÊj ¿ÍÉ4'Ñø{XÊ*¦hZ:æ§Ž#,îT|î‹t]¸Â0¼äÕëÜ­åÒÛ´kBæífÞò\êÈ$fÂŽ 'qB% #8Ö9¯AÇU-p×P8c o©á #ÿì !ozö8&ÆÆS>òKV¼@šâ‰ Ñ‘±˜ÓbœÆ.NO1úti^4…$cdOA#ÙCÚéqZÓÅ]ôK;ÈgwÛŽHf¡ÔHöP‚^ºÓ$K¾†! GÉÓQz½…†Ç¹´^ ›BÚÅèÀ¯— Õ(~BŽžÌFcøŽÄòÜô|ÁäZvz…ý¹ÙÒfãøˆÁE¥ã;ÃꈲÔ°MÙÇP¤ûêiBbÏ Gz?íÑî0J„i‘Pݧõ9! +)F•ô¯»UbànRÆ Ê¸…Û¥w¢3îþPK°à"£¡PK¯TU;"aQute/bnd/plugin/Activator$1.class}TksÓV=;‘ã 0"˜G!j@±ID …Bh€„ ax̵t#+(RFdø)ü‚~Nif`¦|*?Ša¯ìBŠíhFsw÷îžÝ³ÚÕç/ï>Ác;ó{I,ŒºoË^⸾qÍŠÝayDA–¡°ÈW¸áqß1fê‹ÂŠô2hß­÷ßçuO0ôÆ 7*Ÿ!T³;ì(ƒ²Â½òRäŒùg6]ß¡ëy3ìÛr9׃U™…î{/»¾1LéÛåi‡îˆ7ø!;Ø¢ {T(ÈIi¯Š>䥴OÅOPóÈ`¿Š8ÀÑeÐnÓõÅd©.¹&Í ,î=ä¡+õ–1+›Â0°M©åb• ¿GqLA‰áPwoÇñ áÖ“è{¢àÃÑ t ayîr$ +…Ap±»$ˆ;“(‡S j :\_â/E˜Ã ò(£*ifÓkí=ë`êÒÆ†©ŽÉ0 ¨d'ÒµTO|Û%Gø"ä±ø h<öÿ9ž¸ž-Â<ÎâWçþ7tM¿á|sr1³ÀpR7ÌÑÁöZó0ð»äw‘>¤Þ~/˦泒tüCŮЀñåeáÛ C"ÚL­ê)×5L(§áéÐ!×1ÉwD<-¢ˆ;4ýz—’o¨¸)½sqдæq ¦‚Û '¶~éÅn Ãv¹8‘‘öþzª¨˜Æ†¾€ˆ¤f††nn VccÕµ©œÈ˜mÏÛ~aþ³t³ZsÐFkÔNøcÝ][žÔŒÙ -1åÊEÙõm‡eZZ°Ißò‚ˆÒN‹¸Ø*€ö®G4ùT:|œ®®Ö|Á G‘ˆp†Ö:Co2…‚Üx  É}OOÚvúCî w'v‘×n’ÆIÏÒÙ_©®£P9½­2´Nê&Šk©÷AÈm’Q2â ‘¤’L1ø‡SûháýKY¥ïƒÊ¼ùÏ_xÞê§µì T?ý)åïQžW´“Mg›¨˜Lzc¾ò7´·ÙÄíÒ.“Ú¿«$m`ªúµG‚X#rYJ^L)ìMÏ"¥.~+t˜HOÉëýœ¼^`éÁ¡£Ž*,˜tÞ…ÀR2ÅfÁ-2:†0C÷²‘÷RÜû˜¥3K¿°9ïÝÓþùûó7€»X10À0ÉßFZØMÕ²÷¼È•Ê~æhÙáÚJKÒ ùÞá¶Ç•k¿iîG¸À`GßEJñ¦'.è¶ K‹ÄÚèO[#\‡{¥°É0Þ8¦ÙÐTîóh{[$˜©¤^eX.ŸGÖ ²Å^ó[b 92ñì’‰!d³HaÔÄ0ÆRåškH%^G»Mlv{±¾Ã½-ÈxÝ ¦ã¦ÎQTZ"ñ© R®1Lûk Ç“{¡°?6íh¹+H-×Q˜Áu3a[hîò"È`šYL`&Vxƒaµ\?ÕeíŒÐ‰Èf;ð÷cÉt”HÇzøAXlE1´ØŒTËEW(p-}•Å-” Üf(œ} &*¨2d´ß2Œ•+§5d1wfOv¾³Ía·$÷|7´-/’… ä—!O¨$ÌÐ.7N¦†ûÚÞ—-WèÐÞh Ï;}ågEúž{½{ðµJÑ]Îô‡ö Ù ? ñRÆùÕ qYòκrÒY¤ ¤j,Ò8in¹(3ø1\ ñw½ R†ÆiôCfŒèiÉPIûÊ67ˆµs>íSw,tsh#¢éœòtÓD™ˆŽ+Ï”Qé †ÍÖE<ÿ§®0”·ãP΂¡îÁÅLn]ñ0‹j®z¨ažÁiåÐzGù6öd²" Ñ‰¡D¢r,窖/襹Em;Iffp‹ŒW&¬â6î¸XfX“ˆË@«‘•|p(ÉC%tY¾'­‘|]¸îb…šŠGÒìšÃ8ŠTņa§Õ9KaR~¤ÂH¦–wûRë)1ýjªÝ8K¹£rUs›œƒ©ðèØxO¦ý8tñañ|ÍZX£YOD0,´¦—õv‘ɶÖJ‹ ˆCëJ¾ŸOðù|èQ–hÕàÑée²ž“ïÐ^o¯c®ýè~û_ àý«EéÂG\#+O$8®ãF¿‰ù Õ“¢$‘³Æbû+üïXú—æíŸÏÐÔ&4îÈûhÒ^Ƭ¢]d±GßPKlþêSPK¯TU;"aQute/bnd/plugin/Activator$4.class}SaO1~Ê7ÆÉæaèÐm Š¢I1Y25 ø±»•­xôH¯Ç~…ý'&"F€?ÊØÞ!qIÓöíÓç}Þ¾Ïýùûó7€E¬Xè#˜ o#Åܺh¸û~ÔäÂ}æ)~@U K’Ù]z@]ŸŠ¦û¦¾ËÄ$¾ÄirªnšŒ>_Ľ¸ªûñý%<Ðsñ•X&‰…éïPK¢p ¨–¶PK¯TU;"aQute/bnd/plugin/Activator$5.class¥TëNAþ†Ê µˆÈE-XÊeAÅx‚‘¤ŠŠÁÀ¿íîP†,»Íì,øZ&ˆ&>€>ŽñÌRäŽ&n²{Μ9ß¹~í·_Ÿ¿Çœ:†ûM¤¸Uò]«âEeá[ÓŽ›¶ dvÂ@’!½noÚ–gûek¡´Îe !s`}ù¾]ò8CƒZavŒ¢Ï;Éдi{Y%”ÆdŠ‘•~yßPÒf¨×zÈÐW dÙâŽ'*!·œ@rKF¾œp¶ŠBÂ5L _¨' nî¼ N¦<Åò·lƒK ÉBàò&P& 4jí’‰&¤´vÙDóžvÅ„‰ )$Ðe¢Ý ‰œ†·…Ï_E%.ßíM0S Û[²¥Ðçš1©ÇÊÐ{NKÙ ê>A¸ÁÐq¼›™Hx.—)d1` ÿÈR÷cš@gÉy#k:¶–?¢\¶ÌR §¯±®Xx}Éë”"ÇkÉ:‘¢-EϹ‰Ã©Ô—ÊÒ©±Ø†…'ƒw‘$ºë%S’6Í:Vb²¤Ã»t´` K$]*1TËÌ.# [§0Zcæc5W7÷qs™éÆ+ÅQË‹E¦%¿šlï2È!Çt“i‡ !’sŽõ¸R l Ÿ\á${²…gÝØz+ªé£”ám£?LÇ‘ÆDÆÖqå6'Ù«‚V·ACs%_Y,éPWÚö¬“› /톰 ›%…ß-°¨¶y¤ð"C£è“nzŽ­x/ëÑ’Œ L¯nï0Í\ÒX‰tjˆ1åÆ\¨ÃD aBŠõëVñÅË”è¹I£3fæüâØ.ÍïXQ;¹NÉ =:l$5Ãí³iYM~ÔÖ¥mÛ_Ksz\š#¼\îÈãËõôÑ­õ%Q,»‹*'Ôæ¥d \©©XoÅm.t˜Rs WÉ×EÊ{×0ó §–¦»ºL'„>L¬Äûq†T ¨ãz|P h±Œ*'fë¬ZÓì3öÆ >ÂÌ9«ã£øí²Õ;¼RûEDÃã !Jp7ëø8n!TÊ´;ŠVâÖ5ñI:>$áݪãÓ¸gÆ6ÃmUHx·køÌØÌ:/„ݸ]2ë‹OY>·r•ödÀøÂ¨ ”¸<[GÛÍødÂLÃzL×eÕÑð…±M:?„}ø¢4éKóO1Y¤1Z¯áØüÐðå±5]½¸=„¯â> _+(bn¯íµ:Y`\žtn*aôé¸dΊ¦´ãðr!0£ ðÙÖ(5|CÇj< {éxX&m…JÚå;ÍX%A¿†ƒYzK_ò *e"’Åò›7Mª[g¦’Ž·,i›™‹GS2ÅËÝø,­dt…¥‡,w­ÙÉk©ÅŠ1ž+‡]ÏÚ¢§yá%³ÜQ šjÛÛý %¬ŽÌ¶µN2ÆpŸ¨žå‚Â<©á‰Ü%n¤$ßÅ÷è5^zX¶+ºÊZñ´ŽgpTûÖ5¦Ê£f)ÿYÏI •”°1Ã7ˆPäæŒÀ-¡ ^àüæìì–LñuüHÞæ‚^2›÷Gð?õï¦Á‡ÃÏÆfÚ…!ÇÏ%§_V­·zdGNT¦eUýσ‘IË+¦,«»ðK¯áure‡|¬á‘7»vdå+rm á°rýšÆO[0-Ù-¿+ËàïæždõS(”¤å9öG{åå6èg.c[iĺídoÂd*q"C6ùf:{t®‘gyò¾XFŽ:†ŸªÙÇФb׺¡çPh½ºÉ,áI“ È<‰ž/·fÛ6u»7]L'èR>*Ëæ9¿4~• È»:ŸI|–¨– þ®ÂxœÎöt®å“Š¿gð«‘-/ø¨ˆ àÌÈÔ<¤Ä„Õ6©à\0ƒbgâl%R-Æ9J…o ®žÂ~€_S•È» Hî¼4R?€éRf¤þ fDcVGæDÝaÔ· `îêúêyýxÇa\ÔV}É4 â²6J¥ ÂeUÎ¥Òy„%Œùu>.áGBš–QæC’=i7ª¨A–ÞrxfdG„¼…~GJ¤‡„Â<€U‘GP×wù¤šË…ü½Œ€Ñ¥‹ˆ‰™9§û *Xs[}WÏT¾£Â‡Qó`Nb¹]©¤”(ß®ÁZÇ|Ъƒ‘C¸¢pÓú¼h¸Š£2$°Ñß~-G%Ü9‡±©2JëÐÞéÇ–¹ƒ0JÀÄÛ"rÔêG¢ÐÊMtwÎB;fc›RɈËY9)Ê\ ‡»«¸ß…Ç¤é§ ­"ƒ–@ˆ ÕHƒRHºn¶ ªîÉ‹p8§6ì«­â·TV¢¬ÞÁ¶WÉÙ©”$kÊØ6FÉvíêúA¼O`A`?Î ñ!ï`WkÃÜ~Ü´±¡ú²‘ãŸØó¿×èšÝmzæ³¾gò ™b>\;غ|­_ ©~)+ÿ—šrp›p'öbÉv>§h7N™Pš£ffÕçU2îÍùm œ¨"š}m’‘w‹SHÍ^Oi7ä±°*§¹Êw”À=o¿{îUîÙ_Ä=»hêìßD÷ÜL÷ÜH÷ÜB÷ì~ÜùÞðݳÑÏךCøÊSw_¯ïǃûQASòùvмƒ»‡~º+Ï_59(5¼éRþÄm¾’¿@–î/H¿½yéW’«ˆâpáNQ˜¸÷ÝùÍ‘:K u(ºó[xÌßõw–±rÍ(T;˜·¹,·ùÛŒ³Ú,^gô*؆óÇñ” Ç'œs'Þà÷1õ½Ç}º,(—gH‘[¼‹9öý¡1I§à~L ³tZ …ËÚ¢’¿[Î)J½’'ïXž¼ç‡ÆNM^¶è…ËûñCYohóc2÷x[$—…µ¼Dú’ð|¥-8„Wð«ê7úñ›~ü¾¢P;É:Z§«'Ñg³¨~.çisKð6ãIÄxAìf?§Y ž!ïâVÃ}x–{ŽÄ8ÆÏó"ö^Æ‹x/‰ ödTº˜Ìô|–ŠìýIÔ²÷göJTï/ø«¬…ìý1 ¨Þ›ì•ϳ*{ʉd¼Êz³½ã~YÖ(ñïøG²Ô’åÕ"d)Á?Õï¿ðo•Èeˆ#ó·Ûo÷ùí½~{<ÓüPK¹ µP PK¯TU; aQute/bnd/plugin/Central$1.class•ViwU~n›vÚt ±¡P `Á´ M«€Ú€JCÑBZÒÅB ¢Óä¶™v2f&)È⎠â‚kÝÅ?ðA9Ráè7=Çåñ½3Ié¨ÉIæ.ï{Ÿç]ïüóïïhÃ/JÖ)½›‡FôD(­eÆT=áºm*ZC›ƒo\É*!MÑÇB‡FÆyÜ–PÎÐj˜c!×Ô´ÅCqÃä!“[FÆŒs+ÔÕ—îãš­ ª–j&C¹T­†VBŒƒ 3Te 9ž$8ž`¨Ž:è[ÕBýܦýòݪ®ÚO2ÅY Õ8Èà‰ ^ :R†„ 1z@F%¼^”¢VFV1”„huTÕyO&5ÂÍeDã 5Q#®hƒŠ©Šy~Ñ#ìa¨/J£¡ø–e…ý -è²]nfðvžŒó´­º%aöÅêÝVS<¡É¬p6a³?Cã²ñdlÁCäú1nÖÆe1Wa+–°¡a9ò2htÁ„Wg†-K‚åíëŠ)v2\‰fl—œ—‘ý§,›§d´ DÑ32äèÕnðU#3UÝî·M®¤ÂÚÖÌQ´is¬#£j nVàQ†ÍE× Û7ô,7mºß6ü£ªÆÛý^´b§È”]„ˆ.<ŒÒLH<.ã ´S¢*é4×)‡·ÏuK(ܸH;O%,ŽØ-c(Å+lÃÝdXX¬B²O£CÂ^†Ú%l–L¥´XÒ(1:ñŒ„ý ïíiÏ¢K”«±_yî+@Óñb…`¢[B”Až».£Gè­ ÀÆ“J@,zCŸ„^†µÅÊDF?è,Ò;l˜VZé·PïjŒï„f·‰Â ŽH8ÌPWTHÆà#ѹŠÅë£2Žáy²ŸÈ(šµ Œ…Ø Ñd¼(b Ô{”¯ÀeX\õ"£øüJi—tѰØ1d¤q‚±ˆdLáÕ˜išD~m!0N£‹šFëTNT‘2¨VÌk„2²˜™™HìÕ4ò]`i}û”Œ—pš,Q­±"è"iïHŸ•q/SÛáw).Hý‚ø"gäÅÚ¯ÊxMD¨”8zñÎKx³ÞÎ)³NÆ[¢eW§ÝŒWâ&9TÂE†ME3œíŒUw(á-#)eB´€K¤¶/#(úãIŸƒ´ËÌïÞG–ð¾h0ì t-¶íž+IÓ˜W‡Ó(êqYœôÃÖ¥n†BAº|¬,!z5Cóÿ¸H¨‡h³MÖ¿KwÚ¨Sò+ç<¥LÚ©hº3ÝA—5§TÙ°Óeò1¯+_’ä³ýy~0iÏÛïðv{Žœï -B–‚Ü©Ç5Ã"‡vs;i$dü„Ÿi¹`w¤ð¾°cy·¬+ß™%ǵr—®s3¢)–Å-jÀ”ô+C‰Ï'^_xU ·¦úUA¦Ý4ÚCóRzV75ßÄʦàMøš¦Qó›#¸šþ½Ž‡ýxFB‘ıkõ:¬#‰õ4öЬ^Ên D+wšg°‘a ÝÁ¿±ù:šn£u¨æ‘iìp÷rx,‡pO]E&8ƒ} =Ûs8Ðî©óÜ¡žËaxWYç/ ®.›B/m¯QrˆOaãuŒæ0>…Ú¦ð9}f —^£™ÌáäÖÏNδ— Ѻò¼âˆy®usxý6ê‡nãÂTóvÍ»Ái¼7ÿtìžÄ*áSøÆyº9Gï'ÀòÄAøE-ºÉîz‡è¦[<†èE}äÚ~òYÝEÇèŸã8F1Fß j¯'è9‰q:YÃy¤p:.Ñó2 ÂÊâ;Ú¹BÍëœÆUœÁ¯8‹ë„|‹Æ" }"¤¸“‚}ŒOÈÿ2>¥ïgÄt'á|Ž) n˜°¿ ‘‡˜Á—øŠÒâ2I~MHå„P‡o O¤Á÷NԯКˆf ?¶ÈæÄœ>ÿPKƒ­^Ëy PK¯TU;aQute/bnd/plugin/Central.class•X `\e•þN2ÉM'·iš’ÒôEúN&“NK_ДB›¶4% éƒÆ'“›dÚÉL:3éßZPQ\_E«à*]ì6Ŧ Õº»®EYû@X‡®îê¢(*Ë®º+~ç¿7“™¼KÉÌÿqþóøÎwΟøÓc¬”YÈÌ ïìM;¡¶x{¨'ÖÛ‡êx:ŽYð J„‡C±p¼3tsÛ'’¶P(¸:‘ì 9‘X´'å„"‰¤J:©Do2â¤B »¼Çú.îr£©´w’ôH"y0ÕŽ8‚eã‰h\X'(S Z’ =|O¢)ÑîÄÓ^½éh,Ôîá²)»£ñpº7IáM¹³rÎ:ОvÏkØ1$¸®qÈ m½ÑX{hpb£ÊŽyF¤è,Ùj§× Ú%, §hIº+d4ô†+6ËsF(í+’ˆ§£iÁBcK"Õ u$ÃÝŽŠmî·Çœzw —ç¡¢…¢ñhz£`IÕÄ{ª÷2>[Fœžt4OY¨Ì }fFà«§~äc®rÌäWUïµp•`ú¶‡S]t¼ó1w ¨µ)ð[X,¨ZE£"½É$ѪOô»9ÞšŒ¦MÉdø˜úÉEîîe6¦¢DŸªm”a†5¨µÆÑ S-Õ6–#$°;tëÛ««ª' D=~¥ EÅX…5VÓ³“Újc-Ö *Âííc¥Æºªqµ}ƒæ§RתeëóhÊØRõ7ظÓ-lTeÆZéÇ Ølasl(þõŠbõØB,ÒƒÍD‘à ž8´fw:wÖc¶[¸QP9êl4`ÏI:jRr·“<Õ¨´W”Û8œˆê²²nK4¢è 'ÕUvOò.sP2¬kë”D¢q§¹·»ÍIî ·ÅxpYc"Ží '£úÛô¥»¢Ì§Ùc%EÑ)5m¬šÝŒ ÕàL1va…Ý‚©9$fã0Ióy`iÕHwT²ðÁ•cœTŒýx£…[ &Ôׯ›p‚‡{#ÌÊ RgÈ 7£ÍBX°hËmDÐ.(æI —sŽzTo<í¦ž-dWžÒ. ‚ù㯴ÕìîðAgS[*£stóA1t“6Ó‰mQ {é º£‰ŽÔùqê‰åܹ±ã©‰—´QŠé~´âZ o¯Ã8ÂXöôÒ׌ËIF÷Q94¼Ë53ÃÕ~Å[”¤ßÊ"Ÿ}Èž®dâˆbÛоÕ3ÑE“®  ÛÅyŘ&(žÌ-Q’[I®«Bï–7ŽR]ê ds#µúr¸qëa¦$Í*Æûp…»¡ËÜlãý¸×e¹=ÇzSßTÜ}6>ˆ¹©¾Å‰¥ èÚ R`P¼YÎx}xD‘Üí°Ìݹ>ÊXŽE0‹Wúñ|\cù A°jl&ÊâDŠ6ŽxŸ²ðIBvÒšÚ8‰O3 û›ÉEÀìÝMEÓ‰¤9ùA|ÖÂC9DF¥lü%>G7²Ô“‰ÈÌÁL3K¼q¦ôÃø+ §¼0wÖÆðErsÜtE¹•ÈËÍ·/ÛxÍp&ªÜe¹_Ëæi}8£­Õ ÐæV‰hµæa|ÅÆY#¬+œjæ¹~œÃ€…ó£En ÒaWÑÇpÁ¥Î-NG¸7Fuçç”êá;êŠð5:¥µ‹ÙRIåÚc¬•®š)=óë6þÇLt’Iõ_`ür™î~|ß´ð,!cÒd=dRÒÆ%mò¦õPjzw:9¸'i:§G³…=Ñeg'ßd"1˜C5—‘A¹}¿œdB6 Ÿ£Ãå3s+<3Ü«ò\ÉƹhøÏ6þÿêòÄ.Z31d:,]Îÿ€ÌŠÄ;\ñËyP1žÆ3þm‚\ÍdãYüðêˆÆÛ›meëGÁÃ䈊¦=¯ÅúÁâɬ÷ãGøw ?f=Íæx?ÑR:¾,±:¬«ÿÃÆêÜTm%ÂÚû»3×áçÚÇþ1aiêjÕcmä’AÕëÉÙIæÐK›Ô‰ "¬C™ä76~«™àO9i¯6ãUe¸ÿf s/€þ‡]Õ„—Àb¼†ßÛøƒÒmªª'ØYø&îÖš<ñ]’½ ï9c¦Eœx§òÚ«"¶äI>ݨ·Ìp4Îf·|´s¿..°¥PçóHÞ“Nwâ°3̬WeŠ-~]UèÎÓCŒwVaÚä1Ùv}#/%¶L“R·YôÆ©zUUõ­“nL7kh7ûå ™iIyÎë7ql¹ÒØáê ÇR~©9–ÌæmkTUCe[æ ±RI:á4­ß1~½<Ã÷ËU¶Tj!*tŽÒç´¹ ª /¤“:F=`:Ý“ c‡bx*N,ÌpYfK•Þ³³_'™ã°¥F³_Yss8å¨ãkmY.!M¬t8™NµFU¥òÑ(l¿._iËÕÚ Æœx'¥rhµ-kd-ËJª·-eÖª€†Q.§–\3,t9F5e¬g§%uchÁ–Ù×uo‹#f™°ã#×IštOË dná-{ûÄë'KÝRoËm‹ "±D\¯5²Í–e;uu±1œJïv:»É»)Õµa«çe‡-7I#IÊë¢L ek]Õ0Þîd¢“‹SM‰x¦#ìf[nÖðÙ)W‹ú×O‘²Û’]¹ùwŒtÒm˹…l“ЫRyŽ-n;ÂôêfP[yËŠÍŠc'Y$ûñ†ÎxB+Wé öë+ý²WÖëÇmy“ܦoOo×’>þE,ç¤:ñf[ þ¢tÂôKDKÚ_§åênK‡âÌ2ÝU,^$]™ÆÏsµ*­Ä]Y$LÙÐ-ìw{¨†Ó;VIôÆÚ+ã‰t¥VwY4^™y«¸¾Ò†i͈ñ0'ÇFy[–õ¦OXEòôu꺑QžŒVâYᾂKY*rÞפÜ×2ÜjVi#¦,‘¶¥W{¯Ü&¯†½ªË¾5˜W±År_æ‡Óm¾¼Å–·ÊÛX#çñûÆÀ9Ì \Àü}çPy ø¸ˆKÎbi æ,ªÎ#ð(VœÁŠÀ®ÎCà<®9‹ºš²ëúq}à+¨“lõ¡µÏ¨q?—RQ`Å—óð™Zƒ§›.àè¾à9Üñuž}ÏI§¸Ú¯¥[*º¶šº05XÆï*QË«hÃ5X X‰íXÍk¸o±f5F=3ÖìÁÛðvžPÂÕïÀ;yB}ð.¼›ÝD/½Ç9¶wâ.×V)1!ºhÙ{  ÏÀ×ÇǨòý Ë_4/à#ûµçð±œÈCí>Ã;EÁ)Ì©(ÀçE³ÞWáëÇ—Zúõ7:þ¨à×| ӛϣ¿ì«µý¸È¿¿ïã¹eØ‹}¼xægÙ¡¶‰ÐªçìVj¶Þ8ÎÑ;ùtm=Îwc?îA÷¢÷û7ººgìïÂãø–w·ñmëy¯ÿGžu!üúÄG)Sé‰ïrì{ÜcOèªïsdо<Ýg8’Ïïƒ| ?OŸø'õäžb$—$`Ÿ4Ö\2°!2š‡ûñSóÿ‹çñ³Gq({ó^ò044—õF“I÷ÓÄCß÷ÌÆG1#¬?Nç|‚8A<À«Ò ºíS„òƒÀCtÔƒ¸Ÿ5ª¤Ú³ ·_à—üµ„Éð2~E³VÐÀ_y|îÃøŸæoÔÚš~¼B/ÀïïS˜_ëúµ¦ -ûß<œ‚ßùk½X¿¨¡Ã–d =ŸLE?b4 ˜T[› áZ\•4ÿ‡ÿ§¤eÔI«áø^÷t½…3šÊªgÍ ®(ñ~øò²ù¡ÄÄî4£ÞGÕÍâŠÌ±æ0ò€X™#¶xGØžÔ¢©~3×O̞˒hg$Ú‰$iOâi®Q—´d SûÖ\\ëËßx «* æ]Ýé¼÷öKY¿Ì89Áó2k}aEá%”VÈ|aÀùóôñ|™Wî{èõïÊh\—?F¹@îø*ÙãkØŒ‹Ì©Ç¨×7²\Þ’Ñ´ÅsùϤ¦¯Ï›ÌÔsYÐ7 [óÐ4¸0h6×^‚][ Ò>Ž5 N¾þÔ)ö>g¤å‚ìÝ7CÞpNöÓ·öËíýÒv sÉtîT'§îSébfKthœ[ú {ÍÀN9ÈÒ¹Å|oeLô[ÇctŽŽë·ŽÇ2‰u›á§'Y‚@³Ÿ$Q<ÅõOsõ3tð³dø’"žcÅxž•â9ÖX^¤¬Qҳ؉Ÿ`~J‰?C7~N–}‰$ó âê%É/³¸õ¤! -ꛥ›3Bù«ŒÃó(uª!–|ʺRâ’àl7uÔdUÜ÷QÙ´Ï£˜ëYÕgÈ¡~I5Ö ²Ìbeä¦À…ùt>eµñia‘;¹æMÃü,<ýšéø ŸC¶ø-BøùåšðZà¯÷ïÇy»édæSíwˆ–É Eˤ/SÌ*y·1„ãCîðš„…šsòž,øh5Pøgà“ÁþLcúïéØ?°Uù£!ä´!f’r¡ág^>ØÌ¸˜/ÇTíÓ!gר3Jt³Då{›Ø„”M»¢zÜ­G™ž%”-yðK>½àËT îÏè0ËLÕ¡Lî!µUqrGTûY ªK MJA— šk‡²ßP1)Ö/E˜)S²,Ï>ÕµÜy¿±\©õe“í"÷T.ÕðO›)2¬Pdªk»“žØ<ù€ù¼O>h ,¨æ¿?PKqÅ¿I´þ"PKÛA‰;aQute/bnd/plugin/builder/PKPK¯TU;6aQute/bnd/plugin/builder/BndBuilder$DeltaVisitor.class•TÛnÓ@=Ó$u“˜$”k mMBœ´q¨@HxH RDqQxsœUºÅµ#_*¾…¨„xAâ"xàø(Ĭ›†"^Œ­õÎŒf朙õÏ_߸‰ „¶õ< …9rÇæÔ‰&Ò5G‘tÆÂ7»î¸{,Vv…ZCÈÐó5¤ ¥}ëÐ2˘ÏFûÂ5,r.ÏŸ˜Âvä4¦íùÂôEàE¾-³ÿb&žÎEX ÷dPiªƒD:pOº2|@¨×ECBºçE„3:4,åBQG%Bª®Š銧ÑÁHø¯¬‘#Ë϶œ¡åK¥ÏŒiE–°“ø¯ž1ïÌ¡ ­ú q—:ÆkBîá[[LC鹆BíßðÈ å0{¬Ìó¸‚5 W Fb<ëØ ä'"<±«>‰wâ5×±IÐ8ÅcéŽã÷s¨â††a3AçtÔa–ì=a¿éªF²žÅg«JÍÿh3ƒùózkɰø`^ÆÒ#©F£ø‡KÝ ‚Þw]á÷+~zPæaLñÊ€J%5“|#xe‘ckž¥[¬+K®Ñü ½ñ…±ÏYþ.²PÀ2õXÎáÎóN¸€‹ìu‰å4k—ã\ïØ’â}·ù «„'¼• Ûq”ò6x5f¶íÆ'è[_P9Báù-ýaÎbyƒñ4FÜ 3^Ŭá.W×E%fW>ƱSRMÆÓpŸc¶ã[qFí¸â·Ê'üPKJÔ9Ó7¨PK¯TU;9aQute/bnd/plugin/builder/BndBuilder$ResourceVisitor.class•RËNÛ@=7 qâ’ò*´@iyÈI*¦ˆvEÕE*!EE<”Ew¶3 CÆ6_ŦR  > …¸cR*ee4š™3gî=÷êÌü½¿½°5 %ÂŽw˜¥RøÑ@\„ÙPEÂÏT8Zt£A÷®É$Ît û*Qi¬-TÍ3ïÒ¡ Å&ƒÔB•ЉõPÈ T‰A¬¥Ð£ÜDìɪé©JÖ?6zÚØå„/*RéW‚ëÊhõ •½x ë L:°P³QFÃAMBÙ5žŠä÷ìÜ—úÄóCI˜îÅö=­ÌyDVL³„ÏE ;Æ­O\Hh¹½"í¶~ØXÀk ‹„µ%¼Á¡œÊà'ÓϨÄÔþ]6‹eìã}SÆÆÿN¶ÌÏ 8ûQ$õ^è%‰dßc–`•Ÿ¤ÌsÔlš—á_YâY‡Íì FŸøl»Ýù§}ƒ©_yÌK^«¸˜æÕɱÌòN˜ÃüH¡û¤ðNç¯*WO v~Óæºr•ùÇÈ‘ŠAËXaÞæ9«x—³ÄcïPKÓÒŒ JPK¯TU;)aQute/bnd/plugin/builder/BndBuilder.class•W‰ÇþF‡¥È &86p‡/¬¤,Jƒ ´JlLm ÉJË‹×+U»¢›¶¡÷‘6mCzÑ#uïÒ ÍÕh¡÷_Ñ¿¢í7£Ã6’øé÷ÓÎÎÌ{ï{ï}ïÍìÍÿ^yÀÃøw>ÍyOFN*šµóiˉ&ò–’¹h¯“ê- ClÍäÒQ™´­¬+£ÉLNFsÒÍäsIéFãN2''¥ã™öþ\æ„LzEIHïáxÿî=COÆw 4öŸ0OšQÛtÒу^ÎrÒ1%}ÇõLÇ6í¼ ãæ„õt·ÖM`ݳHêv =Au‡Föï èØ{jRAHØrR n‡åXÞN[û°@ /“’øq¯%X*ÐÐo9r0?™¹C&EÀLÒ´‡Íœ¥Þ‹“oÜr6ô×*ús™J ˜¹ …v{[ÿbaÛkÙ2V“x¼}¸-XÂJÖ;i0ð>¬0˜Ó“%Ó¶U*n_MA2ÆZФt]3-ëñ aÀº;‹X âJo—G‹ †K`S sfö%_bíÃal»ò¤ÌYÞie¸])ìhª¢!®ºÈ/»œÃº6VÂÌ;ž5)£}|Ùs*)³ž•q˜Õ1K%wÝ$ â$Ód1°ëk ¢@P“C Ù/ Ï{–0³±*òEˆqR7Meî@†ÄÍäbíG5V,6Z‹”=s#`ò lG¹8–·íÞîj\\Ðð°R³ÃÀÁú‰¤¥W´¥ò¹8J ”‚Ç ìB/ÓJ»¥í™C‹—DIzqCš֩-í6°{–Y³½¨èøÈâç뺫‘E–C3—vUC™ŸiUG…Íw¡™ìI¢UMj!è sr\&'z¢öÚœŽ©NsC"³k‘0p‡é3:hN²‚–“åÆFEuäFp4„Q¦æö]>†cD-”{ÄòÆVTkZ£*¿Ox ÈF–ºœêÊ5tXEæ$dŒËÊŠ&¾+éY'M†ÝÀÒ²ï–cfÞ&Ù×й…%b*v;T«>a`6' «3¤ÐcÖU-•rÖMoœdCÈÐÔâ; |¤Q—Ù«ײRØ­LT{‡“!ä™û ÄÙL6ŸšIÝ HÍ Ù›wRêèøNÑevìò kµ-æqMÅ;X)‚¶•ˆfÜ´-•Ýš0ç…?„_Ü7kdÎ1.Ñ‹G{m€%.7/D=Ÿ|˜¹î¯bTøý®7.IÓükâéléªØVEfG%vÆTϸ¬ZÚ […p£¼ß„pU`K —Îõ%߇-W\Á[ŠÍoQ•j®rmUÇÀ»øCïñ“ †7ðGüIUBRMà¡ÚŽ›"À˜rî:¥jqNneÏ®á­zü·B¸ÉFWóá¨ðþUà‘»¸ Ìbeƒ<¨ç ·a\·Jo¼qÇ‘¹>Ût]ÉŠ5æÊsÿmÞófËRá7˜$¢Žo!ýÆJDæ¼×ó)Ô§ ÿ8åSð츄eô–Fþ×éI÷é½˱B¯³¯…§i²ŽÏt6ÖÏ Ù‡ž`K°qM× ZýàhãŠÀ ÚüXí;``'g:Wë‰){‚´Þ‡°›‹V×.°€¥µíX‹ÞÖcØÈ+ãìÄ#xL#ÚY°ZD¤FQêz´–k>=êâ©_6q Öv¼Ÿz‚o¥.WÀ1{®öæUîòÙ½jYÝyÔwlžÆ¶)<ÐÑ1Ø4>Ôh Ü(OG:Zõ‰7Ê1[£Cüí÷3¼ƒhÆ>¬Æ~lÀ±ÖÈ·,”‘wãÃÄ&ôè#ˆkäÝxœZü”_NMDjÛWˆ¹x‡”Ž[ï¡å®wÎ`?;îð4>z—;ßEË@G×%¿Œ—xÿa6ØyfÀ×Ëp úôþ=?…Õ=Ž®«83Òø©Kx©%0ÏNã‹Ð%|…^žÁ7zSXÞÑÕÂD~[°œGô²zýÀkÿû7¾¾ÀÆà¼SX5X´öSZÛ<ÇØº½©íÃÏ™¾ßà"Ÿ~Òã¤xÙ[Qòø(W‘$Ç™Äc”x ;`R*Ákz’»RÜ•äÊïMi<ËçYXx'ð:ŸaãMLâ:oG7ø¼ÉËJÉ&Ý­rJná—øƒ½ohZ)lÏà×Äå§fÎ^`JÆ™î‹ÔÀËåÑ›Dû[®úñ;êi¢da×ty—ùÔ¥³X@ù®(ÚÀòûgp)ÀÒ *#Â2-UÆR½-Ï™“ŸÒÀ›4[ÊÀŠUPßiì-šjRt¾Š+#,øßÏàß‹÷R×|‹ÏqæyêqŽÅ¦²Å&ÍTe‘ßI”»ŠkÊÜüÙ‡Ù&Ñê^¢©³Z}kaû‡ý…)C>þþ¦¥ÿŽðÙÈÑ5®ÿ“ã+|þ ø?PK”#ŠPK¯TU;(aQute/bnd/plugin/builder/BndNature.class•UÛVÛVÝÇË 47—8m!Û (-·$N1¡-IdéÔU–-¹’Ü–>÷'úا¾6k¥iݵJßûý€~D/#ɱ¹­`¤sÑÌœ½÷Ìýùïo{&°#!Â0¨mÔ=®–,C­UêeÓRKu³bpG]²Œ‚æÕ.Ad8÷\ûJS+šUV”žsÝ“ÐͲ²ÊõŠYs¹ªÛWîÚuG箚[wlß0 Â-,n>z¸ú,·ÂПo‡+zŽi•çÎ,Û–ëi–·¥Uê¼1†K%óÛl€0K³-H R-ŒÎ0œï…ïž7-Ó[`’©-qÙ6¸ ý zq–álÞ´x¡^-qgS+U¸Òֵʖæ˜þº¹)z_˜.õüÉÂÑ¡Qݶ>7Ëdyõ×<“XJx›aä(îºå™U®.Ó¢eà ÎÄpïJx‡a¨Ê Þà Co™{+ÜÕ3ˆÆ0™Lu¢Ø>Ÿ¹®aDÂ0Cötž ®#É †%_bë Édêñ!,ÛÕªftn £'nš+C6$¼¦¢ UI÷óDøH¹õ`œáò‘òj:ʘĔ„ê>ôT0ª&þe]«P!\Hæ_¹Ô¶Œ[˜•pû`€]×ãUs˜§ÊÐGÛÕíÚ.Cú˜¹c¶r©-? >À‡TPÿºÉáú iݯ钂eÐ5ìuIu€LS©ðÌ; îâ¥Ò=ÊT²³LúA®â¾‚Ï=P“O“§-Écì›—Ç·.“³»fÓ}·¹à¶äË0~Úczô¥z¤3® ̤'Çk'ˆÜ%ýu®ÞܲÚqboõ™ÚÀ' >Å6%žJ|ýuÿ;)ñí3ök.»û‚$;J@ ¥\ vï˜~7ìm5»¬_8Ôr¨¿ÒÓ…âÐCó(ýn"é¡Fó.Ú£ŽKïs´Ridþnúô½Lߢww°Åyz+¡.à"ôW ç.Ó\¤U<ó}š~‰ ùцք…q)“˜l E-]}…‰ï!¾øN`‰ÌÞÿýÙw~GºÆ„ÌÞ¯¸Inï3ÌŠq±_m`1‚±±=ш‹ÅѱV#ðe ä´áÎ#$™àôa€€^ÁÔþ0NªÜ 1„]¥‡Æ6}ÕèkÉ€â&ðMŠ2t¬¡@äú𰜒Àù kEÚ‚h›xȰuŒ(QT_”ÇéWøøˆ(‹‡DÉ’I1+f„¸($H‹LB܉‹$T _›¸hÐ’ï¶3ArÇ üÁž$"7ˆä%xš ÏP˺‰UïÑj·‰Ì$É0П a¶èoÐ<¤¿Eÿn“¾JRúô}štŽ”¥ç§Ce´rl=ÁgM粎øÖéÑŸ1Ц$»käS"\ ­šü™_ÑþÁOŸgÿPKï–ëI] PK¯TU;1aQute/bnd/plugin/builder/ToggleNatureAction.class•UßSWþn²!ÖªØàoD›’UkmK¨VA$‚ŠVÙ$×°6éîF¥}éL;Ӈδ¾Ò·>ùìL«¥3eô¥ý£j¿Ý $VœLöþ8ç|÷œïœsï?ÿþ¹ àà èWêŽÔ fI«UêeÃÔ u£R’–vµZ.WdNwê–ÜQ1Ù±_ËÎí-µlsrZè¯]1Ô.ÓØž¨ò!` Æóaù‚¼Ñb„‹ ‹²áLG©Ùµãïê[ÚôØ »[P! þ3¬nS>È­©Ff<Ì1ÃëäÍKÊÂa^{AþCüܧƒ³;çÓÆoWGáî&žA}ÂIïñÛæmîàP}ìÄ.޼—°Û7®vˆ{s‰ßÐõ=˸îΞ£gï L<ÆÙÁìȉ!%ù}ËP“ÏÑ7¤ 0€ƒ8Åw)ͳ,1Ž—)™ÂQä©y {Y}½¸ƒ¸Ó)ßïFLîì$>d@{0NÙGŒë0¿§ñ1Ïí§ì| C 6|­4µ†ñYƒÊq®ƒ.w‰ÁßÑõŠËG#ÄܳùZëg·5ÎvgnŠ\Ô3ŒÂG=ëÅN²_OÎp˜Xë`Ÿã-î«×HØ4mÛ({4°‚óLcv‚§™Lg6Ù­œ|ŠÜ2†’«Jé/L…’Áh(Ø­ü«*sÑP·’\íVJJ‰[ƒÑÐ f+¸Ä“ïáÊ}ù”s.€B%˜\¥v”’ÎìÌ`TÙ`ôÊÄ¢<~B©úÑýX§ÑÅÈu†«KŒ9Ë4N0ÎY˜ÄÇ1¦:‡+Ę&B:¿ ¼³ÜÀ7˜Åw¸IÔ[ø·=ÞÆ‰HÖy{䥘͈P‚ôNÿwQ&¿»ˆ=ƒGЍe¦reáÎÚÜó2SùPKº0m/=ý PKÛA‰;aQute/bnd/plugin/editors/PKPKYk;5aQute/bnd/plugin/editors/BndCompletionProcessor.classµVÝSUÿ]ØdCº”JK)ý´Ò¤mºÅÚ/‚ˆTVÃG RüèMr“,.»qwCÑgúà“ÓgúøZ}u|öRÏݤ’eD'³÷î=ß¿sÎ=›ßÿøéWcø\EƒÎï×}¡ì’^³êÓÖEÉô×Ó§íRÆY«YÂ7{ÑuŠÂóW…Âpl•¯sÝâvE_(¬Š¢¯"Ê0á¸]-³æ }µÌ‹B÷ņ¯Û¶Ï=Ïô|ÝÈ4ŽSÁ±e—!:aÚ¦—¡;‘Ì3(§$âèÆ *b }YÓóõµ‚p—xÁ ýY§È­ ,>Á#pJc¾Bh YÌ¡ˆåf’~å ¹T›É ÒNñ°çm™ ¼7¸-¯]-¯]M¯ &V›Ö®“GÉëQ~Ž,wK=h7znW¹zZåúìàFB XXk¸Òl–N<£»4»Zš6nü£æåPM'8ÕþPK¢6qÙ PK¯TU;1aQute/bnd/plugin/editors/BndHover$DocString.class•RmOÔ@~öÞz”‡r"z¨Ç›ÞPQ|Řȩ±ÉáÅœ!ñc¯]Ž’²ÅvKøQ|ÐÄHÐD¿û£Œ³½z ÑÒìîtvžgž™ÙŸ¿¾~°ŒU †ûm,¹Ù®¹ëÇ=O˜ÜõdFæšp_{<œ}8z¢§!Ç0ºmïÙ¦o‹žÙînsGj(0Œ{›[vØáb.Îu‡aº„=“;¾·qs{Óv¸)ù¾4-"w¸« …§žðä3ÂÔ ¹fàrY” Ag(·<ÁßÄ;]¾³»>‘_lŽíoØ¡§þSgNnyÃbë•©ìé~. _·Í!0\2 ¡8ŒË¸¢a‚¡vV ®bŒAëq©š a’aæ¸1–pù~;–í͵ nôrßá»Ò „Ž*JnÐ4þ“bÍvU©*x€bÈ{Š‘Y´¸*ùpU²ÏEOn% ·T· Ô1Ç0D´Ò»á(îs²nYÖ¿‡½ª(nXÄQC¥~28íµŽ;¸«aù¯·Ô¿3ÐÀ<I;$x– —AïqèðWžšnéÏð––Á°„àaÓ·£ˆG3L9w*p0yÔhÒYZyZP§=G‹žy†É2éTwùùCŸÈÈ`„öBâ,¢L»ÑÀ(.ÐIc)¸KÑY:+óŸQ©a<ƒƒõo¨¾?ĵ J§¸ë)çH["Ïq–îZŸr+«†)B”{3„d˜Å\šo%««|G¸ÉppJqå„b} ˜úž2¬S>•±ÜgX`¨N~ùñÍÄ qå¸2î%┵BV†¾û ò& •¼Gx‚âoPK{ÂP2q‰PK¯TU;'aQute/bnd/plugin/editors/BndHover.classVksU~N³É–í¶„Òµ-÷´%¨Ú¢HK¡°­­àu›l“-i“-)ÞQT¼¡Rñ‚FÇ>ÈôC :ãøIgü!~ò7ˆÏÙMÛ)´ÔÉ잳缷ó¼Ïûžüõï/¿¸WTT l6Ÿr¬èX6Íg¦Rv6j%m'W(F{²ÉþÜi« BN˜§ÍhÆÌ¦¢ÇÆ&¬„£"@å\!µ;_´¢ãfŠ:Ö´ óí* öÚYÛyTÀnPzsIKƒ5:TT ¬ŽÛYëèÔä˜U6Ç2–@}<—03#fÁ–ß•EÅIÛE­ñãíÐS–ç>–Ï <Žß-ÐÛ*QmY™A+eç²Ý­ñ †œ‚Mu×`-  [Vv cÖ Ô0¶¹ÄÔ¤•u¶…[—õ;'E7!lR±Q éî1êhÄ=«èâØøxÑr\ÔcR¿YGËÜ^Üʦœt ¶`›Š­-+E c;vÐVJZ\ŽÅ–ÀbÂhSÑ*`,¤(meòÑ¡3YÇœÖÑŽ]Ìc_ü¸Ìºk`ʱ3Ñ3Ï#và^QÚEÒó};ÂñÛ ¸(•%¬¿=´ž);“´ îGÆ(;u<ˆ‡T 3)Ð^â@R¾KG7ö’Äf>oe) ß)x§nÅcw5Èû€Öבêh‘žÓ±_zÖè¹oÚœÌg,é¥Wǹ\íä<} ѯâТºó¶tÄd7‡Žèˆc€È– f^`ç.•/éø˜<ÞñÛNµ¼‹O¥bP`íÂnßtÂÊ;¤æÌÓÜþ?UÇ‚HËJõL.®T†¤a2—`Å­\7=e‘ åŽÓÁ¢KKò%¾$_)RU-‹ƒlJt( ØŸŒø€P¤n®ÍðÐÿjF±åÛBY¾–Žq¤<&÷¦Mb®„c­½’¶Ž œbFìâh®œÛím=)›5d‘WÁæX·÷€é¤u¼Jú&mÆê—¥“²lSÞº9­¢$pÏ2áyÑi83²Á¿X12¢áe¼ªâöe4{̤lü·yu¼æÞyâî 9fâÔp Ì^®ÒßDŒŠŽY½Î+Ñå[ÊËàmœWñÎ"FK´Ì„#{ö»Ä»x˜›±$YeÛVá¸ëO†¢Wë‡:.ÈDÔÜïÈÚúXÖÖ'Äü. b†&´j\âГ”줓æœà ­ å¦ ë -¯ÀÚ¹®Cšã-Ëf­BoÆ,­¢Šo튗ã6‡¯‚ù96“1>>~þ3ðsäÍÌ÷*~E9 ¹ÚvÚOœTAç;à.ª¨å[÷P‡ÕÙ³°ÆS%­æÚ¥]àbû,êŽFvÍbƒßM³ØìC—ò3v†”YDªð;Â]þÿOøÅõ_qÿ‰ØÝBþ2ö”ñðh(Pÿˆ7Ê¥}Þ´Œž.5¤ºJ!µŒ¾`Ó¨m ©Á¦2Ë­ë]JÅZH)ã(®‹ëòOÀY<Ž=H»ã^wGï#0øn‚‚fJnF=+gÇflãuµº;¨Æ£heWn£^;žF Üÿe9¤Â«ØM«{ð&:1ƒ‡]ОvѽTMΆ0ìy OÐs=žÇ(žd”Íà œd”zŠº~úìÅ3x–‰H0Â縫Ò~Ï䜠F¢’„v~«´[ª$ ±Siìô_EàœrËP¾Â†¶ˆAð“U(#}ùÖ?rÇ/ dïQÏ}ÿÂþßçám~CIÞÄdgÀg(7Qì$ƧOЏi".¡~‰0K:M²‡¼\µ‡apu4’eg$éÛÆ–¡Û†SׯVo 3P0@ÈìJWBÇ1ª¶ ›–ŸfšrÄÒi9àtFŽwþñ“‚ʧÏðn–¿ã¼ç w0”Ÿ¼ƒtþ;d¾‰€ùŒØOü„C¼“Š Ça<ÉŸÇHûª?ù¢¯"ÿ-†¶ñBã„&NÊñÙ¯± ÅßcrÓ?âÜ6^mâ…é&.IàÛ1|‰‰Âèé]`K1,±h*ÑÄZ•/b4Z¸ûÕßÛ»žÇ¿fÃîá¯Ügã~áÁý+&ñgyÅCnáß°Àë2~ÇMÆÔðGäP¾etÛ¡ Vqï²K#ŒÜ`dŒ×ÞÃûì^D¼·ð!¯ ž¾ß#ƒDQXø÷PKÑ{–ƒ¶­PKn»k;1aQute/bnd/plugin/editors/BndMultiPageEditor.classX |”õ}ÿþòö$— ¨H.„TT@L@N.€$ FTxr÷ÓP&ØœMOÛfÄ6ôˆ7Hô`pÛ1h¤̘å¸fÊ´¥®ÑŸ4WIJ¹“n䤕0]'Ò£Úe¾­‚¦XŽUÓN¸æ)7ÒÃß0ò”K§Ü|ÂlcxЊ;‘Ý$P„ŠWpåÂøˆã¦‡"ÝîXÒL(ÙÊ’v+e¹ÛÅMͽäíH'ÌŠQ£cªB¨Å2 Ká€Lãáð¡c9ê:=>”¶O8ÃFœ 475Ç š!m«ÄJ\¦a• ñ¢t\Ž+uF"1_d®m*¨;?[›dQÌJ™ûF†úM»Çnu,7’½†m©ïÁÃwÐr­±KÈJ¢_·MÃ5gâ¬a­`m!!3´!4¢¦„VGB!ÞµèXVÁBbïESÃ#*krÐg¦E³ÚsDÇF–4©¬´ÏIÏèL´Ø á*\£ájúsq9®c ®”ÓöËU¨.¡ÕÇQ#’d\˜·¶•ðL½^ÇV¿JÇt•©=^Æ/mŠÎ%oîU ÛtlÇúFáÝ–KÙyQ)Õo¦âƒÊ?EÆ\܉ 7 V¿#±ŽNìòíï4“IòäèÈnI[9n"Ù.ÛNÛõ^.Ðäú”ÉLÔ+xêÍ ÔQìÕp³ >Ç ¥<Ê Þu*n»VšÕC— BYáî³²!oé¤\kÈŒD}*º·h8SuDZÂ" ËH¦œˆgh§÷EÇAtSOzØLyƒMïàíÜèäyòŽ–6GÙj­TÂ<%Þ £¹&7–spQÙâW›J˜Mnˉi¶¹é¡á´Ã˜ªÜ¹]ǸÓohl±†åõ”ÜÊËOXûpTõRƒh~|f¢Í½âylKcé7r“m%bÞmý¨QòéÀ cÁjð_±ûϯË' ã¸*ú*G Ø–rít’¸kÊ›£–yÒ´ƒñÖë} !‰£êcXÇ]°ƒ²ö›e¡²ð'¤êj® å!Œâ”†“‚Ë ²èÃi¶kããôZŽåwæ¦Û”§£¸GÇ½Š¤Š${L#aÚ†w³A€»ÓpîÃ{Uϰ‰4E£·RÐñ>¼_° ƒ½¢Ô6e¥öþþãf\!®áA†¦ #éäÈP*„³xH©{¸`(}´¢Ê”³ø ŽáQ"MSY wP9Ïwåø0Çû^sL=¦ã£xœ>Èïš³,Í4Ír|œUÖk$GÌr<)°Yé¶k™l(ñétÍ·fÌÍi®É鼜C>'¯U¥º3™Äº‰]TÊeø|™©…qóÉȵ ‹ëȦY}b³†_™¿w[Éät-~5~-휭+„ó8ª2ü9 °P}ýŒŽÏªÜTóL CeO9>Ç0°MåjàfŒ˜Ý⮚õÍQÅþ’ŽµÔ &tÜêßMêxUÔ”°†ËTÛ×t|Q­T«ls(=jæ_Ô–ø²ŽÏ+æ²DºÛe6lÈ·hM÷o¦Ð·.§+òö¿ýŽŽßÅWü‰µ+X‹¯`ÞZ=*ñ{ø ¿/X1?•ŽWðe:6ä«ãvt ¶±Œ|Ÿv:JÙëø:ªÔÝ5ê£Eþ ßÄ·üz Ö¬úù¦`)âB¹ª_ ÓoTâ/ñ×þJ°²€0£¶%µÐì3†¼Aõw:^UµíoE¶÷\ û{¯)Zµö¤ÓÉkØÏCÁ÷t¼®Xj¶™)·Ótâ¶åÍL ÿÓ•L83ËJ¼7u|oùÖ¨×óí3+·¢bˆiø§œµ&­ŽãŸÙ†¨€¡RíTÍÓÂ:BªùWèOrZï<äì•–iqÞ ¥ Èb‹Y=‡(jÃÓ‚/Ê\åeÚMwö ¯û>»ødA-ýŸŽŸ© ¦ÑθkzµâŽT¤‰pCαÖJ0õ;wéø© :.~ÝŸ× ö‚¡Àð†‹áàŒRÐg oDz e=§\èðºhjÔHZ‰zdk}»p}¿YŸnÖ¢«Aû8kOêR&mògÛ|µÚíµJ3ûˆµÈrü~±3™LŸ4Þ‘šKfh˜!ð[§R±T—%x”Á’åºÔ©æYá¤muRNp²ê)ó¤ YÔ_oÙ³Z/e^})'Ù]£¬gÂS)—K½&ìè‘KdÖeµ¬ñëºglØô|І¤AÖjÒ˜gkš°&œOº¬“&¿j;ÍcÏ¿j™û ØÚ4 ó0} gé†M!i–õ ¤ðøk4]Ò9üÿ¨‚ ¢ËFáºPa8c©ø®S&·öeÙËÔÁ‘TÊ[ÐT‚–šŠU°é’µñ -×è²EØÂk’éøÈ_°_Œ²€Yi‘¹gYuxô]fç0(‰h©”­Ò® ó¸åxuÙ&Û™úYv¶ä[vó,mÞ?#²­Rn5Ù™ÓþóÑêÒ¡&X1ÕjÂCv§oĵ’ÁÊÚ“>a¦¬Ó¦].6ÁfL°6߉'ÏM4ú”.cªr œ6•5wër÷+•›Läúþ[œ_0þ‘ªz®0æƒ;¢\ìbóæïÌ\ FBm,O¶)ª„ß,ƒß¾bùÀ'™‚¼Üˆ³»8 ‡.­5Îé+óÿ>êö:—¿þ-›+kƒ2.šâá¡#i8Žé`5—–bþ•¢Eê¼ðZw­„î]yJâu1顊Ÿ‹ùí>^†'P}K“XQ„<úzõœr&Êm&˜š@iÖàJ¨ i¿ìé¶…§ÐØ7u/¡)~‘ãàÿ íá•êÛ86ãºóXãÃöIÜÀXï––qì¹€}‡^ðÄ7`¢k<‡6Ñ‘«°WóÍ54i Ÿ\‹ëxmÇõžaõž±ÛÖÓͼ‹Òš°½8äɽuÚXÙA 4>yr }}4äpñŽÄ¦ÐOÃ]-ëÇa†i“µ} ɾ–Åå˜@jkI¸®dé—àЇ·#ÁõnuÂ}}šVR2÷Œãþ)œíSO)÷[KëJ«ãx¤®´úÆñ‘YïÊêÊ¿©^–UŒ/×U?A€f¢°ÛCw'#p#jÑØÅç7¡{è~Ûq3iöÒ¹.Ã> a?\Ü‚38ˆ‡Ðˆ'…iïtÒ<‚§ð BR‹ðIü¢§qÌ®˜ò“ø%/ªÇý9<Í ;ƒeøïÊÈýL&òÏx¹ìÈóÓóW0§pž8Ç_ ÏÒûg‹Çñ¼1]þY.û1?Lo§iwÐå;™‚GsƒQï§Ëqϰ¯6ãÎæŒ;aºó¥]KI¾;Àof náŸÊ™QYæ=8ž•ãˆ-Áoe;xUïÐËù7ο 3Bª={Òü¦Þ»(Èθ (êÀŸ[‚~ùMµø¥Ü<Ír¾›ü÷ä)AQGô@Z'¹T êa‚ûÛ-“øjv9‡¼wgXI÷{r–ú´™RÖñ5ü¡çà×3ö£~EµÆ“£È?„‹yýcæÝŸª»?›Ñ³”éD}fé\è,Ã*zöçžÎoâ[Îs¤Q8¶‡[&ðm¥á/”†¿UwßQwßmù2Þx—·¼‚7ºÖOâ“ø`_¸uÿâÑææÒGhÓcì Eçó¡g>=6æÌL.µgÐhÇ¿áßiQ#mþü'¥m"‚ÿ…ÿöšíOñ?µ{Ì)„þ×þÞÎ á9ð4ï?•⌲ER"¥ uvB‘”{y'¬n¥â%(uëé÷SX8…h_TLHåËá–õ²`FÙ ¯4Ÿe™?Ç8?O…Ï1+?Ã~øÙ¬.Y—Q\'‹¤Ê˧:YL™R-5oëƒt/*y>§P^ÌÊÄ¢éBQ§²€s••R»²ô´ð¸,Ë-•)¢òÂúEúò<ȬðÚ¸ÈJYï%—¢ZÑ2)—qðãô’+§¤¹ÃQ"rÑÿ u|•n;KÇŠŒŽ²Y®R®¨Ãd0 6Ò>åƒÞÌ’«ýËu“r}&e‡ 6%}-5²{BötMÉÞ¾ éÚwzëúqÙ7.·âõ]O½ý“Ö rë¹sJ¤8¶µ¤xKéy\QWÒZ[:.¯ÈñqIÖ•ÔHú‚ÜÅÛJ¥¶´u\N>ýö«ªKrâÈéq¹wÆ£ƒhÀ« ñwèÝ«¨áu9¯ux —ã»ôð5&í÷Ø¿_ÇF¼Áñø:ÛÌ›œßǼEô~€~È6õ›Êp?öPÙîû R‡´Ü'ïö .ï‘÷R{+˹ŸˆÀuò€¼u£IÞÏ•V•ËYy0ˆPc8¥ ¶ÏåäÎ*O A‘|Àû|Höú“H³üPKx?dÈ‚© PK¯TU;>aQute/bnd/plugin/editors/BndMultiPageEditorContributor$1.classRMoÓ@}Û„æ§ Ê7 %@‰m.P„¡•*%¥*œ7öÖÙj³ymÊßâ€@øü(Ĭ“CˆC,Ù;óvæÍÌÿüõý€°#Þe©äcñ™Îbe¸ŒTjÇ_›héTŠXîæXÏš4QãŒÌV§„"æMb.C­fNò“cJ.ÂTYÃ_åÃj:Q®µM…úËUêÇ eTú’¡Û^–äሡس‘¬€á|€sX­¢€Z€Ö m°ÞWFdÓ±LŽÄXK†F߆BD¢¼¿‹~$†çKöÒêÐH…$3e\f¨å$MÊh¾[Ɔ¡˜Î´lÎ%lî~’!…DU\î3<ø[õH mcÇÒ9*ú&wÜÄ-ËΤÙ7Ç6™ŠùRöÚý³î4å§*Šeêøp"µîöOÄGÁµ01Rß&þâ«m–„rOy]¶þ;öO@ÍìšP[G™NlTÂÃÓå” ÐòË«…‰©œËE‹ ö‘IO ç¤Ã6-¼@?<«×ýÖÉZ¡·„2á²vÈ÷HõÑã/ôùŠàs³î±ü†QÞêdd{ô9~k –gTÃßUXãRcã®þI2¢‚ÎT$ÜÎ#7Ѥ³ˆ;¸‹{yËãèù PK!L7 ë²PK¯TU;<aQute/bnd/plugin/editors/BndMultiPageEditorContributor.classWÛwÅþÆV²¶¼NCCƒcÜÈ’‘6N‚€mÙŽ°d›H1˜šµ´±7È»bµJm¡…–^ ÜÊ¥P(ôFJ[. ‰ƒ“–Óö¡ôðÀáðÆKŸÊ¿ÑÓov7òF¾`rr¢ù]g¾ßo¾ü¿ Ø…Ô ìÑî¬8z|Ê,ÄKÅÊ´aÆõ‚áXv9Þg2•¢cŒiÓú€+ë·LÇ6¦** ìµì鸞/¥²¯ñ’f;ñŸÞ¼cXfŸthÑ(>ÑM`sº&ZjA›PËÚl©¨{ᮿÌúØQ-¯Ç5W÷Lè²öÃ4œýõ‘®qP¿UÐèG³ŠF„ÃøšŠ„šó¶®9~ð2åiÃÔG*³SºÓ¦Šº@kÚÊkÅqÍ6ä܆œƒÖûÒW†!—Ø8­;—¶t$R‹€£Ÿt¼HñTŽc/B"}L;®Å‹š9Ï2–9èZ”GÚp­‚knXUðu¶G䊲|/¤ÀöUîJ Á ’JJ¸ee•ÊXÇu §À–E€[¦k¼‘þ†Š5X+k}ƒŠmØÎ(UÈÙ”¬^{¤kQ˜}¢]ˆ)ˆ l­±òV[öûmSË~PE7vp÷Éô@n@`[mì%½af‰«¸»Öp©‚ÀÕ\Ø"ñ-ô(Ø-°{U°ziØteG3²\Þ‰Æ^YßM¸ 7 \»<*nÁ­‰þPÑšÒŠžê€fŠ: ¼w‰ùò‘åéÂm*n—x…$GåÞú¤`‹T%U ¸ªƒžjH \UJÅRUß('5i9w5#*F]§þѱ ©ºS \UVENªÖŒõfsR7.%®înRβlý¹ÉÞtZ–b×àˆŠo»qS#I©ºO ¨šBAAž}VƒŸQÐã©ä@Moè2FCßèèp¦÷à°DZÅŒd –J©Pe ¯1C%—ÃZ@¶˜$­ª`–dte\´uWEX’K‰È•RšwêÈ Àå7g]ÞîðÖÆqœTp‚‡÷Kø[ŃxH@a×Énذ7à»lÍËrt8–UìpŒ’Lö°ŠGdœu2å9£$Ã…ñ<¦àQkj+jÎQËž=Ä&û!~Ä‹‡Çñ.˾J7ó3×-AU5YöÇø©‚Ÿ,Ž»`¤âgx‚w ãfg4[/¤f %‹Û±Dè E¢?¸*•ší»#;™ëÍOæ²ì£§ñ¬‚gØ+¹«x¿ µJz‘‚¤^ÎÛFÉ%éÛWIó¶^¶*65ëT¼ˆ—˜¡¼D†xä«„“÷uKþR_é9+£›èRA.‹4Éh&I¿ª¡ìˬÆ xUöZ¹c›T„ñ ^—Gá¡ü†—´V R²v~‡?(ø}Í%ºì:T¼‰Sl¾’­—t³³†l«ÂóÕûÕ(³zÀäíèè³Üž\É[*þ„?“¹>®h%lª¤Ë5ë­­öf^LRѬ ÿú`Eäi"íìX)±o¬ËÎe²:YOc%Â8æ&œÃys‘Õ¦˜|°L»­ˆç9¼Å[ýVämá6ï !ß‚+òâNYnvYÊ4u»¿¨•Ëzד)ëù¯ã?>RÜi“ßµÔð‰Êß&Îü ~£ç¡òÿºÓ®éUü]çØŒ®£c;Z9S=c¬ÇÕü†ä=ï¡—´o‰}EœB8Ö=Mux¯o­ë»ÕÓáÙúqäh3³wÔŽ-ô e¹›`lñ9·¢î‹èYtÆÞDèt4vÑ9lÍtÿ ŸÆþ¶—™ñïh;Å¿FºÏ 2‡ÑgðÍ9ì™Ç¾zP¶ß—õdý¾l0 ;àˆ²Œ/ Èú²CÙ]¾ìž€ì^_6i¾L~«âyX(À>¨€Áï&ä;Y Ø.lâa;zÁJ÷ò·‡uÜǧÔMèÃÍ|¯ìãÃ$1JÆq+ ä±܆c|ÙŸ@/NÒúaôãqŽŸ@Oò ôIPI¼Ž!¼ä˜Þáø}F=‹a\@ÿäø#dðoýfúœãÿ0ÛqÐ-nÔ+Vµ¸_Àp‹¿Ÿ1ÿýÜÝvüÍ-x=Ç-Õ^FÓ¸©©@‡·WAhÇ_ð6s„9‡#ÙáïòtxYs.@[ì"NOœÇûó8[‡˜—o>˜Ï;•4óÁ· GÝ\=ßj®6æºÀÈu¸èúý•pÃ…¹èêñPK·˜Ë¨PK¯TU;+aQute/bnd/plugin/editors/BndScanner$1.classR]oÓ0=^³†fÍÆØ€ð1DÝpû†ñ@iRùÒ¦"ñæ&^ê*8•íÿ¦`/< $øü(„m*öH]åúøžs®¯üë÷Ÿ†¸bà.{×N'² óª)…¤¼¦Vš>“ÅqΤäª7 $3ö‰ÑŠÉ’¾™ÌxnB´ µ*)Ï+1לÎNYΩá_ UMÅ5=z?†ë¹…Ÿsc9µ"h›©Ð½5­àþØž)ÌS‚~%ÆÁ˜ Èê‚w@°#Ä…-tct´ú® ;’¿n>N¸:a“ŠlêœUc¦„Û/ÁÀ5KpoãÞÐ6 }~iËïgHn##ˆŽëFåü¥pÚÝsê7\‹¼yUk!ËWÜLë"Ä ‚;+X»«Ý"xôŸyó±àŸ¹Êjy*ÊF1#jéG9¥¬bZs]ËÆ:H’¸ÚW³f£ƒÈ¢6{h÷‰ïC|ø¿úš-‡ùÇÞ¶ÛÜ¡—°ãñËØ]ª¼]ª\O“ýöÒ¤³ÀVšD l¤Éæë­³àìŸnÛëìxÍÝ¿¼¥¦ËöpÅw}Õ×_CjÿÅobß»϶ëPK%¡,sÀPK¯TU;5aQute/bnd/plugin/editors/BndScanner$BndWordRule.classV[WWþN’Œ¯¯hsAïJ,*KlHTm‹“äÂLœ™à¥{±÷ëòÑÛ§¾ø`]*µ®åêSúGúÒ×¾Öî3“«±‹ÅÌìsöþöÞßÞûœüþ÷/ìÆw< Šzªbs%§”r©RÔt…4Û0-¥O/dòª®s³“>' ³0Z)q >†–u^UJª^T†s3»Ên‘DàN» Pƒ©…BµÁâá§pSW×DÆE%vËØãm”E„–HqŸŒý"ΦìäðˆQ(”qH( šIÓ ÍsG·GF\賓ýÉÑÊh|ÀWpTõVd‘¦9u–+yc®lè\·• 7çµ"/Í8G‰_¥þE>Æøh•îå*çiÇGï·÷G´‹·ÅÀÇB“ÞÞ{ú<Ï=çôéýõçûO3ÈJh`Ñ7=—«»fI=¬xeÃTyÉp-ÛQWÌR¾¨›&·%„¦,»¬òbÅ8t¸únO/rÕå]Õö*ÜQs4®èÿ—ÂÚuŽŠ óéšXž]ä[ÿÀí¤eîeÏÖ]Ã2 Í‹†i¸K ±+Öß"I«Äe4¢E…¡16¾Ã5Mh–ÐÎ0\SÚºÐ&!Ê0Q3n{ßp¹sHhpa¬sGgdt¢[°»Á»DkCÊdt W$Ýd˜‹¥k+8§¶Ê]^¤jTAB?ƒZCšn[vIȒчn ·É´ÿffô¢m‰à†0"a˜^é*ŃTØÉ,'sY†ÑÚ: Ö{n&dÜÂ]áLÌ·³¶3AŠ0#ί›2KÙ½´aúŸ7ŒI6"N+PÍHa'™ÍdR㘠fýæ}§éjE7ËjÞµ ³œ¨“SÞŠM*˜?ó"•Ëesa<ï"2urBÁ"ž0„î nŽÐýæ’MD`Bü CxªàÙ™€ÕÔÚòëtAT]QvQÕU¾§{7Ç]Ï6}z mŠ ï`—Û}·Â¢i«¨W¶tÛë30äîDh¬®¶&}º©—ÅùÑdRÆêR m´fˆ]Û΋N û”u±HVtÇU[.ô4Y@ljŒn:üQA˜Æ­~ÓL¼ÿ?…Ÿø†ÖöæhÓ«èЪèÔï:EO^ UÑ'Vy­©Š[Zü­Ç<żÖ\Ÿ ©SÜËk’Ý 9 ûУ P&>y‚…x€,`ù+QiÀ*³PhlCíD´ƒÆ(†Ñ%ÜÀ&zPB/<Âè¯ý„~|ÆR”1ÈÁžþìÉf×u¼¤ê xåï’F†žQšu"¸ú(nø PK&ŸïýGPK¯TU;OaQute/bnd/plugin/editors/BndSourceViewerConfiguration$BndPartitionScanner.class”ÑNA†ÿC kµÐŠ‚ (ZZ`áBM¬ñ‚Fb´¤ ñ‚L·C\fÉìT}È %‘èøPÆ3ÅÄIÕ¦Ù9s:3ÿ~ÿ™“ýþãË7ëX÷0DØ/ºV-ÝŽ£nGé@¶•Mlèv#îšP6•|'M-ÖªÓ5ªXyqG«\Ò…ÖÒxHîǦÈ0Rlj D(+ßÛÀt#™/y܉üã,aľVIqð >Q•%)­ìcÂÃÒ€KMBº·å—2ƈ.gàá !UZjz'Ì÷u¹¿‘z9&ÚßßO¢ÐGWÆ$a²T?oE Ý ¶[‡2´U§zP髺¹cØC(¬tUô0M(÷=ðD··êJ÷öâ&|LaÆ‘Ìöªô›¤aÒj½?BÏãú\žBs˜'L$ÒžCKë¥WQ:w¢W÷¬CÝ굤٭Hrõ8QSåò_¦]Ÿž vÃõmÕy`ó‘tµøèHjKXü§Z†Í™çÕÿ³LðÏ(Ÿ*gk®õª»'BfÓáÖ"‘$2ñî TBþ‚2 À—šâ/»Æw3þyåqŒ³³p÷ª¼û>ÀC>êF‹kã?PKÁ"=©YPK¯TU;;aQute/bnd/plugin/editors/BndSourceViewerConfiguration.class­WûS×þ.ÈHˆÅ&rü ±ŒxxcÇ.Ž!N°ŽR@X’qEš¨‹XäÅB¢ÚØi¤iê¤IßMnÒw“¶éË™ÖfZ¦™éOéoý:Ó?¡¿¶ýîî"d!‰G¢8gïžósÏëÞýÇÿò€xß‹ÓÚÅ¢¥«3¹Yu1[Ì9UŸ5¬|ÁTÏçfãùb!­Oú²^åssF¦XÐ,#ŸóÂ#0/dT=5M]ŸÓÒºjé×,Õ´µÔšÊ͉ÔHxtøÒXBàèX ˜B1«›j"UÏ x©ñáP,jsáX,³aBÑññðaZ©ÈD<»JD¢¾D*:é°-´‰…ùb*,àO¤&cÑÉp,‘´_a2:acˆG&.Œ…Ç"á5àT"9I¥Àؼ¶¤©Y-—QãVÁÈeèR+weZZΚҲE݇½M©TÊ̦ɘ×s–vM`¿£Y´Œ¬:YÈ/êËÐM¹!3­årzAàᱺ9pĨq`¡˜µŒ1#§‡ò zΊ¯!Dë#ÔJÄÑñꀴՔÎg©.p¢VzÜ,GâW´‚>›àRÈV¡²oˆâ9Ã:'ÐØœð„ò³z3)¸ûöH£Å…½Ðf²ºŒp>­e§´‚!ŸÝŦ!æT÷¶ÝNùш.GÐ!Mw+xó¢GàðæçEK³†œ´2l± ft/Ž —6²²3³›nrE®Ê¤ËðÕHukƒ^|JàìVªøq]><#БJÍÎYÙÔ¢Æq%…R”±¨‘²®/ê~FïYÏ!Å!ÈͯO)cÝÁ-3‰¡)˜‡åÞ´Q½|ƒIRUV’;*4+tOžÞOå—daÍ~hÇjéGJVèèw:ëÛ–óãMtqúÚW ÛåaÓ4ì­@æ#:¸Ü`h6²©4D_ÀºÞ’r¥®·ÐåÅ9aêí•U³˜Õe%ñþÖM3Ï¿.©þ?ÅÏx„›1(‰ ÄkF¢ÞÞJ5&Ï-üBÁ;xWà~='o»ÃE+?œ¶Œ%÷ÉÓ=-ÇFÓ’{4këÉØšG‚ÍyêdmÔ×ëÎzmw\ºÍúÈ^ e ©›^ü^ ²³.æËɵ X:<÷V]=P£ãÑÉyÒÈ×Ýüãåòçu©Ï¥Í.õ»´Å¥ŠK[]ºÛ¦±mD½|Dá÷‰ýžãÒ¦^6åǃîÃƒè ÆÇù$•¿]âxè}¢Ó6Ý`+xhì°½ ÁQG­¡‰NqM<׳‚‡{zïàXÏ*‚ÉUô&{WÑŸlll\úgœlÀ ά`ðÎUH܇ÿ•d„gOÚR¡{¥¤P©p¥ÔKí]¨ôˆX‘"u¤Ö>y¯LÛPÛPU¬ñ-ÊE·(wq=ÏÛÉêa>z™À>&´ݤ½8ŽÇ¡b‚ô"A'`‘.ã$^ãÚ÷IßÂ)¼‡Óø€ôoüöú'ð/Òã þƒÇ„gD+¿œ:0(N’žÆóËhšôYœ³ó¿ßÉ6âHÈj!'‹‰§.aÊ-¥çé,íC«¸œ\Ar¼§/0ÝsŸ^ÁgÈÈÎ’í»]ÚÕa–"pžÿC,î–q{fÙŽ=LÔ ¶õCîšurW`Ъ¥=«Dk×p×eJï"m_E6Ù¿‚ÜYOo»§ï.>ëâzXtg¹O°¢„›´ žrJÛm3Âæ®ÓÍ›ÛÏ-7Rw>‡ÏÉ#¿'\'žæ“”?Øó'Üø;ö0å/&Ù,_¸ƒri=»íÍÅ9Üü”m_qt]ûy‡¯‚ûŠƒ{Sâ¾v¯È¥JÜ⦉«WÁø2^wq3nò:Ó}ï 9è{]ÅÉÆÀWãIOàëñÛâvEàæ9€®4ËlåÊ2ÕQ \‡›)É}ÓœÀ·ðm×è(Ÿ¥¼oo²b¾»ŽßdëXe˜¾¦¯„é+a~•î`¾Ji)\Å-b¾5Þ·Š·Éü(0}?.=äƒç.~^VŽ]l-0¿>æµ9 îcf;p‘Æ 8ÆkåºSÁ’SAüÒ-ÉNü ¿¶Kò=ù7ø­°üŽïÿ@þ&)­þPK,ù!|ÔÇPK•¬l;,aQute/bnd/plugin/editors/BndTextEditor.class•Q]OA=C·­. ÅRQ´ ¼¶nHñ©ÄDILCÓ„Çéîm;dÝmfgÁ¿å $øüQÆ;»À‚“ÌÇ9çÜ3÷þú}õÀ¶«XØ•_3Cþ8ýy”MUìS¨L¢SÿSé»ùœ‡U8ŒMôÔ§ Ró”üLýE†ù7XÊŠ•ù PjµGN? ÉE O=”Q©bYàý¿ò'™h¤èœt?‰'jšiiT»Xñ°Šš@mJæx&5…ý$b¢@·Õܶx:‘îÒ\ÑÿR¬×‚Ôsá♵UØoý7½=²–žcC ™²¥û¼ <¤/·gËX¨˜Ž²ocÒC9ŽH >H¤V6^\:f¦¸­Áã:Û㊚¤¡M•ÚF½ñð·pt¨òlwxïNå™Äÿ¾;–xrs9®ò韀FçO:×pO:ð.±võ9ú¯«9w™±Ö±‚—y›xÅ»c},4»¼Û·2k6oDÜ<õC7n ”osäÖPKMDÓ=•øPK¯TU;(aQute/bnd/plugin/editors/MacroRule.class•S[oG=co²±³$N°-’`Àk‡l(R®'HVM¸ä&Bo&γŽÖkÔßúRžòÆ ´*á&ñúúØ?‚D8³¶ • !²<óÍÌ÷ÍwΙ³xóÀIÌšˆ ŒË[­P9UÅÙ¨·jžï¨/lMçºtƒÆíV]™0Rëò‘têÒ¯97ªëÊ Mô²ºÔåÖ½¦rÖW¥«œPý:ËšNYW ôV[««*Ø_ùtÉ|x~íjtr^ 'lí³@R`°âùj®õ°ª‚YÕ,‡+ WÖ—dàéugÓ×¼¦@®²³Ê$Õ§ÉzK†,\Þ‰ViMÒ U0ïJß§†ö7éÐÃ31*0¹»û-Œã J®DÊ•µ:G-ÃqDS…å×Â5¦äËö’>´-Pä[É å³ê@¾dÉIŠ{ÂÂ$ÞÐdO_v­Á—.·ïjÞ'-ü Ÿ½·åk œÆ´‰3;¹8ÎÂúÙ‹s3³×Ês³3f³ÝU`j·8„Ë?%¼ˆË&hãtÛ u¯ê4š5¯m ?ãŠÀžš TðÐó%-£.Ù%døÙ^r¾Ñ \uÍÓ®èšjR ‚1jç¿1þèd~ÿ1ícÎz¿Ç=\-rãœ)¼Ä@á-†î¼ÄÞHŠ/0òGT¶Ÿã0 ŽÇY˜Æ¾ãÎH»ßãEº ™â ²¿±Eœó¹âk¸x0•ÛıÂ_HÇ·Ós*·…ür¡¨ã-LüŽ>F#Ï™?%ð'N=ï⨠‘Ò0ïÞË~i¾sE"™bÆ4Qi\£íŽ]\çp?‰SŒÏG¨é¼Â÷Ìîá,Û/ec›è‰?Ë>~… ÓFÆx¢W³‰ìc 6›1˜c<Ëj2…âq?Ùþ—E©{›Ûÿü÷¢NÍÓíw]"s" Ã”u”rŽ‘ÆÎQº<#›ßR¤Šôð ŸÄ.qU&‰›ôò"Î`™”ïãxDút›D—´ìÖ‘ö€vÂ݈~œ½*¸ÊÈày)B5óPKBù«dJ(PKÛA‰;aQute/bnd/plugin/popup/PKPK¯TU;&aQute/bnd/plugin/popup/Scripts$1.class•VYWGþ z:ˆ¸‚FGCt€ÖÄl`Œ8 ¢Ãb1éiŠ¡¡§{ìîA\³™}ߣYL4‰æäÅxB<Ç“¼äÁל“øæOȃïInu"›˜‡îª®º÷«{¿»t]ûç—«Öã y auWÖåJÒìU2F6¥›JÆÊd3JB³õŒëT®—`XeÙ)…k†žq¸¢Y6Wì¬éêi® XIGÙa% Ý~Ý©\Gñ;c60„†T£ÒP“Ü`(‹¨Cªb¨fJI¸¶n¦H p£nêî&†m‘¹Ð¦«O_©êbĬ^Ã=2 P(fódH!óe„Pư(2³ò¼¸nò¶l:ÉíN5ipa¶¥©F—jëâ;·0¬žÃæÊõäbq¥jZæ¡´•uˆ´|"”¡=Ÿ•é–ÛJÙÜqZ-¢Æ²ªî ›pU7ë4„° ÷JXΰâÎÉX• ÁŒm pÍ%J}"²®n(qÝqб ÷IXÍP2yGF%î']Ýå¶J†1,ŽTݦݒ['„µ¨’!ò¦ïʨF 1hòa—aá8‚ˆö¤0ªAB-Ã’ G’YÝèU:|“‹¡€’•¨¬ºk e<€Št'¦š7x/"RÕ-á!:hj"lÇq»ðˆH—G=á.ñ]/£)mÕL†›„R™n~Õ´ÔÊ!6A™ÎÂi³@jœ0žˆ³͘Œ&4S\ËßœÊbEµMÆv‘î’“MvªÎ`¢Ø!c'âÄFŠ»š«[&eÁüI‘lU3¤Þ† íTG“6dì“Äi3¬™Ãý[ídX9P‡ÛCºÆÕ;^ñ­(F]2öà)²—s¤ênï “aÆòNwËxû(H-{P„:iá{=ö3TL+aÀŸœ*’>5M¼OÍäã ¢fvÛ+ƒ£Ï׋qÓµUêwËgÒËí’V?$è Kg“‘1‚‘lÞG©Ü/g¥B¸…)ÃyÒn÷ÑF(;𲂰Ï)1¶ú¼œùáÁŒƒ&Îlž±lZEº»sÇzR±œ”.NÓ¨¨Èé»ëÅ!ÆQ G(ö³–ªßÀdÃqÊ´Xc[¬9¾?ÑÙØ¹;!úëœ/ˆç‰Ã=ýºÁÇ$WýĪ ×^”ñN0pÛM«z†Š»m¥³ß¶Š.ïeÓZ¼"ãUAªÔ¯:mÔ³Dä^—ñ†h %¹Øtxs„¿oÉx[¸jß™s#ˆwdʺdZävï3,ت’ͽa× çP„¹‡ñ¡h91D"-wDz„Omb£yXãá>ÙœöûCÍÿøß^î÷ÀP>kÊ‘”:Þ=æMéÔ´4Þªø5O’ŒŠ|Q|óioñäï¡Ìøÿ·iòg`j®“7~QÂÊÚߪ L9÷‹¬XäS³©–CX­Üí·¨ÄωNIFÂ-¦É혡:w°ŽîùtÙÊ+-W ´L\8Ä =!ª0ºÐl;}h,­®¹ ¹ºö2Jª££(ýÉ“\Q‹Bƒ,Ã>,¤Ùbﻋho¶„pÊR”û¨ì%ÑÞÍêK/¡b a†¶s¸T;†5 ¿"ÚZó;”š1Ô1œDá9œ­¹‚ {Gñpt•=>‚'Hµ„†lÃÖ<ÐzK} < –ÇКG ‰ú‚ò‚¨¿°;51ìÍÃÏxf‰§èIŸÂfZ¢¾,3 {·ÌAö"]¨/$Oà9(/ h»¼p/Á/3œú·Å‡Ákñæ…Ö+8¼W*{ÇÓyt¢¾Ê(>¸@Tôà;|q â/ó="PAïýôî¡+J…œ¤‹‡†èCR´ªÃ )‡ÞÇÆ d¨¦à4g`¢‹óÈâG á*¿Ö5*Ï?p„N9Šë¤uÇñ7 ½Ðz!¸¨›øŸQ€*(mNâÙÙAèŸã ]Ùó%¾¢T9OA<¯)e®Ó NÌòð iˤéËŸ!ù|œõä[òô½Œ¬;ï% •wþPKÏÖ± î PK¯TU;$aQute/bnd/plugin/popup/Scripts.classW‹Wþ.Ù͔̈́@€Àò ÊfhcÑ„PBx-lBi*-¶³»“dÂfg™â[ŠÚjEmµ6h[+¢X‰¥ [l| V©Zµ¾¿Ÿÿ‡úÝ™Íc7òË/;wî=ç;÷žósϼùßW_°ÿV0G`•~(çZ"“Ò²é\·™Ñ²V6—Õ:“¶™uͲ»5#™6³Ž¡åLMOº¦•q´6«/kå2©6+ãÚf"'gc®Ñ'P‘µ­^#é:óã½úI]ãbZ‹›ŽÛ,0·ÓìÎènÎ6êK–·ÅÇ7”È™é”v¿Õ¼šJ’v­4õÖÆK6UXÑbÛüÅË·™ÓÝ.P©;,h³RFe¨RQ UÁ…ãæ[m[ï—{a>ªæB`‘Š ÊC¨ÁRK–MrV+]qRw-[EËB݆»ËèÒsi—¾Ôŧ×h–¸+T¬Ä*•zG,ûDÂÈ${VR³ä|±±åæJÔb­‚5ái…T܉uK‰ëY4ÆVŽ˜™”uJàΙløB´t" 6¬¾¨Š:DéNÚë4Ò†ÇNÃ>i&¬uS˜*•¢­lR°Q öv²*4lö6¶$)±ÒÛ¥' í¤iœ2lgH³‚»6Í$êÚ¹¤ägjL©’Ó¨â]¸—ì6]Ö!¨¡ÍqÅ ó<˻Ѥà=Õ“WU4cÙ˜1N“$‹FÒz¦[;˜ð¸®€¤]7q‡IË64Ûp¬œ4¸Å ÃJ´`‡ŠVìôÉWÈ %Þ(M«va‚Ý$]‘GR®¯²Ÿ{kã@Å^ìcJ%mCwÓý‘YÁ—„d5&aGeìXs[¹Jİ£í8¨ ƒü…y÷ã‰b:­IÎ;fBÖVƒc2ù:U<ˆ÷ú~k3XÃô´ÀŠ©’¶°JgÁQïcbM'£â"GˆÙÎrCÄí‘Yø nÚºWã,|œßÄÿ®àQ%ÓÈ«H IÚßcz•22_d¶™én.Pδ4)ÃcèVÐEOMœWÑ#½WnœfQt*Ñ‹´‚óŠK¶Š>0ýÊôTJ`qd2›ëŽÉ|Ȫø€„Szt§Ã£~UÜ̹¾„a?¨{‘©Ž[I=}X·Mù^˜ ¸=&/’ÚÉa)ºªXïçH¹I7ÃäR# (x×ìªaJožQzrÁFL¦÷Tå–%O;ÉU\éÍ’Û³` ñíÒCLW%šeÑÊŽ–†õ³Ê\FjL#<-;}júL›WÌ*VÇâpögGCºd ¯l‹Ê~ñTl=,/ísòÒ~R9U캂}-ó¸¤aä´HÝCSÏïb´X©F³$ú—T|Ù#«éìî˺ý ¾"=ˆ‚ã‡Ü§;=;‹gQ%ñe"?§ây¼àןV¿§¢RÑÒ®g¹Ÿoà‚‚o ÜQ´ â[x‘éyÂè't©&§XX/Ò+ãsmVzì:»„ï)øn&UT\Æ÷‰É\nM³v…#ñ©Ô½”¾„¨¸"ÅçÚ†«›j(øá =e.Ñndr¸Ê¤¶-‹îĹ ³x씵myYL^•ÍÉ´Ùîƒr ^cYJ õ†„Ø;=T¡pLæÒÔÄUüOùÕ½À®r×tÓ†#«Y±ó‚]¦í00âØLÕ«púÀÉ%¨äáÉP·mò–dºŒÓFRÁ[40ó!×m á~+sh$„·ñ¿/¹týB˸fém%m¿•PñG¼#PéÈÖ´lÓí§ÕHLúãmüYÅ_ ÒN²ÇHå侃i=!o½2"”²)-ð¡N¯øøUD-ìx“<0_c™Œa·¥uÇ1¬aW^ÆÏ—9lÑÙšóMñÞ*ø7!ŽœcsÏß;ñ¥çrö­è0æE¯cþÑaT¿‚…×°xËóX-Çzx}õí 7ñbà lÀó #ØÒ±1{šq6Èc+ÇAÑTÞ@ËV†ƒ#hiRÂJ÷q©"\q mMåQ-%bI‰Êobg¸<Ò`\à<(µÙÛÆáò!–(Õáýe)O *z %º9GäxkœÿßéAž¨ 63XÎß%<õ"Ta)ó3d5ŸµX† \»+°•Ÿ;± ¸ÒÁ•Ãôâq¬E?²X‡ÓX!‚³láŸFÏ`#.°Ã¾ŒÍ¸Ê¶w÷õ+IŸ­ph-KÿÒ£p‘ã³/á$NÑßp‘XýŒÆVb|âïÃ9|áþpí£´ärø8>ÁèÇBœÁcŒacwŸd/ñSø4ç.ó\ã Î}†vdD}´Ïbü¤c6„e´ ,ˆÖãs‚<èQCºižGš&_Dâ4{Ǩñ• Ç£Ïã „ à‹xª@Ÿ,ß$Á®É8äñ´À*Ê^Ã3W®ãYZ9´øK_õYÒR`ÉéX1€åõ‡ðµ<¾.g¾ÇwƲ–‹¨)™ibx߸ŽÁ£Õ/ã•o4ÄQS`c80„k¤éuZ"5Â’Mž¥5Ãh8áu9ë¡ü‡n\#Êžt Ší$MÚH]hÄnöf{ž½ì•cHr®.=…ƒ Í! /°M¾ÄçËì~¥çöù>)x.ÌõŸâgôØr<‡›ø9ýÚHúÈ –§•$úGgp/~ÉQ€ò!¼I_ÇëcüŠ#à×c}”2n5×qëh´žÑýM{ÃüECø]Ãþ4Ýjb“gx¶Ç˜g½}ÖúÚc®Á_½Wòïoø;µçàÊ?ñ/>C\»åIâÿPKØü>)C&PK¯TU;&aQute/bnd/plugin/popup/SubMenu$1.class…R]OA=Ã.]XFX+ Tm‹¶ËÇÒW5&†¨1)&¦¤ïÓíP†,³›ý ü-Љþ”ñÎÚD m²½3{Ï9÷Ü{÷×ï?tpà`ŽaK|-r ô0H¢b¤tÄI‘½bp,uÑì8°q: d©$“Áù©e Â\Å:x_†J~¦²æ! v§+¾ap/EÔÌÂT%ù4| È¿`ð§E1T»çâR‘У —§J(_y«´Êß1ŒZ³Šß¦Ï*›Ñî3ØGñP.‚a…cszÈá`Áœq,Âuaac ë V«Ýw)³Á±‰ƒ“ÉüD^Qûk­» ¬t•–_Š‹LOÄ ’¦õ8Q_¤ÊÜ'/m3v†í}7;4&+-´‹çxá`›¡>½oަ1jË+ÒÆzq‘†ò£25ùDôÀ'§tÅ?–ùYñà OÎøâ<Ê ¦S;2øÄŒÿ/¼;þ>úãÜ»iùÑmµ“ÙÜsïž{Îw¿óݳ¿ýýóCGpSB„a¿~Þ÷ ­b×´¦å×M[k6š~S›õ+Ó†íKˆ1 6œºfT-³éÚâ‚^54½ê™ [ã.Óº­× ‡¡ÃôŒ%—agyQ¿©k¾gZÚ´Þ,0tΚu[÷|Ç`˜yñíx0µt»®ÍzŽi× åMÓ•Š ›|*>Ÿ•([a‚¢ÇÇMÛô&ÒêÆ`™‹ ±b£f$E—ŒN$%ìdØý EÙ´oµ³º{ð$±»¸[CTÍ\ìCŸŒÄùÁLÛ8ç/U ç‚^±è0=åFU·.êŽÉçíŘwÝ$”·¦–Çl}IDÙ›!Q7¼R@¨¦fæ·CJ ûq@Âk ]/p-ãu$¾nê–oPÜ=jæ¹b–eˆ"À Œ!"Œ®ù¥!¸(IPFþ?F“%ÃÒÈÅaÉkœrý Uމ™Ê"ù2!kÞ`Ý't½Vc˜R7-KÕ1›ž[dˆª’x cŽ1t¿üVÆÛ8Nç2íšqkf(TK™Ry6Á÷sw6Ñ+±ü.•|Ó£ÃËç“pŠ·µà$qE.î÷ê›ÑÖgÛ¦Ž5IžsŠaHÝ¢dÁÁhW_IÆûø€ŠÖô=†ãêF „(eãg{ZÆ9ÌPrýŠ+P1ô«¥Rf#Zî~ž»Ä‹æÁ±]ñ1¨­Dé†2 ÁŠ„ncs¤O3/ãS\¡¦é6-“ ‡ia> "Ãg2µï£t‘]ÁûV­¦]ÊJ÷=¶à[™6=%"Ä1–t.RêÝQ³j2ä¶y£ˆQ:ASw<ŠÞ‚–rò· ÿ©6®††Œ&>gH·|ù‚q‹v÷©!¥ æ{’³ ß©“&ï¿r;äa¾…¦%Û6œ¢¥»®áR$ÜôýcôPS§Q"+‚b4Ò×VRdM“W„Æ]#ÙeÈ#«Ø1·ŒîŸÐ{_¸§é‡”¢0 tCF?ÍúƒMØ=€°ì¥ ¯`_;ôYòáé÷<@ï ^¥ž*Œ†_0¼‚L ý¸ž'.¼»E|9عŸtD ‚ºÀúrÝùÞ‹¥cßãA®çD …`2ÀÓäV11·Š“s#¹ìè2N/ãÌ ÎFqé.žæ¢éX å|G.‹]káÃ|œoQ:V0Ë1 ç%EzŒ}«`sJÇ2.å¥à½"1éW°ïpG‘åJ¼çr Ÿä;•ι|×Ã19:–º‹~¥+:šO*‰¬’máê7)–N¥åþùã..¯cx)s\‰¿¹L‰·3ÇEfE‰óÌ3»vžáYÍ©@U,.b4MLî%.ó8ˆ"¨ìƒ¸B¾ a Ãø |nÓ·êã4ܧñ!Žá1Æð„:ùSÇï8?QÀ_˜`1jà½8-êõmP“µz‘u :¯!YÊV•¬(LF  ±ˆ[B7„ÇÆYqBuu\'¹Þ¦ª›/AˆT:Ñ ’í=z,òKªr{qB´Sì„b–Ú:lPN®à!Ne¶{ìéÜcô¬-f‚ŸQØ#nÊ’ö$ͧˆ°’8ê Øº4‡àÅȯOÀˆÐÏQ<ø4ò›vRxâ_PKUwÕ­#” PKÛA‰;aQute/bnd/plugin/popup/actions/PKPK¯TU;.aQute/bnd/plugin/popup/actions/AddToRepo.class•Wk|Wÿßd³“l†‡) ly¥”ÒMÒ0”¶»)hè’¡¡­ìN’ÉÎ:3›@}´*_­Ïª¥Z­U£ø- iZÚŠE«VÅj}?>èG?¿Zýß™MB’ ‰vîÝ{Ï=çÜsþçq/¿þÌy·âï ŠbúÞœghÝ™´–µr½fFËÚÙ\VÓSžig\­1Þoï3²¶‚ÀâÃú€®Yz¦Wkï>l¤<aµ¶Ó«)Ë̺†–3µÖ`¯ÑgÑbXF¯îe–Ò}®7J^}(e;†æ®sR†«µî4-#!n03¦·U 8VÓ)j¶ÓFÅX ¢ EI3c´åú» g¿ÞmQFE’2¬NÝ1åÿübÈë3)³69ß»Rt±“ËÜ›¢æá=eäɵÖà~‰šÎ2TªPPZŽ¥ˆ*X&P=×õT\å彆—ÌÛE`M¬¦€]rÏì7´Ö=º×—(ÇJ¬V°J`Õµ)UTãÚг¥8ú޼}÷™¶æÛWÁ4X`ËìÖl·×ÔvéN7áfëÔ«éUÄP# Pá6½Ÿ —Œ3ôñÐá9f¦7ÁÔI÷ÜB'ÇfîOU¡¦SÁz¥Ó”è4³Ç4¨I=6Hf·’&–œ©*HšÛTÜ.ñÉ¥M*ÞˆÍÕÝá8¶CTŒ+œóLKKš®GkÆÑ €_8uGÅ ðB®y¿áã¯UrÝ®¢Qr•^; ;ÞÈUÐ,pÝäéFÇÑI4a‡Ô~§@4v•äfÛ²ŒqðH Þ¬¢»¨¿žN7ZÖ5ÈFD›‚Ý×Ï@³ä€îÙŽŠvìˆPË£GÏYÑÂËÏ~"!ùîSÑý%†4/›n.iîNÜ£à€À²ÜšŒçè–Š.$x¤l爛eЬœ"¿;gZimb›X| Ñ?¹ï΀ÉX“ÑèšTðØ_F÷â>o£‰fe¦BGwpûà; ŠÍ–XPX?GŽp¨¯U‹©[vo)ôH÷ 윚,ÜAO4ÓÔÂÕ:ú ËJp! §`ª8Œ#¥kxML›GÚ3íYƒ ";Pô«Èøµ¹.²*Þ:mNZM`Ý»ÏfWÂ!ô9 íÙ³¶pÀM `™+Žª8&3Ã"Jnìvm‹‡dŠàx—‚wÒ÷³fª Q½/=ŽÝßÞä Û $9“£Dç{T¼ïc¢rŒæÜ>ßùsœ“6]ƒ÷«xH¦‘’”e»†‚0ëLסIbÍpJñ!&À}´Aut¸W½«q_u'ð‰ˆ‡Y Ý¡SR|TÅÇðqñYú¸«¿š4¨Ÿ‰™é5/=!Y|Rŧ¤ÙK=;Ø”!üiŸa­›5õú+ûû{PG?-Åc*Nâñ [îÑƱ@MÁZ4YĚ팧³þ:ÄÎçñO°^Î뀊/âI:<ï ¿d h±Ök¹É±{Iìî¶3¶Ô»O ¬h¶sVº:c{Õ®§;^à 3¨§ ¾2ž™ý[ï8š2²A¡ ñÌœ3w&­Eý=ŒÉ©Àp9¬3î–Šzg _˘±¦SŒ—9’…ÌLÍ==Pæ Ó×òk¤NâU&%R âhÃ\Mδ&eË%Æû|҅Ђù¼2YÀ°Ü¯šÚËŽwak§Ý­a&B·òü¦dóPK\ìù2ÙÜGžq×<Ú·¦1h8Dl‡1Y§#lò¾¯â~”¶äd3[PL!&ójzË&îÁä=?Æ ~È 2;)Í›Ky9ÇHOœ‰àäçÇ*~‚— TÓ3Ù Ð…Sú¤Öü:ÃügxEÁÏÙHÍÜUñ ü’XÊG½é­a>ÉóWTü¯29÷én›OÊÖŠÍB‘K;j׸m+ÈÍçw7"##°€Ò› ,7Ìí ©,¿~‹ÄzæPJËÿ‹'ù’‘ÚmdR}’GB¾c"ÌTA¢%ÏÕs y‡¯XÐÅ/œx¤¬—× „e1%üA>Aø•s¾ø-ç¿Û8ʽ’Ú¨g8)ÂB~#J„P…Eœ©ã éc\0(z«*—ªkŸÆ’‹byñC,0œ¯Ø8Š*Q¬hÚ®úa¬­Am<4†ú®hhZ¼$Z2ŒòsÇ(¶0 r¶ÍŸÝ÷jÆÐÔåï %ކó»o*Âs¸+ÆÞ!9½[nVÆ[ãÊR]"Š*#0â¥ÑÒÐ0ú¢¥Ã°N¢^Žv¼,Z Â-B< cðî?‡‡° ^%ùñhùóþ8„5ñáDWÅGðáàZÃxdŸŽßó³Ä¶ÅçŠq¼H¬«çŸ|ý?丛Ç+¾t IÏÐuLh¿• ‡+ø2­V!*9û6ˆî’{|¾Ñ¢«9ãc‰Ô&¬C7cŸXí;Pö–^[«zöGëYð5<Š xœO÷§°§èس|ö\Àf¼„-¸ÌwÄ˯ ¯òñò¶â_ÿí"Ìçb%Ÿ)Uh«±Ó÷÷#R#Q÷·œ}C8¢ _Ã׉ޕø'¥|ÿÕ)|ß"V6áa|ß!"t,ÃiœA˜Ú5á»øg'(ÿi®)Ô´ŽÚ ާˆ¯œ# ÏM£ä¡~+ñ ÆhÑ*®ËYž¥U¾ÏMp;OnÏã…<œ“Ô§Xâ·¶–Fñ,–LÇt’ªÑÁËíÇrܵìTïภ÷ðIyÐWwk ~BÝf_IV6ºü7ø-Õ]F`¼F£“Ç:üŽn R«è°ßÓ%ÏæÃ8XùƒŸþˆ?寷Í׉žž´WطŽWÙJL¶ø3þÂõOþíPK†f,µËCPK¯TU;2aQute/bnd/plugin/popup/actions/InstallBundle.class•W |Õþ^v³³»™H\`qå2 YVK7“Zü¼”™hW±;ˆ:ã&°¼êE0–ïTq±,yO6ÝÍnR†¸TÁ.*A\‚­â2\NùZw·@U1ù;ev^©BCSÂ]ó‘ê‰ 4U1yA5 7™fÊ ug%y('1â’EÚ£¢}ÄQ—„µE´ŒÚÙÞg¦öÊÖž"Ý­b⊑ٔH[v?Ü©€_[0-£›ý;SZ‹íÑzu­;Á>²ÕyÙ _üHÃTpÛæˆª¦¸–ɨÈÈp)ŒIý“ødUôc/ó™{íŽämznêÉQZ3S”ƳÚa@ÅÕx“Só9[äLø‹fÇN\«b?ÞÌNŸ1®ÖmxZåö[U\‡·Ñ3+eW£@uõ®")QdOÁõ ìÔm(·«¸ï ¢¦ÞÃ*îËáÍvrõT¼5^¼‹ÑkÒ’§Z!âÊq†ìP…rÁ Y©PN²ïXЖG8B à9ãò1ÛCèü¸å^ÜÆ“$wÆéÝ¡\»õ³½WÅûð~qš<#}xݤiZ(·† ŽFÛÃ;Ì» Ú¼¸‹ß’ÔCvÍø¥e÷¨ø >ÄÒÖÒi=Ézª+š^“(’>,%ÜG|ª['¥óâ£^GmÆÖûqŸyïµR¥,ÕûU|0ez&CœÇ5‘¼5 Ìw{ûæ}1=íœBçrÀ>ýÅ·–?ë™oSÝ˜Ö --/=cŽ1î+±üé¼xú³™ä]ù ƒìù>#Ÿìñã#L§•ñ£Çn`ä,Iô°õŽ=Ch`ÖŒË;ؼ¨†ÍvÁA ‰u´¢öML§¾e3j2Gµ=¦StæM’Ü%š:o²4b½b¤ó×ÌÆ±Y[¤x&÷¿‘’Ãã _; ½¯ÝèMjVÖ¤òÓ×êÔâ&/dY+ß’öœ¬°¦I+LvÜçU|ßeM<÷¤ž“¿4؆´æöIý}üPÁ˜/¿ªø~Ìvž´³zìµnÔ¥à§*~†Ÿ;'I £©ËÔœ7F_³ašf°ü‚9ë8î -÷ýø%ÚüŠJŠñ(øõ˜¡Çñ׋—y–Ÿ¶’ÿ¥¯¨øì#³äy6èJŘû-Ídø™'OÃ@òvÛ0g`Œ™WJ×p o.þ•òr⯇kŽæü-ãÛ|Êo¥µ‡ ä¢'ð×Ï'€³1‹+Õ!BNä“ʸo pm$M9·îy•›cþ%‡°°­n' ãzwÐ=ŒS¹(u­ö ba8XZå9}aζÎj• <¢Ê,}â¾ã/Ö>Œ³Š­‡±†’ê=ù…âZíu­ö "-)ª|ä\+0Œ ”íú‡pþ6×—…ƒeÃØV‚#X\¯Õ£˜T‡AhƒŠ\\R‚ÎAÔÝ’ìŠÆ3²¨÷ð :ˆI‰úŸ¨òIu4즠2 Æwáâ ;Bjø‚¾£h¤@ß0öI½ iÎQœôS%y®x‹‡ñùñÀ0n(Á *ëïÔ0]à&¹:Œ›éç­õ¾ÚÀ{h“ïn¯ |€"äªÊûaÇR8ÿd,æð/8ˆEA_àÎ!ÜMëg}UÞ!ÜÛÉ­È­º oÂàArx OãSLßP+ù»ùŒíÌÅB„p–cÖòy>S§MÎtX‚+©7†e”p*®áppjp;ùïÀ Ü‹:<ˆ•8Äøi¬ÂQ_eRÙxž‡#ôzl-œŽ·¡Y\ŠMÂâ ¼ç‹ëÐ"nÃânDíübÆ1Çrù'WŸÆgè•[ÜÏâ!f«*nÅA|ŽþÍ×ãóx˜¾…Ä5x×3o—Ї!ZéA§hƣ̮ xŒ+1Úr˜_½èáÜ#é|ô´_`äüô·OàIfûíôðqTég9¾ˆ/ñëkÄêi|>úæþ3[ÐŽ¯ž¥±!ÚäX÷5®ýÇ úQ‰¼Ûó÷ëvý}CÖ•¸š+ßﯳÓîN¸†WȨ†+˜šßìäö·eY b°tßvÊÛåöÖç Cxñ^ª÷=Ï@ ü† ~ù-9˜”Ï@•oaùüÞ–TäCþþqµwåáÀ_äë¡Ê[QyßñWÿ:„ûø»MOÕÿdQß/{‡“[¼£[hýVâ³1kg~mg–ìÀz~mfVµà\ÄËHvá \FÜ/ç¬vö2Ûöóy#gÿ[ÐETb¼ÕlgÅèvl³[Øýù<àêߌŒ°Wÿa,Kì•ÄÞE});Znj½ÿ%‡:£ÌÃ'‰¹…J¼nÇüÙB“2ŽQ†Àq\ƒŒR’KvÄÚÚº!!ÁÙã»äz·­ 9”ëü¹,åJ” ¤–gtNòs¤öðÙ´â(Î]ñ”PîÄšG„²™z|c]›kµ›K¿Œqe¸Ê}À- ‘^×^@þåðCâ¡øËí¤ISÁU4ÃÄϱ ¹ŽÒäa8Vð/Ž•¸Zê •0ê¸×Ò ó%#Ïì6¥z&gGËeÊSt¬V7ðà]†cQ0;Õrp¢ò¶ ˜ÿë¨cr6+!ÓQ!Ú®ãzô0lGŒ|ÉÜ9$XZ+SƒÇ6ôªfÚ9)€•}UÚÛpƒŽÝèc¬bÑ,Ðжii¯H'ž*f¥©_iÚ7IAõ¬ó*P’tTÕóì`3†§R|¾5ÇðtÁŒNÇ$Ô 61xn³jKCDz´Ý1‹¶Ãüu¦¨¤,o ¤m7g©t°}\vÜT³jEu£_Œô•5;k¬%ǪAÀÖ±pˆåš^Å9•ºLKwíŠuo,Ž-Èë8¬ša&kzÓ€kçÉ´ƒgh( æÖ–VµJk禦¨ßn(Õ6XÎ%•¢(Uov 1%ô®8d8jó˜Žg*yµIžÅrm³K^±ä©ýgëøO<'€-ºU4ïØ¤2>oøŽ=O•ñóy³LêÏÚEÝ‚^õóB/‹™Ë­ÿl|Üx‰Ž—ªÍ„åvYãl;Çýå:^¡èÑA^mž¹Wéx5^Ãz¤õ[ÇvHUt+yV>Ýc¹!öu¸Sìԉ;:^70Z®õÌÀ€nU»'u¼o">˜J¥à¢Ôd…Ê•·àmÞÊó¦¦EÇ]x;å:–rlödèò/®wêx—ª…Ëvñ˜ògDÇ{”?*ý†S`Ø\Å{·Ž÷)‹´£QÑ> ãƒ* ^wûMÖeL¨{tÜ[E|uq(ÚGt|TÑÆ×_°·e§pZµ‡g8žÛoyÃ祊ýc:Ϊ¨Eóf!h¸_Çøóà–\ŸW)è®yÍ|’l}Æ¢…á>>M›šÂ`sÖ.Z$z¶ŸÕqN¡£v˜aäül^ÇÔøQ—ÍÛ.)_ÂC¾ÌüŒ²åÖ¬YTW¯Ž¯ø“J‘§z}ž‘½eÛ%†¯Ñ²þa¦¡9gL‡÷4Qlû¦Ýþ©_W™D°¬†óã({†û¨šq*˜ôMß·ƒ2 n:u_]Ÿ:í‚gpŒrXßÅ÷5|SÏ´tü?äï˜CÜö'/A:Õ}¡IñsdvwØìo-{cø1uøMÓlšÔý &,Ž-O>}Ñ[£Š–‚K.„¥¼…,þu B‡‰Ü3&vs\¬^òÉó^ê̺¹0¥'ËGY¶Œ¼šB§d穹¦ŠúóÎÒlÿìQÆ Rðg¤0ñ““R-Ì%OÑP-aÉ,…à>ì²ä…‚M=5ª‘2ñÑWÃ?«EK'ºwŽîhxB°p¼w½¶·Õæh<Ê¢ú ¥*!]ÂÝeÌsV‘ët‰VÁÓ(år>ZØÓ¥^Ø ^U~z:À 3®4çqéi2“—擄Te¶Ïμáº*Fq™!³yAH£`]j,˜¹t0˜NzweÑQëú‡˜Ô4G—&á°¯+Ĭáoãð¹Ï$ÞË<™¯ §þ† º,KX ž½Éq ¦.•:Xc¢ªAÓð˜Šâ¥º4 ‡|Ý`Acê`-{/×å e¯Bè>?Œ~L¨g©.W*= îä]–©»CíTîcKUý’i $,D3Ërœ2+œ/A”˜åò:õ{ºs˜›ìë§ñõUƒãˆe5šÓWÕè_u"+uY%W‰ëû­yL-%Óúh­õƒóËôkòÎÄçg%†”²^É1GeâÒŽ;ù#]:d-c^ñN‚s'bw…Îj\/5ÙÀ:™º«Ë&Ù¬PǼ՛üeV©=%ߥËÕÖÚ°áöú¬!—L_ÀÏÆwøó¸ëKAÁ[ séÇÄùcÅêýêükŸ<7ë;‚zöoNês ëß-1õÿ õ8`²ÃJG‡ú×D<€þ@ç¥O"@ö Ù‚ïç™cÿwX¡üÂeüTó¯Žêë/Æß(×õP ¾]ͧګ[v ú½\„0ƒ¿q>‹ÁÌäJ˜0 ³ùdÞ¹ç+ˆ Q)%B7ŸÆœË>ŠùçBýáõ#¡õj½pÕžÎ`± IFÊH5®(ãª8®^ÚOcM¦.YWƆL´qKFKFÏa]2º?“x =n¯A*™hª_•‰Å¶ýIí4ºOaG2VÆ®Æ=eì-cF;^/MõMñ»žøvk$’¬Sœ7*6êÝEŸp“"hH7Èí­U ÉÈiäh mº…fe¢J¶ÐïÊ•œÛx¤rdLoÍÔ'ëÿ£ŒÛ2ñdüs¸è,Zö'£ÉØ)<7£`µÿ?…ãô‹'¿à$fUXâ>‹"Þ~¢BÔ*rŠø²~¥ÿ•gðZáL>³Õ+ãÄîNÖ+†7·–ñŽL"™8‡ù¾tBQSJA‚ r(™wOÐðî2Þ;‚aоÿ %𡌞ԓÑ2>\Æ}'0gôåLäæ2>žÑýÈ=¨"§W=ƒ”êÕopìg?VzU­~‚Ÿ²[#¡ñ3üœQkmÃ/ðKBÃbù~…_3vkpâ7ìñ(â·xŒ@Ñ…<½ÿã&,Àïɧ¾nzñ_øoò=$]øÒ¢2ƒšçJc\þ¬ð¸,Á(Ãeã÷¿H÷ÇÏ'ñgò%‰~ü…4>/Å_¹j §Íø?üï£&µ SÚÂ!Úþwºãû—˜ùö7Úå³pöþS‚Þ¶ee‘“˜ÁGä$´ð"‘²hËÏHb‹ÎÊŒým>%#§dV¦®5+…ïG˹8„eaYùÄʼnKÚZË’j»g+ÛÑÀ_—Vy¸·²’n#íÙ¬šÛ°ÏÁn<}xö±ÚùÌá8ãú?WëËý¼À_=*Ë}¬-øy Qëï0õnf¤T®Öa¥´J›‚uY!é ”÷'¬°{Ù2ZxÕ}˜?Ï_Æ(¾Ü?·9à¬ÖWAp%×ȵŠ[ 8Í“[ÙÙ¹ü6.ÿ¤´ŸÀšåJûž³ú~,ì ·G¸$–`N[SäxD’ugdàA,ìSËNÁÉ'm»GTØÂ¾IKi Ø| ¼†f¼óð:ÙlÔ;Ùxw`Þ€M,“±0uŽšÛéÉIØ*Ûhî<´Èu~a,ÀRéfqG‹ð ÙŽ:¹¾r…”?p;XÈ{|›èñX¼¢~,Þ2.V2z¸ŒÆJd§ì¢„È JRvÿ?PKÖgòÆ› PK¯TU;1aQute/bnd/plugin/popup/actions/VerifyBundle.class•WYsÕþ®f4mÛ`„Œ<Þä…‘d¹Y‚1ÙFÉaÌX6ÈHK 5s5Ó¢Õ=ôôÈ6Ùgbv0 Ù¶*\E$„ 0/®JÞB¼ä!yÌC~CÈw»Gûx¡\ê¾Ó÷ÜsÎý¾ïœ{ý÷ÿ}ø1€[ñ®†Nó¾ª/1§`”íjÑrŒ²[®– 3ï[®S1†¥gŸê«:[jˆ ¬Ÿ0§LÃ6¢qtlBæ} 1®W4dÞ¶ÊiT-#Îõ^ú¥-‹¦/šl7o޶?”[º(ïzÒðdÅ­zyY1²‡,[¦b=–cù"©öahÆ-È8"X§£ qks–#«“cÒ;nŽÙŒÑœc {Øô,õ»ö1ê—,ÆìÊ}…í2zÄ«:;SË27ó²¶ÂȆ[L·7A`ƒ kÖ¢ ’WÚ¡ŽMØ,°¶(ý\ ¶T{hªŽoMJ#{ÌôK鵨Š5lØvyKIÜD}W…#}ô0h¹F±†íÄ,„Å¶Æ ·R´ŒÃ¦ÇNܬa—€¾Ô^G í4'é°eÞa ‰!ß³œb:Ž6t*†v“çÔêùå)´kØ#к"‰€ K2“.Ü¢œÝJ›Tnuªt ln×ñ5%‰ØT@¢ú´WÇØGÝ1ÝÏs=j y>áªoÙFΪøD³=Hø5Ëgtìµ­XOÊ@‚Yåõn½Ê«bmÄô!#pýâê^Ï3O)qôa@eH ‘Z9ãÚ¶œÊàYfþf¡ÐkÛ—10Ž5Ø´JÐJS¦ïz:Žâ˜@œYöËq³jûT 7éiå÷~C8.Ð(`ÜTj%\ î6 ëQp7æm·".¤ñAR´’í¾ªe¤·S-#%2ž â\òpïýÉ8FñMÑ£¬ :jQñFaêC^ÁS.K§Àb^jö›ôj-Ö¢§• ªw\©wj¿%µ_K ã’: ¾/yî ÕL¶Zñ¸“¡´Ž™žtˆn{ÝÂ]¬øŒëø&û•GŹxBC™Íåªèð@íêžçt)hqF*{¹Fá¹EWŽ¸ì ®ª’5¨ lɸU»t\?YñMÏÉ°Âæ£áļŒƒ]œÌËrØ•baÇc{ºr7DTd&ÇYUËë•4aRY-õj™ìLÕ Ÿ°Òb¾'Ð,j9ã.ÚJu2.kuC®Î&8wÃòÓáTyþ„رÂOÏj5àúõY+ÃL‰S’:¼÷*އ:S–Ãç|GÌlæ3A˜7¯Í´ÚŠNlãª$Ò¤b€çïQ¾‡°&vÐ~'½ÝŒoñvö}´ãÇèÀÏ8~šã±/ót>‹=8Ç÷û¸é÷söoLÿ¢WÅËä’Ø×xQ£“ô©þž¤çæð&¾ï0ÇNLà»øùÚ‹GñäÓÄü?BŒÑ¶â4sˆÒS0jÀOj̇V?¥•`†?¯I'GŸ¥•Žô‹¿¢e¥~zèig2´\È3^ËSžÁ¯köÏšçÐ:Æw¦ó"îîüg^Å]pæã<÷Z#{£>ßÝ8–® ÑÓQ‘hœÃËÐ:¤†¿8ûåºÞïÑMHÏ®ª^èclD?I ‡pßqgéÃ/¤› ’äAÂÿ‚½ß3Ý$é~„>vá„:Jj·ô?ÖyàÂ/jn©mï`kg¯X€Åà¬ÄBp±€• —oq…ÀÛÁÊwþPKšÔwùPK¯TU;/aQute/bnd/plugin/popup/actions/WrapBundle.class•UISWþ „Ä`,6/X10L6a0H&Q,ÀŽˆˆí,5HiÈ0£šœœýR•ÜrâjWeqR—sñ!·ü‹Üòâô< ‚bH©Þ2ïu÷÷õòZ¿ÿýË3oâóZIí®ç uÝ,«5ëè¦Z³j^MÕJ®n™ŽºfkµÏ,"‚0¡kSÛÖTC3+êÊú¦(¹´†-»¢Š’¡×¡zºš«ßÍKYaˆŠæ BÔ°Jš4Kz?¨T²l¡Ú±<»$5·¨"Mh›ÑMÝ%„Æ’EB8c•E !t*ˆ"F8×M±ìm­ {U[7£;ÏFQ³uÿ;8 »U1Çó'v–±C¶g.â¹¹¡•D ¯æê¦“Å(= "hoGá̲å&r[5Cl ÓåÄ=á¶c€Ð·º’]Iè{7‰¬éf%†s¸ÁyÂèQ´²®VÅQ—„ãh‘•Ÿ q‘`Õ„™37,{KF–°x˜°³ãª;z¹"\G-T…a¤óû),¸6ƒ79IcxC\"œ=4ßím͵løLˆ±õ¬ØÐ<Ã% Ž%†¹¡‘nÇ(a cyF9ar”W³ÝĪpÜDQ;>lRA ã„VaÛ–MH½’òjÕ¶vü<3ë&8úûw·–D­—¶zÒ—ŽO(t9\==ù&Y¦ËáÊ– ™*߉2áö ª¥‰Ä6{.l.ûžE™» ®á:Aáç÷OS˜fFNôÈ¢ ?#'3Á ÂÄ‹r–¼’ëÙ¢ÜЉas nbžß££%ä£ÎE!$Žcé+ßR°ˆ÷íº+l¿–½\k27ž«j.8Ow ‡Û|ÀÝàè­‚<–˜‚)rµÆ÷,hiREÁÜ%Dªš³,E™í}B‹ÃñW_¥&®ûŒ’σ8Èñf¤Ù›Ã­ëËÚ^ûºÖD~æøÌβÍNGÈ6¼-îð;#dÿoúÝ|Ͳ¿Xf©êÛHû8Ư–K²nóâ1 ,^Ä|Vܲö»ì¤ï¿x.Vð{(Ïþž;<Ïü¥òêßµ¦~‚ò„7-8Ås›<<Í?@©   ¯ñʙǙ@ùk6âu2õ=â/ ÝØÅ)êîíîгZè¼þì»—í¢sé)Ý#W~ÄØi/!\ ЙÐËs£ Îë.p ÄKú,RûH 7)ÉGYö þÏmaé(ÞÂÛ¼#¼ƒ«Ç|À1–J1øÔˆï{ãe½1‰‘¨K60b†¿›FZJsÓ,ÿÁÒm¼fÆ_àæøo˜ù×ÇŸcf‰qfÅÂrh*ÌÛìtë.â=áGahýïžc¡ào— ß¾üsâ1=f3!Ii„ɀègçα{ÃìÚU^çØµyLIº³uøÝŒ$ÉÝ“å>Déö#‰UÎzˆmŒà#>sM ²Í"'t-HnýäcY÷p?poNrâ„ÿ»*¦ÄŠàÔˆá>‘YøTj~öPK¼‹œv PKÛA‰;$aQute/bnd/plugin/popup/actions/repo/PKPK¯TU;4aQute/bnd/plugin/popup/actions/repo/RepoDialog.class­Wûw\UþNf’™N.é$MC_´i‹%™Lz[-¥mB% ¤M§&&<Ú;“Ûä¶7w†;w’EÚ‚ ‚ ¨(ˆˆ¢´*­db¨`Emµ(øVþr-põ'õ;÷N2 y4®e×êÜsÎÞgï}öþö#WþýÆ[¶ãýжjÝYGWÖ€š6³ƒ†¥¦SélZÕ’Ž‘²2ª­§SêAþÜnhfj0¿@uÊTõ¤i¤3ºz쨖ÔÕ—šQ=._"c ¬ÍäÌŒ:ê¨10¨;õ~ÂiŒèv†z®3¦T“1œ”=&°aÁ«1-¡›¼«ØS솞YìBKj8‘âß1ͨŒy/6„šÊ êšMb±+M ;¦hjÖ1L5fd¤‘ËâÆ ¥9Y[Øùrc¬à¿ŒnôEá\6ì¥ÿ¨­¥éº­lÎ:NÊ"gI£aÎ^¶š™ãCºi6Ì÷’š_Û#`þ-ñ¡R¿%5 ‡àÃj•X#°éZúk{BX§à¬'2ºãžÇ1“>÷×tÔö,#Cµ×ÉÕ&eX.°ŒÛôuLKeÍ Ûã±0NÜ,pâ©ÂÜ"#¿Kথ<1Ý= ‚X&o7*¸{=ãšSYk€± Ôtð_mO· „ È“üÍ Zp;yÈ/ ‹Àʾ¦f ªqÇ6¬A×ø¶EŒwËD­¸EZÓ¡ „R¹m Fp.VÉBØçÝÚ¯ %rÛ(·PÄ!–f¾ÃÔ«ãcÔbÉê.mX‚éR–§ôx¥0€³p.^%BèõôÝ¥ +ä¶1ˆ{ ô^V¹m– ¥)H ÉÚF¿dY||52=K)¤ÎÍÌòù[æCÛÜ# ‹æ œy}Þg¥8…‡8MÂ좫àa|šª [#Úé‡Y¯êÈŸ7”â³x4€Gèõ¹TŸÃcĆå¦FeÍLÓö'ŽéI§!€Ï³¨^»Â—âq<©à xŠV%5«×¦i.°ú%é‹ ¾„/3é³µM;¢_QðU™³>m`@Zÿœ‚¯I¬–ØúpjD—G_Wð‚TÒ2]n–µâEß”=¢$£›4\Bý%߯wB¢¼Õ’Õv@öŒ~ÙTöá¥^Áwx•ñ.Òz"©§eÍWð=©uyš†9qGK?dsž‘}dŽÙ|òð4jW-„YaÈ)cž(ÉÜsÝ(pãRÚ)EÑ’•±yì&mÏ<*–<ެöÚ‘WN2m)Û[5Ë iË’úkö$.ð†@dáy°ÃkxìUG³&ÏOp–ŽÜ¿ïp¬©¹5&ËÔ[ ~Š‹èfÚ$з¤Þ17Lý ·ÌüŒ%-[ÁÏ¥%JKSWKk̳† H¾Ž_´:nܯËÙe®¸AÙ!#™Q¤ˆ&Ïåy*öl¦.áײ)^a9®‘ŒsuÍy·PÕÂ'Óà]ïáw^á‹»™@LtXú 7;dEùƒ‚?âOÜ“GvÄŽyòž£§E³'žÊÚI½ÍÃÊò ´UÞÁF†ÉÇ¿ø'ƒlp\ÉÎæ~Ù´Ý/Û¥ûåˆæ~9 ñVØ]—ó?×%<«ÄJî=J®ç÷W~~¯ÔM`U¤læoÕø[ME)xÏ6ãFžF<ø¶îê&ÔP\I£ŠÜ•4ˇZ®•<­ŒR|¼Ë Š'4G¼@ùRÖUiNô"¶vFEÛ"°£/ê›ÀÎq쎼ŽÝá`8XŽërhûŠæÐD®Ö¾h88;ÆÑÎãör¼RR.Âáõ9ÜIê¾¾hyèGÉ]$‡7Kúº̦w“Þ-é-Sôiºê©½fJ{}EœªgÛ ÄyvõºÔ¾qôSn¹86ÂG¥Ø»å¾âžG&p$úšéï~zˆ2Äõô“еØF/mçÐű 7ã vAÃnØhdoÅÓ¸ Ï£ ¯’úCumDþø KñûˆáïèÄ?qÿB·³n<¯NÇì* 3 Ëð媈ÒV`{e­À»*’sM>VÜI ¾'b¢“ÏØƒÑUÙ ˆ\çªÈæ0«»„RéAûiQÖõh'q’ÖÛWû'ñ‹x|OñêâI·—àì#|û™Cwa îÆ:~«q]z/ƒu;q„9Ì h Hítfݘ MxÇ9ZÅ”ú ‡¬—qbS›ƒ+Èâ]Œºáig–Óµùðá2Ãu––ùñKRκÙþ&¾ÐÆ8ò×HK0)ÏáCv&F…ÄÀÒ’Tý¤¼ýâÔ¢²ÌäT}ǼĜʪԢ€œÒôÌ™Ä&ÿyyôSyË]}Ã%atñØð€BœR²ÕÎhvfçëûãÀ=æ„ý«Ò¿«–å`+V;õ. ‹½>hå´7j[î¹ „yËa'uÃ,·„ëUÞ‹b°N=ëf}ûFÖx¢0ááDð˜ÿ›A¬7ësfÓÛLSÖ+7µÂr•Ÿu¶4J~yõ'è/&E¥â'ëRòôØä®sèfŠ]a˜pÖ!Œc’ötÒ3³PK˜UÞfÎ%PK¯TU;#aQute/bnd/service/Refreshable.classM=Â0ƒý 4P–^€½]ˆ˜Ù™ecKÊkIU5Rús8À¡ ,x³ýÉ~½O;¬"ÂFÇ¥în²g7™’eÁ•ãþ®tËsBÚ¨IÉVuµ<é†Ë Ü!̲üê}ÍCa­oÒ,?~ycåÁ´¼'$;º’ƒóýßú6€1Á¯ (òg ħKŸV!GòPKXÛ¯K”¶PK¯TU;(aQute/bnd/service/RepositoryPlugin.classQKKÃ@ž­±ië«ÚV=‹‡äââA*=HñPÐÓ&.Ë”¸ ›MпæÁà'´’\º‡Ùù¾yÏ|ÿ|~À1ì»Ðbp îs+y¨_y&M‘ä2M2´‰ù¸‹s…Ú‡A* Ác¡¿ §2² V”$yâM¦ÀÔjÜdü—ŠÃ„_a,Ç z—ï‘L-&:s¡Ë`°ˆ™[t"¡Ÿ ZIå<ÿ™dšSÑCoRõcÈ“L!¿fì×k81f•w³¡ŠÊ-Æ|B^äÝ PiasCÅN—9kºœSšN!MVŽÅàb©,óIÿ åÕ?ËçÒšoÄ55ôüf>Údä&’åÌ Fõë•m´:(_›Ž¹ mÂ.!‡þ1=XƒòÌë°Q³lÂi}bZ°Mxçˆt»3fïPKK7ß$<_PK¯TU;$aQute/bnd/service/SignerPlugin.classMޱ Â@Dg5нµzX§´TöI\Ž•ã"—Dü6 ?ÀOuaÙö Ìãy»X ¢A§ûºb•Ù£*Ù]$g•ˆ¶ìv¦ÖbC„Á)½¤Ê¤V«mvâ¼"¥‡³Éæ“7’©¢Ô¢–µ˜#»xóË$•«ãé­®9Ÿ+)l¢Ký¨ïÇSIQ»œ×b˜0ü¯3óm¡‰÷o×BÛûлÀߎßÈëz/PK`]g.±êPKÛA‰;aQute/bnd/service/action/PKPK¯TU;%aQute/bnd/service/action/Action.classEN» Â@œÕ˜Sc!ø¶Úä°¶²Ð* °¿\Žp!$’ù6 ?À7 fa™vfv_ïÇÀ a­®Mmd”Dz2ekµ‘J×¶Èåá a™ªVÉLå‰Cnv&F•ÄÀÒ’Tý¤¼ýâÔ¢²ÌäTýÄä’Ìü<}¿ÄÜÔG0›…‘A +±,Q?'1/]ß?)+5¹„‘A§~ˆVFöôÔYŒ "š>C‚KŠ2óÒ­¸‚óK‹’SÝ2s€j¬Õ)ÚÁÈÀ Ĭ@W3ÝÁÎÀb1pI&.PK¼.ÁÞ—ÐPKÛA‰;aQute/bnd/set/PKPK¯TU;aQute/bnd/set/Group$Path.classuQKoÓ@þ6vãÔ5­KJú „RŠ”:€Å hB•xH¯¢z['«d‹±#?"ÁOáέ$ŽøQˆ™MTËÎÌÎÌ÷ØýõûûwpÃAE`C¾* FI?ÌU>ÉÒr´÷RC¶€*Ç2Œe2_D§ªWÔd"ã÷T&°Ù™.Ç: Ó| ÃG³Ö€=’½·;Ž‹L'êÕF™ë´Ì¶:óøi®z¨]<xÚš?ö/Á\Uû]Òu”ö• +–à X­ýî"H©‡T9[ó°—³†5•ŽNÔóò]¤²72ŠûJ{2îÊLs=»´‹¡Îõb(àŒu® ÕØnÍ—tâOÓÃel ¸Çi™õÔcÍh®1y›í xÏ’DeG±Ìs•;¸.PÿÏ‹7¿ vÓ¢O¶à³)Ê|6b"Y£X¡‰%xt^ *¦Ú¦¸|Ãrpk‚Õ =A=¸9Á¥ÏfzÎawiò¡ÜÇ2PÇ!6è6˜îcÓ s¶vÆ3WLÆZX™1¿¦÷šÁ¬¶?abý'|í¯¸ò Ö™}v®¡j0ÎÆtóœ³iðÝ^5ó;¸F‘Uìbµ?PK]Yâ‹ËûPK¯TU;aQute/bnd/set/Group.class•V[WWÝC  ˆ‚ZT@IˆÖ%”ŠŠ Ôb¡hk; # †IœL,ôÞÚ‹½·íÈk»–©«]ö¥ý}èkÿBÛ}ÎäBBXµLÎw¾ûþ.‡ßÿþéGñŠ;ô«YLjĭ¹HÆp"ìT6­Â«`·ËHšñH*3oF®Ø©„‘ɤlõº¥'W^7ìŒ‚æØ¢~Wd3‰™'Jö”9oéNÖ6+ØC± ³#ySÑajªÆr:e;4Û´AoBO“7Y~3ä’IÝšL9¶iÍGÿ‡+á¬vÈ´LgXÁ¾@¥d1×hï´ïÙÔœá‡Í44ªØNØJ¾Fl[_ýhA«Ù©À讇‚]|¨ù˜–1™]Šö5=ž$2Ûc©„žœÖmSÐùK¯³`2û±*U!§uÛ°[GLßúÜœ‚–€‹‡™Šœ7“†ÌÄ?ºœ0ÒŽ™²2*²9*º\…ùqÝö£ ‡Dv~æÐðz™ß&ì(*}yu¶Ê¶ò T„©³E]ü¡Y|Žhlϧ™.sVúª{©v)ôk8!Š æû´§ðŒŠ†SÞ""‰AÂØÐL—ã‹F‰ö^WÐZÍ‚ºBû+hß²ÇHÏi8-â¨K˜v"›ÔmÈ gqŽ—¦cغ#æ©-л¡wÇò÷ÑœÇEXŽÍ\ cgÃXÆ2û¡µ`ac Š˜† L²òó†3Z®–2b¼pÏ«¸ª ±Œ¡a ×XˆÛÆÊ”áTjòŠšÓ8£b¦L“ ³\•3*Fↆzø…Ç—5Üø7$R–£›Væ’±"î_Õ #Κ>U«NµlçpK…QðZšÍŒ†y,0 =#Š® 'pcK“¥E&"YÔpIF’ÎRo J$O›¨¤¥!…4›rAÏLÊ¢qG\WaWmÙ´w_Ñ…:PLé÷ãîŠÑ{MÁÅ@µÝ ¥£UVâVíÙ;-tEÃëxƒ½èØú]®s‚þOû%„Ęפ+¶µh nS< |iZ¢J[ùú[IV`W¹­*{^,ïîM˾ªØÈ“gSÕ‚Xâwð‘†!<+Æé¾†O ã4¶”'¯H©´“«¸¢Ì-;µD½©TÖNb’ý­m̲ ûlRÏd aSèákäác]Ã?>#¤TIÕñË*Ò ’Ç·‰ßm¼™ –Ðié ®¡©ïZf×°ãG´ý Åwó»M¯S=š©ØNªÍUBöò´ûh\“äíçÉKú€t2ʳo¤ý®Y:êYÅá’¿d6ÓEËãEãèC0o¼w“ñ%†'ì|„Ðlßú'BÁUDfB«8Ö÷m¡uœ¬ÁLÉ]3Z™ÍN4‘Ú]4¼[ºÞïš*ºî¤ë(]ÕSŽ…•ñÁȃwŒ¿",_ß*†+óÙÃ÷J£š+T4zº`@1YZÞü*]Lj‚‰²ŒxTÁc„bLäÒ:.ó_šð:^P0èË!ÖîËó_ôRïz»w/Õà[ì)P¯Ô{*è&žC‡{ïý™y‚S‘X‡éÁŒ0ÄNûîŸïCùÃý|ýcÅx&sØ.Ä3ÁúÝ™U¶gBkÈ2¶åp^G&’åÓ.¨èáJ;Äõ@–ô;äÝç||0rèÇó@ »`äÚ…‰¹(ôM¼‰·èa€ôÛ´á¥þQ¼+›9ÇÖqkó^¾y\ù÷)ïJÝ“àþ"σdýþÌH<ø®âc µ ´7‡sJèI`¸ì ¯Ý÷z|DhPÍ¡©]-`4X+Ε¿„yzX§Cæx1^ľÌ'0ŽÒ:ßOÁqÙñb³Äñ)>“ñÇe¾"»“õãsÞùŠ™»R÷xryuäÕà ™ó—øJ6§Â=¥™ºPKQ€©à PKÛA‰;aQute/bnd/signing/PKPK¯TU;'aQute/bnd/signing/JartoolSigner$1.class…“[oAÇÿS-Û(µÔk‘-—¶[¼ÄÔLjÐh 5&^2,ÝîÝ¥ñùܤÅÄ?€Êxf¡¡$l²›9gÎüæüÏ9ûçï¯ßjxl`¡Àß Caw¼®Èž'½žýŠû¡Rn‹Lákâ ™¯ü˜Û.§ívß¼Ëû2(î¢9‡QgX:ænqà+GÃJsŠ{;vRLâ©ôdøœáIi.q |ÈßW]‘ÃU WЫ´‹&bX¶D–!VÒ¡é¦ôÄ›áQGømÞqC¶©îr_j{âŒk• ›ó2*ÖHAÌz&nà–› Ëÿåhá6î0¤z"<ððR)ÖJå± ©ì uy ÜeÈϹÞÂ6 G¹®pB†ri&±|¡pä"N]'|ÏÂýó̾¯üq¸‰*ÊÔ±é±ÆwG B©< U]Îô€0Äçη¶Ïª£wµ9ã•Èl©¡ïˆ—2ªø% »úñžãª€R{-¾êZx€‡Ô­›aç|6\Ù±UГö‹¡t»—Gb¢L·Ù:ð½ïò öh b4ý ™Œž “ÕÓ¡=ô&aÒþ­ž‘­ãÒ•ê¬ÊöR•ŸÈœD+ô5£$pV­)«ÈEþ5d'¨€"uìVå”H§Hp}„õ÷S³¨ÍXlVGØ:‰@ë(PéÇWå(Sà#Á?‘÷35ú 5‹G׿Æèɵˆc;‘ÆÝ(U›ƒ¼yúßEi³ˆOÏ?PK_ЄhAPK¯TU;%aQute/bnd/signing/JartoolSigner.classW x\Uþo¶7™¼6tÚ´*%-…N2M¦±é6)Ån±$M“Ø‚•—™×䵓yã›7Ý( "ZQT‹ îÜé¤ "‚ Ö}_q·.¸Aýï{/3™dbýÌ÷eî½çœ{îYþsî}O½|âaMBUP"pž¶9cë‘d<’6“Fr0r‰fÙ¦™èáR·” œ³CÛ¥E™›vè1[A…Àì1[uk—Ó#]‰Ì ‘Tà˜;‘ëjte|;õ½iÛ´t@{þ€Û¢-•ÓÞ›¢@YJ³‡FI)-P¸Ý›ÑðV#A±ŠUFÒ°W ”†ê¶p×:3®ûQŠ*ÎÁ4fRÅÍJ;vT‚.¨Pá¨n7’zgfx@·zµ„c’Ó[4ËkXflf=J;ã,zhu#g~¼} hêœn˜Yh*.C¿ÀÔ˜¥k¶Þ«§Üòký/!÷0äéj‘g\®â Lã)q=¡Ûú¦ä†=†íÇ6\©àõ¬‰&«Ð0 P¾Û2lž<-T¨´n‹‚¸À¬ñ‡{añ#†ògPÅ HK¥ôdÜÉÒdOTøí$|jF;Y­Ãô¢¶!׺H1™KGDv+®ß—ð(iGÂëb\gD­ŒËn{À’­fþÖ ¤ÍÃÐåt¡‰VµH®R±_nñÙ¦K•9 â\ËpÙ–c¸BE¼¼¼Hµoñã ®Wp#œçvg’¶1L¼ 7ÐrÚæQdok–Gn‘ZnTñ¼•¸Ò÷è1…g‰s—[`ì.ocIž¥Ý.hòãÞ.›ü;–‡ÎÚž‹$}}'Þ­à]ݬwˆ«¸E³*ý¼«8‚»˜[-_—0Óº,èðŠì„Ž/ÛpŠOà“,S&h½a1¡¦å\EÓF“”kª>|šZ;6ô®ihël•WÁ½*îÃý, â¶GÞ…›Hj©ÂÈ*8Zpé¡bÇ¨Ž…ii¶éu¼H›G§‚xPÁIøD®Š‡ð0á’Ô÷ØãáîÁÓ‡GÈi¬¿¢1´¾gÍþnþ÷´îïh­[àÇ"<ªâ xŒ¹ÖìØô»¦æ¶*xœb\‡éÖÓfÆŠé2ŽOªøžb§2ö(] ±X¯›D‹s½žÀ—U|_¥ECZºÓq‹èØ*xFÅ×%Àjx­7;M»×ÌĆ:´¤±]OSNp,“]"DŒ–04ºYºCvúÅú<™ö0/Õ©…ÝR $Ífœ´Ïq_l˜ÝQñî=ÞFEJˆ]Ë.|˹ÕCF…ó䢆ҸAãVý¦ž,”òÂVbf"AÔåáß–d~¸[׆‹tl6’çÄQáµ™íÛuKwÓ<ùÆý½/¢Èeûñ<~-‹ð7Œÿ$²âžÅï¤Ð«ÁãÿQÅŸœÞ,£"_œ•ø3þªà/…(Þ%ú°Š¿áEÆËÌÐÍšœ¾.:3z¨ÿÀ¿üsômPÈVño¼ä¤Œ¤Drø;vQœþ“-Ä/JpF¥cÔŽq•X‘÷š¢a ½VÜAiñ@Ë×P‚~óÖèqÒé¾ݹQîåÙ–äb]‚W¤žÆ<> KQ‚rðÓƒŸ/|XBþUy£êS¼qª7V;c9w󀿮.¢!÷Ö`z} æ(fÝÇe ‚ÎÆRþNGfrëtÌq”;âx^ÉQà\Ì¥ôyΞZ©RLwŒîæÇü^zg*Á#XtáÀâ1œÅyNS8°d gIžÓ,ÃY–ç,VŽá¬Ìsf…Ñ1œhžÓ",uœ\Æ8ÎTÑ•9tæ:ÓLW.fœ;1ý¼†°iròâ&,Äí¨s‚1ÓuÔ †œ]„Õ ÊŹ@IÊ«9Xƒµ^Ì—:Áb¤ò‘®p„Q*rJÖa½£bZÉ{ ie\m”ÊJžäœˆ}á,.é tº¡7Z,Ëbkƒü}ÝIÄúG G˃åõ`VÛû86>Žš`y`‡\:ŒFÑä29F“ÇXî2’9ÆrÑì2R9F³ÇhqVŽÑâζ;Jóv’¹Cû¢á`EéC(Íâêcxc°"‹7G•“8Ô_TFpSÔôeqsPÉâ=}ò÷ý‡1%ø€»åƒ'±­?X6‚D+ÃÁÊ,>&î|ÊÃÀùQП8ŽÏ DÕ#XT㸉V«ŸËâó‡1³!Xô«¼}_Ìâ‰>)ø´ÀmgžiÈâky(ÝÃOF Â[ÌÚibÅ,!})A´Œ¹]ÎÕ ´`%ó¸ íF/Á²ÀÐ afy7ó{€ù½¹½™oœ[)u':p7ºøÙŒÑÇЃ§ù>…>üßÏ §ùÖ}q¼„í¢ƒ¢š/ï9HŠZ¤Dߨ°Äe|Yïä<ƒ]b/O’HÛG9£Hãì¾!‘ÈÙ7Yñl1”ÿ¾Mÿ¦Š¾ƒïmó©ë{ø>½<…»ðÊUЊ[hÍØNãFü?\‰Ÿro%mhÃÏ諟–œë´§ªÑñx?wZÓ/ðËñøÆ£<§œãFÆ'ñlÿI<ßÁ #øm'Sð‡hÙ̾§% þ¾HþnïséÁ²'μÀéËá¬×¾{s5×H+d |¸ ³ù¡0W³ä°´¯aþ®eήf¶ÒÒ똛ëˆ5»¶äjs£(²¡úXä2&%Ô´XT…›‹zá£_e(•òTáòD?å9»ñPKж ’k €PK¯TU;aQute/bnd/signing/Signer.class•Y |[õ}ÿþlKO–_.9v"È¡–ÉWLN‚±Ã‰í˜8säÙz¶•È’žœ(І¶4½BŒŽ£¡DN0ÉXÙBGuM7º­ÛÚu[×ÝÙ­ké÷ÿž$˶œ‚?ŸèÿÞÿøßßñyóW¯œ°RÕP"XhÜ¶ÌÆ¾X¸1ŒEbƒÝͤ†²üj4Ò×O F»’ñ~3•Š'ÞŽÍ»7µunimÛ%ð·ï7FŒÆ´‰6&ÍAóPc—aYf2Ö$¨GÍ”Õi ›)Ae¯³5j(NV’ ¹G?`ަ¬xÒ܉š‚ÙΞH¼Q½sÝ“0R©ƒñdXà+vÞeD#©{6ôG#±ˆµQP¬Ù#(k‰‡M|¤©äm À½·5ÞZëÅ|Tk¨,˜At °P õLJ¶T Áé¬kfT¼‚Ët¸àÌiÄÌÎôpŸ™Ümô)Z¾öx¿Ýc$#ê=;éÞ`ËîE)–êXŒ9Þ'˜;•©WP½ŽÖµŠÅ•:4x4üXh4jhŽœY½XŽ:E²^PUL=ŠÖ åðÒhÖP„Ƽ¬}&lÐâššÙn ‚íSPÂiRô` ©Ó4Ãà DM#eâ13àÀ!`DãɈ54ˆõ˜Z3’f •0û#3¬aÝ$íwöí7û-/]¯ã„èv3™TX Q©gÎIʤì°Aǵ @æ šÖ¦¾T€9”r šN ©™ê¸÷ÑçV<¯ “S°¦·ÙƒëùŒÞ±©³mËæîÝ+:¶hx@°tа›™yÃa3¼ËLÅÓÉ~¦ÃÃ8¢ÒáCŒ¿`oóv|èø0>B†”-·•Y±˜¦0ÈínªÙ«lø¨ŽâcL1Ḋa¥s•íê÷½Í¶Â‘\^áæÎÖÝ[¼8†Oiødãy;ÌÑn•st|Zå‡ÙÄx«9`¤£ÖîÑ„©Ž}VÇq<îÄS[,e1¥jýÌnmBðD.fóe[¬|Oà)eáÏ1Ä‚“³ªSlžÑQÝ‹¾ ã‹ø’íç–!#Yàç%êoëx_æD4n„UÌç©ðkêmQ>|ÏéxÞ†Q4ž25¼(¨)®À²®lOÁ¦Æb²Äc^¼€SJê—H è<†—uœF†qK[mŽYÉQ;fˆÛ"lò仌$K»ƒºÌ¦OÓž,Ÿ‘ž½ùnoöàŠÕFõ+Pf XCf Qæ’ña{r02bækRP¸WuœS()¬‡lb†T…ù]U¤^»dëS¤6yð5–„šÀAVƒlñà÷™&ªþႎ7ðu§jLhSwóJO¬’蛪él]«¨îêÞäÅ7ñm ßÊa0&q âtIÙ§ŸiRdÿXÇwq‘Wí˜Zbª Î,™BÉ7ñ':þo1Ÿ¤aC¥Y¨ÙYú3®Y™*­ü€Æ¤H¦6üg[ÓJº\4ü5;æ é7ê7 I´å~Õ{Í/––IÈé± +ò’K'*;œÏö g*ªaýZÚ~ɺ£øÇ̃¹Cjù—ô²‡ò¥ ³aveáL †LLÆ:;½™£lÒN®Ì¡¼ Mäo*Ó3–RŽ^«j/bn®y@½lf0°7È+™çVgÜg 'Öþ7çfÊEb±|ý9~¡òш¿¤¥òÇö˜É V®¸j–Wí{G¨öÞ•Pç½Ø-%º” /qn N©c-aη.šxØÆ¨FdçÓÍ»j?›< ‚¯ÁMCÎÉ„ªÿ‚ 4ö)sÝšÆf{ðJ…ÌVz¼EIe.wʼ)‘|‹î‘J¢e¹xü*xö9€)§©LI"•÷Öd«)Oü×Fy¦4Y\`ä¶ùV~YªK@x×Ò™‘rµ<¥*Wa#Øa$š*ä ¹R“eL^“tY.¼‚yL¾nÓšz–S<[#ušÔN:Ë]ê¥AeVÃR÷™êIgÛ²ó$Ð(+5¹Š˜¾ªË*YÍ3YSïYãj²6g‚œÜNÁ©5rµ.ë7M@ ó~,!]šdA2lXýC&[]è2U¬»Í;ÒfL5>Ó.ÂΡ&¯l”ë5¹®ÈM;»Eû†•e“RølÑ¥U¥LUsí<á•-²M“­T­X©ZÜ·<²ò« ¡€R©]—¥’"b7ÜšìœÒI½7¹A…Ì.A(øÙû¿=*òv“ îóÈFy6T”Dr³.=¶ªCFªÓvTuñžXÝmŒWÕ^ÄaMÊÑÔ“ê™FX¹¦zòöyÙ¯ ÍÅlx=íF¯Sútéö_sâ¼®NJ© ®Í… Õ+2¤É`aØM,ë‘ýTƒÏál±lS¶‹²Ž ©jœikSßp$©éLÒ1Db…™`rN/c16ìÒ{§©È§Ù/C+ßEW0Ùç9Ä qwîëÄôïáµiY}€w=çB­®ÿËÙ ÄÓ±°J–wOëï:ãÝÜŸ/Ù¥ž†šV÷fÚ­¾·ñ"ß•ÿ\æNe¿ ¨éÙŠÈH© »ýÍÌÛmÒ¹ŸT8xV(nL‡m1¾´DIÍd=ÂíR}+ݘ}Ó{k"gJÖ„w­Úwß5GEfñ>^&J¸àQ_Û þ4>«¿rxí‘7 {œe^®ÎÆž›Ë·Žö^ß¼3¨ü*ü§øR‚Ëí%üÏí•XdÏ‚›çÞH†êðÒÚ1,©-;‡@O©ïýݧ±¬vË{|Á1ÔžFÃAÊø[Éß*ÌC5–d ë4â*›ÅJ¬rX”PÊ,¯Ö¾ŒeP¡†óÇ1«Ö·ºôÖfp5g.`®2hÊàºã”g-=¾ÍcØêLoË =»ýgºÞÀìZß®‚™eçÏawG­zªÞº övòÜ>߀o(ƒý7#Ñ3†d¨¬Á_–Aª¶ÎÞé/ÃA5q—ú¹'äªóÝ?ŽÃ=~WùÌàᛊ~×ކÜu¾Û«îÜê|â >Ò$äÇ=JÖ1<*÷kþr¾<ý49 ¯zÌàóœô—gð;~M©0Žz² cøJ_} c!ÏI„BåŽögóÚgpÞ÷{üQçÔóëüQ¤ Íâ÷dð¡rßžÁ7B^¿W­‡ƒ;ƒïù½|?oƒŠ:ß_ØzTPçœ*'±¨Óáû—ä;ÅäÄçÛljð6†åvy†oûä)5fqñ·XÏßË ¬Eð ÄÂ6^Ûpº° {q%zDµæj+pVãÖà(Öâ³X‡'q5ïÑëñ®ÁK3؈q\‡ó_Çõx›ðŽßÃü€Ô߯üíø{Ž?E~N)A‡¸xô¢KtÜ ó±K–ð¹ÝRÇìÙ…åfŽ·cìÃÍ2ˆ½cÿ”Æ­r7n—û1$FDÃ~yœã38 ŸGTƳqþjH,gq®žþ†º ¤úCüˆÖHÊUø;ü˜;"—S¶`¬|¿Ä?â' ¶×)õ?ñÉM . †rkœyÿŒaþ×â_ño(§¬kñ3ü;ŸÑ„ÿÀò)F[ýþ^J¸ÿCÊ”m¡½¯”œ?Š91'ºK+úqü¼GýÿB.¿Ë÷ÿüªtû$Úê«Ü«.à:54dDBšß¥0PÇ÷3BÐo­Âè<¡À#\“Š¿6&³22Çïªg»¥Ê]þéw2v }%Ÿ+V0kž.GŠ)ÈâÜsÝA¢à³Ã(:q'nÁ]ÄÄ­{mß]ŽÜ9ûòIeB•[,úòGv³¤Š,%ÝRmÛw>öÉYH­•¯ýrí» «ØÃü„çKÔ÷@”ˆ’©Œ=Ò"ÛFÏóYÉw±.#KÎÊûg%ÈÆ‰V9ãwŸ•‚×d2×YYÇgBÚKðûµŒ\“‘kã1™2€4gd³zlË=ª-¹Éìzmƒ"³C‘ì“®ÒuŒó UÚ~“2Ò*W†¯çKÎð7Òð¶ÁË•Á±Í6·r£»ŒmS>ì‘*O­ÿ²ú&ÁñwZUº.µ]° 8Ì`|uxu­x;ñ0zðMÿ:ç( ô(î%€&„Nàãx‘ãËxŒ¡w_çùïâÓ¶{ìrt1ïž‹Yø«'å(åž‹¶£Jí§jÙK3/ųÒ+·Ð=u8!·BýÏS9ÊCžkmG•“£Wn㪗áé”çä>ž,Q}íT'âû|Ö”žõgÕ©s^^õ89^Ìu®“XaÃÜ_gÃ|Žüe¥U®Œ°a[GÃý8·»Êuâ‹§¦À÷qÒ‚Åö‹Ý“LmOQ¦Ïa9ž&ÀžÂ|ö|’iîK¶}¶9Òäí³Ý¶…ØO1‰“²†IÈ´Ïll$õ.#å5’¢-\¤È·Dý¿D¶Jƒ{T[°µtãIl¬[¼*TV¿Ø_vF¬î“¨ ¹ì´])‰.#•2ª „kR?\*‹U˜~íÉz Œ*¹+«êrx–|™+ϱ¶?Ï ó#õEæå˜•žeÎ}ÉVq£#J^Å­ùݚдʨD)i­¶Ý]FjËñ3¹GµòAÔgÛhïܵu§ñôÔ¶å4wglžÕή:£­†©´Î’Ö+Åi1 {mZ÷—«k*­s¤uþ’r•ȇÔ9,p¬…KÄ1yÈ]N[“‡ií1ŽÀÏL~LŽºËy×»B­ÿPKFçtUÜPKÛA‰;aQute/bnd/test/PKPK¯TU;&aQute/bnd/test/ProjectLauncher$1.class…QmKA~Æ‹^s95ßß5)D =ó­%âQNQ¿oîsáº[öî ýYÛ‚üþ(éì%PQÐ…Ý}æ™gfgŸîtðÑÅaK\¹ z*r™åÁ…Ñå¡(TÔ—¦ÕqQ!Ôâ‡R¡nƒë¾‘"&Läý$kí³Bø¶D—¹‰JòCB³ýy÷†P9Ò±¬‚Pó1Ž &}¸˜"8mK˜%Ï‹o=i®E/•„ÙPG"½&±ïX±%vÞÉÙêp‰Ž)TóXt±@Øx;ÂÇ– îw£#™qŠFø¿AC°ëaë.Ö3¯œ>6ìoܘÅþIð®ta"y’غç^¤ûlãù×Ç*Ju–¨Û3™÷uì£&«·‡ÉØðîî)Á?UJš£Td™Ì°Ï­txæT¯Û~²5ÆÛÅÆ«l}á·E¼½O¿ùø ÿWÉ™¶Xé!ŒSu¶|¶-:ƒÙo`j¤ò•oë«íÝÁ»Ãܬ¼¡yx´ðL¦6’q°Y2·°Íw…ǰƒV5”äõPKÀ¡Â’·PK¯TU;&aQute/bnd/test/ProjectLauncher$2.class…SíNA=……v‘R (",P¥-HÅ (Ô‚Å…-þ\Ú ,iw›ý0ò"¾‚¿1XŒ&þ5ñI| õζ„Mvwæ~œ{îÜ3?~}ù`9 M жå:<±k”·Ä¦eð¢£j®QÜçVdF‚!x ½ÕeÍØKä÷-®•Z}ÝŽL‚z5D’bçuCwf£×«§•rŽ¥{ÉXÁ—2K¼ -hõ£2$Ü`è‰^žÒ©êßp+»ÜÊk»eÎRÍ¢V.h–.ö £O´Á0r ¯È µˆh†iVLמpê24[®Aßh¬ÐŽ›è—p‹aðjh·1À 9z…›®ÃÀÖDƒ2† 0´ØeΫD4º&@G‘0úÏDr‡¶Ã+2îâ•ö zêÜt“Šé†Cô¸VIJˆ2ôg½ìêå·Úgˆ¤_gò™Ue9ZÚÉ¥•슒-¤·—TUÉgÖÓÙüœâÇ:Zà=Í?Å.!c Ó4g­Zå‰c€È^8žF¡dP[ŠÍ‹¶HžÉî_6Èÿ‚ˆÌ'2žbŽ¡Í1ëN†pôb ÅÎcQÂC÷%Ç"ã™Ð‘T¦²!æ¶$c)Ïf¹Múè>ƒºY7l«Vº.8e¼D/”hà–y(atp•1nYnÕá¥ô»"¯:ºI²a\ܦ«£HcþœéZE¾¢ ý†Ï©iR¤“úÓF±lÚÔý:wöÍ’ŒlÑè_aˆôd,à g ƒ[©²fÛܦQ†h°,7VMôJh#{;­R´þ@|üüñ‰ÈG^P'}ý^0 —õ#H«^o@BžZèF˜l$PòÕßSµ?†ÿ}Ÿqç#†¿bìM(v‚ñ†5Œ‰J “¡™Öð¸†dÝñ¼†~W ¤†yd\Fˆ2Ø ülL¡i #FÿÁ<%5DÎp\lp\ œWP½CX÷úÚ@–þ>RÅ&¶½™W‹ž?PK ÅòKPK¯TU;-aQute/bnd/test/ProjectLauncher$Streamer.classR]OA=w[Øv»Ò¥h[±*H[°ŸE4!7¢4áq»Ð%e—ÌΪÆgžIüþÿzg[McãÃîœûyî¹3ß~|ù à :& ¦÷6QÂé‡G‰X9odt&|åzIè…\?RRxçBšÈJgÞ;Ïyá©s‹7X;Ùùøóû%²îUZ½Š*Ö'Üî ÚG†Pà³J/Q£WSüõ †a“;”yŠ12ÐLU´ÐæS &lá1r¿PKËâŽIðQPK¯TU;$aQute/bnd/test/ProjectLauncher.classµZ |TÕõ>çe–7“Ç–`@aØÃ$C$BªA[ „%¬:Ia`23ÎDë†ÚV±Õ.ÅbK[›­*ŠÖZlínk7­ÖVk[«m­]l«ü¿sßìL„ö÷û#¾ys—sÏ=ç;ß9÷O½óð "š¡µ:IcXL˜uᮺ„OÔ­ŠE¶š‰–@2ܹŌ9ÉÆ4Ê vÔEâÝAÓiÆã‘“3jgò´ä$u$ƒ¡®Œ¨ÙK†Á“ipËÖÀö@]0R·82Ñ则ÑH,aI©L•Ö˜P ÜYJdˆ€H#y¦Í †ƒ‰¹LçT¸î´uL¶¦H—é¦2ª0h0U2›ún0ÁNò§áõë]Ä4Ò ƒÉ›Ç ;9˜†´Ãfk²§ÃŒ­ t„°ŸŠ–Hg ´. Ê÷t£-±%ˆ}x[ÞݶؔÑm&šBx<Hlaªªž¶)oóm‰X0Ü=ÛIãaÕœLCuóc±@oK0žp“—&ʾ&1•UO[熪S šJÕLnH^“±úÐêi…vw“jT òÛ òÓtlsçwÄ#!h¿J)6<# _¯r:ê4^Í)'zt>Í„J®.ÙSÞÌ•–g6º©.pÒ{`åÜgЅԘ݇eŸQ5ÔRM‘Pƒ‘0T™Cst4-ÕoÐ<º˜I&ÌX !¸Q ©9Ý9 h¡“šàØÓ{ ZD‹áݰ¹3Ql’ôÆœ´h)ÞQS$œ917-¡e-§à[Û…w&@Ò€S&­m_µh¶‹Zi•“VÄk©‘­¦5LöEkÖ¬\SÁ’‚E£µ]"nS¯3cqL'»›6ÐF'µ=Åž7h“ø×a^™ „â"â½]F—["VeaL‰}ebSü0¨C kï ™˜´tdÒf´¨ÁpBõÆL@äË´Å  Ä²˜°9¼9"l3($¸—6(‡ß#²1ik ô˜:] TšætÙ[Ü %¡r<ˆ%âëƒVžói°Âà´¸cèhÆtêe×Þ»¼f8ëõFÂÞÄÓëYÀmôºi;]-‘ú¾ÖX'#®5è:º† D£fû÷—ŠÓf§™-"vt£lYOD¬N'Ý\àAKŠXñ}n±ÍXLB¢º„^›J¬¿N‚d·A·Ñ‡`Ú-x«ŠÐFa„Û ºƒ>‚0‰¯2Us³4Ì ÓBãÅ_²^)é%Úœ´üW‚uº‘Üu&CZ¼Â¥^±¹ìðÙá'™.*±³¼–µ[b‘ÂÜ¥·ë¤{3ô«:íì4£Â*L®Îwm)$A°;w"Ž@Œ(‹';`¤µh2”1dSq~d„ÃŽU-%4@ÿˆÂBI'¡IEúÌ9ÝsgKr{À 'é:=È4Lé:=­§o•¨zÔ ÇèkÈO1âך=Q1+ÓÌwGD¡æg8éëHAùM+•ß0Ú ô¸éqú†„øIرºp¦„÷7é)'}+“pÓÖ0èÛôpPñn‰Ñä%ëæpV¾b¾ïô}úv؉"„ê«KŽlHG¥Èãô´A?Jo$¦|†~ꤟd@.ÂVf=aÐÏdè(,)ÎmkcquY2ÊÖsç¢Y•h£VI †³x.Ò¼ }e>ήÊ€Žd¸+dJX]nRí¹³30ÄÕìÉ”Z<¼d4ˆuè·½"•Ç «òH/)9æ÷ýA‘+z iêôGdä ÷[#…ü…øÓóõ¿.Äþ§">/Y >×é/à¿%H§¿¢æ@Dd"]y{E³¿ôwѬ š-PãÛz{:"¡`§•÷þ ñ‚£0§;è™ëNö UÁJåR™fÍ:¢tyÅt~ÉŽ9ïBns1Ë¥œfÑñ:e@ ¶ ;?­v`n\¢%¿[ˆÎÖ¹ “7CSsG$¶­œíìt2 ðAã Ö¥)ï´/7{uv3-n‹šÁͽ’z’¡D0 ·d¥YIž)ÊÒîU1s{0’Œ{7G`F¯Î¢°[çÁ°\kd‡Õî•?’Ñ™‡ëV¶- .U¯Ïá‹„$±¸™¿¡‰/“» džÁó|@Õm•¨@6áà ÂN^\p>„ÐI‹DŽÎ8Øüq3Q΋x™ÁËåüâ€!)Ò´ÂàViB[%Á”îhžúCŠT•bQgiºp=ôÏ*l/A³¥ˆ—iv)yg9[gP…x>®°ÍÃÚƒÛÅ5åÊ5–·œ¼ Lw:ënÞŒo¤‰xðe lƉ¦ö,)[&KŠæ€ÁRø•«Œ‰R)‡YçT™ò,¶–Ь¥vÜñ‚PB"£x5Ð<¦ géŒÿÒ[â¯Ëþ+ý u´Ò°QädÜ#§;—š1T”V™¿5&²” >%ÙǺH”¥÷üA‹k‘Q¬œBùsßÇŸ—vW×üêWO~\æU<Ó6ºø |ÀÉ_,¼ÿPhг|~©ºÊ*ŽU «ó—àä¦äZ7™9ù`PòF|X®œŠ'BaQü!ƒˆ]™3îæ~>ædœ††å´Hßë4•V—†-§õÉ ÕàG2w" ¨ô!ìQƒc‰læN,Õ\]"—h:3åh¯Ü!¥w ¯ÀÜž_n–ÄêzgOWÀºÔY·";@gœBåÛ{$/~ÛàïH^tl3%+êü=„‡_g4ÿB)Yž6øGRùÚ gÎÏ t_Öˆâ‰YbÖŸ4–ƹùYþ¥“ŸË84w—7øy~AP·"grÉ«‰bd–Ó~Ñà_«{`|QO4”û’”€Ù{ˆå·¿Âuت4´™ÈDr›(ŠýÞà?ð«‘9ÍŒg‹°H'öì P/™uË`è§ÕfÑí/ßÊ»]xû«An*wòߘ¼ï~£=i†›ßäÿSqñ.À…ýúù_ÿ›ÿƒjAÙ¶%™èŠì/D¶]•­Ý"”*2üΙ5©×5œ—Û‚0A¬ÞÍokÔÒp®˜uFµJ% §fG=|†E­ÀF¡95—SÓ ¢6(†æ–#ÿ`uw™»=Ðlš! bš~†S}ñ‰‹ 1´¡©Š82R+´áN­²€Ã,;Z•ºP·Ÿ²úp‘3ÊÐã;NÛÛ+vöÓUè¹&E7”=B7¥èýPõV¦½§VÖÔ£3=BŽÑG5(ÿ‰ƒ-¾Š»j¬q{ù ,Aô*ý‘öÁÖbÏ…çXxg,9žêh"]H“èbšL-4>™J멚.§iÔE>ꥺŸ·“Ÿî¢ÔGõt”fÒã4‹¾…Ï@ÆÏé¬p!½FôOš£ü³H€åÓþÑé%ú}ÚÔÑ~ü÷xo -¦ÏÂg6¬u!}Žîƒ{áãÏc´²Ê±Ö0ã‹ =œ–qo.ù‘6¡Ÿb_‚Áå‡éþ'iaW|)E_^î{’§#íýýtìÑŠ‡+¾z”N|…î?N·cd?=ÑâKÑ“+j‰ïÖ¤è‡}¤/GËÑ)FsÐ:âW ßãÏ|· {’6âãÒ“Ô&‚r¼]AÞáq´7ºO4¸Êô>šàqWéõΚŠ?[Эñ8s°×¹J¯rí?õKŸHìZê¼a©ó&Ô©ø%T“èÏ Ù¡ €‘BùÀ¾þ Þ€s'ÀÖhuÂªÝ´Ž¶à[¶Ò6ŠPˆvPÝFaºßöãý~º’¢8 =EIú1ÞŸ§ô @ù7Èmð=ö£|E h•»ŠÌq(gŸªaAâJ!wöG‘«!•=ŒÔtÄxTøˆ2ËLå©HÖ,‘´Y êdS™e*]”6K#¶¾™»1#g HÚ@Öø-ÙñAe ­Ó°nSf'_»¢6ÞVÉá~Ž¢$ãøz<¶Ã<½i(ÔfóAn³£•­CfþD‘2†ž@&øüRmÎRqFvs3Ò›« q|5p£eË «O6â–_Ñ“Qú¥ì-xüL楯ê+|Pî}sûhhMmÙ¹)Þe}?wß©7|)~®žµÀùC¨ù4ÉÉCç# ò¼{‘8&ÑÏòÀ9Y•¤Þ¬RÁE?À„4ƒø>ÇOà­ ².çoàÍ)ãEQ²­ñ²ãdÇÀxMNwE¬÷&Ú%–0û7s¬÷T^ä¯ÎkZá€ïâ p7 Ë¥3j,Ë~_åJþ¡ÊŒ?Ƴ֟IhVÍTÿ÷Óá)hý•×S˜é<ÖP.Ø(ˆïqvä!.‘µSBYGˆ.È?IÓaÿü_–ã5ê@vT›âÿ=§YbOºJ÷Ãù?;Ê¿xŒæˆ%~Ui Bú7™>Ì/åßGõ1#`9»i8u,T˃ó"ÚŸUÛŸU{ÿQ¥·œ²þ¬²èã×ÐÆü:ÿé´ÐY ȈÑöù|¶GÀEe5mýüç#üÆq~³Ý×Ï_Ø"fÞ:Îo·Ã¹§ú5n=®Ù@ZüFJs úµòF[®ipºÉîOiÃ"Ú°¶6ÂêÙàTò´ÑëÑ=VºÇK÷ø*çŽÒ]Ç£Pw Ú]YnY‡Ò’x åJòð(òòh˜ÉGó‘× Ã¯ãé´ þ»ù<Èõt%ŸOIžIW!Û_‡¶]Œ:í·¡ý´ß‰ö½ÜEû²fÞ§ŠXݤMÔ&AƒZºΟẉ˴ÉÚt -צâÍC&{f»2}îŸì{H«>Iº|ôUjø £~´Åç«IiÓhÕª#»½±ªò^…Bd5H?C·J|ŽDîõ¢pÉ] LN«9’kR°È¿œØ«ÕŸžx´ó•BŸMêxá¡så€cóY¥u·Çö$ÙáÄ^#Y”hxj§K©‚ß %.£Q| äeÑñY{W êí-Å:xÓfj³ ÏM#µp’-ªãÃdÆPPÝË÷”ØÂ{Òç`MA¶ÙWÛ¯]^×å1ÇØÌ­iotžhp”5Øûh¢ÇYe¯o´ù+µ‹­8ó egNkv®²W9öŸz.·Õ)8p›`ëÍØn7 ARŽt^d^ÏÛh.Þ—rOÞ¶›³ÛnV“m4+hª÷-E¶Õ4B[¥ó·Ý¬¶%ËZS8Ê“ø´Cî}ˆ£J+uÛÓ °¶P;/=yquƒ€—[Õ³ rq2Jƒ³[Œ¥d.JË\ Žj˜ë«@^/ÌvUž€5/ôÓ(O|l ý*È£¯jEõok$‰Cܰðu•n4:Žø­{P–´õÚµ˜&á^"=3±ÿëÖNe£7~± Õóà–¨ÙF³äúÌ4?vÃÅMáƒE¡oç­hÄ#ܳ îÐÞÕƒH|ê¡ä¾Ü„?ϲtÛ~ ¹Ú‘–>F4böÅ^eÓ/Âd‘Ô Pýº:.ÃâJ‰âÇôL,]´\_› { ºÿ'÷k”€¯v& ©»›ë®GÑ0vµQ’¢€dŠéuú»›ÉZåž8lÒF0s®ñ”»lÝúãÀe¨æâ•J°O^ œc´NÀ@þÿú7@þ5ä”Ä$håä•éþ6üûg ÿ}ùÿnˆð††¶Æt ŸX+ F„ÛwT@»ƒÑêçÅœJÚ’°HÐ tú¥«úáÓÔ ã‚?½¶"RôC^Þqìv‘ˆ˜ VßÏE«›§` aMÛ‹ù׊ô“•4UÇA;ÝWσb¬ïiµNÕZ4¹ÝÁ€Ákbh,e8A’2 ìÅ®ÜP4®{}]gÊ=Bá#¥!É7§BMà¶òËZ«ÈS5íÞãBwæžGtÅ(‚Û!í†Ò˦¿>\œ—ã 62ruÓüˆâ,Ô°¬ª/2dÏF–¶¿âOü¤è^;…Q#˜¼¤e9Š>@ÿvMâ¾Ùëö_7®ø¯\û®qr4úüŠü? \œMþ# Ìÿ K[ çÿHï_ Ù9™YüK5î0µR£ùª 9[¸8Û9ÒY¸ä¨I9m²!ô^ªågK€U£ÊzÆŒ‚)”å:è5”]£B² ×PhœŸõ¹¡HÄfKÛÇ[_âïòþ®Ȱá0ðkME—³¡µ.˜¥1en°Jn=ЏÖXÐ$ŒÂG?uS´a+Ü!¨!ç$´šqýÊr’Vô<,Ž«P*D¶fUuùâlUhkA店éJ,$)1ÏZŒäi’Dþ1ôÐÁ|hÿ­,Þ{ØÂzd¤¥–ŸýgÇϫʚþ¾ðÉçyÀò. F̉å‚ýΑÇïÉôPä®_éU’É>*)E1±)“a/w8üNô£îòίa列ô)‰¢<ãŒ}¿†§n&øØ]z+à¯õÊÚq3x\£Q°ª&‚S–(Òë”òði-ÎQ2€$ä®ßúã%G1¨•±(žfP u¨3œ)²uœ.p%5 "µq c‡@‘¿iñk{4Þ ?ÿ4¾W¾Ã]zÕX‘É«ö+Õl‚©¼¦ÉI.?•½ÚÓ A¼sFŽAäÆô' š‹³ÔŸî›Óì} /ãYœ\VAÌé.÷ãK!Z I¬Û–L{}d”N ú¾e¹ÙIß7&­®4Õ‰Ìt Ç þiígå‹Ç®YG´CÌ#- àž+—7åÖFgo‹só£=Ý鄨‡˜ßU“ëv•W‘OøÑ€`Ô訓]s„?–åð•Ù‡$ñM¶~QðK¤GÀª…¹Ç÷$+æÂL]êÒJFÊ~ƒ*G%éÂröhº¥ÊÔ3qbÿÐNÈ|ÇØOPv£ØT]%ŒTXœ7¹Œ¢pYI¬º™ Fíòï—ŸKÒgë î¬A×E¼À+6d¯JA½<ŒIf!¼vvEî~üƒ;Y2ÌÌEQµW»N%$L±lĪŠKÀ†¢Rô#£mõ¾èšXžQ˜Œ¥ý-ý¦-&'³N”®¢šv\å?ŸØl+ø]¢drµüänP΄ŠÅM®È¤e ÙsùAVêêÅx瞘ãê©:Ϟdz†ÓpÓ0†¹#FgÑ«ä%»+÷Ûÿ3Ü×ÃPO³ôÌ€‰y£[¡ì#¡›<Ø :eá?úüIj“‰ŠÔ—5Î?°oAl&tPþÈ4µq‹§Yg‚jŠîÙg”yhΟöõëß[/=Jwb›RBÔcø¤Äô1˜Öâˆ^“7îà}ßcôò "úÉäá}Ã)Í8Gzg½,±p²ÿО룡ÓáþŒjÂ%vM:öfN8Ié¨Ws²ùJ +üŠÀhð_È<$SÌ·Õ!‘ZËõy_!=&‘é÷vT¨´Ôê]ƒ¶3x>9ÂL×&/Ñ‘EbhÂn-ñÓwcQÛȵqÉU‰ª‹FÌûR4`éló¨mÖ ‘G¨UÕ-»ÑÁýÓ‹0‰ݯ%”.(±ÏD.âÎkŸE¶Šyù§õhG¹RqúÄ"³˜`”3šI÷ž8L7wJ/C¥Â®·ÅbN_³§\ów1ŠÕIFÓ€«›ÂQó„G¯Ôa`‘äóyÌ(£Fí=.ùñ%ÂX£Ÿ*À¢’4ÆŸíû f T991\ù3ÇYêܽÀSbùàS·œGù·ZeÀ.é„—Ju×Íæ)R>\r‡Y¿©‘ÁÓ=P}w$‡Ô Ú7¨óF@£}­RCè®c˜ùc 'Øg«úŽ8œì¢ëì;—ö(GVn'o¥“Á îm‹÷©TƒÞnãZNmÿó£^ØþYœndÓÑÅ;q"Ä%4šš¯Ä1Ósy¶@ ψ$œøb}[޶ƒÖ0lœ*úÎÑ–c‘6[rHþ[‹Z.°x¼~6ÊAqïcc*|ˆŠ äEµJ<«*EœÙ‹†QĘœèXê-”T4&vúB~08!Šá¢‹¥C‘µÅÇWŠ4:ù}4‡g¶iÏyƒëòSnï'KV\Yû·í@3ÿÙû0È‹Ðd uãÓÛ¼¦_Â3ûf7Ù<^¶Oú̧YÒÎ=מÝKÅŸº÷æS:â‡âü“Œá¤=oNã.–ÁHñL¨î7T.B0²S¿jáBq8Æhƒ-Þ`‚]&²n÷‡a6AZ^Ës }k„ø„cÈøÇ-Ë #éª0HQ´ ?Ò¤ô0åγ˧Å*l ùhJ!Ðg›BGî&PC50±ÞÔ„¾Åï”5Æ›\0ìòvùw˜b$¢jì…&2á2BÌÞÐú((wsâ·a©q ‰ZW­­©¹Ç¥³'~—³FpV¿M0)q¡µ¸Ý{ì:drM©Á–& PÞÚÉŒpÔ¢Ö–˜$!\áf*Uì(ÞfÝt†¯ð н¿V¿Ä3ý~Ž RÚ­iè)8”:“P¸Üõà”‹"Ñ.Ä'áx ö‘š´‹ÖSi†´õœªÐAR õ¬œß+fÂh‹iV“u‡&´ 6òoX™-6ÝÙo3‹ø˜‹iÐk| uÎmÊyÚÃÙ‹È….fQÂBü1dš¶–ÓÙ!Z”`].´B)_ùöük²Úz0ÅܺޡßaâvÅZ 7Þ¯/Ë“Òc%ΔÝñ:Ós(m"é´aÎ&U¸Z“¼RtÀ“õ¤ÞkËY¥¾(“h…ÚÖ,Ù÷Ü8×OÅÀ]m4ÞX[-W“z öQ­I ½8KŸT ¶ì¡L6|2ý™hfõåùO$+ž¢¥W˜Æ¯5êQ§5Ìi|ÜîÞpܧOÖÄdË¿…lR½ÛBEÔöhO)18ÍPFþøY é«üªyf*ò—ïM¶¤é«Lt` C- …‹®Lì ¶_Mº·EÌLVúp1Á8ªþè?Óã1iÕ#}nÁÑ…¶ÿÆxYVÕ añO Y/÷+kÂw¢Ü©!_-ôM´œïémkÐqãÒ•Ù[iV13ŽãMGu­^öÞŒõݨYå>®¢dUR鷺ÀsòOD®a¯ÙÂlÃÒÀ¬¢kµ»-²$%.—­ GYBÜr‡²„ÐS˜LÑØë¨·Ó^ȱ4ʘi½Btq>µÃÍóyÍ Žv÷haõšËZ\rl(¯ Ô¯%±Ù U˜YOVˆ\¬¼üxçtuF6m>0È™…¶â§£žB™È}Q]Í\*aʦ¸ÞæT±6}سÎ1"Ø ì¨æÞëp˜æ­Tzpу Èôìæœ7·¬ôÅÍ9/žŒq‰ˆ"Ô~tì†ÝŸ3؈Žù@r+dšû}jþÿ¹š‹•Ì6DÂlyÄ:6S—÷›T’”ô,f‡B@-±åI)‡ÇÖÀ<µ©LÞSÖ#Š.ÙA"ËÁ%ƒŠ±IS¹þÃ1ÄnüìÜzÆàŒö,".Ü«|‘*øOtÑ´RtçíÂ=ã•ÏÞ¼ç_IïGìc³Ø¶¶í^†õš$}æ[maÕ÷dwC1Ce„¥rf‹ Ý¥ç%ûš¾c¤E¨ÛÝXÝþR]OÙŸŸ·/¾;îà?¸» x>BFù„ë .`ÒÃìû¨e0L2‰D)É…!õ‡ÏÒÚ÷¥¸ütí‰V%fŠDM37œjzR]ÚàˆÖîo¥+mn,ƒ™Ò’ V,Є°ËɦyªcFÈ9Kïn á7jCºöç TJÓ ½É‘%Úç(9uî Õ¼†{•#Ö»­Ï %m°ør<­Zg öRÜÚö¬oË`~(¬Áðaª­×‚ŠÔoô3k*™`-Xï`Ã}’ÏÁ’¡ãâàYêâ:oäÅ„Ýf”5í&`uc;²åÍfŽ%I@/‚¬såÂï¼nÛ³¬¸ñv ‰œcØY»ú*‹ Ñ91V°•r^ð¹߇&LþVz9ÓÒœÁÓmjp´åñŠe ß»!nê;qHë6•Œ4éo?|!¿Ø´ä^®rÓ¢/¼Ã—:eײ}Ñb!¦d”¤¾œ[’û>wæöñMÓår6ìܼ,üzVKä­Û¦ë»?*îX,ŒìDÿÓóœô8ao¿•õÊ÷íÌˉùb™Í´ð¹coÿ`Á}.çõ8àî<öÕ´cn¿‘7ó*È{Q0…'÷rÚí¼Ã绉ݳn÷ónîÊ;+ïç÷hºÈ‡— ÷d¾—]Qx˜ëÊ?å5ÚãUèúR¹²dq59yRøÀî ƒƒãš.ý"Ïnù«ïã|Àiÿ6ùœVA9»ð¢Ï¥Üìrr&;½~ à»}ŸCãw…¿§Ãçb¯¨ÐÄ|‹´ð"V#€’’@’|ZªðØ=Ynƒ²$@W(•بJnPèo˜5(w™ŸBÄ ¹Üæ¤:KœcDL†T‹®;L}GÒü}¢&ìp=dö† 4bpÜ­@]*à£À#étÍMP ³”•tˆéÔ8VcšIT—u{|bÃUML&ŸÙüfí N›i•ˆÔô»ÓÀqÉp‰¡™2¼0âKçÅpÐ_7¸L¾¤fãûccE+aezž(yM£HÜ¿W,_îÓžPüfì=¼H1›Ö3ç©IIWô±ÅÁ|ªx•¬b^3°åewŠÂÊ|Æ‹¾és‘7bì—2ú0 ³Pr;JÈÍŠ8u•V].#8ch¨¹ÚÎJKÁ°)ÑĆ‹Šîuq&¾>ޏ1Ez(WJ ±ž]o¨6ý­ÈO{•¬Ê*Ø ê%¢h/v?–Ý×nRá‡A½ºð¼l‡¿—ÚO¯¯n7à‰6ïÒÔ9Ùtµ7Ùç/Ž8÷¶bŒÖür”FjüNÎX* æ–¶õÄ ]F×vK%Þq$l/²ì(t°®Qkúœ‹ÊÚ¤ôL!9ƒÃ#'¯Aïé’uRÈ`½Fd"$»iÃJûT”Ánùú­ ìóÆïN˜ª†‘[£ªT“RêËÒ1«s[AÞêœâÀA¿´~e{b7Eé¨)Ï•mÅâ6Ó^Î2 FxèÀ »ÞÛÛýÎòý]ÓÚ³Ðÿn µ~üÛYöËf¬Ýâ|ÃÙÖᓎiGï–­'8þ^æÙ¾ wkHåŒi±Ô¤_Â:Ù‚ï|O裶ú²ýfª 5¿÷Ì·e'P§ u}ÙÜÖP§c[Nì†ÙÞÂÐhÕ?Ä,ëjŽÑm‹áiÃï[¦7!VK¥®Ç¤^¢c«R,¿ ð‹E‡w¯ðâÞ\2*~­§n׎qW¸§ø=UBb—.ŒeLm”¸;Zâ[§½`ª¸­Jž•: 8ðËY`¶ërÒÎ:AžÁ¡"j²'k'0/y ¡‚æùz¦AÊÁ ƒD÷n&“ ðq—ÓøãÔ/]>;8ÛU ¦öUP_«‹ÞM(]¢j îTîÝc–q¼$æWjÌ® Ÿ|)ægÑ{.zôiÍøùŽâŸÇ žT¬å;¿-wÞ'g¨€à1Æ©m+ÊÂE]È,“ÉÉEâ#ŒC}Ý$ŠæƒO”÷ðcÙwu½>u–4'c0ª×Ÿijï¾/»æe>@œYTf¡âÝ›ëðLz´¦ŠÍ…p}q{1_÷WÚm?¼œã]Šw1%ö:±?@ã,1ÐÀöq¦ó?J°ÜÿΔ,lì­MäMm,œœ,ìlåí¬-Œ<þ‹lÛêZrØ¿P|OÕÚ+”ÉøÉ}èJJΩ@Sûo€S28"´Ær[x$ÖÙþøÌ5ð`ΑÜ,YÎb~¾½i÷:ݱ|ŠšEÏïBO-Ö…±ýiöˆ}}y#RÛH¬s–Pª] :܈6fëéá­“CKz‚OÕ(a‡–œS41åαìÔ§.é©f‹ ='SÏdîÙµ'=70A¯à¶ŒÏ9w¾zÝ~‹÷´·¯ƒ7O€nÕ_Ä”aQ 4‹£ÄÔh<D¨ú•…Pnê ”œ‰©rP¡ mx ãÁƒâH¤.i{²¥ŒbZ ÅHèÔi,.^* Ñrà¶û¸ÑÖŽúgç8³‡ÿ‹Oð%é[¼z5#4ž«ñÏEàú¡Ñ€jS$Y“´Ú#"ä õHFÑÌÄR3QGXÞ÷O/ߣbšYß9øÏ§h±[ú$á̉±hÂ)q>;†6–mz”©ö½˜ce¸çT,¹²ì ª¼û1Y$!ã4€3 ²µD‰HiPO·;@;X'£˜¸šhŸ£) ¶b à²:X®Ò„áô‰? ¡:¿Œ …?“•¥GË€93– 3óu „üǡރI`}=̥ؒ¹(°¦€z¥4­åºÉü+uµ=[p2×§"ŸõR·#ë…Ø= ‘0uÊPÄ=CKe?(ž\üWܳHHµàîoΣ¬õQ¤|*.E²Åžó?3¼ˆDÛ³Hƒ¥lúZ˜rÆX ‚$ ŠÝ}©€¡‹‹ªŽ¯²¡ŸˆBpóCŸ·<9¼ISW¿6ó´@Z.]WšÇ‰Ñé HWAû½‡`ég¯Qµ“V×j­C1ÔD•ÆÏ ¶:ŒT_(ÄÎ×]qÄWœfʳ¥BMº ùtšaïóáÛñ¹‚mu %pfš¹@/—@7ë’-Öå`¬9§$#ÚñãÅv{¿”Ndä$½É0C¿00ÂùðÀeÚÒ¤>Œ»«—y"`¤mÏ©ˆ6$’ø,Ÿa@"«ßÉ݈×õÆvÏ3¥Ú;>œ¤ß¹%Pݹ»‹gN:OB‚³ÈÞ¸}õ±ˆ»/£Ø+¾ö”%©cãºtá&Üd¿£Wþºz˜I½ºÓ*'ÏRƶI+„lë%½µïr¢–4íz®ØÕhÿØ+X O¡²x6ZÄöÆÛÉîÅÓñÆîXfMˆ‰w‚D*×xXýU¦º}rw-¸~‘–:Ü@K¾Waã ëææß­ÒgÐwé!ØsÃsÐêÒ¥ÆÔYÉ×ÊÕËE Ø–È»WC®Q(½?, ŠÕT2:jí ø;ÜjEÙâñ(©•ËQ ¶ÛÑ¿Ôr?ò•›Àkh·É¢Ü¨ÊõwoÙ^CO”[&Ç|›ËGçþSAºìþ G¹@TíwØ©’ž•[à1ÿ†ø'?Û™d/ïó!j_O{æa §Ä´t$þ)0`ë Ê1ö=qHgQK5é2J?’1Hy<ŸßÇŒ½Ý ƒŠ×ÆÕ]ÈùZž º[ÎhiÚ/™Ž…Þ1àÍ_tQpA{g/Z¿’QP%pd·éâöÊý¬EG*rQÇËéÊr( pò)Ó2±òÉñ ƒn‘U£>p?ÜTê«8°´¢wy©Í8X’¡®z[¹n‹Çß<‡œ9u•Q eòW9õËŽÞõ!f6ôÙWv &œ‹sa±ÍMžF¤úÝÚ¯úh ½õKÇSlÎT)êèMæš*ô?kޝkÑCaÞ|ûi£ºî Ä»¬[[µÊK©Þ¶}ʈý©Rm¸ç4î1"íMҞɨ¶õp²g+s#´BÑ`ìOó›!í%n)jõ#¯öºöPf.EH½üœLÓiñ"ME_ÆÓøˆ3•(GÈÞÝ&4 í}bë~Åø…ÝFÆN|ÖˤW¹"–$£ÐÄ–$ÆÞJ§•âçÈ#nŠÿ¸ñÎ~§ÝU_×>Õ#ŽN/ $A„º´0òvòôåývíš¹YWÆÎµE NÑ´ëÆÐ{Ʊ£ÀVôöëÊê̺›û̽e©Ý´ÙnØíõûzŠm!¶ëÉÓ®çõ¿¸Âܨǃdaýãlïæ÷´ný³½²£™É¯[Z07·ZŸuôíð[T“Y,M9¶+®&+4õ§z¦9|ýÛ÷ ÑÔƒòUEÿì8ÁõcCØ®HL+@ãd¢nÝ ëAŽþQàJø£luî¨eE¾zðµÇ_Ë>Êù‚ÜwØÁò¾ô8 y]<Øâš ›–Z7²²&÷Mk¤ÖQ¡Ê´±½Ì.‰V-ß]¹æe«6ØÁ]g|¼öæPèh 4²Æ\:’ª£>…À‘•wË©Nu“=ox^P, Èxð›onm¡"¬‡Q²ÖhMNК.¹ïbC£BÍ(T¢<'<µe%’‘¶£rXöÍfè>hÒˈj §Ø™’Uí ÜŠm3âã ê ­Û—+\tàçè5_Š:*-æ—†ÕÚ(£ðÊ~î­rª9X3“~fÁHÜ—¢oŸjSΠm‡3}LHÁ@—ýñeÏš’+HT KfNqãcÛnnNn=1ÉÝä]I=ý<,¶ý“ºEGM*x"É­!Èð#ßìCß7²Þ­–4­Œ{¥®DB!Æ5Á73Å»T…pÐÑZ ûXÍaÞÏþÑkYG—›ÁçÚ&Q…ãÖÀåì8©–SsÝ!<>æ›+ü@ˆ\8ÛmÞ€±o #KÆY£aN”×9|d·i0?^3bˆÖ@9Äý¾Q^~|Þ„>©òéÐs¢‰qFðã@®‚šÖL**Ü0ÓÑ7_^1ýçŸ ±pP)ßµñ|@üŸs#OcP·Ú©]ͦcvIÆ8á 6¶¬í3RèÖZËqÙ4hž)ùÖ Lwk¦D5/¹wc;E³bß0Õ«‡^ì°ÙÝ ¬)¦æL˼ì¡Ë8g5Áº-Z¼QÃS‚ÇûŽÐ/!²/¾Y£³“á¤õu„—;yß逶¼¸™(ø{Þ÷Ùªº©Aö¹«ïšj¬26M†e»‘ÖÅmÏ"ÃH§R†Èïk´Š÷nñ4Ì(ŽÂÜOuÁ5{-È·ÈÌ»þ‰//ÊÆ¤oš\ãl¨a]Êw‘àïâæ8ÑjJaB–¤ï¥ #M|2Ùp{ïi]Í&SQZ1cƒ8Gç‰(‡ø z¹Ä§'–m”™?”Ôå<,[hAÙôiŸîX¬êξKW¦z¸‹¤Üýßå|pÂ#¾z‰û'ÊUñ½Éºál,é‰T ÕZ¹¾äÂ’Œ9ÂSÙ4eD¯à)êÖÍßf2q9{ÀãnB³‘0°Ê—nGnZ4‡ÏõÍ p®q])Ϫ×ßë~ÁÀ¸]ÃßìÇ{öÚÞô ÈqøãíÌ7ß’Š-í•áçÕVŒ³Ïcs”øè=¼|x­+¯:âl8V5e~0Øà PïqèÃõ1»Žc©Ê–ŒMVºp`Q?È\Ó%cÍÇÉ@ï¾Üý ø Uk\ä¨nÈ“?™ËLõc•¿ ˜Òlö!«Y´*Ø%$i¹¦f)À¤²÷Ôk0µ®"=`ñÍÛuŒzó9\„Þt]mO]H¦J‚!ØÐÑ( ïpzºÕm³uÏzµiáNk+r3& o°/°ÂóÔŒ»­{}¯`> #XÇ_¾@ãG*0OÆ>Í)ñ H·1\$T³Ÿ0_×jjPm†¤ƸH4Uˆçúr÷{ ôç3 îA_pÊ1ð⎡iÀâìsÐ+½ »¶|ê¨vëö½>ÜÑ“±4¸fø¢„Þ¬}‚0Œ,²Trþ,CÒ†š—<E±þ¬~«öü ,E´£t÷¶ ¿wíñ¸S(o~´]cˆq%„.-~bàE“&·Ä”Æ U²M[ÃkKŒýP8© .LêdæÛÛ]%(äxß`L^‘Ï,µ†³Â\´Ò¾t32>Îîoí ÊüæE½;ZjêyÍ#uN•è z£2:‡OxÈZ(à¨‹ßø³š$Ðs²åJï1þtÔmÐlGun"¹ýú¾\PvÔÕ|„º‘¦ñ^¯Ìü‰©µû_ ɳ5H½´uµ—@àªëÃ.R÷/=ÄåW•p%0'ŠEI‰µÓ ×…J£ÅË—†Lθ5Š7‘Ùç&“%ÓOhÛ<²É ÒLMÆð±rœ˜9¹oäb¼Z‘µG£˜eI>ÆÙ ¡½nnl—7—i`‰°l‹°ëõ—xl¥Á2{ ÔoMáÌ‚z¬2k½›´Gt¬Ë2S2#Ê=™&8™×«£‘R¤õ½†ÕÅ7V,MoFpcÍínûÒÕœGüÜI–€¨3 ¥WÅR3N1Æa:¢œF4æpœù—»°.©p +‚2.åôÑ¡ósÜ=¢@T¯}=‰e+ŽŸÔYó+®Ñl9UOQ¢Kí®ß)I3íT¬" IábáÔa¶à&|kfLÔEO“μíúdÑÁ*šnâä¿è\9¢A€÷´«½ÿ´N÷¾ßd_Z¼”E¬L&iA»Y¥ª¨ì*7ÃŒÁ­[T2~T‹Õ“Ë'#ç;ÿŽ ZN£/sÌ:ô¡¨1õ×oüáÇ)ˆå²›ëѱH˜§ZEf§0Òð#¦ÞÙröæ4eÁ Ÿ–}’)鸇0-ìðrr)l€ ûòç`’ô£ÂBP¯“:£*Ì+ôþj6`„É|ƒ¶f3¹§Û–~ØT”‡ àY"¸Œöȱ̄xU>Ô¦â&¢Pa(S×…|qP´ûžƒyç$ÝÈx¹°¡R#Øâê<Ôwµªž‚®|ò~ÕÆSõš£|nE+˜8%”æYó¦}vè·LÈXçGÖBwì¤Ó¾›ä®\{ùDdÎ@bRyBÀNÊÞž½X%DИE§#<ÎÕMœ€½Ë­þ0ŠHrŸ(°J`óIXBmš¸šÍWi—œ®Û¸–œ,™y ‰N-l‘kùùÅñQ"ØÄÈ$Ú‡]7ñI8© 9ÐÊ 'S¼]oEݦ§ZĵÓIý‡¤-’J¤Ð4Î_ûÇšTÀzëÄRíÒ³¢19“w….rûHyÕÆäŽí†¤¶Åž"Š´ÈiÞrµh r„´é+w«3ÏøgÍåýH! b6_tTo§ gú Ú÷@¾Žšq@ëä#!˜!Õ ˜ô'üo0súÖûsûÖægZ^=!É Lˆ“¬PDVi¬û¸¿ÿZåBN~w’îzê«JÚ6»SϤT »¾'lØSZ¢·±Ë²Âˆr‘ê]‚ðŽheíR7Õ¶f¡Õ©eõ²¬ñJæ¥i÷!`r²íÂäëb•¦šÅÀ'J…‘‚ó‡%:U‹OÀ.AŸ!7ÛüB%ŠÅÏÂS°xppüàõpûØç¶ü@4ß4÷r#>SlÄÎÝ›Œ¯Ý Ý®{Õ5‹f׸LbÃÍì=qŸÇצ½‡UèO¬­n­t‡z˜˜>Ÿ«(ÃDƒ€~¯°©â· 9\ö‰ìï9ýÇëxй¥TÐï¦|ƾƠÚc&¯_ïpC£s.»v  æ_õÜSü;а±°µ0uû—­÷Îzwœÿ¨Ëòè ÙÙ:›¸ÿïÎ{u)¥C„ÞSµrŽ_\”«[¿ê,›Pñ¤Ò*~At!ƒ´^%3Œøí®LÕq@2@º[n%öÚºøY¶d/EÌÌÿÝ7È€@•"”Æ4k:v¨[äFŽä^…Õ@ûqÙŠ·—·Q(P_¤ô*œò#;1 ;¥É†ÌdB–+e§¿AFK (PL\ЦvWùGÚÑ…™wë j„’€$@-ñCçžÝßÿýüèû Á+1zZì­îm]ŒÞ>èT—yÖby. ©#ÛN•ê°9Ö^©®¬ ø¾ÏZ45q=áÎÍÝdô§ä ›T>vt„«Z1a™µzíkM$¯¡\³ÁW¸\}ßÐoæ—ÅxJpC¼ÿ£ð¼[ÕK€ Dl­4ƒ:S°¥îÞ Äi>Å!9}\0±½@’ ûÇéÑe&ªÚk„´½ï^¦\ý†þˆª E–eˆ€~Ñü*Ç&Ë®™P22Y˜E­jVj¯ŠÅ/·¬Â΢…rr9‡õ è#à°¯£ ³Pb &E,È,p;VXV™ù ó¢¬@ÿàxe]"ž'©M˜oe„}ÒÆ,ûïÇ Zü„ö õ`–X`F匑 à Ü\Ý`TØ]þŒîr%Ó½‘P—ë’ ðÚ§ÛvÇA‚ÞIåÐ9Ä£Ð9»j‚´ú/…Ò¥cú;BÍ÷Ý •º“±ãÎüœ9°â\*'*`#”(pÞ¹wÕ6©Tcg•ÚZSÖa}\GæŸ÷Ë6‹ ôdqÔ+è:à²jÓO}¦lÚ„PÞ¹TE´¢åÓ#Å …†ºŒ ç Že[æ4ã #ËΞ,DÉ<þÑuUÅ׺›ÈDéTY·{çk<êð¢«Âª´…c¸"$}·™çóYáÛ‹¡ÚáIñ§fÏràî¤vÐgšST" ›–$Ø”oàÌÒÆ)l,=x_xé˜Ènì¥1sé’ÎqC6£y̲[¤Kží†+ˤßY‡ FÜ+úóá‚fâ^шxÞóâL?Ö(¨‚ƒ;ƒl€ úˆ[ý0öIbwiº°ÓÂÄ®ßÛ 4‰ÅÃ[°¢_²ƒ²ÝX[ 33Þl§²ÑØ1¿4¢Ž¯©vóÔXjWÊ­é¤dÚsh“T<ó ÄñgoM¦QV]k¬l7Ä{?Ï>N¹mêÇÛÁ˜,D?;“I¹œkí "Çž¡sȶ)’ôN%–ª+ådíÄ–öáÔ¯¿¦&€ÍÇà×|˜³µcÊ~˜ê!_ã`v+€npNI&À¯úº¬·Í:ï×}Èßðmj:kÇÛ`æQÚ¶ÊÌG%×ã\‡†Yô$°¼¦Hum4¦S2WI”ní*:Ÿž#/Éó7ŠpOÁb…ÇA_HÍ-J˜Æ¢ ¢È©kÏw&V}HrI$ºŠª¡ ƒ{»Y¢üë¶lã*‡}äºÙV• inüÓi‡,1b×`ÌxÌ6sL$p%mC/£©,m±Z¢²6Ÿ²¢’.†ûÐ0?”SF¼/‰:Ë>®0›3 j]ê/êJ{“YßÜ÷:ÆLÍmüŸ¹~ÈmÀܸZm;½ìxG© Ù$Ãã.ðâO"¯eé}¶š„¶±”|<ìÑñöm‘H+b0lâg@NÙšƒÀŸ7õmÝÐu³_ær^<Z®¬Ö|Õµf<,ùœ}D¾ Yýt žý/üãC¡á;e%¡¤W(òQ,.Iƒwñ;„°c–}.oªÝ„L=ºþåÀQ¯BULöê,#D6Ø7 ¾Mf’IªŠ¢,H«Î‘æ 'È»¬êN†œyonAZ¼Nc€T‰Ò!,| Š>ð Yío%"yþ•tÏpð*l+—ùÅGð–ƒA‰8J aè7šê+¡¤è]B)>ÃïrjªZJ´ &öSI: 6”à Ã$+û¸kwtÙ^•A•£´}‚µ =5E>H *m¸»A¼;ص ÝtmÕYªÉ”œ¤ØóT=çc¸e-iÌØïø1œ{o š¨é„r`¯ñ|^ÿÒ è=¦’šÉ qïraœÜúìõ,bš8£ð‚ #{Ì,àÀÏ’Cz‡§çBD”Ù?k®Û՟߇˜ÅìÞuŠCÒ„£p,Ù)_Š]bp,x­/‘,ëø+7¸M$àØ[ZYIÄ!¹¶-;¿VõwÝÊ÷Q¶eå€YÒÚþýDÜÄ\ÓuiŽ­*s@1õò1k]ã ¬Ù÷ÉwÄý!Ì^¨O‚†4¾7l\7WdÀ±±ÄoØqT¥Ô?ž®ð d÷¤pr…3å+ݙϣ³ÚÓÁíS«9Ê—Ïñ2K’J¤º`‡2¬•5Ýé…zYvášxÞ“u·Ó9-/óMítƒ(B‰í@¶Ôijj¬ é„Bñqa&<"Ї.æ¦ßò?Ÿ*d޾ª,ȱŠJW˜¯?UE´ªªí+,ÑoòQF”çdé”v$ÙM[eÊJÌt@ö±‡¹0Ëj2UJ^Iì&^þ3\GṈ÷i$³V-@ù×^-]oE“wh0ÄW¼õ9‚Tó¨pR¿K>lÞ"[‰+·"D:Gõ{ÇAÓ)ð×Él„áàÉËŠ&‰GíúÐC0V‰‘ZÜuæÐY+f¥X/ TAžÂãK·µ¼àád)þH¡‹’‚Õ›J•xz”¤Î`žX[`°|d V€Ò»r­a=(,QÑùI…3U¸®ŠK Ôj€´1€Cr;š}¡¡ÁT%¯Í°Ç}‚›Ó¤þ@ )‡±4 Û+åõƒÞÕ;äS/-š«îC`^Ëk%ï—«­@¿›yƒ±l6uütÍfùª)ƒ»™îyE|nØ‚üâíy96–dšx‹IÊŠqÿiïÜ ×¬û3¶­Û¶íäÛ¶mÛ¶mÛ¶m;™Á ö·Ö[µ±ê¬¯Î>§j\Œ«qÑõ«~ºº«ŸqsA¶‰™¶À©3Ozc.ϾÀÓ=ÖÐØ ÌØ {jþS%~hr.’rðMphðCü6¦Î‡ ÷ñf y éVÓëù¼?’ÒC2»k[ø‚ˆx¨¡ýŸñ‚ qû}ó¯hüÂüw±Fú/ñú¿ö„øýÿôÀÿ´ a¤3²6prªQµRÆQÅô…ÿÅL«Ý0ÊZ%AD×ôJhV•¤T/ |YM:&±^¿nÍj"tyÛ¯{°â^*-š-/"È~çì5𠾌ænÚpò ŸûÛöù¾ÇŠ)®#Œ1dá»–4XîÑJ W¦Ès‘ÈÒÖî¼}\Š8Ä9VΞËB+ÜÙÝL©m4Ú4•ªå Ûã8dMB>®_Ð4‚+¼÷KËÌ"ݼ{xL ç`P) Åo§H‡“,ìY“erH:èZv`ƒùûFEWe3¶³ šæfMÙ›Ðñ>ØItÇZ¬ÌNÓè$å™B”ì6ù;Ðö<\?þ@÷òÇ-[÷tÈŠËs¾ PwYgP¯¿i¸P…Ò5…¾€FËAj[㸦ò·g(~xHk¬>%›ÄðoÒ¶ëuNç+…™žxÖ$ h–wǸþ瘖³.]–++¢¾:W謑O©µ”B„Z×RèZÝLíŽÔ´â2õ ï|)ަÊúÉÒ2rrÞgüN}¿z߀õAåyQ!Y_Øœ¸x& IxY¦Æ3ŒNµö~Wç4­gÀëU,‹Øätº}Hâ,¾Èjîë_y²xþh]lf„[åâÌzª[l«4¯%»&æþQAÔ‡nƒÕ4ÃÞBI7ÞbjðM‚ëÚlUuˇJ WŠk¿:Ô“0AM±?WÙEL/S^ ¹d¼NT|g®ÏðXGù{©?× ¨wæbèC½z¨“§ ðòNT¡Á«xc¶þTíZÕhï‰ÃL¿3ôëLGík ¿XBýò㟰.v‹‘QûÞr>Ö§mÙÁ*gY¡dóÐý~ æÔÀÖBp„þ”l½hz¾C~È"žfY›Sä›q:%IíÃÍîhÛ€Y—jäæL#£¼K9Åš4+ÏÕ?å¶$SÿÞÐ&08!hdpPMû WÛœÚX™ú`ÔêwŸ~^Jßâ‘ÆoDçiÀ–CU}<Þ¼Ö 07ó ³Á4©ð R¦ÐMÓ” qUãþ{-þT!w}ZtÛÖ2±¬ÌspER²è¹±|3IÊÐ8#»KBÿ‡Š4¡+ 36¸kŹóDÇœÑÊÝñ^u®”@ùÙ9öà•2Ôš%ãP‹é"œ—+XBL×ì K@à`/Í&¢ÿÙク Ÿýd*{©’¶’¯8CôSótZßô®SCü/óf<úÔ'1%—D;ltÈiÌ|ÀVdï µ¶ÉÒGJ,q zº°Èþ4‘…AÖ‹ƒò˜P2âÙ’ŽY’ŠKžªºsã#á©Q¥³~BìÈcø(ñâ*ánÈ«¹{[òâ¢Ý,1<ÒL¿W§± ‘w@ìCz~@xhXá¦+oØ–‘i•Õ”‡%éô¥ŠtÏŲ”¸‰ç&#qï€=MÇ,¢Ï-€š’—ë#¥°7»ØŠ£Vè$9M¨Tµ~/¾8Mø÷^ßÑ•æFšƒTÀaP‡¦xÊ4[^ŠysÉQÚùü~ZS ×l;¡Ù•30pFbíԕ˲„P!Vl’¥‹Sþ7M:aûåz0×£]­Ø˜Z»ØfÆM±ùúèhŠAí_™‡#©€ø´éX3“ ·-iè?¯EºAŒÅ›ËÎ$:M¢â°p Á•ÆlYñÚ„õ¿)‘¹„uÙ.! ÏǺfiì KšLô›»Èkõ5ô¹TЩܱ H-‰¶ˆè‡…èæùaKâ燄šóTuèí½ö4×ò1n+É-“¨– ® )¤,ÜÊêÀù BY¡7 NrÂå±®) °ŒŠÛDöb1Á±°c6]+q xlšîí3õ˜yWõÊCa@­µ¾YXN.Úu¿$[y¼!»X¶)lË ¸ø¢³ÜojŽ'SÔç¦_HxmûE45±†S: ꬘òV+céòE¡ÊC6 I¡g¢• ΟëC¨:º9LÊ¥ÎuºxP Z«Å;oűò®ïÎÍLèÓ=!!ä8öŽ­‹iPy +Ÿµ77ÒNe±sO 0æcí_Á qô÷Bôfí¤^LÛúäÓõz¨ój­Z_õÑ}ÕGÔL‡œ í9ÅWz8J#U¶õœíù'w»÷¿ ·ty~•Æî);]i$†Ùlaß_U(éùâÞOzŠŽúcUS­# ³:ÃY0”T¯ÚSH‹³Ã3~jͨ7yGPÇO`÷8Wßç9W…¢°ðÔäö,)}z2gD>y>ûœp©Å:º#†™œ¸«ëŸ¦§“ h<%z´£í­<ðfè]èËŠK÷àµî^y î­Ý¿Í3U2)Œ¡¸/Z5ŠMBeó ¡ñÖtV@\+‰A”¶,¼Töƒ?$wËBsdãqr™f 4‚EU]\7âòÄð`¾œ!{/¯ÁZ\bï­4F¤?HÍk@ŒCm‚&¶éÞ~ø½¤wþF*Ç`.&”lHfœÅ\e/Bÿ™*!Û7Hí;³ÉQÙÇÅvÄNµ'6§GzIÙ]yäÖØh.ÖsÊJ ÚñË?c½*.é-‹ýe†ç7 §ñbÞl‰Î‹+¦ÀÄ1õ‘%^Ò„ì·öŠÊÛ›RqúwØr3Òù|¨OÀPöÖhÆÚŠÄ¹!I²²Däﳎ‰¿è¾3…±Ô¼Ý (¡\»"ÀìCš{9ë»|êÖÎc»mØ7I\=FÉ—~Àô’ŸÄPuž"upt)3"Ó/À•"(£buŒÈ¨¢ÑÐ{ÁHWš˜i+¡QÒ©Ï0öš%|ЃwÜøh°R¡%ì¢dmÚ¿cÚ®dݲøþ8)ƒ™Ë®0çÌn;¼#©ÍLaÑw ñsdJM×uC]b?ã¶ßùJßxèIï{¯dîRôäˆiæ(ƒ9»;kxx¬‚: AeŒ-èPi Ls,ñt@ÚRœo>9®ÝßS-a2€¡ÔÀ-?üüL±ÐÆ¥¼Ì ¯ƒYÀ^ùÛqf‘þkã1ôüVÅ2K,¬ÔˆiIæÁÄ”y,æ¿¿ˆä¬+¦Eú3,ÑZvÒ8®Q.k4äßèÝjP™-Ò„5Á„*{­ÆÒ ·pÚ[‰!™ðÖ]¡Ý©Ý™ì7B¤½–„úD’ðIFçi°âRĉ}!*­¬eE,êÀ~MÇ¡ÍiÑ.%Aê|˜yØy)¾òÝBG!w´)Mý* !…%âå€`‹híhµûðJršÖãÚÞÁÁvvp¨Ý¥u>jÇåàn”½´=F^”³§Èï®¶ÀKj=&'])·èyïÉb/Mˆ3,,鳩Z!>Yoä‹õ°#rM»`L—}6ý@ÓçÆ^úÀÞ{ôÈhO<"†YdÕ²XO`Co0¥÷E=`ª!›®4tÅüpL…yUaHêúø{F=ªç¸âÊž`€ÐiîqÙéÓ›+V³;úõmVïìÎZ!] uÕΔAÇßl>ÂgØ‘¾oµWNRc¹¿ç-ôÐhêü Û˜7…ý68˜n>ÈÎÔÈ|éò0Q¸Ýψ޳ý’öõåp S‚_ ‰å‰€H)ªØ¡˜§ C~%ıëÁ¹ƒ Wùvnœ!„臈ÇÏ–¡˜– :Ðâ“$y‰ÿ1¤™Åw–Hþ;ž>&[Qñ6íyOêòîäÁñ'yªý¹Ð7Ë7K:O>Ö$7ûœžNâèIqÕÆÉö(á„°f ·CúìÝ0ëé&¨vFÀ3º.V~ì2mw™â"µd4 ÖdÉúäÒÌ/ŠÙ¸UtL {Ó¢Bݰª BxVÒ:[3vr.{ö$c‚V”h¶Ë+}˜Ž Í­È3q?äµ}‹Ù¼³O̳1Z‚«7Ó;Ä;éƒÈO oÿ‰S,ƽ<ØC†;îOa¬õæFßÿ//"åó¾7‚½È®{ô)k:Ú½¨¶šÞ«zÈ„‘©^¨³ë\¸ù4¥Îãí üq´FŽmоû( 3zÅÓ¡ï4åÔñ¤ zg‡P*6è ×3A;÷ÿÜÝ<u ‡BAýwmÔÿRSþ1c£üoÞø¯þkÿ4<Z(f¨¼ô„¨"ŠQŠÚÒ…­ûÈ"À#…À*áæ.I ˆ¦çÆ¿77}š\÷ªv®/ÇøZ°­}6}¯Ÿž1ž×ž/<Ì !« ¦Ã2º·zÎr½n}Îîüüþ‚ ²óP –+Æ•YÓ²ä29s—Àjå- ÝX*Åý±’üÌf¢Ù ! RrtéÁš¬ã^îf¬åت®ßãÅ`Z‘´Ùl!|\žÛÌ*ÜÄsý†áÈ`¥Õô+’uŠ©¦Øÿù>{­‰¹ÂÁYJ A•ºvã†Òˆe Âi)2lÚX{Îá‚.Ôƒ%S!ibf fºà:.YKwÓe¾n”Y#~Ñ Jž Üì÷P ã¬|W—3QoA±B¥ ú­€¼WCÎÊY¨ñu>¬€ÎXdi(ÐâÌ9+ƒ¾aĺŽìÄa2޾@Üò uî+-çN©%L²qPÛïÿëF­—:Õ…ÍK™ÜÌ##IL«>E1‹R+°¥0«À(Õvݧµ¤"É€Þ þÖ ’Ÿàr~_°§¿ —Ò\$ž3+QÊQQ1+‰åv!Æ]¬ŒMvÐzQAH±œ¬Åh¹€0g›À`€p`üÁ—l o^¶ERùÆýv¤/Ìã>?PøÜx¾õ¢*ym– 'î(Bçõ‘ÝL©`¶l{¹|!ÂW:FiÑÊcY\_à´E¼Ô.e™—“TÆi;wEÿ„¬Jy…2j÷}fm÷F«±R“õ˱âÌŒ+ø² `E© ¬Á:([ ‚¡ð€…diÜN©–4Ù ‡ à #ëüƒb‹n0½ YOɈ¤§ [f>FãÌ{ùÉßlZöI:–R1i¹WÃÓS’U ]uÄ ¯†!ë-&« »:•×ä@ädÏÍû¦¦_&fP¦Šàg˜È­¨³Ì­é/ö][?Ë!'`—øKüå#\Åt&J‰C|2ÄT¼:J÷4¹Ä0ð¯Ò'<¹êýë­3»6½‚²Áðö¦Ø$iy/ƪm4q˜[óÜ™P/ÔæÀ ª8äë“ÛÊR¢¿bE¹£’¨ÙR­oŸãá€KÛ·zóÙY ‰25Ú‡Ôÿ¡‡GB}€¤þ÷øæwTÄålZ¬›˜›xÀƒ'ë`ɘbm’"Pôõ G¹cüË6ý´Æ&úÕ«OÄËje dû(×-¿ŒàÐèë?B|ž¬8Pâ#ÌÄýeš=ÚøänÆ\x…ʼn‡„y‘Giß«7íO¦9ÐáÌÆ/%æ@»dØ3t ¼ºø…©¤‡ª=\ëäÆL¢æÎøÉIBÄ?Er¬ Û„}Ya 6l¢-úÀþ l©A³þ«öùõï eù¿ôŸõÚ„J7Ò¨‚˜?¼ng7µnïJÓÖö›¢}¢‘$\ET!‚1—ņô ÚϺf>H(Á@‚ë¸ÈÜ n•Ô`«Ô ÝÓW¯Ý?¯yüÀÎ÷,!óHw‘Ú£a¢•먵àL¾¤Ê*6þ3Óg)iš}3ÍR± ËMa‡Qá52ÐEEîçD*!«Á)¾Ô3UÍi´IÙ%²BEYæ#Œm˜m­Âå/¼Xú‘óxÜ%~ aŒxà»/Hd‚í( .BUuJ菱×RO‚×–’æ¯M"çxÉK=Œ"hKÙŠ¾ù4??šÃ#¬¯&¾9¸NÝê´.#hù¨e~³¯Z©§3 {B<¸r é“ß…¶Úœ@çP—m;àŸ»LþÉE_•ÂÙgŒ³Ï„‚i‹ögðX¥qzªúì{Þù¥^Ù€zjV=RÞ_SÁL ä#~¼mú›“4‹´HßܳRs Çð!SwxËZ}M,Áâí¯1ýNsÚÀbwiµ7ÏEg@Ïãê{N`ãŒðê3>R…šëØ=¹Oc\ / „øö÷nÓ€n¦u4–vÕûD†s¨€€r@ÿ"Tÿ/ùŒO(oåµ”oNµFÒ©¸xpÐÀz3Ikà&,k£zPÆxÑõ91BéX’&Rc"Ú ‰%2Jc»$®)óx‡l Y”ñM‹ŸçÅ‹TÉ­‹éfæ%ÉEŸ ï³Þ2³‰Ô€÷§¿n{:³¼¯Õ{òwŸ_)G"*µ½WD#,¤õ¥Ô¶ëhˆ#´…Z{žu û)Ëz# ö9ƒ›Háϱ)vk=¯tð5Ànײu8Ãq3‘9ýÑòïÎÑ‚~{OäD+bŒAë*B(•eP‡OV×` JÐQ—¡CSÑ|#í<^èJƒº¼~¦&ND«šˆáÍ´·õší†Ò=ªÑƒ*ªÀÂ&f…::lÆà(ÛÒµñ!œLï¬yñRôhPãR:j/v¶/Íýètj­9Coe32tk¾¢f–¤JÌ@ìlü†¾w`ƒ:²í|SHNª!zS’…J¤qe JgL×à­)ÏúátöI³)w 纟/â_Z}ªô„Œ­B}—â•焨Op´E²µèBüÎxÊ>¿™Bs–zéỢ‰ã9¢R pqê,ðõà o@Õr¾bòY‰#Z27ÕxIË–ð¾§{§#\¦°Ó€`~KŠÅsôf€©²jó€ô“}îËm SL9\èÌGmìŒi3e½F5aÛ"2d ŒHУ­[ç‘V ÂQst&–ùp᪀4O;/"{‹ÿ0vê­5#÷Ѽִ0LÒââ41¾æ°Š/·Œ*´ÆÇëÂÉñë²æiA‰Ì™E£dVeý)fs6 Ùд{€­¡8b:8Òg~L* H¼„ÌêjòÕËî#¶ÀÉaÞ²›¯ÍijܯrP‘±p3€ÞT¸Ôp$`%Π½`·ÆzÐN£g5ɵ'-+s¼öHRwâènÖ·º‚¯‰` Ù'8ókÂkó÷‚ç=ØO.#‡#*œ#‚aæüžÁ—ôt« үȒs’Ë¢ª M¤Ò±RÚ…qxFŒ f,*;ö#SšRâæHp»Û¢˜e*_cøú=§«cçp$Oüù¤ 7sV›Õù±,@ŽtÜ›5„öý6¨,è9Q»Ž;<¸¾B2 n u'@|ÐÁ‰ü÷{ò4z2L ”b®C×ê¦ÆF JԆż‹æê-Û¹g'°PÈ„°C@­B÷ÏþU!ŽÕO™ÅC‘à;‹R°C“`›ÐtäèB{ûL øM’òÙÑr,‰5:iøŽíüÙù$ü@;a!=ÉŒD vWUÚm~3yá¾bÐm©bâ fîE¨ ÂNÔujf–·³ÿ-óyÔ3)ô›V3':”à+8/i sF¾>KÙöZØKz<Á޼ú ®ÈdFB¯‚Ì ^ãù!ÃÆ]÷a¦vmÏdü×y#™ï&Ê¥|òsj™¡@H6T)²3RaM®V9ƒÚKØÓúgŸaùƒh18ØËÒ2¤bÄKó0GP6)¥?óÌóëtèn--Šô¼aZFÚáŸ.–)?º,ç =ÁÇØç×,CãÊ%ËùE"UÝÏpþP²7åˆR°êyDá%5i!ïåi<ÏRLê%y“ùj¤Ÿî\%Ô¨èÜ|¶óP\P¹E¦f$ÐÓüA0\UTEÓÃøºeì<Ï5É7ÊË&óY›šB 锦~›ùmæ|˜›Èá+C¸<ϱ)ÌvôŸ½fóŸm~mëÃÚ®í„<3ßÃêÇKÛ-Íè~бY¢þÔ©œD*/eSÿÄÆë ³{í†Ä}Ûªûò‡ûnDȬ‡HêÕÕÉaiý&ï ýÙLXq¤ U,žøß Êú¬kÁmâšÇ¥¨Ž.qzÇô ´óhAÌ9yèåŠ)qµ§°¾ ³<…K#áW² þîD‰ÇÃË^¡£µ©´ »©VÐ@ÆW: ˆÏ†ÙCúp‰–X´VacªØz®C ²µs;/`]º,4ø ¯.ïŸñ;¢Æ¡Wì³( Ÿ¬48 ÇŽ?L•n4‚C*L°Úq•â$ 鋤U9Hô¡ô+´6š*å>šˆ:#4>¾Az/LÑóh|“{E±Sý´SšE´•o5&ç‰R< Ì7²JÎêÉ£ÏÈ0¯$nØl}û<¼Y·Ñ4ÍÆ—{«‰FÔ²úKÄ&—šÐN|>à¡q ö½á=–71—SPph­ Jp^ Ò¿o}”·ÉúçÓ/¯\}“vÅm¤gÜIÕ´/o|¾kû¯¿2;ˆbáé‹<`J~¸ÁýÒ~ÚÚ¨^+p˜vclâ/öØßÀÃ¦í»€ºÔÞó`¿öxý³;h ßMüÈæl ª&xƒé´\gŸD†EÌL¢¬BY ½nì9À_¹‘­ƒtå3Õ茗ˆêOô–ÒÃU~Â*Ð Y¤í  EÔ­ÌíÛÁë ÌþüòFZ¡änð55Ô Šï³ Jªê§ÝRêß*•{’/LFß®dô;ðPO!õìój±ÊT̪Æ,ÏUœÞµS%âïuà?1?¶+æQIyVdÓ›î¡#å7¨X‘¢kJuk›rðM tÂ`K&Yk.`$Φc-WÌh¹ÅÞ›ŒGUÏ业1ÊU>ÆãH6ðIWzª-{Õ“RÙvëM-¬Pl2ð« Èa­ÖtÆ:ìæfÎÅ»f€¸~V³K »Å:i$?Ê‹›IÄ[ÃO¬>E°[Ÿ*'QBlJÙ#˜ðoœ)8-™ÛíH¶Ò½Î‰é%·aU-©Êó¦”Ú‹Wf]ÖT ÅŒŸ÷5:õžÖ þgX‚—J¡™ÌcUÄ8ܬ‡²ï'*ÌöÌ>Û‚ÇJÆôÆ=~ýC•èªÏ ï½eç ø*,GŒ&ƒó-fUšç›9pЋ"6лp“¹Êm4ËR×%už§² AU,N-¶å•~~NœAü±sHâ4"Ðô 3¿^еô2mÓ·sI—ˆ:Õ”TŸWŒŠ¥Ù hD¿þ™våS8öl™9À>ÄÄ®]ó iU¢Ž>;XУ`ƒ¦„öyòªU%ø-$÷üo#°-2´iõ(U-!l,Tr‚éЄ£i®P¬JÀ Q:ѶˆkäQ¬TWƒ šj­¦l›—J,(~ Û âAr‰¹Z¢lh§²¹kGç­¦]9u‰ôýv§@¹4ñ2¸° Ŷ`ÇÏ8INf´ž³çÊJh§X­JËþS%¾œlÕ9Ö>½íÇÕïôµŸìzQ Õ*Ë' æ÷ å¤Ú˜à-8OõéßÓöOåÄó Z¤H“DÏlŽáñ\Éýt¡kÄ*Ÿðk*eµKn,§r梷樨Øi[  lXòŽ´Îm8–aõIxq4ÀuŠræÑ"E]R¤—²q_þ:¸–³ÖHŸ}Óë°&2¶e`ÎlÒaÇÏ-®âÉïTÿñ\¦µÐª•x­ (/°UýKs'±Ú Ê_AR€*Ø‚{áì`Å Xß † Ô¹1bmÙÍç-ã9†”UˆÃº¥iöm Ô’Mï @C;Õ ÜïÍKÕÚr¾¾çÞ{@.G›§QùîÔ<—Aëß’³Æ ñî‘„ìÏ—ù÷®µ|Lé&.d® EÛdw­ÐR›eø¬ËFŽÙêk§é¹‡ªò„,ÿyç¯J‘5rÒN–Nï\ÏqîØ vô$ií¸{Hˆó¥ê\¡†ò޺ʕê\QGkƒër'ÒÌhi‹¬yoqœ9ÀŒ¶Ò¶R—7òíEýL•wß² ö½gp…zP5…K{âµ½ý;yÚ¡ô$ôóg—ù¸ˆ ÂûÒååw«¹ eõ¼±Šî—ÖW–›dƒÅÞµXá#ѹ¸7Áw‘Ò16+C_G þ›lŸ¶Ü/³*¨"½3(æSÅ;¦þ3½_k_+ ñÉ|§\~ã ¸gj¿ð_,Q}¡-çŠ%,è~cËIѵÎO&í9ž›Å~=_”%Þ}}pÂ6pŠ]>(¾%½zÕ3Óæê¾÷#\b ^´6·5XØ)íB/P?¼ùìöBޢ殌ð²4´Ç‘±¿Î'±´ôqöôi¨h;&KEê•v7êV*4ë¶Ñ7nÒ[œÒþ$½Œ&àTÇ= |¨XkFÛœl°$Ð D3®®:SªZ®V¾(P©ˆ>1ºb}l»kVw–YÂ#ñŸgŒõ³½ÕrJ¹èß²˜tä:õ‰Ueéø¼ÝAÖXðɆ\=aÇ- Íìå³î°Ʊٶ“ ª½(LEüja|U¨o€'‡e… Ñ 4ô¢ðMvÝw·tEëŠ[̵¬ v-0패àôº²X.ró¤ßU¹¸-Å»ÕÝœsN„'9‡IÑðqös ðªgèhÆ§ä ƒmô<‡GQñš€áK;î8k”œAú´Äõîf¿Z#ðÒ?éŽs'æ§¡,'å1yFë:ÍÑËͳwQÖ-Vií¢¬¢x–óE}QòûF"ØÇ-ªq{¦=Çy›Ó!²¥¤Í4ç0Á#«£ýHnªìè|Ñb4L/·@á>¢çuÁÜ..¨ê'0>„]9;5¡ö†¶Ô…µjéÅ*"“uGʶ*’žÖ§0 ȶ«Lqkúófô`s{¶gµ¦ª_u[òJ"l]²Ásk¯÷¹(#&f'¸‚]avÕÓBÞÈDE®ë“g=ãâU4i¤Ú»j:¡ P îÐ<"zÀv#¦ß\KA^¤Ú„­ùÃ-È‚Êbw9‡Íùöh¹»P`Cvõöù€“~c?òž…ÿ<±Ð 9ÁÕU=ð Ç9±ž°*Å4æ¡}š|UyÑ*Ÿ16£Žváz¶Ïâ“<â ³¡nÚ·cœúQ õÛØ§o\·-XÆ8Cè»ýæÙnëÍrý-r#âLŸ·äóŒºøíäŽ/vî‚_°ôL2jô Ì; £'*àHŸ_æŽ4Ðyn´!9gŸœ{Âë¾+6÷äëp7ø¤Ë5øºÀokOÐ3]vNÑ' õÿráþìù¾¶<–7_õÉ­þCðð‰ƒ§†ÏUºÄîð¸¦Êç#SÀ®‚ÕSAužœ)Z¶¢í)M+`ÑŠ:§ú[Y䦨ÐføäãBÛŽÖÆ¥ ÌÞº³[ÅöHCàúX÷N䋉¼ Çù•H ˜Î5½·/þÎØ¼ÛŸ'@Ëçªé•D{Ò¤?Êè‹û8Èú€ò‰6Š*ö¤ö.ÙüQžšh´ïúÆ’b›uÏÕ=€òÙŽAÓÍ®‰Ï;­ z¤iÎ=0[ÐŒQyÅñ…÷¢x¿_&Èó€RèÆ„@\Ö!-C ¥ù©£m ¹U×­°qýTêNª¥¸2éÿJòF€èÛÜËQ”ÿsÃëÝÉÔ•UõÞG¬?wGþF¿`~ñ¾[ÄRÝŸ#B|HÉo^ûœý}ý7ÿMxâQ~ˆ={¿K}hž h/O@Ž_ä±âŒXýh® Bêyâ†JœJ+¸äµTqƒ„Ž{ÖÓâ’ð?l’ˆ¥]Ùù>ÏOF9ˆ·zØY2ZDeyì¤}ü!2Ûé=Ù~£BB/,Y?!üƒ2$šßœ¹øêS¶”ï´þ92rþ©w—Þߢ9á a?-½Ã‚bß$LBùãT(µôILƒóu—¸åOGLãÝz°K, ‚Jä Cå þì·|æFž#ô³úýâ{G}?û(‡©¾ù@÷à t/ óÎÿ¬׉)ö÷…‡N[¢HýÑö¨ï\?tšÃ'|úÍ-ýÞLØxô¼W€ïlÏ´˜ƒ•YTÌe°–Y99ÏnõìÒ­ÚEÀ¥o›eS ônî§×ø;Mïa•ÊZCÈ`ßPoò‚ç3}bR¬gP4Ä}„X)6ñ—T+ÍüwvœÅ“¾X»!±GfÁ]nî¨qbÐ'—âª&È–½-°±ìõ‰¼vP º&6{pªïœß¼ø_⟉S[þSH:jáðw'úŸÊÓW&mI!Ê|¯n|tc%Ïψ9ß‘/Lj±Ä ²EÈ?K¿rE’è€ýÑÑ#iáaL&kBsŠhŠòÌÅÍĶsŽ!e-Œ‹žAã8@7©¥4•¼ª»cË.ü† KòØ‚¿Ã,”ÉÞáRe¯DíÉÏÔ!ý9(õNHTn±k£°éòÁ¾À ,x‚Y•¢ìÔ¯§£ncrÒ‹*ŸÜË ™c6íï5%0™.€ñ„‘¬ÈD•‡Ÿ-ÈðПH›ëeþž /‚y‡š9GÅ®-ôÀV* •â* «Ow›i¾Å}# «šÿ5ÝÄÍ8Tü"Í™“TG6pÿ[RB›Ã¥QÔ08¨ãú›ðSœ™ºªgœ°{ôŒqF ¼§ì¥‚•ÙÄ¢¿:Ãù~YhtyH\IU€Ž«µ •XG¸´4©« ëq]-\¬.§‘5¶-¢¥6Ò®Fnhœ`˜©¦,bðm¡ÆP±¼Œïº‡ÖA3¯À•íSúÒ^9.­4nšýèŸÒ›Ö{‡nŠ.Z®®¸QoL$Ã`ÉC0viK*þiÀ«´cMðwpÝÁ­÷Ji iœû{Ð]Øý)þެ@‚Ô¹v÷Tž-÷qíð©ù¾“•g [ý÷–5†ÚÆò›1'ù3êöàµëþmé7)ÝawN»cÓÝáo´°ûèûíµ{^oZþ‰¬wRÛƒ£ôW:Óî1­øÕ6Ë®»åÞGÅÅÛ…ËÒ2‡E„ýÃDb´ï¼ת+ƒ×¾’‡Kpõ.œËÜMâì²%”K±ŠÖ3„óü£A‹W y'æŒÍ¸Æ7^•b€œ#»]×÷Ó=þC×ËØ²ì‹ Ê%[‚·CwßÝ…¢¾òk8oš`JÞÜ wwQûtÖûÍ̹Ÿt2Š¿Z8w¿fe¤£ýéˆ7-Ø¡ípWø`]Ð'ù¯ê27å¢Nù +ž‡6 =°U“ïúC‡±å4hñYÞË)P§¹?¨ƒC¸ƒCËÂñðW«C攲îI²î!²ëjÚJ‹y—·¨•|a•òÄX9'Jåøå,ÑPû;VAÌoh I,Š\RÚ!5P/á¤wÞ/í¤}›BËžæ¯D“”ÓÐDJ1®üÖ;bh³St¸9;\sK²½ÕP/)/EM¯&~ÆÍòÐýÙòu&ýÍòư%”¥JzW: ; >L©„ÒìJT»ãVïo–‡óŠbÜ[óQ7'Ý” & 8rÙïy5A¬jP8‘ׯ$ôëh-xKzKI[Ô\¢dA”o9`¨ºÕycøÚš–×@ÊSè•ZÉÿÌØlµ›±~‰Õ/rW¯–V.B 1AXØV>ïût¬"N“èñ:qèñ†õaÜ»aú‰ß¿>P“Þ:@¹ÐÈÒ}8bîy#ëÌ"Ì#'WS+¸¯î[î‹¥)'Ze9}³­”ÝHM”ü…ï×IÕÏR‚½ê²Ë€?ƒz©T¶IS÷WÌ™æ{¿dM;ÇgSÔ2…xr׿/’x*À‰Y¬Æ=¦ñÅÆjÉ¢ZЛ™3‡?ÓôâÆ¥[P×>nÉ‚‹˜[s ycP½’gq )ùQ³Îo(à(ã+а[íÃí⽿K ðáó–fÒêÉØÿk0v>8E‰·¶t°úÿ7 6Œè.ÍœµOjÆû·è.Î3áE*u -˲֥ìHÉ.°º'ÂYîÜ«ba­â`oböý?Àv¹*Ôx@@Ž<ÿî{Òÿfü¿ÿÈñŸ³ß5w­´ï:RñÆÇlÌ`XrE¡PR„‘ ’x¶õuxuWÜ1Ú{þ©H“ y9ºsºœäÅT%. ­NuW‰ ¼fg¥N‹‹]¯…Eà¯9/ÍVÂïÂW绎³O³¯³Ë³Û Í ¡ŒA˯Æf‹_q¥GŠÌé2c3çåHÖWmtF4 ,:öT*x+c/ú2qâ±Øµ³Ê÷)\›6Åä1Åʺ¨*Ôz(FbÙu⨓…Þ›¶”1d—„…Å1¯™ž‰;´$žæ»ûK&Ì·¯eÅd­Ú~›\J6e–×È ­…ÜÊAik.äJˆF¨`ãJ]6ˆ8’˜Û=ÚwHzSzSËg-¨×óf2uœ`³'‚F ª¶^/†£ %ºnu’=È1ò¦h¶ITÿ²Ï4V$ •ž1ŠE;Í!( í­ú‰,{w_Çd.ŠpŸ YŽ‚{âFµ•‚ÅÆç¨ AgO¥/¿!¨ ô„ŽÜ·×+¸0Ù¦(üæ1L·}³ètxŠ •ý´zÖµCâ·sz/ÒªQس±J¯FΩ}rLKé—dÈ{^Zã%ëwòiid"á €xJ Û£?2¦y…G¼m5úۮň©ú€Æýä¦ÈvÛˆUk­·ô4~.&„'}°‡.;—⩟5{ LRÑHh˜H!ÎYa4z+H6úÕÊ]@é²1väЖ'¹mK¦nU± ­ÁÄé—ö§v,f¦OïgMp–R¡Þ|ý¯³ös92’×ý)ìÞÀ:Ç”þN ò7³Âí7. ’”®åøo™#޳KvGá>BêÕÞ ÊÔŽ›Ý‰qw¸Aw8a¸¥d÷{ÌÞª¯7¾/\)n—ñ?üËzƒŽ{ÐÕ•Ùàß~LKÐMÉdoÞŠñAj|Ï ƒ¥y}më•¡¹{§Ñ©Mæ0’Ziõ»<“LùEÌHÂ_6p]gGio-0}†ƒ§ÆÞp}vX+ãÑåTÕFà§<©)¿9?ñýœhj:ôÍßP¾eb£FÇPˆa/=Fl7^O-lMÒ>›Ò´ß¨•9‰r –à X¨uñRçðб$å-ÞÈ¿EU‰ñÃhÑm\ö ­`Î4‰ Çþ_(&ÚîR¼ÕÉÔý4„I»+ÚhÊÂé3GPJíÊèyª›ˆ7¼(rS‘Í•M2Ç£©Û6å“%DqªúUŽr…ÛMt?[ñåŽi™üOЩ]bœbÑ(޼!Rž:üHÒçAOª)ËÝzr™šÅ³¥Ú,|æ¸maÎPaZ;–PGºc…©Ž¥å&̧·Ù ”Ó:-Bð€)*¸ñI¨YÕLÍšqÚØpíTSmlÇ’ÂU¦Ý‰É’Õ‰‘Úa9 Y&TBœ_ãbÀŽÇœþÕŠ¾²`ÅáèêA– J†z_HgWWf˜CPiàïsÑ:SØç%–Cð¬nÖøŸö-hÐ:„ñ¸QÁX¶Ù!­|Þ.,6ÍBÇjªN¶pìj¢Wη¾leû¸w5Ÿ íÕò»öÕ$7𫉿9/Ç7³žt³“IõïèT%³'«™£mhåbX€Ç¬¤=À{MŠ)~úp¦¿È•J˜Ñd5WœÏn&Z¤s¶È Ýÿ ìƒ3ëÚuíŽ:ÛèØ¶mÛÆÛîØ¶uǶmÛ¶tœìç]k¯Úû[Uë­ýÍùcþ›Uãª1F“ñò¾=œb¿.á%Þ€ˆdÕœ\Ÿ»êzJk¨¬¾énæÕ%õÔ¾×mò:?ä)”Ö´ »Ô'9Í› ‘pøÜ‚Oª}Í`b‘G¢u»|v[rŸ2‚û×A[i”©ÅÛw¶î쫾¶,Ÿ‹Ù!3„eã?=1÷œÑîŒMÖM¼ýG­ý÷¼¶¢*Šf˜êB%CRç8»Ø[:xDFa¹QжÅ?çæ0K3HøýÍ{¹úDf+KÈ]ñæô-aé°‡«ƒŸ“ß•÷¢ê±ûãÈßÅ]Í:N˜ý±´LOáê¯ Õ÷-"Ò¯gD¨G²p%?‘…Ó6l“4Á_\Ñ‚ShÊiÆ­ÌÒÆ¯£ßvËæÉî“üÚ Ä‰†ÝŽrE€7³ütGøaf¿!ɱA æ°Öÿ l{2Í®O«ÿÁ˜{ÇõÖ&B£¡×fTÍý·í (RÁŸJX÷}îp„ŸiW‰Á4µlψWzTm½JÇ ‡]5ƒÙ2ÝõÛ|!±À~òÛ±µŸ|¬%þŸ,³"`zü;*{ïæÓY$,4ï :ݼÈ1[´¸ÿtÿy´j3p OîŽLKŠÔ,©ZÜ Yj¬ï\Nn¹jÐ!ZÛ7ô&³ºë¯uë}×t(Ë[3®r›Ï ]ßô°¹®$‡Î±òJ›ß¿Ù¸LJrï¡ ²b~Ix¶š~¿ÕÈ= ãÙ~þUîÕµ“Ñïöv=|@^w ›Ãá(ú“?k0ö÷/ÓÛĘv-hî7\g.Gì…ÝóOMZ¼’°¾øŠ}Ì=Dø£ @Õªn”X7/ͦðå~qGª]èëš~Rì€=¼Y×ê@÷Ηœé}ÍÅ øS¸7¿Ï‹xò;[~aÉ;pÔªäö·EYýUÉíŸÃR¶Â$ž ¦qÍÒW—ƒ!]K½¹6®w 1UTPÛ{N‹h×29rHGÃK€æ%9%.!-ªÎéLÇl ‹ªE²JV/ûF0w=]Tm¶ÈöïR´w”*î*ô”>¢)‚ÈE£Â]§KµlMEÇÅ9¢¯NC¿íÚˆÌãØùʽ Ú& ®¿Y"$Ò°ÙOKÓÔÌ–v]6Í-ÍoZš!KºÓo—Bc7+ôN|Àé©Ò§!êÕès(¥¦'¶Ë‹ —+ Õû÷v4ïÕi>0¬¶¬Kípp³LÍ*"¹a¥ÉޱkɆá¬ycØ; uyTÅÂôç•L‰@ÜNúJÚ­ì%€çyI1wU[þb «mÝ‚ÉârºWJÿ š¢–GÌü¢k¼ ÷×´é{=‚rãÁüø¡‰þï .þ½ý? £þ³ìRJCçéM?yK6ÀLBžNnoj0_:g$G5M¤EF>`xøC8Ðy7…C´¾¾¼®Åªõaƒ²¢Äº„8EP ÙNZ¥{ ¸ê^ó™»îXÿîfgH¨ÚËtÛé˜øG}ŸðŸlfbìx_ÿøã¨XJ œ7è§¹¹èýy'1úˆu†…=ë]•ïo®aµå¯@ƒ>O<åÉŠ©´‹¨1{óûñ½ÿK¢¦¦¬C& º¼³}îbÁ¸‹P?vï÷¬ëé°«þ…ɬÙ)/þb,ø€–Ài Q£¾®¸¹¼«ÛFÛIVZX×ÊJWù 9%c¹øoÊ9¶ÿæÛ"~U1RÄ£½T~xúWØÚÂ+F=ÄbÞòAlèÔ=š¨çàb5ôʼnÂÈrþzް„Å ØF[…ò€âRþE‹Õ˜uvýR¾ ¸‘€”©4—±-ˆèÌ™•¹HŒcV}%%»ê3Wõµ+@±/M[ùxêX(°ú;²J‡¸–.ÒrmlÎCdùraRA€ÀÊ',¦UCÕÙ»0’|“U²±”2Y¹Vdw1é£ D¼ qsTÄ?bˆC™ ¡´Õ<¥BÁ!"-QF"°7ZuT²B•¦WB”Z\«­XdÈbÔ©º6Äjü(ãžÄàˆùµ<ˆiÏÅ6Ÿ–y™;Î2ò þ–9 ºLè*Œ1ÄÉ/T 'ŽK…_á²rÊö@ÜrõÀ+ôtæOC¨ž¼e•N<4‘ufœFɉ.yjªœ®63ã.ðW!ÿ椋¸å.á!î"žà{ ¡mV0œ£j“À ”»oó&ʾ· à,ßjÔwã“•ê˜XüÚ7>"’”×S%Òäy‘ºU¥×‰GU…%/¾ó/d sCÿ¹1&çDÿ KE+,-[·d²Ù¾•y{ý`1<Ä A1ýT¡*¦µ5ôÈ׳ݜMèÅVqÚãd‰¾p &Pd153¨âí<쬯K‚Í~U–DjaÓªÔ‹õ„襪Îr²¸Ÿ8C½f.Úñ#¨%ÃÌ>_=MËåÑ–€Í{ª<Ë]ÅÓ?g F%tjö5{ 3é¡\Ì‚,©¬ó hrÿd{q^X ›NÌ9Û #(È…í<›WÑ!– ¯®’€ 8ËzŽ{™<ïKM>j…‡–0‘ÓäÅ‚*ö°È0+L°€Z "ûÕd¼TçS~Ø2æïÓå(¶tFÅ9°/ûÐ_c7&%—0ÊvŸá+)aY§Î| ðÙQÚU¬¨‰„êÇScü–èkƒöÒo»q™öÌ{—Ù f Œ{<lã,MÊ¢trÉO§lh¿‡¯dP'ÙY m"Әﭙä%F¶(kÍ@Û°çGó7Û%™DÝ3TSûVÈe³bL5û\/Å)E‡™ýµ v­{êÏ´ˆXc «6þqñÝGü‰"+Wÿ¤Û?E&©eÆLbøjwa°%hÐtފâð>Jð[×ýÎu+ýøÍ9ULü<”šßI½¢N¥·ß&?1İJ¢=±Œ0,ÙQC“yÃàBKm dö!5ùÅUå•Õul6ihÈÇh3†ýr“¬H qèøxua€·uíóðŽÒÝÞG\SYU‡ÑûȲ–0±&þbʾܡ4ïÈ)gA*øƒ_P¤Û&!ú:,n|n{‘ EWHXãøÊϵÌiÓøX‚èØl¨øíûÒ"}F‹ê$ÔÝ\°‰&¼ØX¨Þ´´´Ë¬EG™“­‚I'òÁ™ Dl?À¾•ngœíŠfïì<šö{Ê$Z\öPmǸx¢ÆbZT´h(òÄCωÈPîˆR®Ûæ3FM¼?Ïû «V~W3y0á3’pgä¤6ÀN 9|nâÆ‘È(ŸÆåÎ$?ìY¡ƒ÷gìHPƒ°ˆ—–sˆNžÐÎÌþ|¼ZM÷d>YQÞñÆrbŒ˜"•ä ×Du ¢~©;a ãQ¥AŽ¼Ò±AX‚ ­×b$ÒG3“p=pßPHÂG2*£Ú¼ïÜ]üI»Ä;² QŸa5¶¤vÑ«“0f?¶ÉÚ¥Óÿç¨Ò&ýƒ3>x!¿wèÙ£sÒ¬wŠœ÷í.Ô¢µÝW™R'ŸÚ©ïðET!¿gÇhjBkÿ7׿èy‰ ¹Wˆôpm%ЙŸ‡…âw`üSch¥Kú9¿õáWŠí8­ºi¶|¡;8' ‡×C3ø4Þ$J)ªqézl4éŒ1hSéAéÄŸÏ%ç_UpÛÄöQ)$³9ry u— ÷RãÈ«Z{·ÇÜÃ{3½¿êŸ'¶rzÎ8Fû¡Å%»‰ýû˵Fq8«óïo ÊÕgó‚Ä’aé§h‚qkŒ:øt"XÍ÷xkÁ¬æÆ\©ít|³mõv=íñßVCø :ë¯ ªG<7£àZQ–Zc‘·eÏ’ƒ‚óv¹:GìVAµ–=;1n É ¯]y·åŸ/Øl á¥nA¼gRÍ$ùHS´¥6˜aâæÁm­i¸A1ÄmãKE&à/û]}«zÀmIÉPZ ™Ÿ«7…u®Ñ$v ¡.åvó7Å©qÓ/²ˆ5Æ%‘ËCWSŽ8WÈÞ5‚~–Œ:¥à¹ßV©“ÖÊ#jÔÐæ[ãæŽ“ìB$ö?O#ó1XÆËl "û‡ZB:¨® sœ­Ö2$ªó§LYc"HëaNÜØm¢zÀ7Ò»›¾R,­ˆ-µí‰Í Ôqð}eÒ³Áï9cÄ{gãÂÎ_ÏZ«%iYÞ¦1DNŸï¼Ú(qq4“ÞI‰£º…­î @À(k <§¥gˆÐ»}Î mœ/¸²<Œ”¤ÂAÿ"Ä…ÜFOHî³6 ´®ýmñ¤„œå¢þ7!Ädž±¹¹ðÏ"pLt–“Yj_Wt«sfäW¢ Ä¾Å°›,ÖN2‹/¾ì'Ww´„ÕÆ ÑpIfà¼Ú^æKŠ(£ÎÂþ+i¤uT@$oáüzÈü€; Öt4Š{›hsJÌ^‡ñ‹`°1¸ö}6ÔGk?ef.\!áNúû¸¯ùë_¯n8b+ð‹q²[-³n'X?bñÚv"+ä~$ú6ŽpÕeT5äæg5ŽØÎ&/pË`¡âo^}N œáO¿eÎ{Üþ™;P=+ŠBþíÇë"ÊÔf]¢@ kòo2¬Uù;¹~¶X{ZöûÑSk¨qª€CÓMUäîHâ¢M;²×yÒ–}­æ‡m9Ç6üÆëÃ^ëP ×Ûœ¨›¾ƒÃ5åËø˜5£¢Õ9Ê‘(­Ù ’ÎÇÐE»TûÛô±Ï÷`e“9ŠYJ“W¥ÈÊà 5 :ÆØ˜í)wÀ¬¢B“% G5@¬LóPXa a}hVc?ôºŠº–žïÐß&|½qa†¯ -àÒ·XÌFXuìiLÅîTƒÐ „d"1q*§’ãNµUGÇ08û,÷w×ïeHÜr5:ƒ>bM¾€2};ŽÓ«W ˆoŽöAPS™ˆÒJëÕÍ>q—GŠB-±ùŸ,‰ö¸¿­£ Îhc§®bËXèP§„ƒÂ|QI»¥£.‡1CWF€'¶«;’Ú¤TµÿºjwA¶}Å‘úÅóZIù¦¨Ò¯„}ƒýKÜ/’iåøý#î1þ.î¿Ïàúo„¸ÿl®Ó„òVYjûöK”0µY£€FýU ðRA% “BdI'ý5˜,é˜+èŸ ÒRײZjWëó©8Z’UØ(w){__ç{Ïá{âõiZZ9êZ~þ¾Î#1 àóí™ä}κɲ{÷›hãùžáõQ¿Ñ±ÿ•µŽÇ^±ìxWnîÆÉR¡QpØ„(1¸|ë-P¥@´­Ñšëܶ‡¹?Ðl#ž²ëT7,wô)¨ê2 ë5+à³*z×ÐÂÿÙŽž®´ðìéÞüºq-i¿:]°Ð£ïÌ6§…7«™XÑçXm´„̈h­lésÇQ¼ºs©XѪP$¦Û ÄRXìâ8à õeDÁQ?µSŠÎZÇPXUM–äj9£è#EþÙï|d£S#ÐŽÒjÊM¤ñj ¸2l H‰:iT“aõØpÖª‘î ‰„·8£¢91L{b}ñFl® ƒ(^*6tº$èa3å©@ä÷^h°ƒ]—üˆoœ'žÒÁ=ªK$P}׆äÊåÄX…°;ÛI”(E3õUµ²Íy¬ù£B8TCÔ•óÆüކµ¨jh–P™'S )¢^ØÏ'^Ö³(7ð³RJMáè7ן†í /Q`w õëÂ͉OfuþØ4ù(Mø4Cát48 ;ÃUu­k»$ˆÑrNÒq«Nè+ZÝ@ĤZ† Ãñ†m°S÷ÐÞ`ep冲úænÛ"Sr5ƒ"ìvEž®,hÖA +4›Iˆ¾ÊýK±ývŸF¬"O:¨bSb_ìy¡Ê!,*‘*3¤‰©=5¿™¶\c<Ð(:1Í Sº)¢“¼tU¼¹Q€KIp\‘9ã,ôù¼,3úZR߯|TØ‘¶-Xg:•Î&œS¸>cb †2j›1K 6 ˜9…x1ŒÓŸ!CÌZé–Æ4Ý;\§\(0j[A7ˆBŽav„ýÕC¡g{ lœÕ(ZÔåÍU¼_C!œ3r~0Òrn:ã,ê3œ3½ÏöÝB<Ø—&詸æ¢t&S25Ù í‘X˜Ä¾Ü¤oÄ{³j=bÖ“=œ˜7·ÚzOÌgCÄ´ñq~dšú’m½s¯+j}|(éœöB°øšöZ×lÅà>~¥*V °mÁ%IÕ‘#ÑÎ:/†UYD‚“½¶ZÅʉ²ÿ¦Bì@E5’» ZÕ)Å»úãÔe‡öÒhŠ#Qiܲó¶ZÃéjåª"Áµ¦NÐБՃ*Ó«ܼpÉäÙm•M“[¸íÒa\£FákyÁnVmO@5*½å*ýšA©’: @´qo–¨íû‚!”&½«ë[«e$ÇèÉî«½ÄØýÆ’Fä±Ê ´8 WÀ,õ96Ž:>À®)›À›à =^E¨Ê¤Ê;ƒçÖ]aw¿ 8`0c:—á–䯒QwIÂZñZ`¨Éº¤Ðbôgyx4ÙÑk#XáæKpˆ ~¸ÚØL9Ïᆹ|Çõ–Uh=T¦‡~3C\%ó±F†<1õ®¦(lgn€ã.[µ>_¦°ÌžÖz¡°°%6Ûv—b°…ô¯^‹â¨e÷?“¥¢M;+hº5º`7{ìA€¼Š Ø^Š™c°bkt˜§ g¸9ãe¼ØU+èu?Æ[ÒÓcë)Ú¡ìvo‰Ã÷¡s²¢Bo÷;õ¯ÿØ;¨£‹ózø` dHõõ7!ZŽþ$Žö¢ëµ¼2I‚â:ªêH‘ ¢º¿K?šË­íép·Í’as)zO^ a¾‡Öùö)v÷æžÚR9'”¸þa#×f!‡(Ð/ —,¿WÕõ¼Ýy©€ñÚO19…û€ó3{Ôäݺ´gÆQøN%ãgVÓšæŸ*ùf¹e­ ÜÔP—¸xȲžžR*²°ãn\#Å +Ûnjn™B(×(:ÄÚGfDÊãËuX°|H;ç>U¡dœ]TšE†Y+”ck9¯ž ‰Š¯ãI–Z¾¨›Œ2µ NÄØ+¬ÃOþ0whìêX€a6fÄ&:#Bº`Ò°lX">¨MT$Ãf’ô–¡®Ûmkþ°YÍý‚üZ ½”?¹pÅîµÓìýk.®p½Â–jô¶A¤è×9ðˆ0ZŠŠÓ˜gšA蛞c‘NßÞè¯5-CǬ¹‡Î¬z µŠ š:k÷I!l0…È÷Qð•Ù°–sPƒ ÝÚK‰)—ñ»N@¦-R›H$lè(Ôp£¸Ž7’q•l34_—’!Â4›xRÆ&iò©`9¦áV_›ŽGdF/¦ e?~ÃŽÐ(i’[ÀP:Áq*Å+¥ šÞÝ2Ã;ŠHÚøO¦BÐqf<‡Ù#•¡ ñ¶¬Y¯Äx¾ >½ü¥ªW.2‰¦ÁvÌ•¬c9/Øf_ˆl(#›íV·<O­õ{Ž.¥ÁñÖÿb{7l.¬*Œ8–›/ÅkâD´º´³-¬âkÙŽŽ¥ D+”¥vù›«^ }Ûôì I c'O/Xóç–`Õc¿®CYºá*ëYÁYÌ{UdRÑ7y_Å,²wÊ”»هǜÒr§pÙ~xøYù—£1ÒæˆO÷JùO¯3dÚÁ\J\ÅǰŠoŒˆ­õwÖR*8Ÿ]­2k.¦¦ì4娌Üd¿Áçd2`›¤ÚÚJáÔLý!"A’¤êN*2ôeÒ ó (F,ybZŠá"Ú•à!ÎdýÌÖ¶áôpé¡n'eȇ ´Z³õ£e<Ó¬‡еŒxþ>$–ÅÓDúfa¥r”uƒjFû¿úÏŸzUö¡Öö„–5Q^HC¬QØžl±Ã¼ÐŒPBÒòØXå?é“'túCv¼vË ù•޲Ëy"Ëu G“ïs2Ëi©×/­ìªètmFYi—Â\ØG*µŠV×iZ0‹ºõÊü „–ĆDìØõº®·6»U!Ûí‹øÂ £‹ÐŽ „-£UQbÜH5õ•͵/?Ö+O¢ ´Ú¶â¸ƒZ 0ÀVøæØ…6×_Ïl…¯‘ô~G¡ú”ãFñ+D%,‡>SŠé J€ÉN›‡[EEÏsÐ5Û˜(¡¹dÜÅ„}SÛÓÝ$Àïî¢o³Ü+óZ4åzYÓ·:ˆ}‡µydšGHßCÓuÃ+Aþd£ÁÝs­¾Þ±Å?[ApðWh)ãx+f£?Âmá‘ìúTà_íø2ôyó‚|ûûtßHÈ¿¢Â[<‘åV§:'y– ßîµX9;D:S|@ìr¡cÁÚ…ï!æ[¤/ÖÜqüè„ÊFßÀ*ûÔÙ)BõÊ*?££w% C53AÒi©Kj^¤ö‰Y,Þc;ŠCEÞeéSåܬ‰±;'|ÓóQÁÊõ'ÔrؼY|ÉÃ6?ùOÿm#ã<ž ã•´«ÿ'k•»!×û)®W _ÛhCyõ“3ñŽç=™%¯wcN¡ò±ÒLݲS¥¯YcN0¦ÝFÑ)¹ÆÄ! RâËÅÁF“½#x–Âz¤°Ô;cQFè_­²BÈi'Oe?@2—Cè©Ý… gh²lQla'Fè“mÙs)þä7ÖŒƒˆŸ4eÅøI ã!_Îü ÅJ~’5ÙQùá$ÑxSËRŠX ¬F˜ñËäÉzåë¹GAàŒÃ'â=_uu%KøÁ»½PÈšù„½o†×Úd-|–]¿cVS^_a²$\úº8¿ÄóÉþ|=Éyé¤ó@­ÒðÚÅÑ„QázïSÕ-3tö¦§Λ¨•;UÖ[ÀÎ6"¹†ªbÀ[\°é¹^0E`eÀÆËªFqlI©>QêdzÊSN»G+¨ôv!a6#¤föÙš7æ¥HO·v²•RLEÓþv ÆÅM8ãQ#AV:`Fy? Tn@vL}>\Á>Y'{ÓÓÙ‰Ì%9D¾‰ytäÃ@F~Úæq&ÚíbåeôWËÜìDoài$Æ‘n{Á×sMxÙy>!>õ"~In¦ÆáÞb}JÄ7Cy_n%»œÍëÝÿ…k`÷çÝÞ ÔLÞX<ãý´B^½ÞJ-N‹g2EÈ‘Š:Q¦ÌGüûõa`ôÍäÏuãdQf6%¿+qó€•Îú+œó&Ròƒ äwÕ·gâó”^§M|gâ ××–vóó´Ÿ÷Z(馤wRx2o*Cj-gB#*1`È·Ç[Ë“ÑSÇ“¬`M„©AjÇœïÉ3•«)¥Ä„2šx jy‡òEøNzüñÄÇ„C}hŸEéP¾X£,Æ Ya‚"—Y«E7‚Ýfu$È2¶À¡«×u?„àâÑpD]é„jPmÌ“Z@ŠBcq&°7 :)uÿu÷Åã@aÿHU—çÌÎgœýꄬ%ÞÙý¡y˜rEõü%üm>š~"c £)ÏÜb#Gé¨vÙõp13á —6s†ø E^È™ªË ½ŠÌs‡lÓ Z¡Œ¥¨«äáçLrÓs‡…¡M¡AŠOn_„«Â±²F×,œ¾åš”ÙUNþJ;(×$©K;ž5ú=Y‚™9KÔ'—…f¶fÔº#9#ä¾>Z7²)Ý 1nsÅ b&?0îu….­ ýzf2Ü)Ëo…›Â6Sÿ:§¬˜ª0ÜǶ6ÈŽÙãÊ ½pà³%yrUÚ´ïLß´%í´ ‹q=€ç ä; ë ì¸óÚ Œ½Uöž6øDF8°s¹¯•ÞWLó }Œ Å,GÆZ‰9Ö‚[±äÔ}/A¸µü$(Ú‹¼F&ÐÅ93¾ãŸ5ï1¶¡ò¢o· ¬‰˜s±x(jŠ{n+DÀÿWÓ²°î*ý]¤Åå,Ú)Jvˆ—ÖíFL,9QŒ-ÒåZý&±7åÝLrÎà-È©¨š¦Ð?¹DzªN…óö¤áòZü:·>¶_£ï¤$ÚCžü+å†è𠙣ӍÅõ2uj°iÆB¼{æ5iñò´Ù_i8ÂN[EPÉ*àö¸ÀëÛ%7¤׆å¬ëƒ ÂÖº| _ŸÚ‰äôiÌÖLg{(éç™ …axVªåuІ%c !£l9Ö¤h{\–¼`$ƒ2]ŒE±÷ç1+OŘʼ9SÄ“4Øm§Ñ‹H²eAžR˜:·ÏtÝ’d›·ž­âµ Çä ͸Kµô¸ê’Ÿ™œ¢­RuÃS n©k23ÛÃÛa1p3Å`Hræ$ÙJf{HùFõè†ræpÀCÍí• Â#xk«âÒA¯p¿¦!«³¯‰]“¥‘£3ºÉ=ÕÝ7VÃ=XóÞgÓL+$rì³ KúH‚Mà€¨<õ¢‚ŸW ìÀ$=DQÎÃZŸÈíäñëæäqÈ …Ÿ"nÞ 8Ô,ä¹þúMÙ“kt¤f€¼ž2%´Vä²P!c›Ž|VwÊgû*Xuôß¶Nà‘Š9¯uù”ëáZ’Â×þJâ†ÖëÖÇ'.ä;“Ì㪫”­WÈ!X¸^6a1—M®`çŒÚ‡AÄ ”M‰_&ñ#UÂÃh¬¢ï5~î×1áe&Hž\úÎåW¥‚D}ô'8™A.}ÞË(kÖð¨ïÐϰ'?G¡Iz´e<Ù%»æ&FâAýíœy½\ÉU^abZÏû&öëÉÛùùÄJL7•ºCƒ?x¡øvöÃ;ñ¨8’õˆ¼?>°÷ÐÞÞ ×Cè ùæä1 ù¾oµKÎìüöûW )በùÇŸÄÿKö?šþoâíÎþ—ï°eDÄuAÑ È H`y;¥ˆ =õ©å|u\Ÿ ñ+Ü{)¥ø;§ x)ÝÁÌýðÒ±"3{PÊu8Ìܶ2uѤl†ìEµ•âíbÂɇùÖÖ)¡(‘î’±0çÀ‚"¿Ø’lÖŽý®¼§Vî cZTOhĨú“Ò=Û²=|¨ÌßlUyŸäЈä0ô!Ò-P\ ÆEdÅÁûX™uòÎë  2¸'ó‡“ZµÂ*"L'Ÿ^ T•7ý˲:ƒüËB¸Ü4Óÿ¬ŸäßRq‰ÿ ýî¦ÖÕ!Ý•WоjBiø{G1í5‰òSZ„:Ã9¬™/1'y¤ä˜úÓ¤—«)­7:ßè¶/ˆ.à!"jqÍ;i·¼nº¦I?o|flLB—½y¶Þ¯ÛN²¾ÿy½vˆSwþÊSLòR$¨\ožšís&„V:÷ÇD§åomérOÍM½I\g9Œ‚öň°×ÙÜgaªÄ âìŒsÓë³³‹IXP#3A:’4˜Ç< ™l`TLôíZŒ :VšeŒƒ*†Ø’æËšòuî¥Ô)õm*I¸¬( F±’;ÅÛÝ`¼W[™àTäZ€EôuÛÕG‚>Z-iüÂHmÝy<¼±°²|!ÛÊŠ5õªV>" t™B™åZ‰^¹˜(*¸%ݶÑÙO ¢uæ*jRƒZ—IÁôÞ¬jþKÉXØ µ\F —׎Câm; FN7}O-ê{M"ôbcC§ÅRJz5…ïAg’«i.¤±ñ…0*<—®R²ð~>pEê•iþ ÷|Iä¤ÉŒ(š¬Víu|ÙŽ ¾ û.•&)Û§ÃÍ•Ç÷Ù?8‡çØÇ´-\Š E@” ç¤Þ‘ µÆyCÍ•(ÓrŸì'LbªañÜöÒeH\žÇW¤ÎÐË“Tެ˜'`¥r'Ы’†uìrk æ7æ­šEX:GMÅ ’íõ Š„UoîâûLxÐSH«öŽLb¦–Ó“üŠbÔ÷–äjÙ3Å‚¬¬å–Ppî†54BækcêV”"{òwæ,:û"W˜¿^ÿžºo‹¼,Ò+<‘,:ë[¸Ãਠ=ÐarLÅy†ì”Ù™ÉQìµÆKIÎ)õ§`"4Ä/´ðßÂÇ0[ÞÉxØGÉ5d°vª¨IS¬8©˜yöÄ ôÎä`Æ+³”ÉtÌpzLT”°q•ç.)BgÓÁ å§Ä©PZÐ4Í”sŸtÆÃ”_`µ„@‚ ¬Cºèô††›Ö Ü—×Zép‡ÀU¬ðd±¡2Ï„¯_Y´‡ÅzÜÍñˆ7S¼ˆ,ËH9¸Çnþ•ÄC8PÿÝ”p¦èÑ{¼ÇÔð‚%ʹT %ÌÆ‹ȩ̀D‚ãÆWsS?‚QOö$Š×À ¯KE÷ðì‘ʵ_µåâÌH<Ž"³+Ñ]1Åá ˜ aÓTKسÊ"»Gax‚Ó+¼×›£A¨ºQðÉ ¹‘ô¦-VIz³„ÿyyPX¤öûì…Ñw¿teî^2ÜsÌú¶çvÿ¤r“RšË—f}âSŽð;ÉZ³»ÅØØKÿ]ï·oäŽ×]Ç]ۉ™Ëˆp\ñä¯a“¦ØjZÎóEÝgºÇvOî)~"o))p·Qôzž“”ˆ†s¸~!lhÝ¥&—-Cy»¹D©˜t#hÓ’kLî#qD&ÏtTñTl9ÔO2ïûØÁ‰Õ“EÐ|¯F-mç‚Ä´LézÔ@éÜÃZgQ®×-€—ŽYÁŽs{­ðí-“U ¢0Û¤üú½ì!zôò»¹K²‰17B·ªÚZÓúmH â1a-¡êä¬È¶Ý±©<ÆAoÝù ÏÜÝ5ÖˆÆÆpYU¥˜Ñë˜"Cøñ ŸÞéqÿ”Ñû"ø^u\¤§Ž—ÝÎ#Ü i»uRç4ƒûHö#ýò@0øòÑð¦'‡Ð(‡yÑ‘¼S¢Q¶4Ôsæl9 š®V•*¸-]2¸ÂÌÑòéóog\ÌÆÃ@Ä.íúíÝä[1ch3”+%`ÁAUXN5©\|Ì}nOœ‘ä&ÈR| ®5wì®W›ÔÑùx*w®w¡Ÿ+Ømí ‰1˹»ÃRõtâ)ð“û£å>¾¯:Ô‹Âäýç°½öOÈ@u) Eò•z+—“¾Á,q¼²VûèXü©mÔšê[ܦ ñ’l.¢`¹CO-¹Ó3¥SÍ× œDÏíÆ ½4Ï»F¾.òGh_ðN²À],¤ïLNŽ#$´œñýH7þü¦6A+¶–¸¶ÊA*߇­Qލ!ŽpRÑ2¯´ i’YãËW‡hó¡&¢ñšE$7†g¦‡Ì쬳œÂ–}Û1ŘíaEì®ìI:•B·ÝìÃ>IáûU{ ü‘Ž×éÞgÍí>Ÿ„'´°çVs&w}ø^ë2DVpi —q¬­µC.â[AïQÕÕaÝ„‚œõv§V7Ë)–ùøYp"¯z‘¿»|Eª»¾YN.>‰?x>¶D3LÛ/¼>ŒeEÍêZùd‡’‡°¼Y>’‡D±x•5'_…eE×}2,¬â(?i~'‹&šµ­8µ&9U«=«:Û²zƒMxÂ]ØÐ27Æ{ ²C^Tæª6Ëø«ØšfïÓïM”o\ªS¨ ÐnÜ©Æ@Ò'锆asߺx*Ìvx§Q3õ*zúž±8'‡ÙMˆ ÎÐdÝp-¥ÄstÏ@ÞÀúR•'¦¿PßgÓ|‰u½,¼Œâ ¨3öÊ:7e{lýn_ñvvCys§Ü‰ÍdY—ì¢Ù-…шù è¡Bþ„óûÞ!ø<øö|1‘ø;C:'Ú m²lÈxA‰qž5 ó(ÈÈä*¸®]ýþ*dÑ©0‚f é¨1`“¯Ì¹m?5H…ï˜])ÿÆÉ{‘£öFT~¢UûF4,¥+ˆCÕ®×a;Z)ç`aí­¹¨% ¤ÀdÇ;ëMOÿ´-Çh™‹£9Þàd}º ÒãÕ5ªÞ$ýø†ø—ä“8Ñ,€úñcåÿ–|ÓŠºÿˆáÿ”}51ºX;ÓÙ›:Ú¸Ä1Ú0ÀŠºeïƒágÑc1¡Ÿtý1Z` ‡&Y´ý­Eaé>*—{“ØÓ‡cºin„”%OǼ^,*c>s‚N‡ô† *9VÌçk6¹fgCCZ8ä/ÖòYÔË鄚l¬2ÉvÕ¨™JX«ŒX‹ŸÓîçƒÁûL¿‰ŽÅsvØ%^|‹|qzzʉ͸=u0²µV1Mîx.E’©ésÛ[ õ¡X¸¨Ø4—ñþºÃ$÷è ÿ…§SGÕ‰l‘’ía”IYµ™¸uW}ìÄtjïX*k×GNMírï¡îŽòø´õ±»¤ÀÅ?fiùwcþqþÃý?ðßÿ{y+í¿ÿÕÿF¾“ˆXÿW[™ªŠ(fŠ»lª%-­4«^L˜–$c£–삄ωp»©þþµ5ð õÄ÷.0'Pð÷¨ÁoÐ/Ÿ¯Aó~Y$#ÇÄ,7ýdÚçÚð¶Âßó bÕðk€ó³™¾µùb#dVg=dˆu¢6rÇÒcý#^b›©\H0iï´z{‘U³˜Ì8Äøâ m•±óP4ÄdïÈœ3än>‡Öµ•¡<©C¨aŸ I„Svœ{€¨‚ƈkÈ‘$•:Òw1€YhÖWë1×BµÙU¨.3Í j_Þ®¹¬+ÜÚW œŠãëíöä–µuÐVXסÒ=¯³|Gws¡”´Åa(1H1¼;¥Š9Ñæm#Çx¸¹¨oü2st˜4ì£ IߣVÉÆ ÉŽ„ÛªµƒÞÃF#°–ÿ[—,¹¥ ê‹gG!1¿]¸\Êét¨¦Ìîξšê&“ù) aa‚f‚Y:…2ë¡c¶«Û‡Ù¸h_«x¤B<°Æ0³xÕÞ¬¹VÔˆÁÙE‘Š©w"­’¬›ªÚS¶½Mô UM#Ók]s9+,²G¸“˜ÝdÇýsèV­*dFËIÛ6I¹.Ê­ì„bLÙþ"7¯‘É”Ów%o¼‰]µ3–'\ÖJº~R$wu\Öí7…†1Ç<{þ¾p¥2gHœ']“”þµ'&ùŸØºü<ˆË\UÅA2‡¦2þ³Ù’)ÏLC_•’ÈvQrgR47ûÔ_P%U:¥Å•Ÿ9ò¹$ V¬ç9†Ë¶Òë¹e/:Re—§zñ˜ã›ôª¸C,`V®¸gŠ)¸†?¯xd~i’Å›j`zðX÷àr5ð….ÿè¶ ·è°{¯üýp€¨±aëŸÖóQ9‚ã +„OÞ³oØJ2¦kÉ*îlà9àÆo\j·F†Š$Ôsôn_õ¨)Û[ª'y.XqÙ8¶Ý^ä•ÏÙ,í?%Œ,x¨=íi*ìä:+ð5êSß.sÀÖ úúã~ EÆ´¦Ïø Ó%J)Ï þYÞÇ!gW‘f"WX’%m‚o|ÏÐâXëß·“øäùÁ²–túƒVÆYˆJY7ïÒIÇzïž`^çË‚ÑØÜ†;9ðã ü˜ì߄޷…ÛÞ cð Éráü³ç¼v<Mïòö…³‘·•7V_˜Or÷‰CNV©ô·’0G^¨ë€—¯žZï9ÚØ,Âßèr„áÒ,ÝRêuÀ ; ¥pEMý=+"'P˜YEÂ$TN Ñh\À®û,qþ#Ï_X"ËNs2þ-½$:thrñ–ˆÙÑ”äÙÅ4i^ÀåˆI}ø÷ ¬×lÔ„ðdXÒ‡/;ƒÏÏØam`NïËÄB:3Ë30Áüxûõﮊÿ§+çóEÔuÝQÕ±|ÍƾP±¿ŠP٤Ǜ“Œâù_#­7ÈJ0ä5 \K¦ÕrwdgC,5SY6QYZ)V,—W)Ù [›¨ªªÔªøU/‚Ù·Ý÷‚1ôÜócw8\™Ò³×²GÄsB'×Òo¼zžßyO:sKrAj‘üb ¢]½¦ŒÒï2òµ±žá¦Ríù±9c—´8èÜVCˆªµÖ:ÜU¦°ÓŸŽ^‘ZMÔV€áÙ|Ñ5܉¤ cOÀâ¢Ô¥ÌOòš23´(º°Ž ú®™…  =…›9£§˜ ×J*?¯çÇê`äQ'àÌTXÐL®–ÆrX0ËäbÕÝ¢N;e”£:ËV~I«Öðh¢gòÆÒ NÏ£:?ú³¹ð?ß÷5ÈÕŒaUPXv+¢»¨³·‘bÜä­$hû¶ÎQmU_ÂT£Ð >:’y¾´·èä!öèùŸËÉÃV\ØIv¤ R9—i\ ÒH¾¦"¯ThDâP©¥+ Òȸœl¶n$˜xÂ'*Ífsñ=ÿ Ü€RûWa|÷¹"#•¾J¼@B­ãï•ÁÚðÕ×b²ð̺tœnÕ¾¦„gYl÷«¹±£ærw é‡á´¥ “éVêpãº!£úNÑþÔª¬à(Æ„*Uf3êÌH@–mm`Ó<N«†•ªc¿pþÑâÕ$w® a•™\é¡'Ž6er„j"|IqT¢ºœ@^…-Õn×3„±¨ãàÙ²S; uîÕC•–9‹ O©ÁOÍj¢b•,µÖ¨±§œ^p’e$³O`{‚U0+Já¢Ô÷ÑÞ4ð˜XPO¸ ”÷-TK¨ä—\‡ÄD+£ËMìòṉ̃8wðÆq°Æ»jÒ!/äæÄ'Ï.®ÒF –÷i‡°ÁÀ‘¢ü-Ö‰ŒŽø™¥Öô6á£bÁMÈi¦B[íÅâ¦1…³ Š1=z•ÍWŒ³ƒ OÔ‡†¼cD¶•N£Ïì¡H=Rº6óg¡â1ígº‡ÖŒSa™Ê³Ch"2˜uÒa4Oâ’¦ú$¶0nz!ü¹ñOæg¦¢•1Øõôñv‹¿Vhr5T$âdT“ÕÓ‚^jÊm€+Lx¹$¹¤HÏ/‚¹ÚH£4T‘_êïìrE‚…¾¦µ¸‹2ã²’›ÁtTˉZO ÌÒžK?s™I²1Í<ÊFhÕï#Ÿ['Õ=ã$²Mu”¾/òR2©êêy¯ÏD—¨ÔQIJàú©ÐË*-“~MÞ¯í¥²R±F¤Ž5&ü³–i‹wßâü24èæ#\yݾv•[Ü2i¨C÷¹¹6¾ h4vM'×nÍÀ­îŸ8àÁS.{"”&ÒË»•EOÝ)¨ùév*+,—‰k£¹V£6…@ÒGܼ.%n·©å5'ÔJËfY›ƒ­‚pñÛ`L>ùŠK$é!Qïå$6 ÕÉ_úä:jÝ•û‘î‹93ï,Ò¡ÅïÆŸ»‚Ñ}#„d(+|Ö)\(M'ÓïÍÊÖýÅ4ë‹€Âí+v/dÀgGŽ™Ý\å¿æU•aä¤CÑ‘Q7®Ù4”îwµ‰þ)O™¾ˆ¹1L/%ü jrít²ù ãQÊéaàB;ÈQà‘9>“íØZ…qA¸{ú+&ðf‰«ÐdˆŽÅALÛ•’åæîãjˆŒ:Yžùæ¸~Ò÷ª†¦®‡eÒº кA€Vg.£mºÑƒ©—÷ǽk[‡ôŒDopÆØ=\ŽV­§wÕ £€ÕÕ<Éîˇo+cðá4â`ÅÙòtÿb§ô…ÖWüA·B%M¼3GA×nɼ¦¼5‚›2?ð(#Ýìï¡âÑž±:0W3ðwñKÕŸîñ† ‹Óñù_ë‚ÏvíS ¼Ð¿·*m•÷%Ýèî€ñîóx¡_€ÓodÒOÓÆäeÇJàLвÜL¾ó#´û<[ *1uÁ‚ûê2ì_cÝvä­3¸ÄÕ8=_döbuòxÉ™Ýc$qWì#i®OÔf™½fIëuî\’Ý_gw\D0Z££ô„S§«4„Ÿ›P› ‰›žñNGäpûè.I˦Ø/|÷zãì‘*ô:ƒ_©m›ÃÑܲ¸h¾MdŸç“§Æé9a¹3yû¢ÑãÑQ÷ª”˜…í^[\ïw‡ÉyÆ»èŽ\Å9ÅmŽ®H¦Æ†ÌìíM°CsŸNŸ¡>‹š£ôpÁóHþ u®…˜G !§E%©ŽO뛋dëD²çL¶ÏÂîß í…Wt–ý¢«ƒ Ÿ ¾Mض¹Þ"þ“=áVìošÖv8wv#…œ“¨ÛK±èT™w°P6 ãÍB»˜0Í;¹$ï4í×)ÅpgS±»Gô+— S`N]yÄ}ô¾‡¯ÒH£Pá;üßܤ¢~•0AOP𡆡·ÛŰ…|¥ÈçÂݰ7}ë$uå0”×Bžv`J¾$yúÛâ'99#B®Û… ¿YNÀ÷»½8 }8‘·0Ï?ŽxðguÀXI`¬4P/ÁÂ*à±Uà¼Þ;îå< - ziš\WóE…"'Ô]/gLøÅ @=œõÛà•}'ê=ÌŠ#‡À›=á ær•¼©ðsÿ'— Ï4Œ=©AÍ¡§m]²e" Ò‰‚òKÆçÎþ7tr´›5:XÈÁŠIZOŒ]ã ;ãÆð;Yoj‡nܸG;å: ùmvœD 8/ §Ï³E®ºp*–Îð4ü˜Fé×6C7ºü©i{Ûü8ÖÔ<^å´Ç‚¯!Q®³<2R*}Ù ½²h(7ñ'ënÔ# À„ÀW«ïÚ]ìò*õÎZâ±"o&¤ éS<ßì~G{òðDhæÐ¯1mŒž7ñ{͈ìœ.ü±Îy‰³Q¼2§ïøÃ× ‹?s˜žÛ5Xý*_ù¥«%ãë ›¥‚ÔÜÑï;Œ?ÜSÉ>é«ççÆ€+d[óþqö-ðÿêcý÷ªOöŸÏÿá›ÈØšüWB,ZY[Eõ«}¢Î‘VïGä_!ME‘"÷Âø  #’·f›P¦Ö-R/ê}Ö¾8˾wuolŸ[Q^æEŒDÛzf³ãIïî‘‹–Å ‹ˆ† •¡†½ÑѳHþ{Ár盥0â•68,´žjÙvÛ IgZª×aLvÚ)†ÚrSë)7¿[1¹\öJªL¦Ô a`u©g² ²! „~=Â^3.T ›¨aˆ¶Œ›V¢lÁÚœMZb`Ê™‹CNÛ»SV¦¶=Rmd¶£Mè5ñ®LM•Êø¶Nµò,)«>¤IdúY5"»÷—¡1Ç×Ïe¯fCïÀ]¼`‡`ŠÅâR¶õàp-ñ´Ç jÂÞ©as„>Àj¥Û[_O(•RX¯­Ó 2F8ÀÃn…ârщò®Õ_*lãH™}µi:Ûdª“ƒ¶5†LÀú¿º˜Ä™ž¢‚01†ç æê˜† =ô`ÆÔ´æ«ïE IÞ*“vrl*·•»áþŠò¹<;bz”]¨ôEzã&,Â'¶ Yv$OÙçÉô ÎI=—¡¾‡¿…*±XLÆ5Cü~;[ü±¦¨GU©±"÷`íŠÀë…i» * †;1Ÿæ«C™kEð»/²íÔìñÖÍÏ×;°o¤Íg²›8‹d˜AÎò.qðÇ‹L|wÜg2ÏN\ þZ ÍP±¹¬Ü|{0§¤8Ä$ŠT‚ûÖ0Þ>ZŸnò 了š È˽>³)PŠ@üØý·Œºÿçà¿| (o\U¬ï“3üìG‰ ôö5ÝPZJIívÓÌ ¤Dú¥\‚;óÄ¥õº ­ˆè?„(í:[’}DiÞ¾?$•ûÏÍÔ奉+ÀíÐì}âúÒkçùûë†{‡çí¦ã¬6`¨ÐÜHb#U–´«¤² °NaUÌUW•Å[OÝ–ÑÇõPY+Áñ* c˜\'Ž; ¨„+i½Vt .`¦œÛkÑÃUœåG°Œ%5mJ¬á›? uæUÁH¡B…üí½Â×eNþ$h  ;A 4l–**!H•Ò¬››Š£ÀöTd”Q¥dœl/Ö’°K‰lÄÃC k\IÒée‚Eš?Yµ:í<ö€­’ŒUG>Ÿ{Ò 0„Ggb!çvq ¸,¿kc‚†j4Ä…‘N Çú8‡j`ÈäϦȇ`.Ðèg(ô ©¬†#·G–;>-‰k;,ŽÁ[ˆ¡Š€I¡ "q6âd¤H ÿ[n²Œ“|½ž³Nꛆ†<Ï‘LÈV™Ö 딀§·“pz¦5„u¨0“Ä쀞 ,Èm:XP‹4{7H:‹{YàDÖ"¼(Ë˜×ÆÇS‰²¹7̧0yÊÒY%Ä¡ú¶¡›DJæ(®7\H!Âß3,êÔèá/A•U]‘RÔéµW2hæ €]x+od“íµ‡† ½(<ÖÐæ/6¸¡â`¢«Ëçæ²F9ΩÜÓRœT>üª—UÑ<¯¦—}ÃÎ$ɼ6ÜQ³kîéÔ¤sà-dãç[$›Ì¢2wuÑKÏmEtSÐÒþWggU÷Çñ‘-¢¬¥Æ–}†"ƒL3•}˜±ïK–!T¨„²&d‰’R*²Vö}©hÓØeÉV–,%üÆÓó<Íz¤ß×üÁë~ߟ3çž{ιçû½ß3Â-ð2ZÈ4/*Tæ2ä+–«Î0Òê0‘®¸f#‚N­Ú«ª–ChÎc+p³t\ñ†uÅΙž³¸‡J%‘¦_¬¶$XPÇv57”)‚Ž…˜Ý~’îÁ>c‹ïÑor¼V™¹W¨íBæ6µƒüÍZ35y©™«Oµf#îÇ«Åg»Eƒ-jꡪfã¼ëÍ%œJ3Y(°}úŽF~ÿƒñ±; MÅ·ø,i:“óî]™¶—ÐZÌ:«òržÍÉ÷4ZlõJ®!µ(HIØXêk«ì¹4´‘¼œ1_ˆ¿Írç]a «”â\j¼FÀêm­Nþ„"±ú,“<—ÖYG‹}%¾> …µ‹s»Þ7U½ÆÊ托ibëó;³õ¯ÆÝ‘'²=ªncjÀkt@ý-î3º=Nà¶ÃàIeŽº—\ËlÊÑÓ½Y9²L×;džv5Ð*;ëv7»£eVÅÞød£ß›>ƒksŒ6pG‡ÌY!æ\ ÷z0ÐúÃ_¾œP¸+ 7ex¼Ù&’̬V~Û¿íS*ßI÷=ÏxmC}Q%T’b3˜Ze„rÖ X\eª|í§%hM‹Í·;}ã‚wˆ|G"Îý°ÊoYn4tiæΪz‚ÉsÊÔ®¨kÒEûƒTÄlô²`w4½ÈŽVº¯³ãCqÁÝ/Y•÷÷ƒqV/Þ=,£y?`0YÐÞJh.bEô5Ї9`5Ŧ\ËYo&½x}>g¤~ü¼}3GâøÖùÇ3‹q'ÑgZ³µ[Í:8úÑ¢Un^×$p¨HãÑ"1~¨ß\ê5b/YMDñúĤATÕDuü¨~c~Xü`Óó)yκˆ¢Tì»ocýž[^=ј“¸wWRöò\,N•ë”ÒmW—6€‘®ûfš8¡ kp¥ç)?ßqó‹©X››…«ÁíËž>ŒJ0Ü<Úùf«#ÛÞÒiWJ…»t<41vnþ,Á,И«À‘¾Ö˜†ºjëyR/jÀRŒûsÚMîôÌ#ãFCˆ´•Tܱ—Ähç;¥}ÞMfG ‹t¦…lå _n™°ö¤]¬¤rÆwv1£O¶}MõÈÈÓöIÆ D B½óv  yUWM\ÛS+a÷elµKØæð{DLsñPAVÖôhCßD‚XÄ0=¦gv^`mÍJ ƒš—®ëòÜiü\¹ÌòF¡¾~“Þ)ì~C½‰°ÇÂIøó<ÅŠžøô•—ÕÏV ´®¿_ˆi2C ®$F;Ÿ¥²Ô{›;àøq>0iþûgÅõUÞ ‘9†ÕÞ«9´j‰ËçvÚ…O|\;7l!åß’aNˆ±c÷OKNªüöN°“N8w¥ŽÜníqÚ©êÞ-¨µçж…ã¸H¼¬µ½Ø5…Kä] –)þ\ÙS‚„½ÞŽXñ×0£®Ð‚'hÇô´ñd^1A”ÌJÍ­)©|B«$¢À- G;Ï1|•p—öó:·Nu?i-÷/ž¾èË2:l&ꦦ¤¾´uG˜™Î¢M>¾ด¯mN˜“Ùµòrm—¬ÔâvŠdæL®âèÇÏá0Ç¥éE‡ù&êÕ]o¿dy“yyNr·à“ŽôˆN‰‡ßqa{hŒ«pxï¹¢klcWæ 4Ù”²r:Á)?£“WYx„¾Ö¦}~TúžpÖø¶g„moA^ID‡üN7âô蹃= âÈœ•ðó†Ìx—¶kÍD¶8(½Iƒpn_xn]0ÎÅ,ʨ}k) ɉ*-X¦vš»öD¥œÑ¨dï’˜yhy½º½=u¨b"¸m ^â¿Ü*ë›úÐ÷ލ[úÂ6V´ÛL»,¶«¼è±kák¡MW—2õ©!îÜ'ÛÝÚ—Bü?}V(}ý¾[]uÁ¤v¤á üì"tL!ìl?•jëÕä}ÜÕè^u5ŠÖ+ ä›ðè•i­¹%ƒ’–ÀGW_EG‰Û>è<|0EýêŸÂû½9¦ìžìzý`~°Œ)õت–ñ÷ç/ã*.¡bú=5J\Ÿ×Žyd»×6¸'²wn6>ÒЭ•£ý!ŽYz;E÷iëî‹Úmª%ºØ2™ô§UJÆA'.²©|N®M¥éW –ˆBkÕzŒÐ(w™>{í«feôLð?1z+Y…P…å3V„^-¡3™ºQyØ ‚ÈSäÃp~5 jLcæ¢S¾R¼ï%§¬H˜æ½'±žKjY†øˆ”Eµð«5¥­v-iåW ¬jÜQ ¾ø<+Λþ»ÍY÷/Šñ䯔]³á÷Vò*Ÿr¢.í9|juY¡¼Ô{è‹ï„û²¢ÊG>@¼`5²|©¯ÞçèvBò–5LÉhÚôÓ ²^ù»Se[o›nÁ•¯ÁG]©F†`Õ­‹ÔJ»ßXÓó­°ÀÙŽÃëõÁ1ÛéøWTùV8àÛ®z‰°Œ9rȽ¡‹u|ä•pÄ©ØÆ‰4K9Àßµ;à¢=FwÁVä‘fú|ý¤\E=V61’ ÎU¹àwWY<"0¨/dn¤†J)0´oÛÀJ^ÿa¶ s¥þð²+ìðKµ­à’îA*Ì$d!;rñPç{Q“iŸ×Í*áGoÁY/˜Ù¢ÃW[_q.Ú…}3 ;_¹ªè…TîIç_«aaë {º€ÃbÌ-ÍŸóc_öôÃŒöG¶‹h¾8KUF°[DØœbZ€¬Ï¶÷è~<Ƕ *æ'Ÿm7Q¸˜ÿc¶íþoÞì_nfÃ( 7³ÂÎF–ôu7³ õU U!¤›¹"(B°/ð»–„Í;ÖøÞIÅaǹ ƒﶆ¿W{#©aYMh ‰|n¬®-RÎ^~ÏPÎz_þ3Ö§BcgkG”õ’ f’¸Ì“uüRöŠõ2Kȯñæ‰߉Ù×]Ðö.t"®qy8+¶§P‘¶Tp2~Á‰¡ß]“84çéÜ8xNT{@ò2|½Nó¥,æ¯;„ÿrSmáýp;È×ç¨þï±e}_xðÐD¨HžÐBA4U´N úRš¨ÕæŸ)ä^d!”ÄÖÖ?vBR[ÇBiÛoOì!¤G:‰`VInfuÚFŠôÝH”`ݵ…Ìëiý“0¹);À”‹šÂô{»Ø°0ý5à{ÃÚÃÀÜÞㆵw°”B¿bLèëI°f$`Íü–¥bíåxÆÒËÍSÊÉòŒåF¥Èl ÿ¹‹ÈqÔ—Œ¹zï·œ!ñÔ¾¯÷ü8¬7ƒ;j‰u´þýS‰¯¤ð*:ÉÕ˜ëZT&’H(1mBâ§mR)5ÖÓí³¦ÝIõ}žÔö¤Ó{7¡Až‰—!ý¦IãÈËô PòR¡ø ð&ðÿ‘xŒRi=ÕAŸ#œTótü” ç¡è&”þ΂@I^mòQ…dƒ¾w<22êÀfÈäaï”üõÈðg­)ÚIû2é¢B|݃›àÿÿ]«ÀCä7ÿ{¥†œêe>­p¸C»QŠÚ¶çûFÎ?ŽÞ? þãý¦,·‡Å´Âþ¤´JM’‚ IA pZyó À¦ßÕ@G@õŸát#&€Í)UàLn©gƒm ö០GÃq,¯QXJ©ê›ë“º2ÛÄYˆ:$ñËþl}ˆHjlö[A ~€9êæÿv©‚Òßè(yú—nY•nŒÎ-”W.HjäþQ@˜þeÏþSÁÖWIÉ÷H? ÀÖcþ`_ô;F„›‹‹-©.ÜNÿZ|Ãmà ëlñÿíÃN©@žÑ]  eõ'ÛxSPä™+…Üè ›ÌOYTò|9Pr-üÏ`RDä/I[pwÂï3ðP>ä/ hÈû›}ÍŠrÀ!X0í³7õb9p=Е<’ø“M öºÑMË  ÅmèO ¼Îä!Z’PïÆ Ÿ#AºŸÈü€ÀaU·dó_”Tr¯ pNy¬îÿô(RJ?JJ$´ÿÔYCÎ^%B°ËÞnîÑTGö¯AXœôi'õ¸ÕïÖÿúPK•&ÅdºÏ°âPKÛA‰; aQute/lib/PKPKÛA‰;aQute/lib/base64/PKPKTU;aQute/lib/base64/Base64.class…U[oSWþNl;æ„8 $±‹‡!4q †Ì%ˆÃÍ ih¸´=¶Oìœcc‡@ÛUQ¥¶ªÔ>ôa*¤i4–æ©×•–VUgFSÍ˼̘§yícš~{û@B“¨ ï³öÞk¯Ë·¾µòã/_=°·¼¨S°M¿X±XÞLÅRzÙˆˆ%äÇ ·‚À´>«Çòº•¦¦´­ÀÑm]AÝÕ„Ÿž/æô”ÁãæáÕ1»dZÙ^ C«lë–=¡ç+†›L 8yêô™äÙsÃçGF/\¼46þüÄå&¯è©tÆ˜ÊæÌéù«P¼Y*Û•Ù[s·ïìÛßÝsà`üÐá#]1ꬰV¦û¾tÞ´L{@«£s‚± 2F=4iРúñ½ØòTµà4lÅ6šJçôҠȪ#Ù9$ô[4´¢7yÃÊÚ9i9© qØ´Œ‘ÊLÊ(멼!.¤õü„^2ÅÞ9TLþ¨®¤ù¢•>'>OÇÕDç„.´k؉Í"Èg5x Ò·3™MËð• ZÆH3µÚ^ÁÖŽµhw^Mˆø÷jx1a´dÎ(ØÒѹVÕ‹ý ÂòØ,Ä·mc°TÒoVìbÅ¦Ž¡Ïø±í^Ð×ΕçÉ|ÞÈêùÁR¶2cXöɹ´Q´Í‚åEœ<ú­›DÅÌgŒ’‡„’‹ff"µÄ"v=m¥ˆiEü8ˆ£&\/³ ¡Ñ¯aÇ©^,VFÁÞõT×9Qôú0¨`ûžUž%‹"‘ý݇eCNä|v¡öÔõá4ɾGj$Eg™MÇÐÆŽü¬ì°†óaÕ§ò•29´Ë u#´{“I‘ä>\Ðp—l² O9;E·©e鈔,THÙ¿c“™”Œ¬Yf®4QÔ3eÁ £Ì§Ê¬pvUÃ5\g”·J¦mÔz`B„ÿ’†(º¨V»”†4ˆ·fXOsŒ^[S¼[ ÎÔ”QòÃ@»XLä´‚¶õº½B¯E,l£ºrŠÅÛH“€¤*ôêN™6sT,̱jNÈaõtÔ&ŸùÇ •RÚ8eŠÖÝTKì9¡‡?2o‡¤ø±G¹n‡>žÖS®ƒŸ²&Ï}ü߀ͼiäî_Ôñ;Є»_û>GÀÕ[…ö­uã PZ)=º¿ü“8ÝÒìo]DsÚZß—·ÍþEl¿¿üÿO¥×ÝÒßfúh¢—föwžAâøŠb‡xýŒ&L­}û±…÷;ä.ìHQF‘±™ù²é)z‘ú£KØíú»W¼n–y·ÁÍ]=íë[kÚè@' % §– Jͦò#Ï|¼ûot{Î=ľÉ%t»ú]®¸[ýÚwÔSÅ'Ñ0³Ž«A5ðú_yˆžÉ‡88Ù|h Gø¬¯ù8—E$–pò[WÜKµþQ¿àVªè&TAµ‡‡Þ{h_ûò— ºˆ3ÎóP@ë½wû[<žP–çßoñ¸CßÇW(p6 .%ì-~ˆÆ®PÐýçvÜŽÊŠŒt-bô“'ø¼M¢Ú@D±‹ui'öÏNêDyÚÅu‡ñ^ôr=Îï÷§ÙxgY·‹èÆeÀKœ+Ä‘Ã!¼Áï›8‚wpïñÕ‡èC•õýǰ„A|ƒ~ •pPý‹~þCk¢6—j¨cL~x7ŽçeMþ‰ r ŽÑý]²ÁÅ¿§ß¬m í½Àzë_%CTFö:&yëe}9Á®ü›Ú‚Ó¡¿ÉÚçPûW'YF\‹Æ6¢9¿ˆ+5Ù·"»¤XEt#­*W_­p1ÊH€s”Ï“{#Dl”h\ cÜã 3½Îï6¶íæöYÞ]†u5 )uc4Æj#;ˆBãàh-áŽÏ/ðyºtPs] –: ¡ †UBfmgG³im4š•¬âêp‹l4¬€ê'±ö@T0­úÝ]E4Š¢fl½Ž˜V,`r[±7Ö#²Haäj´…ŒX§Eñ û-X<ð8G–RŒÂø%˜ìD~!¼(ÓPJ²¤é(ÇLº¦ÍŒ ¦gBU×¼Ël‰¥ ÊÒ0K0¼¿N…Ülù( ¸#¢ðË>™`L6~]‘†óþ¯3 ‰f}:d'{ϳ LꘇùÊ\¿Ü47ÒÉÓOËØ]޶*ª +uþ@Øö%UºWík1#±@8Õp‰`dŸaé%¼R‡§+°JÃJ:z p«±†‡ ø5F(°ÓŒÒŒñÞÌèdàW¤æü:2BŸ¾uÁ Ùf+­¶Î3K«×pi*A2[Þ¶š–5‚Qµá’Ž¤Ø’@¨¤ª²Þ_âFêTR®ŒÎ•5jE½ŽldZ‘ˆjí—`9¢&Kû"%¢QÇfl!ÛĉI丅k×¢Îm ngôä†EÇåØ!a£UƸ¹™P3¹&À²ov‘½·¼3Ô4} ]Íá` ¥Öè 9µÀÔÀ£l³Ž ÕNêl4‚f¿Üɦ™Ì!'t1ÑOè-ÉÔ[Â`vc7:4©»_¼4ZÌh4̨ œ^1¬¨¹Ö4ZUè/É¡¾8§%dñŸÊLÅ{tX fŽh`¿i“õ:':Ií5ÁX B[›£¡Ñ’hÄl ì ˜­%jו:ö—GÁn³«AqȈ,È9DáWá=®Î¢Nèx/®!†¦¦ óc²ö®KŽSÀûñ ×2‡Îê¸×Óê¹/Ö?Œ’Áè ¸IÃ̉~ˆ4š–: …ܬ_ohªY^W½nEmeÍ*uÕÜ¢ãV|ˆ·I‡kiW8ÏÍÄyE»a5˜{:ÍP‹™ãN©Ilbߎ;5Ü‘ãÒJ.ÑñaÜ•VµÑßêÄA†U®8i7¢%WZáP[ÉΰÅ=‰Ôý¨JÌCg½ðrä£÷c:î±õSp-qtâ‚¡ÉÌ FQ›SîeàfÐëÞÄxErÞ#¡~˜°‚Oëø >K‰Lúp˜žîíǤî'â™CntãAÅ? ¦z³Wçf£n|NÇ#Êô‚ŽÝ,c¢nøð¨ŽÇð8uïU™Y·óÝïµtn>Á*ȧ×Ñ£’Ái“Ê®°¥îU?©XeÝàx:ñ…ÌRBNêx:-$RBŽà‹:¾Ô7Øb…ø2ÃwùÅ…çñ‚†SÙ—kW4fvèø ^dX„ÕE5: ÍzjŽQ¿itPñ"È×t|]që0ʯlކƒt‹›v'¾I»JÔ’Wt| ¯ü Õ„[íl¶c®Jó;ê˜ßUǬ:¯À+n|?Ððzê̶HÇiu“h5 9ñ ›M‘V#F9%JÀuü?ez¥EPÜ‘íôÒF'~N¦ó rnLa¤ìÿ…Ž_Ú>DWÛ%^'˜û¹®oÝ‘¾ZÇ v±RÉø4³E&#U%Ã;u?iÉ>a©< ” †!“§Õ¿Se.½Ó¶xË9Ö;ÿcA¤J"Í2wZf´º‚h¢®9k\°XxËr˜±”¡ðoœÑðŸLzH8@U¾Vg‹*IÈ®",ž•ÉR›ÕbNƒËPñ-y:Þ‡*PJ· Ü®IA*m£+-ËèR–»%_ÑÓíâb‰*nµ?G«³ˆN6–¢AJ ­…2LFh2œ>ÎÆF—báS&Ïhmí·7Å8|_åÛ´¯’"Âij˜gÉqHF>Ì[™D1ÐB“Ž\O²Ô}Äyû½r¾eež«°ˆË¶~ä.“ù‚´‡BfŒšƒê¦2[7ÕW§«T§LµÙ!¬Ð!q˺LWðJ5‚Q§xÙN¤¾&e‚Iƒ'^=m1—ŒÌvK©º„º¥B—Ùr!IGå2+j—'LËá>,6Z¦ÉŒsË0Ý2_—ŠPÕU¦r8ïš3gÎÉ…¯‡"!BFR#•Ê]–Ê%ª¢ µ;[•ºIÞ³±…ЦJY¡Éò¬ mP¯•Vûq¶HVöËÌd0ÓCMI_­ËYK íÛ&Ë*²V„ù†HWcO¡\*5šT“Ns-Ò¥VêˆE,lg–ýrÏaJŽ1M6ðRÚÖŸõ½Tù‘øN> löRõïõ°fé¥nÓäšhúvÌFRÅ< oáû©2×üâ³¹)Ûf•î†p§Õb&nŸQýù³ÔrLf”ÀÁ¿|Cýá{ÐþòÑi ¡Û£¢þ!„¿ÃØ[‰!lCËz0¼¬¸øFÅøÇ82ù[lK,âo1åŽd«çqDOìÂù˜Ä¯¨g?wL±÷Mµ%·Ðž!üŽ.+ïÁ´²òâ齘1ÏÀwJAž­`¨mö ‹Qg “ؘ®Zb•ÌM+V#±%êm<ÊîRû •ÂeåGqqß9jÆSÍ¢11CMaZM¡”º‹9·ÄÆS°T‰Ï›KT‰£¼^æ8Šeåq,¯™y ŽcmÓqT5W÷ –£âØÔƒ¦§gƱµøŠ8šk}§P¤V·«qŸÃ.¿ÃãèE„É|Ób”àqô‰Pkö z±_à/èÆOA/Þ' B¾'¿öqðÅñÁ8n;œaÇÝ”ÂᤄpÏaÁá3ÏÙ}œ©Í§0ì8Ž4õà>%y¨j{ò{ðIAÙ¨8½,ŽOùµnŒ?Žî&ÕQã=xÀ¯y´8Þ¬tùŽáóÔVüªóÄq4ŽcÅÇ“™gTçÙ„U~§éÑr“¿—ØV—ÄižxØÌ‘2%.Ó±r}”ý"ögØýÇ¥´i¤”÷ˆ¯¶ºêÍTíÒ³üŽã2‡P_äÏ·1Þcƒë Îq™§ ¶©ã¶CØäѾå¶Ðµ-_íô8SzŠ”…=r±ß•b'§b'—^’Å\âÉ÷¸lÙ½²,/éãä}gnõä÷Šú?~xÿž@w¯TñÞ‘õ}®ªb¨{è0‹aÕEÈ÷3­¯f‚^Ïd<À«äÔàF:ñ&Dq3®bˆÀ­¸·á^Üp'Sú¦òݶëöÛ7ëé´ëNÛ©¦‚ö´Ô³5„4‘' ²‘úçáþdk)«ºM²Ð¯ÁAi”Ítbºd‹4Ù´Õv§FíKìätRk"9]´b\²•rqBÆVÊÙ¦RC¶ÿPK]ß)Ý ÝPK#¨d;!aQute/lib/deployer/FileRepo.classX |Tõÿþ2™y3“ @" ’;! 6\’4 !‰Á“Ì# NfÆ7.QðÀj­W½ ^E«ô°-U™©Ún=vÝÓêv»ÛÚÕí±ÝÓ®»îv¯Òïÿ½¹’L²tåcÞ{ÿãûÿßßñŸ·óò«.”ãŠsƒ›‡“FC$Üß2â‘Ø>ÃlØŽ]F<¦¡X0cWpw°!Œ6lêße $5¸çÚÛú£¡†„aî ‘áÁpTƒ[°pâ¬ÂK„“1s_fWp^¡u;L#±3Ø1î¶Mk›{Z6u|m99º“f8:¸’ó]ë›×mêhëw4·¯”¬oïìé»vCKÛúnÁômö®pÌÒ‰;ŠÍX,)˜6~Ü=Œn1ÃI*[ž®õ›,ß^;œ GLcÐØÛÐL& 3ª¶™TËä‡`^[Ö’ƒ ™aKmõµÎPØLî£ÑàÒmÕ@$ 'W •U½_ nÌçT$6L†cQ t”@wã|ë´`(ìSã‹u”ªñ9ê£RÇ4èT¸-5:†‡ú ³Ç6¡¯X‘Þ VßéA×*ëd/¨ÓQƒ =ß& õBÓ1C½]¤£3ݸDÐP¹­.X·¿¹ncÝŠk·×_]SUW¹ïêõ@$˜4ɪíõ•»‚æڢʋK±BÃrÁ9“ØQGhm 6+ñê*':»jR/(ù.Ó1 ³iÃäÎp‚¼j›‚Õ<ª4a$;ÍXÜ0“aƒë}•yèíÁøJåOwx0L›”hù¸«& 8qd5aJ°WhØÀ3ÇèØˆz~Ð /È×ײŒ¾ùC>=&íc4´3àr£-‘ˆ1Œ4›ƒÃCF4¹~ï€W\rc“ ª-ͬÀÐpÂôZ"ÀÏ` cž@ÜŠO/Ú°Yq£K0«?z½¨Çfeü+u”Á§>·è¸ Æ’pb]Ø¤Ì w‹Þ[5lË eÍp82L7®,Êeˆ@8ˆÆ’jw0B¬€[±Yý¹NGýdr07¢¡qœ)`Ã1®T!v0ª’1{R0³râ®Ý‰]‚²ÜÜšX,bIÝë!u)ç°±‰`K&§nþ> ”»cÊZz¿=Ø«@”AoÐ1GE³c(W1=–›‚Ùccz_<×—ü¿XÊ}¤. Ç„lêͲ+¡žžgÍG$O숙CFèÊ®¶< ÞH[Å͘òŽ­¸IÇÍ8H/7 #‰qLËxq«¢Ö-Š‹· ί+D!fºq;1íT¤áÁü¼Ô¼Û0”¥¡×~vq'³îÌû^VìªÇÝ:>‡{˜"áDRCÑÊ*Çë¯á¾ ',‹÷˜†A«{q/êÊçu<¨¦1È;˜óU&|XÇ#x”cCÁäÀNU7.ÊWyíΠÙMcÑ£@Êk·7‘=G𘆣rjz‰ŽÇµÒÇ$Ô†'u<…/² š±á¸²uK¶kxZ0gr{9ž9sÆ‹cxV9ä9¦\ÂôªÍÊ|_ÑñU|AŽD†CÊpó+Û&‡£wKðu|SÃ7å9eºUÕ Y‰ò¾ÅPˆ'si8Ÿg•:Õ/êx 'I +X)ع•ù^câP4åêŒj8Å„Ph^ÇË8MÛ&cͦ$í++·¢À˜†T¥?eÐïÎãÉGž8Mû}Áö²–3ò<áh"$K¨‡;½FÅO[r¹0{ ë êg2´b‘JCe¢–þTLåDʾÎ’æB¬šjïØ˜RÙhQab‰ÁpCkÐÌx5|–!Œeál’Q ôû:ü˜éÅ{ø†?g}Ÿˆ§ã/ðCV*Æf{0ÞÁTAÞa;˜†ÌÜJ7þŠt舆Ò#p4ÐÚÜÕÄšôcüDÃûÌË…÷êøk|ÀLaŽ6'iÜ~ÊCsUL807Ë#ÿ†*®ކ"F]÷¾¡þX$<`'’Ÿá~N O¶YÇß◤ϴÊʸ&£@eJ¹ñ÷´õ´Ï 䟫š/þÿ¬áŸ²W€¬QÙP‘މMû~EÓÆƒfÂØÈ–U¥¹Ë •˜ÉƤ>Å`ÕF}¬ã_ñoL8‰ð~Ãê*ZÜøwò¹}8’ Ç)+kI"ˆáa#P»~­ã?ñ_Œúë}ݪÙ*crüð ÿ;¦Gㄎ3Œ¦2¶™A¶tð˜½-éñ•%R$Åš8H´‰³º8Å¥º~cor|‡‘N q‹WÓù8‹0H”*)Qí­ÞÝ×¾fS[ËZuÙqK)½ZÈM;ƒ‰À3 ¨L*Žn•él™dÆ”ÝuNIéæÓ¥Üª&î n™Å+Tš˜é8V@U=9W¿Z캞}+O«Ìe›$ÿwŸ›¡ Ì£Ý vLº,P>w[±³+f*EÎWŠ,RÁS €eävË©W •ºTeAÂQrLjt©Í ˜1·ÔÓKõ #4ÊRM.ÛlïK$!].’‹É½˜ªF³²©“''y¾bPf¸T—åªøO'~s"¡_ycÙé–&ÊPKVér™ðú§G‚‰d{,d‘Ö"v«RóSJÍf¥fëTì{²Ê+ëdƒ&ë3 q¬Dº\¡šxö]ŠDݪx®Œ‡x CÀ§uiÞ"œ{ìpÙ¸«ª—IU6é8çºe3•ZÇ®\uèà Æ¸…—í¼N ÕµBÝ~-QcaÒ9¿D®”-šðnU1Õ]Y—«„r³Q4™TÈ’B%·×-¼f”vlê dt /3•–Pêb¡$ªr˵ÌPuv¨œ®ԥߢn8±Áºˆ:8Á˜-TŽ(ßP¶nœ;YÕ «yIq0÷ð/ÃAÊëú_¼Ã:᪳ìØÇ–^•ÑfëÌuÏ-1½%jß§ÌÜM+”»¦¹颯6ve×XP9õÖOªO¶ ÷”÷ö¶°e’åg±¬€ž«WzeìÓdo~ƒj{¤…Ý9lwg²_xÍð2îÒ¿ ž89ÆJņ›tIÈͪOÓÊeúd94¦aµZA%¹W2RÒÛØƒËí“Üž·–Èr§&Ÿa"«¹.w©+‘# ©–P5h*x3ªTL%6%* *]Ë0b‘dLôÆ¢³±¼`ÍY9mŠ>o5Sòƒ‚¢+»õ¿ëfÞšôÅu7&fÞ˳²ˆQ¿Kõñ2-©ó¸*Ñ[ ß·[åI]ž^€\vU¬8Ë´RȤêR×eý–8£r\kÊIÓþ“"‚^ôvdžÍÃÎ)¥™ZêÕ&,àÿ9¡Á/ÿ/ðYš~N³žP?ÅYÏ2ø¬g9fZÏY˜m=™œ­§?=>ÇÚ7 nÌEO9_«øTÿÍðÍ{ß±ÈwÁ‹Xò-Ž¡Š}(¶Îrò4/ÏšN„jkÜ[“EêãˆÂš[=‚ÚjÇ+¨?‰Æêâ“XZí»ø–Īè¸,QŠ)´ú¥®Œ"û(ðœ4¸nCa5.·Žùš¹sµ­:N”@J°›j^@`ëŠð´¶×¾…ÒÓhëóuŒ óµêÓ¨ï«A÷IôT¿„žzbžš?­}¾í#¸Æ¾6…µX‹2XuoÂWw ƒ) »Ú¡4á‚%™'W 9,…VÓ. `¥˜GeæS¥Õ™Ob ÎÇ…X„K°ùlãH*1ÈZðj-¥«m…ÒJ«7 *_Š8‘tªÞÇÝçóÍdÖHjÕ0T_º»¹fÇŠùµW™©¨ž†.¡¹fÖ¾‰iµ¾ý)8§œP–Qº×ŒàPGeŽr‘^ë»ÍZTv‡û|ŸÁ]MÅÇ•U+Sòƒ«?Ûä<{ûFp“˱L;Ž}ÄZåwÎÒ–¦ð@ 5¹ýî¾pWûÝÅ)‡_ãWqhi÷ ¿v"ë½~+R.¥¥—Ó—‘Ó«içËé¯ XŠ+H¿´¢ è¦zp-®¤Ozq[pGÅV<‹í8kð=Î~ŸkÞÇ>f° )£¯•‡ï%½é‹Œ‡ùöŠíE¾½jy¸¿Æk ¥pPïÒ—­x;ýÖ‰×ñ{ŒC'Ï<Í“^§w·ã¼7™-âÔã-ü>ãûÞsþ€x».kðú¼8ufãôþ$‚ª`¹ÃËÍ‹U2x‡LxW…éÜlþ%ð&ƒtÚ|¦ðÓŽºL0ÿ¯“Sø‡¦bñ(þ… ÆS¨È"|BqB­ùÁ(þ[Ðä:Žåä‡Ð Ú&§ßÙñ‚h$ñC$èÑJ¹è„©KÉ´ 7• Žžy]‰T.3)“Úþ¦+žŽÈl…msÖ©8ëÊUƒª‰DKÉ9[tÝ)™Cìr9è~WJæ§da¹,N-óUm}¥åhr+L’Ö­ =/Hƒ-ê%JcOJ–qY¹¬P[ùµ2%—Û_5)YÃ"¤d­5¥Fz‹²„Û>†‹jÔªÖãX_ý’tØ+:ÓŽ)—.{“ºcTzÈ‚lÍ€”Ëö,”-òůɘõ þ”\w³óÅòØÇû=¹˜L¡Žc$× ¤ÉÈIàfºjf¹Z>I³‹™åVc?Ù~#cã¸wà îÂ!<¸8Š[ñ5>¿ÉñQFë+œýŸoàNÆÂ]øîƇŒ–™Ÿà>FáýÒÈç%x@ÖàA¹É0Ÿ{ñ°Æ#ò•çp”L|L¾ËçÛlè~‰§Š4|±¨ÇŠâ+,ö«J[´8çE‹e@B oÑ\1dC¤Q>±bßõò R·bÊV%;9æÄr¿N¼›Ž_>”ué·d™„™#4Êù+ÙÅunJûS¹žcžlL[¸Q(CÌ]vL÷ó[Uî…Vm¬W§©`(—¨¢ÿøà8Q¿Ì2ýv(_µ´œm#eëÕB‰['‹Ü fú¼Õ\£V¹ªkNJGÓk~~#Ë•ÅrYÝ‹ÂJH2Súé …ù ~{øì‘öš7á®9%»Û-ä@Çi9Èȼ…Uª¯Éýê2ͱŒ1ºÈïžåZÚä´Ê›ß™’[ ”Æ9*‡‹XH\2Ë5K;væGþâÿªUÒ <ëEJó«hйq„ú¹7Êüü2+Ã)lÆ·- V[-MOVƒù¬e"Þµï–ÏñYŽfjsñ+°\î•ûh×FêùšåéŒßì¹û­ú½<ݰڞeg=Ç¡üÞÎÕ{Cµ“Z`cÚv™VZ…¡*Ð <«&{ýÞtMv—ËçUýµ›—‰mœ•Fh%ÉÙ©IÕ4FU)+ÔLV'?+ÉBV¦eŒ²fÖ¥֤ͬJÛÈèëÈà8w#kÍÍ,Ên]¬WÔ'k·CéšXŠ„Åò""´„²ÛBl§•Ý–a¥z±Ý:"ˆr%šßJtpñvX ±©¨#^z0Êí#4’s-³›2.“Ú9

¯ã ø"AÑg†{­õ<€ÌÏ“¥yåÁ1‚¢1IJbÇ! êxÇÉ÷¶Åm)ÉÌ<6ÙÆ|I¬~Da†¿1ŸÕ²SF¤,/ IžcT[i EÌSÈo“ãUAE³]@ćb¾Èÿ–’ª|œT³|RÇ7Ó±;Úg±3JÇèð`¿èîh$ÜŒ¬ÌRlsš¶ºíüò];˹ԛv¬Cÿ÷nOõˆäÁs<"d8‘Þp؃J‡Y‘¢̺mVX»BñD܃Ÿ2#òü‘àfÚXKâ’ ¹'ÅáQâïe9œý–ˆ)$£áw å…FçIg-ÐñGü)uØ,)¤°Ø_pa{Z¾l’Tü‹Ž¿âUºÂº¬× ÇsºZ&Ù'^ýh^ôÿ§$Òë9Í»`â7ïÓùÞ ¢9+²¹36¬lG&w@ƒ¦ö(…ÚRBΈ}è˜ý?œ Ù'ɇ«‡–÷þá&·A8£š\¶Ûå¶îTDOçAIÙªDWºÍy®HÄäp®©q™žÑ8¯IƼj‚òij∠?Â]iØ\¢JÕd]•É)ÕMlœoõKŒš`¦I”L×Õ é÷ší€0ãJ•s¾òÈèlŽªŠ8»hOTŽUey=ÁÞÒm²GºC‘»¨¸ìmeÅGïH*êNá­D¡>ŸÄ)÷Po‹Ý¼W‡¤KËZ(rlhÁHÄŠÙGTIPWSʧÀsxÖ)‚üh¤x³æSãWߊoWÕ1xŽ’pÀ˧Ûf£„O=%Àw)ßJNYT5´“_1Éž5YÔ9¦Ü8 …£¬õ¦œU†³:‰i5ü+ObVêó´AÌW¨ÉIÔG]kvà1,:†Å—áªÁÄR¶d…±œ·ym¯Ú ΑÕwµáNbMÀ“~Å'ðŒáI¢Ù(æãœe8 ÷qlhõm<†MÔ֜Ė$Þí3ù¨É~&Ñ>ˆíEØ2€Û ·oGá;ÐyF«á6<ƒ`ä¡/àMsгœ’*Ãk”p«ýÝÐq…ÂAÌ‘Eå+¥Ñ(5¼I¼Ç(‘Gé£ÃðW¥Õ§u&ñÞ€×ðžÀx[‡7¥C¶¼šOº çFáu5KÍbŠìè]ËpS¿©˜Æß30M˜V”cfa7fc?oò7Rî NÃæryø*é§0ÏòýüxUÊÅ”j¯U¼2ŸŽ:UÅKp-é3Ixó]…Å*È÷:,Q-¼è^‚râÍUгWP£Âiôµ× ¢H å°©ð>ùŸj§M7WMjÞÈE/âfÜBDîÆó¸{<žÃ‡HÓʸZ¼´õÜNª„ø0µè´g"îà\/w î7³ÂÙî‚+-'-„ÜhÑ0¶‰iµt19÷5-uÇ!ûž€‹Ð¹w©»FžZ™û.”–i¢íˆï£G„rû>v¤Ì]¦Ýƒ56Ú>A´Ÿ"°ž2çA,2\I|Ös?ü2nxÄç(âK|†+5֑ă),rŠ{BÅaLáëêûˆW™û–$&˜Ü{jo‘8yY6{72~MžÃ]­"§‘(8—‘ob¤W3ÊkP‰ ò®¾k±Œwíó°ž·Þ ¼=mbD.¤?·Ðs­_'ÏMK®Á R×\ŒÇ)á±½¿Rõä¶ï[¨IFöH}¨‘¢à4œµƒx‚•@Xµ™:‘bÎlU˜ž® é’ð”ï[9™ó‚á*,üí\á£ÙäZh»âbÒ—ÐÔmL)“ÎlG=:èÎv´`;/åèã{7B¶ôÆÔ&²ŽÛcÃ\ÙÔ~ÂÜaSHÉ;ñRNjîÀwí$¨§k¾‡ïÓq]YJ ½„c)mwfµ=ÕötVÛPVÛg(ù'^ÖÑÏØŽ~Ø.ðÀPÍ hµcYµïYÁeÍãðø~0—ïGi€þ„ˆ¬îÏ„ûó‘µò(³á…€«VžîªjñKâÏ—Xàí”Ã=°¤È‰Ã5C{ ¯°N»¤>ÿž¥Î"JŒ’hZšÄŸbIµ°ÿf§Òk4C¾þáû—$‹Wª÷„*iŒ¬`ÇîöáØ­³÷ÜÍhDèƒ(–ò½=X8Ó#Áøõ2úÈÙÉß]Œ_?!{9cuKÄ•,’WÊWâ Ê<ÍQ‰mýÊÆv(Û!Fã¤!Fã¤Ý‡ìRçäj7³ñJ'âå 妦V;¶×Þ¨Š””ݲ@I »žþr“*±#¯§WHE^É‘&QUlGÔ¤nAÝ¡šAåÍ´K×ö î¥]ªÒ€³h©{z5ƒªÆïu«2wùᓯ2‹Ô¤ýT/Zª ‹iªL›°º¼CF¦t>ùŠÈOUÌæw`fuR }Šõ”;·%ÕÌŒËð’j–X`‡fçphxªn1ûØ…®e÷ÙǺ´Ÿ¡¹žÎ: nbu:Àd»‘A» 1Vïëìΰ—UüÖiv(ŠCjŽ:ÍvÔ!5—s65Ï®O3ѧNWóŠÙð±HUZ •ßî5«1Ãæi¶³§¤gÎ¥³陕v‡Ø“=HUÛg#þå¢nqˆRiÓl¡ò¬V5|ûH•ò€\ë.æÝãeµÅÿPKPã‘, TPKÛA‰;aQute/lib/osgi/PKPK¯TU;aQute/lib/osgi/About.classmNÁjÂ@}£1±©V‘Ò{oZ¤KÏŠ ‚§ HÅûnºØ•4 qÓÿò$xðü¨âdõØx3ïñ†7—¿ÓÀºj„g¹*™QÂî·FL•-]„€ÐÝÉ_)2™oÅRítêáØäÆMõþ`CföKǨ㡅BB'1¹^”?Jk©2Mè%6•ÙF¦âw1pßfOxIþËâO[©ž›Ê{õ½z¯àhTEÜÉ1ž·#š^jˆC/ñÈØºx¶ýù“wu®PK(EyªÌPK¯TU;%aQute/lib/osgi/AbstractResource.class…TkOi=o)½Œ£ ,ŠrÜvZ]/ën½,eAÅ"q5l\>MˈcJ‡ÌL½ü(7HÖdýæ”ñ·3ÏsÎÓ~ýöÏ¿®¢’FBaÚyÒŒ\»îUm?Üñì¥jN-úà ýfPsÓH* ¿r^;vÝiìØÕWn-J#¥0ÑSÚ)QtßDa¤rTø4 ¼ÆNIÁ¨9õZ³îDî¶Bb«¬`Ö0Z÷·½žøÔšBê¶×𢻠ÉÜZ~“Dz¿íÀi'1¢0Ëof¡pÆÄ ˜ C¯á>nîVÝà™S­»òrŸoÚtOì¶3½ôB…ÙÊÿŒÍ>3»qG™7Zit&—?>”4rÞDÝûò÷ÜÆÃÆ^3bŠëì’­N¡çÛ]!dåmÍÝ‹<¿¦qQa4NÛˆ#i,(Luåw‘»λ. ƒ=üh"‡¼ÂIö«§—ÄPHÌo• Ì£ ì)Pn«ÜâoÑD†_1¹ùÖ°º.ƒk”~ƒƒpÆ™ ÍŒ9ܘ› c¹ã\ä7%ã–‰_ð«BVd\vš!¹/vg?{øoD“R¾¯7Û&t$f‚ûA¬±J’J±ÿ¿%ô'\eÂXÆÁ7Ñ5™‹6šÑ‘*2Å î§±JÉûe˜( ‘~3RïBiŸjÎV=Ù½±Þ%[”ªä,¹àwOÈA>EŸ\n>3H’ñSÌ¢µÊLÉ5¬C [Óûý›Vc|žjE˜‚&Æi3&¾ ü 1 L2B"qçÚ˜¶¶Aë#¦>Äp)íÒ0f+¡ £ø‚ qq".}ßS<Ú·x3Ìšå=IkNÃÜÔ<0÷æŸs¶K‡°z[™èB3Ûh ÙúchÛ,ÙÔå/ÈÈñÁ²`ÿµÏ[¥ð¹ò sÏG~:Äõõbá?ÿYüÌzá|œ&ß*§Ø“(i[ÎV7—È.0E½Î32ÍÌv3ËŒ9²z‘¿µyXXÐÝZµØîv‚wpW³?ÂÛ=Þæ©ðoô Kä¡E«Ø¢\Ê*ìcêHcC{-²YèÒ7ë›Ò[$z–±|Œ—¥6j¶ à÷^àEÛ]ÀÙ8‹x•LÊ?;À%~×4Ê£ïPK1¯J_PKs—~;aQute/lib/osgi/Analyzer$1.classW{xWÿÝÙ½;³›¡ ÛvÄb¨7/¨eA4„¥M›„4Á`(}Lv‡d`2³ÌÎb‚hi¥­õõEU*>ŠZ-Âò*)ö‘V|üaõª­¯~õÝê÷ùUŠçÎîæ±YÔ|_æÞ¹÷œó;çÜs~s÷ìë'Ç,dz2$M¿)ï ËL8¹!3ÑfëÖØ.í_.#Ȱ¨b»ÝÒs¹uº§·;–e¤=ÇeyÃf®~Ù꼈±U ÊNݪ7í­Ã¥Ûôz"ï™V¢KÏÒfXl¦-}×.†Ë*´‹u ­6mÓ[Ãп(N…åê¦ú‚íNƃœQÁ³¹*d(b6OE‘ˆ©¨Áe ¸Pº´Ó´îüÈ ánÔ-ƒ!Úé¤u«_wMñ^Z Š|0,¸˜—õË)šˆnÛŽ§{¦c3,¬Qy—Ü c!êd¼©Úi•ÅT,ÂU„më#¾_~",ÝJôy®i­ £Kd,&ÇŠFíLbʉDj4ë¸žŠ·3¼·»­+Ašd42ÔVšSÑŒ:cG^·(ØX|â†ÁmT«6+H0È; 7G5TsWËXÁ0gÆ)©x«0U“vlO7íÜÆX„nUñ6\K©2<†%ñÙ5̆ #‰Õ2(¿—WdªßpÍ­¦áªx;¨†äþTo_džnQ´SÞ¸Æ1šèÑ=ÏpíU¼ke´‘±‹ˆ¨hÇ:26¢{éaƒZáêén¶ën%ȰÓFÙÙi6ºŠJ³×˸® LIDEn˜„Éùå¸9‚NtËèšj¹ÎTl@%–Økd-=-<¼"ÞPYk]zÚuÈ^l”ÑÇ0¿Ú¾ŠwZ@κNÚÈåþ÷‰”–Ä©¿[Å6“ÛÙ<åµUJ¥JñÌ^R°…2\¬ÓºÉÊ­3íºÅ¹ºa=G3â3SW*¸:A7IÚ”qëŒ.Ú ¼]…ŽAªwÃu•Å«usçúdˆ¶Ft;£ŽÉØJ´QER€ «0±"ã´yž;HÉ¥üõÄ«ˆW'¬êÖPAv"Ó–Š¿TÌ\j$ë‰5:º,vP¯RöÛ,‹È!^¡)Â!"“á$e䩦¤Jl_êâ÷¨ÅYÜnŒõ‰îœŸî -QÜïÅûd즂«p¾§X@•çûq1Ö6Ç$ l*§£¯ZM)¸“>(NVìë–‚ˆ€í´•Ï2î.÷Ñ4µyÓÊn{SðAâ÷N|HŇÔnX{Cª}ãm½©õ©ÞTw{JÈ}TÅÇðqŠQÏf ›»åÿª÷’ßÔûT|÷Sq ¹N>+8²£j0Ÿf`Í >K1•¢H ö«xŸ§EÏ)ŠÒ‰Ä«ø"ÅoŒúš $ÒKRÁAJp>gä|…³¤8Á¯ r}¨¢‰/Þy¯‹Oá7*˜¾œ‡~!ñ-ãÛ”2˰‡¼aŸ¦:ÄÆwD.¿[‘Â*h3SHYÑ«~E'¿Œñ°››J“”œ$õªVƒš€™3¿’%whc¤Ú7¡LÖSÉ%¨€c‰'eU\[fÜƲåÛÀ53›mõììÍ^Y#.}NÞMëMadN™Ó— Yº‰¤(^'G²]†7ìdT< :›¬îæŒ=½]2:ˆýüëšOkÕ‰¥’ÔÛ6\_ÏÈa݆t[ ÔÖŠkP—$¤+íHô_•äæÐl-½iœßØt—46EmcËQDaþ£¾ôåôŒøZ?Š+h&´IÞà¯/À‹ö‚]„I£d6Á•‡ñæâû¥[þÒX&Q‡ô4E—pÍ4t5O`ía¬l.à¤öãÊ¢ =/)àFZ¾é6°éˆµèÍü4nÐ<Ú7lî+ඦhÚ7fˆÅ’âq u5ŸÀvFhÍÂ$½Ø|ãnð4¼­ìd8¯ï8vAš¢{þ«¥9S–š¢wE»[&°£eü¬SØ;p ÷$ƒÑ{“¼e oU­ò!$µpL^‘ Æ}Zˆ‚¦X“-âÇ»@ j¼€l¢1B“OˆyôSI¾Wf19¦¼ð´ïôg´`Ÿ+»ù…"v2¨'Ó‚?R†çÒ‚ÉÈxk8ЪüHLY‘”¾\¯ÑjJø\ ùø\«™†Ú«°˜ —ñ/'ñ¿TÂçŸÀ]'üݾؗOà«%µ\=Yø"ÓBÇp()krß|JôÞCà„¢h| ©Ž·ÖZ#‡°HSc‘ɰ&kŠï’¬… xD¸£ì°X$Vsð‹Ea©äŽ(Ò€_¤¯a Àc?…ü1,¦biàãhåc5?ƒëhìáO`#[øSæ?€ÉÏb7{øqÿîç?ƃü'x˜ÆÃü§8ÅŸÃgùÏðÿ9^àÏãeþ ¼Ê‰süW8Ï_`sù‹l!ÿ5[ÂÖòß²$ÿ[Cë×óß³þG–ábÿ3åa»ù_Ù>þ7v€¿Â⯲GøßÙIþ6NëÏò²çù9ö½ÂÿÅ.ðKA~^RøëÒ<~Aª1ieH’ÚB©#”ºè}S($ Ó!Ñ”g0O4^©)ÅìQ¦¶\LwÞ®¢ÞÃþ€ïHx™Ý‰#ØJ™;‡Ûq"óØ‚c$ÇÙ\´à8N Äèg Nâ",ÂxŒ4‚l”n`Bƒ³Ý¸Å×±}% ™(iÔ°—èCr48»@שÓBNšG—R¡+KõXçë*ÒJ"’qÒ ãñµý:PKs—~;aQute/lib/osgi/Analyzer.classÕ½ |TÕÙ?þœåÞ™LnBH؆Ía’L% ²IPv…! ˜ÍL¢â¾àZÛZÜ׸Q”ºÖ¢­¶Ö¥u·‹­»Ö·‹¶UÛß÷9w™IÔö×÷óûÿû¾äž9÷ܳ<çY¾Ïsž{ýé?ð0±–‡H ê›8®½-9ª¡~Õ¨æÔšúQS› ›NI¶†H ê×íæ±­ÍµÉTª¹UPN]sMsÛôæ–M‚¢sÖ%Ö'Fµ·Õ7ŒjM®Inul¢­-ÙÚ4QPh}²5UßÜ$¨ÐmÕhZ3j~[k}ÓÜÎ÷n{ ßÚæ¦¶D}S²NPŒ~«-hž3¿~MS¢­½5)hI×»“öïþ6Ȭ™ŒÿnM®N¶¶òt{*™4óßl~²-K·ëHmC"•Jµ$j±„ _ßk·˜Þ8åÓQ¯úÆ–æÖ¶dÝtî0™šž¨]‹.CÉ\)‡Ü(õXÕÞT×4 [mkùÞš¦f³>U×܆κ3;ÑŠ1 jýGªü^sµmõëm†jÓ=d,eN}ª OèV5)Û ¼”Ъ¦ºYM«›õÉxÌÖ’lm«O¦xG._bÆbf½*^éé3OsC}í¦…f£úu©›ÕØÒlL6µñƒáÕõ­©64ÃlçN›]5}ÁŠyU3«æUÕL¯ä¬n?å”M‹|ní™ùsvOå™ºêæºúÕõI¬?ÜÔÞØ˜l­¯ÅÓ+jÝm8:ÙЂ;“jê›êÛ&cªÅ%‹ÀFÓ›ë’aƒ[ÓÍ?­"µ¾)B‡Ð¸ <€ø84žyj›[ê0òâý9¤ä€Â—Cà0‡,²Ãö,^^_^?%æoE)78¡np$ hññ'Ž:!>ª¤…‰'ÄKLSÉ-¦ *ã.JŠ—Wt¹–Yr$H”Ÿ2µ|Ùèò 'W”¢’×WÅK˜)¨"ËÄg}õÌv¨˜‡E//>mùñ%ËS˜Xùò:w¤ L5eYk‹—ŸpÚò’îhŽC%ÜQ ´ Ï÷øŠò°BÌ‘ïëP)߇Z^gH²À¡8WaÛ^~ª·¯GÖû¼„ÉD)Ñ´iäÄI-îÚ&o.‹ÍKBƒ5űHE¬yuÌŒ[ÝÞа)vr{¢ù«Î«åþR±¶µ‰¶˜;ä¨`"£Üqc€{i[›ŒÚ3æÍ;Ö˜h«]‹©™ÛÞ$"¼Ì%•Q˜µ,Ú×´7®J¶.H¬b6+œÓ\›hX”h­çß^¥=ÉcèAÅÝå80 KEHщOË#c¥C Z­×”Üpt"µJޱ¤›bçéÔ9¡\.­v(ß-­u¨årGë:‰;²Ñžà›¹Íšêë6;Ù¡Vb݇f¬r°–.ƒÍÄ´;4qiƒC#h($´mm}ŠmÙ "$ÈnI´‚ì‚ú˜¼þͼþ A¹k’mÕ‰¦úÕIžÉOê›GÍ„4wÜ.º.Rµ±6ÙÒæI…èlAEiÑ îðb7óŸó:Ÿ.ÀÜRÉ6èSAÃ÷&‹Ö Ñ…PúÙÆÐÚ¦K ,³ w•›¨=)±Êë2èÞR¾¹Cߦï@`ZÚ±®Ã3e{îªuÉÚ¶‰û×”ì_¦+0ŠkYüQxIW:t] u‹%¥'†­)ÎN1f:AÛº†®…&ëÖ¦©Þ¿Ëþ¯K´Žòïa«®§CtÌNöÝD7ƒ_Í6Ö7MmƒâZZb.÷ë6}ßJ·‡è6X£µq¨ƒîÀ®”Ü´Ð]&P51—î¢{Bt7èÐå†C÷Ò}0#õd× ÷éòì,¯l§!º2°ÿ]‡ ÁôMÐ)à„â,Û¢Nû0¼z)B;i·C{è˜P[³«Ø»wç©{&ÊzˆF[PtQ¢¡jåâÒÑ 11KW¼²GzŒ‡¤¯M¤jÌ"`h Âuõ­s[$äw„4ˆÀ½HKc‰FìÔ¸›ÔšLµ7`QÏH) ©™˜« ƒ¾f1ŒpºèÖM-¾~-ÎÒñ¤ýwÅà%o¬¾žwh åÒ‹õ§Ü0ý ðfš|åS}¬Æò²C¯Ð«®Vò¤gSZ+e™U<Àë  p˜ÞL` %¬öZà7ý–~‡ &SÉ£“‰:¦ô°¯Á,¾þÿ½C}\%þ¶Cï°ú,ð–àVnöžCý(ÊÍ>pèCúõšMërû*V}݆þ·~f›÷êI¹!úA1w8 ÙQ©dëúúÚd`=Žmh_So´öŸú ýÈÛ`jS݈d–0q?³•KŸ±Bø»ë\ú„þáÐçôzõˆa`à~ŒYɲýÓGž[3­½¾ÛXú»Ó‹ùÅ"ô¥°mB êm[q ˶Al--€+ÝPksÐeä‰a‘´ÒÚ¼!Èã<3x.wí|%ÎÒ#ž¤Ý!Ñ+ê>lˆèéˆBQ$È‚ÇÇê´8KçÇgY{–èíˆ>Ì«=ZЮm~¬Ø‚VøvÜq?GD’âÎÄ ØE¡ƒ‹1X„VëY!²ÓEOonhÀp ÀÄ\1 †v±Üéû!1w²ù‹1LŒpÄHQ iÛexEžÙŰS‹» òNvŸ´dQH”v!±K;^v™#ʨ¤Ö$Ûº©œÃ=áʰ8„ÁZk{2"JÄ8GŒð‘r!3m³šê’ç®ÆíâY%³øöGT ޤÚW¥<ëÔ§xÖ¬,.$Žè≟”¬ó@kDL¢Í<¡Ûa–ÅTGLp‡rZ“Íë“Sº“ŒM+Yð.EÓá(G-fa¶LO“ÜÔM”|zà±c}¾ ½.¹:ûðnö*6²bd¬ŽA3ª’­õ€ôu±U› ÀïŠÙb©MgcE,[t«M4ÅVÁIH´§ÜG<Ï2fX?ƒ°WÁqmI%ÑÌ´ ~×¶&0c±Ø´Þ÷MVãÙT ¾[¢ªìËté²"Â+X z4o`'Ä[Cqª$æ9/«[›ÍÔ»/“E¨Ú5b.( Æã^7mÓ×æÝ°82YîÆB˜ØàïÀ|G, Ê··™}+,î®ãMŠÅŽX¨¦§+.èÅ—”0ÇzÏØƒ__Û "‹åØé!Ìx':b…X }œjK´¶¥׳Aʪ3±ÑðkòÝ©–·0XÔ9")ÀÌVc²•£+²<ý­—è¯5fW/ÊeB­sÄI,²¶Ëã\Õèˆ&Öga³•akH´øÞ‰ßËð*¾—+šE«#R 1mPlÎ+jwÄz&Jn}jF{KC}-8 XNlÄXTÁ-NqÄ©†lõ©êd[bF¢-Á}mfÜø Ïá Gœi`_}ªª±¥mSXÀA*™ßAXÝÐÞÜÎ#“`iÈ}»‘ÅT¥á©sqëûІDkˆÈuÀ½[`Á÷ã†n¿¹ñEޏ˜%ê꼸؂f—R!q)˜&ýÌ‚Öd”ŠˆKÄ·Ør^þšbQXÀ©ÊwåÂ_ïÊõ4[]鈫XÝ…ê]UÇÓÙêˆmL’üúÔ¼dª¹½µ69·©”34td•Åj<˜ðf¢rÙjHr½#n`+–Ÿh_ÃjÖ[ ߺÉ7‹[°uÍn€mtw} dZÄÂf€¦3çëÒD£U=a¿Þlø¿™‹2ƒ{=º1;ž­e´ÕVá&8×J3üÇÌX+º¬3+ƒc€¡°Éõ\N4Te¹]èîV×ÊüºL퀊ÜTšA1®áI,+Á»ŠûÌ`3?=µÉc7^¯Ÿ§5“ÚÈ!•aß ú,hÜÿz×$£iÛ›v]ß/\ÏÞø¿;ÉUƒÕ‰V€‚@ya3GHš÷ãÇÚì-÷‹Šgð†.é¾³_Ù:$öuQ? _Œúù1m‰ŸêàÇ#â)ñ´#ža³gœ/VˆêŸ;âYV1PËs[\a`ôœ#žgÁQ‘®±û B@„¾j΂ýOÈàß"Œ ±Y9ó+ ‹WÖË[=­Úl´êk½Õ‰†”±ÑoÀ§ov‹•²EE Ôãˆß²Ñ+Hrì75ËÍLOð9Åa_u² "ïÎïñÞ°6±Q)Æß|¤…ýZõßÕv1Õçü7;dŠÃëÿc…ëisí;âô3Юzjͬ™Uó¬XT5oþ¬¹5a‡\©Íq'¸ƒzA ?´ãî„ŧÐÿcÑNüÍçí šøTX|Î8²©ÙhÛµ&¤ø%DaºÄuåÓÀÿ‚Â3®ð‚þ)èå”]Ý¡M©¶d#6\jGZÒæ³Qƒ–¯s‰<"„%s+ËŒŠ7bS]skXÂ+%a™í]ÐÜÜ–(Mkª+Ñd¡#‹|±öW-{s æÀsòδêØUÞŒÙË~ŽŒÊþÐ%µí­ó^Pߘ¬®ohà¹*.™†r ¼q9ˆÃ ³¿Â—ðmã|ˆZyZ}SmC{]²ò4xõn¡1ÑTÇ|·©ò´r×’Vò|‡8r¨¢¯6Û=„ŸzdRhYv“;r„ (ÒlZÃX‹˜Å[¾.,áµZ†–‡¤°œÀ{£92Bér¢#'Iøµykº†Ò»Æ2béÚ"tä9y1ÒMº4ñ÷̇ªšÚYi˜È„œ.«Br°LÖŽœÉ®@.G›«\ÌÆ›r´#g1[›¯o Kø»PóŽA_Å6ÀwŠIaü¾…^æ…Õ8r.ëÌpêS)ÇÅa ÇoWsq§¹pK™Ùb§xäùŽ\ Ù ¬]›hÚæF ¦Gäb¹4$—t9r™Ž‰ZèGG.“Ççea fç*h]<½dOèGž(W€huÍL®ù®K‡ªö,gŸan G®b½m»æ ,9 û KhŠ—ÂÅ óíŸ÷¥b‰˜«àÜÄÖÅFò#+\¿Bø™7ºÔdw»Ñ›‡9`¡Í|+räZ¹.$ë÷O Þ0ÇÞŽ<‰ »ò®š:£jÞŠc§.XP5¯&B‡ÈFG6Éf¨5ãgpì÷.aMr>Ö”lªMf9µ®vš‘'ËTH¶f9÷š8²Í¸€î0ðRn•ëÙA|5,7Â}˜4©ªúØK'Of®<Å‘§rãk©j‡Ç}ìÚÈÍŽ<Ù=Ôi)°Î™ØxÏFÌßÔ¸Š3\ºÃÇÌõn¸ç‚^E Oχ‘[äE!y!<ƒýcÏN×òÈ—Àµ——f9üèÆû×ÃI”ßÂàå®zò,³Í·A±2,¿ ¥=o²¸÷ß+¿çÈ+Ùï CºÖ€R<׫¹Unc%ó¨rÀçÅî\¸1h¨ì×õ?ðYæÚÔ\ÅÖÓ=€q\?Ë? аŠpa”rßèìÑZ¯µµÞ=7 ¹`÷mú`W®ë<2žŸT:Ù»y·¼Ç<ÛÒ`púOŸ~‹qŸ#*å÷9h“-Z"ïwäù€«\3ϳ%;|Íiáfî¯Ó‘»Ìa9úcœ}–{ÍÕäÝ< /vcJ®(O‰¡—X]sÒ ¦’ÉÆX[3GùXë± ×dÈwI% ñ,Í‘ü¡#’»a®´˜i’M |uï Eä£òñ|Ì;~½#ÄRB®püØÍè©À?ãIG>ÅcpƒiPšaùSÌÀÜ™ŸqäÏX‘‡cL˜,,ŸÅ¯ö¦¶ú¶“€µÂäúŒ,>þIæ…Ö5XcQ–öÀ*|:ÜÞêEnf¶67N÷„&öŸåÈ([´X¾äw=«¡e#òW ¢¶ÈWùoh>V>£¾[ÐìnêXauÕ‚©å³jf†å¯¡´ü_£Âò·¸9wþQ³Êç» ,ßÂMÿnþü> Èw|½Ë)9ßì(„'ñ>ž/ã î†L¹ia X]]²À2µ*8ÝÿYNùóÖ°IЊoèIÿ©m~ðÊó ™]ºé-ëž:òßôñŒ8=}hÄÐO{‹qà”k0ÌŸ¼gMœã3ÖyA!ïÿÂ&ø @æ¬÷àî§ýYxíâ[,Aÿtä¿ȹ:oAk¢)UßV¿>™Îö8°/eTvn{æð¢ÕÒ”XcέCn|k;úߣðµ0… îJÏIíM'55ohŠyÎÑd,IE•ËžÓušŸýWèþÈtHÂ*Ÿ Žïž¨UR=ý#P3æœæ¦5Ž*R½À¡æä™+lŸÍæ®L¦Ðסƒ(VQ Àêªsˆ¨jPH `È.ÌŽ¬àÉ™uuj Ý&‚J,„P’³šàNºM_«!ŽªàÝè†æDcñ¬-ÕÁjdHðáh׎*æ­UÛÐ ªàÄ ˜ÞÜÞà†{Ñ .æ/ŠuxaeŽ*W~pÇì>“)S[xÕϰΡ”k†8禫}3Ékj†£¦ªia5“e¤µ™]ñ (>?u´£Œ¿Òƒ þ*ãÙ%5zI¯6&ÓAßڪзYéBª¦Ë‘ÉÔÖÖÄ&>Ĩj6ªã5«ÜˆjijCÇ«i¹ô™x.¬c£}ÿƸÍM± × =µÔQË\'QW—1¾ÙÔ£Û<™7Mö\Èsÿ•~“ð™ŸÐÛ ?ÀP½³ÞaUšÍ¾/ «:Î]9½2½P^æjG­Qk]õŠNØ’»Ú¬òFã²NDžqï'9ªA5rÒ±9eÐb@&SÃÚÔ=/Tͯ€bK ²¥1<kUÒä†(Õæ¨Vs¦Ö;Ê‘ýà ·{²³ÇÇÛ±@ ¢Á)Ž:U†Å··ÔÍøú’'9;;!O‡ ”×5C=Ô6·ðyœ:ÓQgq¢]t=ûv›|ñó€ºëàFàbÕžd¸(¬àöØf"ô¥:D]ÀñŸ,:|!Ô…Ž:›1^žë‡y›ä1ù¨Ìñ—:ê2/ºìKW_Î\ÿíôy¯ÏœÙW·gh QXã±)`–]9a<V߃žªÄõ*h˜XHmõÁlS²mÔÂys"êjLJ]­®uÔu>¬õœÔ Žº‘3¨ÂÜŸ»„-në[u«º »åÔ Ñä»ÿAú¡×úÞĈêPw†Ô>ŽÜ¯…£îRw»ì¡KYŽ`[Ð὎ºãv¬¢ºöÔvµ#¤îtP7V¬j\•þ«ó­š£P2SòšøÅ“¨º?Û…NGíâ\§‚Ô-¨±=Žú=Á©ªf ÖšYH\{kC­çQÁ¼)‘AÇ~¢"ÆiÈX'v6^&ÙÕ¶°i «}P;s[ë!d‰††MåéÈm„vbÿÐè(Ì¢™—Á_Ï÷r³–ƒÇý'áò¦ÃºˆsâÿÅó‚Žøw€Z7§“Ÿ_úß9دgî{ú¡0ˆ‰˜ÓºÛ‹Žú¥|S>½8¼‚6o¡‘òD NqS]¢µ.o©Þw•ƒh׆Öf6Pi±bÖ§&&Å~±¥‡””ÅÚ¹+V¯kÇ8Z˜ÜØÂ|Ƶ‚vÿ;ÿw|ÿ5§&¬^g­ßÔì׃kã÷Þã9UîtºÚ­ÍDkÂþÃ,Û¿sÔ[Œ,òŒUHã5¸¥Î(¯ƒ£!îï8ê]õžï ù2Ÿ=uï@®`®ú@}RîŽL««YIö`Å›¡Œx²Ÿ8êÔŸ°•Æ+ð ­ëi”sg ôõGýU} • €³ÛÍ„o4²ƒRPiÞ4ó)³ß›Âês ª<œäŸîƤqèÄË «â×”t‘&G -Ó‰ÁëMC¾&‹Ã¨r­mñãÞãÕþqMX‡0RÆ‘ÎqtDçú»mÂk­î9C·UU'j[›'FtžîÒùûg,šûŽ.`Cjqß«ëBp®ó,Ð|eD<¥{9âÝ;—ò•Œ•y¾‹‡å·yêýå”Ö¼ö¦.F»¼ÌО—"’lͬÌuç5ËÍêøìÄ×D&¾ÖN|eúFã7Õ[]üÓC AÒ{a W7佨%ú`GÐ#0R- õmÙý¸’¬Á;ÿ02“ø>óóëˆiö,ƒÉOAwÔšp¹4‹ ¯pô(f¯üÚ†d¢©½Åákø»b ·8Äч2bµëS 8ÓUã}˜>\‘>Cuß1d:Û±#Ê[ t¹.CyoþýÍœüw8ÿkÆ,rXV‰uÞ½eˆÃz*¿:9iáüªù“'çÒ]zº£gp¦­ 'lj'虎>ÊK¾åHW;‹Óg…õ1èk wÆœVíèdòâý&áÓ®5ÇÉ2ÛÚZ_Ç~;gD¤S¡óSk­™ÊÄGE;ÒÒ-¿*íã+ikÔkr5¿­ëžG…ô²ýòv8íX/壥F²A…Ìä¬àD>Ôa½Ò8"î/fÐUŽ®Õu^¥–Èæg‘¬ìÜëŽÅ§ƒa½ÆëÖýU/h€&ÑÔÊI¿‰Ö5íæ\Ï"ú$ÝÒ ~öC:Бrt“næíL¹oçÜÅëïšø~ó!¬OÆ•yÙÌ•±á§†5veh¬x"'sšo«[6ÛÌ)92†ÿßÖØ3YQ òé ŽÞÈÑx'¤"òd} Ø„^ kxÓ²,fÞnh`ºÑÛ>·׵¬Miú7Ÿì{ Y½áK¤{™…'Ö$¦z.Mp¨¶ú‚ëƒÂlŽ5r¤*ÖØžj‹­M¬F­ƒ;d¾£ÒÅ%ªˆE¬^B†­þ`¡à«1ak ùXÿÄFƽà+2a궆d¾÷jÆàÚ¯a×:رF°æÍmkrR#V±U²Jö×Ã,xøq «æ-u¤eÅ¿aÌ,㱉a«\Р ¬M°zwíOÛ¦Xž°5Š]®XŽfq¬±Ö!XÈÑS篘:洞ÕU5 ÀËÄiz¬"Ö8ñû5¾‹ìÝÌÁ’w¬ V%(0µ¦fî‚©  8²¼YÒu®“ tsÂÖdÈvñ¨Ó–/v³¦8ÖTkg+€ÙggWÕ^_=ìn¦ùÓL×gÔ\ \Å,Ç¢|<7zdw¸r@N/ËV<`óÈ ?.æ:Fмá§ü-"ƒFØÂò÷ˆZÍ÷ˆRƤúŸ$‚i ¾:dÞÓå›k` ›üt#:Ϫv¬k® <÷yº›d ßM.‹Èp¥ý/@͚Ŏsž¯˜¼ï¥Mü&ÉI¤‰ÃŒôIDÿôÀXv78kO¬î9Ö<>ÚˆÌ7}¹ù’y¾­­à®0ܬ¦&ˆ¤¯W-ÃS¸šà- !X$"HaþBJa á_sÌïþZ9(KÊÃïün¿{dü.Àßž¿ ñ·¨Ûï^]ž'~©´Ëï>ÝúïÛí~?Šÿ¯·úfÞüE¥ ~0ꢘi?„†šë0ÓŽh¸w=Ø»Ž0÷Ãü™1s-ö®%޵Իƽk™ynþ–SF…_÷`LþߌÂÑ»iìtxa¥¹N*œl®S §ÄvÓŒè¨ÂY^é˜Âj¯4·ð8Ój~áÂhñýfKñ·4äùZfî#±ÚT`ÝOýì~ÔߎÒ@»/d÷¡¡ö@n¢ö*±ûS™=˜*ìƒh4®ãí!4Ù¾’¦ƒËLÏ„9O˽™_„®_ßE'”î¦;©Ö½$ÝË\êwRƒû«©´´“ZvR[©ÞIëÓs¾!š†¹ò¬ôê ¡1¨9œFë?Ó8Ìb™Ùi3"m¤M†jãé:•„™—OÑ3ÐFà:®tö;­*Ò˜D.¦UˆiE1­¦5Ó…iJ3Í´w@oZ9tº™Ä™(kÜ9‹§%JP¡fÓ^KwÑ9sâ÷ÜÅ{i ~]T]Vxqá¥ô­Åe…ßu ñ²Nú^¼“¶Öxm*uy']×I·ì¡;UZ4,jí! ÏGig¥ÕQ»“vq.ìå>øþ#‚¶ý땨ގÁ•YÚdH ѱàŒã ›ó@ÕùàùXèB,p¥Å4‘–Ð,n (Û€¿Mx2…ëz:Á,ùhw1ô#zÂðöÉôcüè«–öH½EOÒSs"Fü ê4x¿œ~JOc¯—@ªŸ¡ŸA2~îн÷,î ~U®;C•2ª¾(}žÛ¦>ãýzÎÝÃJK ÙI/í¤×JQ|ÅNúõNz $þj¤wñï-ü«Å¿$þ­é¤÷wÒÇ¥…ŸtÒŸöЧ‚ª;¨±Ì£æ'sâÑ'[iy¼¦¼tý]ÒxÝ[o¥9_ÕW•WêÒ½ôåÒÂí¢¼Sè"F±S䩇D~§(àŸ½Ê¼}¹¼´SôƒN>Þ#€³öˆü° fw&bXu¼´l·8¸Ükÿ~Ül>šLõ›”Tó<Êöˆ¸Ä¯•:ªŸ¤Þ`q̆oDõ1JÑâ(¦3ºHŒuùþm^ÛGq¾TtŠCx= òVöšØ)ß+&-Ý%&»Ïñ=âH˜ÀCöˆ)Ò½U$fì3%m¥¡†Eb6hQŠêN1§ °Oßu÷©º÷uË5eå{ÄLÜÝeà…J»ÌÔ¹"ê QÑO§Êp4\$Žï'l£~Q;.‹†}ªy$ yTùM”ñ£¶éOìµ;ÅšÒųÄz Ç·2†š ÕÌCí'»ÃæDsv‹¶­”‡ûbƒ *)ætŠM[)ÆFs¸ñi¢Ë<¸a0;y¨ÓQ ¨z¨êM-“ªç0&;Åù•¡h¨”;ï‚î—,eNpéµK\VÆ¿ ¥ІñP“Yàw1³œœÚÍ (‰F|Ê ‰F °9ß»–ú¢t¤)å¡„»ß»†FâÖÕÛh’7ÍkxšÈ@z†tìš‹Y~7‰æzKÏñÖ|.zºÎ,EŒuŠïçï'ÒU ÄY®.—Aß­†nXí°Ö£Ö|”u´FM fèª&:ªŽZé$h±Fj‡[˱ýl¤+pÝíu-¬É]¨Ýë#t4ÛÉÐPgÓót}LçÒ_pý’.=é"£‹ÅÁt‰(¥KÅaô-Q…úúŽXHWŠt•¨¥«E mpÝL׉«ézÑA7ˆt‹x×}t»xŽ:Ät‡ø=Hþ1Ý%>§{`Þî“Qº_¦d픕Ô)«h—\†ßËéA™ÀµŽ~ i¯Üˆë©ô°ÜBÊ‹è1y®W⺕öÉÛèIy?=%÷ÐOäè§òzZþŽž‘ïáþ'h÷gú…ü’žSaz^õÆu ½¤FÐËj½®Ž¦7T ½©–⺜ÞRké÷ªþ .¤·ÕuôŽº•ÞUÑûêYú@½ûïÐÿ¨è/êsúÔØ†/o©/»eßN9À«7@@Ö»eÌȈ~=õtgùlqEPî”ÅÜî»E²d·Œó>zF¼7À~Ô*’£vË1Aó‹Ms†l¾-Ûð8]ANÐKÌíPîf|ÐM.W¹ÃR“׬êçßÝî5|k ã‹×¾oYáü3³9¦÷†iÝ)+;åäJ»C}Èi.:Öè”GÛ`ÿ]JÎv)YÉwæt³ÿ/•zí«·RQi‘q™É± ôûçûXöi€¡Eò Óe—à¹ÌtVPwVPwŽ©ËçR‘<ÏpÃñw;åòbà_y™‡C tî ã5£å”®a¤ƒŽÄò]ÃÜh.C@NyùVÎØ àÒÛ¨ï0BËÉØ!y?i”Ê#Ü»)]Ãó‰wÊ«âšËà)’ {9âPê)ÆC´£‘b•ŠJXî 4NL‚ª9*f2%q­GÒyb ðÐ4ºIL§Ûp½ Øi‡˜I‹£fÓsâzMÌ¡€§þ"Ž£Šy¢¯X †ˆ…âP±XLKÅÑb™8A,I±Bl+Å%b•ø®¨7ˆÕ@k`1ÖŠÇD½ø®/‰uâUÑ•Ô$>-RŠ“aq[e/‘’}Åz9Dlq±QŽ›äáâT9]œ&kÄfyœ8S®gÉ5âlÙ.ΑgŠsåEâ/1 ù¢ü¥ÇOç{¶¡«÷Ê_+^®Áº^qÑT 6­:Ï›Am‚‹ŠäëÆŽ4qñMx¹Æ¬ä_¿17rñwþ£ø×ï}{3ÁûZÃ&*hu9\3µ¹ç‚QàìJ»¼¬S¾½¸œï¾½¸H¾WDæ6€—?Hƒ·EÔ‘–ardÊ “¹4J:T)ó¨JæÓѲÍ—t¢ì ÒRƒ,¢fÙ›N‘}èBÙ®€¹Mö§›äº Ï_ÊàÓ*>(?„§&@·íò#çÝ!?–Ä\ éfãÏhlæ·¼˜Ý(Zß1ìÅìú˜èýÊN¾Û½“ò¬|&ÿæ±{æ2Þíþð˜¬ÿý+i‘ìÞɸ¬üƒî:ùÜtò1öM㺒=@×ñÂCò‹9ò4RSÝAEe¾ÌÔ”–C®¾ôc˜ï»!Ä&`Ä!Õ¥eÜ.Ü º<’zÉ)4BN¥ÑrGùH9ƒfÊ*Z"g‚«ÎðWzóïEs”0Ña4PIð£¤Ñ°7ÊhÕ%°r{ ûœé¶Èo΄ÒQ:MHeíGÈýøaNVB*zœç!æ–)»H…:UN÷.ft‘ëwÁïÈz].XY«<†*gN|·êqouνh’ óTÏÈí²·K.¥\y<ÈåÔSž˜¡‹¼îsar{}+øcÞ@/{›½h‡êó$ÍöÎP} E‘êשú×”ï£Cp³¼SÅðox\ã‚DUX(:aI„.ïoDûxY§µ?ó@ÅW£½¹VpØA®"[Öb®IŠÊÕ4d¸\Kq¹ŽÊäIt˜lÀ¶ŸDÕ²9cË j‘kÖÁ¥CÌöF©Pª˜îe4DW‡ñ¨Ãå¶´‰ðz?E™ýÙ%°‘‹\ÿÑÇÇðµ'–è˜Ý7ÚÅW‘šàëø¥€ôÒ“@Q ^w§šÆïT“|‡ûñû¦χ‰ò¨ìS)GžF}`ćÈ3¨XžE‡È³Áàç‚Áϣܛ+7Ó\Ë->÷’`ÅK<èC5jŠyE4Ãó¹‡P¹92ᩆ2Vpxâ¶zÖPcªšæíùüfÎèWߥ¦³?V¤ª JPGññPå3Ê‹aX/¡¾òÒ ®êÌ­ŸšMO®:FÍéNoQd<¢Ô^U½t—š[­&wдø ±êØ­4`¯Ü²?v©ù•š£j!|ÙìqØ"p·Íšäž™HÏè8<® ãqõÖ×S~¹r­8 bF ·,ÏèË4<èzš:H¯dŸâf:,>ˆ5×l¥R#Êq5}¸ó*Þ©Îs›Üë…ÔÔ–{T:|:+%ù&¸è×T"»ð;'ß‚]øÍ–oÓù´å»´T¾GuòZ ˜Ú.?¦ €¡§v^¨¹ˆèû@‹?ÄõQùi†H?lêãê"CÏt»qÃ$Í˵Ç@‡p÷\‡ìtšaJà3þ@‡Kw9w"èã˽òQæØ‹k <—l£þͺußâ:h¹™ÌÕåFÇ•²ÍXÕÛ½3á"Å‘–2Ž=ª+ð7nJWî<¼W]ÍÃl«ÔÜ™éæš]êú]ê¦J‹wÚ©nfï¢SÝ^âË=‡…û„s®ØFáݲïaᨠõ ïVß‘ Z<‡NµÓhQvJ|÷GnánT»÷Qos…÷w›¨½=pQ^0¢=œÿ«~€"köBœ]»’€«r€§ ”MƒT˜†«U¨\:T9t˜Ê£ *Ÿæ©´×5ª xrŽ‚¯¢úÒåª]¥¢t½êO·©t—D¨Á´[„QbôNO«ƒÍéÔÇj$ý~®ÊÌ6ó) 6&Øæ/?ÍpáKµ×ó»ÿbŒ–‚,»ŠIÃݬðNœN¦Ùê‡ê!”ΡÃÍ]‹.„yX=º ë`¨¢ë±ªGÕcèñ!š¬èÐ0Ò‡¨¯è%ê/váÙt&ƒ¹ýoeÞH¯zZd…§úzÇM˜ƒ½ïÜø@#Û3”Qÿ oHfKE@>iý×;XloÃÉÓË÷|jâ3v׸p%•qûž+ÛGÏ–q‰zÂGAKº8œì""Ë?}0î1pЮ"ñ…‰¨öØK;ÁÊ?Þ¥ž¬´T1C>µz¸eiþ)8“¸ >ïNöÀ±Ê3ŽÊÁ“¼ÙM\1ce³ÍœÛþ1—ÌAÈ­^`ÇgÊGÓV ©IÐÙG¥&ƒ ž¸öRGÒAj vt*øpU©étœšA'¨*ªÇýf´kU³hxd³:†N¬Ù‚ëE¸^ªªi«ª?Î¥}øý3ÔÿBÍ7[ÑÂ(ƒž ¶â9ú‰ïyNqIürÑaÐÁA4Û;(‰C-1|³ EcM@ĆeYª~Êç–´™æ«§¿}Í4ÏZлåæY—³X©™~Õ3~¿ŠÁ éCýÜï%¯õ¬ß‡ú+Dõ\À‹'úf8ä|x‘ ýYqXq1Xq  ÷²ì¦Ø“»åù¬Èèñ W؆ãêyß™¬K;“j¼î cv¨zë±å&Ü2ÑÿÁ,Wá©Ï_¹95Pš/ã¯Û¢ÛÁBsµè­q ¨f‡ïnMó‰9Sk(ʽ/ä}ZG¥ nˆj iª‘–àºB5Ñ*ÜkB» Ài·dc°Þ&ÃIÀ,4 (a²›HŸ'.·sâk·Õ³F@/[ÿóUCãH™¬À‹wÓ > ¤Di‚zRRS¤“Xå~²ˆ‰]©×¼T s³ò£!÷”¨—oÛž ïSÊÒy¾ûŒíf°”±ÈúÙA½.Ë8I4ž:‚u&ë,ÓÙ Ø94NK3Ôy´@O u„i µÁÆžvªK3‚MD»ØKãÔtzƒíÁÂ+Õ›`o\¹Ð8ò<êÙê×|Tf¢úI.õÏÝ>ò‚>ò‚>CæIñ°±üïd¦yþÉ”9£ïF?eÌ·ˆs:輸o ý-×+éØåñA²¼æÇ¨ö¡×ï}d󶛞4J½ ¡w«?V†`ÂAp6Åî¯ ³Á ?b®¾®¼9î6rŠK=°ÈéÁ.,>$u%Äð*¨´«i°Ú X¿ÊÔ54×±¸ŽS×Òu¯®EnÀŽÜD-êf¨´[èLu+§nƒj»jíú.ž¹}Ý î4;5Ï0àÞNõ¤ËÄÝ`jäºÑ8;œÊWgM¡jõ™9h8ãþMý{VïJŠ1ß$‡§Èô¦8äoútõ–:ÞSDó”'EK;uŒ®ÊP9ƒPÿ,Æ7Ù©§Ñ<¦Áà®SÔÚ­‹*íò®Ùt³»gÓ¹€„ÓР¦“é†Dí}4óù|Ù©ûlE·Ý’èvÀ@Tæ0;ußhÎ#^ɳÿÜÊÌ2\¬„Ãå ^'•£øüìƒÅŸCG—¨_Ñê%Ú©^¦GÔ+ôSèü_¢î×êwôõ}€ëGê÷ô‰z›þªÞ¡/Ô{@®ï‹zOäàê¨D?õ¡ˆ«Ä8õ±¨TsÔ'b>î-C›•êS±J}&êÕßD®)õ„8MýÃ0ìj—¡<†( 1º¿ASÅAz€aÓ;¨Ü 'í¤˜A&!úˆRâ$S÷ µèâE²Eœ%“)%úÑD7S*PΦ_¨_¯_“ídÚëA~{͹õ’¿ÌãÛ@}Qïzo,(+Ò1Ÿ¯Xü«À0C;õðJ­Æ5VÄ£º·5Öƒ‰ƒÜ_e^]&ëžk‰Þ±€¿H[ÿ¡¬æ´¦»îÉßôÔi0öv(vu˜ŽQ±J£õpš¬¦ézÍÖ#i èµ”JâÚ¨GÓiz ®ÇÒyúÚ‚ë·ô¡øêò€â—¿< ø9z‚¡ødŒPi PšÎ—t¾Ü£3ñü+ óD¦³:ÏðYïu&cHOr3†¶‚ªñ M§;D[»J˜,êKvr&Å•çâ.=9S>Iá"=¥2Tæ·¢»Lj‰ˆyÙuœ\dòèiœÉ“ïVŽæìÑUnÉÚ£FÉ;ȬŒÉñ•¹~z®Ã‰ÍN0˼hžéᤙH4—qÍóñœã'6Êz8h0;é”°MI+n®ÆîwPoI=Åm¡çtÊ£xèÍ;ê )ÎñŽ:½;jʆ4ŸÝ›¤ á×ÛcZù¶€Y-ß×Áù¾öÁç?·0Ógˆ3¦û¬$é)T §‚é¦Ó=ƒÊu×GÑŽ¦yz-Ö³i¹žCõºššôq´Aσͧ­zÝ¢Ò½z1uê%´W/¥'õñô‚^Noêèm}"}¬WПQÿW½Œþë—z•éZQ¤ëÄ`ź^”êuâp\+õI¢J7ˆºQ¬ÐMbnͺEœ¡Sâ,Ý&¶èvq1®ßÑÓŵzC:H!® Ò¯óp0—zææRo£’‹Ó‚ÕpÚ’"ž.&é¹ÏåúX£œëE}§¢Òaéy(åÀXí3G·ÚKaía<óMž†¼U·uyFl â33É fRÌ$ÏŸ КvÇ7¸Úõ¡`Ô‡0ªí hü­ï@äÅþOµÕ”¹ŒÛ l(Ææó¶¸/+¬ìãåãÓ§‹F-àñ/åí´J/e#§Ï¤ˆ>‹rõ9T¤ÏœOë  Œ¶Ð$}!xäªÖ—d¨öš@ÑÔ£s¸(ùŒE/FIñ›>æ˜QÓ$ wüÓ×ù­1‡‹~û‡üö†bÄ_Ýóðí³ª°Àéq?@ûPÖÓ'pž¤þàÎ¥»ôñ•–{—5‰ñàw"¸ÔÝ–] svåk¸.†K ¯¯£ú†ŒW ®2à]˜ÒX!CÉX|6oB¢ u„9û·2`ë“IlÁ*ââ÷‘û.àäÒ]z9ŸfÌ™Ä5}.mûh$_|'«gÚÉ*C ßáù0½*s:¬oƪnÁvÞJ…úvŠ‚Fè;°wÒ¡(¡ïΈALöV6ŒúEÐh8«õÆiñçnîD胤“É^L?}·"[™èvr«we„æ##~æ‰Nfíku\eékïWöEü,Ϩ@_œ¾+˶o¥‰®“£×ºNŽ1.ۭױǣ[ü@²ní Û‹t[¥•VÙÃw™¡Ì›ŠÒPš8bKýʬ±¸­ÇrœÙ516›˜ ­ »û¸>Ã2æpJLÆ+!ƒ¶uGÜ”­ÜÞ¹×P~4Ò;×MÜŠÀ€Áp4˜ÔCN·ÁH߉æÂ”êM¸Íþ0)››ÁHéS1²ÿêǵœ&“‘s:Ü|Ò­¥ú1pùã4åIúG@,8=3õOh¥~Xãg´N?K)ý Ú¨Ÿ§3ô ô=ýKºIÿŠnÓ/Ñ}úez@¿Bë7` Þ¤gõ¯éEýzCÿŽþ ß¢ôïéOxæ/úEú;®_èwÌÞË¡!5.}Õ!¤ÙEVžRo6ÙxÓé}º‘¤™ôCy·Q)ú–QÏ6z¸È¨çTsjÂôZgb~9tg»H—›,• 3޹žéeÞ1O›öœãOÆè¬@ížmøñ#ÌÕqñ.ùå3¢½·Q/“ŸëF};õ9Oò™w]žŽg?óv5ïØ’!ªƒký@õÇ4JÿùChÝèXý?︀õÓçzï8èì¡fþ9w/ì™™òöâ™V€^+€OŽðìy}œoHð°G‚yàãõ[iV)üûõÏ ¼óºÃã»õ…þûC3^¥澤S%]j—³Ýߥ¯íEe]S½ÿž‘ê 7#€‡øÎ0A‘ýz¡Å9ðø6¿À·–ð.DC|”˜[ ŬÖA!Gvëð£Ûs£…»—7s‚x(}Z™Ûe_;(Á)–<LQ7áÑw<ªS‡Ö™].Ò·FsŠä(³ðäu»?Vz€ ]EmN2Ú@7ÐÍA8¯•‚ö1ìäP*´†Ñpë`šb€ÈÓ«„ÖX¥´Î:„Z­Ciƒ5žÎ¶£-Öáô-km³*éZ\o¶&Ò­Ö$úu=Žë3ÖzÕšJ¶¦Ñg¸~iÍV•(µ‡Z³Í¦Ÿânc` 3ߦÔÇõ‡™ï (SÊ7q.õ0¸*GTÓ0¨ŸBï}¢jØ ;Q—ƒUí6¡Õ PɼK·ÒÁ&”˜œ¹cåcåcåccq¶µj4Ï|®¯Ï¦w1›B…ZÔ?ÇÇ»"€p‡É…ÑP»|Òæ‚Ά?‡ßlÕw»üvªû¢§‰Ö4»¯¼n£Õüfr.ßñ_ù4Sæ2 …›Ù`.#¶îD}T ?ÖÄÖáðrl=.®ÍßGà`eGóý÷g9%~ª8ÉãàïɽbØÒhN4w—¾æéíÆ¡Øå¥Ô|ŒÍߥw°/âtêÎźïá×ãsí 8ÞãîÉx‹"ê²®Þ‹Vúáz×:y¬[¶¯‚_Ê€Œõúy‚ûÉ3ˆn [Ž)>弌$r¬ÀñÖŠžêîO:$Ú#ØŸü¨Åñ–T-x’z1ñ ¸>Zà=ÞÓ¯Ÿ0 bùÑü'©/WíÕÏ@Uý|i¥OÛ|wD7bÌçºs¾œ~ùÛûÁ]¿ù‚ÏæŸƒDL?âIë›t¤õD:ÈZ»³’±4Ѫ¥9ÖjZh­¥eV=­¶ÖAZO¢ p½Äj o[Ô&ºÉj¦Û­ºÛ:™v[èGÖFzÚ:^´6Óo­3éCëlú‡uް¬óE¾µ{¡èm]$úá³.C­KÄdëR1ݺLÌ´¾-VZßë¬ïŠvë qŠõ=q¦u¥8ϺJ|u[­­âVë:ñˆu½ø™uƒxÞºQ¼dÝ$ÞBÝGV‡øÜºC’u§ìeÝ%‡Xw˸u¢g}ßh†?A@r|Í Ç{ö% Rãq¡t‡«Ð.âj”òfàR£’ާšåï«LŸ-‚±N4Ú"6¸L?má@Ê›ƒ˜< È¾æ &;°Òè’\ú-©Ÿ÷#féš½Hs¼'þÇýå‹¡4\tù払ô4Pp¥GPÇï¹æ‹ŸQónø>Ù/á*ç§C fe…ÁÊò‚•å++ Û»y/ÕŒŠ’×/J~¿á)É_"Ì¢¥~elszbDPß«_ZZZߥ_éÔ¯gxÉ®ßI=l'A¦ºÀPA˜ÒFkûøÚÔ˜HbrÛóÍJÝT áìп)õ_$³J·ï cø'¿DŠ™ìM¾U‡§óVMÜÆßJñÅÊPtÉ5/"¾gR€Ü_ðŽŒf@Geôxç¡U›žƒ>æÏxéÛ.ßGíe審rWf0ÁÛ‹9w•ëà~§ë,×ùÚGG¤ëìÝúí*ãÚ‘@ÁïgÖöáÚž¨ý0][Æ>Zi]I §<û`P|$õµ‹i°]BÃíR*µã4Æ.£ÃírZbWÐ ¸&ìÑTo¡{,m´¡ÓíCé<{]b§+ìÃéj{]oWÒ-öDºÛžD;ì#h—=™±¤}özÚžJ/ØÓèu{ýÖ®¢÷ì™ô'ûhúÌžEÿ²g Ëž#"ö±éŒ áx_*êK5þ” át„'•¥t\ŽƒŒÿýÑxo‡S‰þÄxoáqýÞ›„/z \nw§ÿdÚ]B§ë?›vWÐzý“Ùæ/z(òwä¾iݰƒæbGªË̶æ”1‹Ìá<Ù9ñArçጾ‰"¸L¸•ÊqI¸¿N¹•ÂeªûkÙ­Ô—7˜_å7äögüu±É˜…%¾é_;Òh׸)ö Û ±/‹¨·½„úÛKiˆ½ŒŽ°§¥örZ‰º“ì3\µ³^þ_\›°É‡­3Tãl‡^>ì:RÜ ·‡ñÆ©~ª"5yÙ%1Î=íß¡ÿ1p¬Ÿ†ÈY§¨xø¦½Ÿ‘؇Ǵ×e¯¥žv=¡<Ø>)CjcÔÆ¼×’%°ŸŸ÷Zd¶¬ñÆägY]k²·»Ù-^®[Š‹ÝL!,bŸ µf :(t~ÞKqé㥸„ù?Ò‘Å!róNK½üzþÊŠáßp>péÔ_n…¾â’œ³Ò-z‰íFÝ ¥aA–¿ îÙ§bÃNƒ0mAN§ö4Ì> Ât6Ûçf̱TÕCó[V ¢c†©µŠ¤:Lîf“G˜‘¶R<áÂîà•E(ñÑ»U¶¿d‘ ñzšDÆ/³·P¾}!xg õ±/ÿ\BíË2¦12 ÕHq'–À_êiÙF¶Î²BA¬ìTÏc<¨4Þi…«ËöXû?üJívýÂ/èí¶òÒÁw‡®#Û¾»sX㦌a †=È ¦ÙµzŠ2”¹©± ÍD"V®)°ŠÌ±Ð°+‡¼—`Üñì’_TëÉâÜøÃƒôÊ›ið^«×RƒÑ¬>ÐÞ;h±«©wYý‰Ëá‚"+jΓr‹¬ÄÁUƒüªƒ¸ªˆ«b¦*\d 5¯XÃw[#ÝpIz2‚š „UÁéN™ã‰J{‡5:Ü:t+Ýá½^гô­ G­Öa·S @°5O-Vãs:ýsXÇDzbßH=øÄ†ñ5¿  õŽÀQ[|nŽèÃo;Cƒ< LäÊxÚêÁ:â«{ÀŒÍÙ~Yp¬?"8ÖÆdœ€ÄDﴎܶÿ‘ý¯¼WþyZFRÒ>hh²o‡XÀ.Ùw@O€ß컨̾›Æâ:¿'Ø÷Òdû>šeŸŽƒß¸Ü¾ŸêìÔl?@möNØš]t޽›.°÷еöèf\oÃï;íÒ=öC°3Ó£ö#ô”ý(ýÂþ½b?A¿¶Lï þÑ~’>·"”ý„(°ŸìçÄûyQj¿ ÆØ/Š#ì_‰*Ôͳ_Ëí×Äûu‘²ßçØoŠ‹ðû »C\gÿ.ýޝ¸!ð#o𘸧¸ LÌEâ"O×N‹¬éÆÞœ.úX3à½Zt½k¾Ža´_+?¶ª  ž¢+L8)L¯Ó¡ÖL<›CïB9°žŽˆÁ~( êêh´Iù ‰õ5˜(œNàá™XG‘t[YœÖ%¬Yçnn O1NùZ/²`}­ÝÖ7«!Ü5q=ÖsíÌñ‡{,À‰%~b‰ÜÂbÀÑíEŠÊ¼bb[éT’Ÿ—1L t”IT³?$aDÚþêüŠØ¤BûðÈÿ€?þD“ì?Ó1ö_À¥ãñ;iÿ-ãŒd] HÖy{PHK E%è°ÀDlùý£½3’It—1,¬cÓo•YÇí7ú¸[ÜÈþ"Û[eüaFOE^êÁ…1AŠZM ,OŸžÄÙ£5J;ª·ûÑÉߊn:;¢¾¡0 åаP„Fà÷¨“ЬyŒ—LÜ—z˜\fóD%[vaÍ·ì·Û·x¯“MÄ ü,…a¾n_ÈgzƒÙÛŽ—Ã׿3ŸÎŦq™ëH–¥§k~B}(?Ô— Cý¨W¨?õ ÀÔRqh•‡Ó„P,cêJoêùTî~4‹b¦®°‹Í¦,±\»ªõK沊Å0kÙ”¨h¬ãíÚI·Ê:Êù?PK§“{H¤Ne¢PK¯Ub;aQute/lib/osgi/Annotation.class­T]OA=Ó e¡¥R@DlËÇŠ*­ ø‚€Ò4ñÍmë’ínSvIøüL,ø‘øjâ2Þ™-¥-KàÁ6Ý9;÷ÞsîÜ9響?~˜Ã›| qícsÕÐóªuXÔÕUÓ´lÍÖ-3„CÏv¤©†fÕü/Ø S+q†Þ­ËО]ÑÍbš¡¼ÄMû!âÆ[7Ô·Z™‚{zÑÔl§BÕ ÍÑÌU²­Våô2q´•x)Ï+ ã q­Þ³ºáêgË\d—-C/3Lzg¿ç6%Ú•y¢"£›º½Ì`$®k©~¢›;¸j2Çpr£Ü-Gô?› ¬[û< ?¢ "ègð'’¹0ÜUD›@q!´ 4¤ Š@÷t¡[8@7ù¶#î+«å é« 9­¢‹÷ÚfÀþ¬“_†¶®u"ÝK¬¹’ÎQ«¹½- M$=-i[.áuÞš±æèÆ>¯„‘ÄT©&Ç» ¦1CBGšáðOd¦ÄÕÁ{H‡1 U î1C¿Çõ&síxÂÀ–D⼂,’ÿ´r™›û 3^W¶jÝK­ç‚âEKåµí5V¦<Ä]/ͲåxÊ5JÊd—<,èUžÍ¦;ñ k!¬2t5ùZAë7µ®Úv(9Â{–S)ðM]Ø ré–YQ„12¢Ÿþçô#¯B|È©´ÛAȇ0=ɯrŸÜ*3‰=s3î —ÖBAZSçèKMUKMW1š©ÒVÞo(hpÉœ.„œ—L4ÄR©Dr܈ÅèvZ" ¢¡6Dƒüt° ¢ì,¦$“‘ <ñ…è®r¨ U2bq>q˜Mý¨Ð¢A}J*JG”¬nmm©ª¬D2@¥Tî§2ðqK²)L‚ü ‰¦BP¸ÄY}c¤yUemk2Þ¼j܈}„Ç?¦bêï§Q˜rT ÐH:’§|” ƒº‘Á•µqÎR޶iÈ©cl Ò@¬hN¼9VÓÖTK.ŒÔó ç$"‹#É8¿»™ºuu<%èÀ}uV´D’±æVA÷Í fÀ!‚|õÜ zQ2¢kÝÙî+0c}C¬¥5I÷ÓŒ § ż‹ŽEOáæD ( h–M³éxH÷ªX+l‰%[7€uû&vn–EÕXb8ÕV ¹4ßOó ñ]kÙ´€j™Éx“ Jzè‡[/²i1-=cÍ«Xu F³,ª´ ¶%Ö_EC’ŠU4%¢fÁj£u~Z+¨wvü9 –†õˇԧbœ±9ζètt:†²FéL›Î¢³Ñm[K4Ò«v‹xn³{Z*¯ä;6Kça%ÑÄŒõ-‘fÔÐMáyÙNõ lº«F³šÛ¢±1Ǧ§¸ø»6]ÌŽ¢ ¸”hœ•*ÒÈ%—Út].ȃª#Íñ•±+vI®:%’¬Ì”A®-ÂMî;wrµM×е°|PÈ™Æò Û·2fE€6Òõ~ºcçæÛtm‚JÅSNOP©¥~º1cuÝZ³š[ÚZÑo,Ò Ít3‹Î-ð%DZØO·Î=/%@·ÒÜòNX»lËœ¾ uï¢v?ý c™:W°énv¾-‹~(h¸G™ÐºÕ˜CÕ¢X~ÈË^‰\¦Ú½¬¶÷ šÐ­rr®N&Ö©íQ‡ýô@†69¸¶Ú¢­Xš7£òPs"”jkXmæ Ðý矇mz„Ò z¤¥%Æ¢ö Ž«û 㸋m6mg“iµ&œB‹vÀBÃfg%J;mÚE#?kÍ ÛA%û’5&”ž°éIz Ò‹V5‰l;]²Ô‘þ§mÚÃâ€Ú×:RoÑ3læ[M\á'6=Ç|ÑÄ<'ç›~êê×âX2¾rô¢M/ÑËHȱ§?,U¹ÊPiW@¯Òk~ú9æÔ©À¦_°ðúã©M-­,z&{áêXhö”¡x*ã\þ-›Þ¦_b¤ÆHª5k ì0"sÊ„<·Êmßµé=&uf95ÕÌÿM°éô3…"MF¼>´é#^¡N»qÆ'6}ʽ£‰ÚÈÚX–Ž б@7–ƒp.‚ñ~“YM-‰$,^ÚÈ*n®DÌ Tk 0X”²­o±¼RQæ »õy´F[4±6æ£3GÙ¦%lÑÂN¸7r3¶;K±BüSoÁ¥fzh³ÅZÆ_þˆ³•‚ A¬·ÅŽv-7/ÊO·ÅÜiÀ›7LïYXG–ŒÇER«¡§q&ÂM¾c‹scD1«@Šû„ižÌîû•-C—ÒnZx-.d-´0M³çc‰ï2‹âfÊULƒKlq©¸ µŠíO§ 7ƒ »gYâ ©%_aŸ5W\e‹«Å5`tìÔ¶Hcª £3-å¿g‹(]ë?¶‡zû5îê[lbš·&Ææ“¹}£-n7»±¼+J°|%ÝÌ7ÛÕ[mq›¸“Œ5%ÖÆ¦46 溺i‰ÆF ƈaÄRK×ÒƒìNB„²¦â.߈?°‹¡›…87Ùf:´ÅÝâ’d¬¥îj üXN)ŒPÉ·ð—eêGˆêĽ‚Žé1”ûVùZÊÛ[vCvE)ÆšÎ"Ì~Y#Üc5ݺ·J”hcxÈ÷‹Zÿ[¤Et«¡1inkôM™Ùv›=Üb»-€šþØz3ˆ%Cã©mÍÑÆXØmÌýîB¿t<§vÛâ ñ¤ƒð³{3‡sˆã9Œ´63¥e%ÿ++‹è_<Åò¸×ϰ€¤­ x>r[æ®D‡¼ÑЃƒæ8£½Õƒ {kuÆÿo­8Ûñ£þ£¶Ì¢ŸÙb9mò‹— θ©Zcfc´3ü|Ñ1…¯Úâçâ5á:LóÒ줦ÙØ›×aRŽ539¿ÔoM­™^Š´†üâÍNd:[$ñt¿ø%Qñ«.ñg6¥Kü)~-Þó‹w3صËllñ¾ø ìx Œ/Ë"ýN°µ'y´ÄoãçÖ;+ƒ|µ&<sØ:bÙÔ€øPüžc?À–,›:Û„ºâ¶ø“ø3Ô6/TÑ“út?S†ùÖn‰/0Éi‘fÄü­<ë™ ÍQ'ò7sDZbÿ›-þÎ:h`Üœjq³Ä?1« “ÁÞâß¶øJ| »‹@1e†gô:kVÏÛ¢RØRJźÌ.lîÊowS™½YéŸ*8b'ý¶´xŸ7õ Ü}À–ÒF÷®)æ¹L›Öcw½D*-Ù× ~Ó£MKÂŒº«[›-yøŒX· v«˜9X²?‚[/›ÍS;ЖA9Ðшڜ³“Î‘ãŽ ä €o9¸“Œf˹ϡ6]#C‚ŽøöP´[\)‡ÙòWÆÖÃ[¦à-åp[ÆÖÍÊX7Î,±åÎT‘hÔ’eX'Ý©dC¥_†ÔE´xO¬e9Ý ±‘GØr$ŽùFJZ°zȯmË#åQŽ;ÏÊoÏÛIû`K"x²s§âÑk–Dø4ÛÙÝähÒ…­fwÚŰ<‹P4L–ywÙ¡Hó·r(šÅ“!&ùx[NàÔ¿.’t«Å!¹ ã7¨Óœo´—¨¡Zø¥Åƒæ¾ Ð+m¼©æ[_ÏιhYwj@NãhL$x_«óD ³äM+éQ2¸OªêtžoýFɾÝUת‡î»jîi_É>d¾[UKÖò–`–WÌ‚E¶\Ì!ïÔ´µ4Æà,y„fJÔð9Êanëj¸¸Ã߈ÇÎ U!·²ôJµðÖûnÍ–Î/Oê~îj6üâˆ6ä‰òdØ`é)ÈÍ"²®ÞÍl:Ê[FYãñÔ¼X4ÒÜoàWÚroVäæ³¾Ämy ›Ù|W,cQÎm´eç‚Å+cɤ“™°e gê¶â*ô™´eJ¶: fw£¶ÅؽI]QÛÿéË@ßkm¹ŽC¨¼µî6¨ly r¶ógÁêazk]’õ j2¶gÙòl†ó¼ƒ:-cxã!iÉsá÷g™â–<jæ¢ñlæ…‚Öx½mÓŠP—ŠPìh¨s‡¡ø»Dsã†PÌš„V&Mxý­[kæ¬dŒ»N4c@ÄX0tü¥Z-y o)r2c ,‰ˆkçŒk2ÆšbU-Þ1Š¼Â¦ÙòÊ.áѾn÷,ÀQyµ-¯atž‹‚ØÆ’ßtp—E—‡ÉP繉GÙò^oË$;víã¸h)ï·óœo²åÍ,À½ã©Œ™ ÒYòV0%ì ~ÖX3€¿Dص¡Ôâ3¿ÎD/ïʘòÎt¦Ü¹?&=„¹ÜaÄJ3>šÈ´­‹76òIbÜ9Ë‚Ñ ¸Á«åùNg&]ßï;„ûÏ7M.ûâµÿÅ\œÙnË»¥Žr$\I®‰E=û™ÊF\ÝÂâ.N;ã¨T"*õm6Бo®Â}ò&à‘ôË2Go@ûÊ•lzï§C,ù PWQR L-ù0š9–>Ârƒñ ÁF«Bh&Óˆ$´¤|?Ϩx8„wÉí¶|”ÏM8iî\Xñ¬,ç~io«Fš`VíxΔ mM°$ìû6°UoƒXÙØ–hC‰h€³iN¬c¿Sï‰tϸcPIyôMB?ÔÕ‰Cm–ÌÒ}t<âÊ£ö§r×Ý©ø_Hú· Ú·LÝlaÈŸÚògŸMÔ$Z§%ZŒ‹{É–/shÁ.Î90+•¯ÚòçQ®¿)ÒÚ°š}ÝèNÇ «#ÉÚØ©mlü{¸ÅSí4¯Ë7ýò® ¹Ulù–Ùw†á}WùKäIĽ5=;ô}˜£kßD–ú_Ûò].?žª‰­âhœ½Åû¶ü £.{u$ç€Lþ–- V¤5ìÚâ*žÞG¶üX~]åh‡K1ô´jÃ>6ˆgåcˆÏlù;ú oÓ;úùƒ-?—„Fã‘U͉ ‘ éß¼¯j6ÿ:#ÉÃΨü³-ÿ"ÿŠ5ÁzkÜîJÓ¥#–ZòKPÄÄóÖùåßái»]eе8Ç®ÙØçoòŸŒÿ%hÌ7\BÛwh¾˜€<ŸÖÛ%3œ“ŽühvÚ>c„Üè]&BQXú¤9éˆV§I|-}µ†÷¯„9iI68iRÓ¼.bÿµ©}­Ñq˜ãÿ:´ôÛebFî[%ÅR6(o¤8ƒ7B–ê-è‚À¢T&B9C]ô`B‰9›K‰g8i>¼?Ã\p:ÃdœtÁQef9ƒLs|J¨5‚&…’qsƒŠ¯Û…Ü4`©¾ÙL#9²S a޶Ê@ùŽØ97dÊûóI‹s½ÿ°µ5>1ÿýnRÐaûGOK!Ë.×Rƒ!S9¤°è$K…LtËojâÆYÍk#X\Ê5XG2Ô™œhñx· Þÿùûùm.ä[¬«Ã-êwÔá¶*1'*"/r ‚ 7˜-NRPã·Ÿ:ÿ÷vŒ*¬*ýª»'X˜²Õ|?šžÏœFô°õf) s ÐFÕÌ ÏÉT‹­NU HQ4‘?Qœ°?qÒÒýÜÄíÊV[µ©µà|s¢¶­aµs•hù&èûwèÆ£®·Õu" dAÇþŸÆË¬qiz†¸=£ ¡ë½O œuõ¶Æ›#¬^\ñµDÌaæYûuì—bý'œ°Ô¹.ç@µÊRçóéj#[îf¼]ˆU@Ú’)à„*¿ú® Ð¾ýÄLÓ ;‹K€ªK³ü߸ÞÉÓ¨‹Ôåžê sÎü 5íu•­®f{ž×[BqÖµ¶úžÚtÌv·q­aè|\‡ î›3õ ¿í`:Ï!ÓÍ!•9¨wÉä[“öÇgºu‡}ÃjÜá ¶0“¹ŸüÏÝ>úÿ„xs[žòß Í~Œ´”U%Ê&è[Ý©¾b5’¹,^ÒÓÈS–=ê¶jWwóù´¹ÇëhÔá%=½Eþ‡ pW÷òbŽTÈÜÇ O9 Ó$ç¨ÃœVÐÓ$ùƒORºÌÚÄØœùû¿tªûg-õ F·¥3I¶Õ#*íÜF¼ØWÖ˜M¢ªýÜéíam~µ­ûUxq¦êPò½ôó4R=f«|¤æwͨ¥t¹8ëðÀ;ð2GŒ¬óDÃ7{“ˆ° NÉöÝÃTÎÈ|·Qþ´Õ‘f†n{ÀÀƒ+Ù»>c«gy  €‹g5Gcëç®dúcãò;siµ›Bjæ“ïs0ZýÑ¡§ooÐ;GOµÞ9_êÒ…ãx¾°Õ—ü!F/ï&>W·Ôß•p5¦Q×ã¼îò+Züê_9×S¸iM¢u&‡ÃЭê+[}­É¹X‰7Oɹ˜3¨Û7,ÙÒq–æ/&ÝxÃìj­óüÚ—¹ŽÝC#[\HÇ[ÚÂê݆Óc©†dܹˆ®ü훟hX´`Ž¥ílÖbäDÒ¯{çÜcŸödîÚè^º/t^÷Ë^ië~KÛÒEhîöX»¡©>ÑoàÙ[º8{1kN¼!ÖœBÞAGft®]ðvÄÜêP[3üJ*ÔC7¥ƒ0pÿ·–™K¡H¨‹¡vKôìxX-¾îZßÔØœšp¸û=eSdm¬¹"ÒiX«H$WU¢÷Ê#+ލ8âp§fÕúTÜ«½nݺŠu£M½QG1²ò„ê9µhØ sìȦ ­Rñª”É䫾̑ý,´¯&#¼öÈG¬8¢b}*zøDfÐ[5ŸY´0ãÁóƒ oJDcî}¸‰¦çñ•ò,}Ä 5W%m-³¢È[;¾2óÕÓ‡Ûº„UÏwì«¥a5z£ q|%Ì©iW™_Ù)«Âé{­7ئïìû(ø`TˆfÅ™GBÉyƒˆW6ÆÖGóÊ|fe–FÌÞ *;·`Ç\>%Á‚rÿøJ÷e[ºÐø¶d#^¦ð׺•œÈ×õ4[OçˆÔgÖjé™Nß s¤9~ZÄíû8L™g“é}6@ywºœç ui…°×Fv£#ñ)äÌyL;7Y @žœ…XrL•^„%kÀÖ³Ú–£ÿI(Õ#´Ð'À c –†¯²£ñ”cMŒÅXÎW>b- KŸdÍ ÌNûd³/‡WoøêªÞ£,‹‰¦ ¨ ’«“D®7úéXXÓ–Tî'7¹‹ÄÔêSðŸVf >q$’Q¤'cðXM=}Ë9ô`@¶ÍC ô€Õ:©ÇÖß1ÖÇÌw*QþnGèómšBS9u¡­/â„øÀ‰? è‹õ¥~}Iæ“Þì§é)[_¦/çƒüïË2þïéÿ®G$ é+Ù\õ w¢įõ5¼SyY˜®¿‡”ÞØm¯È‚§}½­oài÷ëtós¦ù‚q£¸Š«Ühë›ôÍîU¸¶z÷R¦ó é>¾áf·Úú6ƒR¹=hº¾ÃÖw2-û´8¢iX³¿²ô]üç ÚêC¦¾di0HV1R×÷Øò4¦ò›Nfz &Ľ¶¾Oßî´&ÜKš%=½‡<¿Þö(æO˜O¨Í¶pª­‘Ñ(ß¡äÓ?¾’ÉÀäœ ¿Þ¡°7”—µÝÖ2øÓ>#8È{ÌÖ;ùK>Û|æìîøÃ‚¬0nk…k÷-½[ÐèCOï”yf¨)ÒL¾6ÄøÐ(ÔšHð§©B‘䪶&s7ƒeóI›¶ë§ºFßpuS?-hÎ>[a€—¡Ülw©±Iåc•Øú·~xÀÔE5ÓçÌXQ;oÆ´Y3gM[qÜŒ)Óg,¨ ˆ3õ•LŽmý [ÖÒ™ Àvó–üõI 6g/Ïv'dîÈâuVss,i¤“=€Ïì»ÐÁkþ›#ù4|”‡7?ÿñ²ðžŸóÀ{Aλ÷^9ï½ñÞ'ç½/~ûQ!Þ‹Ìûø-¦þü×Mø¯`˜gmˆGƒh~ãmiÔ&*+-ë !¥;(T×Aá᥅‡o£P%òFÖ•vÐèGhL©~„Æn5Táwˆ|82Š „0È0.Ž¡R:ŒÆ¡´¿Ó=§ fe4‘&apžÄ¡î$‰C¢R 3ù?šC z‚ ÅÏwŸ•¦é’êÒÂ+Ш&¼‡N( §éª*ÔiúÞ&¹ƒ6×uÝTåÛA·Ö}t{uЗ¦ï·Sy•¯´ðž Ï™ÎÚé ÌèþºÂ-ô zy(MÞäEÿ{©7Zž¦ÇÚ©€“d·;‘—î5 ,pWò¬[ð¼óú³íôŠ M¼þ×3½¢Ó³ðWX£ûòë4½ïvð[·ƒù±uáѯJ—¥EaPoÅíÔ«ÊqÁ ïqóÜŠ‘ÆÓqøoF¯&B›ˆÎ„vœù}³=ú}4þðâB…õ§‹ÑêðãRPû2ÐäRPörCŸ#±ÌÙÓýø¯—“5ôýF*¤™b0h¡Pg"†bÄŸíwÕO1ëÏGÎå¥E"”%A‘æƒèÕ)´Ú:]^›‡"÷ð´Q‰0+Îv1RÐvq‚ú¼všÌÛ.à6v‹)U¾ðvÞª²Úéà åf^åúKƒ¾í.b7ÍÝ.f)âRa›¿~‹››Ô£l†”!×(ˆÀZ‹6#u#àf:„n¹» e·ƒ4w@Ôï¤õxž‹÷Ëè†DÇóu¹G¢ËÅ\C"‹.ó ‰Ê¨^Ì¡úY&ˆZe. !Ž>ôY(‹%ä‡ð”D9õEW©Wê þôÉ5»G¡w6Œ ×‰l¡ÄŠ{=þ癢{rìg;IÍ߸º]ÌÅ“í{ŸÒeCé+ÛR$Vnñº)4 ½#ßö=€N¶æ¸…>n—> ˆÕFu$ÿ–nÌ5˜ùoc¦ñ±¦ºÜ5=z+„ºy»8UÐÄÒ´h-UˆuHœV¥Q³<¨wˆ3ë:ÄÙb›8¦9¢ào§A¿' yÌ×ó™á¯‰‹¶‹‹%ó¾Ê Z{¨4h‰ËÓâÊM44è㊎dd›l×*ZÂÝÑø!KÏõ‚0½ÍÛÅ-’–”–‰;‚¾mâûªCüЛöà;¿ž—&Öeeé$xl¢G i¸ÔÐpüõcàîN¨Þ.pøÇ0†OÓ1ôÔôY¾ŸÐ‰ôŒÒót>½‰{–~H/¡Õ˘Ù+´ÏgùvÐÏé-üz¦ &)#wo»ªiÑ«â>ȘĈ»E bÀu ? ~L¤KÅHù0Þ4#yµ\lï,#¥¨åô±ÔÈ.·\êµ\êµ\ÆÆß.wå54DÙ(‡Hm…¿¦ÅÃüÜÆÏ"±Ãuɽ9]¶MìL‹Ç»Â_¡¿w ¶¿z+y´{³ùMŽì•»kD}ÅSFöŠ2ƒ ÄäYè‰Øâ²¬àT·ÓäòŒØÔ„3À†¦H<½]ì‘Ì!æÅÍqD su¤¤Ü’YžÅ 8#ãW€'ÿí’>ô1Ìí' Ñ§à÷g¨ó;Ðê38·À¿áÈ>Ï1³‹=^.Ï VP›fÑ—â'XQе }•ˆç˜—·œúK½úÏ{õ—yõ_0(q4Ó¨½>Tî "Í…Fýt3´ÐU³êâE<_®Aþ+aFEâ€;ÄÈ~+-ÞI‹w  ìÖÁG}œß!~—Ÿ³¿úK; ®)ušýÕ ÓÀÃâK£S† 5íâ'a‡ PRÍ‚Z1FZX$þßhZük›„ú¨i¡þ> 4Í}™ê½Üê>5&Ï¿“æÖ©"ÙÎ¥Hö«­óÉ¢Úº¼"Y\[å/MËÛåA޹/ã@hcU~0®V© iyð&ºJÉ+‡Q‡J¸ˆz“<fõ|\¯@±Ù5ýÅö(Îéìe_Y™¡ˆþ}'ü©áLq‡,¯ öêLÁómQlý»nÿú±Ü&:§jÀ­ê9³¹Åy›é”Ò‡e¥ãóÙ&æ»Ëˆ²ñcŠâe졾eEr ÖƒÚ©,huÄ«Ú+[•»sl¢C­±l¸¡½òÃX9.ì”5šQH_ø”0ŽZüÞø·/aVþŽÒÝÿ›Ž¦¯€ù¾¦cñ<ÎiT+$°šÎ~ºŠ{—ȧá¹Eèqàºg„Mïˆ^ôžèMáß_DúJð’}ñÛO …âQ$ÊÄ¢B‹cD1U Ç‹áPƒâDÔˆ‰ƒD›$.Æóräß Bb“8XüH ã¹ }=)†‹½â0ñ®8\|"JÄÄñ/Q&‹E¹(ÂòPq˜¬£d•-gÂÐT+£ÎH9¦¹¯œ$'ÊIPÄ©J ‘“A£Z¨*ãFE§‹Wä(»ÂÚ“Sa*4V}¡œ†”knÓþåaµ3ä 9€¡€:ä±ha‰t‹<(,_B  ˆã©ZÎBª@ÔÐl9æÚö=B¼^â]q*–ø„ªäYâ̳ó4sÂü•3–œ þn4cdå|cdǹèö"„c7ÑYðâ4²À5õM¥p—a8ýí§¹9ÚϪ¶p3gõF¨dôúß›)䨹ÄÑœ\cÒÈò0 g-¬ƒº"øõýœ¹Å³ÊS9®ãA¬ XþD:@L¢Åd"¦PXL¥±bMÓé8ÀÓyb&ðÖ±Ô€g“˜EPç\iœÓfy.K f¹Ôxœ!•ËŒ·-¥ 3¥)r¹aßq4Ò0ÃgHË^Ë©¿4SŸI‹ôO»#&tŸÙg½CžXWÆæ¸C®¨.‡Ö§e¬œm)”~5þ­Á¿æ´<µ<-Û˜åú¬3h"âZð{!c#+Ã~\Ã8—ÛÂs<£]IíE‡ÉÓåèEòñë͈Û19vY¯`:gn—ç€ò4 üþމH{!už‰;ÙH\à Îò|ªæšN²É‹争–—âõâ"yiZª…Q¾]^%ÉÁŠ›Ñ/lÒµåè+ìfÆáz‘܈xÝøtæò26z×-áßͨYvC1ë7Óì7„.’·¹ÓÌzô•PM'AnVPHœLe€ÍG‰zƒðq²ˆÒ±Šj€zç"€œ/ÖÐBÑHK‘>YĆ6#äLÐzq*}G$¤èÑJ·Š6ú¾XO;ÅÚ+N£—Å9௸QĺYÞaäk ]#ïDJ!Ö E©ö¤ÊÔ’ßÏÔBŠ¥ê\q¯§¦w¶=É8 TiØhân9(-À°\4ÞÁU0\Á{øKËÂAÐ×!èÅLïëM´–õî>ø¨q‡¼¿®Cn©ÊsTu+TaíCEò!× ûIåxØÃ½í.xؼ ?-Y‚g~Znãd‘ÜúßöóÒ`^ZîìÆ™Ùl`ÅEÀ{ß…ÙºˆúˆKh°¸â}pÏ%4A\IsÄU´H\ .\C§‰kéBñ=ºBl¤Mâ:`Úkènq="6êŸfb¿´Gý´K}¤ä.ÃqêqC}Ní†bi »vù̹o‡È'¡ûy4‚ò)´õÛ,,ŸF^3+÷ ?­£‘ŽÁFè} Ü+ŸÁ΢8Œ`8çôûl¦_Éýš–ò9´”ü¥›Ç×癯jj°»(l‚’œPY4æ†ÊÙ€¸Êÿ |¡4èï/¦å+iù‹M„Ê“¸°ð^~ô÷­ì[Á0Ë*-gÑ!ßfX´G `~½³Yôqë3vè1eÌÏ÷6Ñ9å  f~µÊ. ÚEòƒ †îþi<“ÈPXÌOÀ©L¢iè§&*þ[а…3ü°ü´CþÞ3ý×µÓµ=•ÉqŠg(.HË?-1˜ÐŸÁ„_¸âh—mF9@g{è¼ì«+e ö; ˆ7ÑQ9ÈÈï6ìÍÔ ööÖ'Øg¡·>Îhùꪬ ¦)ŒU¶CP說â˜A8ï…ù¸Ÿf‹¨Zl¥ăp9Ñj‘¦„/gˆÇèl±“¾+vÁ—ï¦ëÄt'ž?F³AÍOÄ^zA×Jô¹ücF¡TÀʬ‰ÃÐ+ÊÜHcŽ»§]¥ËCéc[æó e •h.sCÇ^A i0¸„ë8¶ÌH”*€D•±yT½Ìo4M‘êg2ŠðÎy/Æo¹ƒ|²°¦Šƒ7ñw˜P¡ø'Œß¿`ü€ªÅWpKÿ¤ã¥ ERRT´Bjj‘>ºPæÑ%ÈÏnZ]á¼+ „I„q•&õ;³¯WHg¨fh k¾|0sªÁù<3š–*hvQ)·¾äú’¿¾swœ¶ºóËö’OÝ[V¤šmŸæô 'íãô'Çé¡NÚ¯ƒÕÁ.³€Pe·¾Ì^ž –”'{Ðö¦BÙ—É~4DQ‰<€Je:R 12Hsh³û ó=²Ì7û"ÓKþÊ‘CÌ2Ç;c eYPËRqhF*àákËÓêÐMÔ'ÔÛÕa,z‹'¯‹,G R“!Lñ`.‡Q…<Ô Ñ8yX@˜àMm‚qG¤¦¹.j‚T4ˆŠU)´, L}è‡pk=Ëÿt·¨2³¨w림ñoSå[JÜé8`±ì†`oæ¶„Ë’edÉòÂz³+T#ÝÍÀ {Ø œäF J‹Ô(w'x ÒGºé Òc8ÝÎÈLuM{fË\„yËÆsrºJxƒ8ãäJ˲n.ëŸ:TW2tµ ’Gc!cÉ–Çв žyüî°`B6fì_UrMÇs&ž³€-’Ç"˜AmÈ[P+'lð±ÁÛ >UM4l:†&«IIÌDï¬NX!èì{êäÔZêÕzÞ«Å{À’?(B“Õ"¥&–Ow9Õ†­r6ÛanÇèò"5-­f÷"u\ZÍÞDÅÙMZ¨y—%M5Õ(«6µú––•ë´šÛ¡´Ó[á"µØµj³´»«êãퟠ¯HVKy ¨*å'yåþ Þ‘!Þvu²¤²r¶¼íð]ŒK«U¼5±K߯ÛjØÆ!ßUÆòqHA‘ZÃû»ã]5qj@ÐÒ¹õ¸•ß­]œZ¬y°•¨òoeØxðfꇥ„ƒ>ÎMq¼|Ì+ÖᕳY{.Nˆv‚±ˆp"¦!‚í‹h²\LsäZ*O FYG§!ì;[.£ï"À»VÖÓM²î”+é|«<…¶Ë5ô„l¢çd‚^’-ô†<•Þ‘mô¡\KŸÉuô9ž•ëé y&}%Ï6B§å¹9þ6èùÛ çoƒ v®0¢£Duº¡KéµÄì4ÒáÆSæÎÕÆóÞCÃ`Źô%€P'µ•ª3aÙóè šä¦vAˆÎ2-žñRï g'u,úÙxgƒØvæ„™¼ÀÖ‚?3rEÑÑpG Ï1šþ’³ÍH;Áóïx¢‘‡·ó²{ª+Æøõ yx5eR ˜Ï…–¨ óöPÿꢺ`Þ6uq±Õ¡.« €£œ%Ü×mêʪ„€@x^P ®_,ȱ½Ú 8ϳ6äÁö,…íZŠƒË!\ÍØŠ—ƒ¾¬‘^À§òò"ê-¿KCåÅ î%t„¼”Ž’—Ñxy%M’WÁB\MÕòø”«i‰ü5Èëiµ¼Rr,Å °7ÒFymÁóQy‹aýùfïx§g5vzñÇNÃpiRÌpeRgšÃGNeXÚ›P×!•GCéu=êùiݨn@Ê¢#èrµ ¥ù4‰ÎR›ÕB«i‘º =3è:ÈØ;Ç•ï4Ì•N-us¦–ºÌ—üŽç6n5l~ãñ }PÝVuÍ„zküßíl êª v ¨1ùít%x“?ŠÕßènÕàM´¡8oø­«lÄŸ>³aÔµuUTSí6uGVùà ôç¯í4³çjà¼íÚ+Ä÷êçl1h›Zµð"\LÞÆ??_çnÿº%kS1ö}`†»¨Ÿ¼Þà Ë‚Ç?‚¸&Êûi†ÜBË䃕ÑJ<e¢²m€@ÛéJù(Ý wЭHß)£Ð~»|<'Î|Ôãó£êGà¤0©ëÔ½†Ï®1u79ï&sféë T8îP÷©ûA÷0F^Ž^,š Õ}€A3-¸uRçbî{ öT—{OÙ‹´©µ=¨îÃÓãÝ»‹¡RäÚš»M¬bS½‡îPÐʵ½Ê_ƦÖ1ò‹J¦1¨¬v8Ž ¬“o0'rv}ã²í»ðnWÎX.¾ërT‹0{ ü1Ôði@¹=€qÏÐàš™À› (×!4®—/ÀAÿ Öú%Cþ•fóãbü{jv±Úíb¨‹] ‹”±—Úä9j6ê F½Tmõ¤z äŸBǪÃêúi!ìêÞ1šíö›±’ Õ"åámr—[ËaýžN«½E•| T>Øw2\p•¯\ †®†ÓëP?©Ò¥¨÷Ó¡ü^êëgî–Kîæ¨ÍDý_Z’Ý ¬€"“|`ç}*¿¡>òˆ÷oAÃépù1ðæ' ã§´+_&Ÿ),÷h¶Ü£Ùr×+Y´P½jŽ h>ÌP¬é@ê£~nh6’Êè3´`q{301€XãÊmu7ªÕÄvJ– N«×Æèbm6–“³!Pa÷=óoèð&ïµÓ1ƒË Œ¹ƒ— Ö Úk}Ko£~¨ð6W8_!ü.ÆÛ¯œêòbPåלoÞþõeåi¹³&¼FlоïEit¢+»€]ŽÐ)sÕÅñ QÿD½äŸ ÿBcå€_Ò4ùOâ¿("ÿM«ä×¢$‚Ý ¨{>‚Ù‹ž^ ô*Å_‚ÐÝx> zå~«Gø­êC©-€ ÞWâf§™m}…Ää“ê#õb*Q›K*WÁðÁ‚-þ0¶=ÿİb7Æá“ä7”/„;Ùnç^Êd~Z•§Æ‚!p¬n9›Ó¼bÿ(×îš4¤tÝù~Q ˜µëö¯_m§ Ãæìl%Ÿ]…;dEUïöq¶\ò:ä?`E|ßËù,kSîìå˜i¶Tgaå ËÑùر‹mW…ÔWQ?UŒ v A {(ÂÕ)j ÍÀó8¼/VƒéD5„V©¡Ô¨B´^ £‹÷]¦¥j8xu=¢§Ýj½¡ÊsŒË›¿ÞôåMcÇÙ¸¼©~oBjN9ðS+ŒmBca—ï?fħŸVAzæHwÀ˜t9ÆåMc\8¸~™Žwƒë ñ,.ë[™V˜0è&¾ÐQ6ˆcn—Kª’üê*@¬ÖKÎ9(öQ¬þd„(Îè¸$¡þ¬þâv²;X5¡7çAþz¾ƒÊÀü?oí2ÚшödáY¬ŽÉ­¿7ZCŽ‹ x´/é–œ;†æØ¿Ì`û ¿ÿfT5Ëo9ŽO€ÊœÝ—®sO šDe°Áݯ ¥þa\²àÿ»•‹ýOÇbûX]Xá¿à»XÕ@7ÿ.Ò"­U“ô#Y¥t>§}&-vp:ÏÉ/à´ß=h¯²vè^uA«C÷©ÊwÊ ¹<à¤àtA0°ÑK‘è`!ŸÓö­—ÇØÅöÍ5ëÝ AŒ=¨HüUU± RÕ ÀØ6rPÕ;˜_¤JëÁü ™§!¦Æn×lLéC]GÂÞ}Ç¥õa<Ê-Ô7ØÛé'Ð;Ón·ëmÚ•eÛ¹…a.Ì3…•ÙB½‡†ñð#ÝiŒNë£øÈÝ}‹gx9]eŠÂæ·Hç> ~™è´ò¹e“¹ d-d ’7£_©êôWõUý‚}ŒY+ öÁS«úûøøÙ›Íp=Öé­/_ͬß2ųœâ~ÙâÉnÃãùY°‡vðK5^Jƒ|s­O°ONüÑÁo°¯˜¡çš¼]ôBN»[ôEÁÂ"=ß³ýK12¿éÚ`Q‡^ØNEnVm&Ë}_‚ÿå¾×™ÿ-Cx"Ø×nZ9g…»ˆˆyf§¬H7˜ßʹâá™R±T5tº†òÕ\èu Ìê<:@ͧxR  gµtž%j!ôjUây¤Z C·„Æá9Y@³TðÃR:A-£exž¬–STÓ»¦wªNFô¡3U.3†Pf%]£VÑÍj5 pœÚÕ)p›ô jBØÒL«=­Zèu*}¢RôgÕJSm§։aj½˜¤6ˆéê41GŽ€æ ±L)ÔÙb•:G$ÔwD›:Wœ©Îçª Ä%êBqµºHlR—ˆ[Ô¥âu™¸O].¶¨+¢M±[]%žQ׈Õµâuõ=ñžÚ(>Q׉?¨ëÅ—ê)Ô&™¯n”ýÔͲ¿ºEQ·ÉÃÔí²DÝ!Gáy$žG«-ršÚ*WÊ%ê!Ù ‘-*-ÏSÛäµêQy§Ú!VÉÇP÷)´Ù£vÉŸªÝò5õ„|K=)­ž’ï~¤ž–Äó¯j¯±kñ4ÀÌ„/Ü“]ŸüܽÏÚW~`œ¢Aò ½À`Ýù‚ŽÜv¤|Â\ªÊyD¯4û³ä½êc9™Ÿ¼]¯Ò« œ,7ê8J‚.Ö§ U@—ËÕÆ[Øô œ¦× ¯í”cu£Ù½¿‡Vë&ÝL}Ä}Õ äõ¬Šè¤úÉÃèns ÞGIטËO}å4Ú`BÔ~r Åô©(-” T§O@‹¢ÌšÛr©×òy¯å2¯å ¼·ÍÍeX4¾å]¬áÖüòpv—"˜·—üAŸ“@(ëX³T&2)Òm¼wŸgî•ãm³“Ÿ)pÌ\{˜{m ‹ `ÜO½'ø  ¯ÓAê š§ÞÌÁ|9ûφȤNu÷æ›­Ueò6¸Ê|}šašM3ôéÌ´”0ß,›ï‰Þí]×m¼Yi‡>#ë#<€ú%iõ«œ[£¾Ì­{}¦>«ë^®zåˆ*Ä¥i}¶sŸž/|œã]ø8UÐNŠÖð>dÎFy^;Í÷Ιy3‘¢uÎÎ^‡>·Ê_ʇnÍ|ÅÊ=lƒ‰ë=8zLÓûáb}¾A­w>ý£°{íßÙVNëójÂ{É‚gŒnÑø©SáÚ-îqŽsÁ˜ïðÔøZ¨-.äݦ¿»[êÐW˜[§¯ G}5`æÛAŸÚ®¯•æŽ$µ¯KëM||J»y‡Ù½—úCï^ê]æïb𣀫1mùÎfºVTå£ñfüÂèR3lu^ZßÌ/œS¤Ö¤ÅãlŠÏcÏÅ|? 8¨¦3·ÒôíÒßw<¬Að÷Χ¼…VQê8a3¼{ª‘λڼû® øDÿA7ù@–ÇÃa“’m×?‚õˆ~Ä‘bhö®w½Gc!ˆ<Ô§’Ÿ!ìû$û÷4Tý†©Ïi¢ú#UDÖª?ÓÇõWZPwÊ.Q¢þŠ®U_Óõã›´ Û´¤»´¦ûµŸÒÚ¦º€váùžOë>ô¬îK/âù–.¤ôô‘îOÕ„Ð ­оz¤‹z¨©GêCR*&ëáâX}˜˜¯Gˆt©¨×e¢Y—‹mºB\­×é‘âa=Ft Ÿ'ôâ9]%^ÖãŒ*ìfs!>pU¡@¼©·`\LëÜû?C©I?¨·€.ÃècþøÎìTsÈGÕ4Z>ibcv-HÀ󹤛¨ÐD ŠÒ¢R?hîŠ?-Bú!s¤ú–臑磿Òóf¯'Oô¢‡ÍÙ_ ¢õ#ò²Ä‘tÌÏs§ ¿é/ ZMpè\îâC$gÆ|ÉŒ…ˆ'3Ö³ÞXÏA>‡ þ:²Ûý¤KÐŽmÏØ$ê`G:æ”ÍÑÛ¼Û$5íT˜¹ãE¨–Ö;2×´>-Ë#æèKO¢|=™úé©T¢§QÏ1zfN˜0Ö¥}>UšU *3[ŽU¶é]ên×¶]ㆠSËvù¾OÃ\ yœ£„mú‰.»$CPéêäüc//P¦Gm;·ˆì ‡q„¬k(OÏÅ çÑAx×ó© nó½&ádƒ‰©žýžª÷È™lkõ^̯ë%ªÜ3?O±C?S]VW•·kŒ¦²>惊Q5EúY³Wn¦^Eú'aszµs Þ3¥V;ôî­šºH?ŸV36ÓÀò"ýS¬xI¹¹Ã°¯/òÓ»_ó8örç®Ëíª{ûŸwjÿZ;M,Ò¿è:ÃÞ¨øWl§¡Eú-'ö±tþ¥6²áZІ»Xûnÿº¹{º³¥¢—’¥—ƒÔ'‚á'Q^2pBø¡žZw°Ê&``ºŽr Þwƒ¼Ìñ6ÐÆÇ@ÓË…Ô§fç„ß;añ»ì±èkùcýF?ˆ~©mÜk ÓïÔ³‰è÷LJè÷=Úäž”à‹ÓêßdÜŇsàùôGY¿ßŸ7ºti½–záÙO¯£þz}޼ p'Ôòõ)4^xÞÛÉ©áXfàÊïôï£b ½ªÿ—ÿÿPK Azq">½}PK¯TU;'aQute/lib/osgi/ClassDataCollector.class’KoÓ@ÇgšÄy–JS PRÊÃ-NE  EŠ@PÔ §=I·8»‘½A|-NHø|(ÄìÆ„ªub|ðîÎã7;ÿ_¿ü€Ç°_…„]ñ~j(ˆå ÐéHÝX¤é+aDWÇ1…F'U(#¬ŸŠ/"ˆ…ï§lGðžJ%Í3„’¿ŒPîêˆP‚z *à!¬õ¥¢·Óñ€’b•¾E|,iÏ™±lNdа×/¼È!B#´Ö—4’ ¡í÷úÿ®ud©F‡ö*žCJŠ=æ+1vµ/„"´è«!¥®¦ŸÏ»*Ç“˜Æ¤LÚS†’¡`¼­ÿ)?~#ÇŽPJŠ#î!¢4Lä„;Bh†Z¥&™†îäÉœhŽñóZË/ÖQô†” ¹ÏŠÑŸ‰Åi¥´Fj>ìøçÕ}1÷:Èö?BÍ©þZñÅê‘°ž,+ë÷l.N¸Ú‘ž&!½‘öE·.>Ý#{uذ_“w<$ü¯ò)ày­|‡Ú7Þ¬@ƒÿž3–8 5 àu•W„K°–%?w1l;ŸXv‰™3K´»u¸ìü<°Áü¾°™Áž8F¬â`í™ó Ì"ìåÛ°U„ð"®9Äõâ–ª…-ÝÈZÚ.†Õþvne°žÓ5Vw°ƒ™s‰Ø±%^wŠeo,Ðìv&{ÇÍÔRDs¢wbo>†=Ñ:3‚8Á»p¯¨öê‚Ú÷*\¼ÿPKΪ–2%“PKâd; aQute/lib/osgi/Clazz$Assoc.classuQMKÃ@}Ó¤¦±­m­Ú?ÀC›ƒÁ³"Ø‚(Š(½oâR·Ä’ÔCÿ•‡"xðø£ÄÙèQÞÎÛÙ7ow?¿Þ?œáÈB‰ÐwË\z‘ ¼$›+o‰Õêä*˒ЂIh,Ä‹ð"ϽÛ`!Ü`äbN 1C0|F@ظP±Ê/™ Ǿ?šÌIò(m¨9°QçÂáhVaÛAšµX¨h¶ã Š ¡>U±¼Y>2}A$ ÍiŠh&R¥×¿I3R¡?ýßþ9Á¾O–i(¯•.±‹½S}‚ãDZL9“e2³p@hÿ¥D(Z8f‹?›{‡켈Õ"ÃÆ&G‡Y„LŽm÷ [no†Û_£éÖh¿r¾„ÏÖöùd—Uz¨¡Øå¬ûS=ÞGÁt_*˜î\*˜îm0ïš=®×.øGXåÎ7PK•§¿jMíPKâd; aQute/lib/osgi/Clazz$QUERY.class}”ßrÓVÆ¿ƒlK–O%…´ ICihm‡Æ¤¥Ðb¢8¢¨ÈrbÉ.¢WŠ«¦b»ã?Ì„Çé´â¦2½îqÓéž Lˆ=öw~«ÝÕžÝ#ýûߟ¯lొ ‹áÞdUzñ~e0:ˆ+õ^øìÙê^Ûj*2 ÓO§a¥ö*VrÈ Û]ÇjX®ï1,9ï¯2¨Ö#ßrwÈQ¥¨fK„d]³aí0(¦½cµ<»é2hõ¦[oY¾EKsÛó[fÝgÈí¶·»N·5]·é›¾ôkµ]ßnX'6JlÔÓóÞ2,·ÝXí˜NÛ"ZþñüjµZ·÷ãñ&W,u2õÁO‘†¬†ŽE\¦‚j©Ë|Ñ9i7Æýƒª]êäÉw™#‹œUÀU€&àSM@^Àgyº€‡.  à:GAPáà¦|É1%`ZÀ×Óf|Ã1#ÀPå0Ì Øä˜EN¬¶8æðÃŒ÷#wr¸ ýp¿QGA7ìuÂa,Xu(X &Œ‰G´ï§aoÑb¥X:·:à{6 äTŽFãèã!†|8†GÝÁ¯G åÓ]lî?‰ºãª}†ÉóPe ÍŸnœÑüÒùU)Øåh`Úv:˜œF£êYÙÞ>øt>to0v£û±h˜.³¯ 'Ú‘ôÃñdHÖß ¬WÖ&¥åv¿ eÑHÅ#†‹gEГ#c¶6h =ÁS[ ☤jªZªùTõT ©òT§RNu&U#ÕY¡Æ¢8-t§ 彈Ktßy€-‹Ïë¿À‚¹•øè9–$|œ‘°"ᓬ„«Vs®Iø\•P”PÖ$¬IøÂ8ö[—tÃ8vÜô•qìySÒ-#/鶤o ]ÒI5£ é®Áÿ&V,yA&ÁŠd\õ‚\‚k^ &(z–`Í 2­“mƒ„Œ7Iò n“è îÜõžãÞ´ù 0é_'5ñ7jè¶´Š½'Ž[E/YEŽJ-¯-½@ý$0GHƒ¸\«Ø=§ÉY¸Ÿ†ß¢ùŠðù÷‚‡JùUPûi(—_â»ë¿¿“½)!OçÜMs”É"®ês¬üÍÀÞ§ %W|©mtä&}@°µð?PKNõ¹[X<PKâd;aQute/lib/osgi/Clazz.class½| `TÕÕð9÷½YóB†$4hV¨¢IH ”„% ‹0$“d`˜‰36­+¶î{U@Y¬šª¨eÂ"(j¡.u©Z­¶Ö¥V«V-÷Ï|çÜ÷fI2 ÿþ¿mæÝõÜsÏ~Î{úÌ{ÀX%×a°{NGØSâó./ „Z½%•>÷úõP+Ü«Ý%>·¿µdÖòž¦0‚6½¼~iùÜiój«êÒgÊ%a¯¯¤Êß±ªÞžˆ`«÷¶úÝᎠalÿ“f&;1wμª¹§Èý+½í îå>Ú/U ؽ¡òå¡pÐÍ(àB«74»c¹ÏÛ„àls‡ævøÃÞUžr¿?v‡½ˆP£q õµ5ñP{43~¿úpÐëo¥³Õö@ÀG»Íì{yš´xýáÙr^,ªáîªö@0L`Ón©ÓàÄÞ#“úŸ5Ežæ·!˜Vyý ]­†Ûîܶ‡Á&Oµ—© ® zZè@‰½‡Ì=6øØÓê Jø)ÍžPSÐÛiSŠ;‘––@P'„Y‚Íe:ÓÞ`‹»‰èE‚}Lë;Ú=„žhjæKöçd(4ÕvW|>¢Y H[¬A~Wß s)Z–—[¿ ¦¡rúÒ†òŠ™U¹ra.-Ìå…¹ 2B'5ù¼~ox ‚’—?ŸèShöØ`,œbqÃŽ-`œ §ÑMkjgϬb!®GÈ:ž@2ÔÓ5Ï»,Ug5TÕM­ç±2 &Ê1‚4knƒ›¬Á3Õ•×VMå‘35(—«æWÍ­¯™UÇc•L•8”×ÕÍj(o a;TÃt LCØO]4¨Dð @i^Ox~⢾ùITÒ350™[uØÀÎBëõ{ê:V-÷ e43ÐäöÍw½Ü7Í“ RÎë/Çägþ|;(РÁm‡ùp–$2¦µ¤Õã÷½M¡’Ê ÇöhФÙJÈC:>0/¿F1â‹5È€!Ü:[ƒaÉ­edé­åœ¨·š5ÈÕ[-äA>·Ú4pÁ@n­Ð  IfÂm^óŒ¤Ì'yÐî†s÷:æîõñE}@õcÃþ%éq33ÑuÌmS~2Ìc\ð–^Örº;ÔFkíp34°šoÒ`¸n,nÓ`„ÞÚ¢ÁHÂnÓ`;ÜAv™Îk&)Iò …FV¸ ¡°.Îqç¬vû¼Í9Ò=æ´næäù9•åÕUåU9m´×Ì·C:™š¿!©Mb#™”WÀ½ÜÇ'äçùC"yšëÛ(~`Ìî×`¤sëA ƒ“w<¤A<,ý§»¹b]Ø#‘¬`¾ìÒ ÝŽ5‘1 »ýáyá–ñÙÇ&iÎÐ=ìåiÑF´Àsj°ŸçR£sÕ¾€;Ì3iðx¯ãfü­<ñ„OòÄ€èÄÔ…ežú­‡zA“‚Ì3¿Óàé^›t:ñÔ³<ÇS¶Užp[ y®§…GŸ×àx‘â¿›ƒ¼æ†uíD‹áǹlEþ| ü!ª ̨èðúˆgVx…nSã×ùv·æØá%èäŸ×4xþDnÏÝNjOANV^M~?¦p&òŽ75ø3ü…øè“Sçõß"5㯼 ïÐCâ2OÉ©t@ ßó=‚¿±J&‰>Iþ>´ÀäHãó²](© 4{[¼ž )ðêB¨y@ã­ÿÔ þÁcŸqK³À¿zù:ž<ÿo 0ÐGá+ |‰0òG’_Ã7ä#¥®TxZYû3òj’ið'óÿ£ÁÐC;[=áÙîVOÜ{õÚ˜Œ¢ˆ¨¡`Ís´ë›IfQ¹9P¦«.ïr}ƱôÇá.ÌŸoEŠÒÒâ+%ó¬p¢Gs˜u| ‘‹%vc4‹”Ø[¼þæZiW&$‹eÂH~æ0ÓOÓ°” oöœÓáö…˜±ã5œÀŒM‘v-ØÁjÁ´Ÿ¨á$¦jJ嬺ú†¹ó*fÍåõS4<Ï$« ¤ò’éKR "¨V2TsmUÃôYSy¨JÃjRgW±ÀL×(£œÁé2 ´[†“½ÂÓc|b ÎÄ: ÖRÐVÃY8›ÀúI‹úÚ6CÊX^çjXÏÎJYä|·¯ÃcÅy”ÓNdr-Ðð,Ö+k!kˆ•Óx\Ä Z¬á<;pÇô—qíy2•Œë2 ݸœü7eùu-r Z³†Vù4 mj,ÿµa+z-ØÖÛâ­ …=«4\+ ‚'LŒ;gÓQµ"…}®yþ §)Ðê÷®÷4çÄSë2ö Ç”'SÂc; bØ‚¡„1á\ ;ø.–vòùù~k4\+ÃHʪ9Ü9Šë5<—G¬ÒöV±Ï25Ýk|²˜ÐÊESS ƒƒW7jüÍžµt]r{Ä‚ Ò[wÙºÐÒŸ»•±sb´T#¡ q¾í©ld‰¶ñ:A¥½´T´èˆõR¯~–#N¬èê—µ‡]ø£›âë¦_Ë”Q›–N&¸´Ä˜ž¤Â7°Œ2z§·4f¤¸ÉT"yI…åüV 7â&âÊjòY-ÒÑå'YnÁÛŽU‹(…MvÜŒ[ØÈo%5Ϋ¨©áRFŠ$u”Jé’ŠnóR¾BtT IÒ»VàÞ…wý8TÔc0©Síø¼×‚÷ô’z}ßâ>öSq×ç8VÁû5|4âOŽø$Èv|¶`)l|O3ÀG弉yF‚‹hØÍa’ ¹ç5TÛèö{4¼/âÖ> …Lb´›{4|LöHÅíº„èâb†²vŒ²$-qÞ¡2Q S{Q“%=FTV­ÃþŽýXJ‚“æ™K$$õî˜s‹Jý Sñ_ a"ç{C^¢bBåц/áˤ47©ë›ë¡ø„[³>oÓ: _ÁW‰TsçÕ5ÔÔVQ@”ÜcöÙ&ýÝk¾ŽÀ¦Ò-ë}Íÿ7îø§Ï>ûM z“a¶;Hd'µJ@‡ý‹†o1¢ÍdK¬ø6B¦ŠBõ¤4}WÃ÷˜R¦Ê™åõõV|ŸÜwKràDÛëc%VÆç~„Ë0¦>¡öšuœƒ$b•Ûë—xŠåËcQW‘$òEB¯ZËZ«â ¬!~·y[IrÌþv·7ÈÙ¨Ô (Útèu<®ÜÄ|¥¨ÖÄ4ÆÁ‘XˆáC)–5š˜Á9—­=j4p»´näïü«–Æ&Ȥb; ò,MÌsôô'¦µü¿·· óûºÀ8ù:õšh„ÛÝ ˆ ïWAMØÅ!Hß³×»"«ìÉÝ™ÇÙÌ´_¨Á ²Ú&k04n­A— P,Ó„[¿4ŒëÊLaõÿjõ Ì-¢9Z%’ÑßL¯¥§™k‰µîv»h‚†Ñ*¼ÑÖ+ñ¦IM¬œ4žã“ÄüÇÏbçs^qLŠÚ…OP^1G=ó3e¢ô_ôãü®Q/íyX<:¥2æ]*5³9£bÒû (£Bʱšìkt[¢w±ƒd6WëÌÔŸ0§õ†˜¤ÜèâÇj²8Æ*ž'v–°`½ÈøRŸÊË1«Æ±Ê ü²&^áœT/>‡I–ý)˜)þ¨‰×¸¸g%M SœbtþÄè¼Ñ§6}Ìúá÷gR–ÑRqÙ‡¼E¡žøëoÔˆ¨ïh¢[ì&%<§Ã\'+DÅ$‰o"·£5øP»lÅ»Š|Ç„ÿXhâ#¦G†Õs(ærU‡‰Ñ’¹§Ù(ÝÓDy^Ÿ7‚ý·oÝzâ@ò3óç[ÄgÑ_ÿ®!þv}^àI_ þhGÄñïþ¯‚£[5qT|©«yeu{§ÀªÊ ¾ÖÄ7‚’.Wœ+õÊYARÙLŠM|/~°ˆÿ¡HMŸ_îoNôÖóB£J z8Ê5ÍåÏMˆQ jâñOŽ’ãŒ‘Á›~‰$ßßÄHCÜÕ‹z¯)Ry~9V±iŠ]I¡É¨§AVàG>—QR5eàb-¯¨o˜[^ÙÀƒMȃJy]#÷Ó5e0÷2s ÃÒ(š2DB¨œUW9·ª¡Š]š2ŒͳçU̬©ä¡,MÉæ¡AF¡$ŒEÑë5Y] ¾£©­šK”UÁ üÂJâ=š—È—~O°2ú}•IV‘è)o#§¼Û6þІzê °ÂPþ–†Sr~É&Ÿ©Æs€ñL3ž(Ÿƒ ]>ƒS>3`H ÞPy†¾ndÊg–ñÌ6Ƈ÷Y?"¡ŸC¿#ûôOè³þD^®ñ'ÉçÉü<È—Ï($¤í, Ô+¤»Ãh‚TB½·A–!À×c¬ûal£Ò¥õjL¨o4uÁ¤úFsœQßh邊úÝPõ0üÌ‘ú¨µQ &ú3[-ôguXfùk¡q‡ÕD?6šqØù'…4KÃÃPû¼Á,ú]H4ÂÖF´L#j:‰–™ô;’Æsi¼~ÇÒ½N£;M ûL¦•Ó}¦ÑL-Ýg.ÝdÝe1ÝÅ c …V·Ñž•Ä©Ùò {Ρuúm¯§æ~IA7Ôì†y»`Q² –ðÏRþqóOSîOAá.h-(ÚÞ8ÂRDjA…I$&SHÎ t«‰ÅÓˆ}3èè:Bq¡4["£Gù$™K¤P l1[µWðÓ˜J½€Áàs$Âcä sF ¸3†‡YŽÖË34}…qÃ[Þ o"Í0Q,…pm_€ $À }I i œ çÑ<òWNI@ÿ\‚>ŸfX–r ï8¡¶ ¨)S‹"°Á¥î¬ãgñc´ÓNüvÅÎ.á,¦Ñ³i|6Í.%¢.£9w!sb8åHéfH;ë“`w¹Äîvš1Ó3\ÑXØ WÕ1g=Ÿ¶Ì„µô¼ÁeÚY¦M•Ñ´o‡÷á} ¶‘IðÒÜJRH ¬—V­È@ý“‘Ùr½ÊÆPÎ7ÈÈ-F^¤¸n’W[EÂÙù_1òÖDØA4quÁ>¸¹±nÝãÍÍñæíÊd¢øÖ)Ùƒ~½R÷A qÐÝp÷c4z‹¹þ\ÊRµÀ©î÷ÔxÔ¾ PKMð6Mî,5;Í÷J¬ú?lú*é¯Ú›-Õ ™þΑì¸Ì˜»ÁxÞÖIx:Mx¤.åV7ìî„sõÖ¾N8GŸ=°Á„ЬwÊνóT'I‘\}¸*õÖ30[Ns~ß ÅN³idñe÷ÁKƒ^î†Wyêxƒï^صNó)xkA¦mêöž$¤;èï¼+‰a*pšvÃû»à#Ùød|*Çͱ•NóèqÃç»àõ<‡ÀÁ§‰~Dà ¹Ø_l1K½oA.?vÃ÷eÖ—5BA„1€<AE°:­[ ºÀI–øó]hVJm0¼à4;mQȼN®ß`C§ÍiÝÞóN/hhŽ UB³)¥öNhÕï'S䝯°œ)ã"¨•¥ºRÓ15‚6‚I¬ʈÝl‡SãUDÛ÷¡³Ñ©uã=8L0‡º0G鯓6ØÑiwÚ¶÷Üšµò Ò‘þ_”ŽÅÝX•©r„N‰Ž4uÂxZê³,q¿å€{ !dúí“ØÛ•Ò”N¸<áVšüM¡˜G1v…²²*ÛiéxŠk@OÝ#hç4¹Ò"x:ß«,‹îÕ)mYœÕ®ÜܘíTyøöú8c ñ½4lƒè…±¸Bâ5E‡Ãk\ì’ãŒKr‹åž£Ø")u*iËIRêL4ÿ\úŸGXsD>œñbÄ|Q v±7†: ¤Q$o«‰ÿk$v§êPŽÃ¸Èj²Î¦@:n—Ø þ6¸NKh ‡Å©')Ù³â( `á…„ÂED¤‹âèÔØñ©±ãScÇ[ñy¼ÊŸ*÷;4Dm†1"zèfæ[v"Ûz£¡SâJBã*Ò„«éž×$ 2"†Êˆ*#b¨ 3(¡òÕýPñR›epDoÄ_ïÆNÒI{¡ÃšL/n&½¸…PÙH¨lJåã¡¢ò§Þ?»qçq¸ƒø5!p!p÷OF ’Ÿ!CéÐ]uv'(Oq?y|ˆ¸ÐòÈCð‘. <4vòÐÒ¥¦d—?Õ®¥>§1ÛÔRµ®—á˜:î nÞÇqs™Éezw;ìÛ`%·öR ‡ÿ¥–B¹Ì2N†Žµ<»¿Ô*Ǭr«Íeã­Ú6í½¥v~ì/M)’‹ìúÆÁűœzf§ºcƒŠN©š¶÷¬;b¨æJ>N6ã Ýè ¢ì“¿…1x&àa˜†¿#oð4,Äg Ÿƒ•ø{âóp!¾×PÌr=íÝ‚¯Kª­×ï£Ú6é‰P¶§–­«%ÕØ,}œJ\ âA:ÙcÀ-%Û à,ƒ¼,Eq•RÛ­” žŽOÑ:Á?IÚ';E‚#×LöOüYq?I¸‚Úæ¨}*UÎ>S ‹H1ÅRµ#}-è߈ï“qø€(ò>Ù¨$XÐä6êi%o7\FlA‡½øv6r5Ïê”?ë‹!Þ@m+¼7ž,$_sæ±õÒÓÍæÁøÜ§›Óñy—Iò3nÐ…/vã;áŽt|£ïðŸ;áÊtük¯áwäêp:þ­ï0­^’Ž7†S »ñÃN˜‘ŽŸDWfÃÿì„SÒñscX#üW'Œ` Þ´ìï(ø¦¿{¬0Ã|Yo-—•8ü‚h{á—dÏ¿‚‘ø5ùšo`<~K|þŽ¢¢ïIÒþZðŠwzàçDÔËÂuBÀVŠ„;… ]Âû„žVxAØ)*Ö+qÓeAãõ^ñçõ^ñçtR¦tì‡è¼ì_à1üÎ$.ó§XýdéB©õQ_njʖ|R‰ŒSï[K¥L¨,‰l0QÄî¹0DŒ‚lqÒú;WÂG€´ò@ÈþŽ?ë‡×ýÔfh§3^ ¢?['g=j­+,ŽQ@?f#¬pªkóE¦˜œOö©ß¿O`f›]f=•æ¬Ú¬'Ø2«6Yõm.³ctDœXjqZ¶À5<á´DÄI”bwÂ`e¼ÐOùüM=G©Q̽âR³üµñ”Óâ47«Ë,mË"b ÓªŽ³Óªï±gcëbŠí§8ÕSä0uÇßþýq~ßK1—ø]©¢ø=‰%΂Ùb!4ŠE°˜ÒIX mb9ElÍp¹ðÀ&Ñ÷RŠù¸hƒgÅ xE¬¤4Õï‹|(Bð±S‚oÄjJ;×PJ¹íbf‹õ8Bœ‹'ˆ p”¸ èyЏÇ‹KpŠØ€µâRœ%~sÅåØ ®Àf1WR ËòÖNfžd%*o蓲…ä¼[ÅD1‰n•†KÄd©4Y8]L‘ò„ÕäÚØß ¥C2Ã+0P¦K’˜áâ ™ØÙIÎÏ”cSHVË¥Ëü‘g?…k4’Žt֩ɲ —ÅEŸ]¢¢O˜)®#â^OD½!!žI)Lº¡0&Òð©z–Ã_¹ö;ðË.Œˆ*ËeëÁ•¦×"b:Yãb²ñ1¯önYý7ƒYÜB筤ԉɛH¡o!…¾-Á»Žá6:f‘FǬçhñ3|UZÏ<1Óðn¹¢Öðn¯'Áü1ša«<9Áÿr â9,ýO±Ò-êHi2¸­R»Œ!Ëscy9~‘ØUŠmt‘ít‘;è"¿†â.ÈwÃ8›$îIp“c—™»ÌäØe&Ç.s:ɽ~™Sø»rB9ŸÒö¤fü¹^?§ý*ͤÒÈÓÑ4M4&#-’‹F‘®ÜÄ‚¡ŸÅä›ï–™r¿œNÝ%‘‚ós‰±M½ä‹eVY¦­Ð‹“FœÇ R˜n”c‰¥ešSÝÙ.ëaÐö‰¦Æná)³º¬®—¶G´(°@/åZ¶÷ìç…÷ _£Ëì²’ÌÿNä·4²ÂgÃ"ñýDâÈ(Ί'°2ÌV&€¢L$D&À ¥ 2•É i|vìàlã`jE¦Ö­ÄDfì<ÛHãŸ0î§ò@ §´B"€lg;míù"›‰eÐg Ó§f;¶‹Öu‚™~u2NÜÖóe'ܕ혹 ÎgÑïËTšì '$sB¶£d8)™›JM.•£É‹ÉGÚ]j6·¢ §0ðƒz&ݦÊo\Äf§i œBو ¶Ež¹éb+íÞ~ ëwê*ØI*˜­k`Ï! â4=ŸKèÊL0+µ`Sꈦµ0T™ Õ9P¤Ì…qJœ¦ÌƒñÊ|˜HÏéʨS΂J#,TÂe,SC‹²ÂÊÙ°^Y )Ëà*e9ܨ4ÁÍ4‡â{”Ø¥´Á^Å O++áeÅ)Á„€äÓï>ñîSƒwfRø{$ïPlz¯¸¸¶|b‡t6þWÅ ‘Zb|“]à(¡Ø|Ræm`I÷ï,P2)4w”0Œ© «BÊj2£kH®×Bš².A§²eÉß,dÈ ’tŠüãBšKü¬¢D~Í@) kkŸ ”Ÿ'|UaŠÞ?Š4ðMÜ|¤ïæ‹’lFòÌÉ6·öÝ|iÒÍ‘d›EEßÍ—'ÛÌÿ†©±ù,ãS’aüqËþy€6òÏfþ¹=n;†1{•ÛÁ¤l!µÝJ4Þƒ•íàRîH8eX Ån±;JaŠ>è4²5*÷ñèn±—ìÃþÑú×øÿ€þ9ÁMô÷uWþ™|5,¦¿oi¬žÿ¤'Ã8›þšÔEñxD<±”-Þh8ÒÊV~¡¼[Jèp4J[¹A{þ°G¼*€_¾ËýÕ®¹F¹Ìú«]®5¹LIãòÝíkÚ’è|Ä?‹b Šú€rŒf={ðx_Ô¿Z°KT‹ ú~»[¼.éû&Ñ—»GüET,S]ª\èR)²ˆˆ·ÙV)ñ,V¹›lÐo`†rÌSvÀrå~hVvÂå!¸Zé‚MÊÃp›!›Ó ;•ݰŸÚ/){áe?¼©€¿(ÇÊA8ªü…ò;LSžÅ å9ªÀƒÊ‡ø¤ò¾¯|Œ)Ÿà'ʧR°ËŠÇÑX°qT¼ §É`ã¨x‚![ïS(«P˜8”BY.ýl…q2$0áTÈ \} µ®%ßõwÙzÔó ju äÿàH?펈ûj÷‘¤¦á£Øæe†Ía%1læÌBG.¹•-ä ¹º-ìkG¿Mù œÊ×ä>¾I°£Ñ/­4J·?–¦ÝÆ_¤Æ?QŸúþ¹tÊ^šáJiw‘Ô—ëøÑXf>PjR¸Ø¾ÎevªãêXŠûHQ™‡ÇdÉâ²;—ƾâö!ã²b‚tùìßIÙD]ñnø>ú)ŠË²[!Wš8(‹êNÓöž_IiÎq3zV]ñ!°Ó·b;C~ie‹jlÕ ãT”«©P­€ZÕsÕ°P+ÔtèPÃj\AkoR‡Áf5v¨Y°S͆ˆš“à)»Á©›l)Š*ÙØ-¥BP´J1ɲ{9%G÷Иv€]¶”¸ÌHCVþŠßˆ…&HØÓ¥˜‰FêλëGí?+èR42»ë,Òì]PÁ=»ÑSÒ¨Rñ”í9¹g‰n+¥ž)ÚC5Ú™@s´3‰:Ñ=ÊP†`‹ö2¹—]x÷Œm+æÀÿša­ ‡á…ô,"•OÏ ”­UÓsÌzΣü×MÏå$›~z`-œKÏóàR¸Œž—S„3=o¡øþNzÞB=¿pŒ*ðþUr(Ffm¸be ÆÒóÄ3]ÿ PK˜lùïž)^SPKë–~;aQute/lib/osgi/Constants.classuX xWu¾w%K#Y–åY?ã]œÒÄ:¶^Ím4ònsŸë:‚¶U„–él¶`8Ž&6ÒPg÷ éVšéj5ò ¶¶Ÿ-˜“SExªÝ•5œLÁÌ“5q*õÇKd½F%òëäx°#lgJ…œ&Π®¶\XA—+Û"f†z uÄf…Vm㘠Ë14q.õÅ9¿â OŠdGÈΤsæžt¬ÔhK†·æqc­Ö·Å§Ó–9a8Å£à¨/£±xÆ´ø{½FsÆ‹jRGO+= -.èéi¹ PaMwÇodì,„^AÝ!œ¿— «=»-Z0®(™#kì62%RÙ°fÌ‚mM‘`<¹àlù‘W5{•™`‹~ ^ÐìïÌNS4Ç ¾ºg¼³´0GA+Ú‰‚R>‹¸"ÅÞÚÞ‹‚R½Šè"Ÿ-?ÅÃÊR\¿®wŠ3^P¥ 튴]yy.\—…rfÆœÎÛ…b9ŸÎìLOB× -î‚_1êaÔLåÝÊwÚŽ»—ËNPßárŒÂ ÂDfOÈñ¢E„ 4ž(¤'ɵå)ÛsÔ¹óäÄÔTØ€'GOȚ¾5j u7+ô„º›¶Ï¶»E%ê‹1»±Ñ^· KZêÔwSw¼ .#V Ô¯Q€TŒžjo Îˆ8ÅãºMZvIý.õÍaÄ„ÆL+“+e)þ»T \ê *µV•‚­¶"2"‰™5):Ò¹Þ’UƒªO±áÖØºãV¶ *NÛYsÂ4²š˜§Þ šÊ¹ætXõ÷ú¦g lÉ–ÇAiû G̨¦ÆÁfýEÛQ,ÐWÖ¤*â†fÒŽ¦ªC¸ˆK ökx §Q§‹%˜LRš ¾TßÜf+òšêà>Ï­"¡÷^Œå‡ÆKf.çalškùµj]Qæðxi:çM¼wƒ õz›òÉA%û^%…–_U[>vÊy\‡îÁµ´bÕ«ãž4è c,gÏŒ¼­‰·ÐЬ…K‘Wi¦mÙEb[M¼UÍ ƒ°YANbEÖ/Mjâ&)0i®ï®nG>Q:â.z:SžŠ}èÓDôÀðÁ‰´™+Û;5ñn€Ô^ׯ…ðÕŽM¼—ô÷ãÀíþ^€¼ÙºÒ?Þ‰ÁB·Ô‚{=Z‡R5ñaXƒÞ˜E¥qÒ3Foô£¸}©†»èõ$F-ÛØ],¤§Œ4¶†)'S‚Ð;ÜŒÜî[vo•O’ÿ‚°·Æ€e—T¤|šì – “~ËÎCÏÏ’žAX÷è¼zäU(ê¤ØThMÁ›ñþ\ÍKp¹b>L]Ï"¦7‡¢Æ²ã»Í “ Â9u¯1IËÙ´U43šxˆ¼P÷ª("ü ôËçJ“&ÂâÒ¯^kÍûˆ‰¾¼=­‰Ç¡hª"òWŒœˆƒä)8/y51Gɪ‚1mÏ]G}™¢>òÂE¯ë§‘ÎáÙVÁô5òwçä FÑcþ³túñy8î/Ä7ÈÃñP|#úœÒ¸&~Ÿtm´æH—’•/À¿…¢IkýÒ¥Ô#8:jú´âÈ8³Nјn³äþÉ5–Mo¡“íÙ®cÿ„v‡P׳ƒ´›RìÏHgÚGiµý3ðá_ÐÝ@ïbìEº–±Ë@Îú«Ø‹t/ÕO䡉QTe@€H¤§âߑψC˜v$¯«‰ íh<^ˆF»Êÿ#íHÃ]í‡0?©ÐýgŠ ÀG1K!sŽÛTàü+Y¶èEs!•6z;£Æ$TFò;þ;¸ŒD(­Æd”ò굓¤ã»ðŸ'KÇ÷bÕ2iMü7Ý2AèÌÊÊÿ%+TPÆ^ ëíkÒ)¬¼‘÷gÊíØmdKy¬N¹k:]Øi [ÊLŠxPæCÝt[Î"aRñlh²Ÿ®~£^ó›©¶ó·SŠŠ3/“T¼¥’/’–]>Yf8¾]©SâÛSN‹s¼T\¶ñ*–ê*¥Ü&RÄ^˜´Ê²Ó¨YKŽ&ÇÈUAèr®Xƒ<nÊòõ’P°.€¡ªXe”„¯GðÑYò4•Þ ³\`”§ÉôtX‚ÔšNòf2(¾µ67SG!bP¡c,Ó¥÷‰GGÚ¬1vŸ´êoÍ;ÜYKσE +³Løˆ°á’I:¦5™3жŅP{7_k^3 H ÔŽúÝ\.…z{ôŽ"ÞWRkgLÇ7Ëœ@Åö"‘³€ /œÖ­åpˆéÌ”údPx¯ÝÛ©ípŒne}ÒD‹9Umó (¶W;ÖTyM'EÏ%PO¯ ¨ß®ªŽ=,|4‰¾þ†„ °œiíäC(•ûk~p€Òêr>„ ¹?ˆKrö–⨋WVùsjÌvN\õð@؈×IÚNûFs ÃCac±S„'ÁÖ`}Ç.p¡œ:Ô  A弞K[“%º”LÕ°F‰°¥Ê½S$©ŒRyÂÌeËá–5²*¤wj¯_kãní>y˻ҸøÐ!.•cÈ|ÌgÌáÕ]G•Ö¼à &ØFíJ ¡§ËæÞ‚EsÚ°KE¾ÕÒ½%(Ç-0íšñªéÁ®‡N?áAU>Ñç¨ª×Æ¤žj´ßV©ø6.ñI¨±GÛ“º;mÞi -RÅÞy‡ñCi2tÀC~Dù¾ ãgLÐ+žpÑGFY. úÞe–qÁ~ #"‚ ” _Tit”rcŠI£š²0T§ðÅóW¸ŠW ý¾ç8¢8•x$œ­íØAß—^ öÉ” º¨ñà!\¨Ëã<Ô!ö‚1št£É#X)òö¢à *ìÑÕ~iò¬?0?æö,ScíL:gfËíÊd¶\œÍÈF›âr·¼¶-òæ½ÃÛò / .Q·p"]ÊËôŽéÒ•&¯‡¡ÌU&ñútKÜHû݈¯±\âíj ’™6ŠéNÕQNÐÏ;³å)sr •Ò£IéQ"vÇrö. õýþ¡»ãÇÎ[[ÞŠI—³Î[MÞ†¸¼Þy  «‡.+¹ÿv`õÐÁåT5ëŽ xÊoâ ú¶l¾ôcÅ üȲÒâGÓ´ûèˆhŠ}Ý5"~}bD¼}rDŒ¿î‘W‰–&?#Åe[âéGs!šlØB±}t¢ºÍ£&RÒ¼_jzG3ûÜÈ­4 âè¹ÁQgŽwë°ü¬üü üö·œâˆü‚¼‘Œ[÷é‰Úrò‹oëoÒ÷yµ¼F“Çé1ƒ£J™Ö„&¿d;“fŒé ;_¤9È›D óÏj-ÌyQÑ£ýuõÃÓŒù„ÛÃŽª§'”†£Ý-/ µp”‚Îÿ&±I¬@ƒ@ ¡3¼xãÀc ¯N2¼x=À70ÿ†7ŸÆðéÀg2|ðÙ ŸüR†ÏÞÊðùÀ/g8¼á ‡áW¿Šá‹_Ãðk/axð¥ _œfx8˰<ÉððëÞ <Ͱœgø `‡á"ð û€gÞüF†ß\føJà9†+ÀÃ{÷1ì`¸0d8Æ…Å÷&±Èú/1|ø(ÃÇ€¯føàë¾ø†o~Ão¾™á[€ßÉð»€ßÃð­Àïcø6à0|;ð‡¾ø# ß ü1†ïþÃwŠá{€?Üׯ÷ŠÏ ú÷yü'©/(ÝÇfÜü ÃÇ¿ÈðÃÀ2üð ? ü4Ã_þ Ã_þ=†Ÿþ:ÃÏ“áo›áïÿ!Ãßþc†¿ü§ øÏþð_2üCà¿føo€ÿ–áÿ=Ã?þ)Ã?þ'†ü/ ÿøß~ø?þ%ð1ü+àÿaø×À¿iGö í¿H“q$ÒM2Ñ“—}ÀŒYå°ÆððJ†G€G^ ¼†ax-Ãë€70¼˜1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³JƬÌ*³J0«dÌ*Á¬’1«³RqCq&#Ößn1¼|˜á%à73|øªö:(9ÔßkÙøuÀoaøà·2ü6à›Úóo–·tûßüN†Á°òÝlÞ{€ßËðû€ßÏðð¥ÉÊ¡²¹Cˆ¾›E?b≱3Ÿ’žíÓW:³ýúgv…>êÌè›ÙAýtgVÓÏsfÇô Ñê;Ðjúeh‡ôsÐëkÑ®Ôw¡Ñ ´«t í¨šµZ?혞B»F­ ë¯D›Ô/F»V­³N߉v½¾íýMh7êW¢Ý¤Ñž¢_v³>…öT½‚ö4}/ÚÓõízä—w޽,¶àYp„,8Füš,¸†,¸QYp‹²à]Ê‚[•·) nWÜ¡,¸KYp²à^eÁqeÁÃʂǔ_R|UYðŒ²à9eÁ3Ê‚ç”ßR|OYð}eÁw•ßQüPYðseÁÏО©ÿíYúOоDÿÚ³õ»Ñž£_ö\ýI´/ÕïD{žþ´[ô_¢Ýªÿ íùúóðÁÇÆÆb\I>XI>XK>H‘.$\¬|`)ÊãÊ;•ŠÊ{”nQ>•îV> /|l•Ú!)û°ERa¤À&I‰3LJDŒ–”ëhŸ¤<‹6JJ:1tÒ‘ %¥O{%e6KJvKÊÕXüîíµ—ÔÚGÑõ©¤üô£òÞãòþö؃jì!µïÃxôØ£}…§!Ô_…røb”¬¯FÙø”v¯Eùµ%Ô%(v  yJK‘œ/BB>(¾ê§¢dÐa¶@:‹¸Ü‡pqˇĒüš8(ŸÇä·ÅUòGâjù¼¸&Ñ/®Mœ*®Kœ+Ž%¶ˆûÛÄý‰´x Q&æÄñD]<”¸ý7ˆ§7‹§·áïíâ+‰;Å—w‰g÷ˆ¯'ÁßÇÅ ù„Juô,|RÙòÔÿPKäG5@ !PK¯TU;%aQute/lib/osgi/EmbeddedResource.class…UÙWUþ†,a,Jiºh³ÒÍ.Pº°µ‰ºI ¸M’† &“¶Ôº[­û^µ_ô¡Ož£çØPÅÓWÏé«ÿˆÏ>X¿;’„šsrçν¿ûÝï÷ý–¹ÿïï÷ìÆw2ê$t©gr¦Néñ°‘ÕÃ#óq-™Ô’gµ¬‘Ë$4N Ísê%5œRÓ³á‰øœ–0e¸%´W]9"Á™TMUBÝô %¥fÍSFRŸÑµ¤)*Á¥]13Ü÷Ž•pÏ™==Û/Á}XOëæNüÓƒÑÀ$цŒ¤æ- W‚Øl€„õ dÔ‹Ù ðHhÓÓÚxŽ>dΫñ”&î0jjRÍèâÝ^tšõ¬„-cÿã<é4 Z:’^È™d¨©ótÛ(ðÖpÙm=#WÚ‚©鬌. ›VÌFõ”6n˜£F.,ÚÈØ"¡sÅdpÑÔŽg2êb¤ÝØ&|ÞNͨ†Ãu9£›tÁç/’˜È™%I~ ­E†Å =b§Œ…«uTÁcâ"‡‘3)hmt õ¦QQV„( Œ=”¨ry0§§’Z¦û˜}fß~á× mþjŒÀ¤°8¤ "!Ô†€©ÓéT_h#÷‹â3§§æCOSÆ.ª‹BEjDÕLͰG…âÃ+‘Ì™z*|U_Oé «"9„Qáñ ý5q„ÓCˆ(ˆâIVͬf޳LFÒffQBÇŠÔåøÖéŸÂ„ŒqƬ¶…‚Ó8#¡QÏëÖ®!YBSÎ9çñ”9a¤RÜ\•X«èMŠ›.(xZ% ~ê¼&0¦„cëÿžòSÇ1(8ĉÍq¬ÏSË·&"͘º#â$>_+h„ÂŬ½È.~β=›ÙSùIèÊa :øwq„øAüø ²žDä¨pŸuÁ±‰o1Z:ùl .¡9ºƒÖ`÷´ýÂ¥:´sôZÛ…âà:läJ·uE|è°À›¬ë$k&.¬ãœêð¹‰kN¾m¶.Üo$etÇ‚¿¢u [.Þæ¶öZ¬”‚}ƒÄ(?^†¶ÃB;Ε:ábH@å(÷Xm$µÁ‚ÛP0,n@z $‰k«1l“ëXÆî˜wïž°÷ò8èÝ›Çá<ŽVRõ•Qí°±D TQ½Od>£ËŠ…–0Òçô9ó8Ùçº^Ÿ+±[èò9ïâlŸ;(Þ'—!Å|îî%Äh7}Á¶ö¹þ|𗘫%_ƒV„7qÜLñº°žáéd6lÃVÄvåÚ0å‹‹à{„ìÉIh–QÌ`Öò!jσc¸ü[psx‘9µjŠ »ùgw®òp܆w©ØÒcÁÐ]¡<²%ÕÖYi³‡{™LûÊ"ãµ8€;Fæ2QëEWªºåÎ]Âç`W:[v4ÿ·÷ÕÎ?êÇo£1Ôãh£8¯{òx3¶ßùýƒ¿K:mµ*â Ï‚ø(7¡­ ƒ#Tn*UÒ'h3³B®¸˜„×ðÑZ‰÷.Ñ<[\sR_§=“D;°s*l•àb*µýT‘>ƒeéã*KŸ÷«ÜV9Òµ‡~ÃNwrò‘„»ødgŸUì(#u‚ó“ä)+Øv|nǼ_àKÂËh¶ü,¿*VBتŒ뛕I?Vƒµ„opÀ>|ÄN·h(7+Kò4Ïœ) ¼»X’n«E‰‹oåÛmË'[•x½RÀóeTä"•o-«[ÿPK‚Æï~ýT PK¯TU;!aQute/lib/osgi/FileResource.classUkWWÝI&„Q ÁJ­Õ$„Ð*#¼Ä ùw ÚÐÎæ%µÔ”Èg_ú|ìKDÁØ!Áˆ_ÔÌ µ?P±’¾ÿ] ÁgT“+ÁH¨™ÐMZÓ0_cƒÊÇŒ4Ç!;#_†Œ}‹m))®G´@3½`¨õa/žÝ¡GýÁå*åÅ>¨àV¦´ƒê¬&²b ãURÓô›Ú^)}ÙRáó]âiO X÷%S·(f ¸I†²VÑ¡ÏHXëxuȱžhË1ƒâ>HØÚt.k‰³ V‚gŒ¬%¡±r@-ÜV°|832FJÉ­®à,FɃcêáŽ÷ߌã9ϲŕ°Åó–±}}BìÓ8¯@§;‘4„ż¦sV¬LB•žb WØÏžxvrR£ÏªÆ{H0£_&šDr/`VFrÑ&Ëý¤ ƒüfU+1-v–v96­šÃÚ…¬–"…Ð2OË'±×ÀsĬð™Bˆ Yç3{Ë ç]R0aþ¤ž±Äfʈ³44¾tƒ‰È—¼,0jõÌáÅM#öø« ^ÃëDÈdãÛ‚Âé}N„¢¼©à-\‘°*£¥US%ˆ¨‘ZÅÖÛ ÞÁ5ò4µtRi Æb ›}xÊø€ÇöòÍ­à#|L¶ìRñމTØB+¶|,4ƃÚ4 kñœrOæª/¿¤$]OÛ‡¡’T3Ö1cBŸÔµ [è~!ß7 ¾ÄWt·øq£‰‹è[5ðq1SX‘ߋ㑑¾a›G¯}-Ö—^6âëx”Õüs£Š÷2/4ˆâñYËuÞ|®â¬—"Æ^Àêpë]Ôßᬠkù\M ¾‹ñ5ÌXÇYc>~Ž`:«[”ï\sq¶ÑFßc³”ûh ÿ‚ú<ò“ƒï±ßÕÙ¸J>®€[ƒ»qžx‚Ùå°%‡`kÛ=tYn$ˆAk‘I#sדÕZæn°‘[òÙèÄN›ñj첋Ñn2¬â˜G¡£Gžqó}ìmˆ. [ÐÎá@= Q>rè-¯ ©¤‚æB—¾=úmôýµ=áÖ{(Öà³W7³_-%*{•=8ŽD ŠÓvêŸ ºÃ¿â$ÏäúÁ–ß½ƒmí9œÚãšGCk{µß•ÃXaÅïºùðïy(Qw[çî?Ä¿;D“ÑÁßEN¬ØÊÕmüÊvò RÙY†¹dd;¯äª¡~èâLpßÅ*Èq$lîÝî2Õž€FôUìí$¦¨ô:vo:ù{ÅõžïÔÀjdfε·ÙÂÏä¾×Î.F]Õ{Üó8pùÝ9\¾Žúp“=i§+æÑUx±¥Éu>‡W¢žŸñÆšÈ-Ôò£®F=á€ç>¤Q;tïR›÷Î\qK~wÀõàöÃùb_¢ôˆ¨H8¥ŽUúys6aërµ›¿OះÙÙŽÎâ ’Œ¹„˜­ÅÑ|Ž÷æð «•ì‘pa•=Úmï?õúŸQ‹ 8‡Ïç&n_ÐÂg<" í´= xóÖüúÇ2?ö–øÑëøñºãñˆ½_7óo”›¹¿$Ùí$Ç¥r ßÅr 2gh ‹ãG|xÚ)dW¡_¾›×®–—r²„ÏasËŽúá_PKxþ˜Í<w PK³Ub; aQute/lib/osgi/Instruction.classµW wÅþÆ’%YÞÄŽblÇ­SR%Ù‚BŒÓà"âqbc7Ð®å¤ Kbµ q¡…¶´)}ñè Óô•´ mh±J¡íiÏé*ýîH–eIÎÉéiⳫ™{¿{ç»™üû?ï}àüË&…nó±‚cEÓ©ùh6ŸHEc™¼câN*›ñ­Ð~ƹ¨Ž`£ÜÝЩàC˜ÁÚåÇ¢^ nH’¾»ÑCëyÇ´üLÊIŠð{q/ÌæóZNŒ5pÊ‹} {íôC…Ó§-ÛûÐ.pŸ1pôßOšö!¦¤›X#><¨ÐtjPÄø,QÂÌå¬ éˆlÎns„Hƒ!ŽÈïAA|D*ôG6Õß5p £´œ¶2 '©C€q2ÏlIɇÇèù©ÁÁèM8!Ìùè®æÍæ¹zNÖúf¥b8“¤ûœÔÁš]£·)?¯pûfž9Î'&ªóîBPJfÁ@3<~œFÒ‹Dƒä+'”ΰâÙÅ\JŠçæ²{­9ˆ´Ed*Å Ù[1ÂÀNYO¬LܺA®¤™O–šÁž6ÕÜSÓL×i©é"@Á€ J4gm=P/È–·œ‰rW~¾h UZŠ?•Ÿ¨4«NÛʥ͸%1‹U÷¼¾`•ßcfnÃ>dÌz˜J%2¦S°Éáû5âCõ”Þ¤@õÌ0ÿúkõnPáÿ£ ?¾‚¯yñU¦\ ø¤[ù|–ëE|±ÉXÏYa[°–VœÇK^|Saˆß·ue8öÒ”åÔêrŠºßÅË^|oƒ. ¼‚W©›bæ™NÖ–"ªÖ•ç ð}üЋ0êW ü?f±f¬sNm7-g‹Ë<}6ø½ûˆ8ÜŠ×ñ?›ò1kIªîçRuý²ø¦·dÑÇÅiiä>üŠ©‘³­¼¤ÿ¡å7~‹ l& ÙþÒº~ʇV±ô{ç°MP.x J®@”ý Pn W¨ºbà9€¼¬¿qÍŠ'i™ RJmuiîZ”€+&yG#êY…:´¬×Ñʺ¾L¢5RƇøRní üV•;å­/$§ECxùÿíLÌ>ykM°iNe vÜzXíUT Š‚‚Ëd,{$mæór¿jÖðÄôá}Õ͇gä/xú—×;ýÛª Jòä{+G³hÒzm¡«|Â+„v® ãN5¡“4øÞB ­ükÃÎô•Ôp;º4x›6§ô—lâw7zÊfä¸I\ …‹ØYDßåŠV hÐÎ’P´ŸÖ ,eì.CEõ˜» ½‹ŽZ˜N c”Ê0JŽíÊ+5ÊÝ ”[¤û””Õ!Î o»†BP‘e´º‡Bî"î9v÷Í^Åýc®á ˜õ±ÿ’ÞÁ!>BTˆÏŸA>wð9ÈçþH`¨ˆá™ Ø /"W›m“UNú*Nò¾TÖ?Uv²/üOô†?‚ZF§@…?„ÒˆÎ2šÝ—]—k<=ÁøœäVOTyÚWñ´gñŒöŒÇUÙÒ½ºÞèWȽ‚¥õêõkÝYR8Wå«§âë³ Ëj©v£O4¬Œçð%J}YË>¯+d˜î{9Î]à £¡U|CaßQ»€“‘U¼¦ð!^XÅò5pÀÝ徆ŸhæÌ/dæ|à—«øu“^ó.vy4E¾®æ"~îZ[Å%fˆøG…7>¾¾¢«Lüfûæ™’qzºÀQíüÝ‹ixšÉ—àV“8Ì«ù8Î` Oqeï82¼jË>–ö€?áϺ£¦ñ.¿ØŒ™Æ+(ê„>Š«¸F›AD3ƒï&ê>n¶‹£ÃìÆïq΃ë•ò´÷+h© }PAû+ÑdçÂæGø›žâµç<þîiù/PK ~´sUŽPK¯TU;&aQute/lib/osgi/InstructionFilter.class}S[OAþ¦-,m—ûo½(+⽈bQbRëC"oÓeÒ)»¸;KÄÿ„Oü_xÑHM|ðÕÄe<³[)Z!›Îœsæœï;·þüõí;€9<2c˜æ/%¬º¬X®_•ÖÇW^`+é:e] Ï@‚¡o“ïp«Îªõ¬²)le “a ´J×"Oy3¤e a²t<~!é ;ð|¹#Ø:Cç‚t¤Z¤´2'®g×EwC¤G¯‰4úâ™ìZ”– ]Z2‘DŠ¡·$Q¶*Â{Å+u"(¹6¯¯qOj½iL¨šôfN Žª,è2ý—­Ü‰ZgÏm[l+†þLéhk Ùõ$¦0mà Ãè?àK¯ï¾ž‰³˜¡Žl¸eWÝí]†ñ%P²ny¢*ÞZϹ"z§Ây\4pÁ‚ˆæ*®˜ûMÓÅÄ<&i|]Ô 7µÚ»,i9”ëí¦h’·MŒc"…»X0@íŸ8~D&îi„¤ôˢʕØÐQ÷5׆áL{?ô躶¹ª9aÏzþžCjÕ <[/8½Ž´-ìv§áÑЯ1úhÿè?ÓÛG·¶§aÒÙMÚk²ÇéîÍ}EO.€þÜä?…Ãt AgšN½¾Ýè¡o„,ÓQF1„’¦a¡¤‰b$S“š4Ýú­#÷ƒû‡à¡±/4#‡& Ã)L6ƒ?UŒî•Ï8oà\Ù¬=tÄ÷I½¾3×À-ÒûßÿãÐÀ=ñH$´….¾oÑOQÎÀ %0DuŽRMc˜!â,QçéU§5QÖ¹‚%< «)†8Ë¿PKZ/n©ÃPK¯TU;aQute/lib/osgi/Jar.classµZ xTåÕ>çf¶L.…‡5,Âdf’àRÑ¢aÓ &¨t’Âàd&ÎLhÿª•ÖVÛª­ÑjÕZj«,LÀX·¶h]Z—îv·­Ýíj[ýßóÝ;wîL&ŠOÿŸçÉÜ;ßrÎùÎyÏö O½ñàÃDt‚v‚›4¦êðÙC™hs<ÖÛœL÷ÇšW…Snr0Uî_nއýÍk{wDû2nr1U©ÑX²yY<™Ž†{ãQ¦Šë6vom_¿¾½›©fËšâ­Lå©h:9”ꋦ™& †2±xsgxPf7ÄúáÌP ÔÎ.¶QÛIÅý­kŠ$^o’nm©ŠH,–ÉTLXm}{bÿ7áç'bÛ¢é Óq6Z;Â)Ð3f°jBnÕÊXJ–r“#Ày«Ç²dr<˜&®É)|e,ÅŒ{wlP^™¦ØØa°¹Ç˜À=Ng:“‘ضX4f«ÀÅ>´>N'=L¦2ÑÓÌü1û›sÃ8«ñšÕ‘dW2³19Ô·½Ó:±7‘Ìß³¸/KÄ2mLeþ†M8à²d$ZNLótr“G KD»†z£©tª×$ûÂñMáTL¾›ƒ®Å&™ZÿXÝ4lòRtZ@³ÝÊ!Riac*…½¤€ðmÖ©œ¼òv‚NŒ·“tª¡É.³=€L.6/àÓÎ-Á¹Ðr@ïŠ}ÑÁL,™H»é4¦©c b-p¨Öä(t¬µ&¼i‰œÆ/Ò®S-Õy©–¹i),iç©ÓrZ„ÇÒËMŒïRªî)§3©ÃMgE§iO„ã»vGS:­¢Õð3eÄeÉAlôÙà“ŠöGw6¯ g`ëD«—:i­›º˜¦‘)rø×iÍäìŠÅ²6)Mêl\ŽbÔ tŽ›6B‰Ed E;K¨½õX5Œã¢äsušBlj6b©µ)Ù‚oeðŽÄàPƒÑð@ë*‘õ<ºÀMç3Í*’c ‰ˆƒåÞÊÔøÖ‘gÒbpÎÚ’óL Æ•´ØMÚi‰›$PØ5c#æ¥õ ô¶Ã‹üÅð–ý;tòÑ… d«¼4@I7%ì0ÎÓÒif }’à]ƒá ¨ò6wF§!º¡«?šéR1oN1·±;E¸SÀÑTÄyNï¥ÿA¡öÞt2æ«ô7R”å— ßËàãþô=ô~îÁ÷ÐÝô‚Œg,ÒéJúâQô¢¡p<]ÌÔÖÐã¡«@)êžÑé£"∸.œŠ&2"އ®NšÔ1öÐu:}œ>€MDÒ›c¢¨’‘®Gß Ót„ˆGý²¶è‰½: Ó-@qz¨7­v0Õù;:Jœ•)p¬ð»3Ý&Šï‘4d®Ì¥ïö´±ÖLç¬éÉ$ ’nútm6FK%@DSú tà·xé.Z"÷èô9ú<Ø„¡ å(cÕ0fÈ$Ø*$îÓéN±qŽó:¦¦RÇ/‹ž™èôz9ãlíièQY4Ç×7îÊ ÊÒ7Œ ѹ%"ĤQdý¡ÁH8ͧð:ÿªR>î¡/Þ+6¶7vt­lîlïêX¹bÃÆ¦Î•çÑiUVÐcôe7=L”::}E²‰;–^10˜Ù%ŽêTEÕ"È“:}žBþŒmÉfþ1Ù§UX>£Ó³ôuÀŠ6æÀ4ÝkÁtìJDíÓà; zoá¿Ç$÷ê| ì‹L´ |]öã_©žÇÍû â…Ýí½|¿hü~þ¢Îù4Çð„hf{2b(ir„¸ùpa·¿+‰èü ÜuTõ ¥¤o߈vÆâñXZ>¤ó—øa£ë•!·J"–Õù1iA¥[±3“ N¾¬óWø«ÆàÒ] ìÖ¥Bë Ÿä¯a.mn2ý[–ÔÜü Óœ¼pñx´?oOõ @,+ûzÝÕ”eáD"™©Wñ­>׈¶Ô{ø9@ 2¿€&›_,ê@JôM…½µ‡¿…h[Íqk©÷òÓ´¤02D\ðƒV6ÿä„Ò·Y{ø%À?„ .–2WZ¹·k+­»¤»øÇ¢†Ÿˆƒ•ô/ãÔæPÞ-‘H{<δð-nðJÝgöxù—ü+7¿’»»Hç_óop˜p¦o»\ÁŸd?Ì2DŠ Ñ‹†¢‰¾ÂËLƒF§± áwü7ÿ¾s‰Î¯ªFÀ`“–›ª¡^U,ÄÕÅ¿Cz/ÿUŠÇ¿¡Ð+ym*5Ößå.pª¼ýS§iƺrDYãç)‹×[¿(Ìö¿õO ›„Ö›:M'Tâ:[CX¡®Ïú. ÷‹ÈÕ¹kMLý¤2Ì`I¬¹5gAgÕžJ…wÉj¤*Í­k¹\s¤c»£^Í¡y¥,=°iº®MÐ&Bq<–ìQç_V:­Z%¯vkUèÖ ÅÙ¸zTŽ~r©&R]›ö!Í;–ƒ1ùKgi9ô¹Á,…§”IJºÓ¦éü2ÿ\ÙÔøuêo›ÕæYºVO/«ÍÉ‹åBK›#·j÷C‹Éxdºv'¢—È›¨¾l@s ¨{–Zàgy‰_™&ÈM£­Švø{¤³bÀØkʸöàª-œ:‰hjY<œN«׬RÐl‚àÏIi7yHþ•“\|UàM#Ÿlß'âsUªuUT­ž54Y=k©N=§Ðqê 'QÏiæ<à­ž3Í}³Ô3®õJ’9ê«9OÙ—ˆ¿Hs(®ÇãÓ‹'‘ü~VAóÕ¨Ü - ¿¹3‚“ÈX}`„£ì¡ÆCÔ”]¢óëpn‚ŒœpN6’΂”óÕœ¢E'Ó»”<õꔬ8ž‚¹Esáy*µ(î;Á½ Ïùà-„Q[(Kg쥉дò0­ÙGz :LëÑæ¼ SAE4á/´PjÓiææ+9ê ª–óM9ä­[I)õ˜9ðÍç<¼ËétSžÙ‡iKžëDE5€Ah3¤8°Cô›ã¤[œtz7…Mí‹MËÏÞ1Y|ØNpì²AÍcÖC·›JöЧ˜î°Ü­ ße¿«È© ªgƒëz›´.‹ªË’öNºÌ¢U¦øL¥»º«ï¡}ƒtb–>›¥{óºq©5ç(ªº±Þ¤ÊZMZ+qöÜy²ý÷íïç¬Ygý"Tgý=`ÐD)íP¡ñé@è¡–†é«R¦õø= y›ŽÐ£L{ÁØqˆ¾*.ðúGèi¥ÇZœ>çtžZœÆ¬Ïy„¾QF›}ŽÊæ,½xŠkìs”Õº€·Zã>BßÑ@S36÷¸Í=µ®O¾ù¬ÏT åë^rÏé X0d.væÞj]¢–2¥– ¯‰ÎGØ ¼Æx/âAЊŒÛ Ô~Z _:Ÿbø¶ŸRšât9 ÐJÐu”¤aŒßPÞƒ™(CÃGž¤K”ºÏƒGA}–ºŸ¶Ôý´©nyû>òAxÓK˜u€óUôÊ ž§ÑéG0a ÿ1fÝà3‡~‚.ú© c½Žõ,¦& –š@¨Taš"[ «÷ØÀ:Ñ’s¢)§&¿™ô¶š‘¾6¨T¿dú­äªþùþ`ÙtØ+O¶Z…ÓK!èePíå u… yµ‹Z“…+䈂¼_Ò+x ÷WŠi³ò"™bÙ¯´¹„Ór‰_Ûˆüf ‘¦b"W—$ò[úEä÷ŠÈ똕µ¥¬-ø9Ëî…JÿÀt„þŒˆãÜG-ç0tüF‹Ð–Òž—ÏUÃe~Ã4eFÀç’)§Le¡·ý—µa{˜†ß||F›MŠõµ`~Äü8œðz„Ã%nD¼‰㯃n6¯‡cߢŽÐ¦rÉKÁ[¸BÕ/2&4t³®°6‚<'ÂT iO‚! 48¢cU¥U¹îb÷˜!§ z}ø :>€ÐÀ5k‚Gijð×2uFÙ‡dÈÓ*PÄeaqпŸŸî€dw ïÂܧ©öÙ`Ódžj"Mã™ðƺJ3;3Ï¢O˜=ÝÄ|…‰yÄ„â8øyà+,eU˜hd®ç\Iv¦EÌl8Cq%q?@±Z>0Q©…è{>湊ü¦?Må㻃#¼ 3ʲÁÁ,7m=¢$®¦l±«ìÂJ"Œ`î0òʃ}*yÈVÐL³Ä˜Æ'¨äò–Oä“@ a„Oæw)åÍAf+m…™Ú'¤˜ADïËò)Å©î1`äqÛ¹'X '€¡¡Ì9(F ï†!äùTÔ‰£Ü"Ç_¼*F¹M^Ïèåöî^Öe>%Ÿðò½È!Ÿ£ú!g#¼²±ú¡#¼J£Íû¨R¨ Sy pë dùl›{ºÄ=]–{:ÅéäÇvÞ !ê*²æ\VÞ  l3݆ÙtÀòÐUª†ÿ*Ô|”æ"Þ‡)OB¬< ñüt<—Ò3(/žEÚþ:üï9ÚM/ J¿Ÿý&Pþ"ݱûéÛÈß±yïAK‡•©ô÷r7K;—®ã-|ø‡èCбTº»M?v*ï_1Vo­:ßZU‰Ušü"¹¼ETˆã ”ÙïÄŒ@'dXÆq`”·vW?4Âá®Pc–{ŸÛð â[ÜÐ|^#sT©ðlû¼ýúù12ìOPÊý’ý ÷Ë6x†¬“†Ô©X½'­¦©<À ÐÍe8cÕù SÛÇb ÐpÕr><̃õUˆôGXË-ö妢Ëå á| 8̙ոåÎâð7èõ5°ù{A ÈõŠ&y¯\ô›eÕ]اt%Ñq„w­Ô»³ü>Ö®}lÌAµ3dBqÏa¾¼Åö»C ¦è#øŠÍ&6_=GøJï ±3GbOg»JRÒäåKÁðcŠÒžhR‰]¯ÊñgYhwË” î¼§ð5>·Ha¹È39y> *{K•"^ÇÿÃÿ ç :ï°j”™â¬ÑE\F»ÙAW²›îfÀ_NGñþÖ|)K»ÞP_§èyèEþ¸ ®sh¦r ”+ùª€Š¢L«QíQœ"|=߀±»i¶é*©Z­s[)Ï q#ÞŒU7b•W~è03ÁÍf¨n Tz³|Ó­¨$öòpw`„o]S¶dM NÏò'+½ÈcÁ=O¯¬Ïò›å оûŽ7_Æã3ùħ\YÎUˆügÔÉäãZšËuÔ„÷Óø8[òkƒCÉEÂd ð>þ,dªÃÊ{TͤÉo%ús hqœC Ða1¾ã@ $ŽûùQ¾})ÓVz²ü€àÕý"W«üúaòæì"—ÏYçÊò¨”+0‚\µÏi¾gùñ, úœ >2ýS’õÉ-žQ~º[:™~­ :ÞÏÖð7ð)`}¾†¿)¯à÷<º›þö#ÐIìdîF óxé‚åˆg‰ÞÅõa³i ‹…æÒžýO'ñja?-çÚ€pÐÍ!Ph¤mÜD;¹!°‰n@ÚË'Ú°3lùü° 4¬Æ$jêM*€2õ&¥¹Áë „¡ï@‡ P~ûT³¾šù»Èœ[hVa4äW¶ø^aýØht.ŽZÇm´®±¬Ö!íŽ3(^µAzØ)å*C‰>}ÎÃü}hùGJyZ\!ÌÓ«¢±l-ŒÅª~äSÈË Ü©TǧØiÜ -¦3y urͧS·+%eˆ—¯•jTýÈ?UqYÆj”’šÎˆ¥ù¼Í¦ØV›ãC ÌYEËY…_»¯È*±’=Òƒ¨9Íà<’Ô'Ï’Ý×߆ÂqÖ!~-Ðxˆÿ‘O—ª3äD½Mä$àr‘-ÊM¶ô7™ÿ_S÷üº‚ó¿ù?%î_ø¢<ÏÄ¡qî_äÐÃp®]XaÒª’îÒh‘’ÓqoYQÓÀ;m$«,’U¹¦AcM˵‹Z™"ý<ÄX¬ÕÝBþˆæbÑÊר/n;÷Q}(‡Ú.Ćʦ¬VÑ"è<¢M‚S‡LdþЖSUÀ߇Lp)5òe´ˆ/§3𽃯°¡rµ), ¢Uk5¶žøMr£ шy‹¨\«U¨ÌeDc}µ~ŠÀC;Žþ§„·;qɾœ_Ö|ææVó&ÒrV›Z¬ì«mÊv[Êv£|~—Rötm†I¨ß,XkP˜i3»U_@­ªÍÎ5`w ’ɵHêבŽäŸ¯Ck,5Ú\ón¦F›§ŠzI ü¬a2½3¢Ú&£ÇÔŽW÷*êâ«KŒÛh]{9$=ʂ͡¼ñÔí;ß¸ß Þ‚êöV›Ñš,™šL„M„Œû¢Ép—”ÑæR…¶°wXñÖÑ%¸h~+¸œlz¶ m,//v˜»á0Ÿ±Ù+ç0¬5h1.7íŸZLáPø\i—Ó‚Ð>Ã'BÊ3µ&e %àcZ³«œ¯áKµ…Tþ¿PK²1‡µÇ6PK¯TU; aQute/lib/osgi/JarResource.class}TûOÚ`="-µ>À·qÓÍ*S÷Tç•M†231þTñ›«AjJÙôZ²%›&3Ù°?jÙýJ­ ‘P¾Ç½çÜsÏ-þþú `$†ôíªÍÓ%ã(mVNŒtN·vxŬZE.!ÈÐuªÖÓ%½|’.ò¢-!ÄÐ_—u›ÂÐrª[ =ùF؆V~a[:C4‡ºk[Fù„.C‹FÙ°—\k–Øg®šÇ\A :U´¡‹Ø´Ä~¨B‚ÌЙ7Ê|«zvÄ­=ý¨Ä•YÔKûºeˆ½{´?†á&<·J¨ ù„Û뵂{´DcÉ‚xHE ƒZÒ+ö¦yl|4ø±SWNÁF%Ä©†F÷0L ùb64¨Õà 3]¨ÚçU›(¸~æˆVÖ/ŠüÜ6ÌrEÂC†îÛÈ‚w#¸&TÜÇâ6«6C_s@j‘yÎËeïHô;áû.$L1Äno2—6_±,ýÒ§` õaB¬fTÌ WZ‹%³Bãó„ZÜîc9ÏT<Ç †6ÛôBÈ -q˜Q0‡ya´˜í0#šÏÿ·Š e†‘Æ0¿2ò¶âyÛ«5Z+¨BdN sõ§é8˶Y‹—°Nm¬GÉTÒ1·d¼a`ó Ö°!Ô, ³Þ©Èc€A"’-ýŒ‹Û-¼'býœ,¢)šjVYÑK³ vT¬ Xe×â¬!¦½Ë7ÖÓ"›æ„Æ„¾­Ð_½9dzÊtÞ•ží´ËR„ˆQ’×èH¦~"òvtÓ³ƒ0DVò”ÓC»¾Z4zig%9ˆÔ ¸˜ig´&`ð›r;µàÂ0ñ²¸É³-îdJŽ\!öµ.?êË—½|z1(jŒÖAÚ;H+®´°@J]áÑ2Źè'€Ÿª°§* GE©à3ê‹èLü“טÎ' =MßÇ7˜; ß§×x¹9y§¼”‚4ʤ²1Dh@bˆ;Ô£5(—Z¦¢4,UŒr_aÉéÆk,»ÝYr5…„Uƒõ‚ƈgÜ'(ä 9æ A+È4±)RoÓDS›V=³Î|Ã7X;ˆf¯ñ¶æWî ›Ñ,=®°]™òa{˜»NÔÞ?PK6'mB·PK¯TU;aQute/lib/osgi/Macro$Link.class}T]OA=Ó)t[¶*T¾¤X>lw·,à·$11)ƒ©Aãö ¸°îâvKâOñÉG_xÐD ÑÄW‰¿B½3Û`„b“nϽwî9gîÝôǯ¯ß,b9…èó´ ÛsvÐÚvíU§35×ßM!É0°ãì;¶çøÛö“ÆŽhF Ú^(öÝ Ýb¯]ؽÌÀwÅ;†|í/Åzºþ6•z﻾=`X(ÿ‡â|g¥Î\ 6EYiô“N¹ROƒ¼êèA¯Dy)h 9¢kí7 >sžn‚¦ãÕЕq'™Œ^»t­ø‘ãú‡Ë]´_d0ŠñÆþK\Õ1+t/ñ¶íxg âÉ)†¢Ž.“ZÄ­ CåÊy¹¦ gÓÛ[["Ì „¬†9öRⲎ ’wöö„¿É`uó.“-k°ˆÈÒ0O?¯$ß‚Ž)\eH´ #õÑä7…G=!Cf=h‡MñÈ•ǫ́ÎË6ý±ï‹pÅsZ-ÑJá.]·ÛÆi rç¤K´ô~&èKÛ„üÐ.éÉ©’†aEtBžËÇÐ ó€uˆÁϪõ=óHRÏ(’| i>Ž~>!ÊOÅmîç” SH %Ó‚:2MŠ¥•¢ñƒæFÞ£'y@Aî=\ÊNœÊˆ¼ˆ>>…,/aˆO£Àg•t!¦:•.*A œvGð!ã¸ý ¥cÌÔò³«ÆÚGŒ™Ö®=7«äC‚¼¹J0·V=ùýÓÌWUíö§S#s4,ð 4nÜ"#UùÙyóæ½ßûÝ× ÏÿïGˆh¬6ÅIRP_ÿ¢Öx 4\]‰5K«üõш“l‚²×ø7øKCþpSé‚Õkõq'9a­o*JÖ…üõ¨ ÷ºhd] b‚úÍW»[ãÁPéBk¾B£!Ò↠˜ßíd,«Äb‘(V9ãþhS @¹+æwÇÏÝ!<ÃM‚ÄrA®úHK‹?Ü€Þ”££¦À¦Ò…¼6ƾŒºÖppýì@h œÀ5ñ(@aAf]c0„ÅÆ’Œ: OŽ×D‚acì¬ 6£^u-‘†`c0Ð`Ld×Å#õ!,ö·ºM­óÇ›)½nC  FLx½“·&¦àΊSP‘›`ÌÑH86#ó¯À‚Iõ¡`8¯¤å,d›i¸iå9i8é$w:c£Ó I5bÁh ajdMÜo) Ë3HP¾Nƒ¨—‹ qDþ”ICW®,¨pS1vR ô¡4u*¥1àä². *É?™ß=ÉÓ©7e»èlÈ*o ®bR(‹WúF½•W”éÔ‡r\4zœ·eDÌ|^1I«TkÊuÊå5“õÉÛÂò4W%TêÔ—œ«°»-˜¦“‡Ì/ò¶+&ÕG AæŽ 6Æ£­Jß 6úC±@å*ŸÚ7K§~¼o¶ y[,=1 û">¨Z€Õ$¦Ž*öEñÖhØÕ`±¾ÞÏçø0Ç0çêtÜ/h^ÞKÑ:aª)Ÿ )T+nN³Æ|ñˆoÖ¢êÔ•>]­S½PÐyy[RTÖdÇŠŠÕ‘H(à¯Jë÷¥9˜OPG1ØÅ:yìA±¼-¦žWLjñÇÖ‚{æ=£ªèÝ ˆæœÛXã+/Ÿì[á«Jý[ä[µj•»J=U4Êw‰oT ÿV-r㙚ݦf'b–ê4€Q¸¶¸¢¤hò¶U[ÆŸµuS2h9­tÒŠTÏfø£¥(Ë+ªÓ*ʆ&/¹¸f΂jX§Ó™4&5?T·¶¬D—°²S‰ÔûCKýÑ ß›“ŽI¦]ÎÊOï{v…i¼_ÁR7iÐi5 adštr’‹GA2ÈÍ£µ:e’î¤Aý;X&>3DÝ" g‹7•ÃNàlD¤««´|ð üžÑ.Xê¤Ve:jÝ'¸%A›˜„zxÖuÉ}à²94²g‘:Å€¶êt1m45Í–´dåAnkÓA;àCNºéþtZkccl»Ì@Ÿz¥ E©§NoöGkë[áú@ÅœéÓO:ÂrJ´æðWët }.716‚›ù=b¼VЙ§)HÆVCzÂÆI×'=y—‡ÁP|ÝÈ¢º ‡ôH+kåut³N·Ð­Ðøz<›rùs ¦3·nÓi'ËÈ5¦ñv~B?Åjÿºu0BXñiÉÜDšÏÛ­Ó´àH›âÍ*h)öÝÍ ïa„§Ÿ€ ûtj£ûe!ÛXˆ¶Ãþ8ë¡ û¦3 Ÿ1 ŒNFÍÓ#|`‰6ue{ž ²à M0²9¯4qb$¦c£b‡#ˆµ†âVJs²l8U #X(ýpm0ÝÄ]?–Æ!SЧP%êÝô8qÒaÀìQ]tz‚žT)U8ŽT ¶èI'—å.z "b¸‘ý[ œ%ò,kÊ/{ز”¿š—ýŠÙúÜ)³‚4Ôºè× b+”ée'½Ô%Q5–ëô ›Ž 7-¼l7»œ×uú-m´éŒ63:o0¿4æ$w–b@éiôGÞd î†Èt3uÓŸèu'ý¹+^›cñ@ {æ·uÊâlêo‚|Õ_<êÇBFŒoŒ´†ðõµðÉå>7½Kï;é=¨POžV§èC(ÁFÔH†óÓ04mqÑÇÒ,uf e]|³qªom`³‹þoc< ·†B©Oþ½ÊÅî ³ü¡Ögƒÿ§ÓçôoÌÄÖ…‚ñn‚íê)V¤óâ/Òq¾¤ÿ€e  ç1ÇE_ã´•+!üÿBøjéÿt:1¹Mg254!÷?Í"¤.4¢'Ã$¬ü“ùvjæžêŒw…CNá¬þh 6 „O?EdCÔ½²¿‚ÝÑÒ%—è…Û:—@ž"Jˆ]䊾0bœ¥²}é>Ôd…S¸Q ˆ3tÑ_x ̪ñæ¨?÷;É 2h G¥„ ·8S rŠ]R®kt1X Ÿ †7DÖÂmMLÃñtÊ{ò”K EÄž¹©>°NÙR0ì3uf$†‹N‘'¨èdDæàh#Ç^¢JN „.FŠQ&ý­1`wF.iŽF6²·å@$ àÏDa7µOƒnWƘ뢄À„Þëð$Žâ«~í’(ðv‰RœîkQŒšìcE±SÀ¡çv³pu ÔHC:TGjZë› [‹Àg£ªÆ Å²½žv(M ä=Š ¸‚K³ Göag~T9è©"\ШüÓ³íÒ'N°‘NÕÅ4ŽŽY85ßlêŒt€zÔÞ4Õæœ9HXÅÌ.Õ,û}õþXsM î38é{W̆›ã`]Ô£³Q›§GB̦žVÌ‹y{•.ªÅØ5—™‚&å§ßsZlWŒ±0{§ÀªœËw)B6¯K"û.t2ÐJÎ(̳|©.– ÔMcŠãK^/O‹žÛ„iÃi‹ºX)V1¨H´Åïfí§U'¯rŠº¤!(Z¦F£þÍóQˆ2ý,"d»…ßÑpHá·[\(°–{{IÁÒLÑ$‚NÑÜ¥®é\¡‹5y¸ ™PÔH·úå§ž7Çœ¯È„µEœòÏ9ù©.Ö Ø†-Øïžò› qŠX—ê$5º"‹V]l!Gp¹¾™…vVÏÁø$›¨26'›Å§¸8M‹Ç\¢‹K¸dc²¶éâRvfÈ\[˜xêr]\¡–5ûcÕ ŠE´ƒÍàJ¶¢=0;>!1¨µ6TÉ‹wm2¦læ*2ÙGë›Nд;{°‡ü40zXjW C¨¼…¸AÜä7¦;+¦‹‰›A oààœrkrwð²»O Êë6Õ#"†‡Ñê‚.±K²¥ «m…cë‘Nq‡ ^ðføã@û§¤~®VœlZáÆrá1§@e¥«}ÁHé¬`î¦gñ#Útq?KÛØäb<õ3]<(öb†x••Ú\Nä>æð¹Ó¡¹=GKÎèƒ*ZͪÓĆb0¤‹½æ§¢¤P(n× È:(9Å/’ô*ðóñT‹Ã܃ðGcžè¡t™ žˆ'ØG<ɉé\vë(²Ãn‚! 6øBj»«.¤\@È)P 赸5Ìø[|t‰cªÕ@ƒ¡5 ’ÿxsÀ—·Å„Q1I=¨Üjäànñ,=ËÒk@¬(† zØŽçݶ2bfJä/" t+¬ÃQnß!z·¶ %UÍ;s2§—Å«NñJ²–ét¶Pß×Äë\ºÇæ+[‘ß³ëîÔ_—ø¬se¬°~ÏÎúœ ¤áyúBA¼©‹·ÄŸXÇÖ·úCÝËÓäÑË]â/¨UŠ}Pµ†êg hQI·«Î,—8½Ëm4Žº€Ñ{W| ‹¹ª²«îÖ§ôô9 |¢‹¿sÛÁ ^ààñVŒ ã_7Zí`|?×Å¿UA¢>¶,oæÉãºøR ÚɈµ®Ž™ ž~ùHDÒÓüµN;Å7¼dzš†BÊ·â„Sü¯‹93ÇuIÌ*ÍßÐà’$æç.Éïw#§ÐUìsI‡ 2_0æ3”º³gì[¨çØŒû"c¨á4Û UÇ,àk ÏøÖ)3õéÄzšÑHvK7¼†tË^ºìÍ^C7;ÌKªòEÙG—92²SªÌ5áÈÓJ°+XJ'¸RÖŒºd¸}ÃZâ>Â]ëp@õàU×Z '­àn<<— Ë3%·y‘ØN]‹„P§ÍR/3²“q9élxù`]áåYV}gºF9T—ø#‘ h¡bSFÝjL½pÉ‚J¿Áäz ËQºÌgàN¯VÎÐYŒñ6—,²Ì©@«-€%º­|x06KA£z)­¡þ°«wêi£â…§)— *>ÃRY !)ŸŸ]AräÊ@.Qá^.×å Ÿ;KêµK"Çßx' ˆåhÌåp@HëÏ>­NˆÓ ÞéTu:;×!-2‚œßPÍ`8øT ìÜÁêq·¬×ÅÕ²LÚX$%\÷€n-œ9€m5ª”kÀ å̤tLÚʤgꤧÛOò0#ÌôŒ ê&èFãº!HÂf†çwõLéZ—ˆEÑw78:²©Ù™†ò{w;ó%ÊÚx ¼ØÍ›ÆÇ™ ’,¹…-êfYšL®‚c¯ùzÏ)/Me\S©9ÏïÝÔë?¹ :F/ÒÍÉíºÜÁNN!ê«7sny•¼Æ)¯îÒáòÆ_Fëò{òû\5À³4ãFO9G•pTù!ã˜.–òq×ëòîEj8Î-o’7;åºD°9á8J¡({ J·]òÇHLGã`~‘ÉAÌ ¬ SO¢››-›ØõÅTÏØ%‘£Ÿ·Å¸ãWϪéQɯ›Ã•ü*6°)P`Ð^cÏ\â–wÊ»œrO¼ÍT—wË{ ­4g”’Ï?i!7.å}ºlãÀÆfÂC~@—?“‚6>^Ðìï¨å»´H’ª™zžÙõ÷’;åÏ»`m>Ôå>ùˆE´Æ×µÆ5àçwœ)á8õ D°ª|þ’Y%Xðt™íFSoÚæ¸úP%mâ9Í-ÊCNù‹d­ß °.—¨ì£HÓqÍ_1­`)ïyB—Orl¯E˜QɧuùŒDÎÞ gÎ § }F Ò)¸-êò˜ü•ÑM¾þ+ÈO»<­?/ŸpÊ_'í¢ëFê7º|‘XçF0ŽÐâ’/ƒ¯5]ôNõU$3¾F?dÕàÛˆÄÕ‡ZM¾ŽZMþ–kµ4JŸò^ª>Ùžƒ+Áá@&¸¡ìBÜx\%}Éá .‰¤µ0o †“8yàÀ UÝ`2„áÏ}É7^œüE—o«Dë°Ä)ÿÖÅ/XýZïÚœìlåòñõþ¸S~Ê»)‘ó#¤ y[°FÙ_ Vü¶ ~Ј#ìLÙr>Ñåß姆å™ã°ž»RI³pÊ&›.æTéýCþ‹]ýÿÁBº¹ú‚¥NùïdeÄKÏ_<ß-?çŒäsù¥.ÿÃz莬 „ XNùµ ÁÖê*ˆ[slKéKî#xÒêdk4dUÞæ‘N’ *l0Þ†#Ê¢N Uˆ7 0ã±[š äiv¶êô C;¡9y‘«³q‚En¸jnÙÍËt]ËR¯Ñ±µ¿ÖÊц¨õRö$ü*\ZA9ñ“rG—†:¤Ï76¦N{s“)–oDÌ—?"VЙ ¨æ¦ÍMÚÒëߥ?™ò=Š›âÚH]¥åØŸõm®6.Þ.›f†AwT½¨ÈÔ µb§Vԥ㕲@×J¸µ™É­Í™F-§¬•êÚ.ÝÈË‘zr\§kgigƒå;&œú]\Ï/†©2];‡¦ÞÍþXU$0gÇÓ˜ä ,®²¬7#ÝŸL*äN›»&Ò­7ëB·zg¬jlØáœp8UïÉT§Šß(ÐP˜›‡²‰øÃâäV×LÒÕ5‹zá×Åß¿©kÊQ×\óÚ×¼zÌk?uÍàoÃÔ}óê5¯Ìë™4(»?Їû"Ì ¦!ÀƇ»‡É¦Î^‘#4t9mmdÓöÓ¨œ‚*ÚOcsÎÚOãsÎÙOs*öÓäœ)ûijÎôý43ç¼ý4'gÞ~ªÊY°ŸåÔì§ó‡©¸Öž³ [kjR-&/|à%]„ßr…€äÝd_BoÓ0úŒFÑ·T,Ü4VœIeâbª·Ó¹²‘fÊ54O®¥e¸ú¢Ëùó!ùC˜aVÎ)l§†Â¢ÔXX|€š KК’£tvIm¹óH™C+³·‘ÏëôØÇ•Û¥Q»(Ûk;F™‡(TÛNá'vØ…Çîqì9ñ—NTG‚¯ÎÙÀ» ŹÁÃðÚ¥J\gSžBëlÈHP„Ö)^ÎQjÄ2–jÄRÖ°7—ÖSp‰™„ÌÁ=¯êSxˆâÀiC‘v˜´vÚØ‰fx—¯ígl°íC›‰?NÜØ2ÁVà@^å,,‚t/Ùgs(ìŠR9-@NºzÃÏ/¦m& f̲žô?D—½+ª ‹4M+)NÐöe% ºªr/IT úÇ€Ò±ê„Bc¯uBë„þô}ºV 1›~@?T{/¦+SÅ_qjf^;D×ÕµÓ åN[™ËD¡<£~æuÜ!AÚÊÜ·Çv' Þá:áqí¢k¼öBo0ó:ôãíZ6p¯Ç=èNÊØámô¸³WÞI£z ºÃÖpa4p²óî¤>éÍÈÎKÐ]ËÚh–bòc©K‹¥e™žÌº·L÷è;©!&my2=º7ƒÏÜ>¹2½7C1öî9Qãµ3R‹aQ6N*ƒìα!ŽrpTk4™Î‚ªÍ )4‹¦Ò|šF‹i:5`&Bçaïl°km¥¹t=Í£cÅTEwS5 {=‚ëZHTCOîst>½BK•Pv¬µ„òí¥‡”P^£Ÿc·T£}€¡©Ñ£ÙÔh?eW#ž˜?>¦„uç=¬\ÓaJ`]èø µc¯Ø &Àî€k:ˆ¹ØF÷›Jv›Ò^¢ÅT-PŠJÐwÖd?tÃUá¯[ð7¼ú<"ßD\çeìÍ^µ7{ëÞìʽ}èÐÞ>¾ò½Z'·‡)±°V‚§‚ŸÑLâlðt>5‚WÍŠ;º ý‚Ømü›©”àÄ|x³ø(å%èÐNÈ šóT;=‹8š c9Ïã'A/ì+:J7aÍoæãçÕ;hCácÔˆákÕpO9…%‡èñÚbhöïØ: 1øCºÒŸ(½Š:è-^e/ÙhÙE•¸4+ þ ŠŒ“Ù$èø=~šó‘uŸ­î?1ïÕ¶OÍmÖ»#æ…ÀŽU)€²Œ†ÿÕ«„÷šFqZDhm„X6Ѩã&f+]G½•¶C1¾O—AÄW@ôWÒ/éêð¦¥|oÒ?Mð¦é*ë3̱{3éÐÄR(«Ä®Gi,0þW„à*>²‹ìbŸVÙFƒ‹Ë^™ /n§ìâA¸Éù*ç›}[³CƒŠì9ñ7¦¾ºÎ,,)ÖÆ· QnóÚŽ’ÃkÛW’öê’c'>Ðʇbém\rÝkçuö};l‚¥,û»ÂBsYwÞÝ …»ÎùVxÃÛàïvÒpÚßxLý' ò§Pá; z»ÁÇ;i ÝEµ˜[E÷"ÈÝî¶Á­ßnÞK7@Ñý .«ð.‹w»LÞ¹è&‘!8Lx(Od 5À_)tâ/‡çÃ8÷c ¸QOm€îRsv’ü”Éãp˜yü@Ñ1r´Ñݬ"¹"‹•;WôÆü4ô¤ÜV”}¼6ÛaV‹DÙS“ý˜OE˜ÑjµÜx’^ÜWŽø»¢ÜžÔÓ\á4¯=!†%D~§²òLQM·2?WŒÆ©Å]´›ŒË50uÍg©ë1\]7‹±¦(¦©„êax¨ýxrjœ€_=@à™æB1ÀÎ!›XOƒÝ‡¡nG ¸'èv\ï‚çl£gRXÿ€Åú‚P£20Rª 1Ú!ÎQ Ÿ@9b‚˜6/¢¢\T`´ùN¹˜„‘“E¥éwãž clÑ£4^ØrÅ”qî!1£¶]̪²A¿³Š+îç±:Aï>‡Hævˆù¬uš"u€’ÝK°Ø—¡¯ ”¼ Я€ä×S,o¬EÂX…®ÀÚAb¡XúQ®¡=b±ég5x&Ä Ù”äBKˆó»'¿OŸ\˜Ç Q›-  ·N ˆøKSsxÎÔ¯û&*X¤«é˅á8yam‘m\‡¸¨]ÔWÙÇ!M-·•ä×Èå*E´yíJÛ'E4!â ±iàäæ¹­(p¹LЮoÙ‹&Öî±½“ñ…*™ â{HßG¬{.ó*¡ #‚èûÕÑ§Š JU‹ µI‚0º i”ÄîYâjq à—P%êÃlˆn<ŠLñ}ø»Å&SŒU×b•ñìJ§~hq÷AS§&‚)“…=©SB§®ëA§:Äõ‰Å]I þ}ø:qºõ%Ž8Ýú (~¢_-²&Zú5‚ö‹[zÐ/~v«Ò¯[ˆßm">ˆOí4†S žieu™Ð¨/œœWØÉ‡kÔ¥áñÂã-„‡žá¡·Y_„9W*Â3…à t¡mˆÛUðZ¯î$'4n_ÑÇ=9ÆíË;;U]±Vd‘[ô¢>¢7õÙ4Pô¡a"5l_…©Ï€naZhbÚ4Ý®¼?±°™‚{6™ÌCâ§`Ù³›e‰þ)–•iÍ´Lt€Iqq$àLÙÆòA$;Á rNR2¦šr)·Ù¸Öê]„RËkcÙpiÅÂùÌk3ì !eœ×aX½Xn?$î®õÚÛŽåNdÉâ¾”Ë×|7ßAj4•—+Ë{žcB»xÈ—?7óCÈ㸂ƒ!dõCé 1 >k8X7 ÑnÍ#©FŒ¢ð_‹ûVQ¨hŸ­4z‡Eû“ö^´A<"gΠ±Fhƒ"õSj`Ç®áâ17k ¨¨?œ–jë¯Uk·„Â= o C¹ Žvq„EÝcrÅSû”égCøÉ Å¡ƒD)fÆ €ŒÅég¥¨Á ç&ÎX¯B «Á3ÖÉ-¦s-(:bßM½‰gT¶‹_=Ñ™ú±’¦Iþúq–æ —) ×>¢à—+~›oT%k^ YnS½„²bè7 »Üáu`6!þ¸‹†”xm\g–x°s¸J“v-Ë.·)3àüó¹®Õ²JLuП¾ˆ°ƒq!–Ð(± ‘ùxÏZ¸þå4C¬ *±’.«¨N\HQGqÌoõ)z¼ÝbÅv“ci1‚ç„‘èv%œÓÛJ»¦" ]…ÿŠ9øñ7K€aSkól(fû3Ç ‹ŽKˆwL&¡NȶýaWfèmBT3ì° "[“"®< Ç<G ª3UÁ)Ä{§y¶xÿTg‡qvg‡qöúÓ>û#KUvšªr >®JØí†#GÚPÅn®ø øXP»ø´ºØÊ®Kæ ðh¨'rÅg ñ;i¤×¦±V¼šíhHˆ/²K³G'ÄWåŽöhÿ•´¬–`µjõˆäjWO‹GYZ+5Ëps¥½[RlzËpI÷äp)J[aUÛ`Q—Ñq9•‰+^·Ó"±.r;TìJj@WC½®¡Ëp½ÙÇpj· »Ø-~H÷ŠëèAŒ`ÿâÆ‡¤»VØ.õ„Ìšl¯š…W’ž•÷!MíÀ^¯={tv)¸ß!³Áç;)"m#eìFéãD®è<(ûB.Vx:Ä’ïÊñѬ$îÇwƒ¾;áÈ÷@)ÝÎß õºÁ¨.Åø{âNÞdqò&““:]%=*3… ¶_e†e´Rq×g¥Vr+î:-N믵֫ð$ûYÆö-î9]îÝE¹¬e¹ò Ë‚jË Ú¸6>—ƒvjc„í„ôrɧ"÷\å 5ÀÍAö†jFú W8· Å³ÇÆ†ûDWOXÆí(ñÄÿsx‡íAd{ Ð~ÊaÄš‡H»H´Ó…¢ƒVc>$¥¤Òë-†­76€–)O'R˜ÞogV¿@qìFº,‡[¬øÚdE8•y=³br¬ÖÉŠ3RX1ò$><ŽOOƒÏ€¿Ž‚ÇÀ‡_Ïσ¿¦âDƒc/¥ð!lñ!lña‰Å‡ùfX|eñ¡ÀâÃa<á&ß¼T>Z|°Mæ |"~P’vÛ@¸/Y¼mr2#GYŽ,eË‘c;‰TÍuñ[ù;ùˆü©?"e{uñ[t6ƓşSšëó,¢æ™Dõ§³äYÊ 3ÚÅäR¤°vŸ}jRÆŸ)çœ.)ï‚”÷@Êû åCòHù¤|R>)Ÿ~')å§ ¥Â"åfÿke®œTÕ!+§±ÝƒÒÎ6®J9¾R.jEÇ4Ue ëŒSUŽ#§w ‡ä¬Úâv9›u–óÒ¡œ’Ê9´YõçÈ+ÿ lŽ#³þì? ï+„ޝ‘©|Cg‰ÿ‚¾ohòÁj)Rè\iѹҤî9LŽê÷/‘óaÝÊâ^²JV+í[¾% v+\dïS÷dMú&ÅÉ€rOÝ[àOí @ògØÑ ܘ¥”¨×!¹l]Ú./xB)޲ÿê’„¬ÝEù¡Á÷•à{‰‘XòR ïëòüÂîÏå9]ž_tÒóÕåðŽ»(‹Ë«—8÷Гµ—Ý^†`v[‘Çaf®\QÕ–g)skem÷fz2Æ•»¼®(×µ²¬6:ßkód;Js½º%äÚ4Ù‹°Ù²‹Jr1fW’)È™^U±•¨Év¹®ÝxÄ¢fG–ð5Ì;2„'ÃãÞsâÚáq°5yíÝd‚JÀÝ3È!û#ly) ×>òL(Òp9ˆFÉÁ4V¡ñ¸NÀý$9”¦ËatžN‹dë¸_)GR½EM2ŸÖËjÅuî/‘Et…M×ÈRºIŽ¥Ûá4öȳé!9žž–çÐs°¼—d½!'Ñ»r2ý]VÒgr RéBÊi"×þr†,ËE/àtÄd9WéÍÅÊ>f%õF̲zR³dLÙó@Q(ã°b® ge+žÚèzÜqd§ÛéAstÒ*¶{=„ ¿ëœô45!íÊ­Ëë7Y$¹ÜEvy791vË{ œ{)[¶Q?y? Ò¹—FâZ$¢Rùsª”ûh–|”Êýp Q<@ 27ÐN;p½VLɱo´p£%€íòwJÙt¹|C½€*‚¸.–¿ÒTù%€:'ÿ¨ ä›)E«Ñì Æ¾ÕY8Ê?ï«ÜàqsƒGþÕ¤Qu&åaÐwô}OáéÓ”#ŸI)ZûZ8öµ=R¾#ßå¢U¾—*^ù¾Ââ`Á¸X|h`ÁBàjQ~\UŒ m'WHÿààÿYu $·“çì¤L\V#KØwH~®Bšü‚CÚq.iyUµ"b"ré…ò«ÔO:äËð߯€ˆ—Aī䑯Á¿N#äo©ì FN»fÈ7i®| »ÿßývJÎZcYcé¡J•ÿpƒÛ.¿‘ÿ3f.¿•ÿÃh.Îã9eð'“'±ày3Oškú¤ù‡ä‰ÚCš¨-l×´vÍ]o£>E%ìŠrµ ¾'´ÌÚêc'þ^Äõ½õؾ¯Ü¦¶'T®\½pNÉÔqžK~@ýå‡PGd}òcD­O ŽÑÙòS*—ÿ„J~ µù¢Ö?µ>Ki:ÏU4ð:•…s&X õÒz«Lp”úJB£ þïϦþÔ–¿:®\lᲿÌ\-›ó€K º‹ïrøn½ò¿ËàÝ«øRèqØ.g¼ÖØEåFk¸¹Z_‡z]âqthýjjmX;®¦ÖÎÛš—ß ˜e¯N´ø(呹‹t£ðˆ­aωÛÙ|_ÝI%c€#çÓrgaJò14™|8ø[ˆc(š §œóM¹ÓÊþìuäjgš•çTˆ?§PéOçÇ0a:Ã/ Ç¡_R_ùðÿ+øìo(_~ Wð?š&OP5,¨QÔ‚ñfðú<¿×4;ݦ9hæ¤{5Ô2è)ÍMÏi™ôÜ¿¡eÑÛZ/ú²øBë“â³+ýäǵAæ;ëãÚ`¨BèqmˆÊÞyäSÕ•þ¥ U.cŠpÃgï¡%JÞº—*ÔW¦¼·Ð†ky¦¼™z¼±Ðv€þb~4ŸÛ§ mDUÍ(>¨¨ÆEu ¿™ÕFï¢1õÆh'ÜP /…–¿–ÐÆ"yó`šïð$ŒçÞÅÁ"蓆C W#¥ôv P‹•®ÍåOÊ´sÉ®M£,m:õ×fÒ0mkçQ™6›ÎÓæÒlmÕâÙrmÕáºZ«¢€¶€ÖàÚ¢US㸶0Å6šæŸEiÔ§SªåÚDU²ž£^pw¾}1ž•sb£ñw!R›¤q6Ànãq°¯’\ÿPK—I:g¹(ïPPK¯TU;aQute/lib/osgi/OpCodes.classmÙ”Õðû1Ã.à*,*ÅŽÛÊŠDEQl"ˆÝuö•Ý·ï=^a;Š;‚eé ˆ4EQ¬`cšiF“Ó4Õõ¿¹;óÏ99œÃý~wî™7oîüçÁÛ_¾°Í3LÖךb«•LC.ln(”[† Å1…t¦\k|1ý¦3‚†\oi˜Ð<5“ªˆñò…¢™$f×1…|¹ä+S‚\5ãa—FÌ.AÊö6嫹œí1½Ã¨«m˜íÀ{¹Žc­½ÄºÝOÜhÝ3ñqÖ5‰‡[×&>Þºœ£ý÷SÓ«åV«~P9V=>N.²e1=Q6µ[ìŽQ@c¤=°)Ì‚´Åžv\7Ùn ÒÝÝ,¦VçDŸè€˜ú†€º“è|Œ©—ã ˜:÷à˜:÷0Ì=4¦Î=,¦Î=<¦ÎŠ™ÏñX(kÄj´—0ÖqP*Öp{Ac…åJ¡¤·Ã ö2Æ:Ñ/ÖIöx±FØ/MùèÄzê§'Ös?Žö}ð1‰uþ™‰uþY‰uþX8MóÏN¬óÏI¬óϵ_YŸî…ö[H8Ñ^Ø„AB¬”Úæ„“ÁT‹ÁrÂ)¸#‹…¢-/ã£Ôã_ŠîtU»/Cw¤õr_ƒ:çêuÖÕͨӮNÙñåj³­Óv¼«3v¼«³v¼«[ìø¶ª.ÞV;ÞÕ¡í/eÚl]´ý®žn÷ãê’Ý«Ëv|>ÓbëŠïêªïêv¼«Ûõ<[õXzžQ==,”ly³]®Q9ËŽîˆê[ìhWßjûü.éÙvf£îä6-³¶¼]K½4wØý5†¶¼SK0Ç^먼OÇêe™¯¥î÷~-˶|À:Õ¦_̃öa€Zøƒ~´‡í“¡{Ë#ºåQ{ºÙÌt[/H\zö±÷,=ÈvI¬Ûëë=²«½giün‰u|_Üiaò¬Ø+¦nÝ;¦îlŸ˜º^öY:w¿˜:w{Ã'[ˆ©[Œ©{>*¦îùhûĈŸÇØ'F¬ûŠ—ÆHû §5{rb=ΨÄz Së‘NMž!:ÿ´dëöóà€¶ŸŸX÷?.±îÿ‚Ä:¼½dÉéN°¸j±©C'_Þ-z…½ï«ÑÒ¾Ò>ÛÔ²^µ•(KÝk^Œ*As.Sn+)}÷X%¦.W(L«“¾Õö”j)o¹Æ.³„OÛÔI¸ÖÞ) Ÿ±ë*á:0’žÖzœtK¦‚×µJ¨± è(V©c#ngŒÈ†™œ~_›` ˆý,^øÂüŒÂ´ÌŒ°T©úõ=w–‹™TunÆ'sñÞŸÓ7ê ó•L)¤ôÒmÁÐŽŽŽj¾ZΤQؾðç3ízÚ/â$P¥R0Óz+Î:àŽ—ì§E.“o©èEÜfŸ•ÖRA_Þ^ÆŒTk&5Íf®íx3B}oMe Y=ÊvœE[!Ú¥kÏÎö½ŠaÝ}¡Î| 'Ö¦õÄ_³–_%üŸ³yÃ>̲ݯ¾oê’/ä»;ÞÂf½QôÌvà¶Áa§˜>Í¥L0­XÀ²=oÛ{¡­˜Îõ¹ðeL}.|N;vÒY“ñzÑã û>4*• q¾xÌy‡Å{„o_ã{ã|Et nô¾ãÇã«mÍ™Òd{/Šé?®€7¹)A)´v5£t7}ðf¾¦NV €_i ‘çƒÆýÿŸ x÷™T¨–R™±¡ÝCë?Æþz0Cð«Àžò;féij Z¨‡é÷&÷w!×Á»’wƒû’ûÁõäþðîä=à=ÉàäAø3˜¼¼7yx_ò~ðþäà!äáƒÈÇ…#%I> >š| Ü@>Fn„#‡'ŸŸH> A ŸLŸB>><>|<†|&|y,|6ùø\òyðùäqðäñðò…ðDòEð$òdøbòøò¥ðeäËá+ÈWÂW‘¯†›È×À¹N‘Óp†œ…[È­pHž O#çà6r.‹ðtr .“+p•<n'wÀ3É×Âב¯‡o ßßD¾žE¾¾•<¾|;|ùNxù.ønò=ð\ò½ð<ò}ð|òýðäá‡ÈÃ…ƒ’Á“Ÿ€Ÿ$?w’ÃKÈKáeäåð òJ¸‹¼ ^M^?M^ ?C^¯'o€7’7ÁÏ’Ÿƒ7“Ÿ‡·_€_$o…_"oƒ_&¿o'¿ ¿F~~ƒü&üy¼“ü6ü ò7áo‘m~|›üø]òwá÷È߃¿OþüCòà÷É?†Bþ)ü3òÏáÈ¿€?$ÿ’ü+øcò¯áß Bþü)ù÷ðÈ„ÿDþ3üùsø/ä¿Â#ÿþùŸðäÁÿ&ÿþ/ùKø«Äbÿ‘KÈHTñÈ>Ly/5p-ù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿBù/È¡üä¿Pþ ò_(ÿù/”ÿ‚üÊAþ å¿ ÿ…ò_ÿöw•>{ÉYŠŸZË€åúkÇȪz1[{m”ådy¿~þdÛÔ÷Ô¦¤Ý#í5{F¢f`Ô ŠšÁQsBÔœ5'EÍmêÍìžQ» ÚÝH×ý˜ë^èÚE®}ܵO¸öI×>åÚN×.ví×.uí2×.wí ×®tm—;þªQ»ÚµÜö®ÝäÚg]ûœk7»öy×nqí‹®Ýêöÿ’ó+®ÝîÚ×k¢ö ×¾éúßríŽÚ¨ÝY;y½~Ÿ+ñ÷GøUd¼»L/o®éëÍ3¼û;ÞÃæ`o‘9Òë4Þ3Â[fF{+ÌÙ^—ï­1{kÍ•Þ:“ò6˜©Þ&Sò6›k½­f–·ÍÌñ^3ó½f÷ŽéôÞ3]Þûf½÷Ùâ}l¶{ŸšÞçæ]ï ó¾ȯ~ùį3Ÿùõæ  ˆ¿·ôö‘z¿AûÃeˆ?R†ú£e˜?VFøãåtŠœë_%ýV¹ÌÏIà%ôÛeºƒÌôo•Yþl™ãß'óý‡d¿P:ýÅÒ…õ]zÇÚÿ™[Õ}Ïâw¥à1=Ø,«“ËQ£Ñ”ºh€<-kuò3:jÝ×PK‘Ø} MPK¯TU;'aQute/lib/osgi/PreprocessResource.class}T]WUÝ7„ c)_¥ÁBK«m iÕV›T U0|jÚØj$˜:dâ̤-]¾¸Vÿ‹¯u-IVe-}t-ŸüþußÉÁ—¹wîÙgßsÏÙçüñ÷/¿¸ŽgBãæ½Š/“¶•O:Þ–•\seÙu ÒóÖ¥çTÜ‚Ô86›÷|×,øM@—ÛÚF3GÐMTZ »Áî¸#GqkM‘ÛVÉò§nÆN†xQ<+¾ãeÞB¯†SÃ'` œFŸ€a›ž¿ì­MK:bñ%0ÐA’Å–âÙnœ1 ¡KíÎèDD]0bàmœc¶¤¿ð‚‰ŒÅ3OÍgfÒ6K[É ßµJ[iå5fà<.tÊ:°ÿ8L 7c•äJe'/ÝûfÞ– æL;kº–úo†ým˸tf2²,-–Z¼”B³8ꆴ†OXàÖC+››Ò•Åui¥«a–‘¶ñª›uÌàŽ hžÂˆµeguLã®}úŸ¨ë û¢¥@Kô)*èÈ`EÃ2yOê«Xèau×eÙ6 ÒUQÄêbÙ,¸NZÇ:îkØ HÛÙ |vÖPÀåØq‰¶·*ÉC9|8³TvI`¨sVaø _³6튷t\VÉè&®ð5¾Ó’šŽ8ˆŠ‡õyY›QÁv<Õy§âsdeþW±ìˆÇ{.p®­øJ•‰Ê´Ñ 2Z¥ÃÆÃÕ&½[TeÈ´×a›ååR4}‚PÐŽA»ÞµT{ï㫊 ãœ#â!Ž.Ž îN«¡œpÄBç·‡e¢îbbò ú{JLîa8‘øÃoØÃèOï8¿gÈ2èdè…AvÒ8Ná"O/ÔÙp ïÁNÝ*‚Ý»Œ#„0.ã ×Ï´ÄUbžœ:O^íc"×§ýYÃTf×r5¼·¼¹É>\©Ç“H…÷1ÛÇL.®a®†…Tg´³ŠÏR‘1FØPŸG#UÜKE¦Ôú aF~ÿ篩*MTñ$¥EµTw4\E>Úý:ÕUßuýƨbpñ²õâ ðÛÇHûùÚŒòcRÆ,ÎbQvÌrÈ?ᑈmŒ¡ÄAîòåϹ¾$Ó÷ÜÿÀܨL­ÕxÕÈTv±Evkbá)oåÉ·°™Ñc‡laÞ8‡ˆNÞ{ ß1ßž¼Åc¦ü æÊ¿PK3±÷IÃPK*|b;!aQute/lib/osgi/Processor$CL.classT[[E~‡L²IºB G›.-4r(ˆ¨ ¢B­.”64•âi“léöIwãf£öÞ?ॗ^yko‚}¬÷þýê7)I è^ÌÌ7ó~ßû÷¿} `5 ÓÆÝ–gæêV%ç4¬ÜŽëTÍfÓqg‹ºÎ0þÄøÚÈÙ¦—»O/ÖfSwŒšé2V,ÛòV|‰d™š© Ä v«(¸À0qK1¤`aH*Õ û 'YT #Â0x`z=¬“‰¤Þ=z*„áÃ%~Œ2$ûz·…3t„ãCºe›Û­§ÓÝ5*u“aDwªF½l¸–/¹÷Øj2\ÖÏÉX’aÔj ‘D/}²Ã*.#Æ PPtÛ¸dŸ£a¡©˜ÁUʰùU˨,šèòÿNå‰Yõ ɇ"àYs˜"(Ñ’:ñ·Ü:¥­×(yO×dhh¿ÿµBuʆL Ã\7UÉs-û ðZÆI/¼ñmÕlx–c7äb'mG‚nš6–]Ûp]‡ *Y¶áµ\Êeâÿ¬¤VeMßT1´‚·:ÍØ¥µÞ²êTÇ0–ð¶(}@œÞU‘GAä¤Ñ0mªFæ?èzl‚x2®Ùާ=þ§µ†áš¶—×4QÄ÷U| :3DEÜ‘‚s]pû¨:•:‡jƒÜÔDmòaÜÂm2 Kx˳ê¹5×5žÑ,|„‚žs¤Îïô÷ùŽ:ÏóIÜàSÒ¸üíwXÀuÄÉ?ÒH I–&"T\FG{†pœ¤,nH®éè_ô"l•„‹[韷^`iïËÒÓwdFVäFñ¬¶±FòÍŽ<ý 6 ºÜÒâý²{™6¶q÷w™%…~»D"B[¤ÌÇàWäB|~ãüb|q>‡,¿Ž÷ÞIfɃ@BÀa ;Ì$QAÃ&„-’$²ˆ É$ $™83qÇ¥îÖ­UpiÕÖhk-. Aê®X—ÖV­ÚV­Ö½­¶µÕÖÖÊÿûÞ¼y3™Aú·ÿo˜7ïÝwî¹gýιwøŸùò‡ˆèpW›¤ ÃBÇw%ÂUm‘ UÑxk¤ji,ÚŽÇ£17¹õÛÚªj u´V-Ù°)Ü”pS¡ ¡ö;­U±pg4–Ǫ–Ynòô¦Zíˆ'B‰¸›|‚úkª‘hUM[4mh *ž7Áœê–Ÿ¼´î„…µ ‚JêÒ“7&b‘ŽÖé‚úÔÕ6.?¹qi]íòåó— * ÇbÑXœš£»‘¶ªºH<±ÞÆHkG(Ñù1Ygô&> ¯x¶†bø‚žÎp38Ž4 «$b¡&ò…Om w&"X¸i‰´…ë»â‰ù§‚¦ wg[Wk„Ÿl>S’z>׆PDûÖ¥$²qß—ˆÎ ké4 ››–S~š˜¯3í Ç‘0èxi©}Ÿ—µa)1“¥¦úPS,Š1F[(ž¨6GZ"Ì€8,¦‰3HKäÔ®NÐk·Çv†báÈap6aÛª˜HGS[W3¿Pì`²1Ì:‘ygF¦`x•†)ãºh¨™×0,ïTcjê0¼*J˜‹MS®‰¶µAP"Fr>Èc }Û#ñ8¾ÔDÛÛCXB©ãíE¡øFsã{ßÍgq3šÚ"‘Ä,AjÂÄ0‰šhsØCG "/ ª6¨ˆ Í€~×®½6¨À~2Ë >d°#ᆮö áØrÓ—Jê¢M¡¶¡X„¿[7 gèi|¤¨Æ 9t”›æƒý4Ÿsb±Ð6¶/Í£ža‘A}©˜¯Ž3¨Ä¼ª3h pS4áÔêi)Ó=^PÙ„Þk¸‚G4´œNÏ­áÄœ ñhTgšS¿ 3uÍ“­4h0 ñáj•A«i <¬#¼µNûZIê…´Ëó+'4ÔäôdƒÆ2§!Arù‚Ö›Ël6h8€ä#ðÿ„Ü®Ã+XOy-°» ùmœG ÚÈ´Û O‹âáÄRË;¼©‘¸nMߊÄo 1ty´“IÇ :…à{nܪíh‰ ª:;¹•!h«A§Ò6vÈø‚P¤mÉfm‚«ùÑéÁâföæëËwÏ2èl:œ„š›ç´µ :jB¶ rï=÷¹Ça‚•VÌ-¢ èB7} ^–IÅ ‹è(Dœ¦¶p(Æa&Fða2—” .AáË«sDØlörú`ö˜àòåöÝLÆ™Á+ ú:]ÉBCT %X‡3,±Öº?½ˆ®¦kÝt Lµ÷Sƒ¾Aß„Éu„O…æ¤(8¹wÓõ‚e³1·+Ò†Àç£t£›nÈHÑæƒn¢›am]á%0ÕqzŸØ{}>ºŽ–ò_·t+ÝÆjîì sŒ«<$gšÎw ºº!¥DÔ|˜½FkN–è}¾ÛƒUeÅŽÔ\«Y–?0èn6W÷ÆP¼A‹M&`ù®–X´9êÔLÄ`½Êq?#nëLĹFð‰i,( hBŽp¶&—+X){ z€öqÞ‰ÆÚC`ò˜C|;·p4è!ާ)Ú‘ihQ·$ê Ũ”æ yàIGì'O”¤=‚fæ`ÆqgùÆXt«Æ9×ç¡CèÕå¬ágØHžÍ²”§äµ ‰?1h ðÑóôs7ý,•‚2ç7èöøâN¼œhL„š6/7á—€DËrrÌvžòäÜ"à”xxQØD£ó¯@ªu⶯•c¶CÉà¬é¬²_ô2ý:Êò§ž^Œè8 èkÿ ÿæÒ~Co¹éÍÌ*b£ÖEÕ’Æ…S-¼øß šsP¦sT9PØmmeEûkjÚB]ñ°Îfïô>}`¦ +ÍoË –yíYkèwÌä+˜`£eID0 É9'äé ïÔ&Na¥9ž‚ÁX¸=º%¼8¼ Î;eBÖJÅJ·|uÌ­¬|9ïÐ^tÓ_SUº<c¸þBŸ1^úõ,f9~NÿtÓ?PGe<2è úĺ9¼ ¸„3üšv +܈Î7ñXHC(ÒÕ‡‚3–ˆ¯Œ$6æA¤œUD¡!Üj MÙsxvÅ8Ô÷’®+nêø3 WÆÇˆN„*Ñ¡‰ ©%™|…Pck Þ‰¥EâK­âU”TJ`ÈŒ1í¢Õ5a5ÛCDaON›¤ØyµÀ.ü†ÌIS¦ð: y¨!†‰á k»6¤ÒÑÀ µµ9=e§(çá#Y ¹FxÄh¤•I“xäXCŒã|W>¥+Ôg&b"× }l¨lÕ"Ûé~•qn“ Q%&C&‘Žæð© \`¨–1„–ÀÑ?µº¼q™1*1[Ìq‹ca¿Yïb.Kš¬Õ͘¦0gˆùbDÐâå~V´ñÀxè´Óàœ½–ùµ1šã¡Ð,Öm°•½;™g­ç«’¹ÝBaûGÙy»Å²Œd•Ý>q¼®òÄ NS÷wŽ>82ÊŸ Üb-–gæ¤ ÍUí¡Ía8ýæðÜŽfŸXC5nq2p|Ž5ÑÎm>±ŽGl41kDS´½3ÚkG`‹m‰4a¸uÃ'BTƒà)†háHéÁÍÇJ·Ø˜QÒ#öŒ™ÏÏŠD«ØdˆÍ\sp‰ãí\€"‹!j ªb|©ÖʈƒÔ£Ü\a¢°ªõའ4ç×ÚíQÖuÜTn•4ŠÄ5⛆¸Ž3fŸ¸K"á8?Ùaˆâ3Ч ‘¾A7é B·¬ª=â[‚&2@G{9/ŒE”ضÄT 9•Û]Îêò cãYZ( 7åv›!¾#¾ ÕÅ!0ÀW`cG» î(º :[Ü‘ÕhqŒ™¸Ú#¾|x0=â.A†“MØX¼AÜÕ¦ÛCÚ'2ã‹í\ä]hlhÚº‹-‘«)-(¨Z6á/¢'þ_ÁaAër1øßœ`@¯Ð˜…œû#Žƒ-¡H[t³G<Äà&Ö¥sû#†x”T?3×¶vDcáݧfßf@1WsÇSWý³ðÄqŸbGàO‹gÝâ™ÌNŶ8°”!ž?*¢]éª$–šE_,jŸÏC £¡ïŸczŸO¼(~á/¥¢\æhC¼,^Ñý!ÜB.Ÿño•ÞY3ƒ¯öx«Že±v˜Aež4;!ƒ 8½†¯‡ð"÷‡M$-Þè…¤u{jLšP~6$6ÑiÍŒÅ9æYñ•s³5-_<}ù =ý;©ž“µ ŽÍáfN¥ çÅÛÌ„LXwÜâƒ^9W|ŸNÈçß½1Т¯®[­ùƒ¡yâ#†…$¾9eAãs³Ñ¿ð?cÜÖ;,>TÞ«Jê¥æÕÿ†šóh9ŸöYÁŸAÿykЇjµˆ¼âsCüŽr‹:<±vÉüT8F=™·¶š#1–æšÞ~˜IÞNß®…ÜZCmsb­]íˆæ6qÈì Ñrž¡S”ÇÙC¾äîe½t²€[Î-†¥:¸—æ`Ã*+g‡e8‡£ÿÌ'}†,Ò­è a k‹Ûñְóõ’¬P¸Zo|ÈbCöã:ª07«!K Y*Q¶õåä$1.;šæçg ! ‰²cpž= Ìî‘~@9ÝÄ·3iz/¯œ+îèÕË!†ªY óffÜ#Qß•/ÍYÞÅUG4Q®!ËrLdŒjïŠ'ÊCúºB±š`“ÑØ¶êr·•ÑõsZ `X,igvùìXôz9ÎãåhÎZƶ†P{XoÜ8%5¿Vƒ‚šß*’Yá–APÍ9À•N;51ƒA6­§÷XÄ“ é–žwŠ!à ª(Õ‹ŠæGrªœfÕßv#iü¡+˜·c YÍ¢/ÞŠ×#ÛZ<Ä3}ѹ"ÞcÍù„“;35ËÓ |u¬!çȹˆÛÍÑZsçt§æ,™³Í'+Üé09ÏóŸvv%ô.PŸPs†ýúlu1Þ–µ†™[9Ÿ>Éo3äiÌ-c@v:^Á†<“ï%¢uÑ­á#EDa§&µ·ð€í†<—ñ$ªÔfÝŽc&Ï7äÚ PªuDZÂñÄœ¸ÓŠ*Óvààç`Áð"¨ šû̓×(NZòRñ¹[^æLm‰ 0ü*’_7ä•\ÆxÍê®à‘WCì)7C¡G¢Þ+Ί›‰hÓ§<O‡E¼^Ðh3L£TµLŠƒuÄI¯Z«x'—bû‘†ºÌó#®f”ñ铞»Éltƒ=©[c‘HÎYe9¥ÃåS׆Œ§étާ£Áã°¦®ŽŒ 莅[bá8o…Ë; CCøê{£Ñ,È y5?@ ws¿!—ç§k »Ë÷pîŸNa5ÁÛ·»É¼âq÷â Ø¬xZ& ¹‡¥SWŒ›‡Ë#íáúHªÄ2ÿköÈ}@„‹º6Î._¾JáÿëÐåfK*GÙ!4äC|¸Á­«‹6 Gr€Bâ]M{gT| 1º&ÚÕÖ¬õΩ×9Ê#Ÿ€n*S‡Œ˜çý†|Ša¹®Å„|ÚDËìYƒ&Q‡!8Þí,h·´Á”~†µ-íÐwÊ ù"·;‹ø4O­Ùòäû¿0ä˒뤶pG+#Ä‘Zü%bÏ$Ža¿6äkòu®¤Á3GÇÜŽˆðúØÜÚ1kO_;ií™Ìî[†ü­|[odèØªÓò<Øäßè·e¿ê‘ï&™ÎÒÜÅ#óC|\V”ë½ÐjnyéÀµ^èèõ{p,Vóª?2äÇòF'W£GçèƒbgÔÝJ$Â1xZ‘%†v}¼£ŽÐÕ† t|þÆþN@^>ÌBúð>ÌICYA'çÅ-Y;Q¹¾2Jøª F\÷•3ü÷ÚÿtóEÃÿ«©ÿï¶fQ¶ÆnüOC¼)ÞòÈÁVgÑçò#ä;E¼Sö}U ÜnUˆ —•¸óëÒèÇPåµ6IRN29gó0?é5jð—ª0èVU)¨âOÜðËZxU†š¬g#K›Cº9zQæ#ŠÔ¯Ž@l¨`Þ¾ ÌlÚ\äél ¯Ç⦋É8åaù¨ Õ6‡y°ÉâÈíJthØp¨úÈqu3Áà©•5+©Ps Q¥ææ9,PëQ%‚·³ÕC-T‹˜ó¡Øœ„¹\ãUÇ©:·ZloöÙ¾‰p 3T½j@LX¾dñ||ú‹Œ…[çVYA!n©ZæVÇgôb3†ªQ-·ãÌûÅà«1|JW¸£)³}dÒ¨7_Â4+Ô‰nµ2Ç4Ö„YÚæQ«±òQÜçÞ³ØdÅì.U'TN#ÙÌB†Ú šÌÆ›.çEÛÍke&æh»£¸Va”–ªEЂ|1樂ÔàD|Ü¡eÔv4%x®ˆ¡Z¥‡yÞŒú™Fsbˆ°µ˜…âQ½š¨¡:e!Ÿ1ÔGzânK9¦fmS(V•*W}ê•ÿòu¾Úb¨­ ¨¼¿^}¤Ã¿‡f4¦˜Fú)”pýÓ­N‡§äãVg –ïé]‰«ÓÔÙ†H¨sÒ¦olÎ «Î`Oö´[‹³ý¶×²§s™È<©Ÿk’¯>ÜâŸý3š°Ö‰ð¸yrÅñû /7Ãæµ ZC–žxÐ6Af½>—cð2­kŸºL%ødc _]e¨Kªù‚ kj&Öⶺ–Ãï7¸J]S“ë ‹}üU]&>gÅì]†\ÓM·ý? v0¸0‡Ð55XjTâPÄÒÿàõܼ©‡Ô#nõpÆFú¸¡Õ?Ø·w&Ì_ñ¨ÇÕ“nõDjß]¿ ヱûÕS\ÅÍŸÒŒ=ˆ}9wi=ú¼G‚} Ô3,¨òÕslAwòyÍl<óÐ…ý³"˜˜ë~žV¢‰ÏwþÔZw~÷vðùú6Fz  ¤*}T/kß,Ûà_1Ô Ü¶÷€¢>UΉÿWUP¥OlçkW$¾ds] Þ0ÔÜ)óòËX Äb2² k ëߤûÔ‡f÷ˆìmæ{Å‘x½ù[2óèT{µ±ù£ Þ±ä¬ó>gBÔôò<ú÷†úƒú²C\ET­±àéÐ\Ç.¹¦3¤+#/÷ ñ×F}&Æ­*H£¨9ʹÝÂ2Ks†ÉìŸ{òÙÀ^wÍ=•‡–ÿË$±Z`úÌPoq4a·Á»…ܽ¨¶c L«¹<”Â4åÑŽr«D¯Œt´D'1½r}¤¬¼M*g”R¾!\>csxÛ¬™3¸Ž™UÙ2‰xŽŸZšëá¶/’ñ:Ü+ð5êÈ& êkC^='t[ÛÑŽéƒ<¬YS"óÍÃN.F^4’$ñ¿r“—âOÄ?'ì£?%ÿªcúéëþøS’ñø8±îŒ—YŸ­ÏAÖçaŽñ~üLCôõPÇýaøN#ô5*ý Ô­?ÇXãÇZôÆéûÄ?•ÓŸ)`Ó âo¸¦¾?‰ªìû“ùGÌ4Åþ~m IGáÎTÜ9Ÿü_QÉ´û蘒é÷ÑÌ{ôÀÙø»/ÄCx±K÷áÛ±ú á•96«É¥I, 졹}4oÕZ°›¦/k®Ý´ßëW•LÛCK’´l7­’tânZË×ááz Þ°›šÒ³ƒ*KtAÐÅÁ`tDRNƒf`Ñ ±hæÊ0y ° ó×bñwÞgžkÿcþ‚{¨5ƒ“Â`Xš¬h2a1ÈWã1VhV#«Ça êÞOM{hS ¸›6g«ã­¿>P@šn_›n_mL·Ý¦;Ë¢[˜Eϧï õã UhÓ*¤‹V”:-ZUú;QAà~Ú¼Ë&U¨oÎpè¢ÀÖÅ)öË5ÖËýùå§@c_$)¶+kÇÂ'ç@º5‚ým‚ ê²î„ìyü<(kË* €^m0I§Uì¡3»©_˜úžz¸¿@ ÷Òùt¸©/ÒrŽÙ ¦å†öA+ch1|¨žª©-Ñ<•›óÚ²šgÉŠ¯.ÇRó™ÒÀ±Ͳõ‚%Ó’tI¶–a®F‡<6]EWòoJñ·éÅ—iª`õ…,öн„¢­º ›&ú öÒUTµ+¸®[UÙC;öзü®$};IßÙKwHZÉ£î´óÀ‹Ì‰Òœ”€ÑJ¬øD¬v%M§Õš£#©@«6ÅÑ ú¡Ž_|µ WR_ñšÞ 9Þ J÷Ù2âñýíñ÷c¼9j7FmçßÛY2Šã s0"XÑC= ¬¬Ê½ô# %÷µ¾0ëiÑ™ Ÿ¬ƒž µ­× L26Ã#èaË„F@.âíB„ãÇ4ÃÛù°®ÅÀ¥øÎoV™Æd‚Iz¢›FÚ -t2´°Cƒµ6š Ëf詺lEÄÞˆ±ÉÁX•ÍX•ÍX•ÅØ@D4cû-ÆÅ{¬ƒF“±QÖkÐÔkÉSIzºÂÔm¥fwL*ï©v1‹~—ÅpqêsŒëçvoý4Íü(˜!h¸apãౕðÛéƒ$`ö]0Ñ-sh´Ñh/¢‘^¤—´94êå(Ь—Ãâ)FÔù]¥bTRŒÙAE;CúòË~רö«JŠÊU³n:ðŒ¾ÄMJëmì{!ï`:ûÂB6xaâ G!®yz|¹÷a’§ôjféȺÞBи‡[z^)¦àcëIâq$±”úYW£ Ë£ÌðÃ?§±V=Ó’ °"Ø#¦eûÒ³zmz­)…8FT§,_L×$_ÄdÌ`…)ëI1£¡ÒÎÊ£¬¬ 9"‹Y;¨_…¾ªÉJÇ¿êeÿ/ÃÕ^Ú{µÁ/!Ÿ_Y¾ lôšÃþkl&kÄB±H»çtQ«ssš*Ž#¶ç‘4P,ÎÊÍ<¾.5^ÔÛãýœ ùwröBx¡Šõ ŠïÁt—ìœÁÇ®À>qüª=¢q·X(+î¥c’âÄ:ŽTÖ[i¨Ü'Ö`ÌIæzñm¾­·¿…ð­ÉüV±W4[1¢SR€F´rÔØË§B8‚ú KE›¶Ä>ª¯ÞͬìÕnãaŸ—Š®½b«ÔoxüžýtXÀïIŠÓ`”Õ^¿ÛïMŠ3’â°}ëAR«”¿°1).ôöˆ‹1…Û_˜—a$Æ]Yíóû× ÿú}ˆkÒ“ìß@}Ç÷{Åõ’*ý>s)Ý”À»fn´™­§hæ½¹ 5ï*—ߋɿÝM³ü¾qku¤»Ü_”·ƒR Ú­Ó~©¸“Ñ\!²~©ø>þö»Íä¯@o§LéËg•Z$Ðà»b¬˜@ÏÓu"*bø4ík'Ò%ô©(¥!jõeb¨$&ˆÃD@ sı@”‹¥b¤X‰Ïub´‹1Ðx‘À¨ô…¸Mµm_«…¥Y¶=J\$~ p‚8—Ó±}²8MÜ­m{ èüPì‚mŸ‹ÙîÁ¸B~¿÷‚¸9÷ជž ŸŽ^¬»ZÜ_ñÒ§t„ö ŸÐ| a¼b¢Én¼áaüI"d‰{ðÔ­ý‡=Ïä¤ÇæÄos²œ˜3<j&ÉHª‚ÿ)+5ZI­`Ÿ`— î§â`©x0)FvÝ¥ÒÉA‡wQbÎrrˆ%/•ˆÇ¬èô8£T[‘äså™'Ä“¹jÆYyF fùjFŽÑ<ñEv‹`¾ÅHi Utz]ºð3°Â™XÍ,{¥ñíüƒD‹d»Uø‡ì‡KÞ+~lzÇOáAí?Ãß𠤩VfO3‡Üb.²ÃÌw’ReµeDÜ& ï<Å1Ç`[q’e$ø— Ö‹-ã.Åu\S+î¦%%ƒ¯¦4y]Ê‹ÓAþ 2Ä™@pç8¬¾Ì.ÝÞf5 O·˜w‚;³Íõ|‡n›C·N Ì¡!ûX„~‡©Y'Á¤ì»Å?>û7*‡&eY7­m0³®<ÌŒ+ŽLÛM³1tðNa –cÈPëÙˆ^ÏX§nĶr$9Ú‰â"py õ—®]ý^Žôt%RÉU´B\CQñ ðë´WÖ t:D «SŽÐg çÕenÊøÅ9W¼îøܬ3±ˆ±¨Î&Uꌱ©œT]0”IYÅ_ßIE¿Ë_”GbèÑlϧ»G­ŠëɃ^*vÒqÅ`þzš!nv ø™6Ó35ƒÌôL‹éšVY·¥0ë{4v‚ê‹äÛ¹ÌQ3xAüÛkA'à>«Û8(g-PºGÎfSÃ"k²“À-03”–â6‡­ømæüsB.@R”r!î¡€¶x2Nœ4ú³¹,Ò6S¨HÊÅYí)q;2e7ÐØìNG¶éoOÔßR]Š"L)i$ÿÈZÕ:Ë·î—õpRlËz¾Ü+—ônЉ»`D?€£ÞMÃÄËnÏ:ÜšUò¯žR1P.Õ(ÿp詨ì®(•dz!xïwB¬l +«]惵+ÜVüPWùÈuÕ@Ÿr=€»»[túÝv¹_èšêqMõ²Ë.û¨©!  IÙT]Ø}à}~Ö’zæÍxölñø4Æì€ÍÚKàµï§Iü´-7JÚAå–¯E û²ñ­¿ºHÿ½ÙבÒ—”ûdb•ß·Gn©.âA§&åé¥ò¬¤<†¿¨GžWmpGÙ¯Ÿª¤¼°Ú8——0I1ÞoTÂÔʼ;©Ìo$åå°…Ë!’½ò ®iøV ¢I™g­´Ø¼*Å&Ó¼ƒ¼¥òšn‚¾a²d³>®ÚÇï¥ÂÌu¶ý>=Jî`akØÇ• ÅùâBä Ó5ï¥ (óGHûR_ñ¢ÁÃÈÐáÀŒµÀ‹uâ Z"ö#­?E'‰Ófñ4`ì³´M<ˆö$¨ýœ®/ÐNñ"ýP¼Dω—éñ ý0éwøü éïÈ×^ñš(oÖÿÇ[âpñ¶˜*Þ‹Ä»âxñX!>!ñ;Ñ"~°ÿ±ŸgâÞ…âcq±ø£¸BüI|O<ÐüWm²WÀOa„)“»å fŒ»-Gá{7¢(VXÛ]ò&.çÉ›‘ð °¶…Xá:½)çÁ:×ÈoáÊKW£Hað¡ÔY!¿-o“ö#%oeC”Ó$ëêbÈj¼ ãîK¹Ï*¿ƒY͹&c.!¿KÇ[.;ׂÎ>Av“løü7þipžŽÝÃV†º=U( Ä*Ðê<`±&ßý¨»Ô Ó ŽäTmxªÇV_ ÜŒGw^{3y\3ºÉH5Ù~3„o3Œ¸öFr»€8Ô93†ì ‘˜‚ 5%å÷<ÄDwa)?Ì(HŽC¤!ñ¢Û—Òê+õ“’IÑP5 À é¦Ùø¾H–Ðɲ”šäÚ(Ë(*ÒéHDgËÃh»숊çY‚èGqy¯îWM²â#`ÿ¤ÉqP£Þý89Ü„ º¯sFpø…‰LÌÀZŒ´¼¬. ‰±Ð¬$!T ƒX]…C]ŶºŠõ-êëäÝ–º€Îs7sdÙnˆš¸ÏDKð±yîȹ{€ì A3cR…‹| ’òG Ù-ïì&O`$>Mµp–©.p ^ÜMÇB5‹wÐ1VXx8ú–B/æ„}Hϳ!¥Ö¨¬"œL}ä $¿<ŠÆÊ©4EN£cð9CM d5-Fö]*gÒJ9‹ÖËc©UΡóä<:_Χ›äBG¶¿Ù–ÕÍ–¬øj°Ö¨Ÿê=mE+áìÒt¾+·qÿ‰CnWÒª KåãIz·G>¹¢A2úq¶ÂŽó‹©DÖå¨ ½üË1‹¤]v¡à âÎjÄÊ%e—Ù¥ü Yï'-,¿^òÌ~Dg| ?Ç™¨ÄòüŸ ùÁ) ë뤆ÊýúKc%²è® ëKi«wbäZ(à$-O¦ ¢ÉrÐ Ô ´80à"[À‹,t‹+ùS½ÉNõšÞNª ¡Ö•àŸÓ÷ò†K°j^Í62+?>ï´HƒÈŽ€9A3ÿ5€ñK*Ó|d~ä)0š’qðß]Ž­¯)6¯S,ø1 Aƒc¯‡&üa–Ê‹{qøw«YÝ\ѯ*)>kØÍä«ÐÝiŽt/í$w©|µÞ:G`n0È_ù]¥òŠùæ®j—å ï`UÜ ïq÷Ì•áÖë»ÀÙ0ßT›Oe@$·‘[žFEòtØ×Xç™4LžCãäv¬õ\Œ>Ž–çS½¼€NÀçZù5‡#4ÛkoÖ+úê­'7ò®Ù²˜ÈRpÑÑT¡Q» Vû[ù¶\Xƒ¼Ow¢Åi èC³YŠ(~ ïðYÍRÆbéfiÕ„ÜYíö»ƒØïªÝ•þB¿;)ÿ°’ßÒ™áñÊtµ; €”äÕ× Fù4úMöëد§¹ƒêp¿A^Kø\ÌÌ+]fò¦WÀÿ(ÿdYä‰òÏz¥„O´–KAå/‚3ö(T®Ü¼+ÀœÃ­æ]5‚Û«Ûκz¼ükj¼üã½ò3ù7¼þ%$ŸÇnNäFFÅùyuAüGua0½Åð”ðÔã÷T{ƒ~Õý0ÓS*¿Ðht„äa0Ê0óKDªJ¿w¯< »»?ò{zÆ á19žßÈÏ]€“޹"OóöÜ€–þ>IåÛAÍö›€•ªÏNšjµbªûúûVøû¤¸Û«ú!töÅ|ú¢ÐßÇßלº›üê4UZë]óæã]6žVëù\.~á/L«üˆ–ä#ˆ¼"ë=B>ù8Ë'h„|’‚r?UÉំ ü™àç´P¾€ ð"2ÀKÈí/Ófù m•¯Ò9ò—ȯÑ%ò ºAþ†ºå[tü-=3~L¾CÏÊwéuù½'ß§OáÿŠ"ù{Q"ßCåb̆ÍÉìOTýÍ-R\•è& _•ê0_ ЯÊpÏE>1B ÄU‹Áò\ÒPáÓÆærø³¤{ÁUô‘: W^šAo*?Æù «Õ`5¦= /ïÔM›ÕPâEþY ¨a×We Æ›<õØ<õ¤xÒðÐä©Çæ©Çæ©Çæ©<éùÕpÐ3g-Ælz.ÜëK^5B•§Œ\™åg}ºû¡zÔ¨¬•üÂÙýPc­ÍQ·§½1Ý£âg=œùgcöãu¤9œQ5¾‡÷© «ö¨@CÉ4ÄP‡!tÓLû´ bLÀ_h;ÛÜAñT"¾ª |ÂÈ<•=jR©š‚øœÚòz¸2©ŽL/@ï*A%ÉPІ*MPt”2h†êC5ª/§ŠéxÕVàùzU¢»ÖdÖ^lØZ,_¥{ :IMUÓ0A«ÔѺXÑvQ€ÐF]IÓÕU4[]Msñ¹@]ã¨Ø[ñâÙuêz=C5BÙ⣑£ÔNud=œ†¨auÀÿê&u³V¾em›Íî>A׃rÝ*hìQß΂ê&‡ ûˆ»¡2þ¯º- à™ú>/柫Ù}WOô¾çð!S”%Ó‚«ªÝM-TSfûÝeÈçHW‡#Céî¯î ,«O¼x**Qf!ŸxPh­ 4ð}máo_ Ê Ê o9ðˆ)èŒÂCÝs¿•ŠÀëð6Ü­n§YÈUóÕ´ßdz5ê.çù ½2þo=Vt;ñ¹–-ÁÑ :ç+¸ÀQ Yp‰U z÷Zùe¡Ÿa>SèwXÖú€F|Êø)*,™¶Ë!Š€CC-Q¤VÌ¥åÊ`ƒ½Î·Së4 )ÀrEÐw©{5î/÷Q‰ºŸÆ©Ýpé$¡öõÜ#Úë0žyÐã£zó,=c”¹Æšb­qœµ2—Öé¶N¿—ÕúPS–Ý8½÷AgâÐ’$-ïÛtîʤ¡õƒl:fÒÑ|{ùçP6]šÎíº&:1¼é^š™T÷ÔW¬ª.|hjbwE}UæšÒP s3+÷ªûQ%ïe®²‚[¼“Æ#z[Tí‡Ý<§ü1ýÓT‰ëiêYG°?ZÏãÿކ¬«ôÞK¥JÊB‹!w–aÚ?xÔdŽ:üïùÚ¼÷dÉŒ÷¨½Ù2øiF6çeì³éüHÓé°"b °_'ô¦Å¸èú¹áëQ>":˜îéQñ5eb`I/BO/!$ý«Åáý{ÅH…¹¹X~foß`ÅÍiÖI†:XuÁCS]œw‘j+ÀTE°G=Í ·ÌuË?˜a'ˆ°óì®,ñÿ®ûùÕëÈRo ž½FAõ¦{žsŒúY®““ô\VÃN½“3çüÁ¨;qêål£sî-8O0NÑ=7/ÿsÞ©ÖBÆt0£› φÜÓÂÕÂYß:ðI@ aÖ‡dÜ¿¶¾$Ÿ:€”ò% q Ǭc4Šâ½÷a;qÊVvïµNÃD>y ]z@ `—'g};ëä“’«€Ü®Bòã3­äÁº`c%¿šûxìþ,%»| ]”GÉ÷h%Kþ÷Ý-Zµ—ƒ^in½nGÜÿõnõK¾“¥GWXœL%®)Ù°v¨mij-#æ#+öë“ù+ô`溵&]Ssƒ€G¥ˆÍ±ˆ âŸì¤þø8m¯z]ÐÞ"re“«ÎÅ›úMnEn¨MǤ¹ÝºÎÅ¢ó¨ÖP›æ›âc;½¥i/¥ô‰2ùL:f›ª™ Ú5y0ßo³ÎïðÉÚ'Þ¶MªÑ¢>„ޮ䓓û© `¾“ó4ëxÜ]æ˜rˆ=åmY’êÝTs­~ÈÍVö¯sÍ 8rÔF3G©©n>JQæ†-Oõ”yúU}›J‡"~óÑhõÞJ×L Ì`™‡¯ÕÌóÝ¢ÌÍií–ÏÝaUâ`øÃ›­M¹³PìØoÚ ï:Œ-3‡õ ò'»ÎïV3àE•bMäq5“Ϧa®íj¥ k#MqEhªkÍtm¦¹®vªuuÐb<_é:…:]1ÚêŠÓ6¼sžk ]áÚJ;\Ûœ[:êc+~Sy^«þ¨›,Ãh­ú“NŸå4M{>·ÜÊÅýêÏïUŸ(ûÀ•Ò®Ä1Ás»N|í$wútWüG¶:ÉÂV~—Õ°ÕíŽc§z˼7Ó¨J¿G•y¢3˼:Î&åÊTSt¸>ؤþnž´ òA[OcõðA'œÝêh}/à_wº. ¯ëkÔÇuõw]Lc]—P…ëRˆí2šîºœæ»® ãñ¹Úu%­s]C­®k©Ýu5‚ï]¶ë›ŽîÅvõ µm Õ?µoW_o/ô§NÝÛP4––"¨2j«@!÷¥îÃxl›ÂâíqèxˆE\Õi|bXÈÇ'Ží¼2´+Ž'†Î ™XfS¾pjâ½à5³ž'ÿ „Ú³¡ÖVmÛºŽ.dÈØ Œ4½¿¼¢LÿIdæT9ê!Ò›Dýo´ªPø7FCÒé¼H·MŠP1™â1º‹3‡èýJ·ôÓÙMäA‚â»(c€nC­h Òü/…NóÇ0FÈ7J¶ÝÆ|ôߤ‹ßÐ{„Ü—;åÛ³>¦ÞŠ 0™šdÈ®Ó÷å~bò]ßô1n´€ŠG˜í›¦ãóqÌþf.ļ;§Ø­ÚSÅ™ï¸{¢;ã[‡©{#Í©Ps KXö•="ŒÓ9ŠQXýc4a”=UA—’$n-.g"’œ “Ÿ $GDb-.b’r¦Î¡ÖAÞðs6ÿPKØ}T¿PKB˜~; aQute/lib/osgi/Verifier$EE.classuPMOÂ@}ÛV X@ñE0<&6žA.¦&MˆÆ`zßÖ—”6i‹ÿË1ñàðGgWÃ&;óvçͼ·ûñùöàÇ6 †6¿[Âeè¦ùLºÈä£Ù©çÙ°¶æü™»1Ofîm8QÁ`%|!š“¿Ò´Èd22” žÍ‘˜O‡‘Ld1fhõþs}¿Ь«ôATa¢æ ‚:ƒÙ뮃 ”j:°QfhLd"n–‹Pd÷<Œµƒ4âqÀ3©Î?—Vñ$s†ÎdýÔÏ<]fÑ«S ®¥ê­ý’Ε]ÇO‘]Å<ÏEn£C/Y3•Áð<œ]“>× Mî¡y§ÈhWP¥¼I("†E¹1x…38[è®°ý¢[w(6uyHqDm—¨cŒ]º|·aûzxCË0Z$dh¤$MÂzÞ!Ú”•4ú(PK!«wMPKB˜~;aQute/lib/osgi/Verifier.classÍ| |TÕõÿ¹÷&™—ð€0Ã%™lìBØLB€@6Y'ÉF’™83aw­ˆÖ…ºVÜ*.´U”Rwµµn­{ÕV«Ö­V­ÚÖêï{î{óf²¹üÿÿçóo›¹û¹çžýÜûè“ßÜ{?MPÿr‘4È¿¸-(lÖ†£MÁÂ¥HpM0qQJ×Áâ¿yÓæ@Dj Çõ¯è4a¡?2CÑâ×¢˜1¸âdÿza[,Ø\x²?RXið¬H`M  4 ê›4«ÒߊÁôº`SÈk‹ßqt¦Õlö‡š ëb‘`¨iÆœÜ3ÿÅ6 áPÌ 1)mÑ@Tм³[] ÖÍ ¶Ñli Gb€Ù«¥qSÈi-vµo}[¨±9PÚìF[ý±µ‚2“ W5¡ÆvêšÙÕyÇ4Ð,ÌËh`€u­þ4¦ÿ:Á:›7kˆ22IX0qj§´¾±&âoj „Àà”OÐN|.Žt= F¯²²ªâÊ2AYI³"¦ÀÆÂ,ˆ„0)eé„Õ°Y¹ Þ¥áP4æÅ–ú›Û ÒšoOäzUŸÄõB«>™ëã­ú®O°êS¹>ѪÃuœF˜ËÃWv>t\ðG—•›%ÇUÍ­(«,®*ŸWV·diYm]yu• OÝòÊ’êŠòR>Ðêº%µåUó¹»ÒÔ c\éÏß\œ¿b|þôÕù'äf¯*èØ‘ãd&CÔÇÞʆm)\‰ùÖòn+°àþ¯ —ƒ°1¯¼bIYmu v²;k‹«æc§Œ è»¬¼bniqíÜšâÒEÅ5µÕ¥euuÕµvGFk$܈Ă,"“„µÆégÅžÙÐ c³±OvÎRP²4Ü0h™ Jç–æOXU0¾p^šíÃ!ÝÞbLè40aKuÝü`a%൴µpÏÊ àì–…µeÖð‰uº6Ñ©Mrj“Ú”- «UŸšT?fKM  ÃlsŸ±sÏÄ-Òñ¡4í€wb,¾l|-§•.‚qÔƒV›´ŠNÁÂ-­ÁfØüì® ÉéÑ&¤“ Õ& ¯‹ü01=+¬A à—FµéÍ“(`Òj‚dÏ´ù6¨DÊËs–tudUÁƒÖÁøÒX¤-°e¿9ØÂ6~‹6ñ<é“ZÓ2iOÖÑÇ&î{̤ Öý#ïÎÚjÐ]Õ÷Ûd9†¡¼º¶Ãû;{óË‘uèÿBÖeÁPcxCt:ìÃg˜†&cûϤ‘i}™hV-1è_‰f)¬å@»9qüxèû;tÀ*}›Xp|!¢»¹¨„ʤjV¤âS§­3„ '/®­\]QfˆtÔý‘–ÕÍCô²ëõ¨÷ÆÅÍ­ký†è‹jÐ?urÈýìêCx8þh‚•Æä ue°5jˆAè­)i ‘‚Ô„7"5¥†ŠÍëÖN6Äp¦X«?‚ #°¬nÒôñ†ɨm4ÄѨ.6eY®I5TÅi 2ƒª¶–ú@d‰¿ž˜»"Üào^ &qÛî„3é& çÀ £lcC •HÔ%“zbìŒd`ÃIðOb²öÝ@ê>ÑGlm0Êau®ÁŠB4žAJLg¸„7›aŠ™b 6,ðG×"'Ô/;§SÆ„˜cR:ep­Ø¤ÞV­Ô¤>V­Ì¤Vm¾I©”Ƶr“Sm†X$*]¢ëzST‰jÈ[S Véä‰C:ìß!Sd°‹Mr‘áˆÑv?-CÔŠé†Qf.Q¼kpxíì.ê …½ñœÔë5z1!¶6€éÑéµ21—8¾ƒµ©®?9Ðc²­0ÅJ± R„œ5Œ 8»›"9Þ´V‚MŒÙ‰¦X-N™õ¡ƒ¡Dz$hX—£'%O|øz“†ÓQŒC£)b BçõÌàM þFx_d3Ù=C@P#W,ÑçËÓ "µ¥ïdS¬ÍPx gDÎÙs¤–ÜÅè!ÌË¢!†€õ±3Ä|k3˜4”GcðÛYcþ‚p4ƃëMFC‡¦Ø$6C^€CI"'®Ñ9±»…tVÌ«·˜ä¡þ†8—ëä:¿Æß°ÎßÈgг]‚cœžèbŠsøÌöÓY&#qž)~"·hÂŽDqRý=Ak\Y.0)“2 q!<ÞÜM!K°¡#V< áO?žt p.ÛØyô2“Ü<ú3>‘Îå“Ot…)®WÁR­ lª Ä:+-ºfô;Ä5.±Äî0`Šk‚f5â±øì°¶Üî€]â—¸Dï:jŠÅM°:¡ÀF¾üÉÎé*î. dxOD]åoÁQn»Mq«@bÄÂE;ƒ³éŒCÜaŠ=1‰«ÅkXË™”̑ҵþHÄ.jt“LTZ‹fdˆ_‹»\âÎn²{Š)öŠ»m¢:¹[áûâ+’ð*i 6C6 ±Æ·<´ÞßlôÆ5Ë»V N‘7CÜ#²e¿Ñ-å¿1Å}â~v‘­¿3IêŠÂ C<Sžçmµ’¦Y òaùH'Hq{Ô#$^¹›ùØG4%Öú£UšÕ®@sÀºîqw…Ô×Úª2¢G3¤9©lв»¨s7Z¬“O›â6 .x+žjˆç` mcæØˆ^ââ—@øÖ§#dS¼(^+ý˜§ÇŠ^âñšK¼ÚAg Ô¦øk›sGXß\â¸O]Æc½ÄëâϦø ëFìÉ¢À&C¼³dÐañŽ)ÞeÒ £ ˆOññøG¦øXü]ïÓ]d{×­°¬0¢¿©É'çCo#ìm”s“·¥ ÂÇÎ ¼ ^-Šyk!ŠØè3S|.&¦5BM¼ 仜¾4ÅW‚#Äh[}ÔÖÆÙH‡»ÑG8öÿ˜âkñ_Ë×¢á¶HC©}'¶Æ§k8Á^I¦Râô`Pis8à­-HÁp¡îá ‹uE¦È4—D´9¢TÄîÆÆ@cº)]Ò€£®gÁ4¾û ª'Ôà/eŒ\ئ â¥Z½×ZAE8äíÊ„p ªI¿Ö¿>àå¥^(N Ä.–©/dSöåðÁ…d Ä ŒDÐ[·ûß¹K‘×e,Ë"9À”9Œë6̵eq!¤Y6e‹\¯xüÃ)*Ï©dÇ9Q ¬޶µ²rÄ xoDGÞÎJV¤÷nÊ£x_3‰ýQˆ‘ôšr$ ròƒHL‹2w é’£Y¨»(èŽ˾ø&—Ìîúà߀7ö™2Wæ±wnK’»‚nä®gÞ®0d )]ÈžP¢ž‰Ï™icUUßÐÊ6º¯/ e`#ŽWÑeàËBÈBu Òq¬»DìŠ5„‰80;æ 38eà|CÙ!ÙÔÏHNì™ÿ›ï&%?tƒžŽÉ@L+Š­òÇ‚ë†<Mu«‹oUYuJLYÊ>Ôh [ y¨Á%ç åÀo*<%^+\ÜŽ—p#¸NZ.MófÌÊer!ܱ\Ô}ðÞµg[2YiÊ*VÒ9îÑp Yƒ(¤ÔÒ*¤£E/¾€wM$Übk:Wä DHpµ¦¬“K,ª `±Á—²˜/5å2V£´ÀFH[ÔË´ÎíÅ9#~)ﺆ/'½Á› màåJS®b<{Åœ—ú£ 뉎2v†D’Ž®wBYoÊ ™f±¢uêé‚–Õ ÙˆÁ“Û¤^%½5†Eˆ†Aù“᪣ˆô*T ËxÛfS¶ðm ˜§ †Øû yJÂÍUu¡!ò¸MÐÏæMÞ²ª¹|ü 0ò þHc‘7Ô`H¨ã¨ãBëBá !¯?}ð´$n°mÃV0bòèóèŠï—"ÖËÆQÊ0¨ 5\ωó©NÇ©ä Öár9§ÜÈGúWédÓ2?AØ¬Ž—ç˜ò\f^gˆ È)¨¯EŸbÐo=K‰!ÏO?N/ï})·IdéÍa£6Z‚|?Ä%[o},>?5åÅyI/¬Ž•‡«ÁÜ”lúe‚ævÞ7I maK¾~}ôjLj†©o¿}2å‘Û,K€àgEoc`¿­™Iç:ñ Á7³…ófwžÑ`«^}ÀhÌa QïƒsšÙFv{`02„Ã1<>ûNS^#¯…QZ›õ«éÀìÒÒn’Ãò:Sî’È\šÿL¤±?(ОaÈ¡jšƒ‘„¹. 7ÛÆ—mÄs¦|^þˆTJߌK¾6JÌÑÍ­‚|Á”/JÄ”é‘@Kx} ¸º•ÕÓú¼Ý+¦|•|¯`tn[ks™ôRþÉ”¯ü_š‰¿iÊ?ëŒ3-ki!X}KÐ1Ö¡ dqµçK;?̧}g×M˜Ê’nÈ¿B÷™F½ƒÉÔéø™ Ÿ F ȱts6ü€Ï<Ht³¸‡©9f ŸþcD¼Ä$ûÄ”ÿ`:d£5F(„KûLÐbkv¤°WL劅½õ›`A7ÙV¸"%ˆc4ÄBï¸G©Íë9bˆ!ør—ü–"qÐ%‘@$É_Èq@õïïdS_ÃUò`ñS~ËRÑR‘|IæR¢Ã|3Í{(Óa’TŠ©RUG*ltáÝw¸EHÚ²—|Z\“!oSé¦Êà ÞJT­o€‚2MÕ[õ•×ú£Õ8u3[œ‘Ù„£S2 ™¦êÇ^ÚÖ½Ãñ‚¡úƒ ÂÙ¼`Ê1; 5PÐæŠæHv šÓ3Wú·uCÈ)04Úšayø³¡Ô¶ò0Òj˜©†«£@–†µþHqÌò×¥l£¬­“’³ ûfwþ‚ =| ²C2ÕÑœ8ñÄ;ûñWï\ü$¯AºÖôcÄ¥r’,hyuòc‡Ê5UžÊ‡‡õ[_“•tþÊÿ}¯ |ãú£š¯kBSg3ä±ä>ntç#Q¾ïWMyž~0Q“M5…µr`‡h §© êqè§Ž1å/­ÉÓM9ÛªÍ0åï­Ú,S~hÕæ˜òŸV­ØT%¼½ÛZ·©¥ž¡±Ç6Ô\˜[6ìuذ@CoZZŒ„C|Çpæ™j¾B†“iÁá;¯øÅuá‰åWh£­šjƒ3“_ U)¨ýp`¨êN÷pÌ<±ØTµ|2Û tÐòøm6¦-1Õq ðZ½E¼¶äh·u¿)wsÙê<©8g;ê2} ¯®5ÕÏùæ"+ù>¦®­3¢û²Hí2ÕõÛïJ„ω1ޝ¡ÿN!Íé ¤ ©õÄd(äÄ"/C–©§C¨ß'"ÕïvúNV=cªg〾¤CLÊ€× ®;nbt²Àj z¼€x%á(4šÞ Z®^2Õ6Õ©: bèkˆh“Ýþä|Úï›K#õ†ú³K½Ù!7O|Êcª×KÖXÓÌŸIÀo–&}¿?'ûú.bbö÷;Ýþ Àÿ«zñÿÜžÿñ†þvKûxÛl§£vÜË×~ñl{y#»}þÖŠ½Á¦úþ€`t!à&ëøIŒg|lª¿óŒþgÔø9 7‚ÑJ~”úß9ïÂ-Ì@¹N?®ÌÓßZ÷ŽVÀk€lyAo©¸@ÊËÊø³Gë!)…=$È=ÿã ü¥Rñ\dè2à¨j’LüöîÔî“Ôî‹ßÌNãý:µÝÚêï´àw`§ñAIíÁøÍ¢!¯¡v9Ì.‡ÓQøÌër$º£õºÑhIjE{\R;휤¶íܤvÚùIí´ “ÚãÑž@õ¾“ôþY4™¦8ãSÑžf÷OOê/B{¦ï,{|¶Ýžc—ÇÚýÅvYb—¥v9×.Ëìrž]ηËvYn— ír‘]VØe%Ué²Ú.ktIüQ~Ç@êh 0?"Ò×’ 5ýô7˜™y´\»>³03?5Ö-OÑíµhèvªnŸìŒ§év³3îÒíPf¾=nèvkfÝδD™ÖŠ˜!ÓZ²>sBæ«#]wlÌœ˜9ÑêÈЛM2{éŽ-‰SwœžØ¥·î83ÑÑGwœØ¶¯î87Þq7ýĽUSf›{ª./réòb÷¥ºÜî¾\—Wº¯ÖåN÷µº¼Î}½.ot߬Ë[Ü·êòv÷]þÊ}§.÷Úå=vÙn—ìò^÷oty¿Ý~Ðý°.eN^®Üõ`{-xâ>Œp7ƒúîÇArwˆéìneâº#LQwŒÉè^Ï´sod‚¹Ÿd*¹73iÜ[˜îÓ™î3qòße±vø=ïð ïðïðÞáÞá%½Ã+z‡×ô¯ëÞÔ;üEïð¶Þá½Ã{z‡÷õâ7Óý1~û¹?Á¯Ûý)~=îÏñÛßý~¸¿Âï@÷¿ñ;Èý5~»¿Áo–GPÝÝBfz4z‘ü<" z„ ="(z„ =¢#陌¥G¸MèÏxzÄ@FÔ#3¦1„QõˆaŒ«GÅÈz„—±õˆQŒ®GŒf|=b,#ìÙ@Ãw‘G$î¥ê^ÞP«bÑÔJa`æÂ”A!çÑj¨s+Tù,¨ñv¨ðMPß{ ºAm_€¢¾‹Y_QH§Åb‹!´DŒ :1Š–‰q´Tøh¥(¤b" Ž¡U¢ˆV‹9t¢(¡5b>ÄBZ+ª©IÔÒÉbÅ j«i¨§h¢q2"ÂÔ*"("6S›8ƒbâlÚ Î§õbm—ÐF±NWÑf±“N»h‹¸‘λétq;%~MgнtŽ8HçŠGè<ñýD|BçKƒ¶Ê~tŽìOÛäPºPzé"9†~*}t±,¤KädºTÑeòXÚ.çÑÏd].ké y<])O¤«d#]-O¦²•vÊõtÜB×Êôsy=]'o¡]òNÀ½›n÷âïAºI¦_ÈßÑ-ò9Ú-_¢[åt›|‡n—ÑòsÚ#ÿC¿T’~¥Òé×*“îTƒè.uíUcèn•G÷¨I´OC7¨"ÊùÚŒƒ‰ cøYˆz 1žÍ$¸§ô¨Ë—+ö‹‰ËáѸû^xÚCÄ@kš˜"¦Z¾LJP;¹3X3E{ë¯|ûÅ4ßQ´O̶Šc­¢Ä*æúr÷‰y¾¼}b/·],Ü'j|÷ˆš#”å;$j—ïK¸Ç#ŽS÷‰eíb¹GÛÅ û„Ÿ«þý¢Á‡á¦ý"x„\)»)Eí-ÜF×a§ëîŠvèjó· ûÄ©¾8P8­]œÑ.ÎÝ'¶&un‹w^”Ôyq¼óÒ¤Îíñι :nÖ>ÿ>У"„¾ˆ-2á¹@™î‡Çz~üAxå‡às†2=%yŒVÐaª§#ÔFÓVz‚®¡ßB~G{è)Ú‡òý+ž¦'Q>EÏ@½ž¥7Pþ…ž§èô9Ê/éšo^‹ß¾²ù†šö›’9÷šPb©ÇF~ߢƒ±»9àËÓh# ùq{³g±†×®ç/?(®Tµ›å× ªÌ{PÜ\”’•Ò.n)JÝK·d¥¶‹ÛÛůvRDãžåѾ_àÞCñ~1§]<Ô.µEp´óÛ½ TÇ"R$z ÑÜŸ€ö눿ހ {ìÏ0Po©×èDzK£=ƨ9t[­£7ÄÆ0]‹'@§!4C<)~‹CŒ¤Éâwˆ™R±Ï&iÅ‚â)>¦Ú‡hË~¾vñû Èá³Ãʼ#Ô/’3ï x^Ò²Ýâ3_d§ h¿,HS£(u·x>+UÓãAñ:Sã @žö .JË‚å«]üuG'07òÀ{zÞà}k"Úî <›pŸ0áÒ@²±²Ò÷|šÒØ.¾(Jc€Üþw‘+Ëu˜Ö‹0e¿ø¦ÈðeíâÛ,#Ëu@bG¦öNnÁ–½:Ö½s³Œ8r©XoÍËŒÏóH7~hïvÓ«ŒB»ìŸ•vP’´ƒžDGËgŸ!]ÏÐI İ$‚f즲¬ ‡ éYéq‚–±ƒÆá`É} ÈIírúäôÉqí2gCТµ?q4ò9GËÿΣ1?yñ79¹wBPî…Ub¼X-^¯Ãx*-¨ÏAüˆÞ@½‹dæ=$(ƒ¿ýãCxßàQ?¦ãéïPÜÐ)ô)­§Ïàw?§‹èŸt9Êkè ºþcño˜ð¯aRþ ò à~Ëÿ0ŒÞ‚>Aù¥Ø]‰T‘"2ñ{4Ê|á³…!ÊDº¨âx”«Eoq²è#ZE_ÃÌí¢Ÿ¸Y¸ÅÂ#îýÅ£¨?ޱçÄ@œbè7X| ²Ä7b°L¥e_1Z+ÕfN—d?[©R¥ ïÉ©Uo™"ÇC$ïË p> jö¨œ('Ay*ÅÉ©JÁÈ)r*¿Çh¶dCfˆT#§Éé¨L1»o;M•EX›.ÞŒÊØÑhÖ®°«µ—éì5“R앳ˆ¿€™í˜Å…ÀŒÝ_ŸGÎöVÀYÉâ„aéÃF'4àa{‹Â$‡ÙÇ>«Air®N«/hÁ•cÁaVÎÌ=,Šɲå¹9_í—å•yí²‚þˆ#ñÕ«Ü&-ž=›_`éÐøD¹ß¦q< iOò ú”6צ3fr\Šô(~â›8×@Ü+Y?ŒqŽÙ–³m—8#[#ÇvyÒÙÚuäwÖÈ¥ÎHBà,Õ¹‚†ˆ+ö]EUâjd¦;’bÝ`<ÖåO,,„E ̇?³…K5S”O·Ëg+8z;6ÞqPþÑD®æWån’—àÖùò˜ëƒò5Ay6/ÞÊ=(ß@%Ë¿XxŸ ¼=òm00·Cð‘`ÝDöÄâ&Ø¢›i4ÒµqTdÍ¿¤2´«ÄÈËï¢zäÃëQž&îNbáéö ûQ‹|G¾‹3æÒÑò=ù7°i¼ùÕ Ù Z³Þwf} Å÷C‡6ÃlÚlgÚlíL›ÙhÓ•\¶å©Ì;LCó{“™›§ ÎAùÏi—ßA;ÓëÓì ×TÄa$^¿½î‡Iy´z&å!˜”‡A¯G ê‡i8z=NÛP^&žH¢Ùv‡fgÉÏ5Íæ@´/×ʼúY¦Å{kÓLòG96¥Þ´]¤’_,O¦Í~ù•&ÖÖï%–#[3ò’-Áþî¤LÌŸ›o›fÓ’µÝÔÏ—¿_þ·‹ð='ææCŠ–ïWR·ƒJÁÞ(—eoÆÄí¼­Ê—›ß®Œýª×꓇jßƒÊ „Ãò¢Å屬ýC5 éÀ¼¤ùDª<Ïÿy“o¿*Àß_»š´ •©¨LCY„¿™ø›¿c}Uº—NTûUÙ2¾ôÚKÛP/G]U쥋SìzÕ^ÚiÍÙ¯j§Ûœ²®½]-=¨–³Æf¢¾ByÔ ÕjE ߢ¡¨zÈ%ûÊ Ár CÝ'A¶ÓD™EÇÈ!4C¥9r•Êá4_E‹äª–^„J#ÁÿQ•GÓr4#ÇÐùÈr.–ãh§Ì¦ë¤vÉ\ºQæÐnYä3oµ¹"økF[þ—ØYWª^‡5G˜ílTcB>ÝÌUäq†„OCÎ×GNIÊ¿ú;Á†©ÖXù¶fïð-tše¢!,©&&Ïlxr ŒÌr•[7°›J­¡”›õXs‡±qyˆN¼R•DÏu˜¤“Dt6¿A"ŽN“EÔ‚–…ÄsÊ‘H;s‘tÎ’ÇR¹,¦JYBU²”–!m8õÕrùey’(78¢Ü`. jhERå4Xµr"í¸akÌŒ©SX€ù3Gç:Ni¨þ$I­È=¨"L’¾¹ñV"f·oV’mÒÑlÒ Úõ)¢q_W×Wv[_ÈÉJð­ ǯF‚±˜Še-䩎–Ê%8úb:I.K²#~ûÈ&'Çëg×bh…ÄŽï´Æ¸&ùcOÛw®¶ooÃé¶í¥ëRl5ÚfKNÕ]ÄIŽ˜ÛU[U>Ö"ëubeµ±K¬ KeËCQªum•—•ªh²Wm¶WyÔ–îãìm 2U‘dZ25Q¹j„Ô¬£²™Šd T1‰ ÓÙ  S½ŒPHF¡‚1Ú&Û ~ëé*Ô¯Ãü[妤|ç6Ç]¡N×4+, *¢F’*˜…ñòô¥:²dÍbYÒc¥T{¼#K X¶x.KÊ=êŒ|u¢Îî’½é‹$¹ò4 ÏH2ãA4‰lC}ÃN}£Pun' =)7®¢qÆüÄ$ÄÍMðÖÖ½tQ^üj9¾r+VæuI8-fŒâ‡ey6˜qP>L8¦Éó©Bn¥åòø½‹’ä5êÈk“ڦ嵂Æj²&Ë+q-ÿž-¯3ítòÆÝ”v®¾¡pØÔ…;¿ý§®ff‡ÔeË-ŒŒÑ}…G]ÍA“…û~µó,íÀ€Ã§ÂßHûo¬]náÒ‡Ùפœ´‡ËëPV&v»ÁÞÍÞC[Ú3h«º‰Î¤óui±·‚EHT•üÌÝ/åÞ |h¶—òåÝð%{!ÀwÑl¹zßNs‘ÎGY‹$p£¼Î”ÒVù0] ¡ŸÊG!À$ÑöFõ Бtíý©ÃP‹ij7ðÉà¯í[6Ž™9jöR·"N½Áofžo(h2´«;–yÔ¯4IÚÕ×|û^^»Ú«AÒN•8õÝ÷%èÛ3Ìýq˜×Z0ù:o/m×¶c\êAçºKæ¡$²&@7hP·kS@´Êþëçšr‹‚o,­]ϹžÒ5Ï“¿ÏAüâ°}(A+†&¼ëÅüˆ|ÞõIê% Óó$ä÷)D¿§)òiš.ŸAø4Lϳ´J>'õ<5£Ü,ÿî½@ÊéùÝ,_†éy‰î@û×òUÚ/_£{åŸèù½&ߤ÷äŸécù}*ߦ¯õ¿‘zG¤É·Eº|Kô–ï‰!È<²åû Ó%|qî£fqߣÔ#êQýñË×ê1mºÎ¤ÛÕa}U“Á_‘Ú†ä!6W(O`ª§ÍìAÇr:èØ‘ïб¡h~z#õŽëæ··&Q'òï â' â?¢|AýÉðg¯>!ÿ þ9• =O~[þ%ìøWIaÌ Ž¨Ÿ`Vòÿ-’}œYv ”ÎO¢°xg$.–ôSŸü: Tº4¤«'´É—ü¯*l«S Jñ‡3WÙš ͺ‡NU{ø†¢ªÚ<êÉýêwE©Y©íêéƒê9¸Ê4d%Yiq«š§¥¼Ü¢ÛóöõýbÉúu:§^´¨Xä¾Qi–˹ûëoÈÞ V»ÄSQ”NKjöV’Ü i•J¥1*&+•)ar:­CÙª2(¦zÑYª7]ˆñ+T¦&F­uL‡Wi£Ìžç*õ2 ŒÔ£+i„¨7¼Ý©ZˆÆPD½"7@|&À;rªF­4T½ŠQ—cЭ±0–Áÿ‚½3—r}–¿ÙÓ‘Kª2—ô†—æÒü$.)ý”Ù-—|Lás™9I‘Œk7ù³\qö¥åñ •åô~— ‹KF2—Œ8—\6—®éÂ¥ÁàR¸4\FÃÔpš®Ž—F€K^pi¸4\.—†ƒKãþ\F§ê&•¦S­xR_¡Ç¹d8\²fñÿ9œào\m.-$v.vè™w'W"«×Z¥Ã•K.•þä'ù$ƒªGßÝ3ªõç õ–zÛÉsÿª·»íT(år˜Çíùüèž•²O”$¢×*X>5–l*õUÇÐ5-)”èì*KéM¿#G pׯ †L”³‘Á°…FmŒ  ªh®©´lÅ'‡2Øw=)Phúm×;peò›bÚ˜¨ôm«ºN© Ö¦0“Á´@¹ÞF³ƒLQ`ªÖ³õ—# óXÈ "0ö ±½»õ±-»‘òµEã'× ”&Çm¿ßܶ´PŃ îSø¿§eã¡¡¶=?d‚£ÔüÇôeí%=¿TÉýácÕ0ØÀ–6:JíÈèØïØX…òߕz[÷ö˜¨-ýÞDß~ö¶Ö2ØôÜ0”!Öxo)>Ô|Þ\#/˜K4ŽXü‡Ñsæ—«/_®¯\"[ÿ„üyãl%z€"#›1á(a<©O p#õÈ4×Fý‚JÈ^aò Õæòæ®Ó{g¨´ÎPÞé¥éÖÊ×[É9{Ų¼´1Lc–+-p^ÄV˜;x‚§\¯Û{̆L;Yä9²V$«DFŒ"%<Â$YE²JxÆçelŒ'¶76rl¼F}sfõÄú2™`uŠìµäDbœßOPK q–BPK¯TU;"aQute/lib/osgi/WriteResource.class}SkOA=C KµòAÙ¶ÈZß „/L‚áã¶˲[»Såga¢i"‰?Àe<³-¥€t7;sçÞsÏ}ÌÝ?ýÇ }3Þ‡†–nUÝ ¬(÷S]iùQ†A£^’âCGÞWÏ­z~ÅÝ)É’¶¿âwî"ªz¡Þ Êê³’eñN !OtÝ.\píêºò++ÉUå+½&s2ûñõ ,mÄNa)tAùr»q\”õ=¯X•†&(yÕ}¯®Ì¹­ŒëC Ü+ô*ˆáÒAMú›~­¡™ôŽYŠ“i奷Ë@¬½qR’5­?´0!0Òít,¦&Î ïUM–»HlL"maV`òd§¡»03¸oŠ} 0ën¢ZÉì[xÈ {¸·1‡ÃöH`ÕéÝÂ9­˜«ˆÕ”/0usFìz-hhéL}ùê÷i(ÓøfÒao.ª¾ž„“áõW¤Þh ÑÝóëê£g೜´õ9V“í¦bÆçU z#ø"¾làKœ7Í54ñ ¾BìÊíÑŸnÑõ¯Í¢ÅÄ¢ªÐ×L|]!ïYµJÓŽ+«•(…ñM:ž[•±É‘ÙôâÄŘ¢L,®°ÛÄwT§ô0ª‘¥’“£b5Œï‘õ‰XIÊ|)–q\·\ôäò@Lº®ãÅ"˜Å÷Mü@éF¨;-K%++Õö9?8º "—“Y+7âfË O­sÂø1 uÑu8tó15A¥Â¨Ì¿®ì¼!ð`}ZgoÜ)–k&XŽ¢OÒ·mgqFÈ÷h=¹yšo¥½Å%uèzwÜ”êRh? (zxêâ¥DÿÎçFqëÖ9Þß™T»‘~V}\wmOªÞ­9¾Pö¶¼êõßã®?làB¸Å!ÄŸiÆ)òƒâxÓ«q­¶ƒSöTx-xÑ”j÷wä²¶5®WoÝ­zLéò§1þ"À+~6@ýãGƒ~ó“A¿y¡ë]¨£ôn®nQ#Ä÷@r}ÉÔ:ö%Ö±?ydÑ £Á÷Ñ›ÜÄ‘…hp\Ç#ïP¾q>jO»h£‡v{¹Ú=èC”χ°)ìC‚'‰Œ>äôJaz¥Pvè•ÂÙ©u0H cHóìÃ< ð×cñ)î(M3yŸ`ïc'îÕ…ôÙíÕôåª^…ºàªQ?«³¤61¼Ð÷äžRÆ*­`¬o‚ßîÇÔÏ)>*˜itq¨ÎEªê¢‹wÚ¥*àß³UÈÃt§B4’)ñ.æMѦú}<‡ëXÀ"Ï•Ñùf£âŸÌ Êþæ&N.¤6pef°‚Oîàùhà¯Xø Þg!£AÌêP(ª p ¡;8¥6½[8¦Þ×O‡úC]¯½‰®TŸ>JjMˆ…Áh°?´—|á9eø«·þs{ðÞÌ&ftþ¾ÁüQí[*[ßåƒ8^õ“¶×Þ£Üë¾Ü¶åôÙOÞÓ!_Ãu¥Þo“Ž:1ä3Îà¤SŠd Ùùw “O0 çpœŸB'0CzÍq÷R#Ë÷‹Ôɳ".ßeý:˾Ƽ‚3xOâ ®ßÆYÜÆS¸K+D¥ °¢Ûe³V€ÍjÔê§x“X»ˆK·“t_Á[´ ²iMá ±uÓæÏX¤gð0~Nn„è÷Qü¿¤ÆmFô~ÅÕ¯«¼ñmÜÑÔþ ~ÛDô³ÜQù %SïâwÛMç·Ë=Ž×'Tk®îáZêF­>]m𠉽ÛÀ¿‰:*kÝr¸Ö-imÌW~¤‘¼Ó-•ÿŒ‘ªr];F‡Å%ê̶‰B+åø/ZçþPK¢çàô:PKXu%9aQute/lib/osgi/bnd.infoËÍOÉLËLM±5423061²°4573â*K-*ÎÌϳ5Ð3Ð3¶0áPK_P)'PKÛA‰;aQute/lib/osgi/eclipse/PKPK¯TU;-aQute/lib/osgi/eclipse/EclipseClasspath.class¥X x”Õ™~¿É$3™ùAP ™$ŒVI áb4„˜Ä@@Ä?ÉÏ00™æ«â]éUÛÐm©k-­u+rIŒÔKÕâe׺m×ÝívÛnÛmݺÛvín»ëÚµûž3÷É@yžåyÈnßå¼ßå|ß¼ñá³Ï¸D>æ€M°Ð¼.™°ü¡`Ÿ?ýV([þÕ©oKȌǣfb»vÁ¤ænÓ2Ãÿú¾VB0m ÒŸ´Â‰•É`hÀŠ­1û‘Ø^¯Mò †üQ3·bqÿª’g›¶>Á…š‚GÑX$%ú<}ÞŒø×C·*÷Db;©m¿ÅcñH2ÖoÅSÇ’‰`Èße%Ô¹®` l&’1ž›S¸»¬ç žv™¡PW†Yen XQ+<@í¸1)O[0®Äx‹–Jð®ˆ$Ñ$ïâˆYýI^Y ›8³†¢‘˜bëâm£V,,¾É:3JúË WÒ´º±`8Ð4~EÉuÆ,%ÀŠ f·e= àÏ,û;Óx$šF”/­‚ }‘H"cÕú­=Í­Í+ÛVwq»…'f8Ñc†’VMöŽæî«žÔ;P'¨9Wg2ЀEwØÚÓª5QÎP_S{îÞX ÁÅÊQáÄGèe5››6mÝRWë¯Yä«uá2,vàrÁô3ÜÆÀ\AØú#ƒQÚYÐP3ÞµgÄB‰o4pæ+ƒÃV{r°ÏŠu›}ŠWU[¤ß õ˜± š§+–¥¡[Qsvc:`á¬U¡îZ=Ôo¥Ìí@³`JNñìŽ eh1° X]µÝi \mÆ·3’\X…u™« ˜ Fט”µ˜Œ ´gDhúæXÌÜ«"Å…u)Úë TaŠu˜†éjt½Švƒ`rŽVIe¸Ð“¢ÜdÀƒóÕè^LpáFÜäÀVzlþµ ˜`ê™°-f8Ý5Új“Ò>“Hñ0P —m3àN¶˜… ”«î0°!‰ÎWä\‚ùçâƒZ=ȧ‹£¨] m¹>NÆ5…*mÒ‘’ØdpÖ¶c&g´-ÿøImÒlr€0Ñ/«ýe*Ø $c¦òš¬û8p³`F$ÐqRv5oÌÛ½5ãغ>»áÄmtÏEÙÌ£ìy»Râ>5¥.·uþ€»p7ãÅ¢“ÅuªÙäÀ½‚ òéÛ#‰5‘dx O©û3~žÇ4m2'ÌÌ)æÝFÞp$áݦ˜4z]¸•¦T—JZ·Oø$>ŧ'6÷Å#!š§CgØ©GÌ'RL6ð>Ãë˜Qõ5ÑŒ×[³6pHIu&"©MîÁA>Ã|A0÷Oz¬òÐ/ ™ ¶MYxÏ¥ýþÈ`–¦É?Ç—xŒ·*µoàq|™nN 2K«C–úÿšBžé&'¾Â$…ŸK±½n<'ø]©‰¿Àש¥¤Wâ+÷v›vs1æ+ b>›v¾Lú‰wà¨`^îtk(dÌPs,R=ç»Çhæ—”[ÃÞB}½Á°·Ð\x Ý8‰QFŠÐÊÈ7ð ÆÿÁ„5¨\«u¼šüžsàÌgÅ{žÇ |±•Ã%xÏ>zcbVÎ •u^UN|“wò* ¼là|‹aD‚«jÎLw.~I毒W<ÖïÂëøKÞ((8S‡ üÞT¼+i†âE•ªI›j79ñÕT`:ñÖ-~Åñ{þo3‰°*`mµ!¨‚«d@nR—û;ïóçåR/Š’iæ,I§ð€?ÀøGzka]hàGêNeæÀ€ÿ¤Îü„f)(Kø0[;ñs•ñcIˉw·©BÑPü¥wÕ'¥Ài „#1«ÅŒ[*¿ü›_©HW×Q¦qâ7ähY‹œ¨®äþo üþ“rã#Ýd%Ô²ÝäÓ#-Šõï üþ[—©Ñ®¯§Õ´´”°¡z¿þÇ@5\Nüv›1æ‡þH^p¥é{ëygNWÌœbSÓÕ·6§° )ë„RaˆCœ¬Éy¥6+PödFg‘Z–ˆD Ó6m¶2v(Ô·tB"„aúhˆf(>“ s*$7uN`Å1Æ÷™µ[ŒÞxþ™#@QŽ»­º[²¯#ÓДíP°Øã´³2óðr¾!3Õ›å Æ3Ï‚Z¾ÀÙú) ÆP´ x ™+S GÖ‚´œ\hÈE2_­&ûâZj:UŒSÆ! Y£ç¹^îŽì´ÂÁ}VÌ% ¤–ϘøØ4–°\ɇ4õ†4(Ç« [C ÍM­ú ¹Xé?a»_G7ÕñJùˆ\æK oœ ÎËe±òØ!ªÎzI%%(Ï2é,,»g¬)z~Óíâr>wºúi*z(3Y㌥S–³¡ðf›ËåN¹’È{•CrܬÆÊÕ–»¤EV;dU^“§Ÿ!kT Àþ•K¡° ø¾¸nÅB¬vÓ·Ê#©žª"fÅ“!:„Myå̶3ÚD¹^BMv²ÞÀlÌa"×Ò)lƃf¢»*>/Í¿° ì.拽Q‰Fd]ЍÉ%סô”ètÒG Ù¨l˜W› ٬ܭ<‹$£nÙ"[rcA:c4ðÝ›rEÙÌ^r +ôù|>¦ÏtQìÝn…hîX£×-²Í!ÄrÖÙ \CBœËéL¢SSÂ7—P­Ç);äÔ$áGCÁ<éÊp^fŠÁR}nRFAÌ4ye{Ÿ©~ÞN¶¹%& ‡ÄÓµq©bHRv³IgðVýî/8§zE2dÈ^ŠšuN?4U¶ ëòGíµäÚûÉ5ù’úùdnñZ‰6TUÑ•MÛ©½>ý[‡Ú[•÷ÓIU¿tÊ7n±ÔO3q+Ñ™ùáÄ^£Û!—*ë2?Ÿð5Ktäý‚’i ²?¡(Š+ŠÏñWE:­°ßʹ䪡\YøK‰.´ò~Jr¥F©Ú¢º¸KÓ]æòÍT?¢L†Sý õ½¡þ²Õ_wúË&›§ÏãȆ‰ü;©h>¹hÎÆ:;ŸÊ¿Õi>l³õwFÑy¶ÓÙùLþeÓ«Ï1é请༇ºÏá|žž_H/Â|­• °;5œ5ñ«þM|µÇ᯺ä\zKŸÖDMZI;ÿN'Óxý²¯Æ2½ ’²åèJŽíœ]¥XJÏ–så€o+}§°ªwkNbmnØš^Ëá:ןD‡Ï~¹­n{8Üx½¹Õ;†l9‰~_½þZ¾º“øŽÁ?‚àI ú|'ÐoAÄ'œåî±’SÏ™g¡œM8æàbÂt9AºŠ]K`zp_þ¥Ø†Fì$e’·ÝÏ{ÞÉ›ª{_–ºâHhàh3ˆ)G°é‘r2=RƱk¤’ÅHázòRèVúêêÊF±;§nŠÑJÚªE‹õ¥fÅVfÅVfÅVfÅîB,-ÌÉùöá%Ð>™'PÄÒS¸±·®jÿ(>ÚN8ï<„Ù§pOï)Ü×[õÀ(âÚÇGðé|vŸ{ˆråÏíûeÃWmh,÷”¿Š §ðToÕÓ£8þBÙâŠ#ò=OyuÅNpßáqŒáYA£ÓçqV½8Š—+«N{*GðÚ0¢jíÛjÍåqUýõ¾;Œ‹•õ¬:kÛèæ¸s.ŸÇ]¦ìy7m>†°aà nõ¸ÇðcîÍ–k8_›™‘¦ªŸ¦Å†sb«þYÁñþe±{Ö!8«ÝÃ21Ÿ¯á1Fð¯U¿ÖêUqc³ÇH3ÅDN¯ÍLI‰·¹ÐÛ?]õïi¡kóï:É ïàw._ž¤“x_±ãÿ÷SôŠWnvCU¤¹Y…Š“Mšû(þ—@p6E$=5<îÓðjEÓ`T»†µæÝ™q35\YÍ)R¦…m8P!Õžò1)<úᜃþž tÑùº™#®§—÷ –ßlÄô2Z6ÑË{±7  [ÐÁ¨êä·7qÅD}ˆ¢Ÿ®9À(±pÛñYìÀ㌺'Âq â[ˆà»<õ#:ôO?ïÑ•?À^)Ç>qáf™ÈïTÜ"àVña¿,Ám,ñn—NÜ!p§lÃ]e´÷ÈݸWfúî—x@žÇƒò2’×ø}å, ßÅÇå7ø„|€O2ž>e3ð°m2±yñ[-n²]Ïé`|C¥kÛÒL0r¤OÔH*™+mpÛQCŒKl6q‹Áð]+¿• rC°W~LÝç0Ÿä%™$“ù¤DeLªd vŸ<Å&*y$>oqä"*^Qσ›xÌ«jDÌÔ.ÿwâÊu…¥2»ïܘÞ}“VR».Þq5~¦ißÅb™®ÎQW6Ù©Ç@vQKõ´5d}Ô®2…Ç>*3T´ˆgç©ï¬aÐ-ŽzìÇdŽŽÉu<`·È¼FûTÔ7–Ÿ’½zTj+Ž`º§bDêšc¹ÇÁäC®-:ôÇwÈS¥¡+É%* M‘%LC*•ÈÒ)²ŒÉH…Šž¬à„éèÓSä*þUÊ,e¢‘•Ô'ëží|[/°Ã|¸¾ÈÄþ(Ýó1¦ï/Ñ=gf=B0¾Jhž K~Žù$ï æÍ§è’G ýÓ\=F7<ÊGï¸6{g œl“µ)³stu:I+A/£Ü¯køí”þ˜\ÃÝrÊÚ&×J;dw¤a[ž†¿…;JÂaß i·ï?„r9z KëF¤c]ýˆtc{=îm¯ç{íD¤·aLn°áE¼®Ìs Rà*sUèa…Çž±¥Â›ù(É)ŒMb\—ÊóeÏ¡lLúËËÜÜ`‰’¹QcôÔgyáoòçø®>ÏBä/òµý&Ͻ„5x›ñ 3Ài܆×ðy¼žèá, ‡5dlÞ“;%D)^lÅ4  ±‘¥½t1Z%ÌQ9ùΡ­ ÷2FºKú óFª¸ r¦žÍêºú1ÙeC{ë Sb¶G»FªÄy“Ê|›ñ/õ¼7·:«^µì“)ÚÞÕr3°‘b‚_¢"·È­\ÑÕ—ì×âý}º\¥ßœ¸ ½ø¶a¤¤EˆÜvV&k‹™|¿$“2µÊ8â÷‹‰X’øv¹#«Áã˜t3ùII&ä®´ª.iNnîŒgzRÜ?£ÿÓyƒÅ ž©§ kWgƘW–'ae2áÃI¦ò¥ÚÇ32|›ºRqЍ´ŸgWgj›“Ý퉥ñLb™yÊuy­íÉÎd¦^P\=µ…g_ÒÕ–ðc¤`ôÉ70Šðìà¿ÆÆ¶¶-[::Òé³›››ƒa´…1¨¤ó¹¡êÁÇœÚRÁX e®0&;M=©‹ãÛ ô]­ñö–x*©¿ÍdŘ ²+ü˜DÏå`X”JÅw(ALÄ|–…R ÕÑT ~üˆ ÎÈ®óÊDÛŠxz ýDÄÞu¶… AfK’ÎTÀîþVÀ.8å²Ót¼ ÙÿÜ;º Õ´\V× 2ÃÂLÌXñ¶¶EÙp%*'µ´¿‚[@´@’ükPó,ÌW©`‰¬C°‹üX((íwx ‹±„ÁÕÝÃ`œ]=8ZÏLJVP‹Í ¸€¡žé²W FTO-tÀòBŠGPÕ ’›p‘«H;¹Ç „bs"¥ Wkà7T3ùGŒ¦™1=„‹5A.É…bÞóB‚Ë®‚a— †ög —áÕþ YèÖ1ƒÓ\„`0MÚ)¼Á‚>Jâ4™ks"Ód¸Óâ(/ô¦â€ÁSD›,lÆJ¤„O~líGôYGÏ>½<¥QÞa¡ÄÇÛ–ØÔ®U#Þ™ÞžH1ÂóG¦ž §¼B0kàÜiÓÿJw’вËûÉqŠÀ”A“Ë€ÛëæA²ËQ±6•Ì$RAlÃ?®Éò(_ħ™ìÓ¸V©ö#|î ÈöC‡c>jázÜ@pºuŸ \ݰ²€(³zVŠÒÛ•ß Y3·0Ù8x!žš 7[¸·’Tg<Ó•ÒÈÎßÝàÌsõ'p›ÿLø?µp;>©M+ã@*qô)@wZ؈ ‚HâÓ>£ÙæK\ÕoO«ð»-|{˜0[âé&#‡Õ—)WÜ¥4)]Ä=/ ¥í£ú±&`qϦMê³û0Aõ>`á^|^0f0TöJã’ûl—lŒ:Ù2]Ôká|AC¿»;ÑÉ\ˆV";ø"Ôpú’†K¥Ú÷¸…xBÙ¥;ÞªÙ®.8†cwà+ºñ«„»zÉÔå‡> qˆûYš•"úg§è¾§q³GúÕ">PõÿbáMj_"ÝïNðMœÀ×ùu–zëE ßÀQº&ÙÙ–¸zÕ¦“40 |“[&h`½lá[ø6mL'¯IWš*ù] ¯à{ì í^,“ÈÃoàa â¾O'Í«¥µjŒ¦YQ7³(TPsñªž.e[iÕƒüÈ›Z÷<ס?±ðSüŒÂZ·ÄS‹2ŠiÃÔ%AüÞòãß³T`LXÂñÖŒ–²_àmÒy2½v µŸÙÎXÀ¯8šÒž¡Ÿ££Í:ú-͘ïèž«ÿËÂï_{¢ss†¤îiOl¢bïöd›þ”´v]ü”%nÔpû“Æî’“×vjô$ÚM+9#,éj×…É®Nî\pÚ‹ç¨xõ&¯ÿbá}üU0¿Pi)P&Of‹§;®¬ùÿˆ9©•ôÞùG0G«‹; ƒIoª¨lcÓ2ˆe ©4žZaá­­ˆŸ1_[Ë`’K‚2„Mg:OeÒk“ _ÁÜ\§ËK™Ç2”±VÝРù˜”2K†K9ó1ݳ1×Ú4jÒ–„„÷ /s·•ªæžž§ c]@xa’Ú€Œ@m©¤-X±œŽëT"ÝÓ®õÞÛº%ÙN¢Âøî`ÊÛíTI*ÑWHéæIz´Évþ6ä,£½3í—©ÙkN¿¼¡ÀD* ¼ù̺º Tc4?„WžG„üRsš´n$ÍÕí+¢é–œ«d:rm[“híI¥“Ûy}Ó4žRð|ô™ièŠÒÌÞ¢ ?D(Ý“J*E™¯®°5d>,T 4ßþgˆ,"¥Ëâl?3 ¸7žÓê5Ô­bã›ÓnÓ18£ÿ‡¤b{éZçÔe2–\ ^8 .èSP˜å4ÊÍʧzÊ&KV*’Eiû©¹ÚÎ÷¥ö ‰`sWOª5±,©7Âí:[`è?^zùY¦Z>Âqô2Ák±û{×ðþÍñDŽÊQÁ'#økŽ‘”AèÒò3"üT=a¶œÉÏrxø9†Ÿ•T6z×gž‚x÷wÄ´QŒÎ‹ÄøÈL¼ô &?…)‘èS¨æïÇžBMNòHs„ñ”<ŠÆM ”‰œŸd¤´e¡Ö9à8sD1§ñ™}¤sŒæk¨Y0º æ¬ÎâÌÍ™5Ú¨™ç˜5Ÿ¢ê9¿€f-̃p²kÎd×œÉ ›€l¦kÄ*LjÒÈWQF}1Öæ”M ,#ÎËó„—ºÂK±Ô^Šó]áËáëá¡Ø1xž°5ôaù@%vx7ò³‰î[Å­å) ¹ÊB®²•]è([é([ã(+3z*¡±ðaZˆÚÚ<ùe®ü2W~å×9ò×8ò/¡}º¾ÂÈU-°%6:‡çIŒFžÂúœØ¡ÆÄvŠíà¹;óDwEGœ#Í –#ºÖü&ÿQtõWœÏLfŒ;O½ŽÑ»½³y±c×Pæa$Šð’¥ìÌ3f¨kÌPC•w¥#ïÃ\ã1Îö¡½©æü±^xjrmôvQÆyY[Øù&’}ÜÓÅ‘fm7®r/5èø5 ¿µàñÓ„%+¤g)…ÜQPHƒë€Îê™FÁ6RÅÕ+#ÅG°ãÒèAììÃuÄaWN¢íä=<Í^&Ï=y¸f¹VËÑØm Jã&×Ð]Or¤¬½Ô¡©F2Å? ê<½¨{ãウšç!{®yÒ‡;¨ÿS{0$Vc.ºK°÷ÄbjUq•=HÝ‘÷“U&_>Äèx$ÏGK]-eª¤¿½[Ÿ×ˆùKÌùÅ]x÷ãGôÉ›8‚ãëø g~ŠŸñÿÛø9¯æo²µ~ àRÌ[~ ~ÉKɯå üÆX°F[•õ/G¯±‰ý?¤µ³±ÂU1íšaJ®—£î÷a¼nÒám¶ÊÙš´¯ÐZÒÊ'ÚÔÜÏ®g¦7ìéÃužâ™¾^Üö„èªÏô‡|{PòÂÏ÷`tÈ[åk{åQÊh%¡,žé ù¿hâo¹Ie0N¹Ð®D;[°#!·EËÉ=»½tç¤hù¯³ãQÑòÿ0c¯&CÈOGìöÊnŸ„|jÐ>pb{Î1ë˜À;<Æq:æ]:æ õ?’)þÄÒü¾ÏÖçϬ+¡SþÊö¹úx}Æ^Ư%̻ă›Ä‹›ÅÛ$@^}û¤48]–M¨û ÌbF¿7-€ŽÞ1½›ŽŽs½‡ÖìÅsÎKž¹ÝtvÚ•o#ôïjÂéë.‡Þqx³ÃáFm<[¢UŠ´'ä1(.Ìq¦âÄXLA|xm/ÆÆBˆ)€: ÆBDìkwKUÔ@÷H¬¥Í$‘A*(•FÈHÌf,-0Ë4H%VÊX4Ë™h‘ñ¸œë¶ÈdÍy¶á.4æðJ° Ã:E$Ã+œ¶vË’^ið©Ó>üe\£Þ‹’¨áÊÝE'î;ñÞ€ÖOb(–”ð»LÎÎ#ºü$ë—áôºÝšñŽêV©?…sû?e úßUÎË£t¿+Úϱۉ÷@Y3Ó4OÏ4Ü){M‘h >Q“«a¦jÈlB<ä.¯nå[ÿÓ[ í+Šø«„‘9´_ÝâŒØ-æûŒ\ÇÆ­R¹ÞЂÔ#Ñ ñõI`º¢eµÞ>±fz¢Þç^5zÁqŸ «óæØÔß‹Ùa¿aS2µÏpæYaŸ’f BæÔôIÅÒq8à”ê@Tùý„n2Dúâ*[;âô¤´â >u×y+$\ç yöad´ØQ y<údL/gF óTƒšáûѰ_Í( —°aÐzñ)Võ0%V™æÁ —„}¶)Ç”çr×ÈÛfH=‚²²Õ²˜q½Ëe)šä|¬“eh•帒ó=r!)¡ ‘U¤‚‹ð1iÆír1î”Kp·´à^Y‹ýò!<.—á¨åårüP®À[²¿“ xO.Ów¼Æ¹»MN‰ËÑ’u®³H›©›‹Ùä·š ñ š-ˆß°õ^uµVû8S%ãø ‰¤œuw¢‹y¨ëîÆV™`Xý(éNwø™ãÍŽ’Ü5Xµ2l˜úîÌáù·(IÃç8ƒõŽ:Ë£Ôù¢Y\½žÇ¢eu}2‘dï߇ýæwüæ7~[öØÏ¡À>Œ {ŠC]@‚lÏz¢JÖô—·ø1vÛUa6û1"ì=ŠR»°Ÿy {¡´¦B¦°1×¢}Dª/­ÈAÑA|Óø€1à㲘.“s¸,–·Ìç,“sê‚á`¸d?Âá ‹t¸D•5z²ÊÜŒßÊú ÙŸlfbm%[1R®Ä(éÀ8éÄdéÂÙÒY’ÂBIã|É`•ô0j®fÔì@Bv")×âF¹ŽQòQ<ÂïGåzvI7à~¿*»ð†ÜˆwÄîºm¼Ý”?N¶±Sþ¸ñX‘ÙQáÃoe†)$%¬ý3·-v³Œ·Ç±Z7/â‰¥Ž³bé…ÁžãL©3¨ÈÜl™‘¨S×wJ#½Ìï…úª{06ZeœÕXµC9nS×öÂÏŒÕþWêë˜cÄzVEÈÍä®[˜œ·b¨|‚Ð߆ÑòIÂ~'¦Ê§1M>ƒ9rVËݸD>‹õ²—‰zõ^ç SGwºpît’¬ˆU}‰¹q]‹Ï4\(ç3Ù=L¡Å¦4yÙ°6íÏM{Õr®YáÞ nqz÷Yî½ ¯‡?#¯‡ßËë“·kÿUÿ˃éÜås, R>‰ò ú¦Ëþ¼‚6˽HÔ:{%Ùäu»s—•®Yçš”DLÃ*KÙòî†%Ù»¡¾ÏtÜì®iv¢Ï¯Ü‡qÑâJ&qS$—Y5nbˆØ™—ÓcÞÒÉ—à—/cˆ<Žr9@Š}2¯¾Ms½3ÍyÅäç‘—šê\N¯²ïÎú¾Ú±ªÛiÆš[zcì(¼±<áú£æ•Çú¨Z Aícd$b&Õ?M€ä:Öµc¬c‡£²o£HöYP¯pºƒ±Š©eÞ˜û0¯/ôcŒI–œv»7y–šŸc ?OÍ/ä5Y­A6UKM“.²Ú}“SïÜ7}æeÞ€w8r ^ùfž,Ÿ{_öެ1Õ¿ùïPKÈ©s ªq'PKÛA‰; aQute/libg/PKPKÛA‰;aQute/libg/generics/PKPKTU; aQute/libg/generics/Create.class••mOÓPÇÿ—ÁÆÊt0 Ä ZÆC™ÏÒ9‰1¡j ËåU7šQ,ÛÒv&|+}…ÑÄøÚe<·Ýv×ì‹ööÞs~çáþoûçï_²Ø`ˆaNÿÐt Å2ËU¥jÔ Û¬8JÁ6t׈`˜aüTÿ¢+–^«*ï˧FÅeçÌšéæBòj‰a¸P?6$„aa†¸fÖŒwͳ²aõ²e0$´zE·Jºmò÷öä°{b: óÚà TŠq¦7&äUÍK¤éš–òVoÐJôЬÖt·i«;ØÖÄLÕRÀ\^$åŠj±¤æÕ&f:kTÅgãøîœ•„¢”³e:ÔDD£9Êg#W¼27Í‹^´Y†ÉÎÊ®mëç|YBŠG 9†+Ö}hð8ë׈C–—aÀË¡E idE>ê'”–òˆb—'a÷"X¹P§F'†ûX$é7`•!Ù±)Ô-‹àf½Æ±Æ%µÎ0+kA&*×_Ø©7í ‰`2 †å«jluuëš%úå-\#ETês†YÐg¿^?ý‡FHtt¹:ŸðV=åÚ3)ñ#)f3Ý{$Ï—Çrf@ †%YTF€Töô1P%ÁÚ!Íôs§˜ö4žoeÿÖî\’¿«[ÝÛ¿4l(zb|mòV޵¾b›Ü‹ C ~EiDJºGèM¡'£çHæ£ßh0‰îáÖ$Æèkc¸á¹ßDœ¬Æ=Û "Óˆ_£?‘øxäW3êq†<ï)LûÞ3¢wмçDïX—÷-ÌûÞ·Eï4y/ˆÞã=±}ï%Ïû95…[ÅyìÌwÜý ù’ìjDØl'£ø¸-—îà²".ˆ{€‡>Ûo㢼¯´A9(ÔšïE ôÌË¡{f»V}tND§8:#¢ô‹>t¾~é£wDtš£³"zY@ïö¡÷èI¿UúêPK“TÛÇÛ3PKÛA‰;aQute/libg/header/PKPKTU;"aQute/libg/header/OSGiHeader.classµWkpTg~¾Ífw³9@ˆ„²-„Sn a!”B„,¡åNJH€P(´Òžì~Ù8{ᜳ@K)[©w-* ¢­h+Ñzù3õ3þuFÇqœñúGÇqÆâó³¹ì&ÒŽµd8ûí{ÞÛ÷|Ïû~ï¾ûÞßð†ÂÌ4v\Ùl™=éæ>i¤¤ÝÜÕ½ÙÜâ-à Ô0Í–‘M7wõIW ´ÚÌšîŠÆ…»‚ës)Eª4T"$0¥ÃÌÊÎB¦GÚ»ŒK Ôvä’†µÛ°Mõ½( º}¦#Pßq¯ÕyÃv¤ÿU`ncÇhFÝ®mfÓ‰…¾¨àšVó6#O›ªn35Ü‚Í8Öû[¬¯ñÆJÖð/ i˜Œik'™V5vã‰0öL.准½ØÇC0R©²- ÛîSGÿ”bάö ¬òÛ"AꆙuÆbëãh¸Ì¤‡,PX§L›nÌÃD/‚gŠÞkç2\÷lY¢wŽ;z¦à¸zTž™,(£¸îøDóÙÐ ºe”º‘èI$ým'Ú–+tR¤B§RÚvήFf¬éI%¥©á€Úoõpö[å@{ü†BÞ2“ 4š~óHîþ#`½u3Ë˾i‰¾‹×É„úGLËR[ᕳe*ÖɂΜîµÖ"L m ºC½77³XÈPùÖpý<œ|¢•ÎÇ5^¤Îþ¨†cx–|2Ù/Ûé%½¢½(§öqœãy6“ño5¼€“Ä@õò¾ZŒÁ'y¢YDîSô§{µJøü+·Uoˆàe¾†%z©>1µ%kS&M¯Ê3†}з\—MyuM&'f^ɲÄôÆ#}f²Oçi8Ä‘e—Roó,¯%¸fF.\¢Zþ ŸÆYÖw]½e p‹eÁ9q\ÁóY ŸSm,Üg8!+—N«Q¡þÞw!5mé,WM,å÷nàÅó:ÞÿÖ nEJ’´b=›qŸ‘Z;LŠHîß%™ a™†#9ñÔ”_ ꉴjR)6RÅ‹?êÛwzâé¥sÔ@~x–z⣺×VüO– ¼Ò]N`¨Ô¦xÓÝv¿µ› žö1¯•zWÃØëÕ0Vif½ÊMd3Siì~@µÅ#¸ª®ü¶0Þä2ªØnY2mXkít!#³îÆþ¤Ì»f.ÁÛ³Û³<~3¥;ìŒý^SÊ@¤®¾kØBâ”dHw®`'å&SaÊèè¼DÃĠê_%WœÏù ó[3?…’6Ý@äDù yÂ*¶<@óø9É“MÆjÕxºS='K¹R:¡&qµW˼hc¼„P‡éE/ÓF¼Ü§¼TüA¥¨oºIM×1ã:êÏ#|s®òÿ¶[hÜÛTË4ã-ÁŠ–J [C7ÑÜ^\ûðu¬h,¾ŽU-ÁXä6ªcÏzÙ¢ÛX°hm¯bÖ¢[X¿·vã l¦ûÇ®£³â§¨ÂŽ Ä"wÄ¥Añš2›Ñ‰…c‘!<ÀžAü•^Ÿl­R¾÷¶kÚ.bg]å«XJÏqßá'è0VEµOó¡\×cý'é¿ê6®(ú ¸@ï\ÍpÎ …bUCè 0ÑUô½b8ëbƒ#A2ÃAr囈Þáfo£Þ·84l16‘ZÇÄø±¨—D¡{|à‚-•uÁšÄÅ»5±ðH©Öè NÄ¢CxNà爵VÅGRÜÏ8]Ã)nò¾8’â)>üÕKe9"¦tcU7qšêµŸñߺ>÷\ÆB~b*ø+‚Âg™Yüâ{ÕqÅ® Å.1[¸žI&ÍB-f“WüáÀ¿yœÁøŒc>ñXÅYé,äü×ÄÁjöñM‹y™Çá°úÉßcX†“X޳XWЂ/q´ú&Vâ ­_G+Þà”ý6VƒÆ;l~Iw(û ‡çßcþ† ø6Šçâ)Ø,jX—1N¤õxLÌÅVÑ€§l%:EºÄZlë°ClÅN±ŸO¡[<ƒÇ…Ý¢Ÿ#á1¬'9ÙÇÓâ2G´7aˆ·8žýIñ ¤ÄmHñ+ôŠ_Sö[¤Åï8Uýép Pý:d3‘õ*ï(kUU¬<µú<¾Àjœˆà‹Üi€?·þ/ã+Äužø¾Ê ò—Ô_p_cÝÇÅŸñuê…ðø#¾ ¬ÖUŒz‘þ"”ÿ —¸ªâþO³éˆ2ëCø–'û6êôëÇz±|o—G¼]¡·*Òb´§|g|OùnyO±KzÊÅž28¦§|Oy½Ì_y»p¯žò}ÕSjâ-ÁA¬X\ûCÕJ*Y'!¿*H¼¶K˜Z|QÆc•Ãõˆy÷ݺ ªÛ;xà®íõÊá­Ñ>s?úÙ¢ráHMŽršSaŸ‡Éé#äô÷u”Œ>F&?G'*Ï“¥'ÈÈȼ“hÇ‹è"îûøÞÀKèÅ˦OóäÏPû45ÎísZ[|$Šh©U‘´)ò€^|ÌglŸKY5שSɸ <…¼SÕF,/{'uÃCýæPKwvÈj YPKÛA‰;aQute/libg/qtokens/PKPKTU;(aQute/libg/qtokens/QuotedTokenizer.classUksSU]§I›4\–¶B›@ Ú›”V«yT[*ZZ¹MOÓK“›psƒõ->Çï~ññg:ãkðÑeÔñ‹Œþ‡Ÿà×9¹}ÐÔÑÉäÞóØgïµ×ÚgßßþþþG÷àÍjvZ'ÊžìÎÙãÙîK^aZ:¥îå‚''N©‰ý¼tC lºh]¶ºs–“í¿(3ž@]Ésm'+Ð0°¼™Ök½µ¶3!gD¿@¤$‹–ky·$`¸Ò+»ŽvÏ©£s;ë\92e{2]´2R X”rZ ~é$-SŒyÐvl¯O ££:hõÊXç0]¥ 2‚ lB“@ £s¸w!¬F[ XB+ YvÒŸËɬ•;äfËyéx‡g2²èÙ'Œ˜@¼’}Üòwãùrɋ˸SðâN9—‹ ÛUĸ@Óh+v¨Eµ¨¯Œvˆ`ÀÆÛ‘ÇËùqéž²ÆsR1]ÈX¹a˵ÕÜ_ zS6‰løo)©ËžÿE\çp„@ºü»¨‚#g<í„àÖJ¥zIåq بFû ¬G]ûñ@÷ßQM{â!Ê›“NÖ›Òõ‡@¸Í«-+ONJ7‚hTþú <‚Gy23e¹‡X•ÁŽþÎTáñX0›—ϧhae<é8Œ#,D»¤+®äW\GªsLù=f OÐ¥U,JgB •;UVpô* q\ ¤K~h²¢_xÊÀ œ{…´[šÖòÖ«è>eà4X°Æ%­Úâh5ã~ð”’éΨ £k:Þ³Î)ƒ —ò$×ËjJã[þÍ5¯[†¸²TÎy \ÆÀ^tó^kp¬‰¬ôïpSGçÙµSš2 aSFò/&ÓÊ1Á2å«õ*e¶y k2àéåŽÀ*¡Ä둤%4,’Pöì\÷€]òx®>Íc±íHUÀ« V‡ê#´Ë˜ áY–÷*+éÚ™RwÊ•–' <âæèe^ÀK!¼(°áN÷^Æ+kML¬ê•NÚÛ©Z`5èæ;/ûsÅÅ ßþð³ë¦ e7#ØêLãªN°WÁòà× Ä?Û Çaý®÷çlEúmøïõþ:¯¶¶ªGðÙÀÙ»ôä;i.`³˜C³œÃ–ÄM¬¿–цè¶ýd&æ°ÃLΡ͌Ía×W´¯Á>wÓè-Èw=Tó¸‹^Åf"mä~hF­ÌJtr=Rø…)ä5z¤°4„ð žS‡ÍD2°€ärôˆ>³…ùoÕ⻥á¥a?‚P7¢âW|É]…è–ʺÇü÷þ‚ê5hŠ9Ü›¼Æq3ÿ;æqßUÔŠk7p`tgñºZ6G¹?¼@Êæñp_ì:½‡Ø‡êf1™ŒÍãèÈ,†<ù¶Øõ6˜<0Ä8³H)R{fÑûL¡nÓù;ùoá_eÚb&c HÏ¢¾ânE”n—“ó™ÇØñ.Nß§Š«pw][bì2b|F™yŒjm£ZÛ©Nœ¶Q«v²¸=|î#‡G¨À 9‹.œ'kÜÉâ>Øž.ã~\áà-<„wpŸ°¥ŠGñRø†çæé_qàþdoVêôé*¼µ¤Î-­‰ †žÖêôàkFz†£#Èã«5@/[aq7 µõkbŸÖ’µl2ѶyŒ/§X|P‡4*F~ÈÕ«}¿ûâç£}³8W-çÃј–o(ºéÜUì_AéÇØ£Í¹¼@KÚ5¯q>­ÒéÃåÊÝ«oæ ÎNHšüŸ¢"§©Ä0á×î £dã$rT`ùþä—øËk®„)®jø›¦J5W“~ª=>Wu&oOv5QçWU·D¿þé¿?DÍy\LÞD¸õì¿f¶/ÐÛñ®ÖdzE}µhÇ™S†´O°L²¾²\ŸZ‘Ct)‡(³ 3R-îfªšù´àè (ú(ÔUkIfÏç«R˜^‘B­ïZà\Z•´­§¼Í‘jÛ¯£< Ó™Å¦Dò;<_ƒ?½Û%T6í~›î²1˜M‘!.±§¹¬È"ÕòVôœí~Ø Zù}y•áë™I%£+>¸ÊÞk:“×5¬7þPKp5AÚ PKÛA‰;aQute/libg/reporter/PKPKTU;"aQute/libg/reporter/Reporter.classe½NÃ@„gC’KZjd7œ¨è ²Ä% º˜Óé"ËŽÖg¨y- €‡B¬#¤äšÙý´÷ýóùà' =©¹o‚Õ…_8ÍvUq°¬ºB¡O˜-͛х)¾],mË\1!ŠÒÿaØ—.yI·óIüHPï†K™F+®ÛºN`“[ÂÄÙð´™‹;â £ ¾Ð©¯CBgÞ•&4,ñ³ÀåîWí’p¯ÛS…ºïë;ûjÊàsÂ^?‹•U çöÆþ}ú¼E ’BûTÿ QÕé¨ÓñZ…„‰ä$ÝÃTúíþ3© Çkgþ PKÆÙcø„PKÛA‰;aQute/libg/sed/PKPKTU;aQute/libg/sed/Replacer.class;õo×>CNv&FñÄÀÒ’TýœÌ¤týâÔý Ô‚œÄäÔ"vF¬Ä²DýœÄ¼t}ÿ¤¬ÔäFö‚¢üäÔâbF5 „tpIQf^ºµ&¦#Wp~iQrª[fN*#/Ì=J6FFf`ÚÇÊÀb1°I&PKŒÔ«†«PKTU;aQute/libg/sed/Sed.classWy|ÇþÆ–µ²¼€lb@4 Nââ(.ÈÄÔNlClŠk𤬥Å^´bµ"¤Wš”ÞM›&½â^´uïB$ŒiH/hÓ»i“Þw›ôÎý¯ô›]Y–l¹­ý“<óæÍ›ï½÷½7ã§þ}þ 7âuÚ­[űñPZ…†õ˜@à°vL ŵäxhÏØa=j xq]`i¿³d˜¡œw T%´¨e ûçÙÒSq-ª[Ôñš;•¡Õr… =i§–¹Æ2¶ h)jVãIÍÎX—6WaWðŠÙˆáÝž1⎙&PñJÜÆb×íž±´'7Ò ¥¹e¡£~܃ ^UÒ{Ü5ƧcZ<£ï!IÖ– vY“#ˆI˜òúr)ßïÃ8CºÎN¤¤®¡â0ް´TJOÆþ+Oúì—P‘”NûlÓ]”‘ˆùpT3¦Q.JÖ^jØ#–aË„dæ%Ä•ûacØ Ç¥#w•äÂÕ ’¡¯QñZ¼Žàèw ëN­Sš"ùnÜ£à %D悊{ñFb–Ö4Û´Èš’½}y9 ¼ oQðæY¤%«*ÞŠ·Ñͤ~ÜžŸã|Ž$Îw¨x'îcÙŒKÿ+“y‘¬ñw«¸ï! šЉrcñæÈ„f ëG3z2ª—)æwS—‚g‹¢$…²8üx ~6¤÷«ø>È0±u é²lh”‰ÛÖ¼¨Ýÿ‡(ôVð!Î"ý^ÅGðQÙ,“'¦çhqË~œÄà N•i‚y„*‘–G3¦­͵¹ó*>‰)RÆ%þPqÃé]ÀÖâ.— <åÓ*>#¯>$’1)øœŠÏã lfî±û4#.°aÑóÊUž³ ó–Ü<£âQy‚2¡¥ICY7«8+CÊb‹'e_Ë©8çT©Ån&ïj©x^Å jùž‰ÆÍ´.ëöK*žÀEG-©%ô}f™ 쀴wžNY1RrUa¹´ß²Wšòž¨d¨HÝÉ–Ô_¦PÑ÷ ‹”|S-v)q=Qn}6à<#=VÀ³0fD’ïz ²óþ@Åñ4»G”eÔ#ï™æ¾–ˆ\ù±Šgð,Wâzr\vo>vúüø)~®àg³½¬PZÔ–Tû~Ɉ|vޱˆ ÔIüZÅo¤1ÿ¸efR3ãòïw*~?0ôŽX6ë¾EÚùŸd‹~NàjZ\´âRvMüôñ凗ºàÅë63VTßé¼||·¬“ûù†¢»|-W! ß<ä‹ò§:?çëŠZ*ÇXX%€{©@-Wêœ×¶pöÔÖ‰,–OBñLÁSù‚gœm/r6HW;pv ®Ío¿‡ $ŒPkkZgpÝh7œEã£N¢®=‹µ“¨™AÅ[ÛÏb]kÛY¬Ÿ3¾ÚÁºâ\ÆßFbk!ºu4/lpÍc6:8CŽ—ÂI¿+8~ 6åáts.!zå)s§øi=w¬p¬®pµ V½Øì¸)°á¼­¡¼kÖÇÑØv]íÓè©ÄÈ|«A¢^]„5P°À.ìv°ÐÇ‘Äz3}«À-”y8ë—'U%®%Œë-3ÁÞQž¸.‡¡öõsØy 5òÏÀgÐDG#‹Ñs¸=‡hÝ¡,&²ˆç`”WHg`QÁmÏáXw†™ï¥‡ÓxµÀ4^/V¦`•iœx[Ã^¹ôNãíœßö½Áª,Þ®žÁLì{Ãþ)4µ«ƒ¾Þ–X×k¦ñPÂ5”úƒ5çð±,>>¬ÎâS“Wž•Â,>;"¿¿®’g˜¼r_Ð#-?Ö–Ev4\uùŠôd1-¿ŒµÒ¥Ž,.Œ´»Î]™BmX¥ò“ŽZP½XŸap3b£ØXHÖ½LÈÜåXÃt5àzþFpb¤\†õ8šy³¶`ŠÿxœF;CÑ ¤á%íi¬gsèÀóLí ¤Û¿øïŠ@§ð¡IÔa³X‰-âZ„EºxâMbºÅlÝ|Û÷pÜËñÍèqHrÂMuž$ËÅf|_!Ú5$ÏWBGh×Åð¾ÆQ%>ƒ¯‹‡8ïÇe’©JÈbqFÄ}ßÀ7©9ÅGòÊ|ôažÂ·Ø ¦Y߯wH×Kôü»\­¡m¾"\¢ …öbÉHÞäð½ÁÊN’â¶özòûUõUÆ“ˆÔ{XÍ?òÄÆf®xrí~òZggõ±No½—)øÕ#XÚÑVïÍâ·äÝÈ ˜‚¿£ž™ý£œ¸–N]9ÅdÆO´ÁéT;½—ý`'ktS²¬릟U3ÂïÛy«Å¨“¢«2 »]ð…ªË8n g´Å©: Àót³:þŒ¿0Œ+h坸ƒaPþN™¬ÿ8hþùPKÊíËŽ¦ŠPKÛA‰;aQute/libg/version/PKPKTU; aQute/libg/version/Version.classWiW×~F Z:ØXÞ0K¬xI´lÇ„`¹PB¼(f±-œ8ƒ„ˆáшMÇIk·uœ¦{ùÒOmÎÉáC[×SŸS·_ÒsúgÚ_P÷¹wIáSé ûνïú¼Ëþõß¿þ ÀiüÖ—‚íZÙÒ“…üt.¹¤›¥|ÑHŽÙ«MóÚ’–,hF.92=¯g-¨î5S›.è ¼ Ú|ÑT ¤7Í5kn•µB~6¯s/4X•ÏXfÞÈ¥ì»p=“¾™½ž¾¤ q h”,ͰƴBY÷£IAGäÆL<¹Ñ¹cê¸ycFëXíï˜|'ö‰¯Ÿ£SÁÛdÙÊ’¦žÓ—“W5ËÒMƒ–GÆ/dF´ îŽù|—Ó—.KFÿùl!oä­^îHtLg 8£Ñ‚6ZÞŘŠv¼@EY‚–ˆuDvBÝÕÕ„UìC(Hꘊã8L÷ÏKWÄáIûqÀýÑÓ§OýˆÐ¹?y"Xc‚5® 9’N§ëXÂ* ½ƒyC./Lëæ¨×Ð`1«Æ43/žå¦ÐzZh=Ãà#i‰5—/áÆ1¡íU>øõšŠ€MS´©ó*¾•¾ ‡„°7b¯ë2&íWñ:Þ‚feçD½RË;0§™ýVY7²z‡l¡Tpɇ‹urä°¨¸ŒtÅLIfxÒ‡+¼j-](è9­ÐoæÊ ºa]XÎꋖ왡-Í5¼^ÎftÓÖXÚXb#Ì„K+†¥-‡g‹fØ)µsá qM Ú'¨ŒŠQ¼E´ÅEݘynµì´–*ÆU¼ ¬U´Ù»‘"ä}×67T¼ƒw™œY,/Š|¤ë²¿‡i4ûj01,âHü² ¯~N…’ν]r* vâæÀX¨×¡[9£²œn Ù³…ÙH;ö€±I9cT’תc&•³IåÑÑÈóz;šöƒÁžÐŒpÑ(¬„É­Ì”ÂV±Ba‚c°ôÌp´ÃR± b÷-Y  +YVÚ™¥ÙYÝ bÇÄχ"×ßSÐZo›7åÇGÔ×)Ø?ìw$þÏŠòBp\«4ÍI°ËM£º´-oöôOE'EçÿHʼ¹ŠÖ³ÓÜábVæ´Òœ=MghVÙäÑÅâƒõîµóÏ«œÞ^$ nþyÁ;J =^¯MbäÉ5è¬w\ ‘+/;Ò.ìå3‡¹ÜçÜ–ëA¹î£Ô!&g3Ÿt4@|N†ö~#qô1”‰M¼ø'zI~_ÞDô!’ª;ùûÍyiÜOÃ!šm¦ÑºÓF/ðùO“R4v¼bò,w® 1÷&NUu%çJ”rªÍ…W¤ÛBCÜÑp›œ^®-±Mœµ>BW¬íºcíÐ;ây„TUk‹ ð0<” „=ÜÙVRmÒÊY[“cEPfERh—¤ÔnI °=Ò›o;Þ¼E ®Xk[»B¤¶‡t”Âai,f3VŒ*Æcǘ0Ñ똸BnÇ„»ž‰ã9!M„mÆç˜ŠÏ8Šû©Øe+v×Uü2E"Rñ!ǻ튅º>GÝ?WEbþŒ£ñ |g(±7ÖÐúoN<ÆàDhxWyp}c›˜|Kx60õ5n2‰’ß “„Üëþþ˜›k¿uæß:ëqÎzb‰&7ŸI|/ËÑF<Δ%˜ô‚ÓɈ:¸s Ý|Qí#Ã, ^ÅwæÑƒ"RXÁù0W+1¯²_DYª00‹œsy'ú¤DðÆþ‚®õŠ# r³¯¦¦½•šž¯+ܽ]x ®ðûu…{¶ _ª+\ÀDáÔ· _©+Ì m +爨éµxìðº×ãÿ€²†F‘ìPQ¤7>$ÐHðïwhÜ"gÖE”¤ºíMIÊÍR=ö¦$gÖݽ¯oàõô&$Ñð©ÛÕþ•ì+ûã’Ó lj Ý½îYw M)Á½[U8ÞåFÇUÖîuŽ‚ ×(cÊ0–16÷8Nò¥&‰Iœc=¼Á÷•JMð•d ¦ùá+Èûüù¿ÇÜÿ˜)¼O0p§Úák•ŠYC™ÿâÐZ"墦>|àtøÛ•$üž'"Ž¡ÇXæü]Œ ¬6ðÝñxèû¸=.ž»·=÷ˆgý5Û)Ilà“j2clgðºô£ÄélÑd™—Ë[û¶Á2^cÉ÷±¼/ãÚfrÂðóííSü@ÖÉq×qyÔq¹ÙÎ9“‹ÿÊîñÁ³î®¿G¶Ñm‚þ1ÇÆ'5š+@5ÊŸH ÷+e=%A¢‹&mN@ÐÔ8wG„.âü'üMÚ—Ú1öÞí&ï²ëï±ãïÖTq´RÅŸã§Ž¡r wºZ¿’ÎÄj*«UÎÞ²«ewÊ.“%þ…(ñŠÑCò.¹Ï›å3¢û€·äç5_ÔÄÛU‰· ?㳩ŸÍô Ǩƒh` Èí­¬T.T~)…_Ëõ7ÿPKQ · }PKTU;%aQute/libg/version/VersionRange.classVëSSGÿ-IHW ©|ñ•§QQA‘—‚P°hB¨½$Krí%Á›|Ô>¿w¦:Ó±öõ¥ý„3¶•Ð)3ö{ÿ¨NÏî½”@;M†Ý=»çüöœß9gÃ_ÿñ@;>w£Ž¡U½U6y\×fsñEn”´b!>eÍj!ÇÝp2øî«‹j\'9>>{ŸgLg^Ëå&¶¶ïbpèŇ ®’©dÃúi‡²´3Ñ;v}a_B"—MM<ÇÅoª¦É aëéÎèZA3¯Q04EWö³Üƒf†ÇÁtðiz:”.…ƒÁt6 ¦Omš§c÷ÒY5ö¤7–š‰„B=òKÑÿeL‡ž¦gB^¼ƒÝnìbØ»…ç ö`/ƒ;Sœ_ÐtÎ &Öé›4 ­ë mwˆPšZ•çg¹q[XþD1£êSª¡ ÙÞ¬ï¶iÚ]ë¦)/hUp;ö4ˆÕQ^4xq'Ý8ñF’-[A„ˆvævC›ÑQÄ(âyÕÌä¹ÁбÑþ¼jLòe^ÈðqZF„G»§kk«(8ƒŽê5%Y)avNÁytRQåŒbyAÐ0\ÓÕ㸨਴ê3äT¯¨bRíwã2Ãþ­ëØ‹nô Úz¸Q/Vý \¨§ƒ ®á:CƒHºjðÛEj¬àv­vc˜¡mÝÍa]ç9Uï5råy^0eø‚IªnŒ¬q²!œ¾²¦g¹áÁ(ÃñDña@6k@+D_r#`æÕB`ˆÖÖÉ¥€7Ð#†› na‚HPd3¾Q Vwm&о±ËƒÛÔÉ14%îl[á5„eRAJÔ–Ç,Z‡^ ¡GÔZ^£ÌÙ†:ŽÈaIŠžØt998_ëqY+6†ºÅv1œ¡zÒJ’Á«2z9ËâÍj´A¡HqÒ aÏæ ææ¸áE­bÐ#tõ`-„n—Ð+ =*Õ褾j˜$¯K³ -[)19nÊSÇnû:»IsH>ã;ÚÒ¿Ö-uÃYtˆÕSÜZ}¬`Nô'[$&'‹e#ïÉ÷¯ycâN ·q„ôô#ä’õ·=Óë$g¯œ=â%¤¹V;°“ìšHŠÑ,> ~ßïðÿ†–_H¨Ã~iVGc#©»p@î‚”©w-S6BûâÚáû¦—ûf–Ñ©àXâW´ÐVpêž„£Î Î:*¸@jQ­Ç¢>/M—œáUt'c+¸²Œ«r½Ï)…¾pÔ篵…_Ññ+ôU0ð=ºV1”\Ť?±‚1qTÁ¸²‚w-•ñ î®`úϰŒ^ŠÐ s=¼ 좱 N P0ä£ïn4Sx~£Ç¸Î;i§‡~…F°wÑBiÙ“¬!__Ñü5ÉÏÑŠ%$Mg-RÆŒdöÞÃ=¢ì¾ÄûPéöNJù,í9; ­œtNe`çä"鈬4‰XDl?Áå\r,U]¯—ÇGåuŠ¥j_ÇD Ù06Ì‚ø¦¬ rrÈŽ*È\M6ßLmHMz–lH[TÏÈZ@?£ÑÊSîå*òÉÜOD„—|p'be³p'â‹®É}R.È ¼¬ºpBVwœ õ4eí ¹ÒAù;K•}ŽÆó¸L1\ÃéâË ÛÅda DN2ÊjÙv6.eê&áÇË·"íÞ©«ébMã¾·¯Ö4~HÕd¿¶iJ…+xü üŠuà;‹tÚýð|6?ßÂïXZHE*|d+X]b+á¹Pp®'î<%  ·bX¹NÕ9Dÿ£ #L?)爡NŒâ Æhgœ¤›˜¢Wö.&7°˜ªVx ŸÈ>•øŸýPK¾¸‰x PKÛA‰;aQute/service/PKPKÛA‰;aQute/service/scripting/PKPKTU;&aQute/service/scripting/Scripter.classÍJÃP…ÏÔØ´ÕhmWî\ê¦A\FÜH¡ÁŸˆÐ•\¯C¹%MÂíMÐWsáøP☢…vãjÎÌ™™o˜Ï¯÷§úhŽÔ]å8\°­–¨­)ɧaÚ(¶>Ÿ«úz÷ýæöÃ,~çÓ¯‘¯¢´uöq»ç@Ï.Ý_úpyüԯܛ‹sÃ39Œ|Zoç—–3û6r“Û™}½ý«÷öªíörcvœ××V?/<ÃáÂØ&=¹!·f¯™»6|43µr;§ÙÆh¦1˜/\~le÷ËÖÂÇ·/{7†n>عòhàç虘•¿óîÄ÷ÓÃ8÷PKöâÊZgÌPKfX8icons/fragment.gifs÷t³°L``ØÌÀoï\³ß~ûû=ûíkëíÜÿÿÿ300@HL ø“…‘AÄ™ÁÀ(pÒsõÚgA‡«÷ÇU²yÎ8*:ÃÁrI»Èsqv®¦‹\Œ‡Bœ$™ÖŸÌtÐX׿(¸À4GBèIî²V¦¦lÚõ·D­}vkÖÉ*!FkPKZl¾z¤PKfX8icons/host.gifs÷t³°L``ØüŸ!ÞÞ¹f¿ýöÿö{öÛ×ÖÛ¹ÿÿÿg``€˜@D€ô:°˜]8á©m«Úìä±-²­õšË”Œ(Qg… ï8çÍu\]±nyÎmöMS_›òE´0¤lfàa:˜7«›ÁPKQBQlPKfX8icons/import-package.gifs÷t³°L``8òŸá?Ôÿ¿Döÿ÷Ûß¿¿ÿþýùû`¾ýþzû –9óçÏohh¨·{{ûøù ½ „€âOFd§kš‚B_Ц]Æb A¦©ç¸­YæœQ öi;éÀÔ ÑkÒ~‰1RÉÓÂ%I}î'þ)ÒG×,>™(8q†ï‹‹¢±›¯IÙ².wu?Ñ2]V2Ê (<ÒÑÉ%ÔZ™Ý¹×¥>>ÊÒÒ>~¾¥eCn "@v9°f+(ô¥hzi\118b¨¸Dh¯;‹ðd#»Öî‡JÔxfy.IpÑ<&´ÐZfŽ![rS̾ưmæ»TdDº«NÚmsí>Ñh~BWòó =íZ÷Ââ±ÊlI5ÊB Î.náÂÜ*œNLSݼòó¬PK›±ÐæPKfX8icons/installed.gifs÷t³°L``ØüŸá?ÌŸÿ¿¾þ?Ãýûû`þüù ñññ YT ø“…‘‹AÄ™áÀ’pÒs5“ÆÂÃÂÎ â "îŽ Î˜ò8%<ow$Nªî¯YxpÅ#A>ýð3!,kzÚš=Ÿ½~»âšŽh©G“A"§kÒáŒôÕn*ý¹ÒtâÍŽ²Ü[Ωf¬¶‘M‚ ÖPKž-W£¤³PKfX8icons/inuse.gifs÷t³°L``¸úŸá?Ôÿ2îÛÿýËðçÏÿß¿¾ÿõñã×>¾zÉðàÁóû÷÷ß¿?ÿî]†;wž]½víð!†ýNí߿߾ý;¶3lÚȰzÕŽ –Ìß¿þüùS¦0LžÌÐÙ9£½}jCCC]][i Cvv~z:Crrzbbv|||L4ƒ¯»«ƒ‡}ü|[[kkKK[KKqccc#}}qAA~..†;°ÅŸ,Œ  : ÈOlUs uïγ‡÷_ý*Ü6ýê¶i—7N:½¬óäÉ¿Çç5›×´Rùþ‰åû&•íhËÙÞ–³¶4v^AD¼½=è€]¬I })žyŽ*‡ ®…‰e,ÐÛ,ªÀ#}®íàëŸ%NÇloÞÉ2匛Û"]•7ÎxZæÖ$§ð€…m²R§cÙ> )¶•‡n‰©`|n$ ê¥oXd,-Ì,•¥šÈP;A‘ÁšáË2°Å@ý¿ b¿³™r‰áÇ!†ï„|Þ 1p(¾³axgÃd‡¨O¬ád9ò¹æÄš @1c=]›¬G¼ƒð'é@ÌÀ Â`Ä>±†ȺÁ.æø)ÁД+šs䃃Ļ 5@5 ·€Ô®f›XóˆÅªy> ABj> ݲd‡²CÉ{ˆ94!æìÒ‘:k@ú ôßÙp¶_)_Ä%ÃÀÕþ'׬ïìê]w@ü”÷s@~ªø€j§Î{¤f*PÞM„V*„x€jAêaaUÁ(‚V`»>@ Dφ Plà †–÷þ¨¹ ûrL 1Ä¿3DÀîéêS*Ú©ÉP Ë oöíÔ†ã6ˆÿAáÇ?«¬†ˆ€ìŠjQtàrË…¡h¶‹€8C%Þ 4¤dß<¨\ñ°ýLºQÁrÆåŒJ8€"2‡UX^Z^˜Εg`‘f`”g…sY…¤™¸¡ ¬|R \übrÂ`¾<¿¤¼Ÿ¨¬¼<ØdiiiÒ`[ä˜9XÄå!ú…Ùx„Øš„¡æóŠHHóIÉ#,”‘—Fp1܇á~<PKàæ©Ã6PKöCQ9icons/test.gifs÷t³°L``ØüŸáÿÿÿ¿ÿô|×ë;›Ÿœ[yàÀ«Û§›×´Rùö¶œµ¥±‹,˜WQéïooÏÀÀ ø“…‘•AÈf™áÀâ±á„çêš)¶]ã_ÊÒ|£ea„ÒæMSmòϽ_ÑøÞüÍæ¾ù)& ,,úÜ'2–ðqr-s~a­È“°ûa‘󢞅¿šœY¬åXÍoX~%sÍ/kò½œË\t?®x!3áÇÕ¬Í÷tCr–Ý:á3Ó¶¤Í‘Š Ö÷(!ÜÃÀ–ã0±ÀCGª}aòFƒŸ9v“›6}`0k8à¾k˜ŠôA¥Mº~ ¬ílK*"l&?bÿx¢Æ¡ÏëùgÅ6³…¦¦iOçPfN…0ñZaa6aöÒ€X^ 鬚—?©EÁ¾þ^uë6l\çÈ` PKz&³ëPOPKfX8icons/unknown.gifs÷t³°Ldgà`XÄÀðÿÿÿýû÷×××ÇÇÇ3€¹ ` ø“…‘•AÄ©e`áØÅê¨Ò Æ8³›#G5^ÆPƒ×B•ÁPKd©AGOPKWÅ8maven-dependencies.txtÝ–M”@†ïþŠò¦Fz>ÐYc‰sÑ‹‰GÓ@MS+Ó…ýÁ ÿÞnÜÉÆì¢ÆÉd!4õRõ>MuÈž' |h`£– µÅ+¨°E]¡. -üáÉ ¸Z:èÙƒBOzHÅ*²ÎP᱆Ÿ>‰OÅñå38RW°—Ú˦écú†û!G' ±·Ð6^‘¶à8–0¡hË–›þ5 P¼%­`ßéñí÷§[²£ÅTåkMe=悎ål;© @ØI2ÁFp,IÕvlÒTQ»#å+{Š:ÔÑä/ãh'K·­œ´6|€$Ƀ.;Ÿ¹|xñîQŸ™2eØ·Û*?Ÿu¶Š²Å™”w5#> NúÑTg™tëårÎU¶˜“ЖÜb^ò¾ Ó”-NÓáÅ}Çsb£h>Φõ"¸Ø³þžô2<%œ Å  Ý[¢}0^;ÚãS@¹åâ ?Éß®ƒ*n·ýõí·ÁÌüO3ª…ØŽo“Õ›åò2$~þfìIØ|/BÎúJiìÁÍÆ Zq ®ÇëñÝfN£¥ët}¡&«æÃí¸]{1‰ÉWIrµˆ Fs9 _…–/,iX°¢,®I^ŠÈ'ð?f‹’È –KN¥T¼öV†…p%$Œ“ÁJžίhF2Éñ†À…$|ü.ò4@4øÏRuA@£æ•6aãD+MŒº‹694D"¼Æ_Èë2O­Þ Éñ"#âŠâ”*žexA²i .P[¼±Àü–kàMSª™5ÉX&i1 .8Á’ Œš-9Û ¹¦¥dIs̓–ÊSdìUqÔ÷ðìDŽÀ|ÇÿrŒã?N—ÛC]o¸jç›ËÃÝoùäš "¨€,O¶ˆ-M LPú®?â_‡T<5ãDƒr©7tå‚ì‡ ¶ á9ÎY²BYpÝåïˆÍÕv²â9mÖž(mmVæ­)a­ú4iÿS‹õZcí`Å‚áÕ(º]3.“RŠÆao9 m±nßI¡Då²ú)"  WtéRôwUæ”Ôã~#]ÿ¬eή81›¦Ä™QJNq!‘„4èÕ½g®2÷1XwýžTpV.·R¨˜çJÐ'ÎT…Q¶)i…JÚ¹¾ Èô r L=£„jÿ§ÉHJpn"x.L^¢%S»KÏç˜Gl ­ä%ñ(‚±@y×½GC‰#þN¶DÞt‰£‘$‹”(Tâ<’®_>Æաi¸œtŽZ➯åð¹}xñ–³²h=šPô°U1uß´:ù;’ßí~O°C¤©£/ÚŽ7 ×ÐG§ŒïÚÃÖZèyk”l\Í¥OÚ4[0“†þužz Šú‰â@F;0C¦ô¡|Â+2U­‹ÑQâöt¶Ðƒý -²±'Ü¥ºh›´lÊÔkT¸u3Ÿúéwßyˆóí^ªCÖæH§Ý˜ãt èiÒëïã‡U·ºtŠþ”âú]X2GcdUV»¤‹²·_NX`,(˧Ây …ªPö÷y}ÍøÅÁ‚.æ¡J¥þø` J ¼)vT)˜÷ÄaÒh]¯WïkÅ8?Ò„4ià‰Š9ÿ‡çº!!ؘ–I±½nÙR3šØA؉®>…5â„ÄyŠ3–s6Û'á=®¦e7] )hT7T¶9Q%¨ò˜Ðs™º®þ¶åoPKù°×õ&#PKÛA‰;pom.xml“Án!†ïyй¹•Ø:>TYiÓS+Gm“¨ê-ÂËØž Öëäé xco#5Êqfþù`~á¼ýƒm„ÃN›p=ÙÆèœïä “N¶[dÖoøï·|Î*VMŽÊÅ!ÐIÝ÷=믊nVUŸøïÛå}jÜÉK2!JÓbê ´%¹´­ŒdÍ;ƒÿ)Jâr?¬+vjR_ˆU¨¡‰^€àÿä²hãm羪zEÏLþì" þ’Êeé#­e³Â(ÁGq.ïRb³«ÏsÁ÷#´ÂÐzrqˆè"iŠO §» ˆz/ÝVi5ëÁy21ÅFi ™Ä_¡„‘;¬Ëuá¦ÈàÁZ-xÉgAçu=zŽ"eiFþ%Àoò(Y’¥É@ièYžï9Æß7wË3÷ òÈ_…¦MÀ0 †p|X£5¬) ­5Q’AÙœ-øÖÜôC›‚41úTChÊÀ,íÆP¦jÂ06&©¢õ=š¨ŸŽ<$Áv¾Eø!ôd6³ÐÇì­1­KðÒVîe ~\Ât>s[w² ?>…èiÕ<:›qœ:ªøÈŠSl|øˆõÅ_PKš6õ½“PKÛA‰;À;²÷›META-INF/MANIFEST.MFþÊPK’|“7™Å_I{(-=LICENSEPKÛA‰; íOSGI-OPT/PKÛA‰;Ùó/ÓIf &OSGI-OPT/bnd.bndPKÛA‰; ­OSGI-OPT/src/PKÛA‰;êOSGI-OPT/src/aQute/PKÛA‰;-OSGI-OPT/src/aQute/bnd/PKÛA‰;"tOSGI-OPT/src/aQute/bnd/annotation/PK]„d; Ô à<z-ÆOSGI-OPT/src/aQute/bnd/annotation/Export.javaPKécb;SÒn†·0]OSGI-OPT/src/aQute/bnd/annotation/UsePolicy.javaPKÛA‰;,rOSGI-OPT/src/aQute/bnd/annotation/component/PKŠA‰;Íf©æ9ÎOSGI-OPT/src/aQute/bnd/annotation/component/Activate.javaPKØK{;SùH +ñwOSGI-OPT/src/aQute/bnd/build/Workspace.javaPKÛA‰;!R|OSGI-OPT/src/aQute/bnd/classpath/PK8O;T±jÚÖ2£|OSGI-OPT/src/aQute/bnd/classpath/BndContainer.javaPKòS…9"Bµ£8Ï=ÝOSGI-OPT/src/aQute/bnd/classpath/BndContainerInitializer.javaPKT…9†y­©#6€‡OSGI-OPT/src/aQute/bnd/classpath/BndContainerPage.javaPK;„ƒ9 ÔHXx”3OSGI-OPT/src/aQute/bnd/classpath/ModelListener.javaPKÛA‰;Z‘OSGI-OPT/src/aQute/bnd/help/PK·­l;0À½»·Jm'¦‘OSGI-OPT/src/aQute/bnd/help/Syntax.javaPKÛA‰;!²«OSGI-OPT/src/aQute/bnd/jareditor/PKWQ|8<#ìqŒ6¬OSGI-OPT/src/aQute/bnd/jareditor/JarConfiguration.javaPKX|8`v¼ºI 9جOSGI-OPT/src/aQute/bnd/jareditor/JarDocumentProvider.javaPKQQ|8ˆÿÔ@ïÏ/ù¯OSGI-OPT/src/aQute/bnd/jareditor/JarEditor.javaPKÛA‰;E±OSGI-OPT/src/aQute/bnd/junit/PK2£$9’??ÎÅÏ2’±OSGI-OPT/src/aQute/bnd/junit/OSGiArgumentsTab.javaPK¬‚29=C~ÃA9·¶OSGI-OPT/src/aQute/bnd/junit/OSGiJUnitLaunchShortcut.javaPKMbL;×\m+ÉüHá·OSGI-OPT/src/aQute/bnd/junit/OSGiJUnitLauncherConfigurationDelegate.javaPK–#9$) µB+3 ½OSGI-OPT/src/aQute/bnd/junit/OSGiJUnitTabGroup.javaPKÛA‰;þOSGI-OPT/src/aQute/bnd/launch/PKÖS…9I Ã¥\F1¿OSGI-OPT/src/aQute/bnd/launch/LaunchDelegate.javaPK2Wá:i]Ôª‹1ÌÁOSGI-OPT/src/aQute/bnd/launch/LaunchTabGroup.javaPK2Wá:Ö^•’y*+9ÃOSGI-OPT/src/aQute/bnd/launch/Shortcut.javaPKÛA‰; ÈOSGI-OPT/src/aQute/bnd/main/PK˜ˆ;°Zf#¤-0í$WÈOSGI-OPT/src/aQute/bnd/main/bnd.javaPK’|“7˵‡¤ 'MöOSGI-OPT/src/aQute/bnd/main/packageinfoPKÛA‰;±öOSGI-OPT/src/aQute/bnd/make/PKhVB9רí3$P%ýöOSGI-OPT/src/aQute/bnd/make/Make.javaPKºPÉ:Ë ,ó†@ (tûOSGI-OPT/src/aQute/bnd/make/MakeBnd.javaPKŒMB9Š0mP —)PÿOSGI-OPT/src/aQute/bnd/make/MakeCopy.javaPKÛA‰;&²OSGI-OPT/src/aQute/bnd/make/component/PK%@‰;tDÑC¤ &DOSGI-OPT/src/aQute/bnd/make/component/ComponentAnnotationReader.javaPK6“~;jŒ÷‡Y; OSGI-OPT/src/aQute/bnd/make/component/ServiceComponent.javaPKÛA‰;~ OSGI-OPT/src/aQute/bnd/maven/PK*Y3:¼Øæˆel0Ë OSGI-OPT/src/aQute/bnd/maven/BsnToMavenPath.javaPK®zL:ÃCÒ$O,Ž!OSGI-OPT/src/aQute/bnd/maven/MavenGroup.javaPKöTŽ:ý dEº—1 #OSGI-OPT/src/aQute/bnd/maven/MavenRepository.javaPKÛA‰;%*OSGI-OPT/src/aQute/bnd/plugin/PK‹Q…9<®•ÀDÖ0s*OSGI-OPT/src/aQute/bnd/plugin/ActionWrapper.javaPK`‹;÷qu(,,OSGI-OPT/src/aQute/bnd/plugin/Activator.javaPKÝY(;Ç÷W¬± Ú&*ä2OSGI-OPT/src/aQute/bnd/plugin/Central.javaPKÛA‰;&í<OSGI-OPT/src/aQute/bnd/plugin/builder/PK@+9'ÿÌã5C=OSGI-OPT/src/aQute/bnd/plugin/builder/BndBuilder.javaPK’|“7ˆë?f•4‰BOSGI-OPT/src/aQute/bnd/plugin/builder/BndNature.javaPK@+9ÃpoCâ =QEOSGI-OPT/src/aQute/bnd/plugin/builder/ToggleNatureAction.javaPKÛA‰;&ÿHOSGI-OPT/src/aQute/bnd/plugin/editors/PKYk;`/‚íŸAUIOSGI-OPT/src/aQute/bnd/plugin/editors/BndCompletionProcessor.javaPK2xz:™éÏ(³´ 3±KOSGI-OPT/src/aQute/bnd/plugin/editors/BndHover.javaPKn»k;`ðXÑ=ÅOOSGI-OPT/src/aQute/bnd/plugin/editors/BndMultiPageEditor.javaPK.~ƒ9çXÍu&wH½XOSGI-OPT/src/aQute/bnd/plugin/editors/BndMultiPageEditorContributor.javaPKÍ O;–— R¨ 5Y]OSGI-OPT/src/aQute/bnd/plugin/editors/BndScanner.javaPK–P ;Ñ':ó]ëGaOSGI-OPT/src/aQute/bnd/plugin/editors/BndSourceViewerConfiguration.javaPK•¬l;åBÑKh8àeOSGI-OPT/src/aQute/bnd/plugin/editors/BndTextEditor.javaPKu€s:é•\öΰ4®gOSGI-OPT/src/aQute/bnd/plugin/editors/MacroRule.javaPKÛA‰;$ÞiOSGI-OPT/src/aQute/bnd/plugin/popup/PKu‡:ë÷8›02jOSGI-OPT/src/aQute/bnd/plugin/popup/Scripts.javaPKu‡:¤wò>è0ÈoOSGI-OPT/src/aQute/bnd/plugin/popup/SubMenu.javaPKÛA‰;,µrOSGI-OPT/src/aQute/bnd/plugin/popup/actions/PKæD;Ø12:sOSGI-OPT/src/aQute/bnd/plugin/popup/actions/AddToRepo.javaPKéD;}ò’­ F>wOSGI-OPT/src/aQute/bnd/plugin/popup/actions/InstallBundle.javaPKïD;¿+MáSb;}OSGI-OPT/src/aQute/bnd/plugin/popup/actions/MakeBundle.javaPKóD;-²ÅôH¸ =׃OSGI-OPT/src/aQute/bnd/plugin/popup/actions/VerifyBundle.javaPKöD;¼ /2ˆÍ;ЇOSGI-OPT/src/aQute/bnd/plugin/popup/actions/WrapBundle.javaPKÛA‰;1{ŠOSGI-OPT/src/aQute/bnd/plugin/popup/actions/repo/PKšÿ:-myêÇ@ÜŠOSGI-OPT/src/aQute/bnd/plugin/popup/actions/repo/RepoDialog.javaPKÛA‰;OSGI-OPT/src/aQute/bnd/service/PKˆJU9Åök›2P2`OSGI-OPT/src/aQute/bnd/service/AnalyzerPlugin.javaPKŒQ ;¾³lǼ9ò‘OSGI-OPT/src/aQute/bnd/service/DependencyContributor.javaPKHU9#CxQ.à’OSGI-OPT/src/aQute/bnd/service/MakePlugin.javaPKuHU9©@ÃE›|*”OSGI-OPT/src/aQute/bnd/service/Plugin.javaPKsjz:­—Yÿh{/€–OSGI-OPT/src/aQute/bnd/service/Refreshable.javaPKöTŽ:Âà*u4E—OSGI-OPT/src/aQute/bnd/service/RepositoryPlugin.javaPKå°y:éaûÍð´0šOSGI-OPT/src/aQute/bnd/service/SignerPlugin.javaPKÛA‰;&j›OSGI-OPT/src/aQute/bnd/service/action/PK0—;ÉåDÂ{ž1À›OSGI-OPT/src/aQute/bnd/service/action/Action.javaPKX˜;8‹(_j6šœOSGI-OPT/src/aQute/bnd/service/action/NamedAction.javaPKÛA‰;]OSGI-OPT/src/aQute/bnd/set/PKŠQ¼:×è4¨ˆ%¨OSGI-OPT/src/aQute/bnd/set/Group.javaPKÛA‰;£ OSGI-OPT/src/aQute/bnd/signing/PKú„X:kù=ÅiH1ò OSGI-OPT/src/aQute/bnd/signing/JartoolSigner.javaPK …X:q³t”¯*º¥OSGI-OPT/src/aQute/bnd/signing/Signer.javaPKÛA‰;¦­OSGI-OPT/src/aQute/bnd/test/PK eL;R :¹ |30ò­OSGI-OPT/src/aQute/bnd/test/ProjectLauncher.javaPKÛA‰; »OSGI-OPT/src/aQute/lib/PKÛA‰;P»OSGI-OPT/src/aQute/lib/base64/PK¥rj9©¡üD/ )ž»OSGI-OPT/src/aQute/lib/base64/Base64.javaPKÛA‰; $ÀOSGI-OPT/src/aQute/lib/deployer/PK:[U;1C‹·€ž4tÀOSGI-OPT/src/aQute/lib/deployer/FileInstallRepo.javaPK#¨d;z÷]¦ôÌ-VÇOSGI-OPT/src/aQute/lib/deployer/FileRepo.javaPKÛA‰;¥ÐOSGI-OPT/src/aQute/lib/jardiff/PKéZ9TÈël«(ôÐOSGI-OPT/src/aQute/lib/jardiff/Diff.javaPKÛA‰;¶ÖOSGI-OPT/src/aQute/lib/osgi/PKm‚;Äô¬¼ò&×OSGI-OPT/src/aQute/lib/osgi/About.javaPK¬}B9h©ò›Œ1ÛOSGI-OPT/src/aQute/lib/osgi/AbstractResource.javaPKs—~;ë‹nš9) ÝOSGI-OPT/src/aQute/lib/osgi/Analyzer.javaPK¯Ub;(N2G<+ýOSGI-OPT/src/aQute/lib/osgi/Annotation.javaPKmqb;ùJoÏ%øž(OSGI-OPT/src/aQute/lib/osgi/Builder.javaPK­„è:S‘S¹Û93Â>OSGI-OPT/src/aQute/lib/osgi/ClassDataCollector.javaPKâd;xÃhHJ¡‹&þ?OSGI-OPT/src/aQute/lib/osgi/Clazz.javaPKë–~;a£*4 U8*œ]OSGI-OPT/src/aQute/lib/osgi/Constants.javaPKE;µ¸D~>Á1(iOSGI-OPT/src/aQute/lib/osgi/EmbeddedResource.javaPKÀ†;\míO-ÅlOSGI-OPT/src/aQute/lib/osgi/FileResource.javaPK²Ub;1xbÉ« , pOSGI-OPT/src/aQute/lib/osgi/Instruction.javaPK(E;_ñ§*Ð20tOSGI-OPT/src/aQute/lib/osgi/InstructionFilter.javaPK£†;N½€Ï[ 4$ºuOSGI-OPT/src/aQute/lib/osgi/Jar.javaPKæ†;€®üS,g‚OSGI-OPT/src/aQute/lib/osgi/JarResource.javaPKzUL;÷Õïa.l&„OSGI-OPT/src/aQute/lib/osgi/Macro.javaPKNP89 8F;,%¢(ÉœOSGI-OPT/src/aQute/lib/osgi/OpCodes.javaPK»}B9éP¤wdž3KµOSGI-OPT/src/aQute/lib/osgi/PreprocessResource.javaPK*|b;%ê0#Q’*s·OSGI-OPT/src/aQute/lib/osgi/Processor.javaPK3E;U-ætª)ûÚOSGI-OPT/src/aQute/lib/osgi/Resource.javaPK6E;§·œZ,üÛOSGI-OPT/src/aQute/lib/osgi/URLResource.javaPKB˜~;©¸îØiï’)uÝOSGI-OPT/src/aQute/lib/osgi/Verifier.javaPKß„”aQute/bnd/build/Project.classPK¯TU;èìWˆ$ÒÒaQute/bnd/build/ProjectBuilder.classPK¯TU;÷ˆûfÑ#?ÕaQute/bnd/build/ReflectAction.classPK¯TU;KŽŠa§"ö×aQute/bnd/build/ScriptAction.classPK¯TU;Q_ÃÌý íÙaQute/bnd/build/Workspace.classPKÛA‰;7ãaQute/bnd/classpath/PK¯TU;—5Ñ }&{ãaQute/bnd/classpath/BndContainer.classPK¯TU;åcÑ¨Š 1ÐìaQute/bnd/classpath/BndContainerInitializer.classPK¯TU;õd?êó,×òaQute/bnd/classpath/BndContainerPage$1.classPK¯TU;ºZíPã9,öaQute/bnd/classpath/BndContainerPage$2.classPK¯TU;‹MtR,XúaQute/bnd/classpath/BndContainerPage$3.classPK¯TU;>'ãà `*ÇýaQute/bnd/classpath/BndContainerPage.classPK¯TU;M'qâ¯å'ÿ aQute/bnd/classpath/ModelListener.classPKIÅ8-”¹2%9' aQute/bnd/classpath/messages.propertiesPKÛA‰;} aQute/bnd/help/PK¸­l;Cqé \'¿R¼ aQute/bnd/help/Syntax.classPK­Q½:wÚ /ýa5aQute/bnd/help/changed.txtPKé`t:#ÎŒçÍÒ€ Ø6aQute/bnd/help/syntax.propertiesPKYŽx:ˆ8«)óTaQute/bnd/help/syntax.xmlPKÛA‰;RUaQute/bnd/jareditor/PK¯TU;=ÁNë`*–UaQute/bnd/jareditor/JarConfiguration.classPK¯TU;3­¶F¢o-ÙVaQute/bnd/jareditor/JarDocumentProvider.classPK¯TU;¶¨WžÙ#Ö\aQute/bnd/jareditor/JarEditor.classPKÛA‰;Å^aQute/bnd/junit/PK¯TU;eq”ãïÈ&_aQute/bnd/junit/OSGiArgumentsTab.classPK¯TU;50°-HgaQute/bnd/junit/OSGiJUnitLaunchShortcut.classPK¯TU;àµ4x <@iaQute/bnd/junit/OSGiJUnitLauncherConfigurationDelegate.classPK¯TU;8ö z‚t'ÆoaQute/bnd/junit/OSGiJUnitTabGroup.classPKÛA‰;raQute/bnd/launch/PK¯TU;†*"“· %ÞraQute/bnd/launch/LaunchDelegate.classPK¯TU;Ý®ÙíIâ%ÄwaQute/bnd/launch/LaunchTabGroup.classPK¯TU;©,üz=`zaQute/bnd/launch/Shortcut.classPKÛA‰;'ƒaQute/bnd/main/PK˜ˆ;22ë¿Y°fƒaQute/bnd/main/bnd.classPKTnS;ûðÇTQ•kÝaQute/bnd/main/component.xsltPK’|“7˵‡¤ àaQute/bnd/main/packageinfoPKÛA‰;^àaQute/bnd/make/PK¯TU;dE, ÕàaQute/bnd/make/Make.classPK¯TU;#_˜ÛÏmêaQute/bnd/make/MakeBnd.classPK¯TU;ÈÆDzÒšòaQute/bnd/make/MakeCopy.classPKÛA‰;_÷aQute/bnd/make/component/PKrA‰;¶qó¢|$8¨÷aQute/bnd/make/component/ComponentAnnotationReader.classPK6“~;6Ë·_Øÿ7>° aQute/bnd/make/component/ServiceComponent$ComponentMaker.classPK6“~;’/MaŠ /ô%aQute/bnd/make/component/ServiceComponent.classPKÛA‰;Û,aQute/bnd/maven/PK¯TU;R4az•Å$-aQute/bnd/maven/BsnToMavenPath.classPK¯TU;­Ÿ8 Ž .aQute/bnd/maven/MavenGroup.classPK¯TU;óîðžU%Þ0aQute/bnd/maven/MavenRepository.classPKÛA‰;Ï?aQute/bnd/plugin/PK¯TU;°à"£¡$@aQute/bnd/plugin/ActionWrapper.classPK¯TU;iÌ–Ïau"CaQute/bnd/plugin/Activator$1.classPK¯TU; àF_‘²"´FaQute/bnd/plugin/Activator$2.classPK¯TU;lþêS"•IaQute/bnd/plugin/Activator$3.classPK¯TU;¢p ¨–¶"ÏKaQute/bnd/plugin/Activator$4.classPK¯TU;Ï@ÉØ¯U"µNaQute/bnd/plugin/Activator$5.classPK¯TU;¹ µP  ´QaQute/bnd/plugin/Activator.classPK¯TU;ƒ­^Ëy \aQute/bnd/plugin/Central$1.classPK¯TU;qÅ¿I´þ"0baQute/bnd/plugin/Central.classPKÛA‰;0raQute/bnd/plugin/builder/PK¯TU;JÔ9Ó7¨6yraQute/bnd/plugin/builder/BndBuilder$DeltaVisitor.classPK¯TU;ÓÒŒ J9uaQute/bnd/plugin/builder/BndBuilder$ResourceVisitor.classPK¯TU;”#Š)waQute/bnd/plugin/builder/BndBuilder.classPK¯TU;ï–ëI] (•aQute/bnd/plugin/builder/BndNature.classPK¯TU;º0m/=ý 14„aQute/bnd/plugin/builder/ToggleNatureAction.classPKÛA‰;ЉaQute/bnd/plugin/editors/PKYk;¢6qÙ 5ŠaQute/bnd/plugin/editors/BndCompletionProcessor.classPK¯TU;{ÂP2q‰1íŽaQute/bnd/plugin/editors/BndHover$DocString.classPK¯TU;RFܹã '½‘aQute/bnd/plugin/editors/BndHover.classPKn»k;Ñ{–ƒ¶­3˘aQute/bnd/plugin/editors/BndMultiPageEditor$1.classPKn»k;x?dÈ‚© 1âœaQute/bnd/plugin/editors/BndMultiPageEditor.classPK¯TU;!L7 ë²>ëaQute/bnd/plugin/editors/BndMultiPageEditorContributor$1.classPK¯TU;·˜Ë¨<®aQute/bnd/plugin/editors/BndMultiPageEditorContributor.classPK¯TU;%¡,sÀ+‹µaQute/bnd/plugin/editors/BndScanner$1.classPK¯TU;åz'8{ 5¤·aQute/bnd/plugin/editors/BndScanner$BndWordRule.classPK¯TU;&ŸïýG)‚½aQute/bnd/plugin/editors/BndScanner.classPK¯TU; `Á9ÙOÖÀaQute/bnd/plugin/editors/BndSourceViewerConfiguration$BndPartitionScanner.classPK¯TU;Á"=©YSŒÃaQute/bnd/plugin/editors/BndSourceViewerConfiguration$MultiLineCommentScanner.classPK¯TU;,ù!|ÔÇ;¶ÅaQute/bnd/plugin/editors/BndSourceViewerConfiguration.classPK•¬l;MDÓ=•ø,óÍaQute/bnd/plugin/editors/BndTextEditor.classPK¯TU;Bù«dJ((âÏaQute/bnd/plugin/editors/MacroRule.classPKÛA‰;‚ÓaQute/bnd/plugin/popup/PK¯TU;ÏÖ± î &ÉÓaQute/bnd/plugin/popup/Scripts$1.classPK¯TU;Øü>)C&$ÚaQute/bnd/plugin/popup/Scripts.classPK¯TU;%” CïÓ&²âaQute/bnd/plugin/popup/SubMenu$1.classPK¯TU;UwÕ­#” $õäaQute/bnd/plugin/popup/SubMenu.classPKÛA‰;jêaQute/bnd/plugin/popup/actions/PK¯TU;†f,µËC.¹êaQute/bnd/plugin/popup/actions/AddToRepo.classPK¯TU;.N•² 2àóaQute/bnd/plugin/popup/actions/InstallBundle.classPK¯TU;ÖgòÆ› /NÿaQute/bnd/plugin/popup/actions/MakeBundle.classPK¯TU;šÔwù1F aQute/bnd/plugin/popup/actions/VerifyBundle.classPK¯TU;¼‹œv /žaQute/bnd/plugin/popup/actions/WrapBundle.classPKÛA‰;$qaQute/bnd/plugin/popup/actions/repo/PK¯TU;È4š¥4ÅaQute/bnd/plugin/popup/actions/repo/RepoDialog.classPKÛA‰;Á!aQute/bnd/service/PK¯TU;dæþ=­ã&"aQute/bnd/service/AnalyzerPlugin.classPK¯TU;ºe Æ+-#aQute/bnd/service/DependencyContributor.classPK¯TU;I†•.ßž"%$aQute/bnd/service/MakePlugin.classPK¯TU;˜UÞfÎ%T%aQute/bnd/service/Plugin.classPK¯TU;XÛ¯K”¶#n&aQute/bnd/service/Refreshable.classPK¯TU;K7ß$<_(S'aQute/bnd/service/RepositoryPlugin.classPK¯TU;`]g.±ê$å(aQute/bnd/service/SignerPlugin.classPKÛA‰;è)aQute/bnd/service/action/PK¯TU;ÐÆ-ó¯é%1*aQute/bnd/service/action/Action.classPK¯TU;¼.ÁÞ—Ð*3+aQute/bnd/service/action/NamedAction.classPKÛA‰;",aQute/bnd/set/PK¯TU;]Yâ‹Ëû`,aQute/bnd/set/Group$Path.classPK¯TU;Q€©à w.aQute/bnd/set/Group.classPKÛA‰;g4aQute/bnd/signing/PK¯TU;_ЄhA'©4aQute/bnd/signing/JartoolSigner$1.classPK¯TU;ж ’k €%?7aQute/bnd/signing/JartoolSigner.classPK¯TU;FçtUÜý@aQute/bnd/signing/Signer.classPKÛA‰;žPaQute/bnd/test/PK¯TU;À¡Â’·&ÝPaQute/bnd/test/ProjectLauncher$1.classPK¯TU; ÅòK&ÃRaQute/bnd/test/ProjectLauncher$2.classPK¯TU;ËâŽIðQ- VaQute/bnd/test/ProjectLauncher$Streamer.classPK¯TU;.ÈW#uØ0$TXaQute/bnd/test/ProjectLauncher.classPKu©d;•&ÅdºÏ°â paQute/bnd/test/aQute.runtime.jarPKÛA‰; #@aQute/lib/PKÛA‰;]@aQute/lib/base64/PKTU;ô¶D ž@aQute/lib/base64/Base64.classPKÛA‰;ŸGaQute/lib/deployer/PK:[U;]ß)Ý Ý(âGaQute/lib/deployer/FileInstallRepo.classPK#¨d;Øãš+"!UaQute/lib/deployer/FileRepo.classPKÛA‰;{faQute/lib/jardiff/PK¯TU;Pã‘, T½faQute/lib/jardiff/Diff.classPKÛA‰;3saQute/lib/osgi/PK¯TU;(EyªÌrsaQute/lib/osgi/About.classPK¯TU;1¯J_%†taQute/lib/osgi/AbstractResource.classPKs—~;‹Ï>:#xaQute/lib/osgi/Analyzer$1.classPKs—~;§“{H¤Ne¢ª€aQute/lib/osgi/Analyzer.classPK¯Ub;k³çïæÝ™ÏaQute/lib/osgi/Annotation.classPKnqb; Azq">½}ÌÒaQute/lib/osgi/Builder.classPK¯TU;Ϊ–2%“'8aQute/lib/osgi/ClassDataCollector.classPKâd;•§¿jMí ²aQute/lib/osgi/Clazz$Assoc.classPKâd;Nõ¹[X< MaQute/lib/osgi/Clazz$QUERY.classPKâd;˜lùïž)^SóaQute/lib/osgi/Clazz.classPKë–~;äG5@ !ÙBaQute/lib/osgi/Constants.classPK¯TU;‚Æï~ýT %eSaQute/lib/osgi/EmbeddedResource.classPK¯TU;xþ˜Í<w !µYaQute/lib/osgi/FileResource.classPK³Ub; ~´sUŽ @`aQute/lib/osgi/Instruction.classPK¯TU;Z/n©Ã&ãgaQute/lib/osgi/InstructionFilter.classPK¯TU;²1‡µÇ6àjaQute/lib/osgi/Jar.classPK¯TU;6'mB· íƒaQute/lib/osgi/JarResource.classPK¯TU;Œ4/c‚Y}‡aQute/lib/osgi/Macro$Link.classPK¯TU;—I:g¹(ïPLŠaQute/lib/osgi/Macro.classPK¯TU;‘Ø} MM³aQute/lib/osgi/OpCodes.classPK¯TU;3±÷IÃ'™¾aQute/lib/osgi/PreprocessResource.classPK*|b;|º±(ÚH! ÃaQute/lib/osgi/Processor$CL.classPK*|b;{ãv’*4Ív2ÇaQute/lib/osgi/Processor.classPK¯TU;š?Iø|¨ûaQute/lib/osgi/Resource.classPK¯TU;Ø}T¿ ëüaQute/lib/osgi/URLResource.classPKB˜~;!«wM øÿaQute/lib/osgi/Verifier$EE.classPKB˜~;ÄR®òâ.!_“ aQute/lib/osgi/Verifier.classPK¯TU; q–B$À0 aQute/lib/osgi/WriteResource$1.classPK¯TU;œÙôªgÕ"T3 aQute/lib/osgi/WriteResource.classPKC˜ˆ;¢çàô: 6 aQute/lib/osgi/ZipResource.classPKXu%9_P)'M= aQute/lib/osgi/bnd.infoPKÛA‰;»= aQute/lib/osgi/eclipse/PK¯TU;]û‘Äk -> aQute/lib/osgi/eclipse/EclipseClasspath.classPKÛA‰;!N aQute/lib/tag/PKTU;È©s ªq'_N aQute/lib/tag/Tag.classPKÛA‰; Na aQute/libg/PKÛA‰;‰a aQute/libg/generics/PKTU;“TÛÇÛ3 Ía aQute/libg/generics/Create.classPKÛA‰;öd aQute/libg/header/PKTU;wvÈj Y"8e aQute/libg/header/OSGiHeader.classPKÛA‰;§n aQute/libg/qtokens/PKTU;p5AÚ (ên aQute/libg/qtokens/QuotedTokenizer.classPKÛA‰;u aQute/libg/reporter/PKTU;ÆÙcø„"Åu aQute/libg/reporter/Reporter.classPKÛA‰; w aQute/libg/sed/PKTU;ŒÔ«†«Lw aQute/libg/sed/Replacer.classPKTU;ÊíËŽ¦Šx aQute/libg/sed/Sed.classPKÛA‰; aQute/libg/version/PKTU;Q · } L aQute/libg/version/Version.classPKTU;¾¸‰x %:‰ aQute/libg/version/VersionRange.classPKÛA‰; aQute/service/PKÛA‰;C aQute/service/scripting/PKTU;sô¦â®&‹ aQute/service/scripting/Scripter.classPKĈ…9ÄÿŸß #â aQute/service/scripting/packageinfoPKÛA‰;@‘ icons/PKfX8 çæ»’v‘ icons/active.gifPKfX8 çæ»’o’ icons/bundle.gifPKfX8öâÊZgÌh“ icons/export-package.gifPKfX8Zl¾z¤– icons/fragment.gifPKfX8QBQlå– icons/host.gifPKfX8–:ðÄé— icons/import-package.gifPKfX8›±Ðæ—˜ icons/importing-bundle.gifPKfX8ž-W£¤³¯™ icons/installed.gifPKfX8[ß_ÆP`”š icons/inuse.gifPKåƒP9’Ä-íGh!œ icons/logo16x16.gifPKfX8 çæ»’© icons/mini-logo.gifPKfX8Zl¾z¤¥ž icons/module.gifPKfX8ÐeZ]sŸ icons/property.gifPKfX8ƒç Bundle-Version: ${version} Bundle-Name: dnsjava is an implementation of DNS in Java Bundle-SymbolicName: org.xbill.dns Export-Package: org.xbill.DNS;version=${version},org.xbill.DNS.spi;version=${version},org.xbill.DNS.utils;version=${version},org.xbill.DNS.windows;version=${version} Bundle-Vendor: dnsjava.org Bundle-RequiredExecutionEnvironment: J2SE-1.4 Import-Package: !org.xbill.DNS*,!sun.*,* dnsjava-2.1.5/dig.java100644 0 0 10364 10664443415 11735 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) import java.io.*; import java.net.*; import org.xbill.DNS.*; /** @author Brian Wellington <bwelling@xbill.org> */ public class dig { static Name name = null; static int type = Type.A, dclass = DClass.IN; static void usage() { System.out.println("Usage: dig [@server] name [] [] " + "[options]"); System.exit(0); } static void doQuery(Message response, long ms) throws IOException { System.out.println("; java dig 0.0"); System.out.println(response); System.out.println(";; Query time: " + ms + " ms"); } static void doAXFR(Message response) throws IOException { System.out.println("; java dig 0.0 <> " + name + " axfr"); if (response.isSigned()) { System.out.print(";; TSIG "); if (response.isVerified()) System.out.println("ok"); else System.out.println("failed"); } if (response.getRcode() != Rcode.NOERROR) { System.out.println(response); return; } Record [] records = response.getSectionArray(Section.ANSWER); for (int i = 0; i < records.length; i++) System.out.println(records[i]); System.out.print(";; done ("); System.out.print(response.getHeader().getCount(Section.ANSWER)); System.out.print(" records, "); System.out.print(response.getHeader().getCount(Section.ADDITIONAL)); System.out.println(" additional)"); } public static void main(String argv[]) throws IOException { String server = null; int arg; Message query, response; Record rec; SimpleResolver res = null; boolean printQuery = false; long startTime, endTime; if (argv.length < 1) { usage(); } try { arg = 0; if (argv[arg].startsWith("@")) server = argv[arg++].substring(1); if (server != null) res = new SimpleResolver(server); else res = new SimpleResolver(); String nameString = argv[arg++]; if (nameString.equals("-x")) { name = ReverseMap.fromAddress(argv[arg++]); type = Type.PTR; dclass = DClass.IN; } else { name = Name.fromString(nameString, Name.root); type = Type.value(argv[arg]); if (type < 0) type = Type.A; else arg++; dclass = DClass.value(argv[arg]); if (dclass < 0) dclass = DClass.IN; else arg++; } while (argv[arg].startsWith("-") && argv[arg].length() > 1) { switch (argv[arg].charAt(1)) { case 'p': String portStr; int port; if (argv[arg].length() > 2) portStr = argv[arg].substring(2); else portStr = argv[++arg]; port = Integer.parseInt(portStr); if (port < 0 || port > 65536) { System.out.println("Invalid port"); return; } res.setPort(port); break; case 'b': String addrStr; if (argv[arg].length() > 2) addrStr = argv[arg].substring(2); else addrStr = argv[++arg]; InetAddress addr; try { addr = InetAddress.getByName(addrStr); } catch (Exception e) { System.out.println("Invalid address"); return; } res.setLocalAddress(addr); break; case 'k': String key; if (argv[arg].length() > 2) key = argv[arg].substring(2); else key = argv[++arg]; res.setTSIGKey(TSIG.fromString(key)); break; case 't': res.setTCP(true); break; case 'i': res.setIgnoreTruncation(true); break; case 'e': String ednsStr; int edns; if (argv[arg].length() > 2) ednsStr = argv[arg].substring(2); else ednsStr = argv[++arg]; edns = Integer.parseInt(ednsStr); if (edns < 0 || edns > 1) { System.out.println("Unsupported " + "EDNS level: " + edns); return; } res.setEDNS(edns); break; case 'd': res.setEDNS(0, 0, ExtendedFlags.DO, null); break; case 'q': printQuery = true; break; default: System.out.print("Invalid option: "); System.out.println(argv[arg]); } arg++; } } catch (ArrayIndexOutOfBoundsException e) { if (name == null) usage(); } if (res == null) res = new SimpleResolver(); rec = Record.newRecord(name, type, dclass); query = Message.newQuery(rec); if (printQuery) System.out.println(query); startTime = System.currentTimeMillis(); response = res.send(query); endTime = System.currentTimeMillis(); if (type == Type.AXFR) doAXFR(response); else doQuery(response, endTime - startTime); } } dnsjava-2.1.5/doc/allclasses-frame.html100644 0 0 42731 12131352547 15177 0ustar 0 0 All Classes (dnsjava documentation)

All Classes

dnsjava-2.1.5/doc/allclasses-noframe.html100644 0 0 35255 12131352547 15537 0ustar 0 0 All Classes (dnsjava documentation)

All Classes

dnsjava-2.1.5/doc/constant-values.html100644 0 0 410361 12131352547 15125 0ustar 0 0 Constant Field Values (dnsjava documentation)

Constant Field Values

Contents

org.xbill.*

  • org.xbill.DNS.Address 
    Modifier and Type Constant Field Value
    public static final int IPv4 1
    public static final int IPv6 2
  • org.xbill.DNS.CERTRecord 
    Modifier and Type Constant Field Value
    public static final int OID 254
    public static final int PGP 3
    public static final int PKIX 1
    public static final int SPKI 2
    public static final int URI 253
  • org.xbill.DNS.CERTRecord.CertificateType 
    Modifier and Type Constant Field Value
    public static final int ACPKIX 7
    public static final int IACPKIX 8
    public static final int IPGP 6
    public static final int IPKIX 4
    public static final int ISPKI 5
    public static final int OID 254
    public static final int PGP 3
    public static final int PKIX 1
    public static final int SPKI 2
    public static final int URI 253
  • org.xbill.DNS.Credibility 
    Modifier and Type Constant Field Value
    public static final int ADDITIONAL 1
    public static final int ANY 1
    public static final int AUTH_ANSWER 4
    public static final int AUTH_AUTHORITY 4
    public static final int GLUE 2
    public static final int HINT 0
    public static final int NONAUTH_ANSWER 3
    public static final int NONAUTH_AUTHORITY 3
    public static final int NORMAL 3
    public static final int ZONE 5
  • org.xbill.DNS.DClass 
    Modifier and Type Constant Field Value
    public static final int ANY 255
    public static final int CH 3
    public static final int CHAOS 3
    public static final int HESIOD 4
    public static final int HS 4
    public static final int IN 1
    public static final int NONE 254
  • org.xbill.DNS.DLVRecord 
    Modifier and Type Constant Field Value
    public static final int SHA1_DIGEST_ID 1
    public static final int SHA256_DIGEST_ID 1
  • org.xbill.DNS.DNSKEYRecord.Flags 
    Modifier and Type Constant Field Value
    public static final int REVOKE 128
    public static final int SEP_KEY 1
    public static final int ZONE_KEY 256
  • org.xbill.DNS.DNSKEYRecord.Protocol 
    Modifier and Type Constant Field Value
    public static final int DNSSEC 3
  • org.xbill.DNS.DNSSEC.Algorithm 
    Modifier and Type Constant Field Value
    public static final int DH 2
    public static final int DSA 3
    public static final int DSA_NSEC3_SHA1 6
    public static final int ECDSAP256SHA256 13
    public static final int ECDSAP384SHA384 14
    public static final int INDIRECT 252
    public static final int PRIVATEDNS 253
    public static final int PRIVATEOID 254
    public static final int RSA_NSEC3_SHA1 7
    public static final int RSAMD5 1
    public static final int RSASHA1 5
    public static final int RSASHA256 8
    public static final int RSASHA512 10
  • org.xbill.DNS.DSRecord 
    Modifier and Type Constant Field Value
    public static final int SHA1_DIGEST_ID 1
    public static final int SHA256_DIGEST_ID 2
    public static final int SHA384_DIGEST_ID 4
  • org.xbill.DNS.DSRecord.Digest 
    Modifier and Type Constant Field Value
    public static final int SHA1 1
    public static final int SHA256 2
    public static final int SHA384 4
  • org.xbill.DNS.EDNSOption.Code 
    Modifier and Type Constant Field Value
    public static final int CLIENT_SUBNET 20730
    public static final int NSID 3
  • org.xbill.DNS.ExtendedFlags 
    Modifier and Type Constant Field Value
    public static final int DO 32768
  • org.xbill.DNS.Flags 
    Modifier and Type Constant Field Value
    public static final byte AA 5
    public static final byte AD 10
    public static final byte CD 11
    public static final int DO 32768
    public static final byte QR 0
    public static final byte RA 8
    public static final byte RD 7
    public static final byte TC 6
  • org.xbill.DNS.Header 
    Modifier and Type Constant Field Value
    public static final int LENGTH 12
  • org.xbill.DNS.IPSECKEYRecord.Algorithm 
    Modifier and Type Constant Field Value
    public static final int DSA 1
    public static final int RSA 2
  • org.xbill.DNS.IPSECKEYRecord.Gateway 
    Modifier and Type Constant Field Value
    public static final int IPv4 1
    public static final int IPv6 2
    public static final int Name 3
    public static final int None 0
  • org.xbill.DNS.KEYRecord 
    Modifier and Type Constant Field Value
    public static final int FLAG_NOAUTH 32768
    public static final int FLAG_NOCONF 16384
    public static final int FLAG_NOKEY 49152
    public static final int OWNER_HOST 512
    public static final int OWNER_USER 0
    public static final int OWNER_ZONE 256
    public static final int PROTOCOL_ANY 255
    public static final int PROTOCOL_DNSSEC 3
    public static final int PROTOCOL_EMAIL 2
    public static final int PROTOCOL_IPSEC 4
    public static final int PROTOCOL_TLS 1
  • org.xbill.DNS.KEYRecord.Flags 
    Modifier and Type Constant Field Value
    public static final int EXTEND 4096
    public static final int FLAG10 32
    public static final int FLAG11 16
    public static final int FLAG2 8192
    public static final int FLAG4 2048
    public static final int FLAG5 1024
    public static final int FLAG8 128
    public static final int FLAG9 64
    public static final int HOST 512
    public static final int NOAUTH 32768
    public static final int NOCONF 16384
    public static final int NOKEY 49152
    public static final int NTYP3 768
    public static final int OWNER_MASK 768
    public static final int SIG0 0
    public static final int SIG1 1
    public static final int SIG10 10
    public static final int SIG11 11
    public static final int SIG12 12
    public static final int SIG13 13
    public static final int SIG14 14
    public static final int SIG15 15
    public static final int SIG2 2
    public static final int SIG3 3
    public static final int SIG4 4
    public static final int SIG5 5
    public static final int SIG6 6
    public static final int SIG7 7
    public static final int SIG8 8
    public static final int SIG9 9
    public static final int USE_MASK 49152
    public static final int USER 0
    public static final int ZONE 256
  • org.xbill.DNS.KEYRecord.Protocol 
    Modifier and Type Constant Field Value
    public static final int ANY 255
    public static final int DNSSEC 3
    public static final int EMAIL 2
    public static final int IPSEC 4
    public static final int NONE 0
    public static final int TLS 1
  • org.xbill.DNS.Lookup 
    Modifier and Type Constant Field Value
    public static final int HOST_NOT_FOUND 3
    public static final int SUCCESSFUL 0
    public static final int TRY_AGAIN 2
    public static final int TYPE_NOT_FOUND 4
    public static final int UNRECOVERABLE 1
  • org.xbill.DNS.Message 
    Modifier and Type Constant Field Value
    public static final int MAXLENGTH 65535
  • org.xbill.DNS.NSEC3Record 
    Modifier and Type Constant Field Value
    public static final int SHA1_DIGEST_ID 1
  • org.xbill.DNS.NSEC3Record.Digest 
    Modifier and Type Constant Field Value
    public static final int SHA1 1
  • org.xbill.DNS.NSEC3Record.Flags 
    Modifier and Type Constant Field Value
    public static final int OPT_OUT 1
  • org.xbill.DNS.Opcode 
    Modifier and Type Constant Field Value
    public static final int IQUERY 1
    public static final int NOTIFY 4
    public static final int QUERY 0
    public static final int STATUS 2
    public static final int UPDATE 5
  • org.xbill.DNS.Rcode 
    Modifier and Type Constant Field Value
    public static final int BADKEY 17
    public static final int BADMODE 19
    public static final int BADSIG 16
    public static final int BADTIME 18
    public static final int BADVERS 16
    public static final int FORMERR 1
    public static final int NOERROR 0
    public static final int NOTAUTH 9
    public static final int NOTIMP 4
    public static final int NOTIMPL 4
    public static final int NOTZONE 10
    public static final int NXDOMAIN 3
    public static final int NXRRSET 8
    public static final int REFUSED 5
    public static final int SERVFAIL 2
    public static final int YXDOMAIN 6
    public static final int YXRRSET 7
  • org.xbill.DNS.Section 
    Modifier and Type Constant Field Value
    public static final int ADDITIONAL 3
    public static final int ANSWER 1
    public static final int AUTHORITY 2
    public static final int PREREQ 1
    public static final int QUESTION 0
    public static final int UPDATE 2
    public static final int ZONE 0
  • org.xbill.DNS.SimpleResolver 
    Modifier and Type Constant Field Value
    public static final int DEFAULT_EDNS_PAYLOADSIZE 1280
    public static final int DEFAULT_PORT 53
  • org.xbill.DNS.SSHFPRecord.Algorithm 
    Modifier and Type Constant Field Value
    public static final int DSS 2
    public static final int RSA 1
  • org.xbill.DNS.SSHFPRecord.Digest 
    Modifier and Type Constant Field Value
    public static final int SHA1 1
  • org.xbill.DNS.TKEYRecord 
    Modifier and Type Constant Field Value
    public static final int DELETE 5
    public static final int DIFFIEHELLMAN 2
    public static final int GSSAPI 3
    public static final int RESOLVERASSIGNED 4
    public static final int SERVERASSIGNED 1
  • org.xbill.DNS.TLSARecord.CertificateUsage 
    Modifier and Type Constant Field Value
    public static final int CA_CONSTRAINT 0
    public static final int DOMAIN_ISSUED_CERTIFICATE 3
    public static final int SERVICE_CERTIFICATE_CONSTRAINT 1
    public static final int TRUST_ANCHOR_ASSERTION 2
  • org.xbill.DNS.TLSARecord.MatchingType 
    Modifier and Type Constant Field Value
    public static final int EXACT 0
    public static final int SHA256 1
    public static final int SHA512 2
  • org.xbill.DNS.TLSARecord.Selector 
    Modifier and Type Constant Field Value
    public static final int FULL_CERTIFICATE 0
    public static final int SUBJECT_PUBLIC_KEY_INFO 1
  • org.xbill.DNS.Tokenizer 
    Modifier and Type Constant Field Value
    public static final int COMMENT 5
    public static final int EOF 0
    public static final int EOL 1
    public static final int IDENTIFIER 3
    public static final int QUOTED_STRING 4
    public static final int WHITESPACE 2
  • org.xbill.DNS.TSIG 
    Modifier and Type Constant Field Value
    public static final short FUDGE 300
  • org.xbill.DNS.TTL 
    Modifier and Type Constant Field Value
    public static final long MAX_VALUE 2147483647L
  • org.xbill.DNS.Type 
    Modifier and Type Constant Field Value
    public static final int A 1
    public static final int A6 38
    public static final int AAAA 28
    public static final int AFSDB 18
    public static final int ANY 255
    public static final int APL 42
    public static final int ATMA 34
    public static final int AXFR 252
    public static final int CERT 37
    public static final int CNAME 5
    public static final int DHCID 49
    public static final int DLV 32769
    public static final int DNAME 39
    public static final int DNSKEY 48
    public static final int DS 43
    public static final int EID 31
    public static final int GPOS 27
    public static final int HINFO 13
    public static final int IPSECKEY 45
    public static final int ISDN 20
    public static final int IXFR 251
    public static final int KEY 25
    public static final int KX 36
    public static final int LOC 29
    public static final int MAILA 254
    public static final int MAILB 253
    public static final int MB 7
    public static final int MD 3
    public static final int MF 4
    public static final int MG 8
    public static final int MINFO 14
    public static final int MR 9
    public static final int MX 15
    public static final int NAPTR 35
    public static final int NIMLOC 32
    public static final int NS 2
    public static final int NSAP 22
    public static final int NSAP_PTR 23
    public static final int NSEC 47
    public static final int NSEC3 50
    public static final int NSEC3PARAM 51
    public static final int NULL 10
    public static final int NXT 30
    public static final int OPT 41
    public static final int PTR 12
    public static final int PX 26
    public static final int RP 17
    public static final int RRSIG 46
    public static final int RT 21
    public static final int SIG 24
    public static final int SOA 6
    public static final int SPF 99
    public static final int SRV 33
    public static final int SSHFP 44
    public static final int TKEY 249
    public static final int TLSA 52
    public static final int TSIG 250
    public static final int TXT 16
    public static final int WKS 11
    public static final int X25 19
  • org.xbill.DNS.WKSRecord.Protocol 
    Modifier and Type Constant Field Value
    public static final int ARGUS 13
    public static final int BBN_RCC_MON 10
    public static final int BR_SAT_MON 76
    public static final int CFTP 62
    public static final int CHAOS 16
    public static final int DCN_MEAS 19
    public static final int EGP 8
    public static final int EMCON 14
    public static final int GGP 3
    public static final int HMP 20
    public static final int ICMP 1
    public static final int IGMP 2
    public static final int IGP 9
    public static final int IPCV 71
    public static final int IPPC 67
    public static final int IRTP 28
    public static final int ISO_TP4 29
    public static final int LEAF_1 25
    public static final int LEAF_2 26
    public static final int MERIT_INP 32
    public static final int MFE_NSP 31
    public static final int MIT_SUBNET 65
    public static final int MUX 18
    public static final int NETBLT 30
    public static final int NVP_II 11
    public static final int PRM 21
    public static final int PUP 12
    public static final int RDP 27
    public static final int RVD 66
    public static final int SAT_EXPAK 64
    public static final int SAT_MON 69
    public static final int SEP 33
    public static final int ST 5
    public static final int TCP 6
    public static final int TRUNK_1 23
    public static final int TRUNK_2 24
    public static final int UCL 7
    public static final int UDP 17
    public static final int WB_EXPAK 79
    public static final int WB_MON 78
    public static final int XNET 15
    public static final int XNS_IDP 22
  • org.xbill.DNS.WKSRecord.Service 
    Modifier and Type Constant Field Value
    public static final int AUTH 113
    public static final int BL_IDM 142
    public static final int BOOTPC 68
    public static final int BOOTPS 67
    public static final int CHARGEN 19
    public static final int CISCO_FNA 130
    public static final int CISCO_SYS 132
    public static final int CISCO_TNA 131
    public static final int CSNET_NS 105
    public static final int DAYTIME 13
    public static final int DCP 93
    public static final int DISCARD 9
    public static final int DOMAIN 53
    public static final int DSP 33
    public static final int ECHO 7
    public static final int EMFIS_CNTL 141
    public static final int EMFIS_DATA 140
    public static final int ERPC 121
    public static final int FINGER 79
    public static final int FTP 21
    public static final int FTP_DATA 20
    public static final int GRAPHICS 41
    public static final int HOSTNAME 101
    public static final int HOSTS2_NS 81
    public static final int INGRES_NET 134
    public static final int ISI_GL 55
    public static final int ISO_TSAP 102
    public static final int LA_MAINT 51
    public static final int LINK 245
    public static final int LOC_SRV 135
    public static final int LOCUS_CON 127
    public static final int LOCUS_MAP 125
    public static final int LOGIN 49
    public static final int METAGRAM 99
    public static final int MIT_DOV 91
    public static final int MPM 45
    public static final int MPM_FLAGS 44
    public static final int MPM_SND 46
    public static final int MSG_AUTH 31
    public static final int MSG_ICP 29
    public static final int NAMESERVER 42
    public static final int NETBIOS_DGM 138
    public static final int NETBIOS_NS 137
    public static final int NETBIOS_SSN 139
    public static final int NETRJS_1 71
    public static final int NETRJS_2 72
    public static final int NETRJS_3 73
    public static final int NETRJS_4 74
    public static final int NI_FTP 47
    public static final int NI_MAIL 61
    public static final int NICNAME 43
    public static final int NNTP 119
    public static final int NSW_FE 27
    public static final int NTP 123
    public static final int POP_2 109
    public static final int PROFILE 136
    public static final int PWDGEN 129
    public static final int QUOTE 17
    public static final int RJE 5
    public static final int RLP 39
    public static final int RTELNET 107
    public static final int SFTP 115
    public static final int SMTP 25
    public static final int STATSRV 133
    public static final int SU_MIT_TG 89
    public static final int SUNRPC 111
    public static final int SUPDUP 95
    public static final int SUR_MEAS 243
    public static final int SWIFT_RVF 97
    public static final int TACACS_DS 65
    public static final int TACNEWS 98
    public static final int TELNET 23
    public static final int TFTP 69
    public static final int TIME 37
    public static final int USERS 11
    public static final int UUCP_PATH 117
    public static final int VIA_FTP 63
    public static final int X400 103
    public static final int X400_SND 104
  • org.xbill.DNS.Zone 
    Modifier and Type Constant Field Value
    public static final int PRIMARY 1
    public static final int SECONDARY 2
  • org.xbill.DNS.utils.base32.Alphabet 
    Modifier and Type Constant Field Value
    public static final String BASE32 "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="
    public static final String BASE32HEX "0123456789ABCDEFGHIJKLMNOPQRSTUV="
dnsjava-2.1.5/doc/deprecated-list.html100644 0 0 11014 12131352547 15020 0ustar 0 0 Deprecated List (dnsjava documentation)

Deprecated API

Contents

dnsjava-2.1.5/doc/help-doc.html100644 0 0 17513 12131352547 13454 0ustar 0 0 API Help (dnsjava documentation)

How This API Document Is Organized

This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
  • Overview

    The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

  • Package

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    • Interfaces (italic)
    • Classes
    • Enums
    • Exceptions
    • Errors
    • Annotation Types
  • Class/Interface

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    • Class inheritance diagram
    • Direct Subclasses
    • All Known Subinterfaces
    • All Known Implementing Classes
    • Class/interface declaration
    • Class/interface description
    • Nested Class Summary
    • Field Summary
    • Constructor Summary
    • Method Summary
    • Field Detail
    • Constructor Detail
    • Method Detail

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

  • Annotation Type

    Each annotation type has its own separate page with the following sections:

    • Annotation Type declaration
    • Annotation Type description
    • Required Element Summary
    • Optional Element Summary
    • Element Detail
  • Enum

    Each enum has its own separate page with the following sections:

    • Enum declaration
    • Enum description
    • Enum Constant Summary
    • Enum Constant Detail
  • Tree (Class Hierarchy)

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
  • Deprecated API

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

  • Index

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

  • Prev/Next

    These links take you to the next or previous class, interface, package, or related page.

  • Frames/No Frames

    These links show and hide the HTML frames. All pages are available with or without frames.

  • All Classes

    The All Classes link shows all classes and interfaces except non-static nested types.

  • Serialized Form

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

  • Constant Field Values

    The Constant Field Values page lists the static final fields and their values.

This help file applies to API documentation generated using the standard doclet.
dnsjava-2.1.5/doc/index-all.html100644 0 0 1457415 12131352547 13710 0ustar 0 0 Index (dnsjava documentation)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ 

A

A - Static variable in class org.xbill.DNS.Type
Address
A6 - Static variable in class org.xbill.DNS.Type
IPv6 address (experimental)
A6Record - Class in org.xbill.DNS
A6 Record - maps a domain name to an IPv6 address (experimental)
A6Record(Name, int, long, int, InetAddress, Name) - Constructor for class org.xbill.DNS.A6Record
Creates an A6 Record from the given data
AA - Static variable in class org.xbill.DNS.Flags
authoritative answer
AAAA - Static variable in class org.xbill.DNS.Type
IPv6 address
AAAARecord - Class in org.xbill.DNS
IPv6 Address Record - maps a domain name to an IPv6 address
AAAARecord(Name, int, long, InetAddress) - Constructor for class org.xbill.DNS.AAAARecord
Creates an AAAA Record from the given data
absent(Name) - Method in class org.xbill.DNS.Update
Inserts a prerequisite that the specified name does not exist; that is, there are no records with the given name in the zone.
absent(Name, int) - Method in class org.xbill.DNS.Update
Inserts a prerequisite that the specified rrset does not exist; that is, there are no records with the given name and type in the zone.
ACPKIX - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Attribute Certificate
AD - Static variable in class org.xbill.DNS.Flags
authenticated data
add(int, Name) - Method in class org.xbill.DNS.Compression
Adds a compression entry mapping a name to a position in a message.
add(Name, int, long, String) - Method in class org.xbill.DNS.Update
Parses a record from the string, and indicates that the record should be inserted into the zone.
add(Name, int, long, Tokenizer) - Method in class org.xbill.DNS.Update
Parses a record from the tokenizer, and indicates that the record should be inserted into the zone.
add(Record) - Method in class org.xbill.DNS.Update
Indicates that the record should be inserted into the zone.
add(Record[]) - Method in class org.xbill.DNS.Update
Indicates that the records should be inserted into the zone.
add(RRset) - Method in class org.xbill.DNS.Update
Indicates that all of the records in the rrset should be inserted into the zone.
ADDITIONAL - Static variable in class org.xbill.DNS.Credibility
The additional section of a response.
ADDITIONAL - Static variable in class org.xbill.DNS.Section
The additional (fourth) section
addMessage(Message) - Method in class org.xbill.DNS.Cache
Adds all data from a Message into the Cache.
addNegative(Name, int, SOARecord, int) - Method in class org.xbill.DNS.Cache
Adds a negative entry to the Cache.
addRecord(Record, int, Object) - Method in class org.xbill.DNS.Cache
Adds a record to the Cache.
addRecord(Record, int) - Method in class org.xbill.DNS.Message
Adds a record to a section of the Message, and adjusts the header.
addRecord(Record) - Method in class org.xbill.DNS.Zone
Adds a Record to the Zone
addResolver(Resolver) - Method in class org.xbill.DNS.ExtendedResolver
Adds a new resolver to be used by this ExtendedResolver
Address - Class in org.xbill.DNS
Routines dealing with IP addresses.
address - Variable in class org.xbill.DNS.APLRecord.Element
 
addressLength(int) - Static method in class org.xbill.DNS.Address
Returns the length of an address in a particular family.
addRR(Record) - Method in class org.xbill.DNS.RRset
Adds a Record to an RRset
addRRset(RRset, int) - Method in class org.xbill.DNS.Cache
Adds an RRset to the Cache.
addRRset(RRset) - Method in class org.xbill.DNS.Zone
Adds an RRset to the Zone
adds - Variable in class org.xbill.DNS.ZoneTransferIn.Delta
A list of records added between the start and end versions
AFSDB - Static variable in class org.xbill.DNS.Type
AFS cell database
AFSDBRecord - Class in org.xbill.DNS
AFS Data Base Record - maps a domain name to the name of an AFS cell database server.
AFSDBRecord(Name, int, long, int, Name) - Constructor for class org.xbill.DNS.AFSDBRecord
Creates an AFSDB Record from the given data.
algString(int) - Static method in class org.xbill.DNS.DNSSEC
Convert an algorithm number to the corresponding JCA string.
ANSWER - Static variable in class org.xbill.DNS.Section
The answer (second) section
answers() - Method in class org.xbill.DNS.SetResponse
If the query was successful, return the answers
ANY - Static variable in class org.xbill.DNS.Credibility
Data not required to be credible.
ANY - Static variable in class org.xbill.DNS.DClass
Matches any class
ANY - Static variable in class org.xbill.DNS.KEYRecord.Protocol
Any protocol
ANY - Static variable in class org.xbill.DNS.Type
Matches any type
APL - Static variable in class org.xbill.DNS.Type
Address Prefix List
APLRecord - Class in org.xbill.DNS
APL - Address Prefix List.
APLRecord(Name, int, long, List) - Constructor for class org.xbill.DNS.APLRecord
Creates an APL Record from the given data.
APLRecord.Element - Class in org.xbill.DNS
 
APLRecord.Element(boolean, InetAddress, int) - Constructor for class org.xbill.DNS.APLRecord.Element
Creates an APL element corresponding to an IPv4 or IPv6 prefix.
apply(Message, int, TSIGRecord) - Method in class org.xbill.DNS.TSIG
Generates a TSIG record with a specific error for a message and adds it to the message.
apply(Message, TSIGRecord) - Method in class org.xbill.DNS.TSIG
Generates a TSIG record for a message and adds it to the message
applyStream(Message, TSIGRecord, boolean) - Method in class org.xbill.DNS.TSIG
Generates a TSIG record for a message and adds it to the message
ARecord - Class in org.xbill.DNS
Address Record - maps a domain name to an Internet address
ARecord(Name, int, long, InetAddress) - Constructor for class org.xbill.DNS.ARecord
Creates an A Record from the given data
ARGUS - Static variable in class org.xbill.DNS.WKSRecord.Protocol
ARGUS
ATMA - Static variable in class org.xbill.DNS.Type
ATM address
AUTH - Static variable in class org.xbill.DNS.WKSRecord.Service
Authentication Service
AUTH_ANSWER - Static variable in class org.xbill.DNS.Credibility
The answer section of a authoritative response.
AUTH_AUTHORITY - Static variable in class org.xbill.DNS.Credibility
The authority section of an authoritative response.
AUTHORITY - Static variable in class org.xbill.DNS.Section
The authority (third) section
AXFR - Static variable in class org.xbill.DNS.Type
Zone transfer
AXFR() - Method in class org.xbill.DNS.Zone
Returns an Iterator over the RRsets in the zone that can be used to construct an AXFR response.

B

BADKEY - Static variable in class org.xbill.DNS.Rcode
The key is invalid (TSIG/TKEY extended error)
BADMODE - Static variable in class org.xbill.DNS.Rcode
The mode is invalid (TKEY extended error)
BADSIG - Static variable in class org.xbill.DNS.Rcode
The signature is invalid (TSIG/TKEY extended error)
BADTIME - Static variable in class org.xbill.DNS.Rcode
The time is out of range (TSIG/TKEY extended error)
BADVERS - Static variable in class org.xbill.DNS.Rcode
Unsupported EDNS level
base16 - Class in org.xbill.DNS.utils
Routines for converting between Strings of hex-encoded data and arrays of binary data.
base32 - Class in org.xbill.DNS.utils
Routines for converting between Strings of base32-encoded data and arrays of binary data.
base32(String, boolean, boolean) - Constructor for class org.xbill.DNS.utils.base32
Creates an object that can be used to do base32 conversions.
BASE32 - Static variable in class org.xbill.DNS.utils.base32.Alphabet
 
base32.Alphabet - Class in org.xbill.DNS.utils
 
BASE32HEX - Static variable in class org.xbill.DNS.utils.base32.Alphabet
 
base64 - Class in org.xbill.DNS.utils
Routines for converting between Strings of base64-encoded data and arrays of binary data.
BBN_RCC_MON - Static variable in class org.xbill.DNS.WKSRecord.Protocol
BBN RCC Monitoring
BL_IDM - Static variable in class org.xbill.DNS.WKSRecord.Service
Britton-Lee IDM
BOOTPC - Static variable in class org.xbill.DNS.WKSRecord.Service
Bootstrap Protocol Client
BOOTPS - Static variable in class org.xbill.DNS.WKSRecord.Service
Bootstrap Protocol Server
BR_SAT_MON - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Backroom SATNET Monitoring
byteArrayFromString(String) - Static method in class org.xbill.DNS.Record
Converts a String into a byte array.
byteArrayToString(byte[], boolean) - Static method in class org.xbill.DNS.Record
Converts a byte array into a String.

C

CA_CONSTRAINT - Static variable in class org.xbill.DNS.TLSARecord.CertificateUsage
 
Cache - Class in org.xbill.DNS
A cache of DNS records.
Cache(int) - Constructor for class org.xbill.DNS.Cache
Creates an empty Cache
Cache() - Constructor for class org.xbill.DNS.Cache
Creates an empty Cache for class IN.
Cache(String) - Constructor for class org.xbill.DNS.Cache
Creates a Cache which initially contains all records in the specified file.
canonicalize() - Method in class org.xbill.DNS.Name
Returns a canonicalized version of the Name (all lowercase).
CD - Static variable in class org.xbill.DNS.Flags
(security) checking disabled
CERT - Static variable in class org.xbill.DNS.Type
Certificate
CERTRecord - Class in org.xbill.DNS
Certificate Record - Stores a certificate associated with a name.
CERTRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.CERTRecord
Creates a CERT Record from the given data
CERTRecord.CertificateType - Class in org.xbill.DNS
 
CFTP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
CFTP
CH - Static variable in class org.xbill.DNS.DClass
Chaos network (MIT)
CHAOS - Static variable in class org.xbill.DNS.DClass
Chaos network (MIT, alternate name)
CHAOS - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Chaos
CHARGEN - Static variable in class org.xbill.DNS.WKSRecord.Service
Character Generator
check(int) - Static method in class org.xbill.DNS.DClass
Checks that a numeric DClass is valid.
check(String) - Static method in class org.xbill.DNS.Options
Checks if an option is defined
check(int) - Static method in class org.xbill.DNS.Type
Checks that a numeric Type is valid.
CISCO_FNA - Static variable in class org.xbill.DNS.WKSRecord.Service
CISCO FNATIVE
CISCO_SYS - Static variable in class org.xbill.DNS.WKSRecord.Service
CISCO SYSMAINT
CISCO_TNA - Static variable in class org.xbill.DNS.WKSRecord.Service
CISCO TNATIVE
clear() - Static method in class org.xbill.DNS.Options
Clears all defined options
clear() - Method in class org.xbill.DNS.RRset
Deletes all Records from an RRset
clear() - Method in class org.xbill.DNS.utils.HMAC
Resets the HMAC object for further use
clearActive() - Method in class org.xbill.DNS.DNSInput
Clears the active region of the string.
clearCache() - Method in class org.xbill.DNS.Cache
Empties the Cache.
CLIENT_SUBNET - Static variable in class org.xbill.DNS.EDNSOption.Code
Client Subnet, defined in draft-vandergaast-edns-client-subnet-00
ClientSubnetOption - Class in org.xbill.DNS
The Client Subnet EDNS Option, defined in http://tools.ietf.org/html/draft-vandergaast-edns-client-subnet-00 ("Client subnet in DNS requests").
ClientSubnetOption(int, int, InetAddress) - Constructor for class org.xbill.DNS.ClientSubnetOption
Construct a Client Subnet option.
ClientSubnetOption(int, InetAddress) - Constructor for class org.xbill.DNS.ClientSubnetOption
Construct a Client Subnet option with scope netmask set to 0.
clone() - Method in class org.xbill.DNS.Header
 
clone() - Method in class org.xbill.DNS.Message
Creates a copy of this Message.
close() - Method in class org.xbill.DNS.Tokenizer
Closes any files opened by this tokenizer.
CNAME - Static variable in class org.xbill.DNS.Type
Canonical name (alias)
CNAMERecord - Class in org.xbill.DNS
CNAME Record - maps an alias to its real name
CNAMERecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.CNAMERecord
Creates a new CNAMERecord with the given data
COMMENT - Static variable in class org.xbill.DNS.Tokenizer
A comment; only returned when wantComment is set
compare(long, long) - Static method in class org.xbill.DNS.Serial
Compares two numbers using serial arithmetic.
compareTo(Object) - Method in class org.xbill.DNS.Name
Compares this Name to another Object.
compareTo(Object) - Method in class org.xbill.DNS.Record
Compares this Record to another Object.
Compression - Class in org.xbill.DNS
DNS Name Compression object.
Compression() - Constructor for class org.xbill.DNS.Compression
Creates a new Compression object.
concatenate(Name, Name) - Static method in class org.xbill.DNS.Name
Creates a new name by concatenating two existing names.
createNameService() - Method in class org.xbill.DNS.spi.DNSJavaNameServiceDescriptor
Returns a reference to a dnsjava name server provider.
Credibility - Class in org.xbill.DNS
Constants relating to the credibility of cached data, which is based on the data's source.
CSNET_NS - Static variable in class org.xbill.DNS.WKSRecord.Service
Mailbox Name Nameserver
current() - Method in class org.xbill.DNS.DNSInput
Returns the current position.
current() - Method in class org.xbill.DNS.DNSOutput
Returns the current position.

D

DAYTIME - Static variable in class org.xbill.DNS.WKSRecord.Service
Daytime
DClass - Class in org.xbill.DNS
Constants and functions relating to DNS classes.
dclass - Variable in class org.xbill.DNS.Generator
The class of the generated records.
dclass - Variable in class org.xbill.DNS.Record
 
DCN_MEAS - Static variable in class org.xbill.DNS.WKSRecord.Protocol
DCN Measurement Subsystems
DCP - Static variable in class org.xbill.DNS.WKSRecord.Service
Device Control Protocol
DEFAULT_EDNS_PAYLOADSIZE - Static variable in class org.xbill.DNS.SimpleResolver
The default EDNS payload size
DEFAULT_PORT - Static variable in class org.xbill.DNS.SimpleResolver
The default port to send queries to
DELETE - Static variable in class org.xbill.DNS.TKEYRecord
The key should be deleted
delete(Name) - Method in class org.xbill.DNS.Update
Indicates that all records with the given name should be deleted from the zone.
delete(Name, int) - Method in class org.xbill.DNS.Update
Indicates that all records with the given name and type should be deleted from the zone.
delete(Name, int, String) - Method in class org.xbill.DNS.Update
Parses a record from the string, and indicates that the record should be deleted from the zone.
delete(Name, int, Tokenizer) - Method in class org.xbill.DNS.Update
Parses a record from the tokenizer, and indicates that the record should be deleted from the zone.
delete(Record) - Method in class org.xbill.DNS.Update
Indicates that the specified record should be deleted from the zone.
delete(Record[]) - Method in class org.xbill.DNS.Update
Indicates that the records should be deleted from the zone.
delete(RRset) - Method in class org.xbill.DNS.Update
Indicates that all of the records in the rrset should be deleted from the zone.
deleteResolver(Resolver) - Method in class org.xbill.DNS.ExtendedResolver
Deletes a resolver used by this ExtendedResolver
deleteRR(Record) - Method in class org.xbill.DNS.RRset
Deletes a Record from an RRset
deletes - Variable in class org.xbill.DNS.ZoneTransferIn.Delta
A list of records deleted between the start and end versions
DH - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
Diffie Hellman key
DHCID - Static variable in class org.xbill.DNS.Type
Dynamic Host Configuration Protocol (DHCP) ID
DHCIDRecord - Class in org.xbill.DNS
DHCID - Dynamic Host Configuration Protocol (DHCP) ID (RFC 4701)
DHCIDRecord(Name, int, long, byte[]) - Constructor for class org.xbill.DNS.DHCIDRecord
Creates an DHCID Record from the given data
DIFFIEHELLMAN - Static variable in class org.xbill.DNS.TKEYRecord
The key is computed using a Diffie-Hellman key exchange
digestLength() - Method in class org.xbill.DNS.utils.HMAC
Returns the length of the digest.
digestMessage(SIGRecord, Message, byte[]) - Static method in class org.xbill.DNS.DNSSEC
Creates a byte array containing the concatenation of the fields of the SIG(0) record and the message to be signed.
digestRRset(RRSIGRecord, RRset) - Static method in class org.xbill.DNS.DNSSEC
Creates a byte array containing the concatenation of the fields of the SIG record and the RRsets to be signed/verified.
DISCARD - Static variable in class org.xbill.DNS.WKSRecord.Service
Discard
DLV - Static variable in class org.xbill.DNS.Type
DNSSEC Lookaside Validation, RFC 4431 .
DLVRecord - Class in org.xbill.DNS
DLV - contains a Delegation Lookaside Validation record, which acts as the equivalent of a DS record in a lookaside zone.
DLVRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.DLVRecord
Creates a DLV Record from the given data
DNAME - Static variable in class org.xbill.DNS.Type
Non-terminal name redirection
DNAMERecord - Class in org.xbill.DNS
DNAME Record - maps a nonterminal alias (subtree) to a different domain
DNAMERecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.DNAMERecord
Creates a new DNAMERecord with the given data
DNSInput - Class in org.xbill.DNS
An class for parsing DNS messages.
DNSInput(byte[]) - Constructor for class org.xbill.DNS.DNSInput
Creates a new DNSInput
DNSJavaNameService - Class in org.xbill.DNS.spi
This class implements a Name Service Provider, which Java can use (starting with version 1.4), to perform DNS resolutions instead of using the standard calls.
DNSJavaNameService() - Constructor for class org.xbill.DNS.spi.DNSJavaNameService
Creates a DNSJavaNameService instance.
DNSJavaNameServiceDescriptor - Class in org.xbill.DNS.spi
The descriptor class for the dnsjava name service provider.
DNSJavaNameServiceDescriptor() - Constructor for class org.xbill.DNS.spi.DNSJavaNameServiceDescriptor
 
DNSKEY - Static variable in class org.xbill.DNS.Type
DNSSEC Key
DNSKEYRecord - Class in org.xbill.DNS
Key - contains a cryptographic public key for use by DNS.
DNSKEYRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.DNSKEYRecord
Creates a DNSKEY Record from the given data
DNSKEYRecord(Name, int, long, int, int, int, PublicKey) - Constructor for class org.xbill.DNS.DNSKEYRecord
Creates a DNSKEY Record from the given data
DNSKEYRecord.Flags - Class in org.xbill.DNS
 
DNSKEYRecord.Protocol - Class in org.xbill.DNS
 
DNSOutput - Class in org.xbill.DNS
A class for rendering DNS messages.
DNSOutput(int) - Constructor for class org.xbill.DNS.DNSOutput
Create a new DNSOutput with a specified size.
DNSOutput() - Constructor for class org.xbill.DNS.DNSOutput
Create a new DNSOutput
DNSSEC - Static variable in class org.xbill.DNS.DNSKEYRecord.Protocol
Key will be used for DNSSEC
DNSSEC - Class in org.xbill.DNS
Constants and methods relating to DNSSEC.
DNSSEC - Static variable in class org.xbill.DNS.KEYRecord.Protocol
DNSSEC
DNSSEC.Algorithm - Class in org.xbill.DNS
 
DNSSEC.DNSSECException - Exception in org.xbill.DNS
A DNSSEC exception.
DNSSEC.IncompatibleKeyException - Exception in org.xbill.DNS
The key data provided is inconsistent.
DNSSEC.KeyMismatchException - Exception in org.xbill.DNS
A DNSSEC verification failed because fields in the DNSKEY and RRSIG records do not match.
DNSSEC.MalformedKeyException - Exception in org.xbill.DNS
The cryptographic data in a DNSSEC key is malformed.
DNSSEC.SignatureExpiredException - Exception in org.xbill.DNS
A DNSSEC verification failed because the signature has expired.
DNSSEC.SignatureNotYetValidException - Exception in org.xbill.DNS
A DNSSEC verification failed because the signature has not yet become valid.
DNSSEC.SignatureVerificationException - Exception in org.xbill.DNS
A DNSSEC verification failed because the cryptographic signature verification failed.
DNSSEC.UnsupportedAlgorithmException - Exception in org.xbill.DNS
An algorithm is unsupported by this DNSSEC implementation.
DO - Static variable in class org.xbill.DNS.ExtendedFlags
dnssec ok
DO - Static variable in class org.xbill.DNS.Flags
dnssec ok (extended)
DOMAIN - Static variable in class org.xbill.DNS.WKSRecord.Service
Domain Name Server
DOMAIN_ISSUED_CERTIFICATE - Static variable in class org.xbill.DNS.TLSARecord.CertificateUsage
 
DS - Static variable in class org.xbill.DNS.Type
Delegation Signer
DSA - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
DSA public key
DSA - Static variable in class org.xbill.DNS.IPSECKEYRecord.Algorithm
 
DSA_NSEC3_SHA1 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
DSA/SHA1, NSEC3-aware public key
DSP - Static variable in class org.xbill.DNS.WKSRecord.Service
Display Support Protocol
DSRecord - Class in org.xbill.DNS
DS - contains a Delegation Signer record, which acts as a placeholder for KEY records in the parent zone.
DSRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.DSRecord
Creates a DS Record from the given data
DSRecord(Name, int, long, int, DNSKEYRecord) - Constructor for class org.xbill.DNS.DSRecord
Creates a DS Record from the given data
DSRecord.Digest - Class in org.xbill.DNS
 
DSS - Static variable in class org.xbill.DNS.SSHFPRecord.Algorithm
 
dump(String, byte[], int, int) - Static method in class org.xbill.DNS.utils.hexdump
Dumps a byte array into hex format.
dump(String, byte[]) - Static method in class org.xbill.DNS.utils.hexdump
 

E

ECDSAP256SHA256 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
ECDSA Curve P-256 with SHA-256 public key
ECDSAP384SHA384 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
ECDSA Curve P-384 with SHA-384 public key
ECHO - Static variable in class org.xbill.DNS.WKSRecord.Service
Echo
EDNSOption - Class in org.xbill.DNS
DNS extension options, as described in RFC 2671.
EDNSOption(int) - Constructor for class org.xbill.DNS.EDNSOption
Creates an option with the given option code and data.
EDNSOption.Code - Class in org.xbill.DNS
 
EGP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Exterior Gateway Protocol
EID - Static variable in class org.xbill.DNS.Type
Endpoint identifier
EMAIL - Static variable in class org.xbill.DNS.KEYRecord.Protocol
Email
EMCON - Static variable in class org.xbill.DNS.WKSRecord.Protocol
EMCON
EMFIS_CNTL - Static variable in class org.xbill.DNS.WKSRecord.Service
EMFIS Control Service
EMFIS_DATA - Static variable in class org.xbill.DNS.WKSRecord.Service
EMFIS Data Service
empty - Static variable in class org.xbill.DNS.Name
The root name
end - Variable in class org.xbill.DNS.Generator
The end of the range.
end - Variable in class org.xbill.DNS.ZoneTransferIn.Delta
The ending serial number of this delta.
EOF - Static variable in class org.xbill.DNS.Tokenizer
End of file
EOL - Static variable in class org.xbill.DNS.Tokenizer
End of line
equals(Object) - Method in class org.xbill.DNS.APLRecord.Element
 
equals(Object) - Method in class org.xbill.DNS.EDNSOption
Determines if two EDNS Options are identical.
equals(Object) - Method in class org.xbill.DNS.Name
Are these two Names equivalent?
equals(Object) - Method in class org.xbill.DNS.Record
Determines if two Records are identical.
ERPC - Static variable in class org.xbill.DNS.WKSRecord.Service
HYDRA Expedited Remote Procedure
EXACT - Static variable in class org.xbill.DNS.TLSARecord.MatchingType
Exact match on selected content
exception(String) - Method in class org.xbill.DNS.Tokenizer
Creates an exception which includes the current state in the error message
expand() - Method in class org.xbill.DNS.Generator
Constructs and returns all records in the expansion.
expandGenerate(boolean) - Method in class org.xbill.DNS.Master
Specifies whether $GENERATE statements should be expanded.
EXTEND - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flags extension
ExtendedFlags - Class in org.xbill.DNS
Constants and functions relating to EDNS flags.
ExtendedResolver - Class in org.xbill.DNS
An implementation of Resolver that can send queries to multiple servers, sending the queries multiple times if necessary.
ExtendedResolver() - Constructor for class org.xbill.DNS.ExtendedResolver
Creates a new Extended Resolver.
ExtendedResolver(String[]) - Constructor for class org.xbill.DNS.ExtendedResolver
Creates a new Extended Resolver
ExtendedResolver(Resolver[]) - Constructor for class org.xbill.DNS.ExtendedResolver
Creates a new Extended Resolver

F

family - Variable in class org.xbill.DNS.APLRecord.Element
 
familyOf(InetAddress) - Static method in class org.xbill.DNS.Address
Returns the family of an InetAddress.
finalize() - Method in class org.xbill.DNS.Master
 
finalize() - Method in class org.xbill.DNS.Tokenizer
 
findAnyRecords(Name, int) - Method in class org.xbill.DNS.Cache
Looks up Records in the Cache (a wrapper around lookupRecords).
findExactMatch(Name, int) - Method in class org.xbill.DNS.Zone
Looks up Records in the zone, finding exact matches only.
findRecord(Record, int) - Method in class org.xbill.DNS.Message
Determines if the given record is already present in the given section.
findRecord(Record) - Method in class org.xbill.DNS.Message
Determines if the given record is already present in any section.
findRecords(Name, int) - Method in class org.xbill.DNS.Cache
Looks up credible Records in the Cache (a wrapper around lookupRecords).
findRecords(Name, int) - Method in class org.xbill.DNS.Zone
Looks up Records in the Zone.
findRRset(Name, int, int) - Method in class org.xbill.DNS.Message
Determines if an RRset with the given name and type is already present in the given section.
findRRset(Name, int) - Method in class org.xbill.DNS.Message
Determines if an RRset with the given name and type is already present in any section.
FINGER - Static variable in class org.xbill.DNS.WKSRecord.Service
Finger
first() - Method in class org.xbill.DNS.RRset
Returns the first record
FLAG10 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 10 (unused)
FLAG11 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 11 (unused)
FLAG2 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 2 (unused)
FLAG4 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 4 (unused)
FLAG5 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 5 (unused)
FLAG8 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 8 (unused)
FLAG9 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Flag 9 (unused)
FLAG_NOAUTH - Static variable in class org.xbill.DNS.KEYRecord
This key cannot be used for authentication
FLAG_NOCONF - Static variable in class org.xbill.DNS.KEYRecord
This key cannot be used for confidentiality (encryption)
FLAG_NOKEY - Static variable in class org.xbill.DNS.KEYRecord
This key cannot be used for authentication or confidentiality
Flags - Class in org.xbill.DNS
Constants and functions relating to flags in the DNS header.
flushName(Name) - Method in class org.xbill.DNS.Cache
Flushes all RRsets with a given name from the cache
flushSet(Name, int) - Method in class org.xbill.DNS.Cache
Flushes an RRset from the cache
format(long) - Static method in class org.xbill.DNS.TTL
 
formatString(byte[], int, String, boolean) - Static method in class org.xbill.DNS.utils.base64
Formats data into a nicely formatted base64 encoded String
FORMERR - Static variable in class org.xbill.DNS.Rcode
Format error
fromAddress(byte[]) - Static method in class org.xbill.DNS.ReverseMap
Creates a reverse map name corresponding to an address contained in an array of 4 bytes (for an IPv4 address) or 16 bytes (for an IPv6 address).
fromAddress(int[]) - Static method in class org.xbill.DNS.ReverseMap
Creates a reverse map name corresponding to an address contained in an array of 4 integers between 0 and 255 (for an IPv4 address) or 16 integers between 0 and 255 (for an IPv6 address).
fromAddress(InetAddress) - Static method in class org.xbill.DNS.ReverseMap
Creates a reverse map name corresponding to an address contained in an InetAddress.
fromAddress(String, int) - Static method in class org.xbill.DNS.ReverseMap
Creates a reverse map name corresponding to an address contained in a String.
fromAddress(String) - Static method in class org.xbill.DNS.ReverseMap
Creates a reverse map name corresponding to an address contained in a String.
fromConstantString(String) - Static method in class org.xbill.DNS.Name
Create a new name from a constant string.
fromDNAME(DNAMERecord) - Method in class org.xbill.DNS.Name
Generates a new Name to be used when following a DNAME.
fromString(String, Name) - Static method in class org.xbill.DNS.Name
Create a new name from a string and an origin.
fromString(String) - Static method in class org.xbill.DNS.Name
Create a new name from a string.
fromString(Name, int, int, long, Tokenizer, Name) - Static method in class org.xbill.DNS.Record
Builds a new Record from its textual representation
fromString(Name, int, int, long, String, Name) - Static method in class org.xbill.DNS.Record
Builds a new Record from its textual representation
fromString(String) - Static method in class org.xbill.DNS.TSIG
Creates a new TSIG object, which can be used to sign or verify a message.
fromString(String) - Static method in class org.xbill.DNS.utils.base16
Convert a hex-encoded String to binary data
fromString(String) - Method in class org.xbill.DNS.utils.base32
Convert a base32-encoded String to binary data
fromString(String) - Static method in class org.xbill.DNS.utils.base64
Convert a base64-encoded String to binary data
fromWire(byte[]) - Static method in class org.xbill.DNS.EDNSOption
Converts the wire format of an EDNS Option (including code and length) into the type-specific format.
fromWire(byte[], int) - Static method in class org.xbill.DNS.Record
Builds a Record from DNS uncompressed wire format.
FTP - Static variable in class org.xbill.DNS.WKSRecord.Service
File Transfer [Control]
FTP_DATA - Static variable in class org.xbill.DNS.WKSRecord.Service
File Transfer [Default Data]
FUDGE - Static variable in class org.xbill.DNS.TSIG
The default fudge value for outgoing packets.
FULL_CERTIFICATE - Static variable in class org.xbill.DNS.TLSARecord.Selector
Full certificate; the Certificate binary structure defined in [RFC5280]

G

generate(Message, byte[], int, TSIGRecord) - Method in class org.xbill.DNS.TSIG
Generates a TSIG record with a specific error for a message that has been rendered.
Generator - Class in org.xbill.DNS
A representation of a $GENERATE statement in a master file.
Generator(long, long, long, String, int, int, long, String, Name) - Constructor for class org.xbill.DNS.Generator
Creates a specification for generating records, as a $GENERATE statement in a master file.
generators() - Method in class org.xbill.DNS.Master
Returns an iterator over the generators specified in the master file; that is, the parsed contents of $GENERATE statements.
GenericEDNSOption - Class in org.xbill.DNS
An EDNSOption with no internal structure.
GenericEDNSOption(int, byte[]) - Constructor for class org.xbill.DNS.GenericEDNSOption
Construct a generic EDNS option.
get(Name) - Method in class org.xbill.DNS.Compression
Retrieves the position of the given name, if it has been previously included in the message.
get(boolean, boolean) - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer.
get() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer, ignoring whitespace and comments.
getAdditionalName() - Method in class org.xbill.DNS.KXRecord
 
getAdditionalName() - Method in class org.xbill.DNS.MBRecord
 
getAdditionalName() - Method in class org.xbill.DNS.MDRecord
 
getAdditionalName() - Method in class org.xbill.DNS.MFRecord
 
getAdditionalName() - Method in class org.xbill.DNS.MXRecord
 
getAdditionalName() - Method in class org.xbill.DNS.NAPTRRecord
 
getAdditionalName() - Method in class org.xbill.DNS.NSRecord
 
getAdditionalName() - Method in class org.xbill.DNS.Record
Returns the name for which additional data processing should be done for this record.
getAdditionalName() - Method in class org.xbill.DNS.SRVRecord
 
getAddress() - Method in class org.xbill.DNS.AAAARecord
Returns the address
getAddress() - Method in class org.xbill.DNS.ARecord
Returns the Internet address
getAddress() - Method in class org.xbill.DNS.ClientSubnetOption
Returns the IP address of the client.
getAddress() - Method in class org.xbill.DNS.ISDNRecord
Returns the ISDN number associated with the domain.
getAddress() - Method in class org.xbill.DNS.NSAPRecord
Returns the NSAP address.
getAddress(int) - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to an IP Address.
getAddress() - Method in class org.xbill.DNS.WKSRecord
Returns the IP address.
getAddress() - Method in class org.xbill.DNS.X25Record
Returns the X.25 PSDN address.
getAdmin() - Method in class org.xbill.DNS.SOARecord
Returns the zone administrator's address
getAlgorithm() - Method in class org.xbill.DNS.CERTRecord
Returns the algorithm of the associated KEYRecord, if present
getAlgorithm() - Method in class org.xbill.DNS.DLVRecord
Returns the key's algorithm.
getAlgorithm() - Method in class org.xbill.DNS.DSRecord
Returns the key's algorithm.
getAlgorithm() - Method in class org.xbill.DNS.SSHFPRecord
Returns the public key's algorithm.
getAlgorithm() - Method in class org.xbill.DNS.TKEYRecord
Returns the shared key's algorithm
getAlgorithm() - Method in class org.xbill.DNS.TSIGRecord
Returns the shared key's algorithm
getAlgorithmType() - Method in class org.xbill.DNS.IPSECKEYRecord
Returns the record's algorithm type.
getAlias() - Method in class org.xbill.DNS.CNAMERecord
Gets the alias specified by the CNAME Record
getAlias() - Method in class org.xbill.DNS.DNAMERecord
Gets the alias specified by the DNAME Record
getAliases() - Method in class org.xbill.DNS.Lookup
Returns all known aliases for this name.
getAllByName(String) - Static method in class org.xbill.DNS.Address
Determines all IP address of a host
getAltitude() - Method in class org.xbill.DNS.GPOSRecord
Returns the altitude as a double
getAltitude() - Method in class org.xbill.DNS.LOCRecord
Returns the altitude
getAltitudeString() - Method in class org.xbill.DNS.GPOSRecord
Returns the altitude as a string
getAnswers() - Method in class org.xbill.DNS.Lookup
Returns the answers from the lookup.
getAXFR() - Method in class org.xbill.DNS.ZoneTransferIn
Gets the AXFR-style response.
getBase32String(base32) - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and decodes it as base32.
getBase64(boolean) - Method in class org.xbill.DNS.Tokenizer
Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
getBase64() - Method in class org.xbill.DNS.Tokenizer
Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
getBitmap() - Method in class org.xbill.DNS.NXTRecord
Returns the set of types defined for this name
getByAddress(String) - Static method in class org.xbill.DNS.Address
Converts an address from its string representation to an IP address.
getByAddress(String, int) - Static method in class org.xbill.DNS.Address
Converts an address from its string representation to an IP address in a particular family.
getByName(String) - Static method in class org.xbill.DNS.Address
Determines the IP address of a host
getCert() - Method in class org.xbill.DNS.CERTRecord
Returns the binary representation of the certificate
getCertificateAssociationData() - Method in class org.xbill.DNS.TLSARecord
Returns the certificate associate data of this TLSA record
getCertificateUsage() - Method in class org.xbill.DNS.TLSARecord
Returns the certificate usage of the TLSA record
getCertType() - Method in class org.xbill.DNS.CERTRecord
Returns the type of certificate
getCNAME() - Method in class org.xbill.DNS.SetResponse
If the query encountered a CNAME, return it.
getCode() - Method in class org.xbill.DNS.EDNSOption
Returns the EDNS Option's code.
getCount(int) - Method in class org.xbill.DNS.Header
Retrieves the record count for the given section
getCPU() - Method in class org.xbill.DNS.HINFORecord
Returns the host's CPU
getCurrentConfig() - Static method in class org.xbill.DNS.ResolverConfig
Gets the current configuration
getData() - Method in class org.xbill.DNS.DHCIDRecord
Returns the binary data.
getData() - Method in class org.xbill.DNS.NULLRecord
Returns the contents of this record.
getData() - Method in class org.xbill.DNS.UNKRecord
Returns the contents of this record.
getDClass() - Method in class org.xbill.DNS.Cache
Returns the DNS class of this cache.
getDClass() - Method in class org.xbill.DNS.Record
Returns the record's class
getDClass() - Method in class org.xbill.DNS.RRset
Returns the class of the records
getDClass() - Method in class org.xbill.DNS.Zone
Returns the Zone's class
getDefaultCache(int) - Static method in class org.xbill.DNS.Lookup
Gets the Cache that will be used as the default for the specified class by future Lookups.
getDefaultResolver() - Static method in class org.xbill.DNS.Lookup
Gets the Resolver that will be used as the default by future Lookups.
getDefaultSearchPath() - Static method in class org.xbill.DNS.Lookup
Gets the search path that will be used as the default by future Lookups.
getDigest() - Method in class org.xbill.DNS.DLVRecord
Returns the binary hash of the key.
getDigest() - Method in class org.xbill.DNS.DSRecord
Returns the binary hash of the key.
getDigestID() - Method in class org.xbill.DNS.DLVRecord
Returns the key's Digest ID.
getDigestID() - Method in class org.xbill.DNS.DSRecord
Returns the key's Digest ID.
getDigestType() - Method in class org.xbill.DNS.SSHFPRecord
Returns the public key's digest type.
getDNAME() - Method in class org.xbill.DNS.SetResponse
If the query encountered a DNAME, return it.
getElements() - Method in class org.xbill.DNS.APLRecord
Returns the list of APL elements.
getEOL() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer, which must be an EOL or EOF.
getError() - Method in class org.xbill.DNS.TKEYRecord
Returns the extended error
getError() - Method in class org.xbill.DNS.TSIGRecord
Returns the extended error
getErrorAddress() - Method in class org.xbill.DNS.MINFORecord
Gets the address to receive error messages relating to the mailing list/mailbox.
getErrorString() - Method in class org.xbill.DNS.Lookup
Returns an error string describing the result code of this lookup.
getExpiration() - Method in exception org.xbill.DNS.DNSSEC.SignatureExpiredException
 
getExpiration() - Method in exception org.xbill.DNS.DNSSEC.SignatureNotYetValidException
 
getExpire() - Method in class org.xbill.DNS.SOARecord
Returns the time until a secondary expires a zone
getExtendedRcode() - Method in class org.xbill.DNS.OPTRecord
Returns the extended Rcode
getFamily() - Method in class org.xbill.DNS.ClientSubnetOption
Returns the family of the network address.
getFingerPrint() - Method in class org.xbill.DNS.SSHFPRecord
Returns the fingerprint
getFlag(int) - Method in class org.xbill.DNS.Header
Retrieves a flag
getFlags() - Method in class org.xbill.DNS.NAPTRRecord
Returns flags
getFlags() - Method in class org.xbill.DNS.NSEC3PARAMRecord
Returns the flags
getFlags() - Method in class org.xbill.DNS.NSEC3Record
Returns the flags
getFlags() - Method in class org.xbill.DNS.OPTRecord
Returns the EDNS flags
getFootprint() - Method in class org.xbill.DNS.DLVRecord
Returns the key's footprint.
getFootprint() - Method in class org.xbill.DNS.DSRecord
Returns the key's footprint.
getFudge() - Method in class org.xbill.DNS.TSIGRecord
Returns the time fudge factor
getGateway() - Method in class org.xbill.DNS.IPSECKEYRecord
Returns the record's gateway.
getGatewayType() - Method in class org.xbill.DNS.IPSECKEYRecord
Returns the record's gateway type.
getHashAlgorithm() - Method in class org.xbill.DNS.NSEC3PARAMRecord
Returns the hash algorithm
getHashAlgorithm() - Method in class org.xbill.DNS.NSEC3Record
Returns the hash algorithm
getHeader() - Method in class org.xbill.DNS.Message
Retrieves the Header.
getHex(boolean) - Method in class org.xbill.DNS.Tokenizer
Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
getHex() - Method in class org.xbill.DNS.Tokenizer
Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
getHexString() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and decodes it as hex.
getHost() - Method in class org.xbill.DNS.AFSDBRecord
Gets the host providing service for the domain.
getHost() - Method in class org.xbill.DNS.SOARecord
Returns the primary name server
getHostByAddr(byte[]) - Method in class org.xbill.DNS.spi.DNSJavaNameService
Performs a reverse DNS lookup.
getHostName(InetAddress) - Static method in class org.xbill.DNS.Address
Determines the hostname for an address
getHPrecision() - Method in class org.xbill.DNS.LOCRecord
Returns the horizontal precision
getID() - Method in class org.xbill.DNS.Header
Retrieves the message ID
getIdentifier() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer, ensures it is an unquoted string, and converts it to a string.
getIntermediateHost() - Method in class org.xbill.DNS.RTRecord
Gets the host to use as a router.
getIterations() - Method in class org.xbill.DNS.NSEC3PARAMRecord
Returns the number of iterations
getIterations() - Method in class org.xbill.DNS.NSEC3Record
Returns the number of iterations
getIXFR() - Method in class org.xbill.DNS.ZoneTransferIn
Gets the IXFR-style response.
getKey() - Method in class org.xbill.DNS.IPSECKEYRecord
Returns the record's public key
getKey() - Method in class org.xbill.DNS.TKEYRecord
Returns the shared secret or keying material
getKeyTag() - Method in class org.xbill.DNS.CERTRecord
Returns the ID of the associated KEYRecord, if present
getLabel(int) - Method in class org.xbill.DNS.Name
Retrieve the nth label of a Name.
getLabelString(int) - Method in class org.xbill.DNS.Name
Convert the nth label in a Name to a String
getLatitude() - Method in class org.xbill.DNS.GPOSRecord
Returns the latitude as a double
getLatitude() - Method in class org.xbill.DNS.LOCRecord
Returns the latitude
getLatitudeString() - Method in class org.xbill.DNS.GPOSRecord
Returns the latitude as a string
getLong() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to a long.
getLongitude() - Method in class org.xbill.DNS.GPOSRecord
Returns the longitude as a double
getLongitude() - Method in class org.xbill.DNS.LOCRecord
Returns the longitude
getLongitudeString() - Method in class org.xbill.DNS.GPOSRecord
Returns the longitude as a string
getMailAgent() - Method in class org.xbill.DNS.MDRecord
Gets the mail agent for the domain
getMailAgent() - Method in class org.xbill.DNS.MFRecord
Gets the mail agent for the domain
getMailbox() - Method in class org.xbill.DNS.MBRecord
Gets the mailbox for the domain
getMailbox() - Method in class org.xbill.DNS.MGRecord
Gets the mailbox in the mail group specified by the domain
getMailbox() - Method in class org.xbill.DNS.RPRecord
Gets the mailbox address of the RP Record
getMap822() - Method in class org.xbill.DNS.PXRecord
Gets the RFC 822 component of the mail address.
getMapX400() - Method in class org.xbill.DNS.PXRecord
Gets the X.400 component of the mail address.
getMatchingType() - Method in class org.xbill.DNS.TLSARecord
Returns the matching type of the TLSA record
getMaxCache() - Method in class org.xbill.DNS.Cache
Gets the maximum length of time that records will be stored in this Cache.
getMaxEntries() - Method in class org.xbill.DNS.Cache
Gets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name.
getMaxNCache() - Method in class org.xbill.DNS.Cache
Gets the maximum length of time that a negative response will be stored in this Cache.
getMinimum() - Method in class org.xbill.DNS.SOARecord
Returns the minimum TTL for records in the zone
getMode() - Method in class org.xbill.DNS.TKEYRecord
Returns the key agreement mode
getName() - Method in class org.xbill.DNS.Record
Returns the record's name
getName() - Method in class org.xbill.DNS.RRset
Returns the name of the records
getName(Name) - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to a name.
getName() - Method in class org.xbill.DNS.ZoneTransferIn
Gets the name of the zone being transferred.
getNewName() - Method in class org.xbill.DNS.MRRecord
Gets the new name of the mailbox specified by the domain
getNext() - Method in class org.xbill.DNS.NSEC3Record
Returns the next hash
getNext() - Method in class org.xbill.DNS.NSECRecord
Returns the next name
getNext() - Method in class org.xbill.DNS.NXTRecord
Returns the next name
getNS() - Method in class org.xbill.DNS.SetResponse
If the query hit a delegation point, return the NS set.
getNS() - Method in class org.xbill.DNS.Zone
Returns the Zone origin's NS records
getOpcode() - Method in class org.xbill.DNS.Header
Retrieves the mesasge's opcode
getOPT() - Method in class org.xbill.DNS.Message
Returns the OPT record from the ADDITIONAL section, if one is present.
getOptions() - Method in class org.xbill.DNS.OPTRecord
Gets all options in the OPTRecord.
getOptions(int) - Method in class org.xbill.DNS.OPTRecord
Gets all options in the OPTRecord with a specific code.
getOrder() - Method in class org.xbill.DNS.NAPTRRecord
Returns the order
getOrigin() - Method in class org.xbill.DNS.Zone
Returns the Zone's origin
getOriginalID() - Method in class org.xbill.DNS.TSIGRecord
Returns the original message ID
getOS() - Method in class org.xbill.DNS.HINFORecord
Returns the host's OS
getOther() - Method in class org.xbill.DNS.TKEYRecord
Returns the other data
getOther() - Method in class org.xbill.DNS.TSIGRecord
Returns the other data
getPayloadSize() - Method in class org.xbill.DNS.OPTRecord
Returns the maximum allowed payload size.
getPort() - Method in class org.xbill.DNS.SRVRecord
Returns the port that the service runs on
getPrecedence() - Method in class org.xbill.DNS.IPSECKEYRecord
Returns the record's precedence.
getPreference() - Method in class org.xbill.DNS.KXRecord
Returns the preference of this KX record
getPreference() - Method in class org.xbill.DNS.NAPTRRecord
Returns the preference
getPreference() - Method in class org.xbill.DNS.PXRecord
Gets the preference of the route.
getPreference() - Method in class org.xbill.DNS.RTRecord
Gets the preference of the route.
getPrefix() - Method in class org.xbill.DNS.A6Record
Returns the address prefix
getPrefixBits() - Method in class org.xbill.DNS.A6Record
Returns the number of bits in the prefix
getPriority() - Method in class org.xbill.DNS.MXRecord
Returns the priority of this MX record
getPriority() - Method in class org.xbill.DNS.SRVRecord
Returns the priority
getProtocol() - Method in class org.xbill.DNS.WKSRecord
Returns the IP protocol.
getProviderName() - Method in class org.xbill.DNS.spi.DNSJavaNameServiceDescriptor
 
getQuestion() - Method in class org.xbill.DNS.Message
Returns the first record in the QUESTION section.
getRcode() - Method in class org.xbill.DNS.Header
Retrieves the mesasge's rcode
getRcode() - Method in class org.xbill.DNS.Message
Returns the message's rcode (error code).
getRefresh() - Method in class org.xbill.DNS.SOARecord
Returns the zone refresh interval
getRegexp() - Method in class org.xbill.DNS.NAPTRRecord
Returns regexp
getReplacement() - Method in class org.xbill.DNS.NAPTRRecord
Returns the replacement domain-name
getResolver(int) - Method in class org.xbill.DNS.ExtendedResolver
Returns the nth resolver used by this ExtendedResolver
getResolvers() - Method in class org.xbill.DNS.ExtendedResolver
Returns all resolvers used by this ExtendedResolver
getResponsibleAddress() - Method in class org.xbill.DNS.MINFORecord
Gets the address responsible for the mailing list/mailbox.
getResult() - Method in class org.xbill.DNS.Lookup
Returns the result code of the lookup.
getRetry() - Method in class org.xbill.DNS.SOARecord
Returns the zone retry interval
getRRsetType() - Method in class org.xbill.DNS.Record
Returns the type of RRset that this record would belong to.
getSalt() - Method in class org.xbill.DNS.NSEC3PARAMRecord
Returns the salt
getSalt() - Method in class org.xbill.DNS.NSEC3Record
Returns the salt
getScopeNetmask() - Method in class org.xbill.DNS.ClientSubnetOption
Returns the scope netmask.
getSectionArray(int) - Method in class org.xbill.DNS.Message
Returns an array containing all records in the given section, or an empty array if the section is empty.
getSectionRRsets(int) - Method in class org.xbill.DNS.Message
Returns an array containing all records in the given section grouped into RRsets.
getSelector() - Method in class org.xbill.DNS.TLSARecord
Returns the selector of the TLSA record
getSerial() - Method in class org.xbill.DNS.SOARecord
Returns the zone's serial number
getService() - Method in class org.xbill.DNS.NAPTRRecord
Returns service
getServices() - Method in class org.xbill.DNS.WKSRecord
Returns the services provided by the host on the specified address.
getSignature() - Method in class org.xbill.DNS.TSIGRecord
Returns the signature
getSize() - Method in class org.xbill.DNS.Cache
Gets the current number of entries in the Cache, where an entry consists of all records with a specific Name.
getSize() - Method in class org.xbill.DNS.LOCRecord
Returns the diameter of the enclosing sphere
getSOA() - Method in class org.xbill.DNS.Zone
Returns the Zone's SOA record
getSourceNetmask() - Method in class org.xbill.DNS.ClientSubnetOption
Returns the source netmask.
getString() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to a string.
getSubAddress() - Method in class org.xbill.DNS.ISDNRecord
Returns the ISDN subaddress, or null if there is none.
getSubtype() - Method in class org.xbill.DNS.AFSDBRecord
Gets the subtype indicating the service provided by the host.
getSuffix() - Method in class org.xbill.DNS.A6Record
Returns the address suffix
getTarget() - Method in class org.xbill.DNS.CNAMERecord
Gets the target of the CNAME Record
getTarget() - Method in class org.xbill.DNS.DNAMERecord
Gets the target of the DNAME Record
getTarget() - Method in class org.xbill.DNS.KXRecord
Returns the target of the KX record
getTarget() - Method in class org.xbill.DNS.MXRecord
Returns the target of the MX record
getTarget() - Method in class org.xbill.DNS.NSAP_PTRRecord
Gets the target of the NSAP_PTR Record
getTarget() - Method in class org.xbill.DNS.NSRecord
Gets the target of the NS Record
getTarget() - Method in class org.xbill.DNS.PTRRecord
Gets the target of the PTR Record
getTarget() - Method in class org.xbill.DNS.SRVRecord
Returns the host running that the service
getTextDomain() - Method in class org.xbill.DNS.RPRecord
Gets the text domain info of the RP Record
getTimeExpire() - Method in class org.xbill.DNS.TKEYRecord
Returns the end of the validity period of the shared secret or keying material
getTimeInception() - Method in class org.xbill.DNS.TKEYRecord
Returns the beginning of the validity period of the shared secret or keying material
getTimeSigned() - Method in class org.xbill.DNS.TSIGRecord
Returns the time that this record was generated
getTSIG() - Method in class org.xbill.DNS.Message
Returns the TSIG record from the ADDITIONAL section, if one is present.
getTTL() - Method in class org.xbill.DNS.Record
Returns the record's TTL
getTTL() - Method in class org.xbill.DNS.RRset
Returns the ttl of the records
getTTL() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and parses it as a TTL.
getTTLLike() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and parses it as if it were a TTL.
getType() - Method in class org.xbill.DNS.Record
Returns the record's type
getType() - Method in class org.xbill.DNS.RRset
Returns the type of the records
getType() - Method in class org.xbill.DNS.spi.DNSJavaNameServiceDescriptor
 
getType() - Method in class org.xbill.DNS.ZoneTransferIn
Gets the type of zone transfer (either AXFR or IXFR).
getTypes() - Method in class org.xbill.DNS.NSEC3Record
Returns the set of types defined for this name
getTypes() - Method in class org.xbill.DNS.NSECRecord
Returns the set of types defined for this name
getUInt16() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to an unsigned 16 bit integer.
getUInt32() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to an unsigned 32 bit integer.
getUInt8() - Method in class org.xbill.DNS.Tokenizer
Gets the next token from a tokenizer and converts it to an unsigned 8 bit integer.
getVerifyTime() - Method in exception org.xbill.DNS.DNSSEC.SignatureExpiredException
 
getVerifyTime() - Method in exception org.xbill.DNS.DNSSEC.SignatureNotYetValidException
 
getVersion() - Method in class org.xbill.DNS.OPTRecord
Returns the highest supported EDNS version
getVPrecision() - Method in class org.xbill.DNS.LOCRecord
Returns the horizontal precision
getWeight() - Method in class org.xbill.DNS.SRVRecord
Returns the weight
GGP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Gateway-to-Gateway
GLUE - Static variable in class org.xbill.DNS.Credibility
The additional section of a response.
GPOS - Static variable in class org.xbill.DNS.Type
Geographical position (withdrawn)
GPOSRecord - Class in org.xbill.DNS
Geographical Location - describes the physical location of a host.
GPOSRecord(Name, int, long, double, double, double) - Constructor for class org.xbill.DNS.GPOSRecord
Creates an GPOS Record from the given data
GPOSRecord(Name, int, long, String, String, String) - Constructor for class org.xbill.DNS.GPOSRecord
Creates an GPOS Record from the given data
GRAPHICS - Static variable in class org.xbill.DNS.WKSRecord.Service
Graphics
GSSAPI - Static variable in class org.xbill.DNS.TKEYRecord
The key is computed using GSS_API (unimplemented)

H

handleException(Object, Exception) - Method in interface org.xbill.DNS.ResolverListener
The callback used by an asynchronous resolver when an exception is thrown
handleRecord(Record) - Method in interface org.xbill.DNS.ZoneTransferIn.ZoneTransferHandler
Called for each content record in an AXFR.
hashCode() - Method in class org.xbill.DNS.APLRecord.Element
 
hashCode() - Method in class org.xbill.DNS.EDNSOption
Generates a hash code based on the EDNS Option's data.
hashCode() - Method in class org.xbill.DNS.Name
Computes a hashcode based on the value
hashCode() - Method in class org.xbill.DNS.Record
Generates a hash code based on the Record's data.
hashName(Name) - Method in class org.xbill.DNS.NSEC3PARAMRecord
Hashes a name with the parameters of this NSEC3PARAM record.
hashName(Name) - Method in class org.xbill.DNS.NSEC3Record
Hashes a name with the parameters of this NSEC3 record.
hasType(int) - Method in class org.xbill.DNS.NSEC3Record
Returns whether a specific type is in the set of types.
hasType(int) - Method in class org.xbill.DNS.NSECRecord
Returns whether a specific type is in the set of types.
Header - Class in org.xbill.DNS
A DNS message header
Header(int) - Constructor for class org.xbill.DNS.Header
Create a new empty header.
Header() - Constructor for class org.xbill.DNS.Header
Create a new empty header with a random message id
Header(byte[]) - Constructor for class org.xbill.DNS.Header
Creates a new Header from its DNS wire format representation
HESIOD - Static variable in class org.xbill.DNS.DClass
Hesiod name server (MIT, alternate name)
hexdump - Class in org.xbill.DNS.utils
A routine to produce a nice looking hex dump
hexdump() - Constructor for class org.xbill.DNS.utils.hexdump
 
HINFO - Static variable in class org.xbill.DNS.Type
Host information
HINFORecord - Class in org.xbill.DNS
Host Information - describes the CPU and OS of a host
HINFORecord(Name, int, long, String, String) - Constructor for class org.xbill.DNS.HINFORecord
Creates an HINFO Record from the given data
HINT - Static variable in class org.xbill.DNS.Credibility
A hint or cache file on disk.
HMAC - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-MD5 algorithm (deprecated).
HMAC - Class in org.xbill.DNS.utils
An implementation of the HMAC message authentication code.
HMAC(MessageDigest, int, byte[]) - Constructor for class org.xbill.DNS.utils.HMAC
Creates a new HMAC instance
HMAC(String, int, byte[]) - Constructor for class org.xbill.DNS.utils.HMAC
Creates a new HMAC instance
HMAC(MessageDigest, byte[]) - Constructor for class org.xbill.DNS.utils.HMAC
Deprecated.
won't work with digests using a padding length other than 64; use HMAC(MessageDigest digest, int blockLength, byte [] key) instead.
HMAC(String, byte[]) - Constructor for class org.xbill.DNS.utils.HMAC
Deprecated.
won't work with digests using a padding length other than 64; use HMAC(String digestName, int blockLength, byte [] key) instead
HMAC_MD5 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-MD5 algorithm.
HMAC_SHA1 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-SHA1 algorithm.
HMAC_SHA224 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-SHA224 algorithm.
HMAC_SHA256 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-SHA256 algorithm.
HMAC_SHA384 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-SHA384 algorithm.
HMAC_SHA512 - Static variable in class org.xbill.DNS.TSIG
The domain name representing the HMAC-SHA512 algorithm.
HMP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Host Monitoring
HOST - Static variable in class org.xbill.DNS.KEYRecord.Flags
Key is owned by a host.
HOST_NOT_FOUND - Static variable in class org.xbill.DNS.Lookup
The host does not exist.
HOSTNAME - Static variable in class org.xbill.DNS.WKSRecord.Service
NIC Host Name Server
HOSTS2_NS - Static variable in class org.xbill.DNS.WKSRecord.Service
HOSTS2 Name Server
HS - Static variable in class org.xbill.DNS.DClass
Hesiod name server (MIT)

I

IACPKIX - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
URL of an Attribute Certificate
ICMP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Internet Control Message
IDENTIFIER - Static variable in class org.xbill.DNS.Tokenizer
An identifier (unquoted string)
IGMP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Internet Group Management
IGP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
any private interior gateway
IN - Static variable in class org.xbill.DNS.DClass
Internet
increment(long) - Static method in class org.xbill.DNS.Serial
Increments a serial number.
INDIRECT - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
Indirect keys; the actual key is elsewhere.
INGRES_NET - Static variable in class org.xbill.DNS.WKSRecord.Service
INGRES-NET Service
intValue(String) - Static method in class org.xbill.DNS.Options
Returns the value of an option as an integer, or -1 if not defined.
InvalidDClassException - Exception in org.xbill.DNS
An exception thrown when an invalid dclass code is specified.
InvalidDClassException(int) - Constructor for exception org.xbill.DNS.InvalidDClassException
 
InvalidTTLException - Exception in org.xbill.DNS
An exception thrown when an invalid TTL is specified.
InvalidTTLException(long) - Constructor for exception org.xbill.DNS.InvalidTTLException
 
InvalidTypeException - Exception in org.xbill.DNS
An exception thrown when an invalid type code is specified.
InvalidTypeException(int) - Constructor for exception org.xbill.DNS.InvalidTypeException
 
invoke(Object, Method, Object[]) - Method in class org.xbill.DNS.spi.DNSJavaNameService
 
IPCV - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Internet Packet Core Utility
IPGP - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Fingerprint and URL of an OpenPGP packet
IPKIX - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
URL of an X.509 data object
IPPC - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Internet Pluribus Packet Core
IPSEC - Static variable in class org.xbill.DNS.KEYRecord.Protocol
IPSEC Control
IPSECKEY - Static variable in class org.xbill.DNS.Type
IPSEC key
IPSECKEYRecord - Class in org.xbill.DNS
IPsec Keying Material (RFC 4025)
IPSECKEYRecord(Name, int, long, int, int, int, Object, byte[]) - Constructor for class org.xbill.DNS.IPSECKEYRecord
Creates an IPSECKEY Record from the given data.
IPSECKEYRecord.Algorithm - Class in org.xbill.DNS
 
IPSECKEYRecord.Gateway - Class in org.xbill.DNS
 
IPv4 - Static variable in class org.xbill.DNS.Address
 
IPv4 - Static variable in class org.xbill.DNS.IPSECKEYRecord.Gateway
 
IPv6 - Static variable in class org.xbill.DNS.Address
 
IPv6 - Static variable in class org.xbill.DNS.IPSECKEYRecord.Gateway
 
IQUERY - Static variable in class org.xbill.DNS.Opcode
An inverse query (deprecated)
IRTP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Internet Reliable Transaction
isAbsolute() - Method in class org.xbill.DNS.Name
Is this name absolute?
isAXFR() - Method in class org.xbill.DNS.ZoneTransferIn
Returns true if the response is an AXFR-style response (List of Records).
isCNAME() - Method in class org.xbill.DNS.SetResponse
Is the result of the lookup a CNAME?
isCurrent() - Method in class org.xbill.DNS.ZoneTransferIn
Returns true if the response indicates that the zone is up to date.
isDelegation() - Method in class org.xbill.DNS.SetResponse
Is the result of the lookup that the name is below a delegation?
ISDN - Static variable in class org.xbill.DNS.Type
ISDN calling address
isDNAME() - Method in class org.xbill.DNS.SetResponse
Is the result of the lookup a DNAME?
ISDNRecord - Class in org.xbill.DNS
ISDN - identifies the ISDN number and subaddress associated with a name.
ISDNRecord(Name, int, long, String, String) - Constructor for class org.xbill.DNS.ISDNRecord
Creates an ISDN Record from the given data
isDottedQuad(String) - Static method in class org.xbill.DNS.Address
Determines if a string contains a valid IP address.
isEOL() - Method in class org.xbill.DNS.Tokenizer.Token
Indicates whether this token contains an EOL or EOF.
isFlag(int) - Static method in class org.xbill.DNS.Flags
Indicates if a bit in the flags field is a flag or not.
ISI_GL - Static variable in class org.xbill.DNS.WKSRecord.Service
ISI Graphics Language
isIXFR() - Method in class org.xbill.DNS.ZoneTransferIn
Returns true if the response is an IXFR-style response (List of Deltas).
isNXDOMAIN() - Method in class org.xbill.DNS.SetResponse
Is the answer to the query that the name does not exist?
isNXRRSET() - Method in class org.xbill.DNS.SetResponse
Is the answer to the query that the name exists, but the type does not?
ISO_TP4 - Static variable in class org.xbill.DNS.WKSRecord.Protocol
ISO Transport Protocol Class 4
ISO_TSAP - Static variable in class org.xbill.DNS.WKSRecord.Service
ISO-TSAP
ISPKI - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
URL of an SPKI certificate
isRR(int) - Static method in class org.xbill.DNS.Type
Is this type valid for a record (a non-meta type)?
isSigned() - Method in class org.xbill.DNS.Message
Was this message signed by a TSIG?
isString() - Method in class org.xbill.DNS.Tokenizer.Token
Indicates whether this token contains a string.
isSuccessful() - Method in class org.xbill.DNS.SetResponse
Was the query successful?
isUnknown() - Method in class org.xbill.DNS.SetResponse
Is the answer to the query unknown?
isVerified() - Method in class org.xbill.DNS.Message
If this message was signed by a TSIG, was the TSIG verified?
isWild() - Method in class org.xbill.DNS.Name
Is this name a wildcard?
iterator() - Method in class org.xbill.DNS.Zone
Returns an Iterator over the RRsets in the zone.
IXFR - Static variable in class org.xbill.DNS.Type
Incremental zone transfer

J

jump(int) - Method in class org.xbill.DNS.DNSInput
Resets the current position of the input stream to the specified index, and clears the active region.
jump(int) - Method in class org.xbill.DNS.DNSOutput
Resets the current position of the output stream to the specified index.

K

KEY - Static variable in class org.xbill.DNS.Type
Key
KEYRecord - Class in org.xbill.DNS
Key - contains a cryptographic public key.
KEYRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.KEYRecord
Creates a KEY Record from the given data
KEYRecord(Name, int, long, int, int, int, PublicKey) - Constructor for class org.xbill.DNS.KEYRecord
Creates a KEY Record from the given data
KEYRecord.Flags - Class in org.xbill.DNS
 
KEYRecord.Protocol - Class in org.xbill.DNS
 
KX - Static variable in class org.xbill.DNS.Type
Key exchange
KXRecord - Class in org.xbill.DNS
Key Exchange - delegation of authority
KXRecord(Name, int, long, int, Name) - Constructor for class org.xbill.DNS.KXRecord
Creates a KX Record from the given data

L

LA_MAINT - Static variable in class org.xbill.DNS.WKSRecord.Service
IMP Logical Address Maintenance
labels() - Method in class org.xbill.DNS.Name
The number of labels in the name.
LEAF_1 - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Leaf-1
LEAF_2 - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Leaf-2
LENGTH - Static variable in class org.xbill.DNS.Header
The length of a DNS Header in wire format.
length() - Method in class org.xbill.DNS.Name
The length of the name.
LINK - Static variable in class org.xbill.DNS.WKSRecord.Service
LINK
LOC - Static variable in class org.xbill.DNS.Type
Location
LOC_SRV - Static variable in class org.xbill.DNS.WKSRecord.Service
Location Service
LOCRecord - Class in org.xbill.DNS
Location - describes the physical location of hosts, networks, subnets.
LOCRecord(Name, int, long, double, double, double, double, double, double) - Constructor for class org.xbill.DNS.LOCRecord
Creates an LOC Record from the given data
LOCUS_CON - Static variable in class org.xbill.DNS.WKSRecord.Service
Locus PC-Interface Conn Server
LOCUS_MAP - Static variable in class org.xbill.DNS.WKSRecord.Service
Locus PC-Interface Net Map Server
LOGIN - Static variable in class org.xbill.DNS.WKSRecord.Service
Login Host Protocol
longString(int) - Static method in class org.xbill.DNS.Section
Converts a numeric Section into a full description String
lookup(Name, int, int) - Method in class org.xbill.DNS.Cache
Finds all matching sets or something that causes the lookup to stop.
Lookup - Class in org.xbill.DNS
The Lookup object issues queries to caching DNS servers.
Lookup(Name, int, int) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of the given name, type, and class.
Lookup(Name, int) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of the given name and type in the IN class.
Lookup(Name) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of type A at the given name in the IN class.
Lookup(String, int, int) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of the given name, type, and class.
Lookup(String, int) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of the given name and type in the IN class.
Lookup(String) - Constructor for class org.xbill.DNS.Lookup
Create a Lookup object that will find records of type A at the given name in the IN class.
lookupAllHostAddr(String) - Method in class org.xbill.DNS.spi.DNSJavaNameService
Performs a forward DNS lookup for the host name.
lookupRecords(Name, int, int) - Method in class org.xbill.DNS.Cache
Looks up Records in the Cache.

M

MAILA - Static variable in class org.xbill.DNS.Type
Transfer mail agent records
MAILB - Static variable in class org.xbill.DNS.Type
Transfer mailbox records
Master - Class in org.xbill.DNS
A DNS master file parser.
Master(String, Name, long) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader and opens the specified master file.
Master(String, Name) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader and opens the specified master file.
Master(String) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader and opens the specified master file.
Master(InputStream, Name, long) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader.
Master(InputStream, Name) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader.
Master(InputStream) - Constructor for class org.xbill.DNS.Master
Initializes the master file reader.
MAX_VALUE - Static variable in class org.xbill.DNS.TTL
 
MAXLENGTH - Static variable in class org.xbill.DNS.Message
The maximum length of a message in wire format.
MB - Static variable in class org.xbill.DNS.Type
Mailbox domain name
MBRecord - Class in org.xbill.DNS
Mailbox Record - specifies a host containing a mailbox.
MBRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.MBRecord
Creates a new MB Record with the given data
MD - Static variable in class org.xbill.DNS.Type
Mail destination
MDRecord - Class in org.xbill.DNS
Mail Destination Record - specifies a mail agent which delivers mail for a domain (obsolete)
MDRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.MDRecord
Creates a new MD Record with the given data
MERIT_INP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
MERIT Internodal Protocol
Message - Class in org.xbill.DNS
A DNS Message.
Message(int) - Constructor for class org.xbill.DNS.Message
Creates a new Message with the specified Message ID
Message() - Constructor for class org.xbill.DNS.Message
Creates a new Message with a random Message ID
Message(byte[]) - Constructor for class org.xbill.DNS.Message
Creates a new Message from its DNS wire format representation
METAGRAM - Static variable in class org.xbill.DNS.WKSRecord.Service
Metagram Relay
MF - Static variable in class org.xbill.DNS.Type
Mail forwarder
MFE_NSP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
MFE Network Services Protocol
MFRecord - Class in org.xbill.DNS
Mail Forwarder Record - specifies a mail agent which forwards mail for a domain (obsolete)
MFRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.MFRecord
Creates a new MF Record with the given data
MG - Static variable in class org.xbill.DNS.Type
Mail group member
MGRecord - Class in org.xbill.DNS
Mail Group Record - specifies a mailbox which is a member of a mail group.
MGRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.MGRecord
Creates a new MG Record with the given data
MINFO - Static variable in class org.xbill.DNS.Type
Mailbox information
MINFORecord - Class in org.xbill.DNS
Mailbox information Record - lists the address responsible for a mailing list/mailbox and the address to receive error messages relating to the mailing list/mailbox.
MINFORecord(Name, int, long, Name, Name) - Constructor for class org.xbill.DNS.MINFORecord
Creates an MINFO Record from the given data
MIT_DOV - Static variable in class org.xbill.DNS.WKSRecord.Service
MIT Dover Spooler
MIT_SUBNET - Static variable in class org.xbill.DNS.WKSRecord.Protocol
MIT Subnet Support
modeString() - Method in class org.xbill.DNS.TKEYRecord
 
MPM - Static variable in class org.xbill.DNS.WKSRecord.Service
Message Processing Module [recv]
MPM_FLAGS - Static variable in class org.xbill.DNS.WKSRecord.Service
MPM FLAGS Protocol
MPM_SND - Static variable in class org.xbill.DNS.WKSRecord.Service
MPM [default send]
MR - Static variable in class org.xbill.DNS.Type
Mail rename name
MRRecord - Class in org.xbill.DNS
Mailbox Rename Record - specifies a rename of a mailbox.
MRRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.MRRecord
Creates a new MR Record with the given data
MSG_AUTH - Static variable in class org.xbill.DNS.WKSRecord.Service
MSG Authentication
MSG_ICP - Static variable in class org.xbill.DNS.WKSRecord.Service
MSG ICP
MUX - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Multiplexing
MX - Static variable in class org.xbill.DNS.Type
Mail routing information
MXRecord - Class in org.xbill.DNS
Mail Exchange - specifies where mail to a domain is sent
MXRecord(Name, int, long, int, Name) - Constructor for class org.xbill.DNS.MXRecord
Creates an MX Record from the given data

N

Name - Static variable in class org.xbill.DNS.IPSECKEYRecord.Gateway
 
Name - Class in org.xbill.DNS
A representation of a domain name.
Name(String, Name) - Constructor for class org.xbill.DNS.Name
Create a new name from a string and an origin.
Name(String) - Constructor for class org.xbill.DNS.Name
Create a new name from a string.
Name(DNSInput) - Constructor for class org.xbill.DNS.Name
Create a new name from DNS a wire format message
Name(byte[]) - Constructor for class org.xbill.DNS.Name
Create a new name from DNS wire format
Name(Name, int) - Constructor for class org.xbill.DNS.Name
Create a new name by removing labels from the beginning of an existing Name
name - Variable in class org.xbill.DNS.Record
 
namePattern - Variable in class org.xbill.DNS.Generator
The pattern to use for generating record names.
NAMESERVER - Static variable in class org.xbill.DNS.WKSRecord.Service
Host Name Server
NameTooLongException - Exception in org.xbill.DNS
An exception thrown when a name is longer than the maximum length of a DNS name.
NameTooLongException() - Constructor for exception org.xbill.DNS.NameTooLongException
 
NameTooLongException(String) - Constructor for exception org.xbill.DNS.NameTooLongException
 
NAPTR - Static variable in class org.xbill.DNS.Type
Naming authority pointer
NAPTRRecord - Class in org.xbill.DNS
Name Authority Pointer Record - specifies rewrite rule, that when applied to an existing string will produce a new domain.
NAPTRRecord(Name, int, long, int, int, String, String, String, Name) - Constructor for class org.xbill.DNS.NAPTRRecord
Creates an NAPTR Record from the given data
ndots() - Method in class org.xbill.DNS.ResolverConfig
Returns the located ndots value, or the default (1) if not configured.
negative - Variable in class org.xbill.DNS.APLRecord.Element
 
NETBIOS_DGM - Static variable in class org.xbill.DNS.WKSRecord.Service
NETBIOS Datagram Service
NETBIOS_NS - Static variable in class org.xbill.DNS.WKSRecord.Service
NETBIOS Name Service
NETBIOS_SSN - Static variable in class org.xbill.DNS.WKSRecord.Service
NETBIOS Session Service
NETBLT - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Bulk Data Transfer Protocol
NETRJS_1 - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Job Service
NETRJS_2 - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Job Service
NETRJS_3 - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Job Service
NETRJS_4 - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Job Service
newAXFR(Name, SocketAddress, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
newAXFR(Name, String, int, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
newAXFR(Name, String, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
newIXFR(Name, long, boolean, SocketAddress, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
newIXFR(Name, long, boolean, String, int, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
newIXFR(Name, long, boolean, String, TSIG) - Static method in class org.xbill.DNS.ZoneTransferIn
Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
newQuery(Record) - Static method in class org.xbill.DNS.Message
Creates a new Message with a random Message ID suitable for sending as a query.
newRecord(Name, int, int, long, int, byte[]) - Static method in class org.xbill.DNS.Record
Creates a new record, with the given parameters.
newRecord(Name, int, int, long, byte[]) - Static method in class org.xbill.DNS.Record
Creates a new record, with the given parameters.
newRecord(Name, int, int, long) - Static method in class org.xbill.DNS.Record
Creates a new empty record, with the given parameters.
newRecord(Name, int, int) - Static method in class org.xbill.DNS.Record
Creates a new empty record, with the given parameters.
newUpdate(Name) - Static method in class org.xbill.DNS.Message
Creates a new Message to contain a dynamic update.
nextRecord() - Method in class org.xbill.DNS.Generator
Constructs and returns the next record in the expansion.
nextRecord() - Method in class org.xbill.DNS.Master
Returns the next record in the master file.
NI_FTP - Static variable in class org.xbill.DNS.WKSRecord.Service
NI FTP
NI_MAIL - Static variable in class org.xbill.DNS.WKSRecord.Service
NI MAIL
NICNAME - Static variable in class org.xbill.DNS.WKSRecord.Service
Who Is
NIMLOC - Static variable in class org.xbill.DNS.Type
Nimrod locator
NNTP - Static variable in class org.xbill.DNS.WKSRecord.Service
Network News Transfer Protocol
NOAUTH - Static variable in class org.xbill.DNS.KEYRecord.Flags
KEY cannot be used for authentication
NOCONF - Static variable in class org.xbill.DNS.KEYRecord.Flags
KEY cannot be used for confidentiality
NOERROR - Static variable in class org.xbill.DNS.Rcode
No error
NOKEY - Static variable in class org.xbill.DNS.KEYRecord.Flags
No key present
NONAUTH_ANSWER - Static variable in class org.xbill.DNS.Credibility
The answer section of a nonauthoritative response.
NONAUTH_AUTHORITY - Static variable in class org.xbill.DNS.Credibility
The authority section of a nonauthoritative response.
NONE - Static variable in class org.xbill.DNS.DClass
Special value used in dynamic update messages
None - Static variable in class org.xbill.DNS.IPSECKEYRecord.Gateway
 
NONE - Static variable in class org.xbill.DNS.KEYRecord.Protocol
No defined protocol.
NORMAL - Static variable in class org.xbill.DNS.Credibility
Credible data.
NOTAUTH - Static variable in class org.xbill.DNS.Rcode
The requestor is not authorized to perform this operation
NOTIFY - Static variable in class org.xbill.DNS.Opcode
A message from a primary to a secondary server to initiate a zone transfer
NOTIMP - Static variable in class org.xbill.DNS.Rcode
The operation requested is not implemented
NOTIMPL - Static variable in class org.xbill.DNS.Rcode
Deprecated synonym for NOTIMP.
NOTZONE - Static variable in class org.xbill.DNS.Rcode
The zone specified is not a zone
NS - Static variable in class org.xbill.DNS.Type
Name server
NSAP - Static variable in class org.xbill.DNS.Type
NSAP address
NSAP_PTR - Static variable in class org.xbill.DNS.Type
Reverse NSAP address (deprecated)
NSAP_PTRRecord - Class in org.xbill.DNS
NSAP Pointer Record - maps a domain name representing an NSAP Address to a hostname.
NSAP_PTRRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.NSAP_PTRRecord
Creates a new NSAP_PTR Record with the given data
NSAPRecord - Class in org.xbill.DNS
NSAP Address Record.
NSAPRecord(Name, int, long, String) - Constructor for class org.xbill.DNS.NSAPRecord
Creates an NSAP Record from the given data
NSEC - Static variable in class org.xbill.DNS.Type
Next Secure Name
NSEC3 - Static variable in class org.xbill.DNS.Type
Next SECure, 3rd edition, RFC 5155
NSEC3PARAM - Static variable in class org.xbill.DNS.Type
Next SECure PARAMeter, RFC 5155
NSEC3PARAMRecord - Class in org.xbill.DNS
Next SECure name 3 Parameters - this record contains the parameters (hash algorithm, salt, iterations) used for a valid, complete NSEC3 chain present in a zone.
NSEC3PARAMRecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.NSEC3PARAMRecord
Creates an NSEC3PARAM record from the given data.
NSEC3Record - Class in org.xbill.DNS
Next SECure name 3 - this record contains the next hashed name in an ordered list of hashed names in the zone, and a set of types for which records exist for this name.
NSEC3Record(Name, int, long, int, int, int, byte[], byte[], int[]) - Constructor for class org.xbill.DNS.NSEC3Record
Creates an NSEC3 record from the given data.
NSEC3Record.Digest - Class in org.xbill.DNS
 
NSEC3Record.Flags - Class in org.xbill.DNS
 
NSECRecord - Class in org.xbill.DNS
Next SECure name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name.
NSECRecord(Name, int, long, Name, int[]) - Constructor for class org.xbill.DNS.NSECRecord
Creates an NSEC Record from the given data.
NSID - Static variable in class org.xbill.DNS.EDNSOption.Code
Name Server Identifier, RFC 5001
NSIDOption - Class in org.xbill.DNS
The Name Server Identifier Option, define in RFC 5001.
NSIDOption(byte[]) - Constructor for class org.xbill.DNS.NSIDOption
Construct an NSID option.
NSRecord - Class in org.xbill.DNS
Name Server Record - contains the name server serving the named zone
NSRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.NSRecord
Creates a new NS Record with the given data
NSW_FE - Static variable in class org.xbill.DNS.WKSRecord.Service
NSW User System FE
NTP - Static variable in class org.xbill.DNS.WKSRecord.Service
Network Time Protocol
NTYP3 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Key owner type 3 (reserved).
NULL - Static variable in class org.xbill.DNS.Type
Null record
NULLRecord - Class in org.xbill.DNS
The NULL Record.
NULLRecord(Name, int, long, byte[]) - Constructor for class org.xbill.DNS.NULLRecord
Creates a NULL record from the given data.
numBytes() - Method in class org.xbill.DNS.Message
Returns the size of the message.
NVP_II - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Network Voice Protocol
NXDOMAIN - Static variable in class org.xbill.DNS.Rcode
The name does not exist
NXRRSET - Static variable in class org.xbill.DNS.Rcode
The RRset (name, type) does not exist
NXT - Static variable in class org.xbill.DNS.Type
Next valid name in zone
NXTRecord - Class in org.xbill.DNS
Next name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name.
NXTRecord(Name, int, long, Name, BitSet) - Constructor for class org.xbill.DNS.NXTRecord
Creates an NXT Record from the given data

O

OID - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Certificate format defined by OID
OID - Static variable in class org.xbill.DNS.CERTRecord
Certificate format defined by IOD
Opcode - Class in org.xbill.DNS
Constants and functions relating to DNS opcodes
OPT - Static variable in class org.xbill.DNS.Type
Options - contains EDNS metadata
OPT_OUT - Static variable in class org.xbill.DNS.NSEC3Record.Flags
Unsigned delegation are not included in the NSEC3 chain.
Options - Class in org.xbill.DNS
Boolean options:
bindttl - Print TTLs in BIND format
multiline - Print records in multiline format
noprintin - Don't print the class of a record if it's IN
verbose - Turn on general debugging statements
verbosemsg - Print all messages sent or received by SimpleResolver
verbosecompression - Print messages related to name compression
verbosesec - Print messages related to signature verification
verbosecache - Print messages related to cache lookups

Valued options:
tsigfudge=n - Sets the default TSIG fudge value (in seconds)
sig0validity=n - Sets the default SIG(0) validity period (in seconds)
OPTRecord - Class in org.xbill.DNS
Options - describes Extended DNS (EDNS) properties of a Message.
OPTRecord(int, int, int, int, List) - Constructor for class org.xbill.DNS.OPTRecord
Creates an OPT Record.
OPTRecord(int, int, int, int) - Constructor for class org.xbill.DNS.OPTRecord
Creates an OPT Record with no data.
OPTRecord(int, int, int) - Constructor for class org.xbill.DNS.OPTRecord
Creates an OPT Record with no data.
org.xbill.DNS - package org.xbill.DNS
 
org.xbill.DNS.spi - package org.xbill.DNS.spi
 
org.xbill.DNS.utils - package org.xbill.DNS.utils
 
origin - Variable in class org.xbill.DNS.Generator
The origin to append to relative names.
OWNER_HOST - Static variable in class org.xbill.DNS.KEYRecord
A host/end entity key
OWNER_MASK - Static variable in class org.xbill.DNS.KEYRecord.Flags
Key owner bitmask.
OWNER_USER - Static variable in class org.xbill.DNS.KEYRecord
A user key
OWNER_ZONE - Static variable in class org.xbill.DNS.KEYRecord
A zone key

P

parse(String, boolean) - Static method in class org.xbill.DNS.TTL
Parses a TTL-like value, which can either be expressed as a number or a BIND-style string with numbers and units.
parseTTL(String) - Static method in class org.xbill.DNS.TTL
Parses a TTL, which can either be expressed as a number or a BIND-style string with numbers and units.
PGP - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Pretty Good Privacy
PGP - Static variable in class org.xbill.DNS.CERTRecord
Pretty Good Privacy
PKIX - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
PKIX (X.509v3)
PKIX - Static variable in class org.xbill.DNS.CERTRecord
PKIX (X.509v3)
POP_2 - Static variable in class org.xbill.DNS.WKSRecord.Service
Post Office Protocol - Version 2
prefixLength - Variable in class org.xbill.DNS.APLRecord.Element
 
PREREQ - Static variable in class org.xbill.DNS.Section
The prerequisite (second) section of a dynamic update message
present(Name) - Method in class org.xbill.DNS.Update
Inserts a prerequisite that the specified name exists; that is, there exist records with the given name in the zone.
present(Name, int) - Method in class org.xbill.DNS.Update
Inserts a prerequisite that the specified rrset exists; that is, there exist records with the given name and type in the zone.
present(Name, int, String) - Method in class org.xbill.DNS.Update
Parses a record from the string, and inserts a prerequisite that the record exists.
present(Name, int, Tokenizer) - Method in class org.xbill.DNS.Update
Parses a record from the tokenizer, and inserts a prerequisite that the record exists.
present(Record) - Method in class org.xbill.DNS.Update
Inserts a prerequisite that the specified record exists.
PRIMARY - Static variable in class org.xbill.DNS.Zone
A primary zone
printFlags() - Method in class org.xbill.DNS.Header
Converts the header's flags into a String
PRIVATEDNS - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
Private algorithm, specified by domain name
PRIVATEOID - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
Private algorithm, specified by OID
PRM - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Packet Radio Measurement
PROFILE - Static variable in class org.xbill.DNS.WKSRecord.Service
PROFILE Naming System
PROTOCOL_ANY - Static variable in class org.xbill.DNS.KEYRecord
Key was created for use with any protocol
PROTOCOL_DNSSEC - Static variable in class org.xbill.DNS.KEYRecord
Key was created for use with DNSSEC
PROTOCOL_EMAIL - Static variable in class org.xbill.DNS.KEYRecord
Key was created for use with email
PROTOCOL_IPSEC - Static variable in class org.xbill.DNS.KEYRecord
Key was created for use with IPSEC
PROTOCOL_TLS - Static variable in class org.xbill.DNS.KEYRecord
Key was created for use with transaction level security
PTR - Static variable in class org.xbill.DNS.Type
Domain name pointer
PTRRecord - Class in org.xbill.DNS
Pointer Record - maps a domain name representing an Internet Address to a hostname.
PTRRecord(Name, int, long, Name) - Constructor for class org.xbill.DNS.PTRRecord
Creates a new PTR Record with the given data
PUP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
PUP
PWDGEN - Static variable in class org.xbill.DNS.WKSRecord.Service
Password Generator Protocol
PX - Static variable in class org.xbill.DNS.Type
X.400 mail mapping
PXRecord - Class in org.xbill.DNS
X.400 mail mapping record.
PXRecord(Name, int, long, int, Name, Name) - Constructor for class org.xbill.DNS.PXRecord
Creates an PX Record from the given data

Q

QR - Static variable in class org.xbill.DNS.Flags
query/response
QUERY - Static variable in class org.xbill.DNS.Opcode
A standard query
QUESTION - Static variable in class org.xbill.DNS.Section
The question (first) section
QUOTE - Static variable in class org.xbill.DNS.WKSRecord.Service
Quote of the Day
QUOTED_STRING - Static variable in class org.xbill.DNS.Tokenizer
A quoted string

R

RA - Static variable in class org.xbill.DNS.Flags
recursion available
Rcode - Class in org.xbill.DNS
Constants and functions relating to DNS rcodes (error values)
RD - Static variable in class org.xbill.DNS.Flags
recursion desired
rdataPattern - Variable in class org.xbill.DNS.Generator
The pattern to use for generating record data.
rdataToString() - Method in class org.xbill.DNS.Record
Converts the rdata portion of a Record into a String representation
rdataToWireCanonical() - Method in class org.xbill.DNS.Record
Converts the rdata in a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
RDP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Reliable Data Protocol
readByteArray(byte[], int, int) - Method in class org.xbill.DNS.DNSInput
Reads a byte array of a specified length from the stream into an existing array.
readByteArray(int) - Method in class org.xbill.DNS.DNSInput
Reads a byte array of a specified length from the stream.
readByteArray() - Method in class org.xbill.DNS.DNSInput
Reads a byte array consisting of the remainder of the stream (or the active region, if one is set.
readCountedString() - Method in class org.xbill.DNS.DNSInput
Reads a counted string from the stream.
readU16() - Method in class org.xbill.DNS.DNSInput
Reads an unsigned 16 bit value from the stream, as an int.
readU32() - Method in class org.xbill.DNS.DNSInput
Reads an unsigned 32 bit value from the stream, as a long.
readU8() - Method in class org.xbill.DNS.DNSInput
Reads an unsigned 8 bit value from the stream, as an int.
receiveMessage(Object, Message) - Method in interface org.xbill.DNS.ResolverListener
The callback used by an asynchronous resolver
Record - Class in org.xbill.DNS
A generic DNS resource record.
Record() - Constructor for class org.xbill.DNS.Record
 
recordLength() - Method in class org.xbill.DNS.TSIG
Returns the maximum length of a TSIG record generated by this key.
refresh() - Static method in class org.xbill.DNS.Options
 
refresh() - Static method in class org.xbill.DNS.ResolverConfig
Gets the current configuration
refreshDefault() - Static method in class org.xbill.DNS.Lookup
 
REFUSED - Static variable in class org.xbill.DNS.Rcode
The operation was refused by the server
RelativeNameException - Exception in org.xbill.DNS
An exception thrown when a relative name is passed as an argument to a method requiring an absolute name.
RelativeNameException(Name) - Constructor for exception org.xbill.DNS.RelativeNameException
 
RelativeNameException(String) - Constructor for exception org.xbill.DNS.RelativeNameException
 
relativize(Name) - Method in class org.xbill.DNS.Name
If this name is a subdomain of origin, return a new name relative to origin with the same value.
remaining() - Method in class org.xbill.DNS.DNSInput
Returns the number of bytes that can be read from this stream before reaching the end.
removeAllRecords(int) - Method in class org.xbill.DNS.Message
Removes all records from a section of the Message, and adjusts the header.
removeRecord(Record, int) - Method in class org.xbill.DNS.Message
Removes a record from a section of the Message, and adjusts the header.
removeRecord(Record) - Method in class org.xbill.DNS.Zone
Removes a record from the Zone
replace(Name, int, long, String) - Method in class org.xbill.DNS.Update
Parses a record from the string, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
replace(Name, int, long, Tokenizer) - Method in class org.xbill.DNS.Update
Parses a record from the tokenizer, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
replace(Record) - Method in class org.xbill.DNS.Update
Indicates that the record should be inserted into the zone replacing any other records with the same name and type.
replace(Record[]) - Method in class org.xbill.DNS.Update
Indicates that the records should be inserted into the zone replacing any other records with the same name and type as each one.
replace(RRset) - Method in class org.xbill.DNS.Update
Indicates that all of the records in the rrset should be inserted into the zone replacing any other records with the same name and type.
Resolver - Interface in org.xbill.DNS
Interface describing a resolver.
RESOLVERASSIGNED - Static variable in class org.xbill.DNS.TKEYRecord
The key is assigned by the resolver (unimplemented)
ResolverConfig - Class in org.xbill.DNS
A class that tries to locate name servers and the search path to be appended to unqualified names.
ResolverConfig() - Constructor for class org.xbill.DNS.ResolverConfig
 
ResolverListener - Interface in org.xbill.DNS
An interface to the asynchronous resolver.
restore() - Method in class org.xbill.DNS.DNSInput
Restores the input stream to its state before the call to DNSInput.save().
restore() - Method in class org.xbill.DNS.DNSOutput
Restores the input stream to its state before the call to DNSOutput.save().
restoreActive(int) - Method in class org.xbill.DNS.DNSInput
Restores the previously set active region.
ReverseMap - Class in org.xbill.DNS
A set functions designed to deal with DNS names used in reverse mappings.
REVOKE - Static variable in class org.xbill.DNS.DNSKEYRecord.Flags
Key has been revoked
RJE - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Job Entry
RLP - Static variable in class org.xbill.DNS.WKSRecord.Service
Resource Location Protocol
root - Static variable in class org.xbill.DNS.Name
The root name
RP - Static variable in class org.xbill.DNS.Type
Responsible person
RPRecord - Class in org.xbill.DNS
Responsible Person Record - lists the mail address of a responsible person and a domain where TXT records are available.
RPRecord(Name, int, long, Name, Name) - Constructor for class org.xbill.DNS.RPRecord
Creates an RP Record from the given data
rrs(boolean) - Method in class org.xbill.DNS.RRset
Returns an Iterator listing all (data) records.
rrs() - Method in class org.xbill.DNS.RRset
Returns an Iterator listing all (data) records.
RRset - Class in org.xbill.DNS
A set of Records with the same name, type, and class.
RRset() - Constructor for class org.xbill.DNS.RRset
Creates an empty RRset
RRset(Record) - Constructor for class org.xbill.DNS.RRset
Creates an RRset and sets its contents to the specified record
RRset(RRset) - Constructor for class org.xbill.DNS.RRset
Creates an RRset with the contents of an existing RRset
RRSIG - Static variable in class org.xbill.DNS.Type
Resource Record Signature
RRSIGRecord - Class in org.xbill.DNS
Recource Record Signature - An RRSIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver.
RRSIGRecord(Name, int, long, int, int, long, Date, Date, int, Name, byte[]) - Constructor for class org.xbill.DNS.RRSIGRecord
Creates an RRSIG Record from the given data
RSA - Static variable in class org.xbill.DNS.IPSECKEYRecord.Algorithm
 
RSA - Static variable in class org.xbill.DNS.SSHFPRecord.Algorithm
 
RSA_NSEC3_SHA1 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
RSA/SHA1, NSEC3-aware public key
RSAMD5 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
RSA/MD5 public key (deprecated)
RSASHA1 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
RSA/SHA1 public key
RSASHA256 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
RSA/SHA256 public key
RSASHA512 - Static variable in class org.xbill.DNS.DNSSEC.Algorithm
RSA/SHA512 public key
RT - Static variable in class org.xbill.DNS.Type
Router
RTELNET - Static variable in class org.xbill.DNS.WKSRecord.Service
Remote Telnet Service
RTRecord - Class in org.xbill.DNS
Route Through Record - lists a route preference and intermediate host.
RTRecord(Name, int, long, int, Name) - Constructor for class org.xbill.DNS.RTRecord
Creates an RT Record from the given data
run() - Method in class org.xbill.DNS.Lookup
Performs the lookup, using the specified Cache, Resolver, and search path.
run(ZoneTransferIn.ZoneTransferHandler) - Method in class org.xbill.DNS.ZoneTransferIn
Does the zone transfer.
run() - Method in class org.xbill.DNS.ZoneTransferIn
Does the zone transfer.
RVD - Static variable in class org.xbill.DNS.WKSRecord.Protocol
MIT Remote Virtual Disk Protocol

S

sameRRset(Record) - Method in class org.xbill.DNS.Record
Determines if two Records could be part of the same RRset.
SAT_EXPAK - Static variable in class org.xbill.DNS.WKSRecord.Protocol
SATNET and Backroom EXPAK
SAT_MON - Static variable in class org.xbill.DNS.WKSRecord.Protocol
SATNET Monitoring
save() - Method in class org.xbill.DNS.DNSInput
Saves the current state of the input stream.
save() - Method in class org.xbill.DNS.DNSOutput
Saves the current state of the output stream.
saveActive() - Method in class org.xbill.DNS.DNSInput
Returns the position of the end of the current active region.
searchPath() - Method in class org.xbill.DNS.ResolverConfig
Returns all entries in the located search path
SECONDARY - Static variable in class org.xbill.DNS.Zone
A secondary zone
Section - Class in org.xbill.DNS
Constants and functions relating to DNS message sections
sectionToString(int) - Method in class org.xbill.DNS.Message
Converts the given section of the Message to a String.
send(Message) - Method in class org.xbill.DNS.ExtendedResolver
Sends a message and waits for a response.
send(Message) - Method in interface org.xbill.DNS.Resolver
Sends a message and waits for a response.
send(Message) - Method in class org.xbill.DNS.SimpleResolver
Sends a message to a single server and waits for a response.
sendAsync(Message, ResolverListener) - Method in class org.xbill.DNS.ExtendedResolver
Asynchronously sends a message to multiple servers, potentially multiple times, registering a listener to receive a callback on success or exception.
sendAsync(Message, ResolverListener) - Method in interface org.xbill.DNS.Resolver
Asynchronously sends a message registering a listener to receive a callback on success or exception.
sendAsync(Message, ResolverListener) - Method in class org.xbill.DNS.SimpleResolver
Asynchronously sends a message to a single server, registering a listener to receive a callback on success or exception.
SEP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Sequential Exchange Protocol
SEP_KEY - Static variable in class org.xbill.DNS.DNSKEYRecord.Flags
Key is a secure entry point key
Serial - Class in org.xbill.DNS
Helper functions for doing serial arithmetic.
server() - Method in class org.xbill.DNS.ResolverConfig
Returns the first located server
SERVERASSIGNED - Static variable in class org.xbill.DNS.TKEYRecord
The key is assigned by the server (unimplemented)
servers() - Method in class org.xbill.DNS.ResolverConfig
Returns all located servers
SERVFAIL - Static variable in class org.xbill.DNS.Rcode
Server failure
SERVICE_CERTIFICATE_CONSTRAINT - Static variable in class org.xbill.DNS.TLSARecord.CertificateUsage
 
set(String) - Static method in class org.xbill.DNS.Options
Sets an option to "true"
set(String, String) - Static method in class org.xbill.DNS.Options
Sets an option to the the supplied value
setActive(int) - Method in class org.xbill.DNS.DNSInput
Marks the following bytes in the stream as active.
setAddress(InetSocketAddress) - Method in class org.xbill.DNS.SimpleResolver
Sets the address of the server to communicate with.
setAddress(InetAddress) - Method in class org.xbill.DNS.SimpleResolver
Sets the address of the server to communicate with (on the default DNS port)
setCache(Cache) - Method in class org.xbill.DNS.Lookup
Sets the cache to use when performing this lookup.
setCredibility(int) - Method in class org.xbill.DNS.Lookup
Sets the minimum credibility level that will be accepted when performing the lookup.
setDClass(int) - Method in class org.xbill.DNS.ZoneTransferIn
Sets an alternate DNS class for this zone transfer.
setDefaultCache(Cache, int) - Static method in class org.xbill.DNS.Lookup
Sets the Cache to be used as the default for the specified class by future Lookups.
setDefaultResolver(Resolver) - Static method in class org.xbill.DNS.Lookup
Sets the default Resolver to be used as the default by future Lookups.
setDefaultResolver(String) - Static method in class org.xbill.DNS.SimpleResolver
Sets the default host (initially localhost) to query
setDefaultSearchPath(Name[]) - Static method in class org.xbill.DNS.Lookup
Sets the search path to be used as the default by future Lookups.
setDefaultSearchPath(String[]) - Static method in class org.xbill.DNS.Lookup
Sets the search path that will be used as the default by future Lookups.
setEDNS(int) - Method in class org.xbill.DNS.ExtendedResolver
 
setEDNS(int, int, int, List) - Method in class org.xbill.DNS.ExtendedResolver
 
setEDNS(int) - Method in interface org.xbill.DNS.Resolver
Sets the EDNS version used on outgoing messages.
setEDNS(int, int, int, List) - Method in interface org.xbill.DNS.Resolver
Sets the EDNS information on outgoing messages.
setEDNS(int, int, int, List) - Method in class org.xbill.DNS.SimpleResolver
 
setEDNS(int) - Method in class org.xbill.DNS.SimpleResolver
 
setFlag(int) - Method in class org.xbill.DNS.Header
Sets a flag to the supplied value
setHeader(Header) - Method in class org.xbill.DNS.Message
Replaces the Header with a new one.
setID(int) - Method in class org.xbill.DNS.Header
Sets the message ID
setIgnoreTruncation(boolean) - Method in class org.xbill.DNS.ExtendedResolver
 
setIgnoreTruncation(boolean) - Method in interface org.xbill.DNS.Resolver
Sets whether truncated responses will be ignored.
setIgnoreTruncation(boolean) - Method in class org.xbill.DNS.SimpleResolver
 
setLoadBalance(boolean) - Method in class org.xbill.DNS.ExtendedResolver
Sets whether the servers should be load balanced.
setLocalAddress(InetSocketAddress) - Method in class org.xbill.DNS.SimpleResolver
Sets the local address to bind to when sending messages.
setLocalAddress(InetAddress) - Method in class org.xbill.DNS.SimpleResolver
Sets the local address to bind to when sending messages.
setLocalAddress(SocketAddress) - Method in class org.xbill.DNS.ZoneTransferIn
Sets the local address to bind to when sending messages.
setMaxCache(int) - Method in class org.xbill.DNS.Cache
Sets the maximum length of time that records will be stored in this Cache.
setMaxEntries(int) - Method in class org.xbill.DNS.Cache
Sets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name.
setMaxNCache(int) - Method in class org.xbill.DNS.Cache
Sets the maximum length of time that a negative response will be stored in this Cache.
setNdots(int) - Method in class org.xbill.DNS.Lookup
Sets ndots to use when performing this lookup, overriding the default value.
setOpcode(int) - Method in class org.xbill.DNS.Header
Sets the message's opcode
setPort(int) - Method in class org.xbill.DNS.ExtendedResolver
 
setPort(int) - Method in interface org.xbill.DNS.Resolver
Sets the port to communicate with on the server
setPort(int) - Method in class org.xbill.DNS.SimpleResolver
 
setRcode(int) - Method in class org.xbill.DNS.Header
Sets the message's rcode
setResolver(Resolver) - Method in class org.xbill.DNS.Lookup
Sets the resolver to use when performing this lookup.
SetResponse - Class in org.xbill.DNS
The Response from a query to Cache.lookupRecords() or Zone.findRecords()
setRetries(int) - Method in class org.xbill.DNS.ExtendedResolver
Sets the number of retries sent to each server per query
setSearchPath(Name[]) - Method in class org.xbill.DNS.Lookup
Sets the search path to use when performing this lookup.
setSearchPath(String[]) - Method in class org.xbill.DNS.Lookup
Sets the search path to use when performing this lookup.
setTCP(boolean) - Method in class org.xbill.DNS.ExtendedResolver
 
setTCP(boolean) - Method in interface org.xbill.DNS.Resolver
Sets whether TCP connections will be sent by default
setTCP(boolean) - Method in class org.xbill.DNS.SimpleResolver
 
setTimeout(int, int) - Method in class org.xbill.DNS.ExtendedResolver
 
setTimeout(int) - Method in class org.xbill.DNS.ExtendedResolver
 
setTimeout(int, int) - Method in interface org.xbill.DNS.Resolver
Sets the amount of time to wait for a response before giving up.
setTimeout(int) - Method in interface org.xbill.DNS.Resolver
Sets the amount of time to wait for a response before giving up.
setTimeout(int, int) - Method in class org.xbill.DNS.SimpleResolver
 
setTimeout(int) - Method in class org.xbill.DNS.SimpleResolver
 
setTimeout(int) - Method in class org.xbill.DNS.ZoneTransferIn
Sets a timeout on this zone transfer.
setTSIG(TSIG, int, TSIGRecord) - Method in class org.xbill.DNS.Message
Sets the TSIG key and other necessary information to sign a message.
setTSIGKey(TSIG) - Method in class org.xbill.DNS.ExtendedResolver
 
setTSIGKey(TSIG) - Method in interface org.xbill.DNS.Resolver
Specifies the TSIG key that messages will be signed with
setTSIGKey(TSIG) - Method in class org.xbill.DNS.SimpleResolver
 
SFTP - Static variable in class org.xbill.DNS.WKSRecord.Service
Simple File Transfer Protocol
SHA1 - Static variable in class org.xbill.DNS.DSRecord.Digest
SHA-1
SHA1 - Static variable in class org.xbill.DNS.NSEC3Record.Digest
SHA-1
SHA1 - Static variable in class org.xbill.DNS.SSHFPRecord.Digest
 
SHA1_DIGEST_ID - Static variable in class org.xbill.DNS.DLVRecord
 
SHA1_DIGEST_ID - Static variable in class org.xbill.DNS.DSRecord
 
SHA1_DIGEST_ID - Static variable in class org.xbill.DNS.NSEC3Record
 
SHA256 - Static variable in class org.xbill.DNS.DSRecord.Digest
SHA-256
SHA256 - Static variable in class org.xbill.DNS.TLSARecord.MatchingType
SHA-256 hash of selected content [RFC6234]
SHA256_DIGEST_ID - Static variable in class org.xbill.DNS.DLVRecord
 
SHA256_DIGEST_ID - Static variable in class org.xbill.DNS.DSRecord
 
SHA384 - Static variable in class org.xbill.DNS.DSRecord.Digest
SHA-384
SHA384_DIGEST_ID - Static variable in class org.xbill.DNS.DSRecord
 
SHA512 - Static variable in class org.xbill.DNS.TLSARecord.MatchingType
SHA-512 hash of selected content [RFC6234]
SIG - Static variable in class org.xbill.DNS.Type
Signature
SIG0 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 0
SIG0 - Class in org.xbill.DNS
Creates SIG(0) transaction signatures.
SIG1 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 1
SIG10 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 10
SIG11 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 11
SIG12 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 12
SIG13 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 13
SIG14 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 14
SIG15 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 15
SIG2 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 2
SIG3 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 3
SIG4 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 4
SIG5 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 5
SIG6 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 6
SIG7 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 7
SIG8 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 8
SIG9 - Static variable in class org.xbill.DNS.KEYRecord.Flags
Signatory value 9
sign(RRset, DNSKEYRecord, PrivateKey, Date, Date) - Static method in class org.xbill.DNS.DNSSEC
Generate a DNSSEC signature.
sign(RRset, DNSKEYRecord, PrivateKey, Date, Date, String) - Static method in class org.xbill.DNS.DNSSEC
Generate a DNSSEC signature.
sign() - Method in class org.xbill.DNS.utils.HMAC
Signs the data (computes the secure hash)
signMessage(Message, KEYRecord, PrivateKey, SIGRecord) - Static method in class org.xbill.DNS.SIG0
Sign a message with SIG(0).
SIGRecord - Class in org.xbill.DNS
Signature - A SIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver.
SIGRecord(Name, int, long, int, int, long, Date, Date, int, Name, byte[]) - Constructor for class org.xbill.DNS.SIGRecord
Creates an SIG Record from the given data
sigs() - Method in class org.xbill.DNS.RRset
Returns an Iterator listing all signature records
SimpleResolver - Class in org.xbill.DNS
An implementation of Resolver that sends one query to one server.
SimpleResolver(String) - Constructor for class org.xbill.DNS.SimpleResolver
Creates a SimpleResolver that will query the specified host
SimpleResolver() - Constructor for class org.xbill.DNS.SimpleResolver
Creates a SimpleResolver.
size() - Method in class org.xbill.DNS.RRset
Returns the number of (data) records
SMTP - Static variable in class org.xbill.DNS.WKSRecord.Service
Simple Mail Transfer
SOA - Static variable in class org.xbill.DNS.Type
Start of authority
SOARecord - Class in org.xbill.DNS
Start of Authority - describes properties of a zone.
SOARecord(Name, int, long, Name, Name, long, long, long, long, long) - Constructor for class org.xbill.DNS.SOARecord
Creates an SOA Record from the given data
SPF - Static variable in class org.xbill.DNS.Type
Sender Policy Framework (experimental)
SPFRecord - Class in org.xbill.DNS
Sender Policy Framework (RFC 4408, experimental)
SPFRecord(Name, int, long, List) - Constructor for class org.xbill.DNS.SPFRecord
Creates a SPF Record from the given data
SPFRecord(Name, int, long, String) - Constructor for class org.xbill.DNS.SPFRecord
Creates a SPF Record from the given data
SPKI - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Simple Public Key Infrastructure
SPKI - Static variable in class org.xbill.DNS.CERTRecord
Simple Public Key Infrastructure
SRV - Static variable in class org.xbill.DNS.Type
Server selection
SRVRecord - Class in org.xbill.DNS
Server Selection Record - finds hosts running services in a domain.
SRVRecord(Name, int, long, int, int, int, Name) - Constructor for class org.xbill.DNS.SRVRecord
Creates an SRV Record from the given data
SSHFP - Static variable in class org.xbill.DNS.Type
SSH Key Fingerprint
SSHFPRecord - Class in org.xbill.DNS
SSH Fingerprint - stores the fingerprint of an SSH host key.
SSHFPRecord(Name, int, long, int, int, byte[]) - Constructor for class org.xbill.DNS.SSHFPRecord
Creates an SSHFP Record from the given data.
SSHFPRecord.Algorithm - Class in org.xbill.DNS
 
SSHFPRecord.Digest - Class in org.xbill.DNS
 
ST - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Stream
start - Variable in class org.xbill.DNS.Generator
The start of the range.
start - Variable in class org.xbill.DNS.ZoneTransferIn.Delta
The starting serial number of this delta.
startAXFR() - Method in interface org.xbill.DNS.ZoneTransferIn.ZoneTransferHandler
Called when an AXFR transfer begins.
startIXFR() - Method in interface org.xbill.DNS.ZoneTransferIn.ZoneTransferHandler
Called when an IXFR transfer begins.
startIXFRAdds(Record) - Method in interface org.xbill.DNS.ZoneTransferIn.ZoneTransferHandler
Called when a series of IXFR adds begins.
startIXFRDeletes(Record) - Method in interface org.xbill.DNS.ZoneTransferIn.ZoneTransferHandler
Called when a series of IXFR deletions begins.
STATSRV - Static variable in class org.xbill.DNS.WKSRecord.Service
Statistics Service
STATUS - Static variable in class org.xbill.DNS.Opcode
A server status request (not used)
step - Variable in class org.xbill.DNS.Generator
The step value of the range.
string(int) - Static method in class org.xbill.DNS.CERTRecord.CertificateType
Converts a certificate type into its textual representation
string(int) - Static method in class org.xbill.DNS.DClass
Converts a numeric DClass into a String
string(int) - Static method in class org.xbill.DNS.DNSSEC.Algorithm
Converts an algorithm into its textual representation
string(int) - Static method in class org.xbill.DNS.EDNSOption.Code
Converts an EDNS Option Code into its textual representation
string(int) - Static method in class org.xbill.DNS.ExtendedFlags
Converts a numeric extended flag into a String
string(int) - Static method in class org.xbill.DNS.Flags
Converts a numeric Flag into a String
string(int) - Static method in class org.xbill.DNS.KEYRecord.Protocol
Converts an KEY protocol value into its textual representation
string(int) - Static method in class org.xbill.DNS.Opcode
Converts a numeric Opcode into a String
string(int) - Static method in class org.xbill.DNS.Rcode
Converts a numeric Rcode into a String
string(int) - Static method in class org.xbill.DNS.Section
Converts a numeric Section into an abbreviation String
string(int) - Static method in class org.xbill.DNS.Type
Converts a numeric Type into a String
string(int) - Static method in class org.xbill.DNS.WKSRecord.Protocol
Converts an IP protocol value into its textual representation
string(int) - Static method in class org.xbill.DNS.WKSRecord.Service
Converts a TCP/UDP service port number into its textual representation.
SU_MIT_TG - Static variable in class org.xbill.DNS.WKSRecord.Service
SU/MIT Telnet Gateway
subdomain(Name) - Method in class org.xbill.DNS.Name
Is the current Name a subdomain of the specified name?
SUBJECT_PUBLIC_KEY_INFO - Static variable in class org.xbill.DNS.TLSARecord.Selector
SubjectPublicKeyInfo; DER-encoded binary structure defined in [RFC5280]
SUCCESSFUL - Static variable in class org.xbill.DNS.Lookup
The lookup was successful.
SUNRPC - Static variable in class org.xbill.DNS.WKSRecord.Service
SUN Remote Procedure Call
SUPDUP - Static variable in class org.xbill.DNS.WKSRecord.Service
SUPDUP
supportedType(int) - Static method in class org.xbill.DNS.Generator
Indicates whether generation is supported for this type.
SUR_MEAS - Static variable in class org.xbill.DNS.WKSRecord.Service
Survey Measurement
SWIFT_RVF - Static variable in class org.xbill.DNS.WKSRecord.Service
Swift Remote Virtual File Protocol

T

TACACS_DS - Static variable in class org.xbill.DNS.WKSRecord.Service
TACACS-Database Service
TACNEWS - Static variable in class org.xbill.DNS.WKSRecord.Service
TAC News
TC - Static variable in class org.xbill.DNS.Flags
truncated
TCP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Transmission Control
TELNET - Static variable in class org.xbill.DNS.WKSRecord.Service
Telnet
TextParseException - Exception in org.xbill.DNS
An exception thrown when unable to parse text.
TextParseException() - Constructor for exception org.xbill.DNS.TextParseException
 
TextParseException(String) - Constructor for exception org.xbill.DNS.TextParseException
 
TFTP - Static variable in class org.xbill.DNS.WKSRecord.Service
Trivial File Transfer
TIME - Static variable in class org.xbill.DNS.WKSRecord.Service
Time
TKEY - Static variable in class org.xbill.DNS.Type
Transaction key - used to compute a shared secret or exchange a key
TKEYRecord - Class in org.xbill.DNS
Transaction Key - used to compute and/or securely transport a shared secret to be used with TSIG.
TKEYRecord(Name, int, long, Name, Date, Date, int, int, byte[], byte[]) - Constructor for class org.xbill.DNS.TKEYRecord
Creates a TKEY Record from the given data.
TLS - Static variable in class org.xbill.DNS.KEYRecord.Protocol
Transaction Level Security
TLSA - Static variable in class org.xbill.DNS.Type
Transport Layer Security Authentication, draft-ietf-dane-protocol-23
TLSARecord - Class in org.xbill.DNS
Transport Layer Security Authentication
TLSARecord(Name, int, long, int, int, int, byte[]) - Constructor for class org.xbill.DNS.TLSARecord
Creates an TLSA Record from the given data
TLSARecord.CertificateUsage - Class in org.xbill.DNS
 
TLSARecord.MatchingType - Class in org.xbill.DNS
 
TLSARecord.Selector - Class in org.xbill.DNS
 
toArray(String, int) - Static method in class org.xbill.DNS.Address
Convert a string containing an IP address to an array of 4 or 16 integers.
toArray(String) - Static method in class org.xbill.DNS.Address
Convert a string containing an IPv4 address to an array of 4 integers.
toByteArray(String, int) - Static method in class org.xbill.DNS.Address
Convert a string containing an IP address to an array of 4 or 16 bytes.
toByteArray() - Method in class org.xbill.DNS.DNSOutput
Returns a byte array containing the current contents of the stream.
toDottedQuad(byte[]) - Static method in class org.xbill.DNS.Address
Converts a byte array containing an IPv4 address into a dotted quad string.
toDottedQuad(int[]) - Static method in class org.xbill.DNS.Address
Converts an int array containing an IPv4 address into a dotted quad string.
Tokenizer - Class in org.xbill.DNS
Tokenizer is used to parse DNS records and zones from text format,
Tokenizer(InputStream) - Constructor for class org.xbill.DNS.Tokenizer
Creates a Tokenizer from an arbitrary input stream.
Tokenizer(String) - Constructor for class org.xbill.DNS.Tokenizer
Creates a Tokenizer from a string.
Tokenizer(File) - Constructor for class org.xbill.DNS.Tokenizer
Creates a Tokenizer from a file.
Tokenizer.Token - Class in org.xbill.DNS
 
toMasterFile() - Method in class org.xbill.DNS.Zone
Returns the contents of the Zone in master file format.
toString() - Method in class org.xbill.DNS.APLRecord.Element
 
toString() - Method in class org.xbill.DNS.Cache
Returns the contents of the Cache as a string.
toString() - Method in class org.xbill.DNS.EDNSOption
 
toString() - Method in class org.xbill.DNS.Generator
Converts the generate specification to a string containing the corresponding $GENERATE statement.
toString() - Method in class org.xbill.DNS.Header
Converts the header into a String
toString() - Method in class org.xbill.DNS.Message
Converts the Message to a String.
toString(boolean) - Method in class org.xbill.DNS.Name
Convert a Name to a String
toString() - Method in class org.xbill.DNS.Name
Convert a Name to a String
toString() - Method in class org.xbill.DNS.Record
Converts a Record into a String representation
toString() - Method in class org.xbill.DNS.RRset
Converts the RRset to a String
toString() - Method in class org.xbill.DNS.SetResponse
Prints the value of the SetResponse
toString() - Method in class org.xbill.DNS.Tokenizer.Token
Converts the token to a string containing a representation useful for debugging.
toString(byte[]) - Static method in class org.xbill.DNS.utils.base16
Convert binary data to a hex-encoded String
toString(byte[]) - Method in class org.xbill.DNS.utils.base32
Convert binary data to a base32-encoded String
toString(byte[]) - Static method in class org.xbill.DNS.utils.base64
Convert binary data to a base64-encoded String
toString() - Method in class org.xbill.DNS.Zone
Returns the contents of the Zone as a string (in master file format).
toWire() - Method in class org.xbill.DNS.EDNSOption
Converts an EDNS Option (including code and length) into wire format.
toWire() - Method in class org.xbill.DNS.Header
 
toWire() - Method in class org.xbill.DNS.Message
Returns an array containing the wire format representation of the Message.
toWire(int) - Method in class org.xbill.DNS.Message
Returns an array containing the wire format representation of the Message with the specified maximum length.
toWire(DNSOutput, Compression) - Method in class org.xbill.DNS.Name
Emit a Name in DNS wire format
toWire() - Method in class org.xbill.DNS.Name
Emit a Name in DNS wire format
toWire(DNSOutput, Compression, boolean) - Method in class org.xbill.DNS.Name
Emit a Name in DNS wire format
toWire(int) - Method in class org.xbill.DNS.Record
Converts a Record into DNS uncompressed wire format.
toWireCanonical(DNSOutput) - Method in class org.xbill.DNS.Name
Emit a Name in canonical DNS wire format (all lowercase)
toWireCanonical() - Method in class org.xbill.DNS.Name
Emit a Name in canonical DNS wire format (all lowercase)
toWireCanonical() - Method in class org.xbill.DNS.Record
Converts a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
truncate(InetAddress, int) - Static method in class org.xbill.DNS.Address
Truncates an address to the specified number of bits.
TRUNK_1 - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Trunk-1
TRUNK_2 - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Trunk-2
TRUST_ANCHOR_ASSERTION - Static variable in class org.xbill.DNS.TLSARecord.CertificateUsage
 
TRY_AGAIN - Static variable in class org.xbill.DNS.Lookup
The lookup failed due to a network error.
TSIG - Class in org.xbill.DNS
Transaction signature handling.
TSIG(Name, Name, byte[]) - Constructor for class org.xbill.DNS.TSIG
Creates a new TSIG key, which can be used to sign or verify a message.
TSIG(Name, byte[]) - Constructor for class org.xbill.DNS.TSIG
Creates a new TSIG key with the hmac-md5 algorithm, which can be used to sign or verify a message.
TSIG(Name, String, String) - Constructor for class org.xbill.DNS.TSIG
Creates a new TSIG object, which can be used to sign or verify a message.
TSIG(String, String, String) - Constructor for class org.xbill.DNS.TSIG
Creates a new TSIG object, which can be used to sign or verify a message.
TSIG(String, String) - Constructor for class org.xbill.DNS.TSIG
Creates a new TSIG object with the hmac-md5 algorithm, which can be used to sign or verify a message.
TSIG - Static variable in class org.xbill.DNS.Type
Transaction signature
TSIG.StreamVerifier - Class in org.xbill.DNS
 
TSIG.StreamVerifier(TSIG, TSIGRecord) - Constructor for class org.xbill.DNS.TSIG.StreamVerifier
Creates an object to verify a multiple message response
TSIGRecord - Class in org.xbill.DNS
Transaction Signature - this record is automatically generated by the resolver.
TSIGRecord(Name, int, long, Name, Date, int, byte[], int, int, byte[]) - Constructor for class org.xbill.DNS.TSIGRecord
Creates a TSIG Record from the given data.
TSIGstring(int) - Static method in class org.xbill.DNS.Rcode
Converts a numeric TSIG extended Rcode into a String
ttl - Variable in class org.xbill.DNS.Generator
The ttl of the generated records.
ttl - Variable in class org.xbill.DNS.Record
 
TTL - Class in org.xbill.DNS
Routines for parsing BIND-style TTL values.
TXT - Static variable in class org.xbill.DNS.Type
Text strings
TXTRecord - Class in org.xbill.DNS
Text - stores text strings
TXTRecord(Name, int, long, List) - Constructor for class org.xbill.DNS.TXTRecord
Creates a TXT Record from the given data
TXTRecord(Name, int, long, String) - Constructor for class org.xbill.DNS.TXTRecord
Creates a TXT Record from the given data
type - Variable in class org.xbill.DNS.Generator
The type of the generated records.
type - Variable in class org.xbill.DNS.Record
 
type - Variable in class org.xbill.DNS.Tokenizer.Token
The type of token.
Type - Class in org.xbill.DNS
Constants and functions relating to DNS Types
TYPE_NOT_FOUND - Static variable in class org.xbill.DNS.Lookup
The host exists, but has no records associated with the queried type.

U

UCL - Static variable in class org.xbill.DNS.WKSRecord.Protocol
UCL
UDP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
User Datagram
unget() - Method in class org.xbill.DNS.Tokenizer
Returns a token to the stream, so that it will be returned by the next call to get().
unknownToString(byte[]) - Static method in class org.xbill.DNS.Record
Converts a byte array into the unknown RR format.
UNKRecord - Class in org.xbill.DNS
A class implementing Records of unknown and/or unimplemented types.
UNRECOVERABLE - Static variable in class org.xbill.DNS.Lookup
The lookup failed due to a data or server error.
unset(String) - Static method in class org.xbill.DNS.Options
Removes an option
unsetFlag(int) - Method in class org.xbill.DNS.Header
Sets a flag to the supplied value
UPDATE - Static variable in class org.xbill.DNS.Opcode
A dynamic update message
UPDATE - Static variable in class org.xbill.DNS.Section
The update (third) section of a dynamic update message
Update - Class in org.xbill.DNS
A helper class for constructing dynamic DNS (DDNS) update messages.
Update(Name, int) - Constructor for class org.xbill.DNS.Update
Creates an update message.
Update(Name) - Constructor for class org.xbill.DNS.Update
Creates an update message.
update(byte[], int, int) - Method in class org.xbill.DNS.utils.HMAC
Adds data to the current hash
update(byte[]) - Method in class org.xbill.DNS.utils.HMAC
Adds data to the current hash
updString(int) - Static method in class org.xbill.DNS.Section
Converts a numeric Section into a full description String for an update Message.
URI - Static variable in class org.xbill.DNS.CERTRecord.CertificateType
Certificate format defined by URI
URI - Static variable in class org.xbill.DNS.CERTRecord
Certificate format defined by URI
USE_MASK - Static variable in class org.xbill.DNS.KEYRecord.Flags
Bitmask of the use fields
USER - Static variable in class org.xbill.DNS.KEYRecord.Flags
Key is owned by a user.
USERS - Static variable in class org.xbill.DNS.WKSRecord.Service
Active Users
UUCP_PATH - Static variable in class org.xbill.DNS.WKSRecord.Service
UUCP Path Service

V

value(String) - Static method in class org.xbill.DNS.CERTRecord.CertificateType
Converts a textual representation of an certificate type into its numeric code.
value(String) - Static method in class org.xbill.DNS.DClass
Converts a String representation of a DClass into its numeric value
value(String) - Static method in class org.xbill.DNS.DNSSEC.Algorithm
Converts a textual representation of an algorithm into its numeric code.
value(String) - Static method in class org.xbill.DNS.EDNSOption.Code
Converts a textual representation of an EDNS Option Code into its numeric value.
value(String) - Static method in class org.xbill.DNS.ExtendedFlags
Converts a textual representation of an extended flag into its numeric value
value(String) - Static method in class org.xbill.DNS.Flags
Converts a String representation of an Flag into its numeric value
value(String) - Static method in class org.xbill.DNS.KEYRecord.Flags
Converts a textual representation of KEY flags into its numeric code.
value(String) - Static method in class org.xbill.DNS.KEYRecord.Protocol
Converts a textual representation of a KEY protocol into its numeric code.
value(String) - Static method in class org.xbill.DNS.Opcode
Converts a String representation of an Opcode into its numeric value
value(String) - Static method in class org.xbill.DNS.Options
Returns the value of an option
value(String) - Static method in class org.xbill.DNS.Rcode
Converts a String representation of an Rcode into its numeric value
value(String) - Static method in class org.xbill.DNS.Section
Converts a String representation of a Section into its numeric value
value - Variable in class org.xbill.DNS.Tokenizer.Token
The value of the token, or null for tokens without values.
value(String, boolean) - Static method in class org.xbill.DNS.Type
Converts a String representation of an Type into its numeric value.
value(String) - Static method in class org.xbill.DNS.Type
Converts a String representation of an Type into its numeric value
value(String) - Static method in class org.xbill.DNS.WKSRecord.Protocol
Converts a textual representation of an IP protocol into its numeric code.
value(String) - Static method in class org.xbill.DNS.WKSRecord.Service
Converts a textual representation of a TCP/UDP service into its port number.
verify(RRset, RRSIGRecord, DNSKEYRecord) - Static method in class org.xbill.DNS.DNSSEC
Verify a DNSSEC signature.
verify(Message, byte[]) - Method in class org.xbill.DNS.TSIG.StreamVerifier
Verifies a TSIG record on an incoming message that is part of a multiple message response.
verify(Message, byte[], int, TSIGRecord) - Method in class org.xbill.DNS.TSIG
Verifies a TSIG record on an incoming message.
verify(Message, byte[], TSIGRecord) - Method in class org.xbill.DNS.TSIG
Verifies a TSIG record on an incoming message.
verify(byte[]) - Method in class org.xbill.DNS.utils.HMAC
Verifies the data (computes the secure hash and compares it to the input)
verify(byte[], boolean) - Method in class org.xbill.DNS.utils.HMAC
Verifies the data (computes the secure hash and compares it to the input)
verifyMessage(Message, byte[], KEYRecord, SIGRecord) - Static method in class org.xbill.DNS.SIG0
Verify a message using SIG(0).
VIA_FTP - Static variable in class org.xbill.DNS.WKSRecord.Service
VIA Systems - FTP

W

WB_EXPAK - Static variable in class org.xbill.DNS.WKSRecord.Protocol
WIDEBAND EXPAK
WB_MON - Static variable in class org.xbill.DNS.WKSRecord.Protocol
WIDEBAND Monitoring
WHITESPACE - Static variable in class org.xbill.DNS.Tokenizer
Whitespace; only returned when wantWhitespace is set
wild(int) - Method in class org.xbill.DNS.Name
Generates a new Name with the first n labels replaced by a wildcard
WireParseException - Exception in org.xbill.DNS
An exception thrown when a DNS message is invalid.
WireParseException() - Constructor for exception org.xbill.DNS.WireParseException
 
WireParseException(String) - Constructor for exception org.xbill.DNS.WireParseException
 
WireParseException(String, Throwable) - Constructor for exception org.xbill.DNS.WireParseException
 
withName(Name) - Method in class org.xbill.DNS.Record
Creates a new record identical to the current record, but with a different name.
WKS - Static variable in class org.xbill.DNS.Type
Well known services
WKSRecord - Class in org.xbill.DNS
Well Known Services - Lists services offered by this host.
WKSRecord(Name, int, long, InetAddress, int, int[]) - Constructor for class org.xbill.DNS.WKSRecord
Creates a WKS Record from the given data
WKSRecord.Protocol - Class in org.xbill.DNS
 
WKSRecord.Service - Class in org.xbill.DNS
 
writeByteArray(byte[], int, int) - Method in class org.xbill.DNS.DNSOutput
Writes a byte array to the stream.
writeByteArray(byte[]) - Method in class org.xbill.DNS.DNSOutput
Writes a byte array to the stream.
writeCountedString(byte[]) - Method in class org.xbill.DNS.DNSOutput
Writes a counted string from the stream.
writeU16(int) - Method in class org.xbill.DNS.DNSOutput
Writes an unsigned 16 bit value to the stream.
writeU16At(int, int) - Method in class org.xbill.DNS.DNSOutput
Writes an unsigned 16 bit value to the specified position in the stream.
writeU32(long) - Method in class org.xbill.DNS.DNSOutput
Writes an unsigned 32 bit value to the stream.
writeU8(int) - Method in class org.xbill.DNS.DNSOutput
Writes an unsigned 8 bit value to the stream.

X

X25 - Static variable in class org.xbill.DNS.Type
X.25 calling address
X25Record - Class in org.xbill.DNS
X25 - identifies the PSDN (Public Switched Data Network) address in the X.121 numbering plan associated with a name.
X25Record(Name, int, long, String) - Constructor for class org.xbill.DNS.X25Record
Creates an X25 Record from the given data
X400 - Static variable in class org.xbill.DNS.WKSRecord.Service
X400
X400_SND - Static variable in class org.xbill.DNS.WKSRecord.Service
X400-SND
XNET - Static variable in class org.xbill.DNS.WKSRecord.Protocol
Cross Net Debugger
XNS_IDP - Static variable in class org.xbill.DNS.WKSRecord.Protocol
XEROX NS IDP

Y

YXDOMAIN - Static variable in class org.xbill.DNS.Rcode
The name exists
YXRRSET - Static variable in class org.xbill.DNS.Rcode
The RRset (name, type) exists

Z

ZONE - Static variable in class org.xbill.DNS.Credibility
A zone.
ZONE - Static variable in class org.xbill.DNS.KEYRecord.Flags
Key is owned by a zone.
ZONE - Static variable in class org.xbill.DNS.Section
The zone (first) section of a dynamic update message
Zone - Class in org.xbill.DNS
A DNS Zone.
Zone(Name, String) - Constructor for class org.xbill.DNS.Zone
Creates a Zone from the records in the specified master file.
Zone(Name, Record[]) - Constructor for class org.xbill.DNS.Zone
Creates a Zone from an array of records.
Zone(ZoneTransferIn) - Constructor for class org.xbill.DNS.Zone
Creates a Zone by doing the specified zone transfer.
Zone(Name, int, String) - Constructor for class org.xbill.DNS.Zone
Creates a Zone by performing a zone transfer to the specified host.
ZONE_KEY - Static variable in class org.xbill.DNS.DNSKEYRecord.Flags
Key is a zone key
ZoneTransferException - Exception in org.xbill.DNS
An exception thrown when a zone transfer fails.
ZoneTransferException() - Constructor for exception org.xbill.DNS.ZoneTransferException
 
ZoneTransferException(String) - Constructor for exception org.xbill.DNS.ZoneTransferException
 
ZoneTransferIn - Class in org.xbill.DNS
An incoming DNS Zone Transfer.
ZoneTransferIn.Delta - Class in org.xbill.DNS
 
ZoneTransferIn.ZoneTransferHandler - Interface in org.xbill.DNS
 

_

_nextRecord() - Method in class org.xbill.DNS.Master
Returns the next record in the master file.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ 
dnsjava-2.1.5/doc/index.html100644 0 0 2723 12131352547 13045 0ustar 0 0 dnsjava documentation <noscript> <div>JavaScript is disabled on your browser.</div> </noscript> <h2>Frame Alert</h2> <p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> dnsjava-2.1.5/doc/org/xbill/DNS/A6Record.html100644 0 0 40351 12131352545 15705 0ustar 0 0 A6Record (dnsjava documentation)
org.xbill.DNS

Class A6Record

    • Constructor Detail

      • A6Record

        public A6Record(Name name,
                int dclass,
                long ttl,
                int prefixBits,
                InetAddress suffix,
                Name prefix)
        Creates an A6 Record from the given data
        Parameters:
        prefixBits - The number of bits in the address prefix
        suffix - The address suffix
        prefix - The name of the prefix
    • Method Detail

      • getPrefixBits

        public int getPrefixBits()
        Returns the number of bits in the prefix
      • getSuffix

        public InetAddress getSuffix()
        Returns the address suffix
      • getPrefix

        public Name getPrefix()
        Returns the address prefix
dnsjava-2.1.5/doc/org/xbill/DNS/AAAARecord.html100644 0 0 35672 12131352545 16134 0ustar 0 0 AAAARecord (dnsjava documentation)
org.xbill.DNS

Class AAAARecord

    • Constructor Detail

      • AAAARecord

        public AAAARecord(Name name,
                  int dclass,
                  long ttl,
                  InetAddress address)
        Creates an AAAA Record from the given data
        Parameters:
        address - The address suffix
    • Method Detail

      • getAddress

        public InetAddress getAddress()
        Returns the address
dnsjava-2.1.5/doc/org/xbill/DNS/AFSDBRecord.html100644 0 0 43326 12131352545 16263 0ustar 0 0 AFSDBRecord (dnsjava documentation)
org.xbill.DNS

Class AFSDBRecord

    • Field Detail

      • u16Field

        protected int u16Field
      • nameField

        protected Name nameField
    • Constructor Detail

      • AFSDBRecord

        public AFSDBRecord(Name name,
                   int dclass,
                   long ttl,
                   int subtype,
                   Name host)
        Creates an AFSDB Record from the given data.
        Parameters:
        subtype - Indicates the type of service provided by the host.
        host - The host providing the service.
    • Method Detail

      • getSubtype

        public int getSubtype()
        Gets the subtype indicating the service provided by the host.
      • getHost

        public Name getHost()
        Gets the host providing service for the domain.
      • getU16Field

        protected int getU16Field()
      • getNameField

        protected Name getNameField()
dnsjava-2.1.5/doc/org/xbill/DNS/APLRecord.Element.html100644 0 0 37532 12131352545 17452 0ustar 0 0 APLRecord.Element (dnsjava documentation)
org.xbill.DNS

Class APLRecord.Element

  • Enclosing class:
    APLRecord


    public static class APLRecord.Element
    extends Object
    • Field Detail

      • family

        public final int family
      • negative

        public final boolean negative
      • prefixLength

        public final int prefixLength
      • address

        public final Object address
    • Constructor Detail

      • APLRecord.Element

        public APLRecord.Element(boolean negative,
                         InetAddress address,
                         int prefixLength)
        Creates an APL element corresponding to an IPv4 or IPv6 prefix.
        Parameters:
        negative - Indicates if this prefix is a negation.
        address - The IPv4 or IPv6 address.
        prefixLength - The length of this prefix, in bits.
        Throws:
        IllegalArgumentException - The prefix length is invalid.
dnsjava-2.1.5/doc/org/xbill/DNS/APLRecord.html100644 0 0 37414 12131352545 16061 0ustar 0 0 APLRecord (dnsjava documentation)
org.xbill.DNS

Class APLRecord

    • Constructor Detail

      • APLRecord

        public APLRecord(Name name,
                 int dclass,
                 long ttl,
                 List elements)
        Creates an APL Record from the given data.
        Parameters:
        elements - The list of APL elements.
    • Method Detail

      • getElements

        public List getElements()
        Returns the list of APL elements.
dnsjava-2.1.5/doc/org/xbill/DNS/ARecord.html100644 0 0 35634 12131352545 15627 0ustar 0 0 ARecord (dnsjava documentation)
org.xbill.DNS

Class ARecord

    • Constructor Detail

      • ARecord

        public ARecord(Name name,
               int dclass,
               long ttl,
               InetAddress address)
        Creates an A Record from the given data
        Parameters:
        address - The address that the name refers to
    • Method Detail

      • getAddress

        public InetAddress getAddress()
        Returns the Internet address
dnsjava-2.1.5/doc/org/xbill/DNS/Address.html100644 0 0 73277 12131352545 15702 0ustar 0 0 Address (dnsjava documentation)
org.xbill.DNS

Class Address



  • public final class Address
    extends Object
    Routines dealing with IP addresses. Includes functions similar to those in the java.net.InetAddress class.
    Author:
    Brian Wellington
    • Method Detail

      • toArray

        public static int[] toArray(String s,
                    int family)
        Convert a string containing an IP address to an array of 4 or 16 integers.
        Parameters:
        s - The address, in text format.
        family - The address family.
        Returns:
        The address
      • toArray

        public static int[] toArray(String s)
        Convert a string containing an IPv4 address to an array of 4 integers.
        Parameters:
        s - The address, in text format.
        Returns:
        The address
      • toByteArray

        public static byte[] toByteArray(String s,
                         int family)
        Convert a string containing an IP address to an array of 4 or 16 bytes.
        Parameters:
        s - The address, in text format.
        family - The address family.
        Returns:
        The address
      • isDottedQuad

        public static boolean isDottedQuad(String s)
        Determines if a string contains a valid IP address.
        Parameters:
        s - The string
        Returns:
        Whether the string contains a valid IP address
      • toDottedQuad

        public static String toDottedQuad(byte[] addr)
        Converts a byte array containing an IPv4 address into a dotted quad string.
        Parameters:
        addr - The array
        Returns:
        The string representation
      • toDottedQuad

        public static String toDottedQuad(int[] addr)
        Converts an int array containing an IPv4 address into a dotted quad string.
        Parameters:
        addr - The array
        Returns:
        The string representation
      • getByAddress

        public static InetAddress getByAddress(String addr)
                                        throws UnknownHostException
        Converts an address from its string representation to an IP address. The address can be either IPv4 or IPv6.
        Parameters:
        addr - The address, in string form
        Returns:
        The IP addresses
        Throws:
        UnknownHostException - The address is not a valid IP address.
      • getByAddress

        public static InetAddress getByAddress(String addr,
                               int family)
                                        throws UnknownHostException
        Converts an address from its string representation to an IP address in a particular family.
        Parameters:
        addr - The address, in string form
        family - The address family, either IPv4 or IPv6.
        Returns:
        The IP addresses
        Throws:
        UnknownHostException - The address is not a valid IP address in the specified address family.
      • familyOf

        public static int familyOf(InetAddress address)
        Returns the family of an InetAddress.
        Parameters:
        address - The supplied address.
        Returns:
        The family, either IPv4 or IPv6.
      • addressLength

        public static int addressLength(int family)
        Returns the length of an address in a particular family.
        Parameters:
        family - The address family, either IPv4 or IPv6.
        Returns:
        The length of addresses in that family.
      • truncate

        public static InetAddress truncate(InetAddress address,
                           int maskLength)
        Truncates an address to the specified number of bits. For example, truncating the address 10.1.2.3 to 8 bits would yield 10.0.0.0.
        Parameters:
        address - The source address
        maskLength - The number of bits to truncate the address to.
dnsjava-2.1.5/doc/org/xbill/DNS/CERTRecord.CertificateType.html100644 0 0 43360 12131352545 21262 0ustar 0 0 CERTRecord.CertificateType (dnsjava documentation)
org.xbill.DNS

Class CERTRecord.CertificateType

  • Enclosing class:
    CERTRecord


    public static class CERTRecord.CertificateType
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int ACPKIX
      Attribute Certificate
      static int IACPKIX
      URL of an Attribute Certificate
      static int IPGP
      Fingerprint and URL of an OpenPGP packet
      static int IPKIX
      URL of an X.509 data object
      static int ISPKI
      URL of an SPKI certificate
      static int OID
      Certificate format defined by OID
      static int PGP
      Pretty Good Privacy
      static int PKIX
      PKIX (X.509v3)
      static int SPKI
      Simple Public Key Infrastructure
      static int URI
      Certificate format defined by URI
    • Method Detail

      • string

        public static String string(int type)
        Converts a certificate type into its textual representation
      • value

        public static int value(String s)
        Converts a textual representation of an certificate type into its numeric code. Integers in the range 0..65535 are also accepted.
        Parameters:
        s - The textual representation of the algorithm
        Returns:
        The algorithm code, or -1 on error.
dnsjava-2.1.5/doc/org/xbill/DNS/CERTRecord.html100644 0 0 51555 12131352545 16204 0ustar 0 0 CERTRecord (dnsjava documentation)
org.xbill.DNS

Class CERTRecord

    • Constructor Detail

      • CERTRecord

        public CERTRecord(Name name,
                  int dclass,
                  long ttl,
                  int certType,
                  int keyTag,
                  int alg,
                  byte[] cert)
        Creates a CERT Record from the given data
        Parameters:
        certType - The type of certificate (see constants)
        keyTag - The ID of the associated KEYRecord, if present
        alg - The algorithm of the associated KEYRecord, if present
        cert - Binary data representing the certificate
    • Method Detail

      • getCertType

        public int getCertType()
        Returns the type of certificate
      • getKeyTag

        public int getKeyTag()
        Returns the ID of the associated KEYRecord, if present
      • getAlgorithm

        public int getAlgorithm()
        Returns the algorithm of the associated KEYRecord, if present
      • getCert

        public byte[] getCert()
        Returns the binary representation of the certificate
dnsjava-2.1.5/doc/org/xbill/DNS/CNAMERecord.html100644 0 0 41667 12131352545 16275 0ustar 0 0 CNAMERecord (dnsjava documentation)
org.xbill.DNS

Class CNAMERecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • CNAMERecord

        public CNAMERecord(Name name,
                   int dclass,
                   long ttl,
                   Name alias)
        Creates a new CNAMERecord with the given data
        Parameters:
        alias - The name to which the CNAME alias points
    • Method Detail

      • getTarget

        public Name getTarget()
        Gets the target of the CNAME Record
      • getAlias

        public Name getAlias()
        Gets the alias specified by the CNAME Record
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/Cache.html100644 0 0 100221 12131352545 15314 0ustar 0 0 Cache (dnsjava documentation)
org.xbill.DNS

Class Cache



  • public class Cache
    extends Object
    A cache of DNS records. The cache obeys TTLs, so items are purged after their validity period is complete. Negative answers are cached, to avoid repeated failed DNS queries. The credibility of each RRset is maintained, so that more credible records replace less credible records, and lookups can specify the minimum credibility of data they are requesting.
    Author:
    Brian Wellington
    See Also:
    RRset, Credibility
    • Constructor Summary

      Constructors 
      Constructor and Description
      Cache()
      Creates an empty Cache for class IN.
      Cache(int dclass)
      Creates an empty Cache
      Cache(String file)
      Creates a Cache which initially contains all records in the specified file.
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      SetResponse addMessage(Message in)
      Adds all data from a Message into the Cache.
      void addNegative(Name name, int type, SOARecord soa, int cred)
      Adds a negative entry to the Cache.
      void addRecord(Record r, int cred, Object o)
      Adds a record to the Cache.
      void addRRset(RRset rrset, int cred)
      Adds an RRset to the Cache.
      void clearCache()
      Empties the Cache.
      RRset[] findAnyRecords(Name name, int type)
      Looks up Records in the Cache (a wrapper around lookupRecords).
      RRset[] findRecords(Name name, int type)
      Looks up credible Records in the Cache (a wrapper around lookupRecords).
      void flushName(Name name)
      Flushes all RRsets with a given name from the cache
      void flushSet(Name name, int type)
      Flushes an RRset from the cache
      int getDClass()
      Returns the DNS class of this cache.
      int getMaxCache()
      Gets the maximum length of time that records will be stored in this Cache.
      int getMaxEntries()
      Gets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name.
      int getMaxNCache()
      Gets the maximum length of time that a negative response will be stored in this Cache.
      int getSize()
      Gets the current number of entries in the Cache, where an entry consists of all records with a specific Name.
      protected SetResponse lookup(Name name, int type, int minCred)
      Finds all matching sets or something that causes the lookup to stop.
      SetResponse lookupRecords(Name name, int type, int minCred)
      Looks up Records in the Cache.
      void setMaxCache(int seconds)
      Sets the maximum length of time that records will be stored in this Cache.
      void setMaxEntries(int entries)
      Sets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name.
      void setMaxNCache(int seconds)
      Sets the maximum length of time that a negative response will be stored in this Cache.
      String toString()
      Returns the contents of the Cache as a string.
    • Constructor Detail

      • Cache

        public Cache(int dclass)
        Creates an empty Cache
        Parameters:
        dclass - The DNS class of this cache
        See Also:
        DClass
      • Cache

        public Cache()
        Creates an empty Cache for class IN.
        See Also:
        DClass
      • Cache

        public Cache(String file)
              throws IOException
        Creates a Cache which initially contains all records in the specified file.
        Throws:
        IOException
    • Method Detail

      • clearCache

        public void clearCache()
        Empties the Cache.
      • addRecord

        public void addRecord(Record r,
                     int cred,
                     Object o)
        Adds a record to the Cache.
        Parameters:
        r - The record to be added
        cred - The credibility of the record
        o - The source of the record (this could be a Message, for example)
        See Also:
        Record
      • addRRset

        public void addRRset(RRset rrset,
                    int cred)
        Adds an RRset to the Cache.
        Parameters:
        rrset - The RRset to be added
        cred - The credibility of these records
        See Also:
        RRset
      • addNegative

        public void addNegative(Name name,
                       int type,
                       SOARecord soa,
                       int cred)
        Adds a negative entry to the Cache.
        Parameters:
        name - The name of the negative entry
        type - The type of the negative entry
        soa - The SOA record to add to the negative cache entry, or null. The negative cache ttl is derived from the SOA.
        cred - The credibility of the negative entry
      • lookup

        protected SetResponse lookup(Name name,
                         int type,
                         int minCred)
        Finds all matching sets or something that causes the lookup to stop.
      • lookupRecords

        public SetResponse lookupRecords(Name name,
                                int type,
                                int minCred)
        Looks up Records in the Cache. This follows CNAMEs and handles negatively cached data.
        Parameters:
        name - The name to look up
        type - The type to look up
        minCred - The minimum acceptable credibility
        Returns:
        A SetResponse object
        See Also:
        SetResponse, Credibility
      • findRecords

        public RRset[] findRecords(Name name,
                          int type)
        Looks up credible Records in the Cache (a wrapper around lookupRecords). Unlike lookupRecords, this given no indication of why failure occurred.
        Parameters:
        name - The name to look up
        type - The type to look up
        Returns:
        An array of RRsets, or null
        See Also:
        Credibility
      • findAnyRecords

        public RRset[] findAnyRecords(Name name,
                             int type)
        Looks up Records in the Cache (a wrapper around lookupRecords). Unlike lookupRecords, this given no indication of why failure occurred.
        Parameters:
        name - The name to look up
        type - The type to look up
        Returns:
        An array of RRsets, or null
        See Also:
        Credibility
      • addMessage

        public SetResponse addMessage(Message in)
        Adds all data from a Message into the Cache. Each record is added with the appropriate credibility, and negative answers are cached as such.
        Parameters:
        in - The Message to be added
        Returns:
        A SetResponse that reflects what would be returned from a cache lookup, or null if nothing useful could be cached from the message.
        See Also:
        Message
      • flushSet

        public void flushSet(Name name,
                    int type)
        Flushes an RRset from the cache
        Parameters:
        name - The name of the records to be flushed
        type - The type of the records to be flushed
        See Also:
        RRset
      • flushName

        public void flushName(Name name)
        Flushes all RRsets with a given name from the cache
        Parameters:
        name - The name of the records to be flushed
        See Also:
        RRset
      • setMaxNCache

        public void setMaxNCache(int seconds)
        Sets the maximum length of time that a negative response will be stored in this Cache. A negative value disables this feature (that is, sets no limit).
      • getMaxNCache

        public int getMaxNCache()
        Gets the maximum length of time that a negative response will be stored in this Cache. A negative value indicates no limit.
      • setMaxCache

        public void setMaxCache(int seconds)
        Sets the maximum length of time that records will be stored in this Cache. A negative value disables this feature (that is, sets no limit).
      • getMaxCache

        public int getMaxCache()
        Gets the maximum length of time that records will be stored in this Cache. A negative value indicates no limit.
      • getSize

        public int getSize()
        Gets the current number of entries in the Cache, where an entry consists of all records with a specific Name.
      • getMaxEntries

        public int getMaxEntries()
        Gets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name. A negative value is treated as an infinite limit.
      • setMaxEntries

        public void setMaxEntries(int entries)
        Sets the maximum number of entries in the Cache, where an entry consists of all records with a specific Name. A negative value is treated as an infinite limit. Note that setting this to a value lower than the current number of entries will not cause the Cache to shrink immediately. The default maximum number of entries is 50000.
        Parameters:
        entries - The maximum number of entries in the Cache.
      • getDClass

        public int getDClass()
        Returns the DNS class of this cache.
      • toString

        public String toString()
        Returns the contents of the Cache as a string.
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/ClientSubnetOption.html100644 0 0 41530 12131352545 20070 0ustar 0 0 ClientSubnetOption (dnsjava documentation)
org.xbill.DNS

Class ClientSubnetOption



  • public class ClientSubnetOption
    extends EDNSOption
    The Client Subnet EDNS Option, defined in http://tools.ietf.org/html/draft-vandergaast-edns-client-subnet-00 ("Client subnet in DNS requests"). The option is used to convey information about the IP address of the originating client, so that an authoritative server can make decisions based on this address, rather than the address of the intermediate caching name server. The option is transmitted as part of an OPTRecord in the additional section of a DNS message, as defined by RFC 2671 (EDNS0). An option code has not been assigned by IANA; the value 20730 (used here) is also used by several other implementations. The wire format of the option contains a 2-byte length field (1 for IPv4, 2 for IPv6), a 1-byte source netmask, a 1-byte scope netmask, and an address truncated to the source netmask length (where the final octet is padded with bits set to 0)
    Author:
    Brian Wellington, Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks
    See Also:
    OPTRecord
    • Constructor Detail

      • ClientSubnetOption

        public ClientSubnetOption(int sourceNetmask,
                          int scopeNetmask,
                          InetAddress address)
        Construct a Client Subnet option. Note that the number of significant bits in the address must not be greater than the supplied source netmask. XXX something about Java's mapped addresses
        Parameters:
        sourceNetmask - The length of the netmask pertaining to the query. In replies, it mirrors the same value as in the requests.
        scopeNetmask - The length of the netmask pertaining to the reply. In requests, it MUST be set to 0. In responses, this may or may not match the source netmask.
        address - The address of the client.
      • ClientSubnetOption

        public ClientSubnetOption(int sourceNetmask,
                          InetAddress address)
        Construct a Client Subnet option with scope netmask set to 0.
        Parameters:
        sourceNetmask - The length of the netmask pertaining to the query. In replies, it mirrors the same value as in the requests.
        address - The address of the client.
        See Also:
        ClientSubnetOption
    • Method Detail

      • getFamily

        public int getFamily()
        Returns the family of the network address. This will be either IPv4 (1) or IPv6 (2).
      • getSourceNetmask

        public int getSourceNetmask()
        Returns the source netmask.
      • getScopeNetmask

        public int getScopeNetmask()
        Returns the scope netmask.
      • getAddress

        public InetAddress getAddress()
        Returns the IP address of the client.
dnsjava-2.1.5/doc/org/xbill/DNS/Compression.html100644 0 0 27575 12131352545 16616 0ustar 0 0 Compression (dnsjava documentation)
org.xbill.DNS

Class Compression



  • public class Compression
    extends Object
    DNS Name Compression object.
    Author:
    Brian Wellington
    See Also:
    Message, Name
    • Constructor Summary

      Constructors 
      Constructor and Description
      Compression()
      Creates a new Compression object.
    • Constructor Detail

      • Compression

        public Compression()
        Creates a new Compression object.
    • Method Detail

      • add

        public void add(int pos,
               Name name)
        Adds a compression entry mapping a name to a position in a message.
        Parameters:
        pos - The position at which the name is added.
        name - The name being added to the message.
      • get

        public int get(Name name)
        Retrieves the position of the given name, if it has been previously included in the message.
        Parameters:
        name - The name to find in the compression table.
        Returns:
        The position of the name, or -1 if not found.
dnsjava-2.1.5/doc/org/xbill/DNS/Credibility.html100644 0 0 37033 12131352545 16546 0ustar 0 0 Credibility (dnsjava documentation)
org.xbill.DNS

Class Credibility



  • public final class Credibility
    extends Object
    Constants relating to the credibility of cached data, which is based on the data's source. The constants NORMAL and ANY should be used by most callers.
    Author:
    Brian Wellington
    See Also:
    Cache, Section
    • Field Detail

      • ADDITIONAL

        public static final int ADDITIONAL
        The additional section of a response.
        See Also:
        Constant Field Values
      • GLUE

        public static final int GLUE
        The additional section of a response.
        See Also:
        Constant Field Values
      • NONAUTH_AUTHORITY

        public static final int NONAUTH_AUTHORITY
        The authority section of a nonauthoritative response.
        See Also:
        Constant Field Values
      • NONAUTH_ANSWER

        public static final int NONAUTH_ANSWER
        The answer section of a nonauthoritative response.
        See Also:
        Constant Field Values
      • AUTH_AUTHORITY

        public static final int AUTH_AUTHORITY
        The authority section of an authoritative response.
        See Also:
        Constant Field Values
      • AUTH_ANSWER

        public static final int AUTH_ANSWER
        The answer section of a authoritative response.
        See Also:
        Constant Field Values
dnsjava-2.1.5/doc/org/xbill/DNS/DClass.html100644 0 0 40207 12131352545 15451 0ustar 0 0 DClass (dnsjava documentation)
org.xbill.DNS

Class DClass



  • public final class DClass
    extends Object
    Constants and functions relating to DNS classes. This is called DClass to avoid confusion with Class.
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int ANY
      Matches any class
      static int CH
      Chaos network (MIT)
      static int CHAOS
      Chaos network (MIT, alternate name)
      static int HESIOD
      Hesiod name server (MIT, alternate name)
      static int HS
      Hesiod name server (MIT)
      static int IN
      Internet
      static int NONE
      Special value used in dynamic update messages
    • Method Detail

      • check

        public static void check(int i)
        Checks that a numeric DClass is valid.
        Throws:
        InvalidDClassException - The class is out of range.
      • string

        public static String string(int i)
        Converts a numeric DClass into a String
        Returns:
        The canonical string representation of the class
        Throws:
        InvalidDClassException - The class is out of range.
      • value

        public static int value(String s)
        Converts a String representation of a DClass into its numeric value
        Returns:
        The class code, or -1 on error.
dnsjava-2.1.5/doc/org/xbill/DNS/DHCIDRecord.html100644 0 0 34555 12131352545 16263 0ustar 0 0 DHCIDRecord (dnsjava documentation)
org.xbill.DNS

Class DHCIDRecord

    • Constructor Detail

      • DHCIDRecord

        public DHCIDRecord(Name name,
                   int dclass,
                   long ttl,
                   byte[] data)
        Creates an DHCID Record from the given data
        Parameters:
        data - The binary data, which is opaque to DNS.
    • Method Detail

      • getData

        public byte[] getData()
        Returns the binary data.
dnsjava-2.1.5/doc/org/xbill/DNS/DLVRecord.html100644 0 0 44021 12131352545 16062 0ustar 0 0 DLVRecord (dnsjava documentation)
org.xbill.DNS

Class DLVRecord

    • Constructor Detail

      • DLVRecord

        public DLVRecord(Name name,
                 int dclass,
                 long ttl,
                 int footprint,
                 int alg,
                 int digestid,
                 byte[] digest)
        Creates a DLV Record from the given data
        Parameters:
        footprint - The original KEY record's footprint (keyid).
        alg - The original key algorithm.
        digestid - The digest id code.
        digest - A hash of the original key.
    • Method Detail

      • getAlgorithm

        public int getAlgorithm()
        Returns the key's algorithm.
      • getDigestID

        public int getDigestID()
        Returns the key's Digest ID.
      • getDigest

        public byte[] getDigest()
        Returns the binary hash of the key.
      • getFootprint

        public int getFootprint()
        Returns the key's footprint.
dnsjava-2.1.5/doc/org/xbill/DNS/DNAMERecord.html100644 0 0 41671 12131352545 16271 0ustar 0 0 DNAMERecord (dnsjava documentation)
org.xbill.DNS

Class DNAMERecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • DNAMERecord

        public DNAMERecord(Name name,
                   int dclass,
                   long ttl,
                   Name alias)
        Creates a new DNAMERecord with the given data
        Parameters:
        alias - The name to which the DNAME alias points
    • Method Detail

      • getTarget

        public Name getTarget()
        Gets the target of the DNAME Record
      • getAlias

        public Name getAlias()
        Gets the alias specified by the DNAME Record
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/DNSInput.html100644 0 0 56041 12131352545 15747 0ustar 0 0 DNSInput (dnsjava documentation)
org.xbill.DNS

Class DNSInput



  • public class DNSInput
    extends Object
    An class for parsing DNS messages.
    Author:
    Brian Wellington
    • Constructor Summary

      Constructors 
      Constructor and Description
      DNSInput(byte[] input)
      Creates a new DNSInput
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void clearActive()
      Clears the active region of the string.
      int current()
      Returns the current position.
      void jump(int index)
      Resets the current position of the input stream to the specified index, and clears the active region.
      byte[] readByteArray()
      Reads a byte array consisting of the remainder of the stream (or the active region, if one is set.
      void readByteArray(byte[] b, int off, int len)
      Reads a byte array of a specified length from the stream into an existing array.
      byte[] readByteArray(int len)
      Reads a byte array of a specified length from the stream.
      byte[] readCountedString()
      Reads a counted string from the stream.
      int readU16()
      Reads an unsigned 16 bit value from the stream, as an int.
      long readU32()
      Reads an unsigned 32 bit value from the stream, as a long.
      int readU8()
      Reads an unsigned 8 bit value from the stream, as an int.
      int remaining()
      Returns the number of bytes that can be read from this stream before reaching the end.
      void restore()
      Restores the input stream to its state before the call to save().
      void restoreActive(int pos)
      Restores the previously set active region.
      void save()
      Saves the current state of the input stream.
      int saveActive()
      Returns the position of the end of the current active region.
      void setActive(int len)
      Marks the following bytes in the stream as active.
    • Constructor Detail

      • DNSInput

        public DNSInput(byte[] input)
        Creates a new DNSInput
        Parameters:
        input - The byte array to read from
    • Method Detail

      • current

        public int current()
        Returns the current position.
      • remaining

        public int remaining()
        Returns the number of bytes that can be read from this stream before reaching the end.
      • setActive

        public void setActive(int len)
        Marks the following bytes in the stream as active.
        Parameters:
        len - The number of bytes in the active region.
        Throws:
        IllegalArgumentException - The number of bytes in the active region is longer than the remainder of the input.
      • clearActive

        public void clearActive()
        Clears the active region of the string. Further operations are not restricted to part of the input.
      • saveActive

        public int saveActive()
        Returns the position of the end of the current active region.
      • restoreActive

        public void restoreActive(int pos)
        Restores the previously set active region. This differs from setActive() in that restoreActive() takes an absolute position, and setActive takes an offset from the current location.
        Parameters:
        pos - The end of the active region.
      • jump

        public void jump(int index)
        Resets the current position of the input stream to the specified index, and clears the active region.
        Parameters:
        index - The position to continue parsing at.
        Throws:
        IllegalArgumentException - The index is not within the input.
      • save

        public void save()
        Saves the current state of the input stream. Both the current position and the end of the active region are saved.
        Throws:
        IllegalArgumentException - The index is not within the input.
      • restore

        public void restore()
        Restores the input stream to its state before the call to save().
      • readU8

        public int readU8()
                   throws WireParseException
        Reads an unsigned 8 bit value from the stream, as an int.
        Returns:
        An unsigned 8 bit value.
        Throws:
        WireParseException - The end of the stream was reached.
      • readU16

        public int readU16()
                    throws WireParseException
        Reads an unsigned 16 bit value from the stream, as an int.
        Returns:
        An unsigned 16 bit value.
        Throws:
        WireParseException - The end of the stream was reached.
      • readU32

        public long readU32()
                     throws WireParseException
        Reads an unsigned 32 bit value from the stream, as a long.
        Returns:
        An unsigned 32 bit value.
        Throws:
        WireParseException - The end of the stream was reached.
      • readByteArray

        public void readByteArray(byte[] b,
                         int off,
                         int len)
                           throws WireParseException
        Reads a byte array of a specified length from the stream into an existing array.
        Parameters:
        b - The array to read into.
        off - The offset of the array to start copying data into.
        len - The number of bytes to copy.
        Throws:
        WireParseException - The end of the stream was reached.
      • readByteArray

        public byte[] readByteArray(int len)
                             throws WireParseException
        Reads a byte array of a specified length from the stream.
        Returns:
        The byte array.
        Throws:
        WireParseException - The end of the stream was reached.
      • readByteArray

        public byte[] readByteArray()
        Reads a byte array consisting of the remainder of the stream (or the active region, if one is set.
        Returns:
        The byte array.
      • readCountedString

        public byte[] readCountedString()
                                 throws WireParseException
        Reads a counted string from the stream. A counted string is a one byte value indicating string length, followed by bytes of data.
        Returns:
        A byte array containing the string.
        Throws:
        WireParseException - The end of the stream was reached.
dnsjava-2.1.5/doc/org/xbill/DNS/DNSKEYRecord.Flags.html100644 0 0 25276 12131352545 17500 0ustar 0 0 DNSKEYRecord.Flags (dnsjava documentation)
org.xbill.DNS

Class DNSKEYRecord.Flags

dnsjava-2.1.5/doc/org/xbill/DNS/DNSKEYRecord.Protocol.html100644 0 0 22736 12131352545 20243 0ustar 0 0 DNSKEYRecord.Protocol (dnsjava documentation)
org.xbill.DNS

Class DNSKEYRecord.Protocol

dnsjava-2.1.5/doc/org/xbill/DNS/DNSKEYRecord.html100644 0 0 60413 12131352545 16435 0ustar 0 0 DNSKEYRecord (dnsjava documentation)
org.xbill.DNS

Class DNSKEYRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class DNSKEYRecord
    extends Record
    Key - contains a cryptographic public key for use by DNS. The data can be converted to objects implementing java.security.interfaces.PublicKey
    Author:
    Brian Wellington
    See Also:
    DNSSEC, Serialized Form
    • Field Detail

      • flags

        protected int flags
      • proto

        protected int proto
      • alg

        protected int alg
      • key

        protected byte[] key
      • footprint

        protected int footprint
    • Constructor Detail

      • DNSKEYRecord

        public DNSKEYRecord(Name name,
                    int dclass,
                    long ttl,
                    int flags,
                    int proto,
                    int alg,
                    byte[] key)
        Creates a DNSKEY Record from the given data
        Parameters:
        flags - Flags describing the key's properties
        proto - The protocol that the key was created for
        alg - The key's algorithm
        key - Binary representation of the key
      • DNSKEYRecord

        public DNSKEYRecord(Name name,
                    int dclass,
                    long ttl,
                    int flags,
                    int proto,
                    int alg,
                    PublicKey key)
                     throws DNSSEC.DNSSECException
        Creates a DNSKEY Record from the given data
        Parameters:
        flags - Flags describing the key's properties
        proto - The protocol that the key was created for
        alg - The key's algorithm
        key - The key as a PublicKey
        Throws:
        DNSSEC.DNSSECException - The PublicKey could not be converted into DNS format.
    • Method Detail

      • getFlags

        public int getFlags()
        Returns the flags describing the key's properties
      • getProtocol

        public int getProtocol()
        Returns the protocol that the key was created for
      • getAlgorithm

        public int getAlgorithm()
        Returns the key's algorithm
      • getKey

        public byte[] getKey()
        Returns the binary data representing the key
      • getFootprint

        public int getFootprint()
        Returns the key's footprint (after computing it)
dnsjava-2.1.5/doc/org/xbill/DNS/DNSOutput.html100644 0 0 45120 12131352545 16144 0ustar 0 0 DNSOutput (dnsjava documentation)
org.xbill.DNS

Class DNSOutput



  • public class DNSOutput
    extends Object
    A class for rendering DNS messages.
    Author:
    Brian Wellington
    • Constructor Summary

      Constructors 
      Constructor and Description
      DNSOutput()
      Create a new DNSOutput
      DNSOutput(int size)
      Create a new DNSOutput with a specified size.
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      int current()
      Returns the current position.
      void jump(int index)
      Resets the current position of the output stream to the specified index.
      void restore()
      Restores the input stream to its state before the call to save().
      void save()
      Saves the current state of the output stream.
      byte[] toByteArray()
      Returns a byte array containing the current contents of the stream.
      void writeByteArray(byte[] b)
      Writes a byte array to the stream.
      void writeByteArray(byte[] b, int off, int len)
      Writes a byte array to the stream.
      void writeCountedString(byte[] s)
      Writes a counted string from the stream.
      void writeU16(int val)
      Writes an unsigned 16 bit value to the stream.
      void writeU16At(int val, int where)
      Writes an unsigned 16 bit value to the specified position in the stream.
      void writeU32(long val)
      Writes an unsigned 32 bit value to the stream.
      void writeU8(int val)
      Writes an unsigned 8 bit value to the stream.
    • Constructor Detail

      • DNSOutput

        public DNSOutput(int size)
        Create a new DNSOutput with a specified size.
        Parameters:
        size - The initial size
      • DNSOutput

        public DNSOutput()
        Create a new DNSOutput
    • Method Detail

      • current

        public int current()
        Returns the current position.
      • jump

        public void jump(int index)
        Resets the current position of the output stream to the specified index.
        Parameters:
        index - The new current position.
        Throws:
        IllegalArgumentException - The index is not within the output.
      • save

        public void save()
        Saves the current state of the output stream.
        Throws:
        IllegalArgumentException - The index is not within the output.
      • restore

        public void restore()
        Restores the input stream to its state before the call to save().
      • writeU8

        public void writeU8(int val)
        Writes an unsigned 8 bit value to the stream.
        Parameters:
        val - The value to be written
      • writeU16

        public void writeU16(int val)
        Writes an unsigned 16 bit value to the stream.
        Parameters:
        val - The value to be written
      • writeU16At

        public void writeU16At(int val,
                      int where)
        Writes an unsigned 16 bit value to the specified position in the stream.
        Parameters:
        val - The value to be written
        where - The position to write the value.
      • writeU32

        public void writeU32(long val)
        Writes an unsigned 32 bit value to the stream.
        Parameters:
        val - The value to be written
      • writeByteArray

        public void writeByteArray(byte[] b,
                          int off,
                          int len)
        Writes a byte array to the stream.
        Parameters:
        b - The array to write.
        off - The offset of the array to start copying data from.
        len - The number of bytes to write.
      • writeByteArray

        public void writeByteArray(byte[] b)
        Writes a byte array to the stream.
        Parameters:
        b - The array to write.
      • writeCountedString

        public void writeCountedString(byte[] s)
        Writes a counted string from the stream. A counted string is a one byte value indicating string length, followed by bytes of data.
        Parameters:
        s - The string to write.
      • toByteArray

        public byte[] toByteArray()
        Returns a byte array containing the current contents of the stream.
dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.Algorithm.html100644 0 0 47252 12131352545 17213 0ustar 0 0 DNSSEC.Algorithm (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.Algorithm

  • Enclosing class:
    DNSSEC


    public static class DNSSEC.Algorithm
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int DH
      Diffie Hellman key
      static int DSA
      DSA public key
      static int DSA_NSEC3_SHA1
      DSA/SHA1, NSEC3-aware public key
      static int ECDSAP256SHA256
      ECDSA Curve P-256 with SHA-256 public key
      static int ECDSAP384SHA384
      ECDSA Curve P-384 with SHA-384 public key
      static int INDIRECT
      Indirect keys; the actual key is elsewhere.
      static int PRIVATEDNS
      Private algorithm, specified by domain name
      static int PRIVATEOID
      Private algorithm, specified by OID
      static int RSA_NSEC3_SHA1
      RSA/SHA1, NSEC3-aware public key
      static int RSAMD5
      RSA/MD5 public key (deprecated)
      static int RSASHA1
      RSA/SHA1 public key
      static int RSASHA256
      RSA/SHA256 public key
      static int RSASHA512
      RSA/SHA512 public key
    • Method Detail

      • string

        public static String string(int alg)
        Converts an algorithm into its textual representation
      • value

        public static int value(String s)
        Converts a textual representation of an algorithm into its numeric code. Integers in the range 0..255 are also accepted.
        Parameters:
        s - The textual representation of the algorithm
        Returns:
        The algorithm code, or -1 on error.
dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.DNSSECException.html100644 0 0 30375 12131352545 20121 0ustar 0 0 DNSSEC.DNSSECException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.DNSSECException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.IncompatibleKeyException.html100644 0 0 27754 12131352545 22230 0ustar 0 0 DNSSEC.IncompatibleKeyException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.IncompatibleKeyException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.KeyMismatchException.html100644 0 0 27242 12131352545 21357 0ustar 0 0 DNSSEC.KeyMismatchException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.KeyMismatchException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.MalformedKeyException.html100644 0 0 27207 12131352545 21521 0ustar 0 0 DNSSEC.MalformedKeyException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.MalformedKeyException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.SignatureExpiredException.html100644 0 0 33511 12131352545 22417 0ustar 0 0 DNSSEC.SignatureExpiredException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.SignatureExpiredException

    • Method Detail

      • getExpiration

        public Date getExpiration()
        Returns:
        When the signature expired
      • getVerifyTime

        public Date getVerifyTime()
        Returns:
        When the verification was attempted
dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.SignatureNotYetValidException.html100644 0 0 33636 12131352545 23231 0ustar 0 0 DNSSEC.SignatureNotYetValidException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.SignatureNotYetValidException

    • Method Detail

      • getExpiration

        public Date getExpiration()
        Returns:
        When the signature will become valid
      • getVerifyTime

        public Date getVerifyTime()
        Returns:
        When the verification was attempted
dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.SignatureVerificationException.html100644 0 0 27446 12131352545 23453 0ustar 0 0 DNSSEC.SignatureVerificationException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.SignatureVerificationException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.UnsupportedAlgorithmException.html100644 0 0 27311 12131352545 23335 0ustar 0 0 DNSSEC.UnsupportedAlgorithmException (dnsjava documentation)
org.xbill.DNS

Class DNSSEC.UnsupportedAlgorithmException

dnsjava-2.1.5/doc/org/xbill/DNS/DNSSEC.html100644 0 0 67271 12131352545 15271 0ustar 0 0 DNSSEC (dnsjava documentation)
org.xbill.DNS

Class DNSSEC



  • public class DNSSEC
    extends Object
    Constants and methods relating to DNSSEC. DNSSEC provides authentication for DNS information.
    Author:
    Brian Wellington
    See Also:
    RRSIGRecord, DNSKEYRecord, RRset
dnsjava-2.1.5/doc/org/xbill/DNS/DSRecord.Digest.html100644 0 0 24750 12131352546 17171 0ustar 0 0 DSRecord.Digest (dnsjava documentation)
org.xbill.DNS

Class DSRecord.Digest

  • Enclosing class:
    DSRecord


    public static class DSRecord.Digest
    extends Object
dnsjava-2.1.5/doc/org/xbill/DNS/DSRecord.html100644 0 0 51135 12131352546 15750 0ustar 0 0 DSRecord (dnsjava documentation)
org.xbill.DNS

Class DSRecord

    • Constructor Detail

      • DSRecord

        public DSRecord(Name name,
                int dclass,
                long ttl,
                int footprint,
                int alg,
                int digestid,
                byte[] digest)
        Creates a DS Record from the given data
        Parameters:
        footprint - The original KEY record's footprint (keyid).
        alg - The original key algorithm.
        digestid - The digest id code.
        digest - A hash of the original key.
      • DSRecord

        public DSRecord(Name name,
                int dclass,
                long ttl,
                int digestid,
                DNSKEYRecord key)
        Creates a DS Record from the given data
        Parameters:
        digestid - The digest id code.
        key - The key to digest
    • Method Detail

      • getAlgorithm

        public int getAlgorithm()
        Returns the key's algorithm.
      • getDigestID

        public int getDigestID()
        Returns the key's Digest ID.
      • getDigest

        public byte[] getDigest()
        Returns the binary hash of the key.
      • getFootprint

        public int getFootprint()
        Returns the key's footprint.
dnsjava-2.1.5/doc/org/xbill/DNS/EDNSOption.Code.html100644 0 0 31116 12131352546 17073 0ustar 0 0 EDNSOption.Code (dnsjava documentation)
org.xbill.DNS

Class EDNSOption.Code

  • Enclosing class:
    EDNSOption


    public static class EDNSOption.Code
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int CLIENT_SUBNET
      Client Subnet, defined in draft-vandergaast-edns-client-subnet-00
      static int NSID
      Name Server Identifier, RFC 5001
    • Field Detail

      • CLIENT_SUBNET

        public static final int CLIENT_SUBNET
        Client Subnet, defined in draft-vandergaast-edns-client-subnet-00
        See Also:
        Constant Field Values
    • Method Detail

      • string

        public static String string(int code)
        Converts an EDNS Option Code into its textual representation
      • value

        public static int value(String s)
        Converts a textual representation of an EDNS Option Code into its numeric value.
        Parameters:
        s - The textual representation of the option code
        Returns:
        The option code, or -1 on error.
dnsjava-2.1.5/doc/org/xbill/DNS/EDNSOption.html100644 0 0 41473 12131352546 16231 0ustar 0 0 EDNSOption (dnsjava documentation)
org.xbill.DNS

Class EDNSOption

  • Direct Known Subclasses:
    ClientSubnetOption, GenericEDNSOption


    public abstract class EDNSOption
    extends Object
    DNS extension options, as described in RFC 2671. The rdata of an OPT record is defined as a list of options; this represents a single option.
    Author:
    Brian Wellington, Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class and Description
      static class  EDNSOption.Code 
    • Constructor Summary

      Constructors 
      Constructor and Description
      EDNSOption(int code)
      Creates an option with the given option code and data.
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      boolean equals(Object arg)
      Determines if two EDNS Options are identical.
      static EDNSOption fromWire(byte[] b)
      Converts the wire format of an EDNS Option (including code and length) into the type-specific format.
      int getCode()
      Returns the EDNS Option's code.
      int hashCode()
      Generates a hash code based on the EDNS Option's data.
      String toString() 
      byte[] toWire()
      Converts an EDNS Option (including code and length) into wire format.
    • Constructor Detail

      • EDNSOption

        public EDNSOption(int code)
        Creates an option with the given option code and data.
    • Method Detail

      • getCode

        public int getCode()
        Returns the EDNS Option's code.
        Returns:
        the option code
      • fromWire

        public static EDNSOption fromWire(byte[] b)
                                   throws IOException
        Converts the wire format of an EDNS Option (including code and length) into the type-specific format.
        Returns:
        The option, in wire format.
        Throws:
        IOException
      • toWire

        public byte[] toWire()
                      throws IOException
        Converts an EDNS Option (including code and length) into wire format.
        Returns:
        The option, in wire format.
        Throws:
        IOException
      • equals

        public boolean equals(Object arg)
        Determines if two EDNS Options are identical.
        Overrides:
        equals in class Object
        Parameters:
        arg - The option to compare to
        Returns:
        true if the options are equal, false otherwise.
      • hashCode

        public int hashCode()
        Generates a hash code based on the EDNS Option's data.
        Overrides:
        hashCode in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/ExtendedFlags.html100644 0 0 27043 12131352546 17021 0ustar 0 0 ExtendedFlags (dnsjava documentation)
org.xbill.DNS

Class ExtendedFlags



  • public final class ExtendedFlags
    extends Object
    Constants and functions relating to EDNS flags.
    Author:
    Brian Wellington
    • Method Detail

      • string

        public static String string(int i)
        Converts a numeric extended flag into a String
      • value

        public static int value(String s)
        Converts a textual representation of an extended flag into its numeric value
dnsjava-2.1.5/doc/org/xbill/DNS/ExtendedResolver.html100644 0 0 102242 12131352546 17601 0ustar 0 0 ExtendedResolver (dnsjava documentation)
org.xbill.DNS

Class ExtendedResolver

  • All Implemented Interfaces:
    Resolver


    public class ExtendedResolver
    extends Object
    implements Resolver
    An implementation of Resolver that can send queries to multiple servers, sending the queries multiple times if necessary.
    Author:
    Brian Wellington
    See Also:
    Resolver
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void addResolver(Resolver r)
      Adds a new resolver to be used by this ExtendedResolver
      void deleteResolver(Resolver r)
      Deletes a resolver used by this ExtendedResolver
      Resolver getResolver(int n)
      Returns the nth resolver used by this ExtendedResolver
      Resolver[] getResolvers()
      Returns all resolvers used by this ExtendedResolver
      Message send(Message query)
      Sends a message and waits for a response.
      Object sendAsync(Message query, ResolverListener listener)
      Asynchronously sends a message to multiple servers, potentially multiple times, registering a listener to receive a callback on success or exception.
      void setEDNS(int level)
      Sets the EDNS version used on outgoing messages.
      void setEDNS(int level, int payloadSize, int flags, List options)
      Sets the EDNS information on outgoing messages.
      void setIgnoreTruncation(boolean flag)
      Sets whether truncated responses will be ignored.
      void setLoadBalance(boolean flag)
      Sets whether the servers should be load balanced.
      void setPort(int port)
      Sets the port to communicate with on the server
      void setRetries(int retries)
      Sets the number of retries sent to each server per query
      void setTCP(boolean flag)
      Sets whether TCP connections will be sent by default
      void setTimeout(int secs)
      Sets the amount of time to wait for a response before giving up.
      void setTimeout(int secs, int msecs)
      Sets the amount of time to wait for a response before giving up.
      void setTSIGKey(TSIG key)
      Specifies the TSIG key that messages will be signed with
    • Method Detail

      • setPort

        public void setPort(int port)
        Description copied from interface: Resolver
        Sets the port to communicate with on the server
        Specified by:
        setPort in interface Resolver
        Parameters:
        port - The port to send messages to
      • setTCP

        public void setTCP(boolean flag)
        Description copied from interface: Resolver
        Sets whether TCP connections will be sent by default
        Specified by:
        setTCP in interface Resolver
        Parameters:
        flag - Indicates whether TCP connections are made
      • setIgnoreTruncation

        public void setIgnoreTruncation(boolean flag)
        Description copied from interface: Resolver
        Sets whether truncated responses will be ignored. If not, a truncated response over UDP will cause a retransmission over TCP.
        Specified by:
        setIgnoreTruncation in interface Resolver
        Parameters:
        flag - Indicates whether truncated responses should be ignored.
      • setEDNS

        public void setEDNS(int level)
        Description copied from interface: Resolver
        Sets the EDNS version used on outgoing messages.
        Specified by:
        setEDNS in interface Resolver
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
      • setEDNS

        public void setEDNS(int level,
                   int payloadSize,
                   int flags,
                   List options)
        Description copied from interface: Resolver
        Sets the EDNS information on outgoing messages.
        Specified by:
        setEDNS in interface Resolver
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
        payloadSize - The maximum DNS packet size that this host is capable of receiving over UDP. If 0 is specified, the default (1280) is used.
        flags - EDNS extended flags to be set in the OPT record.
        options - EDNS options to be set in the OPT record, specified as a List of OPTRecord.Option elements.
        See Also:
        OPTRecord
      • setTSIGKey

        public void setTSIGKey(TSIG key)
        Description copied from interface: Resolver
        Specifies the TSIG key that messages will be signed with
        Specified by:
        setTSIGKey in interface Resolver
        Parameters:
        key - The key
      • setTimeout

        public void setTimeout(int secs,
                      int msecs)
        Description copied from interface: Resolver
        Sets the amount of time to wait for a response before giving up.
        Specified by:
        setTimeout in interface Resolver
        Parameters:
        secs - The number of seconds to wait.
        msecs - The number of milliseconds to wait.
      • setTimeout

        public void setTimeout(int secs)
        Description copied from interface: Resolver
        Sets the amount of time to wait for a response before giving up.
        Specified by:
        setTimeout in interface Resolver
        Parameters:
        secs - The number of seconds to wait.
      • send

        public Message send(Message query)
                     throws IOException
        Sends a message and waits for a response. Multiple servers are queried, and queries are sent multiple times until either a successful response is received, or it is clear that there is no successful response.
        Specified by:
        send in interface Resolver
        Parameters:
        query - The query to send.
        Returns:
        The response.
        Throws:
        IOException - An error occurred while sending or receiving.
      • sendAsync

        public Object sendAsync(Message query,
                       ResolverListener listener)
        Asynchronously sends a message to multiple servers, potentially multiple times, registering a listener to receive a callback on success or exception. Multiple asynchronous lookups can be performed in parallel. Since the callback may be invoked before the function returns, external synchronization is necessary.
        Specified by:
        sendAsync in interface Resolver
        Parameters:
        query - The query to send
        listener - The object containing the callbacks.
        Returns:
        An identifier, which is also a parameter in the callback
      • getResolver

        public Resolver getResolver(int n)
        Returns the nth resolver used by this ExtendedResolver
      • getResolvers

        public Resolver[] getResolvers()
        Returns all resolvers used by this ExtendedResolver
      • addResolver

        public void addResolver(Resolver r)
        Adds a new resolver to be used by this ExtendedResolver
      • deleteResolver

        public void deleteResolver(Resolver r)
        Deletes a resolver used by this ExtendedResolver
      • setLoadBalance

        public void setLoadBalance(boolean flag)
        Sets whether the servers should be load balanced.
        Parameters:
        flag - If true, servers will be tried in round-robin order. If false, servers will always be queried in the same order.
      • setRetries

        public void setRetries(int retries)
        Sets the number of retries sent to each server per query
dnsjava-2.1.5/doc/org/xbill/DNS/Flags.html100644 0 0 37665 12131352546 15353 0ustar 0 0 Flags (dnsjava documentation)
org.xbill.DNS

Class Flags



  • public final class Flags
    extends Object
    Constants and functions relating to flags in the DNS header.
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static byte AA
      authoritative answer
      static byte AD
      authenticated data
      static byte CD
      (security) checking disabled
      static int DO
      dnssec ok (extended)
      static byte QR
      query/response
      static byte RA
      recursion available
      static byte RD
      recursion desired
      static byte TC
      truncated
    • Method Detail

      • string

        public static String string(int i)
        Converts a numeric Flag into a String
      • value

        public static int value(String s)
        Converts a String representation of an Flag into its numeric value
      • isFlag

        public static boolean isFlag(int index)
        Indicates if a bit in the flags field is a flag or not. If it's part of the rcode or opcode, it's not.
dnsjava-2.1.5/doc/org/xbill/DNS/GPOSRecord.html100644 0 0 52301 12131352546 16206 0ustar 0 0 GPOSRecord (dnsjava documentation)
org.xbill.DNS

Class GPOSRecord

    • Constructor Detail

      • GPOSRecord

        public GPOSRecord(Name name,
                  int dclass,
                  long ttl,
                  double longitude,
                  double latitude,
                  double altitude)
        Creates an GPOS Record from the given data
        Parameters:
        longitude - The longitude component of the location.
        latitude - The latitude component of the location.
        altitude - The altitude component of the location (in meters above sea level).
      • GPOSRecord

        public GPOSRecord(Name name,
                  int dclass,
                  long ttl,
                  String longitude,
                  String latitude,
                  String altitude)
        Creates an GPOS Record from the given data
        Parameters:
        longitude - The longitude component of the location.
        latitude - The latitude component of the location.
        altitude - The altitude component of the location (in meters above sea level).
    • Method Detail

      • getLongitudeString

        public String getLongitudeString()
        Returns the longitude as a string
      • getLongitude

        public double getLongitude()
        Returns the longitude as a double
        Throws:
        NumberFormatException - The string does not contain a valid numeric value.
      • getLatitudeString

        public String getLatitudeString()
        Returns the latitude as a string
      • getLatitude

        public double getLatitude()
        Returns the latitude as a double
        Throws:
        NumberFormatException - The string does not contain a valid numeric value.
      • getAltitudeString

        public String getAltitudeString()
        Returns the altitude as a string
      • getAltitude

        public double getAltitude()
        Returns the altitude as a double
        Throws:
        NumberFormatException - The string does not contain a valid numeric value.
dnsjava-2.1.5/doc/org/xbill/DNS/Generator.html100644 0 0 54465 12131352546 16242 0ustar 0 0 Generator (dnsjava documentation)
org.xbill.DNS

Class Generator



  • public class Generator
    extends Object
    A representation of a $GENERATE statement in a master file.
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      int dclass
      The class of the generated records.
      long end
      The end of the range.
      String namePattern
      The pattern to use for generating record names.
      Name origin
      The origin to append to relative names.
      String rdataPattern
      The pattern to use for generating record data.
      long start
      The start of the range.
      long step
      The step value of the range.
      long ttl
      The ttl of the generated records.
      int type
      The type of the generated records.
    • Constructor Summary

      Constructors 
      Constructor and Description
      Generator(long start, long end, long step, String namePattern, int type, int dclass, long ttl, String rdataPattern, Name origin)
      Creates a specification for generating records, as a $GENERATE statement in a master file.
    • Field Detail

      • start

        public long start
        The start of the range.
      • end

        public long end
        The end of the range.
      • step

        public long step
        The step value of the range.
      • namePattern

        public final String namePattern
        The pattern to use for generating record names.
      • type

        public final int type
        The type of the generated records.
      • dclass

        public final int dclass
        The class of the generated records.
      • ttl

        public final long ttl
        The ttl of the generated records.
      • rdataPattern

        public final String rdataPattern
        The pattern to use for generating record data.
      • origin

        public final Name origin
        The origin to append to relative names.
    • Constructor Detail

      • Generator

        public Generator(long start,
                 long end,
                 long step,
                 String namePattern,
                 int type,
                 int dclass,
                 long ttl,
                 String rdataPattern,
                 Name origin)
        Creates a specification for generating records, as a $GENERATE statement in a master file.
        Parameters:
        start - The start of the range.
        end - The end of the range.
        step - The step value of the range.
        namePattern - The pattern to use for generating record names.
        type - The type of the generated records. The supported types are PTR, CNAME, DNAME, A, AAAA, and NS.
        dclass - The class of the generated records.
        ttl - The ttl of the generated records.
        rdataPattern - The pattern to use for generating record data.
        origin - The origin to append to relative names.
        Throws:
        IllegalArgumentException - The range is invalid.
        IllegalArgumentException - The type does not support generation.
        IllegalArgumentException - The dclass is not a valid class.
    • Method Detail

      • supportedType

        public static boolean supportedType(int type)
        Indicates whether generation is supported for this type.
        Throws:
        InvalidTypeException - The type is out of range.
      • nextRecord

        public Record nextRecord()
                          throws IOException
        Constructs and returns the next record in the expansion.
        Throws:
        IOException - The name or rdata was invalid after substitutions were performed.
      • expand

        public Record[] expand()
                        throws IOException
        Constructs and returns all records in the expansion.
        Throws:
        IOException - The name or rdata of a record was invalid after substitutions were performed.
      • toString

        public String toString()
        Converts the generate specification to a string containing the corresponding $GENERATE statement.
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/GenericEDNSOption.html100644 0 0 25467 12131352546 17533 0ustar 0 0 GenericEDNSOption (dnsjava documentation)
org.xbill.DNS

Class GenericEDNSOption

  • Direct Known Subclasses:
    NSIDOption


    public class GenericEDNSOption
    extends EDNSOption
    An EDNSOption with no internal structure.
    Author:
    Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks, Brian Wellington
    • Constructor Detail

      • GenericEDNSOption

        public GenericEDNSOption(int code,
                         byte[] data)
        Construct a generic EDNS option.
        Parameters:
        data - The contents of the option.
dnsjava-2.1.5/doc/org/xbill/DNS/HINFORecord.html100644 0 0 40546 12131352546 16311 0ustar 0 0 HINFORecord (dnsjava documentation)
org.xbill.DNS

Class HINFORecord

    • Constructor Detail

      • HINFORecord

        public HINFORecord(Name name,
                   int dclass,
                   long ttl,
                   String cpu,
                   String os)
        Creates an HINFO Record from the given data
        Parameters:
        cpu - A string describing the host's CPU
        os - A string describing the host's OS
        Throws:
        IllegalArgumentException - One of the strings has invalid escapes
    • Method Detail

      • getCPU

        public String getCPU()
        Returns the host's CPU
      • getOS

        public String getOS()
        Returns the host's OS
dnsjava-2.1.5/doc/org/xbill/DNS/Header.html100644 0 0 54033 12131352546 15473 0ustar 0 0 Header (dnsjava documentation)
org.xbill.DNS

Class Header

  • All Implemented Interfaces:
    Cloneable


    public class Header
    extends Object
    implements Cloneable
    A DNS message header
    Author:
    Brian Wellington
    See Also:
    Message
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int LENGTH
      The length of a DNS Header in wire format.
    • Constructor Summary

      Constructors 
      Constructor and Description
      Header()
      Create a new empty header with a random message id
      Header(byte[] b)
      Creates a new Header from its DNS wire format representation
      Header(int id)
      Create a new empty header.
    • Field Detail

      • LENGTH

        public static final int LENGTH
        The length of a DNS Header in wire format.
        See Also:
        Constant Field Values
    • Constructor Detail

      • Header

        public Header(int id)
        Create a new empty header.
        Parameters:
        id - The message id
      • Header

        public Header()
        Create a new empty header with a random message id
      • Header

        public Header(byte[] b)
               throws IOException
        Creates a new Header from its DNS wire format representation
        Parameters:
        b - A byte array containing the DNS Header.
        Throws:
        IOException
    • Method Detail

      • toWire

        public byte[] toWire()
      • setFlag

        public void setFlag(int bit)
        Sets a flag to the supplied value
        See Also:
        Flags
      • unsetFlag

        public void unsetFlag(int bit)
        Sets a flag to the supplied value
        See Also:
        Flags
      • getFlag

        public boolean getFlag(int bit)
        Retrieves a flag
        See Also:
        Flags
      • getID

        public int getID()
        Retrieves the message ID
      • setID

        public void setID(int id)
        Sets the message ID
      • setRcode

        public void setRcode(int value)
        Sets the message's rcode
        See Also:
        Rcode
      • getRcode

        public int getRcode()
        Retrieves the mesasge's rcode
        See Also:
        Rcode
      • setOpcode

        public void setOpcode(int value)
        Sets the message's opcode
        See Also:
        Opcode
      • getOpcode

        public int getOpcode()
        Retrieves the mesasge's opcode
        See Also:
        Opcode
      • getCount

        public int getCount(int field)
        Retrieves the record count for the given section
        See Also:
        Section
      • printFlags

        public String printFlags()
        Converts the header's flags into a String
      • toString

        public String toString()
        Converts the header into a String
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/IPSECKEYRecord.Algorithm.html100644 0 0 23666 12131352546 20613 0ustar 0 0 IPSECKEYRecord.Algorithm (dnsjava documentation)
org.xbill.DNS

Class IPSECKEYRecord.Algorithm

dnsjava-2.1.5/doc/org/xbill/DNS/IPSECKEYRecord.Gateway.html100644 0 0 25720 12131352546 20257 0ustar 0 0 IPSECKEYRecord.Gateway (dnsjava documentation)
org.xbill.DNS

Class IPSECKEYRecord.Gateway

dnsjava-2.1.5/doc/org/xbill/DNS/IPSECKEYRecord.html100644 0 0 45323 12131352546 16660 0ustar 0 0 IPSECKEYRecord (dnsjava documentation)
org.xbill.DNS

Class IPSECKEYRecord

    • Constructor Detail

      • IPSECKEYRecord

        public IPSECKEYRecord(Name name,
                      int dclass,
                      long ttl,
                      int precedence,
                      int gatewayType,
                      int algorithmType,
                      Object gateway,
                      byte[] key)
        Creates an IPSECKEY Record from the given data.
        Parameters:
        precedence - The record's precedence.
        gatewayType - The record's gateway type.
        algorithmType - The record's algorithm type.
        gateway - The record's gateway.
        key - The record's public key.
    • Method Detail

      • getPrecedence

        public int getPrecedence()
        Returns the record's precedence.
      • getGatewayType

        public int getGatewayType()
        Returns the record's gateway type.
      • getAlgorithmType

        public int getAlgorithmType()
        Returns the record's algorithm type.
      • getGateway

        public Object getGateway()
        Returns the record's gateway.
      • getKey

        public byte[] getKey()
        Returns the record's public key
dnsjava-2.1.5/doc/org/xbill/DNS/ISDNRecord.html100644 0 0 41065 12131352546 16200 0ustar 0 0 ISDNRecord (dnsjava documentation)
org.xbill.DNS

Class ISDNRecord

    • Constructor Detail

      • ISDNRecord

        public ISDNRecord(Name name,
                  int dclass,
                  long ttl,
                  String address,
                  String subAddress)
        Creates an ISDN Record from the given data
        Parameters:
        address - The ISDN number associated with the domain.
        subAddress - The subaddress, if any.
        Throws:
        IllegalArgumentException - One of the strings is invalid.
    • Method Detail

      • getAddress

        public String getAddress()
        Returns the ISDN number associated with the domain.
      • getSubAddress

        public String getSubAddress()
        Returns the ISDN subaddress, or null if there is none.
dnsjava-2.1.5/doc/org/xbill/DNS/InvalidDClassException.html100644 0 0 32153 12131352546 20641 0ustar 0 0 InvalidDClassException (dnsjava documentation)
org.xbill.DNS

Class InvalidDClassException

    • Constructor Detail

      • InvalidDClassException

        public InvalidDClassException(int dclass)
dnsjava-2.1.5/doc/org/xbill/DNS/InvalidTTLException.html100644 0 0 32106 12131352546 20131 0ustar 0 0 InvalidTTLException (dnsjava documentation)
org.xbill.DNS

Class InvalidTTLException

    • Constructor Detail

      • InvalidTTLException

        public InvalidTTLException(long ttl)
dnsjava-2.1.5/doc/org/xbill/DNS/InvalidTypeException.html100644 0 0 32111 12131352546 20403 0ustar 0 0 InvalidTypeException (dnsjava documentation)
org.xbill.DNS

Class InvalidTypeException

    • Constructor Detail

      • InvalidTypeException

        public InvalidTypeException(int type)
dnsjava-2.1.5/doc/org/xbill/DNS/KEYRecord.Flags.html100644 0 0 74222 12131352546 17127 0ustar 0 0 KEYRecord.Flags (dnsjava documentation)
org.xbill.DNS

Class KEYRecord.Flags

  • Enclosing class:
    KEYRecord


    public static class KEYRecord.Flags
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int EXTEND
      Flags extension
      static int FLAG10
      Flag 10 (unused)
      static int FLAG11
      Flag 11 (unused)
      static int FLAG2
      Flag 2 (unused)
      static int FLAG4
      Flag 4 (unused)
      static int FLAG5
      Flag 5 (unused)
      static int FLAG8
      Flag 8 (unused)
      static int FLAG9
      Flag 9 (unused)
      static int HOST
      Key is owned by a host.
      static int NOAUTH
      KEY cannot be used for authentication
      static int NOCONF
      KEY cannot be used for confidentiality
      static int NOKEY
      No key present
      static int NTYP3
      Key owner type 3 (reserved).
      static int OWNER_MASK
      Key owner bitmask.
      static int SIG0
      Signatory value 0
      static int SIG1
      Signatory value 1
      static int SIG10
      Signatory value 10
      static int SIG11
      Signatory value 11
      static int SIG12
      Signatory value 12
      static int SIG13
      Signatory value 13
      static int SIG14
      Signatory value 14
      static int SIG15
      Signatory value 15
      static int SIG2
      Signatory value 2
      static int SIG3
      Signatory value 3
      static int SIG4
      Signatory value 4
      static int SIG5
      Signatory value 5
      static int SIG6
      Signatory value 6
      static int SIG7
      Signatory value 7
      static int SIG8
      Signatory value 8
      static int SIG9
      Signatory value 9
      static int USE_MASK
      Bitmask of the use fields
      static int USER
      Key is owned by a user.
      static int ZONE
      Key is owned by a zone.
dnsjava-2.1.5/doc/org/xbill/DNS/KEYRecord.Protocol.html100644 0 0 35524 12131352546 17676 0ustar 0 0 KEYRecord.Protocol (dnsjava documentation)
org.xbill.DNS

Class KEYRecord.Protocol

  • Enclosing class:
    KEYRecord


    public static class KEYRecord.Protocol
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int ANY
      Any protocol
      static int DNSSEC
      DNSSEC
      static int EMAIL
      Email
      static int IPSEC
      IPSEC Control
      static int NONE
      No defined protocol.
      static int TLS
      Transaction Level Security
    • Method Detail

      • string

        public static String string(int type)
        Converts an KEY protocol value into its textual representation
      • value

        public static int value(String s)
        Converts a textual representation of a KEY protocol into its numeric code. Integers in the range 0..255 are also accepted.
        Parameters:
        s - The textual representation of the protocol
        Returns:
        The protocol code, or -1 on error.
dnsjava-2.1.5/doc/org/xbill/DNS/KEYRecord.html100644 0 0 76456 12131352546 16107 0ustar 0 0 KEYRecord (dnsjava documentation)
org.xbill.DNS

Class KEYRecord

    • Field Detail

      • FLAG_NOCONF

        public static final int FLAG_NOCONF
        This key cannot be used for confidentiality (encryption)
        See Also:
        Constant Field Values
      • FLAG_NOAUTH

        public static final int FLAG_NOAUTH
        This key cannot be used for authentication
        See Also:
        Constant Field Values
      • FLAG_NOKEY

        public static final int FLAG_NOKEY
        This key cannot be used for authentication or confidentiality
        See Also:
        Constant Field Values
      • PROTOCOL_TLS

        public static final int PROTOCOL_TLS
        Key was created for use with transaction level security
        See Also:
        Constant Field Values
      • PROTOCOL_EMAIL

        public static final int PROTOCOL_EMAIL
        Key was created for use with email
        See Also:
        Constant Field Values
      • PROTOCOL_DNSSEC

        public static final int PROTOCOL_DNSSEC
        Key was created for use with DNSSEC
        See Also:
        Constant Field Values
      • PROTOCOL_IPSEC

        public static final int PROTOCOL_IPSEC
        Key was created for use with IPSEC
        See Also:
        Constant Field Values
      • PROTOCOL_ANY

        public static final int PROTOCOL_ANY
        Key was created for use with any protocol
        See Also:
        Constant Field Values
      • flags

        protected int flags
      • proto

        protected int proto
      • alg

        protected int alg
      • key

        protected byte[] key
      • footprint

        protected int footprint
    • Constructor Detail

      • KEYRecord

        public KEYRecord(Name name,
                 int dclass,
                 long ttl,
                 int flags,
                 int proto,
                 int alg,
                 byte[] key)
        Creates a KEY Record from the given data
        Parameters:
        flags - Flags describing the key's properties
        proto - The protocol that the key was created for
        alg - The key's algorithm
        key - Binary data representing the key
      • KEYRecord

        public KEYRecord(Name name,
                 int dclass,
                 long ttl,
                 int flags,
                 int proto,
                 int alg,
                 PublicKey key)
                  throws DNSSEC.DNSSECException
        Creates a KEY Record from the given data
        Parameters:
        flags - Flags describing the key's properties
        proto - The protocol that the key was created for
        alg - The key's algorithm
        key - The key as a PublicKey
        Throws:
        DNSSEC.DNSSECException - The PublicKey could not be converted into DNS format.
    • Method Detail

      • getFlags

        public int getFlags()
        Returns the flags describing the key's properties
      • getProtocol

        public int getProtocol()
        Returns the protocol that the key was created for
      • getAlgorithm

        public int getAlgorithm()
        Returns the key's algorithm
      • getKey

        public byte[] getKey()
        Returns the binary data representing the key
      • getFootprint

        public int getFootprint()
        Returns the key's footprint (after computing it)
dnsjava-2.1.5/doc/org/xbill/DNS/KXRecord.html100644 0 0 45700 12131352546 15765 0ustar 0 0 KXRecord (dnsjava documentation)
org.xbill.DNS

Class KXRecord

    • Field Detail

      • u16Field

        protected int u16Field
      • nameField

        protected Name nameField
    • Constructor Detail

      • KXRecord

        public KXRecord(Name name,
                int dclass,
                long ttl,
                int preference,
                Name target)
        Creates a KX Record from the given data
        Parameters:
        preference - The preference of this KX. Records with lower priority are preferred.
        target - The host that authority is delegated to
    • Method Detail

      • getTarget

        public Name getTarget()
        Returns the target of the KX record
      • getPreference

        public int getPreference()
        Returns the preference of this KX record
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getU16Field

        protected int getU16Field()
      • getNameField

        protected Name getNameField()
dnsjava-2.1.5/doc/org/xbill/DNS/LOCRecord.html100644 0 0 43007 12131352546 16056 0ustar 0 0 LOCRecord (dnsjava documentation)
org.xbill.DNS

Class LOCRecord

    • Constructor Detail

      • LOCRecord

        public LOCRecord(Name name,
                 int dclass,
                 long ttl,
                 double latitude,
                 double longitude,
                 double altitude,
                 double size,
                 double hPrecision,
                 double vPrecision)
        Creates an LOC Record from the given data
        Parameters:
        latitude - The latitude of the center of the sphere
        longitude - The longitude of the center of the sphere
        altitude - The altitude of the center of the sphere, in m
        size - The diameter of a sphere enclosing the described entity, in m.
        hPrecision - The horizontal precision of the data, in m.
        vPrecision - The vertical precision of the data, in m.
    • Method Detail

      • getLatitude

        public double getLatitude()
        Returns the latitude
      • getLongitude

        public double getLongitude()
        Returns the longitude
      • getAltitude

        public double getAltitude()
        Returns the altitude
      • getSize

        public double getSize()
        Returns the diameter of the enclosing sphere
      • getHPrecision

        public double getHPrecision()
        Returns the horizontal precision
      • getVPrecision

        public double getVPrecision()
        Returns the horizontal precision
dnsjava-2.1.5/doc/org/xbill/DNS/Lookup.html100644 0 0 125207 12131352546 15576 0ustar 0 0 Lookup (dnsjava documentation)
org.xbill.DNS

Class Lookup



  • public final class Lookup
    extends Object
    The Lookup object issues queries to caching DNS servers. The input consists of a name, an optional type, and an optional class. Caching is enabled by default and used when possible to reduce the number of DNS requests. A Resolver, which defaults to an ExtendedResolver initialized with the resolvers located by the ResolverConfig class, performs the queries. A search path of domain suffixes is used to resolve relative names, and is also determined by the ResolverConfig class. A Lookup object may be reused, but should not be used by multiple threads.
    Author:
    Brian Wellington
    See Also:
    Cache, Resolver, ResolverConfig
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int HOST_NOT_FOUND
      The host does not exist.
      static int SUCCESSFUL
      The lookup was successful.
      static int TRY_AGAIN
      The lookup failed due to a network error.
      static int TYPE_NOT_FOUND
      The host exists, but has no records associated with the queried type.
      static int UNRECOVERABLE
      The lookup failed due to a data or server error.
    • Constructor Summary

      Constructors 
      Constructor and Description
      Lookup(Name name)
      Create a Lookup object that will find records of type A at the given name in the IN class.
      Lookup(Name name, int type)
      Create a Lookup object that will find records of the given name and type in the IN class.
      Lookup(Name name, int type, int dclass)
      Create a Lookup object that will find records of the given name, type, and class.
      Lookup(String name)
      Create a Lookup object that will find records of type A at the given name in the IN class.
      Lookup(String name, int type)
      Create a Lookup object that will find records of the given name and type in the IN class.
      Lookup(String name, int type, int dclass)
      Create a Lookup object that will find records of the given name, type, and class.
    • Field Detail

      • SUCCESSFUL

        public static final int SUCCESSFUL
        The lookup was successful.
        See Also:
        Constant Field Values
      • UNRECOVERABLE

        public static final int UNRECOVERABLE
        The lookup failed due to a data or server error. Repeating the lookup would not be helpful.
        See Also:
        Constant Field Values
      • TRY_AGAIN

        public static final int TRY_AGAIN
        The lookup failed due to a network error. Repeating the lookup may be helpful.
        See Also:
        Constant Field Values
      • HOST_NOT_FOUND

        public static final int HOST_NOT_FOUND
        The host does not exist.
        See Also:
        Constant Field Values
      • TYPE_NOT_FOUND

        public static final int TYPE_NOT_FOUND
        The host exists, but has no records associated with the queried type.
        See Also:
        Constant Field Values
    • Constructor Detail

      • Lookup

        public Lookup(Name name,
              int type,
              int dclass)
        Create a Lookup object that will find records of the given name, type, and class. The lookup will use the default cache, resolver, and search path, and look for records that are reasonably credible.
        Parameters:
        name - The name of the desired records
        type - The type of the desired records
        dclass - The class of the desired records
        Throws:
        IllegalArgumentException - The type is a meta type other than ANY.
        See Also:
        Cache, Resolver, Credibility, Name, Type, DClass
      • Lookup

        public Lookup(Name name,
              int type)
        Create a Lookup object that will find records of the given name and type in the IN class.
        Parameters:
        name - The name of the desired records
        type - The type of the desired records
        Throws:
        IllegalArgumentException - The type is a meta type other than ANY.
        See Also:
        Lookup(Name,int,int)
      • Lookup

        public Lookup(Name name)
        Create a Lookup object that will find records of type A at the given name in the IN class.
        Parameters:
        name - The name of the desired records
        See Also:
        Lookup(Name,int,int)
      • Lookup

        public Lookup(String name,
              int type,
              int dclass)
               throws TextParseException
        Create a Lookup object that will find records of the given name, type, and class.
        Parameters:
        name - The name of the desired records
        type - The type of the desired records
        dclass - The class of the desired records
        Throws:
        TextParseException - The name is not a valid DNS name
        IllegalArgumentException - The type is a meta type other than ANY.
        See Also:
        Lookup(Name,int,int)
    • Method Detail

      • refreshDefault

        public static void refreshDefault()
      • getDefaultResolver

        public static Resolver getDefaultResolver()
        Gets the Resolver that will be used as the default by future Lookups.
        Returns:
        The default resolver.
      • setDefaultResolver

        public static void setDefaultResolver(Resolver resolver)
        Sets the default Resolver to be used as the default by future Lookups.
        Parameters:
        resolver - The default resolver.
      • getDefaultCache

        public static Cache getDefaultCache(int dclass)
        Gets the Cache that will be used as the default for the specified class by future Lookups.
        Parameters:
        dclass - The class whose cache is being retrieved.
        Returns:
        The default cache for the specified class.
      • setDefaultCache

        public static void setDefaultCache(Cache cache,
                           int dclass)
        Sets the Cache to be used as the default for the specified class by future Lookups.
        Parameters:
        cache - The default cache for the specified class.
        dclass - The class whose cache is being set.
      • getDefaultSearchPath

        public static Name[] getDefaultSearchPath()
        Gets the search path that will be used as the default by future Lookups.
        Returns:
        The default search path.
      • setDefaultSearchPath

        public static void setDefaultSearchPath(Name[] domains)
        Sets the search path to be used as the default by future Lookups.
        Parameters:
        domains - The default search path.
      • setDefaultSearchPath

        public static void setDefaultSearchPath(String[] domains)
                                         throws TextParseException
        Sets the search path that will be used as the default by future Lookups.
        Parameters:
        domains - The default search path.
        Throws:
        TextParseException - A name in the array is not a valid DNS name.
      • setResolver

        public void setResolver(Resolver resolver)
        Sets the resolver to use when performing this lookup. This overrides the default value.
        Parameters:
        resolver - The resolver to use.
      • setSearchPath

        public void setSearchPath(Name[] domains)
        Sets the search path to use when performing this lookup. This overrides the default value.
        Parameters:
        domains - An array of names containing the search path.
      • setSearchPath

        public void setSearchPath(String[] domains)
                           throws TextParseException
        Sets the search path to use when performing this lookup. This overrides the default value.
        Parameters:
        domains - An array of names containing the search path.
        Throws:
        TextParseException - A name in the array is not a valid DNS name.
      • setCache

        public void setCache(Cache cache)
        Sets the cache to use when performing this lookup. This overrides the default value. If the results of this lookup should not be permanently cached, null can be provided here.
        Parameters:
        cache - The cache to use.
      • setNdots

        public void setNdots(int ndots)
        Sets ndots to use when performing this lookup, overriding the default value. Specifically, this refers to the number of "dots" which, if present in a name, indicate that a lookup for the absolute name should be attempted before appending any search path elements.
        Parameters:
        ndots - The ndots value to use, which must be greater than or equal to 0.
      • setCredibility

        public void setCredibility(int credibility)
        Sets the minimum credibility level that will be accepted when performing the lookup. This defaults to Credibility.NORMAL.
        Parameters:
        credibility - The minimum credibility level.
      • run

        public Record[] run()
        Performs the lookup, using the specified Cache, Resolver, and search path.
        Returns:
        The answers, or null if none are found.
      • getAnswers

        public Record[] getAnswers()
        Returns the answers from the lookup.
        Returns:
        The answers, or null if none are found.
        Throws:
        IllegalStateException - The lookup has not completed.
      • getAliases

        public Name[] getAliases()
        Returns all known aliases for this name. Whenever a CNAME/DNAME is followed, an alias is added to this array. The last element in this array will be the owner name for records in the answer, if there are any.
        Returns:
        The aliases.
        Throws:
        IllegalStateException - The lookup has not completed.
      • getResult

        public int getResult()
        Returns the result code of the lookup.
        Returns:
        The result code, which can be SUCCESSFUL, UNRECOVERABLE, TRY_AGAIN, HOST_NOT_FOUND, or TYPE_NOT_FOUND.
        Throws:
        IllegalStateException - The lookup has not completed.
      • getErrorString

        public String getErrorString()
        Returns an error string describing the result code of this lookup.
        Returns:
        A string, which may either directly correspond the result code or be more specific.
        Throws:
        IllegalStateException - The lookup has not completed.
dnsjava-2.1.5/doc/org/xbill/DNS/MBRecord.html100644 0 0 43062 12131352546 15740 0ustar 0 0 MBRecord (dnsjava documentation)
org.xbill.DNS

Class MBRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • MBRecord

        public MBRecord(Name name,
                int dclass,
                long ttl,
                Name mailbox)
        Creates a new MB Record with the given data
        Parameters:
        mailbox - The host containing the mailbox for the domain.
    • Method Detail

      • getMailbox

        public Name getMailbox()
        Gets the mailbox for the domain
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/MDRecord.html100644 0 0 43162 12131352546 15743 0ustar 0 0 MDRecord (dnsjava documentation)
org.xbill.DNS

Class MDRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • MDRecord

        public MDRecord(Name name,
                int dclass,
                long ttl,
                Name mailAgent)
        Creates a new MD Record with the given data
        Parameters:
        mailAgent - The mail agent that delivers mail for the domain.
    • Method Detail

      • getMailAgent

        public Name getMailAgent()
        Gets the mail agent for the domain
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/MFRecord.html100644 0 0 43160 12131352546 15743 0ustar 0 0 MFRecord (dnsjava documentation)
org.xbill.DNS

Class MFRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • MFRecord

        public MFRecord(Name name,
                int dclass,
                long ttl,
                Name mailAgent)
        Creates a new MF Record with the given data
        Parameters:
        mailAgent - The mail agent that forwards mail for the domain.
    • Method Detail

      • getMailAgent

        public Name getMailAgent()
        Gets the mail agent for the domain
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/MGRecord.html100644 0 0 40460 12131352546 15744 0ustar 0 0 MGRecord (dnsjava documentation)
org.xbill.DNS

Class MGRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • MGRecord

        public MGRecord(Name name,
                int dclass,
                long ttl,
                Name mailbox)
        Creates a new MG Record with the given data
        Parameters:
        mailbox - The mailbox that is a member of the group specified by the domain.
    • Method Detail

      • getMailbox

        public Name getMailbox()
        Gets the mailbox in the mail group specified by the domain
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/MINFORecord.html100644 0 0 40132 12131352546 16305 0ustar 0 0 MINFORecord (dnsjava documentation)
org.xbill.DNS

Class MINFORecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class MINFORecord
    extends Record
    Mailbox information Record - lists the address responsible for a mailing list/mailbox and the address to receive error messages relating to the mailing list/mailbox.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • MINFORecord

        public MINFORecord(Name name,
                   int dclass,
                   long ttl,
                   Name responsibleAddress,
                   Name errorAddress)
        Creates an MINFO Record from the given data
        Parameters:
        responsibleAddress - The address responsible for the mailing list/mailbox.
        errorAddress - The address to receive error messages relating to the mailing list/mailbox.
    • Method Detail

      • getResponsibleAddress

        public Name getResponsibleAddress()
        Gets the address responsible for the mailing list/mailbox.
      • getErrorAddress

        public Name getErrorAddress()
        Gets the address to receive error messages relating to the mailing list/mailbox.
dnsjava-2.1.5/doc/org/xbill/DNS/MRRecord.html100644 0 0 40424 12131352546 15757 0ustar 0 0 MRRecord (dnsjava documentation)
org.xbill.DNS

Class MRRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • MRRecord

        public MRRecord(Name name,
                int dclass,
                long ttl,
                Name newName)
        Creates a new MR Record with the given data
        Parameters:
        newName - The new name of the mailbox specified by the domain. domain.
    • Method Detail

      • getNewName

        public Name getNewName()
        Gets the new name of the mailbox specified by the domain
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/MXRecord.html100644 0 0 45626 12131352546 15776 0ustar 0 0 MXRecord (dnsjava documentation)
org.xbill.DNS

Class MXRecord

    • Field Detail

      • u16Field

        protected int u16Field
      • nameField

        protected Name nameField
    • Constructor Detail

      • MXRecord

        public MXRecord(Name name,
                int dclass,
                long ttl,
                int priority,
                Name target)
        Creates an MX Record from the given data
        Parameters:
        priority - The priority of this MX. Records with lower priority are preferred.
        target - The host that mail is sent to
    • Method Detail

      • getTarget

        public Name getTarget()
        Returns the target of the MX record
      • getPriority

        public int getPriority()
        Returns the priority of this MX record
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getU16Field

        protected int getU16Field()
      • getNameField

        protected Name getNameField()
dnsjava-2.1.5/doc/org/xbill/DNS/Master.html100644 0 0 55104 12131352546 15536 0ustar 0 0 Master (dnsjava documentation)
org.xbill.DNS

Class Master



  • public class Master
    extends Object
    A DNS master file parser. This incrementally parses the file, returning one record at a time. When directives are seen, they are added to the state and used when parsing future records.
    Author:
    Brian Wellington
    • Constructor Detail

      • Master

        public Master(String filename,
              Name origin,
              long ttl)
               throws IOException
        Initializes the master file reader and opens the specified master file.
        Parameters:
        filename - The master file.
        origin - The initial origin to append to relative names.
        ttl - The initial default TTL.
        Throws:
        IOException - The master file could not be opened.
      • Master

        public Master(String filename,
              Name origin)
               throws IOException
        Initializes the master file reader and opens the specified master file.
        Parameters:
        filename - The master file.
        origin - The initial origin to append to relative names.
        Throws:
        IOException - The master file could not be opened.
      • Master

        public Master(String filename)
               throws IOException
        Initializes the master file reader and opens the specified master file.
        Parameters:
        filename - The master file.
        Throws:
        IOException - The master file could not be opened.
      • Master

        public Master(InputStream in,
              Name origin,
              long ttl)
        Initializes the master file reader.
        Parameters:
        in - The input stream containing a master file.
        origin - The initial origin to append to relative names.
        ttl - The initial default TTL.
      • Master

        public Master(InputStream in,
              Name origin)
        Initializes the master file reader.
        Parameters:
        in - The input stream containing a master file.
        origin - The initial origin to append to relative names.
      • Master

        public Master(InputStream in)
        Initializes the master file reader.
        Parameters:
        in - The input stream containing a master file.
    • Method Detail

      • _nextRecord

        public Record _nextRecord()
                           throws IOException
        Returns the next record in the master file. This will process any directives before the next record.
        Returns:
        The next record.
        Throws:
        IOException - The master file could not be read, or was syntactically invalid.
      • nextRecord

        public Record nextRecord()
                          throws IOException
        Returns the next record in the master file. This will process any directives before the next record.
        Returns:
        The next record.
        Throws:
        IOException - The master file could not be read, or was syntactically invalid.
      • expandGenerate

        public void expandGenerate(boolean wantExpand)
        Specifies whether $GENERATE statements should be expanded. Whether expanded or not, the specifications for generated records are available by calling generators. This must be called before a $GENERATE statement is seen during iteration to have an effect.
      • generators

        public Iterator generators()
        Returns an iterator over the generators specified in the master file; that is, the parsed contents of $GENERATE statements.
        See Also:
        Generator
      • finalize

        protected void finalize()
        Overrides:
        finalize in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/Message.html100644 0 0 116125 12131352546 15710 0ustar 0 0 Message (dnsjava documentation)
org.xbill.DNS

Class Message

  • All Implemented Interfaces:
    Cloneable
    Direct Known Subclasses:
    Update


    public class Message
    extends Object
    implements Cloneable
    A DNS Message. A message is the basic unit of communication between the client and server of a DNS operation. A message consists of a Header and 4 message sections.
    Author:
    Brian Wellington
    See Also:
    Resolver, Header, Section
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int MAXLENGTH
      The maximum length of a message in wire format.
    • Constructor Summary

      Constructors 
      Constructor and Description
      Message()
      Creates a new Message with a random Message ID
      Message(byte[] b)
      Creates a new Message from its DNS wire format representation
      Message(int id)
      Creates a new Message with the specified Message ID
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void addRecord(Record r, int section)
      Adds a record to a section of the Message, and adjusts the header.
      Object clone()
      Creates a copy of this Message.
      boolean findRecord(Record r)
      Determines if the given record is already present in any section.
      boolean findRecord(Record r, int section)
      Determines if the given record is already present in the given section.
      boolean findRRset(Name name, int type)
      Determines if an RRset with the given name and type is already present in any section.
      boolean findRRset(Name name, int type, int section)
      Determines if an RRset with the given name and type is already present in the given section.
      Header getHeader()
      Retrieves the Header.
      OPTRecord getOPT()
      Returns the OPT record from the ADDITIONAL section, if one is present.
      Record getQuestion()
      Returns the first record in the QUESTION section.
      int getRcode()
      Returns the message's rcode (error code).
      Record[] getSectionArray(int section)
      Returns an array containing all records in the given section, or an empty array if the section is empty.
      RRset[] getSectionRRsets(int section)
      Returns an array containing all records in the given section grouped into RRsets.
      TSIGRecord getTSIG()
      Returns the TSIG record from the ADDITIONAL section, if one is present.
      boolean isSigned()
      Was this message signed by a TSIG?
      boolean isVerified()
      If this message was signed by a TSIG, was the TSIG verified?
      static Message newQuery(Record r)
      Creates a new Message with a random Message ID suitable for sending as a query.
      static Message newUpdate(Name zone)
      Creates a new Message to contain a dynamic update.
      int numBytes()
      Returns the size of the message.
      void removeAllRecords(int section)
      Removes all records from a section of the Message, and adjusts the header.
      boolean removeRecord(Record r, int section)
      Removes a record from a section of the Message, and adjusts the header.
      String sectionToString(int i)
      Converts the given section of the Message to a String.
      void setHeader(Header h)
      Replaces the Header with a new one.
      void setTSIG(TSIG key, int error, TSIGRecord querytsig)
      Sets the TSIG key and other necessary information to sign a message.
      String toString()
      Converts the Message to a String.
      byte[] toWire()
      Returns an array containing the wire format representation of the Message.
      byte[] toWire(int maxLength)
      Returns an array containing the wire format representation of the Message with the specified maximum length.
    • Field Detail

      • MAXLENGTH

        public static final int MAXLENGTH
        The maximum length of a message in wire format.
        See Also:
        Constant Field Values
    • Constructor Detail

      • Message

        public Message(int id)
        Creates a new Message with the specified Message ID
      • Message

        public Message()
        Creates a new Message with a random Message ID
      • Message

        public Message(byte[] b)
                throws IOException
        Creates a new Message from its DNS wire format representation
        Parameters:
        b - A byte array containing the DNS Message.
        Throws:
        IOException
    • Method Detail

      • newQuery

        public static Message newQuery(Record r)
        Creates a new Message with a random Message ID suitable for sending as a query.
        Parameters:
        r - A record containing the question
      • newUpdate

        public static Message newUpdate(Name zone)
        Creates a new Message to contain a dynamic update. A random Message ID and the zone are filled in.
        Parameters:
        zone - The zone to be updated
      • setHeader

        public void setHeader(Header h)
        Replaces the Header with a new one.
        See Also:
        Header
      • getHeader

        public Header getHeader()
        Retrieves the Header.
        See Also:
        Header
      • addRecord

        public void addRecord(Record r,
                     int section)
        Adds a record to a section of the Message, and adjusts the header.
        See Also:
        Record, Section
      • removeRecord

        public boolean removeRecord(Record r,
                           int section)
        Removes a record from a section of the Message, and adjusts the header.
        See Also:
        Record, Section
      • removeAllRecords

        public void removeAllRecords(int section)
        Removes all records from a section of the Message, and adjusts the header.
        See Also:
        Record, Section
      • findRecord

        public boolean findRecord(Record r,
                         int section)
        Determines if the given record is already present in the given section.
        See Also:
        Record, Section
      • findRecord

        public boolean findRecord(Record r)
        Determines if the given record is already present in any section.
        See Also:
        Record, Section
      • findRRset

        public boolean findRRset(Name name,
                        int type,
                        int section)
        Determines if an RRset with the given name and type is already present in the given section.
        See Also:
        RRset, Section
      • findRRset

        public boolean findRRset(Name name,
                        int type)
        Determines if an RRset with the given name and type is already present in any section.
        See Also:
        RRset, Section
      • getQuestion

        public Record getQuestion()
        Returns the first record in the QUESTION section.
        See Also:
        Record, Section
      • isSigned

        public boolean isSigned()
        Was this message signed by a TSIG?
        See Also:
        TSIG
      • isVerified

        public boolean isVerified()
        If this message was signed by a TSIG, was the TSIG verified?
        See Also:
        TSIG
      • getOPT

        public OPTRecord getOPT()
        Returns the OPT record from the ADDITIONAL section, if one is present.
        See Also:
        OPTRecord, Section
      • getRcode

        public int getRcode()
        Returns the message's rcode (error code). This incorporates the EDNS extended rcode.
      • getSectionArray

        public Record[] getSectionArray(int section)
        Returns an array containing all records in the given section, or an empty array if the section is empty.
        See Also:
        Record, Section
      • getSectionRRsets

        public RRset[] getSectionRRsets(int section)
        Returns an array containing all records in the given section grouped into RRsets.
        See Also:
        RRset, Section
      • toWire

        public byte[] toWire()
        Returns an array containing the wire format representation of the Message.
      • toWire

        public byte[] toWire(int maxLength)
        Returns an array containing the wire format representation of the Message with the specified maximum length. This will generate a truncated message (with the TC bit) if the message doesn't fit, and will also sign the message with the TSIG key set by a call to setTSIG(). This method may return null if the message could not be rendered at all; this could happen if maxLength is smaller than a DNS header, for example.
        Parameters:
        maxLength - The maximum length of the message.
        Returns:
        The wire format of the message, or null if the message could not be rendered into the specified length.
        See Also:
        Flags, TSIG
      • setTSIG

        public void setTSIG(TSIG key,
                   int error,
                   TSIGRecord querytsig)
        Sets the TSIG key and other necessary information to sign a message.
        Parameters:
        key - The TSIG key.
        error - The value of the TSIG error field.
        querytsig - If this is a response, the TSIG from the request.
      • numBytes

        public int numBytes()
        Returns the size of the message. Only valid if the message has been converted to or from wire format.
      • sectionToString

        public String sectionToString(int i)
        Converts the given section of the Message to a String.
        See Also:
        Section
      • toString

        public String toString()
        Converts the Message to a String.
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/NAPTRRecord.html100644 0 0 52425 12131352546 16331 0ustar 0 0 NAPTRRecord (dnsjava documentation)
org.xbill.DNS

Class NAPTRRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class NAPTRRecord
    extends Record
    Name Authority Pointer Record - specifies rewrite rule, that when applied to an existing string will produce a new domain.
    Author:
    Chuck Santos
    See Also:
    Serialized Form
    • Constructor Detail

      • NAPTRRecord

        public NAPTRRecord(Name name,
                   int dclass,
                   long ttl,
                   int order,
                   int preference,
                   String flags,
                   String service,
                   String regexp,
                   Name replacement)
        Creates an NAPTR Record from the given data
        Parameters:
        order - The order of this NAPTR. Records with lower order are preferred.
        preference - The preference, used to select between records at the same order.
        flags - The control aspects of the NAPTRRecord.
        service - The service or protocol available down the rewrite path.
        regexp - The regular/substitution expression.
        replacement - The domain-name to query for the next DNS resource record, depending on the value of the flags field.
        Throws:
        IllegalArgumentException - One of the strings has invalid escapes
    • Method Detail

      • getOrder

        public int getOrder()
        Returns the order
      • getPreference

        public int getPreference()
        Returns the preference
      • getFlags

        public String getFlags()
        Returns flags
      • getService

        public String getService()
        Returns service
      • getRegexp

        public String getRegexp()
        Returns regexp
      • getReplacement

        public Name getReplacement()
        Returns the replacement domain-name
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
dnsjava-2.1.5/doc/org/xbill/DNS/NSAPRecord.html100644 0 0 36273 12131352546 16211 0ustar 0 0 NSAPRecord (dnsjava documentation)
org.xbill.DNS

Class NSAPRecord

    • Constructor Detail

      • NSAPRecord

        public NSAPRecord(Name name,
                  int dclass,
                  long ttl,
                  String address)
        Creates an NSAP Record from the given data
        Parameters:
        address - The NSAP address.
        Throws:
        IllegalArgumentException - The address is not a valid NSAP address.
    • Method Detail

      • getAddress

        public String getAddress()
        Returns the NSAP address.
dnsjava-2.1.5/doc/org/xbill/DNS/NSAP_PTRRecord.html100644 0 0 40632 12131352546 16730 0ustar 0 0 NSAP_PTRRecord (dnsjava documentation)
org.xbill.DNS

Class NSAP_PTRRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • NSAP_PTRRecord

        public NSAP_PTRRecord(Name name,
                      int dclass,
                      long ttl,
                      Name target)
        Creates a new NSAP_PTR Record with the given data
        Parameters:
        target - The name of the host with this address
    • Method Detail

      • getTarget

        public Name getTarget()
        Gets the target of the NSAP_PTR Record
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/NSEC3PARAMRecord.html100644 0 0 44240 12131352546 17035 0ustar 0 0 NSEC3PARAMRecord (dnsjava documentation)
org.xbill.DNS

Class NSEC3PARAMRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class NSEC3PARAMRecord
    extends Record
    Next SECure name 3 Parameters - this record contains the parameters (hash algorithm, salt, iterations) used for a valid, complete NSEC3 chain present in a zone. Zones signed using NSEC3 must include this record at the zone apex to inform authoritative servers that NSEC3 is being used with the given parameters.
    Author:
    Brian Wellington, David Blacka
    See Also:
    Serialized Form
    • Constructor Detail

      • NSEC3PARAMRecord

        public NSEC3PARAMRecord(Name name,
                        int dclass,
                        long ttl,
                        int hashAlg,
                        int flags,
                        int iterations,
                        byte[] salt)
        Creates an NSEC3PARAM record from the given data.
        Parameters:
        name - The ownername of the NSEC3PARAM record (generally the zone name).
        dclass - The class.
        ttl - The TTL.
        hashAlg - The hash algorithm.
        flags - The value of the flags field.
        iterations - The number of hash iterations.
        salt - The salt to use (may be null).
    • Method Detail

      • getHashAlgorithm

        public int getHashAlgorithm()
        Returns the hash algorithm
      • getFlags

        public int getFlags()
        Returns the flags
      • getIterations

        public int getIterations()
        Returns the number of iterations
      • getSalt

        public byte[] getSalt()
        Returns the salt
      • hashName

        public byte[] hashName(Name name)
                        throws NoSuchAlgorithmException
        Hashes a name with the parameters of this NSEC3PARAM record.
        Parameters:
        name - The name to hash
        Returns:
        The hashed version of the name
        Throws:
        NoSuchAlgorithmException - The hash algorithm is unknown.
dnsjava-2.1.5/doc/org/xbill/DNS/NSEC3Record.Digest.html100644 0 0 22602 12131352546 17470 0ustar 0 0 NSEC3Record.Digest (dnsjava documentation)
org.xbill.DNS

Class NSEC3Record.Digest

dnsjava-2.1.5/doc/org/xbill/DNS/NSEC3Record.Flags.html100644 0 0 22756 12131352546 17317 0ustar 0 0 NSEC3Record.Flags (dnsjava documentation)
org.xbill.DNS

Class NSEC3Record.Flags

    • Field Detail

      • OPT_OUT

        public static final int OPT_OUT
        Unsigned delegation are not included in the NSEC3 chain.
        See Also:
        Constant Field Values
dnsjava-2.1.5/doc/org/xbill/DNS/NSEC3Record.html100644 0 0 53670 12131352546 16263 0ustar 0 0 NSEC3Record (dnsjava documentation)
org.xbill.DNS

Class NSEC3Record

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class NSEC3Record
    extends Record
    Next SECure name 3 - this record contains the next hashed name in an ordered list of hashed names in the zone, and a set of types for which records exist for this name. The presence of this record in a response signifies a negative response from a DNSSEC-signed zone. This replaces the NSEC and NXT records, when used.
    Author:
    Brian Wellington, David Blacka
    See Also:
    Serialized Form
    • Constructor Detail

      • NSEC3Record

        public NSEC3Record(Name name,
                   int dclass,
                   long ttl,
                   int hashAlg,
                   int flags,
                   int iterations,
                   byte[] salt,
                   byte[] next,
                   int[] types)
        Creates an NSEC3 record from the given data.
        Parameters:
        name - The ownername of the NSEC3 record (base32'd hash plus zonename).
        dclass - The class.
        ttl - The TTL.
        hashAlg - The hash algorithm.
        flags - The value of the flags field.
        iterations - The number of hash iterations.
        salt - The salt to use (may be null).
        next - The next hash (may not be null).
        types - The types present at the original ownername.
    • Method Detail

      • getHashAlgorithm

        public int getHashAlgorithm()
        Returns the hash algorithm
      • getFlags

        public int getFlags()
        Returns the flags
      • getIterations

        public int getIterations()
        Returns the number of iterations
      • getSalt

        public byte[] getSalt()
        Returns the salt
      • getNext

        public byte[] getNext()
        Returns the next hash
      • getTypes

        public int[] getTypes()
        Returns the set of types defined for this name
      • hasType

        public boolean hasType(int type)
        Returns whether a specific type is in the set of types.
      • hashName

        public byte[] hashName(Name name)
                        throws NoSuchAlgorithmException
        Hashes a name with the parameters of this NSEC3 record.
        Parameters:
        name - The name to hash
        Returns:
        The hashed version of the name
        Throws:
        NoSuchAlgorithmException - The hash algorithm is unknown.
dnsjava-2.1.5/doc/org/xbill/DNS/NSECRecord.html100644 0 0 40133 12131352546 16166 0ustar 0 0 NSECRecord (dnsjava documentation)
org.xbill.DNS

Class NSECRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class NSECRecord
    extends Record
    Next SECure name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name. The presence of this record in a response signifies a negative response from a DNSSEC-signed zone. This replaces the NXT record.
    Author:
    Brian Wellington, David Blacka
    See Also:
    Serialized Form
    • Constructor Detail

      • NSECRecord

        public NSECRecord(Name name,
                  int dclass,
                  long ttl,
                  Name next,
                  int[] types)
        Creates an NSEC Record from the given data.
        Parameters:
        next - The following name in an ordered list of the zone
        types - An array containing the types present.
    • Method Detail

      • getNext

        public Name getNext()
        Returns the next name
      • getTypes

        public int[] getTypes()
        Returns the set of types defined for this name
      • hasType

        public boolean hasType(int type)
        Returns whether a specific type is in the set of types.
dnsjava-2.1.5/doc/org/xbill/DNS/NSIDOption.html100644 0 0 25407 12131352546 16234 0ustar 0 0 NSIDOption (dnsjava documentation)
org.xbill.DNS

Class NSIDOption



  • public class NSIDOption
    extends GenericEDNSOption
    The Name Server Identifier Option, define in RFC 5001.
    Author:
    Brian Wellington
    See Also:
    OPTRecord
    • Constructor Detail

      • NSIDOption

        public NSIDOption(byte[] data)
        Construct an NSID option.
        Parameters:
        data - The contents of the option.
dnsjava-2.1.5/doc/org/xbill/DNS/NSRecord.html100644 0 0 43072 12131352546 15763 0ustar 0 0 NSRecord (dnsjava documentation)
org.xbill.DNS

Class NSRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • NSRecord

        public NSRecord(Name name,
                int dclass,
                long ttl,
                Name target)
        Creates a new NS Record with the given data
        Parameters:
        target - The name server for the given domain
    • Method Detail

      • getTarget

        public Name getTarget()
        Gets the target of the NS Record
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/NULLRecord.html100644 0 0 34571 12131352546 16221 0ustar 0 0 NULLRecord (dnsjava documentation)
org.xbill.DNS

Class NULLRecord

    • Constructor Detail

      • NULLRecord

        public NULLRecord(Name name,
                  int dclass,
                  long ttl,
                  byte[] data)
        Creates a NULL record from the given data.
        Parameters:
        data - The contents of the record.
    • Method Detail

      • getData

        public byte[] getData()
        Returns the contents of this record.
dnsjava-2.1.5/doc/org/xbill/DNS/NXTRecord.html100644 0 0 40057 12131352546 16114 0ustar 0 0 NXTRecord (dnsjava documentation)
org.xbill.DNS

Class NXTRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class NXTRecord
    extends Record
    Next name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name. The presence of this record in a response signifies a failed query for data in a DNSSEC-signed zone.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • NXTRecord

        public NXTRecord(Name name,
                 int dclass,
                 long ttl,
                 Name next,
                 BitSet bitmap)
        Creates an NXT Record from the given data
        Parameters:
        next - The following name in an ordered list of the zone
        bitmap - The set of type for which records exist at this name
    • Method Detail

      • getNext

        public Name getNext()
        Returns the next name
      • getBitmap

        public BitSet getBitmap()
        Returns the set of types defined for this name
dnsjava-2.1.5/doc/org/xbill/DNS/Name.html100644 0 0 130173 12131352546 15203 0ustar 0 0 Name (dnsjava documentation)
org.xbill.DNS

Class Name

    • Field Detail

      • root

        public static final Name root
        The root name
      • empty

        public static final Name empty
        The root name
    • Constructor Detail

      • Name

        public Name(String s,
            Name origin)
             throws TextParseException
        Create a new name from a string and an origin. This does not automatically make the name absolute; it will be absolute if it has a trailing dot or an absolute origin is appended.
        Parameters:
        s - The string to be converted
        origin - If the name is not absolute, the origin to be appended.
        Throws:
        TextParseException - The name is invalid.
      • Name

        public Name(String s)
             throws TextParseException
        Create a new name from a string. This does not automatically make the name absolute; it will be absolute if it has a trailing dot.
        Parameters:
        s - The string to be converted
        Throws:
        TextParseException - The name is invalid.
      • Name

        public Name(DNSInput in)
             throws WireParseException
        Create a new name from DNS a wire format message
        Parameters:
        in - A stream containing the DNS message which is currently positioned at the start of the name to be read.
        Throws:
        WireParseException
      • Name

        public Name(byte[] b)
             throws IOException
        Create a new name from DNS wire format
        Parameters:
        b - A byte array containing the wire format of the name.
        Throws:
        IOException
      • Name

        public Name(Name src,
            int n)
        Create a new name by removing labels from the beginning of an existing Name
        Parameters:
        src - An existing Name
        n - The number of labels to remove from the beginning in the copy
    • Method Detail

      • fromString

        public static Name fromString(String s,
                      Name origin)
                               throws TextParseException
        Create a new name from a string and an origin. This does not automatically make the name absolute; it will be absolute if it has a trailing dot or an absolute origin is appended. This is identical to the constructor, except that it will avoid creating new objects in some cases.
        Parameters:
        s - The string to be converted
        origin - If the name is not absolute, the origin to be appended.
        Throws:
        TextParseException - The name is invalid.
      • fromString

        public static Name fromString(String s)
                               throws TextParseException
        Create a new name from a string. This does not automatically make the name absolute; it will be absolute if it has a trailing dot. This is identical to the constructor, except that it will avoid creating new objects in some cases.
        Parameters:
        s - The string to be converted
        Throws:
        TextParseException - The name is invalid.
      • fromConstantString

        public static Name fromConstantString(String s)
        Create a new name from a constant string. This should only be used when the name is known to be good - that is, when it is constant.
        Parameters:
        s - The string to be converted
        Throws:
        IllegalArgumentException - The name is invalid.
      • concatenate

        public static Name concatenate(Name prefix,
                       Name suffix)
                                throws NameTooLongException
        Creates a new name by concatenating two existing names.
        Parameters:
        prefix - The prefix name.
        suffix - The suffix name.
        Returns:
        The concatenated name.
        Throws:
        NameTooLongException - The name is too long.
      • relativize

        public Name relativize(Name origin)
        If this name is a subdomain of origin, return a new name relative to origin with the same value. Otherwise, return the existing name.
        Parameters:
        origin - The origin to remove.
        Returns:
        The possibly relativized name.
      • wild

        public Name wild(int n)
        Generates a new Name with the first n labels replaced by a wildcard
        Returns:
        The wildcard name
      • canonicalize

        public Name canonicalize()
        Returns a canonicalized version of the Name (all lowercase). This may be the same name, if the input Name is already canonical.
      • fromDNAME

        public Name fromDNAME(DNAMERecord dname)
                       throws NameTooLongException
        Generates a new Name to be used when following a DNAME.
        Parameters:
        dname - The DNAME record to follow.
        Returns:
        The constructed name.
        Throws:
        NameTooLongException - The resulting name is too long.
      • isWild

        public boolean isWild()
        Is this name a wildcard?
      • isAbsolute

        public boolean isAbsolute()
        Is this name absolute?
      • length

        public short length()
        The length of the name.
      • labels

        public int labels()
        The number of labels in the name.
      • subdomain

        public boolean subdomain(Name domain)
        Is the current Name a subdomain of the specified name?
      • toString

        public String toString(boolean omitFinalDot)
        Convert a Name to a String
        Parameters:
        omitFinalDot - If true, and the name is absolute, omit the final dot.
        Returns:
        The representation of this name as a (printable) String.
      • toString

        public String toString()
        Convert a Name to a String
        Overrides:
        toString in class Object
        Returns:
        The representation of this name as a (printable) String.
      • getLabel

        public byte[] getLabel(int n)
        Retrieve the nth label of a Name. This makes a copy of the label; changing this does not change the Name.
        Parameters:
        n - The label to be retrieved. The first label is 0.
      • getLabelString

        public String getLabelString(int n)
        Convert the nth label in a Name to a String
        Parameters:
        n - The label to be converted to a (printable) String. The first label is 0.
      • toWire

        public void toWire(DNSOutput out,
                  Compression c)
        Emit a Name in DNS wire format
        Parameters:
        out - The output stream containing the DNS message.
        c - The compression context, or null of no compression is desired.
        Throws:
        IllegalArgumentException - The name is not absolute.
      • toWire

        public byte[] toWire()
        Emit a Name in DNS wire format
        Throws:
        IllegalArgumentException - The name is not absolute.
      • toWireCanonical

        public void toWireCanonical(DNSOutput out)
        Emit a Name in canonical DNS wire format (all lowercase)
        Parameters:
        out - The output stream to which the message is written.
      • toWireCanonical

        public byte[] toWireCanonical()
        Emit a Name in canonical DNS wire format (all lowercase)
        Returns:
        The canonical form of the name.
      • toWire

        public void toWire(DNSOutput out,
                  Compression c,
                  boolean canonical)
        Emit a Name in DNS wire format
        Parameters:
        out - The output stream containing the DNS message.
        c - The compression context, or null of no compression is desired.
        canonical - If true, emit the name in canonicalized form (all lowercase).
        Throws:
        IllegalArgumentException - The name is not absolute.
      • equals

        public boolean equals(Object arg)
        Are these two Names equivalent?
        Overrides:
        equals in class Object
      • hashCode

        public int hashCode()
        Computes a hashcode based on the value
        Overrides:
        hashCode in class Object
      • compareTo

        public int compareTo(Object o)
        Compares this Name to another Object.
        Specified by:
        compareTo in interface Comparable
        Parameters:
        o - The Object to be compared.
        Returns:
        The value 0 if the argument is a name equivalent to this name; a value less than 0 if the argument is less than this name in the canonical ordering, and a value greater than 0 if the argument is greater than this name in the canonical ordering.
        Throws:
        ClassCastException - if the argument is not a Name.
dnsjava-2.1.5/doc/org/xbill/DNS/NameTooLongException.html100644 0 0 33116 12131352546 20343 0ustar 0 0 NameTooLongException (dnsjava documentation)
org.xbill.DNS

Class NameTooLongException

  • All Implemented Interfaces:
    Serializable


    public class NameTooLongException
    extends WireParseException
    An exception thrown when a name is longer than the maximum length of a DNS name.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • NameTooLongException

        public NameTooLongException()
      • NameTooLongException

        public NameTooLongException(String s)
dnsjava-2.1.5/doc/org/xbill/DNS/OPTRecord.html100644 0 0 51702 12131352546 16104 0ustar 0 0 OPTRecord (dnsjava documentation)
org.xbill.DNS

Class OPTRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class OPTRecord
    extends Record
    Options - describes Extended DNS (EDNS) properties of a Message. No specific options are defined other than those specified in the header. An OPT should be generated by Resolver. EDNS is a method to extend the DNS protocol while providing backwards compatibility and not significantly changing the protocol. This implementation of EDNS is mostly complete at level 0.
    Author:
    Brian Wellington
    See Also:
    Message, Resolver, Serialized Form
    • Constructor Detail

      • OPTRecord

        public OPTRecord(int payloadSize,
                 int xrcode,
                 int version,
                 int flags,
                 List options)
        Creates an OPT Record. This is normally called by SimpleResolver, but can also be called by a server.
        Parameters:
        payloadSize - The size of a packet that can be reassembled on the sending host.
        xrcode - The value of the extended rcode field. This is the upper 16 bits of the full rcode.
        flags - Additional message flags.
        version - The EDNS version that this DNS implementation supports. This should be 0 for dnsjava.
        options - The list of options that comprise the data field. There are currently no defined options.
        See Also:
        ExtendedFlags
      • OPTRecord

        public OPTRecord(int payloadSize,
                 int xrcode,
                 int version,
                 int flags)
        Creates an OPT Record with no data. This is normally called by SimpleResolver, but can also be called by a server.
        Parameters:
        payloadSize - The size of a packet that can be reassembled on the sending host.
        xrcode - The value of the extended rcode field. This is the upper 16 bits of the full rcode.
        flags - Additional message flags.
        version - The EDNS version that this DNS implementation supports. This should be 0 for dnsjava.
        See Also:
        ExtendedFlags
      • OPTRecord

        public OPTRecord(int payloadSize,
                 int xrcode,
                 int version)
        Creates an OPT Record with no data. This is normally called by SimpleResolver, but can also be called by a server.
    • Method Detail

      • getPayloadSize

        public int getPayloadSize()
        Returns the maximum allowed payload size.
      • getExtendedRcode

        public int getExtendedRcode()
        Returns the extended Rcode
        See Also:
        Rcode
      • getVersion

        public int getVersion()
        Returns the highest supported EDNS version
      • getFlags

        public int getFlags()
        Returns the EDNS flags
      • getOptions

        public List getOptions()
        Gets all options in the OPTRecord. This returns a list of EDNSOptions.
      • getOptions

        public List getOptions(int code)
        Gets all options in the OPTRecord with a specific code. This returns a list of EDNSOptions.
dnsjava-2.1.5/doc/org/xbill/DNS/Opcode.html100644 0 0 33655 12131352546 15523 0ustar 0 0 Opcode (dnsjava documentation)
org.xbill.DNS

Class Opcode



  • public final class Opcode
    extends Object
    Constants and functions relating to DNS opcodes
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int IQUERY
      An inverse query (deprecated)
      static int NOTIFY
      A message from a primary to a secondary server to initiate a zone transfer
      static int QUERY
      A standard query
      static int STATUS
      A server status request (not used)
      static int UPDATE
      A dynamic update message
    • Method Detail

      • string

        public static String string(int i)
        Converts a numeric Opcode into a String
      • value

        public static int value(String s)
        Converts a String representation of an Opcode into its numeric value
dnsjava-2.1.5/doc/org/xbill/DNS/Options.html100644 0 0 36522 12131352546 15741 0ustar 0 0 Options (dnsjava documentation)
org.xbill.DNS

Class Options



  • public final class Options
    extends Object
    Boolean options:
    bindttl - Print TTLs in BIND format
    multiline - Print records in multiline format
    noprintin - Don't print the class of a record if it's IN
    verbose - Turn on general debugging statements
    verbosemsg - Print all messages sent or received by SimpleResolver
    verbosecompression - Print messages related to name compression
    verbosesec - Print messages related to signature verification
    verbosecache - Print messages related to cache lookups

    Valued options:
    tsigfudge=n - Sets the default TSIG fudge value (in seconds)
    sig0validity=n - Sets the default SIG(0) validity period (in seconds)
    Author:
    Brian Wellington
    • Method Detail

      • refresh

        public static void refresh()
      • clear

        public static void clear()
        Clears all defined options
      • set

        public static void set(String option)
        Sets an option to "true"
      • set

        public static void set(String option,
               String value)
        Sets an option to the the supplied value
      • unset

        public static void unset(String option)
        Removes an option
      • check

        public static boolean check(String option)
        Checks if an option is defined
      • value

        public static String value(String option)
        Returns the value of an option
      • intValue

        public static int intValue(String option)
        Returns the value of an option as an integer, or -1 if not defined.
dnsjava-2.1.5/doc/org/xbill/DNS/PTRRecord.html100644 0 0 40376 12131352546 16114 0ustar 0 0 PTRRecord (dnsjava documentation)
org.xbill.DNS

Class PTRRecord

    • Field Detail

      • singleName

        protected Name singleName
    • Constructor Detail

      • PTRRecord

        public PTRRecord(Name name,
                 int dclass,
                 long ttl,
                 Name target)
        Creates a new PTR Record with the given data
        Parameters:
        target - The name of the machine with this address
    • Method Detail

      • getTarget

        public Name getTarget()
        Gets the target of the PTR Record
      • getSingleName

        protected Name getSingleName()
dnsjava-2.1.5/doc/org/xbill/DNS/PXRecord.html100644 0 0 40333 12131352546 15767 0ustar 0 0 PXRecord (dnsjava documentation)
org.xbill.DNS

Class PXRecord

    • Constructor Detail

      • PXRecord

        public PXRecord(Name name,
                int dclass,
                long ttl,
                int preference,
                Name map822,
                Name mapX400)
        Creates an PX Record from the given data
        Parameters:
        preference - The preference of this mail address.
        map822 - The RFC 822 component of the mail address.
        mapX400 - The X.400 component of the mail address.
    • Method Detail

      • getPreference

        public int getPreference()
        Gets the preference of the route.
      • getMap822

        public Name getMap822()
        Gets the RFC 822 component of the mail address.
      • getMapX400

        public Name getMapX400()
        Gets the X.400 component of the mail address.
dnsjava-2.1.5/doc/org/xbill/DNS/RPRecord.html100644 0 0 37336 12131352546 15772 0ustar 0 0 RPRecord (dnsjava documentation)
org.xbill.DNS

Class RPRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class RPRecord
    extends Record
    Responsible Person Record - lists the mail address of a responsible person and a domain where TXT records are available.
    Author:
    Tom Scola , Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • RPRecord

        public RPRecord(Name name,
                int dclass,
                long ttl,
                Name mailbox,
                Name textDomain)
        Creates an RP Record from the given data
        Parameters:
        mailbox - The responsible person
        textDomain - The address where TXT records can be found
    • Method Detail

      • getMailbox

        public Name getMailbox()
        Gets the mailbox address of the RP Record
      • getTextDomain

        public Name getTextDomain()
        Gets the text domain info of the RP Record
dnsjava-2.1.5/doc/org/xbill/DNS/RRSIGRecord.html100644 0 0 63656 12131352546 16343 0ustar 0 0 RRSIGRecord (dnsjava documentation)
org.xbill.DNS

Class RRSIGRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class RRSIGRecord
    extends Record
    Recource Record Signature - An RRSIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver. The signature is generated by a key contained in a DNSKEY Record.
    Author:
    Brian Wellington
    See Also:
    RRset, DNSSEC, KEYRecord, Serialized Form
    • Field Detail

      • covered

        protected int covered
      • alg

        protected int alg
      • labels

        protected int labels
      • origttl

        protected long origttl
      • expire

        protected Date expire
      • timeSigned

        protected Date timeSigned
      • footprint

        protected int footprint
      • signer

        protected Name signer
      • signature

        protected byte[] signature
    • Constructor Detail

      • RRSIGRecord

        public RRSIGRecord(Name name,
                   int dclass,
                   long ttl,
                   int covered,
                   int alg,
                   long origttl,
                   Date expire,
                   Date timeSigned,
                   int footprint,
                   Name signer,
                   byte[] signature)
        Creates an RRSIG Record from the given data
        Parameters:
        covered - The RRset type covered by this signature
        alg - The cryptographic algorithm of the key that generated the signature
        origttl - The original TTL of the RRset
        expire - The time at which the signature expires
        timeSigned - The time at which this signature was generated
        footprint - The footprint/key id of the signing key.
        signer - The owner of the signing key
        signature - Binary data representing the signature
    • Method Detail

      • getTypeCovered

        public int getTypeCovered()
        Returns the RRset type covered by this signature
      • getAlgorithm

        public int getAlgorithm()
        Returns the cryptographic algorithm of the key that generated the signature
      • getLabels

        public int getLabels()
        Returns the number of labels in the signed domain name. This may be different than the record's domain name if the record is a wildcard record.
      • getOrigTTL

        public long getOrigTTL()
        Returns the original TTL of the RRset
      • getExpire

        public Date getExpire()
        Returns the time at which the signature expires
      • getTimeSigned

        public Date getTimeSigned()
        Returns the time at which this signature was generated
      • getFootprint

        public int getFootprint()
        Returns The footprint/key id of the signing key.
      • getSigner

        public Name getSigner()
        Returns the owner of the signing key
      • getSignature

        public byte[] getSignature()
        Returns the binary data representing the signature
dnsjava-2.1.5/doc/org/xbill/DNS/RRset.html100644 0 0 51446 12131352546 15347 0ustar 0 0 RRset (dnsjava documentation)
org.xbill.DNS

Class RRset

    • Constructor Summary

      Constructors 
      Constructor and Description
      RRset()
      Creates an empty RRset
      RRset(Record record)
      Creates an RRset and sets its contents to the specified record
      RRset(RRset rrset)
      Creates an RRset with the contents of an existing RRset
    • Constructor Detail

      • RRset

        public RRset()
        Creates an empty RRset
      • RRset

        public RRset(Record record)
        Creates an RRset and sets its contents to the specified record
      • RRset

        public RRset(RRset rrset)
        Creates an RRset with the contents of an existing RRset
    • Method Detail

      • addRR

        public void addRR(Record r)
        Adds a Record to an RRset
      • deleteRR

        public void deleteRR(Record r)
        Deletes a Record from an RRset
      • clear

        public void clear()
        Deletes all Records from an RRset
      • rrs

        public Iterator rrs(boolean cycle)
        Returns an Iterator listing all (data) records.
        Parameters:
        cycle - If true, cycle through the records so that each Iterator will start with a different record.
      • rrs

        public Iterator rrs()
        Returns an Iterator listing all (data) records. This cycles through the records, so each Iterator will start with a different record.
      • sigs

        public Iterator sigs()
        Returns an Iterator listing all signature records
      • size

        public int size()
        Returns the number of (data) records
      • getName

        public Name getName()
        Returns the name of the records
        See Also:
        Name
      • getType

        public int getType()
        Returns the type of the records
        See Also:
        Type
      • getDClass

        public int getDClass()
        Returns the class of the records
        See Also:
        DClass
      • getTTL

        public long getTTL()
        Returns the ttl of the records
      • toString

        public String toString()
        Converts the RRset to a String
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/RTRecord.html100644 0 0 43264 12131352546 15773 0ustar 0 0 RTRecord (dnsjava documentation)
org.xbill.DNS

Class RTRecord

    • Field Detail

      • u16Field

        protected int u16Field
      • nameField

        protected Name nameField
    • Constructor Detail

      • RTRecord

        public RTRecord(Name name,
                int dclass,
                long ttl,
                int preference,
                Name intermediateHost)
        Creates an RT Record from the given data
        Parameters:
        preference - The preference of the route. Smaller numbers indicate more preferred routes.
        intermediateHost - The domain name of the host to use as a router.
    • Method Detail

      • getPreference

        public int getPreference()
        Gets the preference of the route.
      • getIntermediateHost

        public Name getIntermediateHost()
        Gets the host to use as a router.
      • getU16Field

        protected int getU16Field()
      • getNameField

        protected Name getNameField()
dnsjava-2.1.5/doc/org/xbill/DNS/Rcode.html100644 0 0 54201 12131352546 15334 0ustar 0 0 Rcode (dnsjava documentation)
org.xbill.DNS

Class Rcode



  • public final class Rcode
    extends Object
    Constants and functions relating to DNS rcodes (error values)
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int BADKEY
      The key is invalid (TSIG/TKEY extended error)
      static int BADMODE
      The mode is invalid (TKEY extended error)
      static int BADSIG
      The signature is invalid (TSIG/TKEY extended error)
      static int BADTIME
      The time is out of range (TSIG/TKEY extended error)
      static int BADVERS
      Unsupported EDNS level
      static int FORMERR
      Format error
      static int NOERROR
      No error
      static int NOTAUTH
      The requestor is not authorized to perform this operation
      static int NOTIMP
      The operation requested is not implemented
      static int NOTIMPL
      Deprecated synonym for NOTIMP.
      static int NOTZONE
      The zone specified is not a zone
      static int NXDOMAIN
      The name does not exist
      static int NXRRSET
      The RRset (name, type) does not exist
      static int REFUSED
      The operation was refused by the server
      static int SERVFAIL
      Server failure
      static int YXDOMAIN
      The name exists
      static int YXRRSET
      The RRset (name, type) exists
    • Method Detail

      • string

        public static String string(int i)
        Converts a numeric Rcode into a String
      • TSIGstring

        public static String TSIGstring(int i)
        Converts a numeric TSIG extended Rcode into a String
      • value

        public static int value(String s)
        Converts a String representation of an Rcode into its numeric value
dnsjava-2.1.5/doc/org/xbill/DNS/Record.html100644 0 0 136770 12131352546 15552 0ustar 0 0 Record (dnsjava documentation)
org.xbill.DNS

Class Record

    • Field Summary

      Fields 
      Modifier and Type Field and Description
      protected int dclass 
      protected Name name 
      protected long ttl 
      protected int type 
    • Constructor Summary

      Constructors 
      Modifier Constructor and Description
      protected Record() 
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      protected static byte[] byteArrayFromString(String s)
      Converts a String into a byte array.
      protected static String byteArrayToString(byte[] array, boolean quote)
      Converts a byte array into a String.
      int compareTo(Object o)
      Compares this Record to another Object.
      boolean equals(Object arg)
      Determines if two Records are identical.
      static Record fromString(Name name, int type, int dclass, long ttl, String s, Name origin)
      Builds a new Record from its textual representation
      static Record fromString(Name name, int type, int dclass, long ttl, Tokenizer st, Name origin)
      Builds a new Record from its textual representation
      static Record fromWire(byte[] b, int section)
      Builds a Record from DNS uncompressed wire format.
      Name getAdditionalName()
      Returns the name for which additional data processing should be done for this record.
      int getDClass()
      Returns the record's class
      Name getName()
      Returns the record's name
      int getRRsetType()
      Returns the type of RRset that this record would belong to.
      long getTTL()
      Returns the record's TTL
      int getType()
      Returns the record's type
      int hashCode()
      Generates a hash code based on the Record's data.
      static Record newRecord(Name name, int type, int dclass)
      Creates a new empty record, with the given parameters.
      static Record newRecord(Name name, int type, int dclass, long ttl)
      Creates a new empty record, with the given parameters.
      static Record newRecord(Name name, int type, int dclass, long ttl, byte[] data)
      Creates a new record, with the given parameters.
      static Record newRecord(Name name, int type, int dclass, long ttl, int length, byte[] data)
      Creates a new record, with the given parameters.
      String rdataToString()
      Converts the rdata portion of a Record into a String representation
      byte[] rdataToWireCanonical()
      Converts the rdata in a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
      boolean sameRRset(Record rec)
      Determines if two Records could be part of the same RRset.
      String toString()
      Converts a Record into a String representation
      byte[] toWire(int section)
      Converts a Record into DNS uncompressed wire format.
      byte[] toWireCanonical()
      Converts a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
      protected static String unknownToString(byte[] data)
      Converts a byte array into the unknown RR format.
      Record withName(Name name)
      Creates a new record identical to the current record, but with a different name.
    • Field Detail

      • name

        protected Name name
      • type

        protected int type
      • dclass

        protected int dclass
      • ttl

        protected long ttl
    • Constructor Detail

      • Record

        protected Record()
    • Method Detail

      • newRecord

        public static Record newRecord(Name name,
                       int type,
                       int dclass,
                       long ttl,
                       int length,
                       byte[] data)
        Creates a new record, with the given parameters.
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        ttl - The record's time to live.
        length - The length of the record's data.
        data - The rdata of the record, in uncompressed DNS wire format. Only the first length bytes are used.
      • newRecord

        public static Record newRecord(Name name,
                       int type,
                       int dclass,
                       long ttl,
                       byte[] data)
        Creates a new record, with the given parameters.
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        ttl - The record's time to live.
        data - The complete rdata of the record, in uncompressed DNS wire format.
      • newRecord

        public static Record newRecord(Name name,
                       int type,
                       int dclass,
                       long ttl)
        Creates a new empty record, with the given parameters.
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        ttl - The record's time to live.
        Returns:
        An object of a subclass of Record
      • newRecord

        public static Record newRecord(Name name,
                       int type,
                       int dclass)
        Creates a new empty record, with the given parameters. This method is designed to create records that will be added to the QUERY section of a message.
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        Returns:
        An object of a subclass of Record
      • fromWire

        public static Record fromWire(byte[] b,
                      int section)
                               throws IOException
        Builds a Record from DNS uncompressed wire format.
        Throws:
        IOException
      • toWire

        public byte[] toWire(int section)
        Converts a Record into DNS uncompressed wire format.
      • toWireCanonical

        public byte[] toWireCanonical()
        Converts a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
      • rdataToWireCanonical

        public byte[] rdataToWireCanonical()
        Converts the rdata in a Record into canonical DNS uncompressed wire format (all names are converted to lowercase).
      • rdataToString

        public String rdataToString()
        Converts the rdata portion of a Record into a String representation
      • toString

        public String toString()
        Converts a Record into a String representation
        Overrides:
        toString in class Object
      • byteArrayToString

        protected static String byteArrayToString(byte[] array,
                               boolean quote)
        Converts a byte array into a String.
      • unknownToString

        protected static String unknownToString(byte[] data)
        Converts a byte array into the unknown RR format.
      • fromString

        public static Record fromString(Name name,
                        int type,
                        int dclass,
                        long ttl,
                        Tokenizer st,
                        Name origin)
                                 throws IOException
        Builds a new Record from its textual representation
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        ttl - The record's time to live.
        st - A tokenizer containing the textual representation of the rdata.
        origin - The default origin to be appended to relative domain names.
        Returns:
        The new record
        Throws:
        IOException - The text format was invalid.
      • fromString

        public static Record fromString(Name name,
                        int type,
                        int dclass,
                        long ttl,
                        String s,
                        Name origin)
                                 throws IOException
        Builds a new Record from its textual representation
        Parameters:
        name - The owner name of the record.
        type - The record's type.
        dclass - The record's class.
        ttl - The record's time to live.
        s - The textual representation of the rdata.
        origin - The default origin to be appended to relative domain names.
        Returns:
        The new record
        Throws:
        IOException - The text format was invalid.
      • getName

        public Name getName()
        Returns the record's name
        See Also:
        Name
      • getType

        public int getType()
        Returns the record's type
        See Also:
        Type
      • getRRsetType

        public int getRRsetType()
        Returns the type of RRset that this record would belong to. For all types except RRSIG, this is equivalent to getType().
        Returns:
        The type of record, if not RRSIG. If the type is RRSIG, the type covered is returned.
        See Also:
        Type, RRset, SIGRecord
      • getDClass

        public int getDClass()
        Returns the record's class
      • getTTL

        public long getTTL()
        Returns the record's TTL
      • sameRRset

        public boolean sameRRset(Record rec)
        Determines if two Records could be part of the same RRset. This compares the name, type, and class of the Records; the ttl and rdata are not compared.
      • equals

        public boolean equals(Object arg)
        Determines if two Records are identical. This compares the name, type, class, and rdata (with names canonicalized). The TTLs are not compared.
        Overrides:
        equals in class Object
        Parameters:
        arg - The record to compare to
        Returns:
        true if the records are equal, false otherwise.
      • hashCode

        public int hashCode()
        Generates a hash code based on the Record's data.
        Overrides:
        hashCode in class Object
      • withName

        public Record withName(Name name)
        Creates a new record identical to the current record, but with a different name. This is most useful for replacing the name of a wildcard record.
      • compareTo

        public int compareTo(Object o)
        Compares this Record to another Object.
        Specified by:
        compareTo in interface Comparable
        Parameters:
        o - The Object to be compared.
        Returns:
        The value 0 if the argument is a record equivalent to this record; a value less than 0 if the argument is less than this record in the canonical ordering, and a value greater than 0 if the argument is greater than this record in the canonical ordering. The canonical ordering is defined to compare by name, class, type, and rdata.
        Throws:
        ClassCastException - if the argument is not a Record.
      • getAdditionalName

        public Name getAdditionalName()
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
dnsjava-2.1.5/doc/org/xbill/DNS/RelativeNameException.html100644 0 0 34000 12131352546 20526 0ustar 0 0 RelativeNameException (dnsjava documentation)
org.xbill.DNS

Class RelativeNameException

  • All Implemented Interfaces:
    Serializable


    public class RelativeNameException
    extends IllegalArgumentException
    An exception thrown when a relative name is passed as an argument to a method requiring an absolute name.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • RelativeNameException

        public RelativeNameException(Name name)
      • RelativeNameException

        public RelativeNameException(String s)
dnsjava-2.1.5/doc/org/xbill/DNS/Resolver.html100644 0 0 41451 12131352546 16104 0ustar 0 0 Resolver (dnsjava documentation)
org.xbill.DNS

Interface Resolver

  • All Known Implementing Classes:
    ExtendedResolver, SimpleResolver


    public interface Resolver
    Interface describing a resolver.
    Author:
    Brian Wellington
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      Message send(Message query)
      Sends a message and waits for a response.
      Object sendAsync(Message query, ResolverListener listener)
      Asynchronously sends a message registering a listener to receive a callback on success or exception.
      void setEDNS(int level)
      Sets the EDNS version used on outgoing messages.
      void setEDNS(int level, int payloadSize, int flags, List options)
      Sets the EDNS information on outgoing messages.
      void setIgnoreTruncation(boolean flag)
      Sets whether truncated responses will be ignored.
      void setPort(int port)
      Sets the port to communicate with on the server
      void setTCP(boolean flag)
      Sets whether TCP connections will be sent by default
      void setTimeout(int secs)
      Sets the amount of time to wait for a response before giving up.
      void setTimeout(int secs, int msecs)
      Sets the amount of time to wait for a response before giving up.
      void setTSIGKey(TSIG key)
      Specifies the TSIG key that messages will be signed with
    • Method Detail

      • setPort

        void setPort(int port)
        Sets the port to communicate with on the server
        Parameters:
        port - The port to send messages to
      • setTCP

        void setTCP(boolean flag)
        Sets whether TCP connections will be sent by default
        Parameters:
        flag - Indicates whether TCP connections are made
      • setIgnoreTruncation

        void setIgnoreTruncation(boolean flag)
        Sets whether truncated responses will be ignored. If not, a truncated response over UDP will cause a retransmission over TCP.
        Parameters:
        flag - Indicates whether truncated responses should be ignored.
      • setEDNS

        void setEDNS(int level)
        Sets the EDNS version used on outgoing messages.
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
        Throws:
        IllegalArgumentException - An invalid level was indicated.
      • setEDNS

        void setEDNS(int level,
                   int payloadSize,
                   int flags,
                   List options)
        Sets the EDNS information on outgoing messages.
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
        payloadSize - The maximum DNS packet size that this host is capable of receiving over UDP. If 0 is specified, the default (1280) is used.
        flags - EDNS extended flags to be set in the OPT record.
        options - EDNS options to be set in the OPT record, specified as a List of OPTRecord.Option elements.
        Throws:
        IllegalArgumentException - An invalid field was specified.
        See Also:
        OPTRecord
      • setTSIGKey

        void setTSIGKey(TSIG key)
        Specifies the TSIG key that messages will be signed with
        Parameters:
        key - The key
      • setTimeout

        void setTimeout(int secs,
                      int msecs)
        Sets the amount of time to wait for a response before giving up.
        Parameters:
        secs - The number of seconds to wait.
        msecs - The number of milliseconds to wait.
      • setTimeout

        void setTimeout(int secs)
        Sets the amount of time to wait for a response before giving up.
        Parameters:
        secs - The number of seconds to wait.
      • send

        Message send(Message query)
                     throws IOException
        Sends a message and waits for a response.
        Parameters:
        query - The query to send.
        Returns:
        The response
        Throws:
        IOException - An error occurred while sending or receiving.
      • sendAsync

        Object sendAsync(Message query,
                       ResolverListener listener)
        Asynchronously sends a message registering a listener to receive a callback on success or exception. Multiple asynchronous lookups can be performed in parallel. Since the callback may be invoked before the function returns, external synchronization is necessary.
        Parameters:
        query - The query to send
        listener - The object containing the callbacks.
        Returns:
        An identifier, which is also a parameter in the callback
dnsjava-2.1.5/doc/org/xbill/DNS/ResolverConfig.html100644 0 0 35177 12131352546 17242 0ustar 0 0 ResolverConfig (dnsjava documentation)
org.xbill.DNS

Class ResolverConfig



  • public class ResolverConfig
    extends Object
    A class that tries to locate name servers and the search path to be appended to unqualified names. The following are attempted, in order, until one succeeds.
    • The properties 'dns.server' and 'dns.search' (comma delimited lists) are checked. The servers can either be IP addresses or hostnames (which are resolved using Java's built in DNS support).
    • The sun.net.dns.ResolverConfiguration class is queried.
    • On Unix, /etc/resolv.conf is parsed.
    • On Windows, ipconfig/winipcfg is called and its output parsed. This may fail for non-English versions on Windows.
    • "localhost" is used as the nameserver, and the search path is empty.
    These routines will be called internally when creating Resolvers/Lookups without explicitly specifying server names, and can also be called directly if desired.
    Author:
    Brian Wellington, Yannick Meudal, Arnt Gulbrandsen
    • Constructor Detail

      • ResolverConfig

        public ResolverConfig()
    • Method Detail

      • servers

        public String[] servers()
        Returns all located servers
      • server

        public String server()
        Returns the first located server
      • searchPath

        public Name[] searchPath()
        Returns all entries in the located search path
      • ndots

        public int ndots()
        Returns the located ndots value, or the default (1) if not configured. Note that ndots can only be configured in a resolv.conf file, and will only take effect if ResolverConfig uses resolv.conf directly (that is, if the JVM does not include the sun.net.dns.ResolverConfiguration class).
      • getCurrentConfig

        public static ResolverConfig getCurrentConfig()
        Gets the current configuration
      • refresh

        public static void refresh()
        Gets the current configuration
dnsjava-2.1.5/doc/org/xbill/DNS/ResolverListener.html100644 0 0 22533 12131352546 17612 0ustar 0 0 ResolverListener (dnsjava documentation)
org.xbill.DNS

Interface ResolverListener

  • All Superinterfaces:
    EventListener


    public interface ResolverListener
    extends EventListener
    An interface to the asynchronous resolver.
    Author:
    Brian Wellington
    See Also:
    Resolver
    • Method Detail

      • receiveMessage

        void receiveMessage(Object id,
                          Message m)
        The callback used by an asynchronous resolver
        Parameters:
        id - The identifier returned by Resolver.sendAsync()
        m - The response message as returned by the Resolver
      • handleException

        void handleException(Object id,
                           Exception e)
        The callback used by an asynchronous resolver when an exception is thrown
        Parameters:
        id - The identifier returned by Resolver.sendAsync()
        e - The thrown exception
dnsjava-2.1.5/doc/org/xbill/DNS/ReverseMap.html100644 0 0 37761 12131352546 16365 0ustar 0 0 ReverseMap (dnsjava documentation)
org.xbill.DNS

Class ReverseMap



  • public final class ReverseMap
    extends Object
    A set functions designed to deal with DNS names used in reverse mappings. For the IPv4 address a.b.c.d, the reverse map name is d.c.b.a.in-addr.arpa. For an IPv6 address, the reverse map name is ...ip6.arpa.
    Author:
    Brian Wellington
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      static Name fromAddress(byte[] addr)
      Creates a reverse map name corresponding to an address contained in an array of 4 bytes (for an IPv4 address) or 16 bytes (for an IPv6 address).
      static Name fromAddress(InetAddress addr)
      Creates a reverse map name corresponding to an address contained in an InetAddress.
      static Name fromAddress(int[] addr)
      Creates a reverse map name corresponding to an address contained in an array of 4 integers between 0 and 255 (for an IPv4 address) or 16 integers between 0 and 255 (for an IPv6 address).
      static Name fromAddress(String addr)
      Creates a reverse map name corresponding to an address contained in a String.
      static Name fromAddress(String addr, int family)
      Creates a reverse map name corresponding to an address contained in a String.
    • Method Detail

      • fromAddress

        public static Name fromAddress(byte[] addr)
        Creates a reverse map name corresponding to an address contained in an array of 4 bytes (for an IPv4 address) or 16 bytes (for an IPv6 address).
        Parameters:
        addr - The address from which to build a name.
        Returns:
        The name corresponding to the address in the reverse map.
      • fromAddress

        public static Name fromAddress(int[] addr)
        Creates a reverse map name corresponding to an address contained in an array of 4 integers between 0 and 255 (for an IPv4 address) or 16 integers between 0 and 255 (for an IPv6 address).
        Parameters:
        addr - The address from which to build a name.
        Returns:
        The name corresponding to the address in the reverse map.
      • fromAddress

        public static Name fromAddress(InetAddress addr)
        Creates a reverse map name corresponding to an address contained in an InetAddress.
        Parameters:
        addr - The address from which to build a name.
        Returns:
        The name corresponding to the address in the reverse map.
      • fromAddress

        public static Name fromAddress(String addr,
                       int family)
                                throws UnknownHostException
        Creates a reverse map name corresponding to an address contained in a String.
        Parameters:
        addr - The address from which to build a name.
        Returns:
        The name corresponding to the address in the reverse map.
        Throws:
        UnknownHostException - The string does not contain a valid address.
      • fromAddress

        public static Name fromAddress(String addr)
                                throws UnknownHostException
        Creates a reverse map name corresponding to an address contained in a String.
        Parameters:
        addr - The address from which to build a name.
        Returns:
        The name corresponding to the address in the reverse map.
        Throws:
        UnknownHostException - The string does not contain a valid address.
dnsjava-2.1.5/doc/org/xbill/DNS/SIG0.html100644 0 0 32027 12131352546 15004 0ustar 0 0 SIG0 (dnsjava documentation)
org.xbill.DNS

Class SIG0



  • public class SIG0
    extends Object
    Creates SIG(0) transaction signatures.
    Author:
    Pasi Eronen, Brian Wellington
    • Method Detail

      • signMessage

        public static void signMessage(Message message,
                       KEYRecord key,
                       PrivateKey privkey,
                       SIGRecord previous)
                                throws DNSSEC.DNSSECException
        Sign a message with SIG(0). The DNS key and private key must refer to the same underlying cryptographic key.
        Parameters:
        message - The message to be signed
        key - The DNSKEY record to use as part of signing
        privkey - The PrivateKey to use when signing
        previous - If this message is a response, the SIG(0) from the query
        Throws:
        DNSSEC.DNSSECException
      • verifyMessage

        public static void verifyMessage(Message message,
                         byte[] b,
                         KEYRecord key,
                         SIGRecord previous)
                                  throws DNSSEC.DNSSECException
        Verify a message using SIG(0).
        Parameters:
        message - The message to be signed
        b - An array containing the message in unparsed form. This is necessary since SIG(0) signs the message in wire format, and we can't recreate the exact wire format (with the same name compression).
        key - The KEY record to verify the signature with.
        previous - If this message is a response, the SIG(0) from the query
        Throws:
        DNSSEC.DNSSECException
dnsjava-2.1.5/doc/org/xbill/DNS/SIGRecord.html100644 0 0 63467 12131352546 16077 0ustar 0 0 SIGRecord (dnsjava documentation)
org.xbill.DNS

Class SIGRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class SIGRecord
    extends Record
    Signature - A SIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver. The signature is usually generated by a key contained in a KEYRecord
    Author:
    Brian Wellington
    See Also:
    RRset, DNSSEC, KEYRecord, Serialized Form
    • Field Detail

      • covered

        protected int covered
      • alg

        protected int alg
      • labels

        protected int labels
      • origttl

        protected long origttl
      • expire

        protected Date expire
      • timeSigned

        protected Date timeSigned
      • footprint

        protected int footprint
      • signer

        protected Name signer
      • signature

        protected byte[] signature
    • Constructor Detail

      • SIGRecord

        public SIGRecord(Name name,
                 int dclass,
                 long ttl,
                 int covered,
                 int alg,
                 long origttl,
                 Date expire,
                 Date timeSigned,
                 int footprint,
                 Name signer,
                 byte[] signature)
        Creates an SIG Record from the given data
        Parameters:
        covered - The RRset type covered by this signature
        alg - The cryptographic algorithm of the key that generated the signature
        origttl - The original TTL of the RRset
        expire - The time at which the signature expires
        timeSigned - The time at which this signature was generated
        footprint - The footprint/key id of the signing key.
        signer - The owner of the signing key
        signature - Binary data representing the signature
    • Method Detail

      • getTypeCovered

        public int getTypeCovered()
        Returns the RRset type covered by this signature
      • getAlgorithm

        public int getAlgorithm()
        Returns the cryptographic algorithm of the key that generated the signature
      • getLabels

        public int getLabels()
        Returns the number of labels in the signed domain name. This may be different than the record's domain name if the record is a wildcard record.
      • getOrigTTL

        public long getOrigTTL()
        Returns the original TTL of the RRset
      • getExpire

        public Date getExpire()
        Returns the time at which the signature expires
      • getTimeSigned

        public Date getTimeSigned()
        Returns the time at which this signature was generated
      • getFootprint

        public int getFootprint()
        Returns The footprint/key id of the signing key.
      • getSigner

        public Name getSigner()
        Returns the owner of the signing key
      • getSignature

        public byte[] getSignature()
        Returns the binary data representing the signature
dnsjava-2.1.5/doc/org/xbill/DNS/SOARecord.html100644 0 0 45335 12131352546 16071 0ustar 0 0 SOARecord (dnsjava documentation)
org.xbill.DNS

Class SOARecord

    • Constructor Detail

      • SOARecord

        public SOARecord(Name name,
                 int dclass,
                 long ttl,
                 Name host,
                 Name admin,
                 long serial,
                 long refresh,
                 long retry,
                 long expire,
                 long minimum)
        Creates an SOA Record from the given data
        Parameters:
        host - The primary name server for the zone
        admin - The zone administrator's address
        serial - The zone's serial number
        refresh - The amount of time until a secondary checks for a new serial number
        retry - The amount of time between a secondary's checks for a new serial number
        expire - The amount of time until a secondary expires a zone
        minimum - The minimum TTL for records in the zone
    • Method Detail

      • getHost

        public Name getHost()
        Returns the primary name server
      • getAdmin

        public Name getAdmin()
        Returns the zone administrator's address
      • getSerial

        public long getSerial()
        Returns the zone's serial number
      • getRefresh

        public long getRefresh()
        Returns the zone refresh interval
      • getRetry

        public long getRetry()
        Returns the zone retry interval
      • getExpire

        public long getExpire()
        Returns the time until a secondary expires a zone
      • getMinimum

        public long getMinimum()
        Returns the minimum TTL for records in the zone
dnsjava-2.1.5/doc/org/xbill/DNS/SPFRecord.html100644 0 0 45450 12131352546 16075 0ustar 0 0 SPFRecord (dnsjava documentation)
org.xbill.DNS

Class SPFRecord

    • Field Detail

      • strings

        protected List strings
    • Constructor Detail

      • SPFRecord

        public SPFRecord(Name name,
                 int dclass,
                 long ttl,
                 List strings)
        Creates a SPF Record from the given data
        Parameters:
        strings - The text strings
        Throws:
        IllegalArgumentException - One of the strings has invalid escapes
      • SPFRecord

        public SPFRecord(Name name,
                 int dclass,
                 long ttl,
                 String string)
        Creates a SPF Record from the given data
        Parameters:
        string - One text string
        Throws:
        IllegalArgumentException - The string has invalid escapes
    • Method Detail

      • getStrings

        public List getStrings()
        Returns the text strings
        Returns:
        A list of Strings corresponding to the text strings.
      • getStringsAsByteArrays

        public List getStringsAsByteArrays()
        Returns the text strings
        Returns:
        A list of byte arrays corresponding to the text strings.
dnsjava-2.1.5/doc/org/xbill/DNS/SRVRecord.html100644 0 0 44060 12131352546 16113 0ustar 0 0 SRVRecord (dnsjava documentation)
org.xbill.DNS

Class SRVRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class SRVRecord
    extends Record
    Server Selection Record - finds hosts running services in a domain. An SRV record will normally be named _<service>._<protocol>.domain - examples would be _sips._tcp.example.org (for the secure SIP protocol) and _http._tcp.example.com (if HTTP used SRV records)
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • SRVRecord

        public SRVRecord(Name name,
                 int dclass,
                 long ttl,
                 int priority,
                 int weight,
                 int port,
                 Name target)
        Creates an SRV Record from the given data
        Parameters:
        priority - The priority of this SRV. Records with lower priority are preferred.
        weight - The weight, used to select between records at the same priority.
        port - The TCP/UDP port that the service uses
        target - The host running the service
    • Method Detail

      • getPriority

        public int getPriority()
        Returns the priority
      • getWeight

        public int getWeight()
        Returns the weight
      • getPort

        public int getPort()
        Returns the port that the service runs on
      • getTarget

        public Name getTarget()
        Returns the host running that the service
      • getAdditionalName

        public Name getAdditionalName()
        Description copied from class: Record
        Returns the name for which additional data processing should be done for this record. This can be used both for building responses and parsing responses.
        Overrides:
        getAdditionalName in class Record
        Returns:
        The name to used for additional data processing, or null if this record type does not require additional data processing.
dnsjava-2.1.5/doc/org/xbill/DNS/SSHFPRecord.Algorithm.html100644 0 0 23570 12131352546 20254 0ustar 0 0 SSHFPRecord.Algorithm (dnsjava documentation)
org.xbill.DNS

Class SSHFPRecord.Algorithm

  • Enclosing class:
    SSHFPRecord


    public static class SSHFPRecord.Algorithm
    extends Object
dnsjava-2.1.5/doc/org/xbill/DNS/SSHFPRecord.Digest.html100644 0 0 22537 12131352546 17547 0ustar 0 0 SSHFPRecord.Digest (dnsjava documentation)
org.xbill.DNS

Class SSHFPRecord.Digest

dnsjava-2.1.5/doc/org/xbill/DNS/SSHFPRecord.html100644 0 0 41443 12131352546 16326 0ustar 0 0 SSHFPRecord (dnsjava documentation)
org.xbill.DNS

Class SSHFPRecord

    • Constructor Detail

      • SSHFPRecord

        public SSHFPRecord(Name name,
                   int dclass,
                   long ttl,
                   int alg,
                   int digestType,
                   byte[] fingerprint)
        Creates an SSHFP Record from the given data.
        Parameters:
        alg - The public key's algorithm.
        digestType - The public key's digest type.
        fingerprint - The public key's fingerprint.
    • Method Detail

      • getAlgorithm

        public int getAlgorithm()
        Returns the public key's algorithm.
      • getDigestType

        public int getDigestType()
        Returns the public key's digest type.
      • getFingerPrint

        public byte[] getFingerPrint()
        Returns the fingerprint
dnsjava-2.1.5/doc/org/xbill/DNS/Section.html100644 0 0 42067 12131352546 15713 0ustar 0 0 Section (dnsjava documentation)
org.xbill.DNS

Class Section



  • public final class Section
    extends Object
    Constants and functions relating to DNS message sections
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int ADDITIONAL
      The additional (fourth) section
      static int ANSWER
      The answer (second) section
      static int AUTHORITY
      The authority (third) section
      static int PREREQ
      The prerequisite (second) section of a dynamic update message
      static int QUESTION
      The question (first) section
      static int UPDATE
      The update (third) section of a dynamic update message
      static int ZONE
      The zone (first) section of a dynamic update message
    • Field Detail

      • AUTHORITY

        public static final int AUTHORITY
        The authority (third) section
        See Also:
        Constant Field Values
      • ADDITIONAL

        public static final int ADDITIONAL
        The additional (fourth) section
        See Also:
        Constant Field Values
      • ZONE

        public static final int ZONE
        The zone (first) section of a dynamic update message
        See Also:
        Constant Field Values
      • PREREQ

        public static final int PREREQ
        The prerequisite (second) section of a dynamic update message
        See Also:
        Constant Field Values
      • UPDATE

        public static final int UPDATE
        The update (third) section of a dynamic update message
        See Also:
        Constant Field Values
    • Method Detail

      • string

        public static String string(int i)
        Converts a numeric Section into an abbreviation String
      • longString

        public static String longString(int i)
        Converts a numeric Section into a full description String
      • updString

        public static String updString(int i)
        Converts a numeric Section into a full description String for an update Message.
      • value

        public static int value(String s)
        Converts a String representation of a Section into its numeric value
dnsjava-2.1.5/doc/org/xbill/DNS/Serial.html100644 0 0 25663 12131352546 15531 0ustar 0 0 Serial (dnsjava documentation)
org.xbill.DNS

Class Serial



  • public final class Serial
    extends Object
    Helper functions for doing serial arithmetic. These should be used when setting/checking SOA serial numbers. SOA serial number arithmetic is defined in RFC 1982.
    Author:
    Brian Wellington
    • Method Detail

      • compare

        public static int compare(long serial1,
                  long serial2)
        Compares two numbers using serial arithmetic. The numbers are assumed to be 32 bit unsigned integers stored in longs.
        Parameters:
        serial1 - The first integer
        serial2 - The second integer
        Returns:
        0 if the 2 numbers are equal, a positive number if serial1 is greater than serial2, and a negative number if serial2 is greater than serial1.
        Throws:
        IllegalArgumentException - serial1 or serial2 is out of range
      • increment

        public static long increment(long serial)
        Increments a serial number. The number is assumed to be a 32 bit unsigned integer stored in a long. This basically adds 1 and resets the value to 0 if it is 2^32.
        Parameters:
        serial - The serial number
        Returns:
        The incremented serial number
        Throws:
        IllegalArgumentException - serial is out of range
dnsjava-2.1.5/doc/org/xbill/DNS/SetResponse.html100644 0 0 37627 12131352546 16567 0ustar 0 0 SetResponse (dnsjava documentation)
org.xbill.DNS

Class SetResponse



  • public class SetResponse
    extends Object
    The Response from a query to Cache.lookupRecords() or Zone.findRecords()
    Author:
    Brian Wellington
    See Also:
    Cache, Zone
    • Method Detail

      • isUnknown

        public boolean isUnknown()
        Is the answer to the query unknown?
      • isNXDOMAIN

        public boolean isNXDOMAIN()
        Is the answer to the query that the name does not exist?
      • isNXRRSET

        public boolean isNXRRSET()
        Is the answer to the query that the name exists, but the type does not?
      • isDelegation

        public boolean isDelegation()
        Is the result of the lookup that the name is below a delegation?
      • isCNAME

        public boolean isCNAME()
        Is the result of the lookup a CNAME?
      • isDNAME

        public boolean isDNAME()
        Is the result of the lookup a DNAME?
      • isSuccessful

        public boolean isSuccessful()
        Was the query successful?
      • answers

        public RRset[] answers()
        If the query was successful, return the answers
      • getCNAME

        public CNAMERecord getCNAME()
        If the query encountered a CNAME, return it.
      • getDNAME

        public DNAMERecord getDNAME()
        If the query encountered a DNAME, return it.
      • getNS

        public RRset getNS()
        If the query hit a delegation point, return the NS set.
      • toString

        public String toString()
        Prints the value of the SetResponse
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/SimpleResolver.html100644 0 0 104416 12131352546 17277 0ustar 0 0 SimpleResolver (dnsjava documentation)
org.xbill.DNS

Class SimpleResolver

  • All Implemented Interfaces:
    Resolver


    public class SimpleResolver
    extends Object
    implements Resolver
    An implementation of Resolver that sends one query to one server. SimpleResolver handles TCP retries, transaction security (TSIG), and EDNS 0.
    Author:
    Brian Wellington
    See Also:
    Resolver, TSIG, OPTRecord
    • Field Detail

      • DEFAULT_PORT

        public static final int DEFAULT_PORT
        The default port to send queries to
        See Also:
        Constant Field Values
      • DEFAULT_EDNS_PAYLOADSIZE

        public static final int DEFAULT_EDNS_PAYLOADSIZE
        The default EDNS payload size
        See Also:
        Constant Field Values
    • Method Detail

      • setDefaultResolver

        public static void setDefaultResolver(String hostname)
        Sets the default host (initially localhost) to query
      • setPort

        public void setPort(int port)
        Description copied from interface: Resolver
        Sets the port to communicate with on the server
        Specified by:
        setPort in interface Resolver
        Parameters:
        port - The port to send messages to
      • setAddress

        public void setAddress(InetSocketAddress addr)
        Sets the address of the server to communicate with.
        Parameters:
        addr - The address of the DNS server
      • setAddress

        public void setAddress(InetAddress addr)
        Sets the address of the server to communicate with (on the default DNS port)
        Parameters:
        addr - The address of the DNS server
      • setLocalAddress

        public void setLocalAddress(InetSocketAddress addr)
        Sets the local address to bind to when sending messages.
        Parameters:
        addr - The local address to send messages from.
      • setLocalAddress

        public void setLocalAddress(InetAddress addr)
        Sets the local address to bind to when sending messages. A random port will be used.
        Parameters:
        addr - The local address to send messages from.
      • setTCP

        public void setTCP(boolean flag)
        Description copied from interface: Resolver
        Sets whether TCP connections will be sent by default
        Specified by:
        setTCP in interface Resolver
        Parameters:
        flag - Indicates whether TCP connections are made
      • setIgnoreTruncation

        public void setIgnoreTruncation(boolean flag)
        Description copied from interface: Resolver
        Sets whether truncated responses will be ignored. If not, a truncated response over UDP will cause a retransmission over TCP.
        Specified by:
        setIgnoreTruncation in interface Resolver
        Parameters:
        flag - Indicates whether truncated responses should be ignored.
      • setEDNS

        public void setEDNS(int level,
                   int payloadSize,
                   int flags,
                   List options)
        Description copied from interface: Resolver
        Sets the EDNS information on outgoing messages.
        Specified by:
        setEDNS in interface Resolver
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
        payloadSize - The maximum DNS packet size that this host is capable of receiving over UDP. If 0 is specified, the default (1280) is used.
        flags - EDNS extended flags to be set in the OPT record.
        options - EDNS options to be set in the OPT record, specified as a List of OPTRecord.Option elements.
        See Also:
        OPTRecord
      • setEDNS

        public void setEDNS(int level)
        Description copied from interface: Resolver
        Sets the EDNS version used on outgoing messages.
        Specified by:
        setEDNS in interface Resolver
        Parameters:
        level - The EDNS level to use. 0 indicates EDNS0 and -1 indicates no EDNS.
      • setTSIGKey

        public void setTSIGKey(TSIG key)
        Description copied from interface: Resolver
        Specifies the TSIG key that messages will be signed with
        Specified by:
        setTSIGKey in interface Resolver
        Parameters:
        key - The key
      • setTimeout

        public void setTimeout(int secs,
                      int msecs)
        Description copied from interface: Resolver
        Sets the amount of time to wait for a response before giving up.
        Specified by:
        setTimeout in interface Resolver
        Parameters:
        secs - The number of seconds to wait.
        msecs - The number of milliseconds to wait.
      • setTimeout

        public void setTimeout(int secs)
        Description copied from interface: Resolver
        Sets the amount of time to wait for a response before giving up.
        Specified by:
        setTimeout in interface Resolver
        Parameters:
        secs - The number of seconds to wait.
      • send

        public Message send(Message query)
                     throws IOException
        Sends a message to a single server and waits for a response. No checking is done to ensure that the response is associated with the query.
        Specified by:
        send in interface Resolver
        Parameters:
        query - The query to send.
        Returns:
        The response.
        Throws:
        IOException - An error occurred while sending or receiving.
      • sendAsync

        public Object sendAsync(Message query,
                       ResolverListener listener)
        Asynchronously sends a message to a single server, registering a listener to receive a callback on success or exception. Multiple asynchronous lookups can be performed in parallel. Since the callback may be invoked before the function returns, external synchronization is necessary.
        Specified by:
        sendAsync in interface Resolver
        Parameters:
        query - The query to send
        listener - The object containing the callbacks.
        Returns:
        An identifier, which is also a parameter in the callback
dnsjava-2.1.5/doc/org/xbill/DNS/TKEYRecord.html100644 0 0 60645 12131352546 16224 0ustar 0 0 TKEYRecord (dnsjava documentation)
org.xbill.DNS

Class TKEYRecord

    • Field Detail

      • SERVERASSIGNED

        public static final int SERVERASSIGNED
        The key is assigned by the server (unimplemented)
        See Also:
        Constant Field Values
      • DIFFIEHELLMAN

        public static final int DIFFIEHELLMAN
        The key is computed using a Diffie-Hellman key exchange
        See Also:
        Constant Field Values
      • GSSAPI

        public static final int GSSAPI
        The key is computed using GSS_API (unimplemented)
        See Also:
        Constant Field Values
      • RESOLVERASSIGNED

        public static final int RESOLVERASSIGNED
        The key is assigned by the resolver (unimplemented)
        See Also:
        Constant Field Values
    • Constructor Detail

      • TKEYRecord

        public TKEYRecord(Name name,
                  int dclass,
                  long ttl,
                  Name alg,
                  Date timeInception,
                  Date timeExpire,
                  int mode,
                  int error,
                  byte[] key,
                  byte[] other)
        Creates a TKEY Record from the given data.
        Parameters:
        alg - The shared key's algorithm
        timeInception - The beginning of the validity period of the shared secret or keying material
        timeExpire - The end of the validity period of the shared secret or keying material
        mode - The mode of key agreement
        error - The extended error field. Should be 0 in queries
        key - The shared secret
        other - The other data field. Currently unused responses.
    • Method Detail

      • modeString

        protected String modeString()
      • getAlgorithm

        public Name getAlgorithm()
        Returns the shared key's algorithm
      • getTimeInception

        public Date getTimeInception()
        Returns the beginning of the validity period of the shared secret or keying material
      • getTimeExpire

        public Date getTimeExpire()
        Returns the end of the validity period of the shared secret or keying material
      • getMode

        public int getMode()
        Returns the key agreement mode
      • getError

        public int getError()
        Returns the extended error
      • getKey

        public byte[] getKey()
        Returns the shared secret or keying material
      • getOther

        public byte[] getOther()
        Returns the other data
dnsjava-2.1.5/doc/org/xbill/DNS/TLSARecord.CertificateUsage.html100644 0 0 26734 12131352546 21422 0ustar 0 0 TLSARecord.CertificateUsage (dnsjava documentation)
org.xbill.DNS

Class TLSARecord.CertificateUsage

  • Enclosing class:
    TLSARecord


    public static class TLSARecord.CertificateUsage
    extends Object
dnsjava-2.1.5/doc/org/xbill/DNS/TLSARecord.MatchingType.html100644 0 0 25552 12131352546 20604 0ustar 0 0 TLSARecord.MatchingType (dnsjava documentation)
org.xbill.DNS

Class TLSARecord.MatchingType

  • Enclosing class:
    TLSARecord


    public static class TLSARecord.MatchingType
    extends Object
    • Field Detail

      • SHA256

        public static final int SHA256
        SHA-256 hash of selected content [RFC6234]
        See Also:
        Constant Field Values
      • SHA512

        public static final int SHA512
        SHA-512 hash of selected content [RFC6234]
        See Also:
        Constant Field Values
dnsjava-2.1.5/doc/org/xbill/DNS/TLSARecord.Selector.html100644 0 0 24644 12131352546 17771 0ustar 0 0 TLSARecord.Selector (dnsjava documentation)
org.xbill.DNS

Class TLSARecord.Selector

  • Enclosing class:
    TLSARecord


    public static class TLSARecord.Selector
    extends Object
    • Field Detail

      • FULL_CERTIFICATE

        public static final int FULL_CERTIFICATE
        Full certificate; the Certificate binary structure defined in [RFC5280]
        See Also:
        Constant Field Values
      • SUBJECT_PUBLIC_KEY_INFO

        public static final int SUBJECT_PUBLIC_KEY_INFO
        SubjectPublicKeyInfo; DER-encoded binary structure defined in [RFC5280]
        See Also:
        Constant Field Values
dnsjava-2.1.5/doc/org/xbill/DNS/TLSARecord.html100644 0 0 44220 12131352546 16202 0ustar 0 0 TLSARecord (dnsjava documentation)
org.xbill.DNS

Class TLSARecord

    • Constructor Detail

      • TLSARecord

        public TLSARecord(Name name,
                  int dclass,
                  long ttl,
                  int certificateUsage,
                  int selector,
                  int matchingType,
                  byte[] certificateAssociationData)
        Creates an TLSA Record from the given data
        Parameters:
        certificateUsage - The provided association that will be used to match the certificate presented in the TLS handshake.
        selector - The part of the TLS certificate presented by the server that will be matched against the association data.
        matchingType - How the certificate association is presented.
        certificateAssociationData - The "certificate association data" to be matched.
    • Method Detail

      • getCertificateUsage

        public int getCertificateUsage()
        Returns the certificate usage of the TLSA record
      • getSelector

        public int getSelector()
        Returns the selector of the TLSA record
      • getMatchingType

        public int getMatchingType()
        Returns the matching type of the TLSA record
      • getCertificateAssociationData

        public final byte[] getCertificateAssociationData()
        Returns the certificate associate data of this TLSA record
dnsjava-2.1.5/doc/org/xbill/DNS/TSIG.StreamVerifier.html100644 0 0 27417 12131352546 20005 0ustar 0 0 TSIG.StreamVerifier (dnsjava documentation)
org.xbill.DNS

Class TSIG.StreamVerifier

  • Enclosing class:
    TSIG


    public static class TSIG.StreamVerifier
    extends Object
    • Constructor Detail

      • TSIG.StreamVerifier

        public TSIG.StreamVerifier(TSIG tsig,
                           TSIGRecord old)
        Creates an object to verify a multiple message response
    • Method Detail

      • verify

        public int verify(Message m,
                 byte[] b)
        Verifies a TSIG record on an incoming message that is part of a multiple message response. TSIG records must be present on the first and last messages, and at least every 100 records in between. After calling this routine, Message.isVerified() may be called on this message.
        Parameters:
        m - The message
        b - The message in unparsed form
        Returns:
        The result of the verification (as an Rcode)
        See Also:
        Rcode
dnsjava-2.1.5/doc/org/xbill/DNS/TSIG.html100644 0 0 112603 12131352546 15067 0ustar 0 0 TSIG (dnsjava documentation)
org.xbill.DNS

Class TSIG



  • public class TSIG
    extends Object
    Transaction signature handling. This class generates and verifies TSIG records on messages, which provide transaction security.
    Author:
    Brian Wellington
    See Also:
    TSIGRecord
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class and Description
      static class  TSIG.StreamVerifier 
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static short FUDGE
      The default fudge value for outgoing packets.
      static Name HMAC
      The domain name representing the HMAC-MD5 algorithm (deprecated).
      static Name HMAC_MD5
      The domain name representing the HMAC-MD5 algorithm.
      static Name HMAC_SHA1
      The domain name representing the HMAC-SHA1 algorithm.
      static Name HMAC_SHA224
      The domain name representing the HMAC-SHA224 algorithm.
      static Name HMAC_SHA256
      The domain name representing the HMAC-SHA256 algorithm.
      static Name HMAC_SHA384
      The domain name representing the HMAC-SHA384 algorithm.
      static Name HMAC_SHA512
      The domain name representing the HMAC-SHA512 algorithm.
    • Constructor Summary

      Constructors 
      Constructor and Description
      TSIG(Name name, byte[] key)
      Creates a new TSIG key with the hmac-md5 algorithm, which can be used to sign or verify a message.
      TSIG(Name algorithm, Name name, byte[] key)
      Creates a new TSIG key, which can be used to sign or verify a message.
      TSIG(Name algorithm, String name, String key)
      Creates a new TSIG object, which can be used to sign or verify a message.
      TSIG(String name, String key)
      Creates a new TSIG object with the hmac-md5 algorithm, which can be used to sign or verify a message.
      TSIG(String algorithm, String name, String key)
      Creates a new TSIG object, which can be used to sign or verify a message.
    • Field Detail

      • HMAC_MD5

        public static final Name HMAC_MD5
        The domain name representing the HMAC-MD5 algorithm.
      • HMAC

        public static final Name HMAC
        The domain name representing the HMAC-MD5 algorithm (deprecated).
      • HMAC_SHA1

        public static final Name HMAC_SHA1
        The domain name representing the HMAC-SHA1 algorithm.
      • HMAC_SHA224

        public static final Name HMAC_SHA224
        The domain name representing the HMAC-SHA224 algorithm. Note that SHA224 is not supported by Java out-of-the-box, this requires use of a third party provider like BouncyCastle.org.
      • HMAC_SHA256

        public static final Name HMAC_SHA256
        The domain name representing the HMAC-SHA256 algorithm.
      • HMAC_SHA384

        public static final Name HMAC_SHA384
        The domain name representing the HMAC-SHA384 algorithm.
      • HMAC_SHA512

        public static final Name HMAC_SHA512
        The domain name representing the HMAC-SHA512 algorithm.
      • FUDGE

        public static final short FUDGE
        The default fudge value for outgoing packets. Can be overriden by the tsigfudge option.
        See Also:
        Constant Field Values
    • Constructor Detail

      • TSIG

        public TSIG(Name algorithm,
            Name name,
            byte[] key)
        Creates a new TSIG key, which can be used to sign or verify a message.
        Parameters:
        algorithm - The algorithm of the shared key.
        name - The name of the shared key.
        key - The shared key's data.
      • TSIG

        public TSIG(Name name,
            byte[] key)
        Creates a new TSIG key with the hmac-md5 algorithm, which can be used to sign or verify a message.
        Parameters:
        name - The name of the shared key.
        key - The shared key's data.
      • TSIG

        public TSIG(Name algorithm,
            String name,
            String key)
        Creates a new TSIG object, which can be used to sign or verify a message.
        Parameters:
        name - The name of the shared key.
        key - The shared key's data represented as a base64 encoded string.
        Throws:
        IllegalArgumentException - The key name is an invalid name
        IllegalArgumentException - The key data is improperly encoded
      • TSIG

        public TSIG(String algorithm,
            String name,
            String key)
        Creates a new TSIG object, which can be used to sign or verify a message.
        Parameters:
        name - The name of the shared key.
        algorithm - The algorithm of the shared key. The legal values are "hmac-md5", "hmac-sha1", "hmac-sha224", "hmac-sha256", "hmac-sha384", and "hmac-sha512".
        key - The shared key's data represented as a base64 encoded string.
        Throws:
        IllegalArgumentException - The key name is an invalid name
        IllegalArgumentException - The key data is improperly encoded
      • TSIG

        public TSIG(String name,
            String key)
        Creates a new TSIG object with the hmac-md5 algorithm, which can be used to sign or verify a message.
        Parameters:
        name - The name of the shared key
        key - The shared key's data, represented as a base64 encoded string.
        Throws:
        IllegalArgumentException - The key name is an invalid name
        IllegalArgumentException - The key data is improperly encoded
    • Method Detail

      • fromString

        public static TSIG fromString(String str)
        Creates a new TSIG object, which can be used to sign or verify a message.
        Parameters:
        str - The TSIG key, in the form name:secret, name/secret, alg:name:secret, or alg/name/secret. If an algorithm is specified, it must be "hmac-md5", "hmac-sha1", or "hmac-sha256".
        Throws:
        IllegalArgumentException - The string does not contain both a name and secret.
        IllegalArgumentException - The key name is an invalid name
        IllegalArgumentException - The key data is improperly encoded
      • generate

        public TSIGRecord generate(Message m,
                          byte[] b,
                          int error,
                          TSIGRecord old)
        Generates a TSIG record with a specific error for a message that has been rendered.
        Parameters:
        m - The message
        b - The rendered message
        error - The error
        old - If this message is a response, the TSIG from the request
        Returns:
        The TSIG record to be added to the message
      • apply

        public void apply(Message m,
                 int error,
                 TSIGRecord old)
        Generates a TSIG record with a specific error for a message and adds it to the message.
        Parameters:
        m - The message
        error - The error
        old - If this message is a response, the TSIG from the request
      • apply

        public void apply(Message m,
                 TSIGRecord old)
        Generates a TSIG record for a message and adds it to the message
        Parameters:
        m - The message
        old - If this message is a response, the TSIG from the request
      • applyStream

        public void applyStream(Message m,
                       TSIGRecord old,
                       boolean first)
        Generates a TSIG record for a message and adds it to the message
        Parameters:
        m - The message
        old - If this message is a response, the TSIG from the request
      • verify

        public byte verify(Message m,
                  byte[] b,
                  int length,
                  TSIGRecord old)
        Verifies a TSIG record on an incoming message. Since this is only called in the context where a TSIG is expected to be present, it is an error if one is not present. After calling this routine, Message.isVerified() may be called on this message.
        Parameters:
        m - The message
        b - An array containing the message in unparsed form. This is necessary since TSIG signs the message in wire format, and we can't recreate the exact wire format (with the same name compression).
        length - The length of the message in the array.
        old - If this message is a response, the TSIG from the request
        Returns:
        The result of the verification (as an Rcode)
        See Also:
        Rcode
      • verify

        public int verify(Message m,
                 byte[] b,
                 TSIGRecord old)
        Verifies a TSIG record on an incoming message. Since this is only called in the context where a TSIG is expected to be present, it is an error if one is not present. After calling this routine, Message.isVerified() may be called on this message.
        Parameters:
        m - The message
        b - The message in unparsed form. This is necessary since TSIG signs the message in wire format, and we can't recreate the exact wire format (with the same name compression).
        old - If this message is a response, the TSIG from the request
        Returns:
        The result of the verification (as an Rcode)
        See Also:
        Rcode
      • recordLength

        public int recordLength()
        Returns the maximum length of a TSIG record generated by this key.
        See Also:
        TSIGRecord
dnsjava-2.1.5/doc/org/xbill/DNS/TSIGRecord.html100644 0 0 47072 12131352546 16215 0ustar 0 0 TSIGRecord (dnsjava documentation)
org.xbill.DNS

Class TSIGRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class TSIGRecord
    extends Record
    Transaction Signature - this record is automatically generated by the resolver. TSIG records provide transaction security between the sender and receiver of a message, using a shared key.
    Author:
    Brian Wellington
    See Also:
    Resolver, TSIG, Serialized Form
    • Constructor Detail

      • TSIGRecord

        public TSIGRecord(Name name,
                  int dclass,
                  long ttl,
                  Name alg,
                  Date timeSigned,
                  int fudge,
                  byte[] signature,
                  int originalID,
                  int error,
                  byte[] other)
        Creates a TSIG Record from the given data. This is normally called by the TSIG class
        Parameters:
        alg - The shared key's algorithm
        timeSigned - The time that this record was generated
        fudge - The fudge factor for time - if the time that the message is received is not in the range [now - fudge, now + fudge], the signature fails
        signature - The signature
        originalID - The message ID at the time of its generation
        error - The extended error field. Should be 0 in queries.
        other - The other data field. Currently used only in BADTIME responses.
        See Also:
        TSIG
    • Method Detail

      • getAlgorithm

        public Name getAlgorithm()
        Returns the shared key's algorithm
      • getTimeSigned

        public Date getTimeSigned()
        Returns the time that this record was generated
      • getFudge

        public int getFudge()
        Returns the time fudge factor
      • getSignature

        public byte[] getSignature()
        Returns the signature
      • getOriginalID

        public int getOriginalID()
        Returns the original message ID
      • getError

        public int getError()
        Returns the extended error
      • getOther

        public byte[] getOther()
        Returns the other data
dnsjava-2.1.5/doc/org/xbill/DNS/TTL.html100644 0 0 33143 12131352546 14745 0ustar 0 0 TTL (dnsjava documentation)
org.xbill.DNS

Class TTL



  • public final class TTL
    extends Object
    Routines for parsing BIND-style TTL values. These values consist of numbers followed by 1 letter units of time (W - week, D - day, H - hour, M - minute, S - second).
    Author:
    Brian Wellington
    • Method Detail

      • parse

        public static long parse(String s,
                 boolean clamp)
        Parses a TTL-like value, which can either be expressed as a number or a BIND-style string with numbers and units.
        Parameters:
        s - The string representing the numeric value.
        clamp - Whether to clamp values in the range [MAX_VALUE + 1, 2^32 -1] to MAX_VALUE. This should be donw for TTLs, but not other values which can be expressed in this format.
        Returns:
        The value as a number of seconds
        Throws:
        NumberFormatException - The string was not in a valid TTL format.
      • parseTTL

        public static long parseTTL(String s)
        Parses a TTL, which can either be expressed as a number or a BIND-style string with numbers and units.
        Parameters:
        s - The string representing the TTL
        Returns:
        The TTL as a number of seconds
        Throws:
        NumberFormatException - The string was not in a valid TTL format.
      • format

        public static String format(long ttl)
dnsjava-2.1.5/doc/org/xbill/DNS/TXTRecord.html100644 0 0 45374 12131352546 16131 0ustar 0 0 TXTRecord (dnsjava documentation)
org.xbill.DNS

Class TXTRecord

    • Field Detail

      • strings

        protected List strings
    • Constructor Detail

      • TXTRecord

        public TXTRecord(Name name,
                 int dclass,
                 long ttl,
                 List strings)
        Creates a TXT Record from the given data
        Parameters:
        strings - The text strings
        Throws:
        IllegalArgumentException - One of the strings has invalid escapes
      • TXTRecord

        public TXTRecord(Name name,
                 int dclass,
                 long ttl,
                 String string)
        Creates a TXT Record from the given data
        Parameters:
        string - One text string
        Throws:
        IllegalArgumentException - The string has invalid escapes
    • Method Detail

      • getStrings

        public List getStrings()
        Returns the text strings
        Returns:
        A list of Strings corresponding to the text strings.
      • getStringsAsByteArrays

        public List getStringsAsByteArrays()
        Returns the text strings
        Returns:
        A list of byte arrays corresponding to the text strings.
dnsjava-2.1.5/doc/org/xbill/DNS/TextParseException.html100644 0 0 32623 12131352546 20102 0ustar 0 0 TextParseException (dnsjava documentation)
org.xbill.DNS

Class TextParseException

  • All Implemented Interfaces:
    Serializable


    public class TextParseException
    extends IOException
    An exception thrown when unable to parse text.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • TextParseException

        public TextParseException()
      • TextParseException

        public TextParseException(String s)
dnsjava-2.1.5/doc/org/xbill/DNS/Tokenizer.Token.html100644 0 0 31045 12131352546 17332 0ustar 0 0 Tokenizer.Token (dnsjava documentation)
org.xbill.DNS

Class Tokenizer.Token

  • Enclosing class:
    Tokenizer


    public static class Tokenizer.Token
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      int type
      The type of token.
      String value
      The value of the token, or null for tokens without values.
    • Field Detail

      • type

        public int type
        The type of token.
      • value

        public String value
        The value of the token, or null for tokens without values.
    • Method Detail

      • toString

        public String toString()
        Converts the token to a string containing a representation useful for debugging.
        Overrides:
        toString in class Object
      • isString

        public boolean isString()
        Indicates whether this token contains a string.
      • isEOL

        public boolean isEOL()
        Indicates whether this token contains an EOL or EOF.
dnsjava-2.1.5/doc/org/xbill/DNS/Tokenizer.html100644 0 0 141323 12131352546 16274 0ustar 0 0 Tokenizer (dnsjava documentation)
org.xbill.DNS

Class Tokenizer



  • public class Tokenizer
    extends Object
    Tokenizer is used to parse DNS records and zones from text format,
    Author:
    Brian Wellington, Bob Halley
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class and Description
      static class  Tokenizer.Token 
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int COMMENT
      A comment; only returned when wantComment is set
      static int EOF
      End of file
      static int EOL
      End of line
      static int IDENTIFIER
      An identifier (unquoted string)
      static int QUOTED_STRING
      A quoted string
      static int WHITESPACE
      Whitespace; only returned when wantWhitespace is set
    • Constructor Summary

      Constructors 
      Constructor and Description
      Tokenizer(File f)
      Creates a Tokenizer from a file.
      Tokenizer(InputStream is)
      Creates a Tokenizer from an arbitrary input stream.
      Tokenizer(String s)
      Creates a Tokenizer from a string.
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void close()
      Closes any files opened by this tokenizer.
      TextParseException exception(String s)
      Creates an exception which includes the current state in the error message
      protected void finalize() 
      Tokenizer.Token get()
      Gets the next token from a tokenizer, ignoring whitespace and comments.
      Tokenizer.Token get(boolean wantWhitespace, boolean wantComment)
      Gets the next token from a tokenizer.
      InetAddress getAddress(int family)
      Gets the next token from a tokenizer and converts it to an IP Address.
      byte[] getBase32String(base32 b32)
      Gets the next token from a tokenizer and decodes it as base32.
      byte[] getBase64()
      Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
      byte[] getBase64(boolean required)
      Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
      void getEOL()
      Gets the next token from a tokenizer, which must be an EOL or EOF.
      byte[] getHex()
      Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
      byte[] getHex(boolean required)
      Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
      byte[] getHexString()
      Gets the next token from a tokenizer and decodes it as hex.
      String getIdentifier()
      Gets the next token from a tokenizer, ensures it is an unquoted string, and converts it to a string.
      long getLong()
      Gets the next token from a tokenizer and converts it to a long.
      Name getName(Name origin)
      Gets the next token from a tokenizer and converts it to a name.
      String getString()
      Gets the next token from a tokenizer and converts it to a string.
      long getTTL()
      Gets the next token from a tokenizer and parses it as a TTL.
      long getTTLLike()
      Gets the next token from a tokenizer and parses it as if it were a TTL.
      int getUInt16()
      Gets the next token from a tokenizer and converts it to an unsigned 16 bit integer.
      long getUInt32()
      Gets the next token from a tokenizer and converts it to an unsigned 32 bit integer.
      int getUInt8()
      Gets the next token from a tokenizer and converts it to an unsigned 8 bit integer.
      void unget()
      Returns a token to the stream, so that it will be returned by the next call to get().
    • Constructor Detail

      • Tokenizer

        public Tokenizer(InputStream is)
        Creates a Tokenizer from an arbitrary input stream.
        Parameters:
        is - The InputStream to tokenize.
      • Tokenizer

        public Tokenizer(String s)
        Creates a Tokenizer from a string.
        Parameters:
        s - The String to tokenize.
    • Method Detail

      • get

        public Tokenizer.Token get(boolean wantWhitespace,
                          boolean wantComment)
                            throws IOException
        Gets the next token from a tokenizer.
        Parameters:
        wantWhitespace - If true, leading whitespace will be returned as a token.
        wantComment - If true, comments are returned as tokens.
        Returns:
        The next token in the stream.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • unget

        public void unget()
        Returns a token to the stream, so that it will be returned by the next call to get().
        Throws:
        IllegalStateException - There are already ungotten tokens.
      • getString

        public String getString()
                         throws IOException
        Gets the next token from a tokenizer and converts it to a string.
        Returns:
        The next token in the stream, as a string.
        Throws:
        TextParseException - The input was invalid or not a string.
        IOException - An I/O error occurred.
      • getIdentifier

        public String getIdentifier()
                             throws IOException
        Gets the next token from a tokenizer, ensures it is an unquoted string, and converts it to a string.
        Returns:
        The next token in the stream, as a string.
        Throws:
        TextParseException - The input was invalid or not an unquoted string.
        IOException - An I/O error occurred.
      • getLong

        public long getLong()
                     throws IOException
        Gets the next token from a tokenizer and converts it to a long.
        Returns:
        The next token in the stream, as a long.
        Throws:
        TextParseException - The input was invalid or not a long.
        IOException - An I/O error occurred.
      • getUInt32

        public long getUInt32()
                       throws IOException
        Gets the next token from a tokenizer and converts it to an unsigned 32 bit integer.
        Returns:
        The next token in the stream, as an unsigned 32 bit integer.
        Throws:
        TextParseException - The input was invalid or not an unsigned 32 bit integer.
        IOException - An I/O error occurred.
      • getUInt16

        public int getUInt16()
                      throws IOException
        Gets the next token from a tokenizer and converts it to an unsigned 16 bit integer.
        Returns:
        The next token in the stream, as an unsigned 16 bit integer.
        Throws:
        TextParseException - The input was invalid or not an unsigned 16 bit integer.
        IOException - An I/O error occurred.
      • getUInt8

        public int getUInt8()
                     throws IOException
        Gets the next token from a tokenizer and converts it to an unsigned 8 bit integer.
        Returns:
        The next token in the stream, as an unsigned 8 bit integer.
        Throws:
        TextParseException - The input was invalid or not an unsigned 8 bit integer.
        IOException - An I/O error occurred.
      • getTTL

        public long getTTL()
                    throws IOException
        Gets the next token from a tokenizer and parses it as a TTL.
        Returns:
        The next token in the stream, as an unsigned 32 bit integer.
        Throws:
        TextParseException - The input was not valid.
        IOException - An I/O error occurred.
        See Also:
        TTL
      • getTTLLike

        public long getTTLLike()
                        throws IOException
        Gets the next token from a tokenizer and parses it as if it were a TTL.
        Returns:
        The next token in the stream, as an unsigned 32 bit integer.
        Throws:
        TextParseException - The input was not valid.
        IOException - An I/O error occurred.
        See Also:
        TTL
      • getName

        public Name getName(Name origin)
                     throws IOException
        Gets the next token from a tokenizer and converts it to a name.
        Parameters:
        origin - The origin to append to relative names.
        Returns:
        The next token in the stream, as a name.
        Throws:
        TextParseException - The input was invalid or not a valid name.
        IOException - An I/O error occurred.
        RelativeNameException - The parsed name was relative, even with the origin.
        See Also:
        Name
      • getAddress

        public InetAddress getAddress(int family)
                               throws IOException
        Gets the next token from a tokenizer and converts it to an IP Address.
        Parameters:
        family - The address family.
        Returns:
        The next token in the stream, as an InetAddress
        Throws:
        TextParseException - The input was invalid or not a valid address.
        IOException - An I/O error occurred.
        See Also:
        Address
      • getEOL

        public void getEOL()
                    throws IOException
        Gets the next token from a tokenizer, which must be an EOL or EOF.
        Throws:
        TextParseException - The input was invalid or not an EOL or EOF token.
        IOException - An I/O error occurred.
      • getBase64

        public byte[] getBase64(boolean required)
                         throws IOException
        Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
        Parameters:
        required - If true, an exception will be thrown if no strings remain; otherwise null be be returned.
        Returns:
        The byte array containing the decoded strings, or null if there were no strings to decode.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • getBase64

        public byte[] getBase64()
                         throws IOException
        Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the base64 encoded data to a byte array.
        Returns:
        The byte array containing the decoded strings, or null if there were no strings to decode.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • getHex

        public byte[] getHex(boolean required)
                      throws IOException
        Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
        Parameters:
        required - If true, an exception will be thrown if no strings remain; otherwise null be be returned.
        Returns:
        The byte array containing the decoded strings, or null if there were no strings to decode.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • getHex

        public byte[] getHex()
                      throws IOException
        Gets the remaining string tokens until an EOL/EOF is seen, concatenates them together, and converts the hex encoded data to a byte array.
        Returns:
        The byte array containing the decoded strings, or null if there were no strings to decode.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • getHexString

        public byte[] getHexString()
                            throws IOException
        Gets the next token from a tokenizer and decodes it as hex.
        Returns:
        The byte array containing the decoded string.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • getBase32String

        public byte[] getBase32String(base32 b32)
                               throws IOException
        Gets the next token from a tokenizer and decodes it as base32.
        Parameters:
        b32 - The base32 context to decode with.
        Returns:
        The byte array containing the decoded string.
        Throws:
        TextParseException - The input was invalid.
        IOException - An I/O error occurred.
      • exception

        public TextParseException exception(String s)
        Creates an exception which includes the current state in the error message
        Parameters:
        s - The error message to include.
        Returns:
        The exception to be thrown
      • close

        public void close()
        Closes any files opened by this tokenizer.
      • finalize

        protected void finalize()
        Overrides:
        finalize in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/Type.html100644 0 0 140141 12131352546 15240 0ustar 0 0 Type (dnsjava documentation)
org.xbill.DNS

Class Type



  • public final class Type
    extends Object
    Constants and functions relating to DNS Types
    Author:
    Brian Wellington
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int A
      Address
      static int A6
      IPv6 address (experimental)
      static int AAAA
      IPv6 address
      static int AFSDB
      AFS cell database
      static int ANY
      Matches any type
      static int APL
      Address Prefix List
      static int ATMA
      ATM address
      static int AXFR
      Zone transfer
      static int CERT
      Certificate
      static int CNAME
      Canonical name (alias)
      static int DHCID
      Dynamic Host Configuration Protocol (DHCP) ID
      static int DLV
      DNSSEC Lookaside Validation, RFC 4431 .
      static int DNAME
      Non-terminal name redirection
      static int DNSKEY
      DNSSEC Key
      static int DS
      Delegation Signer
      static int EID
      Endpoint identifier
      static int GPOS
      Geographical position (withdrawn)
      static int HINFO
      Host information
      static int IPSECKEY
      IPSEC key
      static int ISDN
      ISDN calling address
      static int IXFR
      Incremental zone transfer
      static int KEY
      Key
      static int KX
      Key exchange
      static int LOC
      Location
      static int MAILA
      Transfer mail agent records
      static int MAILB
      Transfer mailbox records
      static int MB
      Mailbox domain name
      static int MD
      Mail destination
      static int MF
      Mail forwarder
      static int MG
      Mail group member
      static int MINFO
      Mailbox information
      static int MR
      Mail rename name
      static int MX
      Mail routing information
      static int NAPTR
      Naming authority pointer
      static int NIMLOC
      Nimrod locator
      static int NS
      Name server
      static int NSAP
      NSAP address
      static int NSAP_PTR
      Reverse NSAP address (deprecated)
      static int NSEC
      Next Secure Name
      static int NSEC3
      Next SECure, 3rd edition, RFC 5155
      static int NSEC3PARAM
      Next SECure PARAMeter, RFC 5155
      static int NULL
      Null record
      static int NXT
      Next valid name in zone
      static int OPT
      Options - contains EDNS metadata
      static int PTR
      Domain name pointer
      static int PX
      X.400 mail mapping
      static int RP
      Responsible person
      static int RRSIG
      Resource Record Signature
      static int RT
      Router
      static int SIG
      Signature
      static int SOA
      Start of authority
      static int SPF
      Sender Policy Framework (experimental)
      static int SRV
      Server selection
      static int SSHFP
      SSH Key Fingerprint
      static int TKEY
      Transaction key - used to compute a shared secret or exchange a key
      static int TLSA
      Transport Layer Security Authentication, draft-ietf-dane-protocol-23
      static int TSIG
      Transaction signature
      static int TXT
      Text strings
      static int WKS
      Well known services
      static int X25
      X.25 calling address
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      static void check(int val)
      Checks that a numeric Type is valid.
      static boolean isRR(int type)
      Is this type valid for a record (a non-meta type)?
      static String string(int val)
      Converts a numeric Type into a String
      static int value(String s)
      Converts a String representation of an Type into its numeric value
      static int value(String s, boolean numberok)
      Converts a String representation of an Type into its numeric value.
dnsjava-2.1.5/doc/org/xbill/DNS/UNKRecord.html100644 0 0 31212 12131352546 16071 0ustar 0 0 UNKRecord (dnsjava documentation)
org.xbill.DNS

Class UNKRecord

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class UNKRecord
    extends Record
    A class implementing Records of unknown and/or unimplemented types. This class can only be initialized using static Record initializers.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Method Detail

      • getData

        public byte[] getData()
        Returns the contents of this record.
dnsjava-2.1.5/doc/org/xbill/DNS/Update.html100644 0 0 121363 12131352546 15546 0ustar 0 0 Update (dnsjava documentation)
org.xbill.DNS

Class Update

  • All Implemented Interfaces:
    Cloneable


    public class Update
    extends Message
    A helper class for constructing dynamic DNS (DDNS) update messages.
    Author:
    Brian Wellington
    • Constructor Summary

      Constructors 
      Constructor and Description
      Update(Name zone)
      Creates an update message.
      Update(Name zone, int dclass)
      Creates an update message.
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void absent(Name name)
      Inserts a prerequisite that the specified name does not exist; that is, there are no records with the given name in the zone.
      void absent(Name name, int type)
      Inserts a prerequisite that the specified rrset does not exist; that is, there are no records with the given name and type in the zone.
      void add(Name name, int type, long ttl, String record)
      Parses a record from the string, and indicates that the record should be inserted into the zone.
      void add(Name name, int type, long ttl, Tokenizer tokenizer)
      Parses a record from the tokenizer, and indicates that the record should be inserted into the zone.
      void add(Record record)
      Indicates that the record should be inserted into the zone.
      void add(Record[] records)
      Indicates that the records should be inserted into the zone.
      void add(RRset rrset)
      Indicates that all of the records in the rrset should be inserted into the zone.
      void delete(Name name)
      Indicates that all records with the given name should be deleted from the zone.
      void delete(Name name, int type)
      Indicates that all records with the given name and type should be deleted from the zone.
      void delete(Name name, int type, String record)
      Parses a record from the string, and indicates that the record should be deleted from the zone.
      void delete(Name name, int type, Tokenizer tokenizer)
      Parses a record from the tokenizer, and indicates that the record should be deleted from the zone.
      void delete(Record record)
      Indicates that the specified record should be deleted from the zone.
      void delete(Record[] records)
      Indicates that the records should be deleted from the zone.
      void delete(RRset rrset)
      Indicates that all of the records in the rrset should be deleted from the zone.
      void present(Name name)
      Inserts a prerequisite that the specified name exists; that is, there exist records with the given name in the zone.
      void present(Name name, int type)
      Inserts a prerequisite that the specified rrset exists; that is, there exist records with the given name and type in the zone.
      void present(Name name, int type, String record)
      Parses a record from the string, and inserts a prerequisite that the record exists.
      void present(Name name, int type, Tokenizer tokenizer)
      Parses a record from the tokenizer, and inserts a prerequisite that the record exists.
      void present(Record record)
      Inserts a prerequisite that the specified record exists.
      void replace(Name name, int type, long ttl, String record)
      Parses a record from the string, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
      void replace(Name name, int type, long ttl, Tokenizer tokenizer)
      Parses a record from the tokenizer, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
      void replace(Record record)
      Indicates that the record should be inserted into the zone replacing any other records with the same name and type.
      void replace(Record[] records)
      Indicates that the records should be inserted into the zone replacing any other records with the same name and type as each one.
      void replace(RRset rrset)
      Indicates that all of the records in the rrset should be inserted into the zone replacing any other records with the same name and type.
    • Constructor Detail

      • Update

        public Update(Name zone,
              int dclass)
        Creates an update message.
        Parameters:
        zone - The name of the zone being updated.
        dclass - The class of the zone being updated.
      • Update

        public Update(Name zone)
        Creates an update message. The class is assumed to be IN.
        Parameters:
        zone - The name of the zone being updated.
    • Method Detail

      • present

        public void present(Name name)
        Inserts a prerequisite that the specified name exists; that is, there exist records with the given name in the zone.
      • present

        public void present(Name name,
                   int type)
        Inserts a prerequisite that the specified rrset exists; that is, there exist records with the given name and type in the zone.
      • present

        public void present(Name name,
                   int type,
                   String record)
                     throws IOException
        Parses a record from the string, and inserts a prerequisite that the record exists. Due to the way value-dependent prequisites work, the condition that must be met is that the set of all records with the same and type in the update message must be identical to the set of all records with that name and type on the server.
        Throws:
        IOException - The record could not be parsed.
      • present

        public void present(Name name,
                   int type,
                   Tokenizer tokenizer)
                     throws IOException
        Parses a record from the tokenizer, and inserts a prerequisite that the record exists. Due to the way value-dependent prequisites work, the condition that must be met is that the set of all records with the same and type in the update message must be identical to the set of all records with that name and type on the server.
        Throws:
        IOException - The record could not be parsed.
      • present

        public void present(Record record)
        Inserts a prerequisite that the specified record exists. Due to the way value-dependent prequisites work, the condition that must be met is that the set of all records with the same and type in the update message must be identical to the set of all records with that name and type on the server.
      • absent

        public void absent(Name name)
        Inserts a prerequisite that the specified name does not exist; that is, there are no records with the given name in the zone.
      • absent

        public void absent(Name name,
                  int type)
        Inserts a prerequisite that the specified rrset does not exist; that is, there are no records with the given name and type in the zone.
      • add

        public void add(Name name,
               int type,
               long ttl,
               String record)
                 throws IOException
        Parses a record from the string, and indicates that the record should be inserted into the zone.
        Throws:
        IOException - The record could not be parsed.
      • add

        public void add(Name name,
               int type,
               long ttl,
               Tokenizer tokenizer)
                 throws IOException
        Parses a record from the tokenizer, and indicates that the record should be inserted into the zone.
        Throws:
        IOException - The record could not be parsed.
      • add

        public void add(Record record)
        Indicates that the record should be inserted into the zone.
      • add

        public void add(Record[] records)
        Indicates that the records should be inserted into the zone.
      • add

        public void add(RRset rrset)
        Indicates that all of the records in the rrset should be inserted into the zone.
      • delete

        public void delete(Name name)
        Indicates that all records with the given name should be deleted from the zone.
      • delete

        public void delete(Name name,
                  int type)
        Indicates that all records with the given name and type should be deleted from the zone.
      • delete

        public void delete(Name name,
                  int type,
                  String record)
                    throws IOException
        Parses a record from the string, and indicates that the record should be deleted from the zone.
        Throws:
        IOException - The record could not be parsed.
      • delete

        public void delete(Name name,
                  int type,
                  Tokenizer tokenizer)
                    throws IOException
        Parses a record from the tokenizer, and indicates that the record should be deleted from the zone.
        Throws:
        IOException - The record could not be parsed.
      • delete

        public void delete(Record record)
        Indicates that the specified record should be deleted from the zone.
      • delete

        public void delete(Record[] records)
        Indicates that the records should be deleted from the zone.
      • delete

        public void delete(RRset rrset)
        Indicates that all of the records in the rrset should be deleted from the zone.
      • replace

        public void replace(Name name,
                   int type,
                   long ttl,
                   String record)
                     throws IOException
        Parses a record from the string, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
        Throws:
        IOException - The record could not be parsed.
      • replace

        public void replace(Name name,
                   int type,
                   long ttl,
                   Tokenizer tokenizer)
                     throws IOException
        Parses a record from the tokenizer, and indicates that the record should be inserted into the zone replacing any other records with the same name and type.
        Throws:
        IOException - The record could not be parsed.
      • replace

        public void replace(Record record)
        Indicates that the record should be inserted into the zone replacing any other records with the same name and type.
      • replace

        public void replace(Record[] records)
        Indicates that the records should be inserted into the zone replacing any other records with the same name and type as each one.
      • replace

        public void replace(RRset rrset)
        Indicates that all of the records in the rrset should be inserted into the zone replacing any other records with the same name and type.
dnsjava-2.1.5/doc/org/xbill/DNS/WKSRecord.Protocol.html100644 0 0 111204 12131352546 17720 0ustar 0 0 WKSRecord.Protocol (dnsjava documentation)
org.xbill.DNS

Class WKSRecord.Protocol

  • Enclosing class:
    WKSRecord


    public static class WKSRecord.Protocol
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int ARGUS
      ARGUS
      static int BBN_RCC_MON
      BBN RCC Monitoring
      static int BR_SAT_MON
      Backroom SATNET Monitoring
      static int CFTP
      CFTP
      static int CHAOS
      Chaos
      static int DCN_MEAS
      DCN Measurement Subsystems
      static int EGP
      Exterior Gateway Protocol
      static int EMCON
      EMCON
      static int GGP
      Gateway-to-Gateway
      static int HMP
      Host Monitoring
      static int ICMP
      Internet Control Message
      static int IGMP
      Internet Group Management
      static int IGP
      any private interior gateway
      static int IPCV
      Internet Packet Core Utility
      static int IPPC
      Internet Pluribus Packet Core
      static int IRTP
      Internet Reliable Transaction
      static int ISO_TP4
      ISO Transport Protocol Class 4
      static int LEAF_1
      Leaf-1
      static int LEAF_2
      Leaf-2
      static int MERIT_INP
      MERIT Internodal Protocol
      static int MFE_NSP
      MFE Network Services Protocol
      static int MIT_SUBNET
      MIT Subnet Support
      static int MUX
      Multiplexing
      static int NETBLT
      Bulk Data Transfer Protocol
      static int NVP_II
      Network Voice Protocol
      static int PRM
      Packet Radio Measurement
      static int PUP
      PUP
      static int RDP
      Reliable Data Protocol
      static int RVD
      MIT Remote Virtual Disk Protocol
      static int SAT_EXPAK
      SATNET and Backroom EXPAK
      static int SAT_MON
      SATNET Monitoring
      static int SEP
      Sequential Exchange Protocol
      static int ST
      Stream
      static int TCP
      Transmission Control
      static int TRUNK_1
      Trunk-1
      static int TRUNK_2
      Trunk-2
      static int UCL
      UCL
      static int UDP
      User Datagram
      static int WB_EXPAK
      WIDEBAND EXPAK
      static int WB_MON
      WIDEBAND Monitoring
      static int XNET
      Cross Net Debugger
      static int XNS_IDP
      XEROX NS IDP
dnsjava-2.1.5/doc/org/xbill/DNS/WKSRecord.Service.html100644 0 0 167002 12131352546 17526 0ustar 0 0 WKSRecord.Service (dnsjava documentation)
org.xbill.DNS

Class WKSRecord.Service

  • Enclosing class:
    WKSRecord


    public static class WKSRecord.Service
    extends Object
    • Field Summary

      Fields 
      Modifier and Type Field and Description
      static int AUTH
      Authentication Service
      static int BL_IDM
      Britton-Lee IDM
      static int BOOTPC
      Bootstrap Protocol Client
      static int BOOTPS
      Bootstrap Protocol Server
      static int CHARGEN
      Character Generator
      static int CISCO_FNA
      CISCO FNATIVE
      static int CISCO_SYS
      CISCO SYSMAINT
      static int CISCO_TNA
      CISCO TNATIVE
      static int CSNET_NS
      Mailbox Name Nameserver
      static int DAYTIME
      Daytime
      static int DCP
      Device Control Protocol
      static int DISCARD
      Discard
      static int DOMAIN
      Domain Name Server
      static int DSP
      Display Support Protocol
      static int ECHO
      Echo
      static int EMFIS_CNTL
      EMFIS Control Service
      static int EMFIS_DATA
      EMFIS Data Service
      static int ERPC
      HYDRA Expedited Remote Procedure
      static int FINGER
      Finger
      static int FTP
      File Transfer [Control]
      static int FTP_DATA
      File Transfer [Default Data]
      static int GRAPHICS
      Graphics
      static int HOSTNAME
      NIC Host Name Server
      static int HOSTS2_NS
      HOSTS2 Name Server
      static int INGRES_NET
      INGRES-NET Service
      static int ISI_GL
      ISI Graphics Language
      static int ISO_TSAP
      ISO-TSAP
      static int LA_MAINT
      IMP Logical Address Maintenance
      static int LINK
      LINK
      static int LOC_SRV
      Location Service
      static int LOCUS_CON
      Locus PC-Interface Conn Server
      static int LOCUS_MAP
      Locus PC-Interface Net Map Server
      static int LOGIN
      Login Host Protocol
      static int METAGRAM
      Metagram Relay
      static int MIT_DOV
      MIT Dover Spooler
      static int MPM
      Message Processing Module [recv]
      static int MPM_FLAGS
      MPM FLAGS Protocol
      static int MPM_SND
      MPM [default send]
      static int MSG_AUTH
      MSG Authentication
      static int MSG_ICP
      MSG ICP
      static int NAMESERVER
      Host Name Server
      static int NETBIOS_DGM
      NETBIOS Datagram Service
      static int NETBIOS_NS
      NETBIOS Name Service
      static int NETBIOS_SSN
      NETBIOS Session Service
      static int NETRJS_1
      Remote Job Service
      static int NETRJS_2
      Remote Job Service
      static int NETRJS_3
      Remote Job Service
      static int NETRJS_4
      Remote Job Service
      static int NI_FTP
      NI FTP
      static int NI_MAIL
      NI MAIL
      static int NICNAME
      Who Is
      static int NNTP
      Network News Transfer Protocol
      static int NSW_FE
      NSW User System FE
      static int NTP
      Network Time Protocol
      static int POP_2
      Post Office Protocol - Version 2
      static int PROFILE
      PROFILE Naming System
      static int PWDGEN
      Password Generator Protocol
      static int QUOTE
      Quote of the Day
      static int RJE
      Remote Job Entry
      static int RLP
      Resource Location Protocol
      static int RTELNET
      Remote Telnet Service
      static int SFTP
      Simple File Transfer Protocol
      static int SMTP
      Simple Mail Transfer
      static int STATSRV
      Statistics Service
      static int SU_MIT_TG
      SU/MIT Telnet Gateway
      static int SUNRPC
      SUN Remote Procedure Call
      static int SUPDUP
      SUPDUP
      static int SUR_MEAS
      Survey Measurement
      static int SWIFT_RVF
      Swift Remote Virtual File Protocol
      static int TACACS_DS
      TACACS-Database Service
      static int TACNEWS
      TAC News
      static int TELNET
      Telnet
      static int TFTP
      Trivial File Transfer
      static int TIME
      Time
      static int USERS
      Active Users
      static int UUCP_PATH
      UUCP Path Service
      static int VIA_FTP
      VIA Systems - FTP
      static int X400
      X400
      static int X400_SND
      X400-SND
dnsjava-2.1.5/doc/org/xbill/DNS/WKSRecord.html100644 0 0 42553 12131352546 16112 0ustar 0 0 WKSRecord (dnsjava documentation)
org.xbill.DNS

Class WKSRecord

    • Constructor Detail

      • WKSRecord

        public WKSRecord(Name name,
                 int dclass,
                 long ttl,
                 InetAddress address,
                 int protocol,
                 int[] services)
        Creates a WKS Record from the given data
        Parameters:
        address - The IP address
        protocol - The IP protocol number
        services - An array of supported services, represented by port number.
    • Method Detail

      • getAddress

        public InetAddress getAddress()
        Returns the IP address.
      • getProtocol

        public int getProtocol()
        Returns the IP protocol.
      • getServices

        public int[] getServices()
        Returns the services provided by the host on the specified address.
dnsjava-2.1.5/doc/org/xbill/DNS/WireParseException.html100644 0 0 35211 12131352546 20060 0ustar 0 0 WireParseException (dnsjava documentation)
org.xbill.DNS

Class WireParseException

    • Constructor Detail

      • WireParseException

        public WireParseException()
      • WireParseException

        public WireParseException(String s)
      • WireParseException

        public WireParseException(String s,
                          Throwable cause)
dnsjava-2.1.5/doc/org/xbill/DNS/X25Record.html100644 0 0 36377 12131352546 16033 0ustar 0 0 X25Record (dnsjava documentation)
org.xbill.DNS

Class X25Record

  • All Implemented Interfaces:
    Serializable, Cloneable, Comparable


    public class X25Record
    extends Record
    X25 - identifies the PSDN (Public Switched Data Network) address in the X.121 numbering plan associated with a name.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • X25Record

        public X25Record(Name name,
                 int dclass,
                 long ttl,
                 String address)
        Creates an X25 Record from the given data
        Parameters:
        address - The X.25 PSDN address.
        Throws:
        IllegalArgumentException - The address is not a valid PSDN address.
    • Method Detail

      • getAddress

        public String getAddress()
        Returns the X.25 PSDN address.
dnsjava-2.1.5/doc/org/xbill/DNS/Zone.html100644 0 0 73737 12131352546 15232 0ustar 0 0 Zone (dnsjava documentation)
org.xbill.DNS

Class Zone

  • All Implemented Interfaces:
    Serializable


    public class Zone
    extends Object
    implements Serializable
    A DNS Zone. This encapsulates all data related to a Zone, and provides convenient lookup methods.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Method Detail

      • getOrigin

        public Name getOrigin()
        Returns the Zone's origin
      • getNS

        public RRset getNS()
        Returns the Zone origin's NS records
      • getSOA

        public SOARecord getSOA()
        Returns the Zone's SOA record
      • getDClass

        public int getDClass()
        Returns the Zone's class
      • findRecords

        public SetResponse findRecords(Name name,
                              int type)
        Looks up Records in the Zone. This follows CNAMEs and wildcards.
        Parameters:
        name - The name to look up
        type - The type to look up
        Returns:
        A SetResponse object
        See Also:
        SetResponse
      • findExactMatch

        public RRset findExactMatch(Name name,
                           int type)
        Looks up Records in the zone, finding exact matches only.
        Parameters:
        name - The name to look up
        type - The type to look up
        Returns:
        The matching RRset
        See Also:
        RRset
      • addRRset

        public void addRRset(RRset rrset)
        Adds an RRset to the Zone
        Parameters:
        rrset - The RRset to be added
        See Also:
        RRset
      • addRecord

        public void addRecord(Record r)
        Adds a Record to the Zone
        Parameters:
        r - The record to be added
        See Also:
        Record
      • removeRecord

        public void removeRecord(Record r)
        Removes a record from the Zone
        Parameters:
        r - The record to be removed
        See Also:
        Record
      • iterator

        public Iterator iterator()
        Returns an Iterator over the RRsets in the zone.
      • AXFR

        public Iterator AXFR()
        Returns an Iterator over the RRsets in the zone that can be used to construct an AXFR response. This is identical to iterator() except that the SOA is returned at the end as well as the beginning.
      • toMasterFile

        public String toMasterFile()
        Returns the contents of the Zone in master file format.
      • toString

        public String toString()
        Returns the contents of the Zone as a string (in master file format).
        Overrides:
        toString in class Object
dnsjava-2.1.5/doc/org/xbill/DNS/ZoneTransferException.html100644 0 0 32357 12131352546 20607 0ustar 0 0 ZoneTransferException (dnsjava documentation)
org.xbill.DNS

Class ZoneTransferException

  • All Implemented Interfaces:
    Serializable


    public class ZoneTransferException
    extends Exception
    An exception thrown when a zone transfer fails.
    Author:
    Brian Wellington
    See Also:
    Serialized Form
    • Constructor Detail

      • ZoneTransferException

        public ZoneTransferException()
      • ZoneTransferException

        public ZoneTransferException(String s)
dnsjava-2.1.5/doc/org/xbill/DNS/ZoneTransferIn.Delta.html100644 0 0 26547 12131352546 20253 0ustar 0 0 ZoneTransferIn.Delta (dnsjava documentation)
org.xbill.DNS

Class ZoneTransferIn.Delta

    • Field Detail

      • start

        public long start
        The starting serial number of this delta.
      • end

        public long end
        The ending serial number of this delta.
      • adds

        public List adds
        A list of records added between the start and end versions
      • deletes

        public List deletes
        A list of records deleted between the start and end versions
dnsjava-2.1.5/doc/org/xbill/DNS/ZoneTransferIn.ZoneTransferHandler.html100644 0 0 26153 12131352546 23131 0ustar 0 0 ZoneTransferIn.ZoneTransferHandler (dnsjava documentation)
org.xbill.DNS

Interface ZoneTransferIn.ZoneTransferHandler

  • Enclosing class:
    ZoneTransferIn


    public static interface ZoneTransferIn.ZoneTransferHandler
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void handleRecord(Record r)
      Called for each content record in an AXFR.
      void startAXFR()
      Called when an AXFR transfer begins.
      void startIXFR()
      Called when an IXFR transfer begins.
      void startIXFRAdds(Record soa)
      Called when a series of IXFR adds begins.
      void startIXFRDeletes(Record soa)
      Called when a series of IXFR deletions begins.
dnsjava-2.1.5/doc/org/xbill/DNS/ZoneTransferIn.html100644 0 0 111214 12131352546 17225 0ustar 0 0 ZoneTransferIn (dnsjava documentation)
org.xbill.DNS

Class ZoneTransferIn



  • public class ZoneTransferIn
    extends Object
    An incoming DNS Zone Transfer. To use this class, first initialize an object, then call the run() method. If run() doesn't throw an exception the result will either be an IXFR-style response, an AXFR-style response, or an indication that the zone is up to date.
    Author:
    Brian Wellington
    • Method Detail

      • newAXFR

        public static ZoneTransferIn newAXFR(Name zone,
                             SocketAddress address,
                             TSIG key)
        Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
        Parameters:
        zone - The zone to transfer.
        address - The host/port from which to transfer the zone.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • newAXFR

        public static ZoneTransferIn newAXFR(Name zone,
                             String host,
                             int port,
                             TSIG key)
                                      throws UnknownHostException
        Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
        Parameters:
        zone - The zone to transfer.
        host - The host from which to transfer the zone.
        port - The port to connect to on the server, or 0 for the default.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • newAXFR

        public static ZoneTransferIn newAXFR(Name zone,
                             String host,
                             TSIG key)
                                      throws UnknownHostException
        Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer).
        Parameters:
        zone - The zone to transfer.
        host - The host from which to transfer the zone.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • newIXFR

        public static ZoneTransferIn newIXFR(Name zone,
                             long serial,
                             boolean fallback,
                             SocketAddress address,
                             TSIG key)
        Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
        Parameters:
        zone - The zone to transfer.
        serial - The existing serial number.
        fallback - If true, fall back to AXFR if IXFR is not supported.
        address - The host/port from which to transfer the zone.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • newIXFR

        public static ZoneTransferIn newIXFR(Name zone,
                             long serial,
                             boolean fallback,
                             String host,
                             int port,
                             TSIG key)
                                      throws UnknownHostException
        Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
        Parameters:
        zone - The zone to transfer.
        serial - The existing serial number.
        fallback - If true, fall back to AXFR if IXFR is not supported.
        host - The host from which to transfer the zone.
        port - The port to connect to on the server, or 0 for the default.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • newIXFR

        public static ZoneTransferIn newIXFR(Name zone,
                             long serial,
                             boolean fallback,
                             String host,
                             TSIG key)
                                      throws UnknownHostException
        Instantiates a ZoneTransferIn object to do an IXFR (incremental zone transfer).
        Parameters:
        zone - The zone to transfer.
        serial - The existing serial number.
        fallback - If true, fall back to AXFR if IXFR is not supported.
        host - The host from which to transfer the zone.
        key - The TSIG key used to authenticate the transfer, or null.
        Returns:
        The ZoneTransferIn object.
        Throws:
        UnknownHostException - The host does not exist.
      • getName

        public Name getName()
        Gets the name of the zone being transferred.
      • getType

        public int getType()
        Gets the type of zone transfer (either AXFR or IXFR).
      • setTimeout

        public void setTimeout(int secs)
        Sets a timeout on this zone transfer. The default is 900 seconds (15 minutes).
        Parameters:
        secs - The maximum amount of time that this zone transfer can take.
      • setDClass

        public void setDClass(int dclass)
        Sets an alternate DNS class for this zone transfer.
        Parameters:
        dclass - The class to use instead of class IN.
      • setLocalAddress

        public void setLocalAddress(SocketAddress addr)
        Sets the local address to bind to when sending messages.
        Parameters:
        addr - The local address to send messages from.
      • run

        public List run()
                 throws IOException,
                        ZoneTransferException
        Does the zone transfer.
        Returns:
        A list, which is either an AXFR-style response (List of Records), and IXFR-style response (List of Deltas), or null, which indicates that an IXFR was performed and the zone is up to date.
        Throws:
        IOException - The zone transfer failed to due an IO problem.
        ZoneTransferException - The zone transfer failed to due a problem with the zone transfer itself.
      • isAXFR

        public boolean isAXFR()
        Returns true if the response is an AXFR-style response (List of Records). This will be true if either an IXFR was performed, an IXFR was performed and the server provided a full zone transfer, or an IXFR failed and fallback to AXFR occurred.
      • getAXFR

        public List getAXFR()
        Gets the AXFR-style response.
        Throws:
        IllegalArgumentException - The transfer used the callback interface, so the response was not stored.
      • isIXFR

        public boolean isIXFR()
        Returns true if the response is an IXFR-style response (List of Deltas). This will be true only if an IXFR was performed and the server provided an incremental zone transfer.
      • getIXFR

        public List getIXFR()
        Gets the IXFR-style response.
        Throws:
        IllegalArgumentException - The transfer used the callback interface, so the response was not stored.
      • isCurrent

        public boolean isCurrent()
        Returns true if the response indicates that the zone is up to date. This will be true only if an IXFR was performed.
        Throws:
        IllegalArgumentException - The transfer used the callback interface, so the response was not stored.
dnsjava-2.1.5/doc/org/xbill/DNS/package-frame.html100644 0 0 35611 12131352546 16767 0ustar 0 0 org.xbill.DNS (dnsjava documentation)

org.xbill.DNS

Interfaces

Classes

Exceptions

dnsjava-2.1.5/doc/org/xbill/DNS/package-summary.html100644 0 0 116542 12131352546 17415 0ustar 0 0 org.xbill.DNS (dnsjava documentation)

Package org.xbill.DNS

  • Interface Summary 
    Interface Description
    Resolver
    Interface describing a resolver.
    ResolverListener
    An interface to the asynchronous resolver.
    ZoneTransferIn.ZoneTransferHandler  
  • Class Summary 
    Class Description
    A6Record
    A6 Record - maps a domain name to an IPv6 address (experimental)
    AAAARecord
    IPv6 Address Record - maps a domain name to an IPv6 address
    Address
    Routines dealing with IP addresses.
    AFSDBRecord
    AFS Data Base Record - maps a domain name to the name of an AFS cell database server.
    APLRecord
    APL - Address Prefix List.
    APLRecord.Element  
    ARecord
    Address Record - maps a domain name to an Internet address
    Cache
    A cache of DNS records.
    CERTRecord
    Certificate Record - Stores a certificate associated with a name.
    CERTRecord.CertificateType  
    ClientSubnetOption
    The Client Subnet EDNS Option, defined in http://tools.ietf.org/html/draft-vandergaast-edns-client-subnet-00 ("Client subnet in DNS requests").
    CNAMERecord
    CNAME Record - maps an alias to its real name
    Compression
    DNS Name Compression object.
    Credibility
    Constants relating to the credibility of cached data, which is based on the data's source.
    DClass
    Constants and functions relating to DNS classes.
    DHCIDRecord
    DHCID - Dynamic Host Configuration Protocol (DHCP) ID (RFC 4701)
    DLVRecord
    DLV - contains a Delegation Lookaside Validation record, which acts as the equivalent of a DS record in a lookaside zone.
    DNAMERecord
    DNAME Record - maps a nonterminal alias (subtree) to a different domain
    DNSInput
    An class for parsing DNS messages.
    DNSKEYRecord
    Key - contains a cryptographic public key for use by DNS.
    DNSKEYRecord.Flags  
    DNSKEYRecord.Protocol  
    DNSOutput
    A class for rendering DNS messages.
    DNSSEC
    Constants and methods relating to DNSSEC.
    DNSSEC.Algorithm  
    DSRecord
    DS - contains a Delegation Signer record, which acts as a placeholder for KEY records in the parent zone.
    DSRecord.Digest  
    EDNSOption
    DNS extension options, as described in RFC 2671.
    EDNSOption.Code  
    ExtendedFlags
    Constants and functions relating to EDNS flags.
    ExtendedResolver
    An implementation of Resolver that can send queries to multiple servers, sending the queries multiple times if necessary.
    Flags
    Constants and functions relating to flags in the DNS header.
    Generator
    A representation of a $GENERATE statement in a master file.
    GenericEDNSOption
    An EDNSOption with no internal structure.
    GPOSRecord
    Geographical Location - describes the physical location of a host.
    Header
    A DNS message header
    HINFORecord
    Host Information - describes the CPU and OS of a host
    IPSECKEYRecord
    IPsec Keying Material (RFC 4025)
    IPSECKEYRecord.Algorithm  
    IPSECKEYRecord.Gateway  
    ISDNRecord
    ISDN - identifies the ISDN number and subaddress associated with a name.
    KEYRecord
    Key - contains a cryptographic public key.
    KEYRecord.Flags  
    KEYRecord.Protocol  
    KXRecord
    Key Exchange - delegation of authority
    LOCRecord
    Location - describes the physical location of hosts, networks, subnets.
    Lookup
    The Lookup object issues queries to caching DNS servers.
    Master
    A DNS master file parser.
    MBRecord
    Mailbox Record - specifies a host containing a mailbox.
    MDRecord
    Mail Destination Record - specifies a mail agent which delivers mail for a domain (obsolete)
    Message
    A DNS Message.
    MFRecord
    Mail Forwarder Record - specifies a mail agent which forwards mail for a domain (obsolete)
    MGRecord
    Mail Group Record - specifies a mailbox which is a member of a mail group.
    MINFORecord
    Mailbox information Record - lists the address responsible for a mailing list/mailbox and the address to receive error messages relating to the mailing list/mailbox.
    MRRecord
    Mailbox Rename Record - specifies a rename of a mailbox.
    MXRecord
    Mail Exchange - specifies where mail to a domain is sent
    Name
    A representation of a domain name.
    NAPTRRecord
    Name Authority Pointer Record - specifies rewrite rule, that when applied to an existing string will produce a new domain.
    NSAP_PTRRecord
    NSAP Pointer Record - maps a domain name representing an NSAP Address to a hostname.
    NSAPRecord
    NSAP Address Record.
    NSEC3PARAMRecord
    Next SECure name 3 Parameters - this record contains the parameters (hash algorithm, salt, iterations) used for a valid, complete NSEC3 chain present in a zone.
    NSEC3Record
    Next SECure name 3 - this record contains the next hashed name in an ordered list of hashed names in the zone, and a set of types for which records exist for this name.
    NSEC3Record.Digest  
    NSEC3Record.Flags  
    NSECRecord
    Next SECure name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name.
    NSIDOption
    The Name Server Identifier Option, define in RFC 5001.
    NSRecord
    Name Server Record - contains the name server serving the named zone
    NULLRecord
    The NULL Record.
    NXTRecord
    Next name - this record contains the following name in an ordered list of names in the zone, and a set of types for which records exist for this name.
    Opcode
    Constants and functions relating to DNS opcodes
    Options
    Boolean options:
    bindttl - Print TTLs in BIND format
    multiline - Print records in multiline format
    noprintin - Don't print the class of a record if it's IN
    verbose - Turn on general debugging statements
    verbosemsg - Print all messages sent or received by SimpleResolver
    verbosecompression - Print messages related to name compression
    verbosesec - Print messages related to signature verification
    verbosecache - Print messages related to cache lookups

    Valued options:
    tsigfudge=n - Sets the default TSIG fudge value (in seconds)
    sig0validity=n - Sets the default SIG(0) validity period (in seconds)
    OPTRecord
    Options - describes Extended DNS (EDNS) properties of a Message.
    PTRRecord
    Pointer Record - maps a domain name representing an Internet Address to a hostname.
    PXRecord
    X.400 mail mapping record.
    Rcode
    Constants and functions relating to DNS rcodes (error values)
    Record
    A generic DNS resource record.
    ResolverConfig
    A class that tries to locate name servers and the search path to be appended to unqualified names.
    ReverseMap
    A set functions designed to deal with DNS names used in reverse mappings.
    RPRecord
    Responsible Person Record - lists the mail address of a responsible person and a domain where TXT records are available.
    RRset
    A set of Records with the same name, type, and class.
    RRSIGRecord
    Recource Record Signature - An RRSIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver.
    RTRecord
    Route Through Record - lists a route preference and intermediate host.
    Section
    Constants and functions relating to DNS message sections
    Serial
    Helper functions for doing serial arithmetic.
    SetResponse
    The Response from a query to Cache.lookupRecords() or Zone.findRecords()
    SIG0
    Creates SIG(0) transaction signatures.
    SIGRecord
    Signature - A SIG provides the digital signature of an RRset, so that the data can be authenticated by a DNSSEC-capable resolver.
    SimpleResolver
    An implementation of Resolver that sends one query to one server.
    SOARecord
    Start of Authority - describes properties of a zone.
    SPFRecord
    Sender Policy Framework (RFC 4408, experimental)
    SRVRecord
    Server Selection Record - finds hosts running services in a domain.
    SSHFPRecord
    SSH Fingerprint - stores the fingerprint of an SSH host key.
    SSHFPRecord.Algorithm  
    SSHFPRecord.Digest  
    TKEYRecord
    Transaction Key - used to compute and/or securely transport a shared secret to be used with TSIG.
    TLSARecord
    Transport Layer Security Authentication
    TLSARecord.CertificateUsage  
    TLSARecord.MatchingType  
    TLSARecord.Selector  
    Tokenizer
    Tokenizer is used to parse DNS records and zones from text format,
    Tokenizer.Token  
    TSIG
    Transaction signature handling.
    TSIG.StreamVerifier  
    TSIGRecord
    Transaction Signature - this record is automatically generated by the resolver.
    TTL
    Routines for parsing BIND-style TTL values.
    TXTRecord
    Text - stores text strings
    Type
    Constants and functions relating to DNS Types
    UNKRecord
    A class implementing Records of unknown and/or unimplemented types.
    Update
    A helper class for constructing dynamic DNS (DDNS) update messages.
    WKSRecord
    Well Known Services - Lists services offered by this host.
    WKSRecord.Protocol  
    WKSRecord.Service  
    X25Record
    X25 - identifies the PSDN (Public Switched Data Network) address in the X.121 numbering plan associated with a name.
    Zone
    A DNS Zone.
    ZoneTransferIn
    An incoming DNS Zone Transfer.
    ZoneTransferIn.Delta  
  • Exception Summary 
    Exception Description
    DNSSEC.DNSSECException
    A DNSSEC exception.
    DNSSEC.IncompatibleKeyException
    The key data provided is inconsistent.
    DNSSEC.KeyMismatchException
    A DNSSEC verification failed because fields in the DNSKEY and RRSIG records do not match.
    DNSSEC.MalformedKeyException
    The cryptographic data in a DNSSEC key is malformed.
    DNSSEC.SignatureExpiredException
    A DNSSEC verification failed because the signature has expired.
    DNSSEC.SignatureNotYetValidException
    A DNSSEC verification failed because the signature has not yet become valid.
    DNSSEC.SignatureVerificationException
    A DNSSEC verification failed because the cryptographic signature verification failed.
    DNSSEC.UnsupportedAlgorithmException
    An algorithm is unsupported by this DNSSEC implementation.
    InvalidDClassException
    An exception thrown when an invalid dclass code is specified.
    InvalidTTLException
    An exception thrown when an invalid TTL is specified.
    InvalidTypeException
    An exception thrown when an invalid type code is specified.
    NameTooLongException
    An exception thrown when a name is longer than the maximum length of a DNS name.
    RelativeNameException
    An exception thrown when a relative name is passed as an argument to a method requiring an absolute name.
    TextParseException
    An exception thrown when unable to parse text.
    WireParseException
    An exception thrown when a DNS message is invalid.
    ZoneTransferException
    An exception thrown when a zone transfer fails.
dnsjava-2.1.5/doc/org/xbill/DNS/package-tree.html100644 0 0 72571 12131352546 16642 0ustar 0 0 org.xbill.DNS Class Hierarchy (dnsjava documentation)

Hierarchy For Package org.xbill.DNS

Package Hierarchies:

Class Hierarchy

Interface Hierarchy

dnsjava-2.1.5/doc/org/xbill/DNS/spi/DNSJavaNameService.html100644 0 0 41330 12131352546 20442 0ustar 0 0 DNSJavaNameService (dnsjava documentation)
org.xbill.DNS.spi

Class DNSJavaNameService

  • All Implemented Interfaces:
    InvocationHandler


    public class DNSJavaNameService
    extends Object
    implements InvocationHandler
    This class implements a Name Service Provider, which Java can use (starting with version 1.4), to perform DNS resolutions instead of using the standard calls.

    This Name Service Provider uses dnsjava.

    To use this provider, you must set the following system property: sun.net.spi.nameservice.provider.1=dns,dnsjava

    Author:
    Brian Wellington, Paul Cowan (pwc21@yahoo.com)
    • Constructor Detail

      • DNSJavaNameService

        protected DNSJavaNameService()
        Creates a DNSJavaNameService instance.

        Uses the sun.net.spi.nameservice.nameservers, sun.net.spi.nameservice.domain, and java.net.preferIPv6Addresses properties for configuration.

dnsjava-2.1.5/doc/org/xbill/DNS/spi/DNSJavaNameServiceDescriptor.html100644 0 0 30632 12131352546 22504 0ustar 0 0 DNSJavaNameServiceDescriptor (dnsjava documentation)
org.xbill.DNS.spi

Class DNSJavaNameServiceDescriptor

  • All Implemented Interfaces:
    sun.net.spi.nameservice.NameServiceDescriptor


    public class DNSJavaNameServiceDescriptor
    extends Object
    implements sun.net.spi.nameservice.NameServiceDescriptor
    The descriptor class for the dnsjava name service provider.
    Author:
    Brian Wellington, Paul Cowan (pwc21@yahoo.com)
    • Constructor Detail

      • DNSJavaNameServiceDescriptor

        public DNSJavaNameServiceDescriptor()
    • Method Detail

      • createNameService

        public sun.net.spi.nameservice.NameService createNameService()
        Returns a reference to a dnsjava name server provider.
        Specified by:
        createNameService in interface sun.net.spi.nameservice.NameServiceDescriptor
      • getType

        public String getType()
        Specified by:
        getType in interface sun.net.spi.nameservice.NameServiceDescriptor
      • getProviderName

        public String getProviderName()
        Specified by:
        getProviderName in interface sun.net.spi.nameservice.NameServiceDescriptor
dnsjava-2.1.5/doc/org/xbill/DNS/spi/package-frame.html100644 0 0 1633 12131352546 17537 0ustar 0 0 org.xbill.DNS.spi (dnsjava documentation)

org.xbill.DNS.spi

dnsjava-2.1.5/doc/org/xbill/DNS/spi/package-summary.html100644 0 0 11602 12131352546 20157 0ustar 0 0 org.xbill.DNS.spi (dnsjava documentation)

Package org.xbill.DNS.spi

  • Class Summary 
    Class Description
    DNSJavaNameService
    This class implements a Name Service Provider, which Java can use (starting with version 1.4), to perform DNS resolutions instead of using the standard calls.
    DNSJavaNameServiceDescriptor
    The descriptor class for the dnsjava name service provider.
dnsjava-2.1.5/doc/org/xbill/DNS/spi/package-tree.html100644 0 0 11550 12131352546 17423 0ustar 0 0 org.xbill.DNS.spi Class Hierarchy (dnsjava documentation)

Hierarchy For Package org.xbill.DNS.spi

Package Hierarchies:

Class Hierarchy

dnsjava-2.1.5/doc/org/xbill/DNS/utils/HMAC.html100644 0 0 46577 12131352546 16171 0ustar 0 0 HMAC (dnsjava documentation)
org.xbill.DNS.utils

Class HMAC



  • public class HMAC
    extends Object
    An implementation of the HMAC message authentication code.
    Author:
    Brian Wellington
    • Constructor Summary

      Constructors 
      Constructor and Description
      HMAC(MessageDigest digest, byte[] key)
      Deprecated. 
      won't work with digests using a padding length other than 64; use HMAC(MessageDigest digest, int blockLength, byte [] key) instead.
      HMAC(MessageDigest digest, int blockLength, byte[] key)
      Creates a new HMAC instance
      HMAC(String digestName, byte[] key)
      Deprecated. 
      won't work with digests using a padding length other than 64; use HMAC(String digestName, int blockLength, byte [] key) instead
      HMAC(String digestName, int blockLength, byte[] key)
      Creates a new HMAC instance
    • Method Summary

      Methods 
      Modifier and Type Method and Description
      void clear()
      Resets the HMAC object for further use
      int digestLength()
      Returns the length of the digest.
      byte[] sign()
      Signs the data (computes the secure hash)
      void update(byte[] b)
      Adds data to the current hash
      void update(byte[] b, int offset, int length)
      Adds data to the current hash
      boolean verify(byte[] signature)
      Verifies the data (computes the secure hash and compares it to the input)
      boolean verify(byte[] signature, boolean truncation_ok)
      Verifies the data (computes the secure hash and compares it to the input)
    • Constructor Detail

      • HMAC

        public HMAC(MessageDigest digest,
            int blockLength,
            byte[] key)
        Creates a new HMAC instance
        Parameters:
        digest - The message digest object.
        blockLength - The block length of the message digest.
        key - The secret key
      • HMAC

        public HMAC(String digestName,
            int blockLength,
            byte[] key)
        Creates a new HMAC instance
        Parameters:
        digestName - The name of the message digest function.
        blockLength - The block length of the message digest.
        key - The secret key.
      • HMAC

        public HMAC(MessageDigest digest,
            byte[] key)
        Deprecated. won't work with digests using a padding length other than 64; use HMAC(MessageDigest digest, int blockLength, byte [] key) instead.
        Creates a new HMAC instance
        Parameters:
        digest - The message digest object.
        key - The secret key
        See Also:
        HMAC(MessageDigest digest, int blockLength, byte [] key)
      • HMAC

        public HMAC(String digestName,
            byte[] key)
        Deprecated. won't work with digests using a padding length other than 64; use HMAC(String digestName, int blockLength, byte [] key) instead
        Creates a new HMAC instance
        Parameters:
        digestName - The name of the message digest function.
        key - The secret key.
        See Also:
        HMAC(String digestName, int blockLength, byte [] key)
    • Method Detail

      • update

        public void update(byte[] b,
                  int offset,
                  int length)
        Adds data to the current hash
        Parameters:
        b - The data
        offset - The index at which to start adding to the hash
        length - The number of bytes to hash
      • update

        public void update(byte[] b)
        Adds data to the current hash
        Parameters:
        b - The data
      • sign

        public byte[] sign()
        Signs the data (computes the secure hash)
        Returns:
        An array with the signature
      • verify

        public boolean verify(byte[] signature)
        Verifies the data (computes the secure hash and compares it to the input)
        Parameters:
        signature - The signature to compare against
        Returns:
        true if the signature matches, false otherwise
      • verify

        public boolean verify(byte[] signature,
                     boolean truncation_ok)
        Verifies the data (computes the secure hash and compares it to the input)
        Parameters:
        signature - The signature to compare against
        truncation_ok - If true, the signature may be truncated; only the number of bytes in the provided signature are compared.
        Returns:
        true if the signature matches, false otherwise
      • clear

        public void clear()
        Resets the HMAC object for further use
      • digestLength

        public int digestLength()
        Returns the length of the digest.
dnsjava-2.1.5/doc/org/xbill/DNS/utils/base16.html100644 0 0 24735 12131352546 16532 0ustar 0 0 base16 (dnsjava documentation)
org.xbill.DNS.utils

Class base16



  • public class base16
    extends Object
    Routines for converting between Strings of hex-encoded data and arrays of binary data. This is not actually used by DNS.
    Author:
    Brian Wellington
    • Method Detail

      • toString

        public static String toString(byte[] b)
        Convert binary data to a hex-encoded String
        Parameters:
        b - An array containing binary data
        Returns:
        A String containing the encoded data
      • fromString

        public static byte[] fromString(String str)
        Convert a hex-encoded String to binary data
        Parameters:
        str - A String containing the encoded data
        Returns:
        An array containing the binary data, or null if the string is invalid
dnsjava-2.1.5/doc/org/xbill/DNS/utils/base32.Alphabet.html100644 0 0 25040 12131352546 20235 0ustar 0 0 base32.Alphabet (dnsjava documentation)
org.xbill.DNS.utils

Class base32.Alphabet

  • Enclosing class:
    base32


    public static class base32.Alphabet
    extends Object
dnsjava-2.1.5/doc/org/xbill/DNS/utils/base32.html100644 0 0 33354 12131352546 16525 0ustar 0 0 base32 (dnsjava documentation)
org.xbill.DNS.utils

Class base32



  • public class base32
    extends Object
    Routines for converting between Strings of base32-encoded data and arrays of binary data. This currently supports the base32 and base32hex alphabets specified in RFC 4648, sections 6 and 7.
    Author:
    Brian Wellington
    • Constructor Detail

      • base32

        public base32(String alphabet,
              boolean padding,
              boolean lowercase)
        Creates an object that can be used to do base32 conversions.
        Parameters:
        alphabet - Which alphabet should be used
        padding - Whether padding should be used
        lowercase - Whether lowercase characters should be used. default parameters (The standard base32 alphabet, no padding, uppercase)
    • Method Detail

      • toString

        public String toString(byte[] b)
        Convert binary data to a base32-encoded String
        Parameters:
        b - An array containing binary data
        Returns:
        A String containing the encoded data
      • fromString

        public byte[] fromString(String str)
        Convert a base32-encoded String to binary data
        Parameters:
        str - A String containing the encoded data
        Returns:
        An array containing the binary data, or null if the string is invalid
dnsjava-2.1.5/doc/org/xbill/DNS/utils/base64.html100644 0 0 31066 12131352546 16530 0ustar 0 0 base64 (dnsjava documentation)
org.xbill.DNS.utils

Class base64



  • public class base64
    extends Object
    Routines for converting between Strings of base64-encoded data and arrays of binary data.
    Author:
    Brian Wellington
    • Method Detail

      • toString

        public static String toString(byte[] b)
        Convert binary data to a base64-encoded String
        Parameters:
        b - An array containing binary data
        Returns:
        A String containing the encoded data
      • formatString

        public static String formatString(byte[] b,
                          int lineLength,
                          String prefix,
                          boolean addClose)
        Formats data into a nicely formatted base64 encoded String
        Parameters:
        b - An array containing binary data
        lineLength - The number of characters per line
        prefix - A string prefixing the characters on each line
        addClose - Whether to add a close parenthesis or not
        Returns:
        A String representing the formatted output
      • fromString

        public static byte[] fromString(String str)
        Convert a base64-encoded String to binary data
        Parameters:
        str - A String containing the encoded data
        Returns:
        An array containing the binary data, or null if the string is invalid
dnsjava-2.1.5/doc/org/xbill/DNS/utils/hexdump.html100644 0 0 30355 12131352546 17116 0ustar 0 0 hexdump (dnsjava documentation)
org.xbill.DNS.utils

Class hexdump



  • public class hexdump
    extends Object
    A routine to produce a nice looking hex dump
    Author:
    Brian Wellington
    • Constructor Detail

      • hexdump

        public hexdump()
    • Method Detail

      • dump

        public static String dump(String description,
                  byte[] b,
                  int offset,
                  int length)
        Dumps a byte array into hex format.
        Parameters:
        description - If not null, a description of the data.
        b - The data to be printed.
        offset - The start of the data in the array.
        length - The length of the data in the array.
dnsjava-2.1.5/doc/org/xbill/DNS/utils/package-frame.html100644 0 0 2375 12131352546 20110 0ustar 0 0 org.xbill.DNS.utils (dnsjava documentation)

org.xbill.DNS.utils

dnsjava-2.1.5/doc/org/xbill/DNS/utils/package-summary.html100644 0 0 13245 12131352546 20531 0ustar 0 0 org.xbill.DNS.utils (dnsjava documentation)

Package org.xbill.DNS.utils

  • Class Summary 
    Class Description
    base16
    Routines for converting between Strings of hex-encoded data and arrays of binary data.
    base32
    Routines for converting between Strings of base32-encoded data and arrays of binary data.
    base32.Alphabet  
    base64
    Routines for converting between Strings of base64-encoded data and arrays of binary data.
    hexdump
    A routine to produce a nice looking hex dump
    HMAC
    An implementation of the HMAC message authentication code.
dnsjava-2.1.5/doc/org/xbill/DNS/utils/package-tree.html100644 0 0 12161 12131352546 17767 0ustar 0 0 org.xbill.DNS.utils Class Hierarchy (dnsjava documentation)

Hierarchy For Package org.xbill.DNS.utils

Package Hierarchies:

Class Hierarchy

dnsjava-2.1.5/doc/overview-frame.html100644 0 0 1647 12131352546 14677 0ustar 0 0 Overview List (dnsjava documentation)

 

dnsjava-2.1.5/doc/overview-summary.html100644 0 0 7704 12131352547 15303 0ustar 0 0 Overview (dnsjava documentation)
Packages 
Package Description
org.xbill.DNS  
org.xbill.DNS.spi  
org.xbill.DNS.utils  
dnsjava-2.1.5/doc/overview-tree.html100644 0 0 73106 12131352547 14564 0ustar 0 0 Class Hierarchy (dnsjava documentation)

Hierarchy For All Packages

Package Hierarchies:

Class Hierarchy

Interface Hierarchy

dnsjava-2.1.5/doc/package-list100644 0 0 64 12131352546 13272 0ustar 0 0 org.xbill.DNS org.xbill.DNS.spi org.xbill.DNS.utils dnsjava-2.1.5/doc/resources/background.gif100644 0 0 4411 12131352540 15655 0ustar 0 0 GIF89a2pæÿÿÿ=[q>\r?]sCby@^tDczA_uKm†Vz•<[q=\r<[p>]s=\q;YmBbyAaw?^t>]rX£’fš§cœÆIæ†s¦(ä–íÑ gŸxrIh–CN)§n¦¹§•ƒBšå¡!Ö9_˜<þø]£x>úc|bYéŸiŠÀ €7`«¯ÞÀêm±ÖÚª«°€«¬°¶ªk­½Ò𫬻îj«°ÆÎ ¬«É»ì³Ãþ k²ÍJË«¬¾F{+°ØâZí¶Ñ~[l¬¼2Ë­µ¯R{®±ê†{n¶×Î*nºï o³å¢;-´ùº»o®ÕΫ­½ÇÒ;°«ù̯Á÷ÖÚnÃ×+°¸ G¬¬ÿÅ;±ÄëÖëÆ½Ò[q¿$;l2À[/¸+{˱¿+‹œrÉú:û/Í6·ü²Î5Ë;sÁóœq°;Ÿó¯#3¬ôÍú&MôÁ÷̲Ñ@à ôÐæÂ¼tÒCç\µÆQSüóÓV?ݵ²^÷,pË ³m«ÌZ7ýóÙkƒqÑL“ÝöÒÝ:Ý-ÞKMpÞûšðØtS­vÔnß u´H#¾0ÓÔwâyû´ÝB.øÇ ‘@E1z騗>:é©«~:꯷¾:ë²Ç;ë¶ßNzî¶Ï޺鴟zî»>|ðÆÿN<ðÈ¿üêÊ7_<ïÐ×~üõÖ'¯ýí¿_»ô§?OüÿòÌ7ß{ðãÓ~~ôÝ‹þîï«_=öÛ§Ïýýôç¯{ûðóoþûÛãÞú¢@÷±ï€âóžîþ—?ûÕüÿ¸¿ìù‚Œàõ@×0~Ä^7ÈAæ…ð{T U˜Büïƒþ;aòFˆ¾®…¬¡ )èÁ Ђ"„¡ a籇ìûá SHBí5‘‡Pœßõ”xÄé ±ƒ&b¥(@jq†ò»ác7FЇ^DaËXÄ®Q‡dã¹è¼4nw@Œ€# }ÄA ýøÇ@ò…ä#)H>ú ŒùiÏ€¾sŸ—D'-ëOxB”šñ”¨3ѹP`v”žÕ¤ç@ÿùPŒ¦3¡ÑÄ%I۩Д®´¢mèHç P“N´£~ìg; Ó tœŒÄ'Mý¹Sºt¨ õéCg*Î’Šô¨EèD•*S JµžÿjSYJÐÖ4ªKµj,GÉQ¨ê4¡Z=+J_êÕ’‚µª1ÝjO0$ä IÈ+^óÊW¾îµ¯~ì_kWÀöu°Õ«a‹ØÂÖ±„}¬d#«ØÉZö²˜­lcKYÊ6¯›E¬h;ØÑv³=íb‹ÚÔrVµ¡í¬k+KÛÚ¾6³¶eìjS ZÒÊ6¶·®jW‹Ú½¶V¸ž%®m«ÜÙÞ6·´-.t{;ÜàúÖºÕ•-n»[äÂöºØí¬iµ Ýòr·¹ä…¬t]»^ðâV±Þ¯eåûÜò:—µÝuïd×K_êþ–¼¥0z³+Y昳üMïe½[_óÚ7¶ñpÿx·›ßë8½Mð{üàæ^˜Âµõï‚%¼\ý6ø¾ç51|õKßç7™ pŒŒá˜¶àA x°ø¸Ç;²Ìc!È=æq‘•Z¤@j¡ £AJ¤$š ?J¥º¤!J£BÚ£Z ¥MZžVú X ¢š¥a*¢gŠ¡LÊ¥Mê¢7ú£lj£Ú¦[š¢eú¤5*¥Š-:§iê¥(Ф]š§|*¤j ¦vª¤U ¨2j¤4:¦;J§zÚ¦º9A`˜jAp©™š©›Ê©ª©›Ú©£ª¢Zª¡ú©¦Zª¨Jª£Úª¢êª°«ž ª´êªµŠ«©j«¹ºª³«¿ªª»jª´ «ŸÊ«·š¬³Šª­º¬Èš¬µú¬¯*­ÎJ¬§Š¬Íj«ÕŠ©Ùê«Ä¬à ÿ­Üʬª«ãj®½ª¬ØJ­ß®àº®íz®ÞÚ­¾Ê®ïê­øê®ëº­òÚ¯éJ¯è𮲝÷:¬Öz¬øê¯ü °Û°ãj¯Ô ¯ù ±ë¯Ñš°õ*± «± k±{ª±Û«úŠ®k°›°+®,[®¸Z°[¬ë°š*°ü³.›«0­«®*«­=K³9{®;û±¬:³F{³B[²õ:²òJ®7»²äZ±áÚ´ó*²‹±R ªÍʳZ ´?KµìjµÃZ´-Ë©A0/"°¶!ðk ·ot+·vK·o·z›·s;·v·xû·~ë¶‚ë¶|+¸‡ ¸…›ÿ¸Œ»¸w[¸{¹€Û¸¹u+¹}K¹‹Ë·œû¸– ¹«¸¢ºƒ{¸—kº§{·¤k¸Ž»·¦Ûº«û¹£ º˜K¸–›º“K»ûº²»¼[ºº»¹›K¹«[¹¿«ºrK¼´{»Ê[»Æë¹¨›¼Âۻλ¼š;»Õ{»Ã;½Ä{½Çë½Ö ½µK½¹Ë¼Ü»½äÛ·Ò«½ã½æ›¾ðë»°Û¾â[¾¨Û¼Ý;¿ö‹¿á ¾ô;»òË¿“+À÷«¿êk»îÀ~Àç;À \ÀlÀý[¿þ{ÀœÀè{¼ûûÀº‹»Àk¿ªKÀ!,Á§ ¼<ÁØ{Â̺웿٫Á œÂ0ü¿àÿÃìÀ-œÁŒÀ!@#00ðÃ0Ä?\Ä@<ÄF\ÄCLÄBÌÄF¼ÄN¬ÄHœÄS<ÅTŒÄVÜÄO¼ÄI|Ä[üÅW,Å`<Æd,ÅQ¬ÅYlÆ]œÆZìÅ[ÌÆYÇglÅr¼ÆgìÆW|ÇX¬Çp|ÇGÜÇd Èm<ÈblÇ]üLJ¼Ç‰LÇ\Æ…Lȃ\ÇŽ<Éo¼Èx\É”\ÈlìÅ’œÇ–¼É\Æm ÊAÜÇ‚LȧÜÉ,ʈlȤ<Ç~üǰȳŒÊµœÉMÌÇ—¬Æ¸ìƤ|É¿lÇ·,ÌìʑìħÌÊ¡üůlÈÎü˪ ÅÎlËÓlÌ» ɹüÉ|<Ìš¬ËÖ ÿÄ«œÌ«ÌËaÜÌy\ÌÈ|ËÖÌžìÊÛ<Í` Íé¼È܌ͭ\ÎïÜËUÌÄÒLÉëÌÏó¬ÏùŒÏôLÏè,ÊŒüÄf|ÐãŒÇÿlɬÍ-ÐB¬$pÑpÑÑÀÑMM-ÒÒ#mÒ Ò ÍÑ)½Ò"íÑ!íÒ#ÑÑ(]Ó/­Ò7mÓ,-Ó<Ó?ÔBMÒ;Ó3]Ò=MÓ!]ÔF ÓIÓ.ÓàÓDÝÓ7]Ô&MÕXýÔTMÓ]ÓLýÕ7-ÕbmÕf Ô2­ÕOÍÔaÍÖCíÕS}Òe-Õg}ÔY}ÕkÍÕm­×oÔhíÖMMÒ.×hØJÝ׆ýÿÕQ ØY-×[M×m×NÙ“}ÔŠ­ØKÍÕs}Ԏה½Ùjý×|]ؘ؛Ò1ÍØuÚšýØœmÓ§Ú’]ÕŸØ{]Ø™MÚ®ÍÚ‰=Ø«­Óž}Ò¿Ô²]Ù¼mÙ¥}Ù»-Ø©=Ú„mÙÆÛ‡­ÛÎÝÚÝÙ¢ýÙ®]Ü´mÙ·íݦ½ÜÓÜÏÝÒâÝÛämÝÙ ÞMÖË]ÞÝÍݶ­ÞìýÝVÛðMÜcݳ-ܵÖùÜÈ­ÚÔ½Þ¼MpP&P'Àà Þà ~.áîàánþàÞáÎàâ^á!þáá.â*n(Þâ,.á/nÿá1áNâã^ã+^â:Žã#áîà?Þâ3nã.®âGÞã@®ã9Nã;žäPþäHâCNâK.åU®äF^äSäM®å=žãWîåCnáXÎåhnæcæNnâožæ_~ãoÎãbâu~ç7.çHNäQÞçp~ážâPžå|~ç‡Þáqžçn^èN>è~¾åk>é’nç‰Nç_æ^émŽé€néy藾扞åéîNîÄî·í¿®íêþíñ®î>(( ?ð) Oð(°ð ŸðoðÏðïð /ñðßð/ñOñ ßñßðñ ßñ&Oòñ'¯ñ*ò ò/ó!ïò?ñ)Ïò!Ÿó?ò,¿ò;óïóßò2Oóó_ô.ò?¿ô$/ô%¯òOôJôF?ðWðô6Oô"?õ=/õ_öVoõUŸõdßõ9õ^ÿóf_öhßõlŸóC?óßôT?ön/÷b¿÷C?÷uÏõõJŸ÷j¿ÿõN¯÷[Ÿöm¿ø|_öj/øßøoøƒÿòpö‘_øŒïðˆoù”Ÿø7ï÷Qùƒöœÿø›ù«õ<¯úŽû¥?ú²Oû“¿ù¨ÿö°ûlõß÷µOù¿Ÿú—÷_/ú²ü¾/ü¬ú™¯û_õt?ùË_óÑoú•ÿü¸ßùÃÿòxßùËôšý«¿ý­OüÇúáü-ÿý»¿þ³ü€ŸýçýñÏû€+€,,,‚…†„†‡‰ˆ‰ƒŽ‚ŒŠ‘”“…„’™‹’››–Ÿ•—ž¢œ¤Œ¢š«ž©°¦³£²¶©¨µ±¤¨¡·¦¾ªÂÓ¹À´³Á²Ê˜¿ÿº¸¥½•¬ÓºÆ¹ˆ×¯ÛÈÒÒÍÈ ¿ØÑÕÝ⥎à»éíìÎÝÙæÄ±åÉçÜáðøÃÌí ôFϵm]X‹¡¼‚§ <¨Ê¡­~¢û¦Ïß2rùêYÒ&òÒ=‹îJj$ip—‹ ßuÌxR"§~ÇUÃÓÚÌg½Ç‚B† G‘jØÀ´)Ò K2ÍÕiU©J¯J¥ÕjT­V«‚Uêu,Ù¦`ÍjMÛm[·XŸ¾ºÔ¬\¬v¯Ž…ª¶-[¼]ÿn{vkÞº„¹Ž›u®`º‹!Ã7ïáÂakèëµ3eÉ '6œqeΑ/?Î\Ù4^ÔŸU;Þ<ÛsÿhЫoë¾»ØrmÆ|‡†³hÖ½Ãö,Û¶s´Ë//¾Ö¯ðçS›¿¾>YûpÚ‘¿‡§^útyßᙟ·^ùxôÝŠ“›<ýhò­çËßž¾ûz켈Þ~¤õ'YuõaW‚åñG rÒ]‡ßpn%xnö ¨Üj8•4 â Œh"‰%6°À‰ ¤¸b.²£‰*ªØ"+ºc(Џ#‰4–øãŒ5ùâ1îˆ$Ž62Ùc‘+i$‹KBÙä• 9eJÉd’^Z9¤”/Fy£•RŽyf™[féc›[v)¦‰r²©¦“kÊgZV©e‘~Æù%žxÞ¹gž\ÿŠ¥žuR©¨šò¨ã£'¾i£‰fú§Š²ù¤§)B:(š–Žºé›sjŠ*§hŠÚꪎ¦ ꈆbjf¡¦V:ã¥a²šc¯tv묇Fz뢒Â*(¯€æj롸¾Zl®É"{ì³@þÚ¬¬z‚Zk´Q–Ê­ Ü>k¨·”¶j,–ßn‹î¸Ç¾K¬«¾v[bŸÔš¬»û+/£àzÉ쩪*‰ï¸úª ç¹Ã¬.µñ2@Áwð€XÜÆc¬1Çxœq"oœñÅ(|rÈ'›LòÊ-ƒìqÉÓŒ1ÍÛ3Î/k¬³Ê= 3ÐÇ<4ÏE´È"|³ÑAoü³ÐQOÿíòÒP'MuÊKóŒ³Ó)SmuÔ>·:Ð/Kþ¾ø×O½ãüãŽÿþÏãÞöâç¼ñ]lhÁ> @0p Tà(Á.‚ œàØ@ VÿpƒáChA z‚'¼` %®P…,Üà _ØÁÆÐ†&$¡?HÃRP‚Ô¡ [(Äqƒ7Da •C&:°‡3$!XD‘‡F´"›ÈA(ê°ƒ^œbµ(F,î0ƒUÄá¹hÁ'®qŒjáÁxE&öÐsd£—¸F<–0ˆ["Q˜Â:ž±‹oìãõE@š±Œh d!yÈ6æñŽ‹„£åGAƇšì¢ ÓIJ&Ñ“„T$(éEI惬4¤#S9HFN²”´ü¤cyIR"’“›D¥(OJK®ò•™Ä })ÌSò”ÆÜ%2[ùÈM.ñ—ÿͬä"9MnVó— \¦+)Êgn³—ÝD'gyÈlR†âü¦;oiKd³“ÞÌ¥5?@€ úÏ€5¨AšÐ‚6” ÀCŠPˆ´¡ý'CšÑ‰4£µ¨G-úχŽT¡%%iDQzP ”£*Ý(K]ŠQ‚:4¤3©NszÑ4¥,}iP+:T˜¤½)R}jÔŸâ¨7å©S…:U¢Vµ©ݨRUzÒ¨:Õ¤LíiQÓ„Òt©c¥jVÍVZu­X¥(Z¯ºRº>t«Rë\ŸW¨Â•¬c=+Wc Ó½òõ°~í*DiZVÆ"¶¥ƒMÿ«cKÑÆFvª…½¬^5KY¿V°vµl^?«ÖÏRö£š=ì^;ûØÒºu²¢ýjY […2Ö³†uklÿ*Ø…fv´¬«mS«[Ðòv·b¥«kWÊZ™Ê6­k­mUs[×âõ¹^í+_ƒ;[ãš¹×]lXW+Òð&w³yå.tåÚÝÞb÷¯Eàó)Jsv¾Iäæ ÈLs¾Ó”ç¼g0ñ`ÆSŸ\,g-¡ Ìú¦SÀ•õ{7 ßO‡Ö»ž-îr…ÚÜ·~Ø¢¦-«}RMÏú¼Uµ¯‹l—¾Z¼ºÖ®p³ maOûص†µ°¥«Ýa;ØÃuv¶ÏËkÒ~»¸•F7UÉkus;±ÏVî»™ÛjZÓû¶¹·§Ùkÿëp§;µ¼n·· þkƒw»ºË¾7dG»ð×F|ߪ¶îµ¡ð|÷šáÔv8®O+kÛŽ|¼%—¸´AnŒû[¾($ð•ãxç ‹p¿.ô’—œe#ÊdŽs ]K>¯¹À.ó¢ÙHtr"ºÏMNºwÙô½ž3ö¹›—®hLf“Î«ŽfóÜæ`¯9(Ù9ó£«ë=z2±,e9ûYël´’]a_ö\îaÇó”ùb¨·]îK4×o÷KžÎ‰W:”ÉNèÊÿ=ífü“ç~d´Ÿ3ðMvåwÎ÷¨ãÝÎf{ÙáîÂÑ—þñH?½ây~úSÙÈvn¹Q[mÜÿ×Ó®Ç>p‹Üå’µéÆM­rl7½Æo8òzòu“wÝòŽ7¿o½ü€kÛù߇þÄ¥Ïòìû>ä»§wôÁOZrWŸÛ×¾¾Ë¿}‘·¶û$G5ö“{¶ö>ùÇÇögm͆pÃçqîFÄÖoH~#eoáÇ|ìWqã‡~ô—q—løpæ¦~ø~èµkHº×rèo¨}+·~&È‚æQ è}ì6‚ÅW-hƒ1Øq&‡(§ò÷q.XÓ_sž×f˜¤v­„s®gx«W{RÇy]æC Ô„n×wt7f˜·xHd…¬wvZøy‰ä…W'f6{Z&vyS—ÿ†š÷sdøtWhz€§„¢¤z{&‡¬wyb˜y¡·†qÇ`7Ve¤ç„àD{¨Ç…º4xü¥s¯÷„±W‡~¸ˆ€8LØuQÈeq˜c`x†’熸y —u’¨ˆû$z‘Txs{˜({Ÿxzzf…˜A›øM(s¯¨M]g„aˆ„Ф„ú¥C¸w†x‹u††°¨yµhvxˆ™h‡C—ŠŽXŒÍȇ^7†ÒHŒ«x‰wWŠˆ¨†¢ˆ‹m˜Œ¡‡Ù(‹ÍhŒl(…d‹F†hSFŽ”Žt(ˆo„‡‡Æ‰Õx„ó¨‹o¸uV—dèÛ茮8ŽYŽ™I¬Ø[8yçøŽ©ŽˆˆÿŒ Y?ÇŽP˜Y`¨èއW†~ç?‹úXtz˜sÚø…ýØ‹ÿˆMöhç§€ÆÆX*X“Æ|9x€û·‚8(„'Ø€=ù“ìG]˜Aèj(|FÉq–”hqEùƒÄ'•ä·”(€Ú·€ÿ§\îǃ֗r„Aé•HXM k:øƒ „h9„í—‚´&—%–ðG–ÑV—6™~Q9j˜iø”ø‚ö—C –tYT…)€û†˜ëW•ey•]éiÙ€˜“âW‚ðÆ€Š)™{ •Wƒœ)”A¸–G铚ñW–oy––i—ÕÅ‹žøuª'“0©GÃXù’ž¨¸yÿŠU8‘#¹’%™››G´Œ‡d‘ÏØKÌéL¾)Ž Žù›ÕŒ¦LĹz$™…Ø9Šv”’NÇñh’É™‘Âi¤œwHé’牜©œ‡Èˆ,É›òyòx’êyŸ•XBy}(`ÑcÓyŒ¹èž% ÿÙŸéÉ Rv og†Ôvä9æI‹Ý™‡º‡èYŸ L4Išçfƒ8é™—FR8˜VIƒXiZI”x‚àG™¡™AÉ”¼Ç–ªéš$x¢:ªU5*ƒøF˜fYšCz¢È•9›‰I„Çšz‰”•é—£I¥>¤&ê¥Ù¤¹™Lª–=ššHŠ£ý‡¥7ÿo‹©¥"ˆ¤¯©¤P:£Šé¤Œi¤ŽÙ—¢vWEÚ–\£7ø¥[¦—9p9§;Š‚nz£0z¥{ªR¨)š/ºƒ‘º­š† ›j:³™@1§ ¶ ŸÊŒ[´›ñùGŸ iŸ "éÆ ž Š…©žØøªj‹ ºŽâ  ìy‘ ¢^&µŸé ¸v¢ «j¡ œÄJ…ÁŠ#z¬ÚžúÚ™ˆªŠû9­³:‰ëyo”­¸­(†­ÜH ×H®Àj®ð ¡"*¡|Ä®–¢«ª‹ڮĄ¯Îé‘¿M% ¨,˜¢_¹¢(Õ¢N9©n¤^:¦4Z©2xÿ©Vú¤›Úm‹:ƒp ±J Y{¤Û¥+¨˜i‚Žª™u*}!»]бš¥}ú£˜š¤BЍ&»²™É—tšU3{¦/›¦1»¦€¹³Áç£@Û±$;•‰z²¹/Õ˜@)§›Ú²Ûö§)ë™Rj§…j³{±0ø³‹µ0«}›oºšb;™A{˜8+±`I›¸ªâIªó•Ÿ§«·:®¦¬Û«Â*­Åô·ó‰«ÐÙ¡ûÈ«…Ë·ÜÊÛ c¹¬åj¬ˆ«’Ïzœ†Û·HFˆé¸Ï©¹uW­ôÚŽýZy«¬¬ºòJ¸ü©¯ ºÅúºGגɹ>Ǻâ­Ùé¸Þº»Úúÿ®°ëC¸ ­¾jc¥;‹„t¼»¸º;°$z{Këp[¨ i‚Ù°l«´kšM»²Vk¦D[¶ZKjk[³hê¶~ù½’ʩۻ¤`kn6ª§*»µ,[¾û—âû•>{¶=˜¶d+´ó;—\ëµQi¿UŠ¿<¾ãÖ¦¼¥5§7›±†ùo³%µ<«©C{´à›½#Û¾oû¾¬¿üµµ ì¿ì±L[šü;– êkÁbJÂYŠQr ªöu›pg·Ÿ:¼˜Ë¸’ë·•[žŠÛºª*»AìªÊk¹[¼‡««‰ËŒÌëÄÁ+t«¸¾;¹²ëòڼЈ·Åy¹]LÅ«‘ ÙŠ×:ÿÄZÄMŒÅλ½KxÓØ›SìÆ_ ÇhEèj­¶{F\¼·^<¯ª{Æwœ¹e|Š<…@Œ’ͺ«RÌ¡Pl¹lL¼v,ÈKT°•Ylli¢Å“'̨ڛµ"¼ÀäÛÂyùÂ%ü˜L\1Œ§SÁÚÊç«Ê,€!Œ¾›<ÁSúÉÛÁ¢ÜµÌV¦ëk¾mK˹lË <ÂlÊñ+²ÿ‹ËLÊ„ÊËΜÂÑ+£ÝK¿F{U2œ©T›Á²\Ìò«À7ÀQªÌ+ ·RΡœ¿öÇÌ®|”ììËî,›óF 0@@þÜÏüÐþ,Ðý Ðÿ<ÐÐÐнÐýÐÿÐ=Ð mÑ Ñ]ÑÝÑ ÑÑ!íÐ#MÑ Ò]Ñ"ýÏÍÐ$ýÒ Ó)ÍÑ.½Ò Ó-}Ò/ÒÐÒ4=Ó-Ñ Ô­Ó5½Ó3­ÒCÓKÔE-Ó?mÔJÓ=Õ.MÕ-ÕM]ÒGmÒ\Õ\mÓI}Ó^ÒNÔC}Ö<=ÑZ­Õ]}ÕoÖ­Ö2M×XmÕx×BýÖbÓeMÖmýÔ ]Õ` Õ{mÖÔ}­ØU؈=ØYýÕsM؇}ÖL-Ø—mÕŽMÖw]Ø€ÝÙ“ Ù(ÙR½ÙcýÕœMÚe­Ú[ýØŸ Ùq­×‚ýÚyMÔ°íÙlڒו*Ö ×¶ÍÚ¡½Ö‹ Ú¼ýÛ…ÝÚ£ÛÙÃ]׉}צí×·ÝÛ°ÝÏ;dnsjava-2.1.5/doc/resources/titlebar_end.gif100644 0 0 1521 12131352540 16171 0ustar 0 0 GIF89a(æÿÿÿð 9îŸ8ß•5ð¡:ï 9â—6ñ¢;íŸ:ÚŽ0¾|*½{*½|*»z)ºz)¶v(¶w(Û1ÚŽ1Ú1Ì….̆.ȃ-À,À~+¿}+¿~+¾|+»z*¸w)¸x)¶w)ÒŠ0Ò‹0ψ/̆/É„.ȃ.È„.Æ‚-Å-Å‚-Â,€,¹x*¸x*Ò‹1ω0å˜6ã—6ß”5Ü‘4Ù3Õ2ð :êœ8è›8æ˜7æ™7å˜7â–6Ý’5Ú4Ù4ÕŽ3ñ¡;ð ;íž:ìž:ëœ9ë9êœ9çš8ó¢<Ý•?Ý—Aß›Hç³wèµzùíàûòêÿÿÿ!ùR,(ÿ€ „ †‚…MOQJ‘’“C:LPBž™œ™;N™7ª«§ªKE ¶E¸¹µ ¸¶D 8HGGF8ÅÆÁÄÆHHI9IÑÒÒÐÑ9Ð;<Û<Ú;ÞÜÚ1<=2==éèêçêæ=3ó3õóöø÷4>4ü7†‚küPˆpaÃ@€Ô `#ˆE3V ¢1È„/Bˆ 2DI“"LN£åˆ—0YÂx9s Hè´@ÂOœ;u’P`¢Ä‰%ŠšPj4i‰ '$¨@A5… «W§¢°ºÅXˆ;6¬X +0LØ !C† p®ã²}»ám 0`° A_¿yùæmÀAB‡<8Ü1âÅ"SøàâÇ—-c®Œù²‡ "@€"BiÓ¡I‡bråÌ7gö Z´êÓ§U›nMYólÙ±?§¾½:5nÞ¯1Çî|Boؾ9kn»4nã«‘û^.öpëÅEw½=úoê£Á£Ÿ<ôÌÝ[ '¾^7k÷ÊÍ7ÿ¾>÷xDˆL H€ (Á ;dnsjava-2.1.5/doc/serialized-form.html100644 0 0 144110 12131352547 15067 0ustar 0 0 Serialized Form (dnsjava documentation)

Serialized Form

dnsjava-2.1.5/doc/stylesheet.css100644 0 0 25603 12131352540 13766 0ustar 0 0 /* Javadoc style sheet */ /* Overall document style */ body { background-color:#ffffff; color:#353833; font-family:Arial, Helvetica, sans-serif; font-size:76%; margin:0; } a:link, a:visited { text-decoration:none; color:#4c6b87; } a:hover, a:focus { text-decoration:none; color:#bb7a2a; } a:active { text-decoration:none; color:#4c6b87; } a[name] { color:#353833; } a[name]:hover { text-decoration:none; color:#353833; } pre { font-size:1.3em; } h1 { font-size:1.8em; } h2 { font-size:1.5em; } h3 { font-size:1.4em; } h4 { font-size:1.3em; } h5 { font-size:1.2em; } h6 { font-size:1.1em; } ul { list-style-type:disc; } code, tt { font-size:1.2em; } dt code { font-size:1.2em; } table tr td dt code { font-size:1.2em; vertical-align:top; } sup { font-size:.6em; } /* Document title and Copyright styles */ .clear { clear:both; height:0px; overflow:hidden; } .aboutLanguage { float:right; padding:0px 21px; font-size:.8em; z-index:200; margin-top:-7px; } .legalCopy { margin-left:.5em; } .bar a, .bar a:link, .bar a:visited, .bar a:active { color:#FFFFFF; text-decoration:none; } .bar a:hover, .bar a:focus { color:#bb7a2a; } .tab { background-color:#0066FF; background-image:url(resources/titlebar.gif); background-position:left top; background-repeat:no-repeat; color:#ffffff; padding:8px; width:5em; font-weight:bold; } /* Navigation bar styles */ .bar { background-image:url(resources/background.gif); background-repeat:repeat-x; color:#FFFFFF; padding:.8em .5em .4em .8em; height:auto;/*height:1.8em;*/ font-size:1em; margin:0; } .topNav { background-image:url(resources/background.gif); background-repeat:repeat-x; color:#FFFFFF; float:left; padding:0; width:100%; clear:right; height:2.8em; padding-top:10px; overflow:hidden; } .bottomNav { margin-top:10px; background-image:url(resources/background.gif); background-repeat:repeat-x; color:#FFFFFF; float:left; padding:0; width:100%; clear:right; height:2.8em; padding-top:10px; overflow:hidden; } .subNav { background-color:#dee3e9; border-bottom:1px solid #9eadc0; float:left; width:100%; overflow:hidden; } .subNav div { clear:left; float:left; padding:0 0 5px 6px; } ul.navList, ul.subNavList { float:left; margin:0 25px 0 0; padding:0; } ul.navList li{ list-style:none; float:left; padding:3px 6px; } ul.subNavList li{ list-style:none; float:left; font-size:90%; } .topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { color:#FFFFFF; text-decoration:none; } .topNav a:hover, .bottomNav a:hover { text-decoration:none; color:#bb7a2a; } .navBarCell1Rev { background-image:url(resources/tab.gif); background-color:#a88834; color:#FFFFFF; margin: auto 5px; border:1px solid #c9aa44; } /* Page header and footer styles */ .header, .footer { clear:both; margin:0 20px; padding:5px 0 0 0; } .indexHeader { margin:10px; position:relative; } .indexHeader h1 { font-size:1.3em; } .title { color:#2c4557; margin:10px 0; } .subTitle { margin:5px 0 0 0; } .header ul { margin:0 0 25px 0; padding:0; } .footer ul { margin:20px 0 5px 0; } .header ul li, .footer ul li { list-style:none; font-size:1.2em; } /* Heading styles */ div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { background-color:#dee3e9; border-top:1px solid #9eadc0; border-bottom:1px solid #9eadc0; margin:0 0 6px -8px; padding:2px 5px; } ul.blockList ul.blockList ul.blockList li.blockList h3 { background-color:#dee3e9; border-top:1px solid #9eadc0; border-bottom:1px solid #9eadc0; margin:0 0 6px -8px; padding:2px 5px; } ul.blockList ul.blockList li.blockList h3 { padding:0; margin:15px 0; } ul.blockList li.blockList h2 { padding:0px 0 20px 0; } /* Page layout container styles */ .contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { clear:both; padding:10px 20px; position:relative; } .indexContainer { margin:10px; position:relative; font-size:1.0em; } .indexContainer h2 { font-size:1.1em; padding:0 0 3px 0; } .indexContainer ul { margin:0; padding:0; } .indexContainer ul li { list-style:none; } .contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { font-size:1.1em; font-weight:bold; margin:10px 0 0 0; color:#4E4E4E; } .contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { margin:10px 0 10px 20px; } .serializedFormContainer dl.nameValue dt { margin-left:1px; font-size:1.1em; display:inline; font-weight:bold; } .serializedFormContainer dl.nameValue dd { margin:0 0 0 1px; font-size:1.1em; display:inline; } /* List styles */ ul.horizontal li { display:inline; font-size:0.9em; } ul.inheritance { margin:0; padding:0; } ul.inheritance li { display:inline; list-style:none; } ul.inheritance li ul.inheritance { margin-left:15px; padding-left:15px; padding-top:1px; } ul.blockList, ul.blockListLast { margin:10px 0 10px 0; padding:0; } ul.blockList li.blockList, ul.blockListLast li.blockList { list-style:none; margin-bottom:25px; } ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { padding:0px 20px 5px 10px; border:1px solid #9eadc0; background-color:#f9f9f9; } ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { padding:0 0 5px 8px; background-color:#ffffff; border:1px solid #9eadc0; border-top:none; } ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { margin-left:0; padding-left:0; padding-bottom:15px; border:none; border-bottom:1px solid #9eadc0; } ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { list-style:none; border-bottom:none; padding-bottom:0; } table tr td dl, table tr td dl dt, table tr td dl dd { margin-top:0; margin-bottom:1px; } /* Table styles */ .contentContainer table, .classUseContainer table, .constantValuesContainer table { border-bottom:1px solid #9eadc0; width:100%; } .contentContainer ul li table, .classUseContainer ul li table, .constantValuesContainer ul li table { width:100%; } .contentContainer .description table, .contentContainer .details table { border-bottom:none; } .contentContainer ul li table th.colOne, .contentContainer ul li table th.colFirst, .contentContainer ul li table th.colLast, .classUseContainer ul li table th, .constantValuesContainer ul li table th, .contentContainer ul li table td.colOne, .contentContainer ul li table td.colFirst, .contentContainer ul li table td.colLast, .classUseContainer ul li table td, .constantValuesContainer ul li table td{ vertical-align:top; padding-right:20px; } .contentContainer ul li table th.colLast, .classUseContainer ul li table th.colLast,.constantValuesContainer ul li table th.colLast, .contentContainer ul li table td.colLast, .classUseContainer ul li table td.colLast,.constantValuesContainer ul li table td.colLast, .contentContainer ul li table th.colOne, .classUseContainer ul li table th.colOne, .contentContainer ul li table td.colOne, .classUseContainer ul li table td.colOne { padding-right:3px; } .overviewSummary caption, .packageSummary caption, .contentContainer ul.blockList li.blockList caption, .summary caption, .classUseContainer caption, .constantValuesContainer caption { position:relative; text-align:left; background-repeat:no-repeat; color:#FFFFFF; font-weight:bold; clear:none; overflow:hidden; padding:0px; margin:0px; } caption a:link, caption a:hover, caption a:active, caption a:visited { color:#FFFFFF; } .overviewSummary caption span, .packageSummary caption span, .contentContainer ul.blockList li.blockList caption span, .summary caption span, .classUseContainer caption span, .constantValuesContainer caption span { white-space:nowrap; padding-top:8px; padding-left:8px; display:block; float:left; background-image:url(resources/titlebar.gif); height:18px; } .overviewSummary .tabEnd, .packageSummary .tabEnd, .contentContainer ul.blockList li.blockList .tabEnd, .summary .tabEnd, .classUseContainer .tabEnd, .constantValuesContainer .tabEnd { width:10px; background-image:url(resources/titlebar_end.gif); background-repeat:no-repeat; background-position:top right; position:relative; float:left; } ul.blockList ul.blockList li.blockList table { margin:0 0 12px 0px; width:100%; } .tableSubHeadingColor { background-color: #EEEEFF; } .altColor { background-color:#eeeeef; } .rowColor { background-color:#ffffff; } .overviewSummary td, .packageSummary td, .contentContainer ul.blockList li.blockList td, .summary td, .classUseContainer td, .constantValuesContainer td { text-align:left; padding:3px 3px 3px 7px; } th.colFirst, th.colLast, th.colOne, .constantValuesContainer th { background:#dee3e9; border-top:1px solid #9eadc0; border-bottom:1px solid #9eadc0; text-align:left; padding:3px 3px 3px 7px; } td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { font-weight:bold; } td.colFirst, th.colFirst { border-left:1px solid #9eadc0; white-space:nowrap; } td.colLast, th.colLast { border-right:1px solid #9eadc0; } td.colOne, th.colOne { border-right:1px solid #9eadc0; border-left:1px solid #9eadc0; } table.overviewSummary { padding:0px; margin-left:0px; } table.overviewSummary td.colFirst, table.overviewSummary th.colFirst, table.overviewSummary td.colOne, table.overviewSummary th.colOne { width:25%; vertical-align:middle; } table.packageSummary td.colFirst, table.overviewSummary th.colFirst { width:25%; vertical-align:middle; } /* Content styles */ .description pre { margin-top:0; } .deprecatedContent { margin:0; padding:10px 0; } .docSummary { padding:0; } /* Formatting effect styles */ .sourceLineNo { color:green; padding:0 30px 0 0; } h1.hidden { visibility:hidden; overflow:hidden; font-size:.9em; } .block { display:block; margin:3px 0 0 0; } .strong { font-weight:bold; } dnsjava-2.1.5/examples.html100644 0 0 4516 11361201467 13007 0ustar 0 0 dnsjava examples

dnsjava examples

All of these examples are code fragments. Code using these fragments should check exceptions when appropriate, and should:
import org.xbill.DNS.*;

Get the IP address associated with a name:


InetAddress addr = Address.getByName("www.dnsjava.org");

Get the MX target and preference of a name:


Record [] records = new Lookup("gmail.com", Type.MX).run();
for (int i = 0; i < records.length; i++) {
	MXRecord mx = (MXRecord) records[i];
	System.out.println("Host " + mx.getTarget() + " has preference ", mx.getPriority());
}

Query a remote name server for its version:


Lookup l = new Lookup("version.bind.", Type.TXT, DClass.CH);
l.setResolver(new SimpleResolver(args[0]));
l.run();
if (l.getResult() == Lookup.SUCCESSFUL)
	System.out.println(l.getAnswers()[0].rdataToString());

Transfer a zone from a server and print it:


ZoneTransferIn xfr = ZoneTransferIn.newAXFR(new Name("."), "192.5.5.241", null);
List records = xfr.run();
for (Iterator it = records.iterator(); it.hasNext(); )
	System.out.println(it.next());

Use DNS dynamic update to set the address of a host to a value specified on the command line:


Name zone = Name.fromString("dyn.test.example.");
Name host = Name.fromString("host", zone);
Update update = new Update(zone);
update.replace(host, Type.A, 3600, args[0]);

Resolver res = new SimpleResolver("10.0.0.1");
res.setTSIGKey(new TSIG(host, base64.fromString("1234")));
res.setTCP(true);

Message response = res.send(update);

Manipulate domain names:


Name n = Name.fromString("www.dnsjava.org");
Name o = Name.fromString("dnsjava.org");
System.out.println(n.subdomain(o));            // True

System.out.println(n.compareTo(o));            // > 0

Name rel = n.relativize(o);                    // the relative name 'www'
Name n2 = Name.concatenate(rel, o);
System.out.println(n2.equals(n));              // True

// www
// dnsjava
// org
for (int i = 0; i < n.labels(); i++)
	System.out.println(n.getLabelString(i));
dnsjava-2.1.5/jnamed.java100644 0 0 36625 11256272724 12441 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) import java.io.*; import java.net.*; import java.util.*; import org.xbill.DNS.*; /** @author Brian Wellington <bwelling@xbill.org> */ public class jnamed { static final int FLAG_DNSSECOK = 1; static final int FLAG_SIGONLY = 2; Map caches; Map znames; Map TSIGs; private static String addrport(InetAddress addr, int port) { return addr.getHostAddress() + "#" + port; } public jnamed(String conffile) throws IOException, ZoneTransferException { FileInputStream fs; InputStreamReader isr; BufferedReader br; List ports = new ArrayList(); List addresses = new ArrayList(); try { fs = new FileInputStream(conffile); isr = new InputStreamReader(fs); br = new BufferedReader(isr); } catch (Exception e) { System.out.println("Cannot open " + conffile); return; } try { caches = new HashMap(); znames = new HashMap(); TSIGs = new HashMap(); String line = null; while ((line = br.readLine()) != null) { StringTokenizer st = new StringTokenizer(line); if (!st.hasMoreTokens()) continue; String keyword = st.nextToken(); if (!st.hasMoreTokens()) { System.out.println("Invalid line: " + line); continue; } if (keyword.charAt(0) == '#') continue; if (keyword.equals("primary")) addPrimaryZone(st.nextToken(), st.nextToken()); else if (keyword.equals("secondary")) addSecondaryZone(st.nextToken(), st.nextToken()); else if (keyword.equals("cache")) { Cache cache = new Cache(st.nextToken()); caches.put(new Integer(DClass.IN), cache); } else if (keyword.equals("key")) { String s1 = st.nextToken(); String s2 = st.nextToken(); if (st.hasMoreTokens()) addTSIG(s1, s2, st.nextToken()); else addTSIG("hmac-md5", s1, s2); } else if (keyword.equals("port")) { ports.add(Integer.valueOf(st.nextToken())); } else if (keyword.equals("address")) { String addr = st.nextToken(); addresses.add(Address.getByAddress(addr)); } else { System.out.println("unknown keyword: " + keyword); } } if (ports.size() == 0) ports.add(new Integer(53)); if (addresses.size() == 0) addresses.add(Address.getByAddress("0.0.0.0")); Iterator iaddr = addresses.iterator(); while (iaddr.hasNext()) { InetAddress addr = (InetAddress) iaddr.next(); Iterator iport = ports.iterator(); while (iport.hasNext()) { int port = ((Integer)iport.next()).intValue(); addUDP(addr, port); addTCP(addr, port); System.out.println("jnamed: listening on " + addrport(addr, port)); } } System.out.println("jnamed: running"); } finally { fs.close(); } } public void addPrimaryZone(String zname, String zonefile) throws IOException { Name origin = null; if (zname != null) origin = Name.fromString(zname, Name.root); Zone newzone = new Zone(origin, zonefile); znames.put(newzone.getOrigin(), newzone); } public void addSecondaryZone(String zone, String remote) throws IOException, ZoneTransferException { Name zname = Name.fromString(zone, Name.root); Zone newzone = new Zone(zname, DClass.IN, remote); znames.put(zname, newzone); } public void addTSIG(String algstr, String namestr, String key) throws IOException { Name name = Name.fromString(namestr, Name.root); TSIGs.put(name, new TSIG(algstr, namestr, key)); } public Cache getCache(int dclass) { Cache c = (Cache) caches.get(new Integer(dclass)); if (c == null) { c = new Cache(dclass); caches.put(new Integer(dclass), c); } return c; } public Zone findBestZone(Name name) { Zone foundzone = null; foundzone = (Zone) znames.get(name); if (foundzone != null) return foundzone; int labels = name.labels(); for (int i = 1; i < labels; i++) { Name tname = new Name(name, i); foundzone = (Zone) znames.get(tname); if (foundzone != null) return foundzone; } return null; } public RRset findExactMatch(Name name, int type, int dclass, boolean glue) { Zone zone = findBestZone(name); if (zone != null) return zone.findExactMatch(name, type); else { RRset [] rrsets; Cache cache = getCache(dclass); if (glue) rrsets = cache.findAnyRecords(name, type); else rrsets = cache.findRecords(name, type); if (rrsets == null) return null; else return rrsets[0]; /* not quite right */ } } void addRRset(Name name, Message response, RRset rrset, int section, int flags) { for (int s = 1; s <= section; s++) if (response.findRRset(name, rrset.getType(), s)) return; if ((flags & FLAG_SIGONLY) == 0) { Iterator it = rrset.rrs(); while (it.hasNext()) { Record r = (Record) it.next(); if (r.getName().isWild() && !name.isWild()) r = r.withName(name); response.addRecord(r, section); } } if ((flags & (FLAG_SIGONLY | FLAG_DNSSECOK)) != 0) { Iterator it = rrset.sigs(); while (it.hasNext()) { Record r = (Record) it.next(); if (r.getName().isWild() && !name.isWild()) r = r.withName(name); response.addRecord(r, section); } } } private final void addSOA(Message response, Zone zone) { response.addRecord(zone.getSOA(), Section.AUTHORITY); } private final void addNS(Message response, Zone zone, int flags) { RRset nsRecords = zone.getNS(); addRRset(nsRecords.getName(), response, nsRecords, Section.AUTHORITY, flags); } private final void addCacheNS(Message response, Cache cache, Name name) { SetResponse sr = cache.lookupRecords(name, Type.NS, Credibility.HINT); if (!sr.isDelegation()) return; RRset nsRecords = sr.getNS(); Iterator it = nsRecords.rrs(); while (it.hasNext()) { Record r = (Record) it.next(); response.addRecord(r, Section.AUTHORITY); } } private void addGlue(Message response, Name name, int flags) { RRset a = findExactMatch(name, Type.A, DClass.IN, true); if (a == null) return; addRRset(name, response, a, Section.ADDITIONAL, flags); } private void addAdditional2(Message response, int section, int flags) { Record [] records = response.getSectionArray(section); for (int i = 0; i < records.length; i++) { Record r = records[i]; Name glueName = r.getAdditionalName(); if (glueName != null) addGlue(response, glueName, flags); } } private final void addAdditional(Message response, int flags) { addAdditional2(response, Section.ANSWER, flags); addAdditional2(response, Section.AUTHORITY, flags); } byte addAnswer(Message response, Name name, int type, int dclass, int iterations, int flags) { SetResponse sr; byte rcode = Rcode.NOERROR; if (iterations > 6) return Rcode.NOERROR; if (type == Type.SIG || type == Type.RRSIG) { type = Type.ANY; flags |= FLAG_SIGONLY; } Zone zone = findBestZone(name); if (zone != null) sr = zone.findRecords(name, type); else { Cache cache = getCache(dclass); sr = cache.lookupRecords(name, type, Credibility.NORMAL); } if (sr.isUnknown()) { addCacheNS(response, getCache(dclass), name); } if (sr.isNXDOMAIN()) { response.getHeader().setRcode(Rcode.NXDOMAIN); if (zone != null) { addSOA(response, zone); if (iterations == 0) response.getHeader().setFlag(Flags.AA); } rcode = Rcode.NXDOMAIN; } else if (sr.isNXRRSET()) { if (zone != null) { addSOA(response, zone); if (iterations == 0) response.getHeader().setFlag(Flags.AA); } } else if (sr.isDelegation()) { RRset nsRecords = sr.getNS(); addRRset(nsRecords.getName(), response, nsRecords, Section.AUTHORITY, flags); } else if (sr.isCNAME()) { CNAMERecord cname = sr.getCNAME(); RRset rrset = new RRset(cname); addRRset(name, response, rrset, Section.ANSWER, flags); if (zone != null && iterations == 0) response.getHeader().setFlag(Flags.AA); rcode = addAnswer(response, cname.getTarget(), type, dclass, iterations + 1, flags); } else if (sr.isDNAME()) { DNAMERecord dname = sr.getDNAME(); RRset rrset = new RRset(dname); addRRset(name, response, rrset, Section.ANSWER, flags); Name newname; try { newname = name.fromDNAME(dname); } catch (NameTooLongException e) { return Rcode.YXDOMAIN; } rrset = new RRset(new CNAMERecord(name, dclass, 0, newname)); addRRset(name, response, rrset, Section.ANSWER, flags); if (zone != null && iterations == 0) response.getHeader().setFlag(Flags.AA); rcode = addAnswer(response, newname, type, dclass, iterations + 1, flags); } else if (sr.isSuccessful()) { RRset [] rrsets = sr.answers(); for (int i = 0; i < rrsets.length; i++) addRRset(name, response, rrsets[i], Section.ANSWER, flags); if (zone != null) { addNS(response, zone, flags); if (iterations == 0) response.getHeader().setFlag(Flags.AA); } else addCacheNS(response, getCache(dclass), name); } return rcode; } byte [] doAXFR(Name name, Message query, TSIG tsig, TSIGRecord qtsig, Socket s) { Zone zone = (Zone) znames.get(name); boolean first = true; if (zone == null) return errorMessage(query, Rcode.REFUSED); Iterator it = zone.AXFR(); try { DataOutputStream dataOut; dataOut = new DataOutputStream(s.getOutputStream()); int id = query.getHeader().getID(); while (it.hasNext()) { RRset rrset = (RRset) it.next(); Message response = new Message(id); Header header = response.getHeader(); header.setFlag(Flags.QR); header.setFlag(Flags.AA); addRRset(rrset.getName(), response, rrset, Section.ANSWER, FLAG_DNSSECOK); if (tsig != null) { tsig.applyStream(response, qtsig, first); qtsig = response.getTSIG(); } first = false; byte [] out = response.toWire(); dataOut.writeShort(out.length); dataOut.write(out); } } catch (IOException ex) { System.out.println("AXFR failed"); } try { s.close(); } catch (IOException ex) { } return null; } /* * Note: a null return value means that the caller doesn't need to do * anything. Currently this only happens if this is an AXFR request over * TCP. */ byte [] generateReply(Message query, byte [] in, int length, Socket s) throws IOException { Header header; boolean badversion; int maxLength; int flags = 0; header = query.getHeader(); if (header.getFlag(Flags.QR)) return null; if (header.getRcode() != Rcode.NOERROR) return errorMessage(query, Rcode.FORMERR); if (header.getOpcode() != Opcode.QUERY) return errorMessage(query, Rcode.NOTIMP); Record queryRecord = query.getQuestion(); TSIGRecord queryTSIG = query.getTSIG(); TSIG tsig = null; if (queryTSIG != null) { tsig = (TSIG) TSIGs.get(queryTSIG.getName()); if (tsig == null || tsig.verify(query, in, length, null) != Rcode.NOERROR) return formerrMessage(in); } OPTRecord queryOPT = query.getOPT(); if (queryOPT != null && queryOPT.getVersion() > 0) badversion = true; if (s != null) maxLength = 65535; else if (queryOPT != null) maxLength = Math.max(queryOPT.getPayloadSize(), 512); else maxLength = 512; if (queryOPT != null && (queryOPT.getFlags() & ExtendedFlags.DO) != 0) flags = FLAG_DNSSECOK; Message response = new Message(query.getHeader().getID()); response.getHeader().setFlag(Flags.QR); if (query.getHeader().getFlag(Flags.RD)) response.getHeader().setFlag(Flags.RD); response.addRecord(queryRecord, Section.QUESTION); Name name = queryRecord.getName(); int type = queryRecord.getType(); int dclass = queryRecord.getDClass(); if (type == Type.AXFR && s != null) return doAXFR(name, query, tsig, queryTSIG, s); if (!Type.isRR(type) && type != Type.ANY) return errorMessage(query, Rcode.NOTIMP); byte rcode = addAnswer(response, name, type, dclass, 0, flags); if (rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN) return errorMessage(query, rcode); addAdditional(response, flags); if (queryOPT != null) { int optflags = (flags == FLAG_DNSSECOK) ? ExtendedFlags.DO : 0; OPTRecord opt = new OPTRecord((short)4096, rcode, (byte)0, optflags); response.addRecord(opt, Section.ADDITIONAL); } response.setTSIG(tsig, Rcode.NOERROR, queryTSIG); return response.toWire(maxLength); } byte [] buildErrorMessage(Header header, int rcode, Record question) { Message response = new Message(); response.setHeader(header); for (int i = 0; i < 4; i++) response.removeAllRecords(i); if (rcode == Rcode.SERVFAIL) response.addRecord(question, Section.QUESTION); header.setRcode(rcode); return response.toWire(); } public byte [] formerrMessage(byte [] in) { Header header; try { header = new Header(in); } catch (IOException e) { return null; } return buildErrorMessage(header, Rcode.FORMERR, null); } public byte [] errorMessage(Message query, int rcode) { return buildErrorMessage(query.getHeader(), rcode, query.getQuestion()); } public void TCPclient(Socket s) { try { int inLength; DataInputStream dataIn; DataOutputStream dataOut; byte [] in; InputStream is = s.getInputStream(); dataIn = new DataInputStream(is); inLength = dataIn.readUnsignedShort(); in = new byte[inLength]; dataIn.readFully(in); Message query; byte [] response = null; try { query = new Message(in); response = generateReply(query, in, in.length, s); if (response == null) return; } catch (IOException e) { response = formerrMessage(in); } dataOut = new DataOutputStream(s.getOutputStream()); dataOut.writeShort(response.length); dataOut.write(response); } catch (IOException e) { System.out.println("TCPclient(" + addrport(s.getLocalAddress(), s.getLocalPort()) + "): " + e); } finally { try { s.close(); } catch (IOException e) {} } } public void serveTCP(InetAddress addr, int port) { try { ServerSocket sock = new ServerSocket(port, 128, addr); while (true) { final Socket s = sock.accept(); Thread t; t = new Thread(new Runnable() { public void run() {TCPclient(s);}}); t.start(); } } catch (IOException e) { System.out.println("serveTCP(" + addrport(addr, port) + "): " + e); } } public void serveUDP(InetAddress addr, int port) { try { DatagramSocket sock = new DatagramSocket(port, addr); final short udpLength = 512; byte [] in = new byte[udpLength]; DatagramPacket indp = new DatagramPacket(in, in.length); DatagramPacket outdp = null; while (true) { indp.setLength(in.length); try { sock.receive(indp); } catch (InterruptedIOException e) { continue; } Message query; byte [] response = null; try { query = new Message(in); response = generateReply(query, in, indp.getLength(), null); if (response == null) continue; } catch (IOException e) { response = formerrMessage(in); } if (outdp == null) outdp = new DatagramPacket(response, response.length, indp.getAddress(), indp.getPort()); else { outdp.setData(response); outdp.setLength(response.length); outdp.setAddress(indp.getAddress()); outdp.setPort(indp.getPort()); } sock.send(outdp); } } catch (IOException e) { System.out.println("serveUDP(" + addrport(addr, port) + "): " + e); } } public void addTCP(final InetAddress addr, final int port) { Thread t; t = new Thread(new Runnable() { public void run() {serveTCP(addr, port);}}); t.start(); } public void addUDP(final InetAddress addr, final int port) { Thread t; t = new Thread(new Runnable() { public void run() {serveUDP(addr, port);}}); t.start(); } public static void main(String [] args) { if (args.length > 1) { System.out.println("usage: jnamed [conf]"); System.exit(0); } jnamed s; try { String conf; if (args.length == 1) conf = args[0]; else conf = "jnamed.conf"; s = new jnamed(conf); } catch (IOException e) { System.out.println(e); } catch (ZoneTransferException e) { System.out.println(e); } } } dnsjava-2.1.5/lookup.java100644 0 0 2333 10200554054 12444 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) import org.xbill.DNS.*; /** @author Brian Wellington <bwelling@xbill.org> */ public class lookup { public static void printAnswer(String name, Lookup lookup) { System.out.print(name + ":"); int result = lookup.getResult(); if (result != Lookup.SUCCESSFUL) System.out.print(" " + lookup.getErrorString()); System.out.println(); Name [] aliases = lookup.getAliases(); if (aliases.length > 0) { System.out.print("# aliases: "); for (int i = 0; i < aliases.length; i++) { System.out.print(aliases[i]); if (i < aliases.length - 1) System.out.print(" "); } System.out.println(); } if (lookup.getResult() == Lookup.SUCCESSFUL) { Record [] answers = lookup.getAnswers(); for (int i = 0; i < answers.length; i++) System.out.println(answers[i]); } } public static void main(String [] args) throws Exception { int type = Type.A; int start = 0; if (args.length > 2 && args[0].equals("-t")) { type = Type.value(args[1]); if (type < 0) throw new IllegalArgumentException("invalid type"); start = 2; } for (int i = start; i < args.length; i++) { Lookup l = new Lookup(args[i], type); l.run(); printAnswer(args[i], l); } } } dnsjava-2.1.5/org/xbill/DNS/A6Record.java100644 0 0 5376 11254312416 15103 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; /** * A6 Record - maps a domain name to an IPv6 address (experimental) * * @author Brian Wellington */ public class A6Record extends Record { private static final long serialVersionUID = -8815026887337346789L; private int prefixBits; private InetAddress suffix; private Name prefix; A6Record() {} Record getObject() { return new A6Record(); } /** * Creates an A6 Record from the given data * @param prefixBits The number of bits in the address prefix * @param suffix The address suffix * @param prefix The name of the prefix */ public A6Record(Name name, int dclass, long ttl, int prefixBits, InetAddress suffix, Name prefix) { super(name, Type.A6, dclass, ttl); this.prefixBits = checkU8("prefixBits", prefixBits); if (suffix != null && Address.familyOf(suffix) != Address.IPv6) throw new IllegalArgumentException("invalid IPv6 address"); this.suffix = suffix; if (prefix != null) this.prefix = checkName("prefix", prefix); } void rrFromWire(DNSInput in) throws IOException { prefixBits = in.readU8(); int suffixbits = 128 - prefixBits; int suffixbytes = (suffixbits + 7) / 8; if (prefixBits < 128) { byte [] bytes = new byte[16]; in.readByteArray(bytes, 16 - suffixbytes, suffixbytes); suffix = InetAddress.getByAddress(bytes); } if (prefixBits > 0) prefix = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { prefixBits = st.getUInt8(); if (prefixBits > 128) { throw st.exception("prefix bits must be [0..128]"); } else if (prefixBits < 128) { String s = st.getString(); try { suffix = Address.getByAddress(s, Address.IPv6); } catch (UnknownHostException e) { throw st.exception("invalid IPv6 address: " + s); } } if (prefixBits > 0) prefix = st.getName(origin); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(prefixBits); if (suffix != null) { sb.append(" "); sb.append(suffix.getHostAddress()); } if (prefix != null) { sb.append(" "); sb.append(prefix); } return sb.toString(); } /** Returns the number of bits in the prefix */ public int getPrefixBits() { return prefixBits; } /** Returns the address suffix */ public InetAddress getSuffix() { return suffix; } /** Returns the address prefix */ public Name getPrefix() { return prefix; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(prefixBits); if (suffix != null) { int suffixbits = 128 - prefixBits; int suffixbytes = (suffixbits + 7) / 8; byte [] data = suffix.getAddress(); out.writeByteArray(data, 16 - suffixbytes, suffixbytes); } if (prefix != null) prefix.toWire(out, null, canonical); } } dnsjava-2.1.5/org/xbill/DNS/AAAARecord.java100644 0 0 2573 12110757267 15325 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; /** * IPv6 Address Record - maps a domain name to an IPv6 address * * @author Brian Wellington */ public class AAAARecord extends Record { private static final long serialVersionUID = -4588601512069748050L; private InetAddress address; AAAARecord() {} Record getObject() { return new AAAARecord(); } /** * Creates an AAAA Record from the given data * @param address The address suffix */ public AAAARecord(Name name, int dclass, long ttl, InetAddress address) { super(name, Type.AAAA, dclass, ttl); if (Address.familyOf(address) != Address.IPv6) throw new IllegalArgumentException("invalid IPv6 address"); this.address = address; } void rrFromWire(DNSInput in) throws IOException { if (name == null) address = InetAddress.getByAddress(in.readByteArray(16)); else address = InetAddress.getByAddress(name.toString(), in.readByteArray(16)); } void rdataFromString(Tokenizer st, Name origin) throws IOException { address = st.getAddress(Address.IPv6); } /** Converts rdata to a String */ String rrToString() { return address.getHostAddress(); } /** Returns the address */ public InetAddress getAddress() { return address; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(address.getAddress()); } } dnsjava-2.1.5/org/xbill/DNS/AFSDBRecord.java100644 0 0 1701 11254312416 15440 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * AFS Data Base Record - maps a domain name to the name of an AFS cell * database server. * * * @author Brian Wellington */ public class AFSDBRecord extends U16NameBase { private static final long serialVersionUID = 3034379930729102437L; AFSDBRecord() {} Record getObject() { return new AFSDBRecord(); } /** * Creates an AFSDB Record from the given data. * @param subtype Indicates the type of service provided by the host. * @param host The host providing the service. */ public AFSDBRecord(Name name, int dclass, long ttl, int subtype, Name host) { super(name, Type.AFSDB, dclass, ttl, subtype, "subtype", host, "host"); } /** Gets the subtype indicating the service provided by the host. */ public int getSubtype() { return getU16Field(); } /** Gets the host providing service for the domain. */ public Name getHost() { return getNameField(); } } dnsjava-2.1.5/org/xbill/DNS/APLRecord.java100644 0 0 15503 11256272724 15273 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; import java.util.*; import org.xbill.DNS.utils.*; /** * APL - Address Prefix List. See RFC 3123. * * @author Brian Wellington */ /* * Note: this currently uses the same constants as the Address class; * this could change if more constants are defined for APL records. */ public class APLRecord extends Record { public static class Element { public final int family; public final boolean negative; public final int prefixLength; public final Object address; private Element(int family, boolean negative, Object address, int prefixLength) { this.family = family; this.negative = negative; this.address = address; this.prefixLength = prefixLength; if (!validatePrefixLength(family, prefixLength)) { throw new IllegalArgumentException("invalid prefix " + "length"); } } /** * Creates an APL element corresponding to an IPv4 or IPv6 prefix. * @param negative Indicates if this prefix is a negation. * @param address The IPv4 or IPv6 address. * @param prefixLength The length of this prefix, in bits. * @throws IllegalArgumentException The prefix length is invalid. */ public Element(boolean negative, InetAddress address, int prefixLength) { this(Address.familyOf(address), negative, address, prefixLength); } public String toString() { StringBuffer sb = new StringBuffer(); if (negative) sb.append("!"); sb.append(family); sb.append(":"); if (family == Address.IPv4 || family == Address.IPv6) sb.append(((InetAddress) address).getHostAddress()); else sb.append(base16.toString((byte []) address)); sb.append("/"); sb.append(prefixLength); return sb.toString(); } public boolean equals(Object arg) { if (arg == null || !(arg instanceof Element)) return false; Element elt = (Element) arg; return (family == elt.family && negative == elt.negative && prefixLength == elt.prefixLength && address.equals(elt.address)); } public int hashCode() { return address.hashCode() + prefixLength + (negative ? 1 : 0); } } private static final long serialVersionUID = -1348173791712935864L; private List elements; APLRecord() {} Record getObject() { return new APLRecord(); } private static boolean validatePrefixLength(int family, int prefixLength) { if (prefixLength < 0 || prefixLength >= 256) return false; if ((family == Address.IPv4 && prefixLength > 32) || (family == Address.IPv6 && prefixLength > 128)) return false; return true; } /** * Creates an APL Record from the given data. * @param elements The list of APL elements. */ public APLRecord(Name name, int dclass, long ttl, List elements) { super(name, Type.APL, dclass, ttl); this.elements = new ArrayList(elements.size()); for (Iterator it = elements.iterator(); it.hasNext(); ) { Object o = it.next(); if (!(o instanceof Element)) { throw new IllegalArgumentException("illegal element"); } Element element = (Element) o; if (element.family != Address.IPv4 && element.family != Address.IPv6) { throw new IllegalArgumentException("unknown family"); } this.elements.add(element); } } private static byte [] parseAddress(byte [] in, int length) throws WireParseException { if (in.length > length) throw new WireParseException("invalid address length"); if (in.length == length) return in; byte [] out = new byte[length]; System.arraycopy(in, 0, out, 0, in.length); return out; } void rrFromWire(DNSInput in) throws IOException { elements = new ArrayList(1); while (in.remaining() != 0) { int family = in.readU16(); int prefix = in.readU8(); int length = in.readU8(); boolean negative = (length & 0x80) != 0; length &= ~0x80; byte [] data = in.readByteArray(length); Element element; if (!validatePrefixLength(family, prefix)) { throw new WireParseException("invalid prefix length"); } if (family == Address.IPv4 || family == Address.IPv6) { data = parseAddress(data, Address.addressLength(family)); InetAddress addr = InetAddress.getByAddress(data); element = new Element(negative, addr, prefix); } else { element = new Element(family, negative, data, prefix); } elements.add(element); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { elements = new ArrayList(1); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; boolean negative = false; int family = 0; int prefix = 0; String s = t.value; int start = 0; if (s.startsWith("!")) { negative = true; start = 1; } int colon = s.indexOf(':', start); if (colon < 0) throw st.exception("invalid address prefix element"); int slash = s.indexOf('/', colon); if (slash < 0) throw st.exception("invalid address prefix element"); String familyString = s.substring(start, colon); String addressString = s.substring(colon + 1, slash); String prefixString = s.substring(slash + 1); try { family = Integer.parseInt(familyString); } catch (NumberFormatException e) { throw st.exception("invalid family"); } if (family != Address.IPv4 && family != Address.IPv6) throw st.exception("unknown family"); try { prefix = Integer.parseInt(prefixString); } catch (NumberFormatException e) { throw st.exception("invalid prefix length"); } if (!validatePrefixLength(family, prefix)) { throw st.exception("invalid prefix length"); } byte [] bytes = Address.toByteArray(addressString, family); if (bytes == null) throw st.exception("invalid IP address " + addressString); InetAddress address = InetAddress.getByAddress(bytes); elements.add(new Element(negative, address, prefix)); } st.unget(); } String rrToString() { StringBuffer sb = new StringBuffer(); for (Iterator it = elements.iterator(); it.hasNext(); ) { Element element = (Element) it.next(); sb.append(element); if (it.hasNext()) sb.append(" "); } return sb.toString(); } /** Returns the list of APL elements. */ public List getElements() { return elements; } private static int addressLength(byte [] addr) { for (int i = addr.length - 1; i >= 0; i--) { if (addr[i] != 0) return i + 1; } return 0; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { for (Iterator it = elements.iterator(); it.hasNext(); ) { Element element = (Element) it.next(); int length = 0; byte [] data; if (element.family == Address.IPv4 || element.family == Address.IPv6) { InetAddress addr = (InetAddress) element.address; data = addr.getAddress(); length = addressLength(data); } else { data = (byte []) element.address; length = data.length; } int wlength = length; if (element.negative) { wlength |= 0x80; } out.writeU16(element.family); out.writeU8(element.prefixLength); out.writeU8(wlength); out.writeByteArray(data, 0, length); } } } dnsjava-2.1.5/org/xbill/DNS/ARecord.java100644 0 0 3673 12110757267 15024 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.net.*; import java.io.*; /** * Address Record - maps a domain name to an Internet address * * @author Brian Wellington */ public class ARecord extends Record { private static final long serialVersionUID = -2172609200849142323L; private int addr; ARecord() {} Record getObject() { return new ARecord(); } private static final int fromArray(byte [] array) { return (((array[0] & 0xFF) << 24) | ((array[1] & 0xFF) << 16) | ((array[2] & 0xFF) << 8) | (array[3] & 0xFF)); } private static final byte [] toArray(int addr) { byte [] bytes = new byte[4]; bytes[0] = (byte) ((addr >>> 24) & 0xFF); bytes[1] = (byte) ((addr >>> 16) & 0xFF); bytes[2] = (byte) ((addr >>> 8) & 0xFF); bytes[3] = (byte) (addr & 0xFF); return bytes; } /** * Creates an A Record from the given data * @param address The address that the name refers to */ public ARecord(Name name, int dclass, long ttl, InetAddress address) { super(name, Type.A, dclass, ttl); if (Address.familyOf(address) != Address.IPv4) throw new IllegalArgumentException("invalid IPv4 address"); addr = fromArray(address.getAddress()); } void rrFromWire(DNSInput in) throws IOException { addr = fromArray(in.readByteArray(4)); } void rdataFromString(Tokenizer st, Name origin) throws IOException { InetAddress address = st.getAddress(Address.IPv4); addr = fromArray(address.getAddress()); } /** Converts rdata to a String */ String rrToString() { return (Address.toDottedQuad(toArray(addr))); } /** Returns the Internet address */ public InetAddress getAddress() { try { if (name == null) return InetAddress.getByAddress(toArray(addr)); else return InetAddress.getByAddress(name.toString(), toArray(addr)); } catch (UnknownHostException e) { return null; } } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU32(((long)addr) & 0xFFFFFFFFL); } } dnsjava-2.1.5/org/xbill/DNS/Address.java100644 0 0 24577 12020246031 15076 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.net.*; import java.net.Inet6Address; /** * Routines dealing with IP addresses. Includes functions similar to * those in the java.net.InetAddress class. * * @author Brian Wellington */ public final class Address { public static final int IPv4 = 1; public static final int IPv6 = 2; private Address() {} private static byte [] parseV4(String s) { int numDigits; int currentOctet; byte [] values = new byte[4]; int currentValue; int length = s.length(); currentOctet = 0; currentValue = 0; numDigits = 0; for (int i = 0; i < length; i++) { char c = s.charAt(i); if (c >= '0' && c <= '9') { /* Can't have more than 3 digits per octet. */ if (numDigits == 3) return null; /* Octets shouldn't start with 0, unless they are 0. */ if (numDigits > 0 && currentValue == 0) return null; numDigits++; currentValue *= 10; currentValue += (c - '0'); /* 255 is the maximum value for an octet. */ if (currentValue > 255) return null; } else if (c == '.') { /* Can't have more than 3 dots. */ if (currentOctet == 3) return null; /* Two consecutive dots are bad. */ if (numDigits == 0) return null; values[currentOctet++] = (byte) currentValue; currentValue = 0; numDigits = 0; } else return null; } /* Must have 4 octets. */ if (currentOctet != 3) return null; /* The fourth octet can't be empty. */ if (numDigits == 0) return null; values[currentOctet] = (byte) currentValue; return values; } private static byte [] parseV6(String s) { int range = -1; byte [] data = new byte[16]; String [] tokens = s.split(":", -1); int first = 0; int last = tokens.length - 1; if (tokens[0].length() == 0) { // If the first two tokens are empty, it means the string // started with ::, which is fine. If only the first is // empty, the string started with :, which is bad. if (last - first > 0 && tokens[1].length() == 0) first++; else return null; } if (tokens[last].length() == 0) { // If the last two tokens are empty, it means the string // ended with ::, which is fine. If only the last is // empty, the string ended with :, which is bad. if (last - first > 0 && tokens[last - 1].length() == 0) last--; else return null; } if (last - first + 1 > 8) return null; int i, j; for (i = first, j = 0; i <= last; i++) { if (tokens[i].length() == 0) { if (range >= 0) return null; range = j; continue; } if (tokens[i].indexOf('.') >= 0) { // An IPv4 address must be the last component if (i < last) return null; // There can't have been more than 6 components. if (i > 6) return null; byte [] v4addr = Address.toByteArray(tokens[i], IPv4); if (v4addr == null) return null; for (int k = 0; k < 4; k++) data[j++] = v4addr[k]; break; } try { for (int k = 0; k < tokens[i].length(); k++) { char c = tokens[i].charAt(k); if (Character.digit(c, 16) < 0) return null; } int x = Integer.parseInt(tokens[i], 16); if (x > 0xFFFF || x < 0) return null; data[j++] = (byte)(x >>> 8); data[j++] = (byte)(x & 0xFF); } catch (NumberFormatException e) { return null; } } if (j < 16 && range < 0) return null; if (range >= 0) { int empty = 16 - j; System.arraycopy(data, range, data, range + empty, j - range); for (i = range; i < range + empty; i++) data[i] = 0; } return data; } /** * Convert a string containing an IP address to an array of 4 or 16 integers. * @param s The address, in text format. * @param family The address family. * @return The address */ public static int [] toArray(String s, int family) { byte [] byteArray = toByteArray(s, family); if (byteArray == null) return null; int [] intArray = new int[byteArray.length]; for (int i = 0; i < byteArray.length; i++) intArray[i] = byteArray[i] & 0xFF; return intArray; } /** * Convert a string containing an IPv4 address to an array of 4 integers. * @param s The address, in text format. * @return The address */ public static int [] toArray(String s) { return toArray(s, IPv4); } /** * Convert a string containing an IP address to an array of 4 or 16 bytes. * @param s The address, in text format. * @param family The address family. * @return The address */ public static byte [] toByteArray(String s, int family) { if (family == IPv4) return parseV4(s); else if (family == IPv6) return parseV6(s); else throw new IllegalArgumentException("unknown address family"); } /** * Determines if a string contains a valid IP address. * @param s The string * @return Whether the string contains a valid IP address */ public static boolean isDottedQuad(String s) { byte [] address = Address.toByteArray(s, IPv4); return (address != null); } /** * Converts a byte array containing an IPv4 address into a dotted quad string. * @param addr The array * @return The string representation */ public static String toDottedQuad(byte [] addr) { return ((addr[0] & 0xFF) + "." + (addr[1] & 0xFF) + "." + (addr[2] & 0xFF) + "." + (addr[3] & 0xFF)); } /** * Converts an int array containing an IPv4 address into a dotted quad string. * @param addr The array * @return The string representation */ public static String toDottedQuad(int [] addr) { return (addr[0] + "." + addr[1] + "." + addr[2] + "." + addr[3]); } private static Record [] lookupHostName(String name) throws UnknownHostException { try { Record [] records = new Lookup(name).run(); if (records == null) throw new UnknownHostException("unknown host"); return records; } catch (TextParseException e) { throw new UnknownHostException("invalid name"); } } private static InetAddress addrFromRecord(String name, Record r) throws UnknownHostException { ARecord a = (ARecord) r; return InetAddress.getByAddress(name, a.getAddress().getAddress()); } /** * Determines the IP address of a host * @param name The hostname to look up * @return The first matching IP address * @exception UnknownHostException The hostname does not have any addresses */ public static InetAddress getByName(String name) throws UnknownHostException { try { return getByAddress(name); } catch (UnknownHostException e) { Record [] records = lookupHostName(name); return addrFromRecord(name, records[0]); } } /** * Determines all IP address of a host * @param name The hostname to look up * @return All matching IP addresses * @exception UnknownHostException The hostname does not have any addresses */ public static InetAddress [] getAllByName(String name) throws UnknownHostException { try { InetAddress addr = getByAddress(name); return new InetAddress[] {addr}; } catch (UnknownHostException e) { Record [] records = lookupHostName(name); InetAddress [] addrs = new InetAddress[records.length]; for (int i = 0; i < records.length; i++) addrs[i] = addrFromRecord(name, records[i]); return addrs; } } /** * Converts an address from its string representation to an IP address. * The address can be either IPv4 or IPv6. * @param addr The address, in string form * @return The IP addresses * @exception UnknownHostException The address is not a valid IP address. */ public static InetAddress getByAddress(String addr) throws UnknownHostException { byte [] bytes; bytes = toByteArray(addr, IPv4); if (bytes != null) return InetAddress.getByAddress(addr, bytes); bytes = toByteArray(addr, IPv6); if (bytes != null) return InetAddress.getByAddress(addr, bytes); throw new UnknownHostException("Invalid address: " + addr); } /** * Converts an address from its string representation to an IP address in * a particular family. * @param addr The address, in string form * @param family The address family, either IPv4 or IPv6. * @return The IP addresses * @exception UnknownHostException The address is not a valid IP address in * the specified address family. */ public static InetAddress getByAddress(String addr, int family) throws UnknownHostException { if (family != IPv4 && family != IPv6) throw new IllegalArgumentException("unknown address family"); byte [] bytes; bytes = toByteArray(addr, family); if (bytes != null) return InetAddress.getByAddress(addr, bytes); throw new UnknownHostException("Invalid address: " + addr); } /** * Determines the hostname for an address * @param addr The address to look up * @return The associated host name * @exception UnknownHostException There is no hostname for the address */ public static String getHostName(InetAddress addr) throws UnknownHostException { Name name = ReverseMap.fromAddress(addr); Record [] records = new Lookup(name, Type.PTR).run(); if (records == null) throw new UnknownHostException("unknown address"); PTRRecord ptr = (PTRRecord) records[0]; return ptr.getTarget().toString(); } /** * Returns the family of an InetAddress. * @param address The supplied address. * @return The family, either IPv4 or IPv6. */ public static int familyOf(InetAddress address) { if (address instanceof Inet4Address) return IPv4; if (address instanceof Inet6Address) return IPv6; throw new IllegalArgumentException("unknown address family"); } /** * Returns the length of an address in a particular family. * @param family The address family, either IPv4 or IPv6. * @return The length of addresses in that family. */ public static int addressLength(int family) { if (family == IPv4) return 4; if (family == IPv6) return 16; throw new IllegalArgumentException("unknown address family"); } /** * Truncates an address to the specified number of bits. For example, * truncating the address 10.1.2.3 to 8 bits would yield 10.0.0.0. * @param address The source address * @param maskLength The number of bits to truncate the address to. */ public static InetAddress truncate(InetAddress address, int maskLength) { int family = familyOf(address); int maxMaskLength = addressLength(family) * 8; if (maskLength < 0 || maskLength > maxMaskLength) throw new IllegalArgumentException("invalid mask length"); if (maskLength == maxMaskLength) return address; byte [] bytes = address.getAddress(); for (int i = maskLength / 8 + 1; i < bytes.length; i++) bytes[i] = 0; int maskBits = maskLength % 8; int bitmask = 0; for (int i = 0; i < maskBits; i++) bitmask |= (1 << (7 - i)); bytes[maskLength / 8] &= bitmask; try { return InetAddress.getByAddress(bytes); } catch (UnknownHostException e) { throw new IllegalArgumentException("invalid address"); } } } dnsjava-2.1.5/org/xbill/DNS/CERTRecord.java100644 0 0 11646 11254312416 15407 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * Certificate Record - Stores a certificate associated with a name. The * certificate might also be associated with a KEYRecord. * @see KEYRecord * * @author Brian Wellington */ public class CERTRecord extends Record { public static class CertificateType { /** Certificate type identifiers. See RFC 4398 for more detail. */ private CertificateType() {} /** PKIX (X.509v3) */ public static final int PKIX = 1; /** Simple Public Key Infrastructure */ public static final int SPKI = 2; /** Pretty Good Privacy */ public static final int PGP = 3; /** URL of an X.509 data object */ public static final int IPKIX = 4; /** URL of an SPKI certificate */ public static final int ISPKI = 5; /** Fingerprint and URL of an OpenPGP packet */ public static final int IPGP = 6; /** Attribute Certificate */ public static final int ACPKIX = 7; /** URL of an Attribute Certificate */ public static final int IACPKIX = 8; /** Certificate format defined by URI */ public static final int URI = 253; /** Certificate format defined by OID */ public static final int OID = 254; private static Mnemonic types = new Mnemonic("Certificate type", Mnemonic.CASE_UPPER); static { types.setMaximum(0xFFFF); types.setNumericAllowed(true); types.add(PKIX, "PKIX"); types.add(SPKI, "SPKI"); types.add(PGP, "PGP"); types.add(PKIX, "IPKIX"); types.add(SPKI, "ISPKI"); types.add(PGP, "IPGP"); types.add(PGP, "ACPKIX"); types.add(PGP, "IACPKIX"); types.add(URI, "URI"); types.add(OID, "OID"); } /** * Converts a certificate type into its textual representation */ public static String string(int type) { return types.getText(type); } /** * Converts a textual representation of an certificate type into its * numeric code. Integers in the range 0..65535 are also accepted. * @param s The textual representation of the algorithm * @return The algorithm code, or -1 on error. */ public static int value(String s) { return types.getValue(s); } } /** PKIX (X.509v3) */ public static final int PKIX = CertificateType.PKIX; /** Simple Public Key Infrastructure */ public static final int SPKI = CertificateType.SPKI; /** Pretty Good Privacy */ public static final int PGP = CertificateType.PGP; /** Certificate format defined by URI */ public static final int URI = CertificateType.URI; /** Certificate format defined by IOD */ public static final int OID = CertificateType.OID; private static final long serialVersionUID = 4763014646517016835L; private int certType, keyTag; private int alg; private byte [] cert; CERTRecord() {} Record getObject() { return new CERTRecord(); } /** * Creates a CERT Record from the given data * @param certType The type of certificate (see constants) * @param keyTag The ID of the associated KEYRecord, if present * @param alg The algorithm of the associated KEYRecord, if present * @param cert Binary data representing the certificate */ public CERTRecord(Name name, int dclass, long ttl, int certType, int keyTag, int alg, byte [] cert) { super(name, Type.CERT, dclass, ttl); this.certType = checkU16("certType", certType); this.keyTag = checkU16("keyTag", keyTag); this.alg = checkU8("alg", alg); this.cert = cert; } void rrFromWire(DNSInput in) throws IOException { certType = in.readU16(); keyTag = in.readU16(); alg = in.readU8(); cert = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { String certTypeString = st.getString(); certType = CertificateType.value(certTypeString); if (certType < 0) throw st.exception("Invalid certificate type: " + certTypeString); keyTag = st.getUInt16(); String algString = st.getString(); alg = DNSSEC.Algorithm.value(algString); if (alg < 0) throw st.exception("Invalid algorithm: " + algString); cert = st.getBase64(); } /** * Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append (certType); sb.append (" "); sb.append (keyTag); sb.append (" "); sb.append (alg); if (cert != null) { if (Options.check("multiline")) { sb.append(" (\n"); sb.append(base64.formatString(cert, 64, "\t", true)); } else { sb.append(" "); sb.append(base64.toString(cert)); } } return sb.toString(); } /** * Returns the type of certificate */ public int getCertType() { return certType; } /** * Returns the ID of the associated KEYRecord, if present */ public int getKeyTag() { return keyTag; } /** * Returns the algorithm of the associated KEYRecord, if present */ public int getAlgorithm() { return alg; } /** * Returns the binary representation of the certificate */ public byte [] getCert() { return cert; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(certType); out.writeU16(keyTag); out.writeU8(alg); out.writeByteArray(cert); } } dnsjava-2.1.5/org/xbill/DNS/CNAMERecord.java100644 0 0 1471 11254312416 15450 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * CNAME Record - maps an alias to its real name * * @author Brian Wellington */ public class CNAMERecord extends SingleCompressedNameBase { private static final long serialVersionUID = -4020373886892538580L; CNAMERecord() {} Record getObject() { return new CNAMERecord(); } /** * Creates a new CNAMERecord with the given data * @param alias The name to which the CNAME alias points */ public CNAMERecord(Name name, int dclass, long ttl, Name alias) { super(name, Type.CNAME, dclass, ttl, alias, "alias"); } /** * Gets the target of the CNAME Record */ public Name getTarget() { return getSingleName(); } /** Gets the alias specified by the CNAME Record */ public Name getAlias() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/Cache.java100644 0 0 47724 11644700457 14535 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A cache of DNS records. The cache obeys TTLs, so items are purged after * their validity period is complete. Negative answers are cached, to * avoid repeated failed DNS queries. The credibility of each RRset is * maintained, so that more credible records replace less credible records, * and lookups can specify the minimum credibility of data they are requesting. * @see RRset * @see Credibility * * @author Brian Wellington */ public class Cache { private interface Element { public boolean expired(); public int compareCredibility(int cred); public int getType(); } private static int limitExpire(long ttl, long maxttl) { if (maxttl >= 0 && maxttl < ttl) ttl = maxttl; long expire = (System.currentTimeMillis() / 1000) + ttl; if (expire < 0 || expire > Integer.MAX_VALUE) return Integer.MAX_VALUE; return (int)expire; } private static class CacheRRset extends RRset implements Element { private static final long serialVersionUID = 5971755205903597024L; int credibility; int expire; public CacheRRset(Record rec, int cred, long maxttl) { super(); this.credibility = cred; this.expire = limitExpire(rec.getTTL(), maxttl); addRR(rec); } public CacheRRset(RRset rrset, int cred, long maxttl) { super(rrset); this.credibility = cred; this.expire = limitExpire(rrset.getTTL(), maxttl); } public final boolean expired() { int now = (int)(System.currentTimeMillis() / 1000); return (now >= expire); } public final int compareCredibility(int cred) { return credibility - cred; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append(super.toString()); sb.append(" cl = "); sb.append(credibility); return sb.toString(); } } private static class NegativeElement implements Element { int type; Name name; int credibility; int expire; public NegativeElement(Name name, int type, SOARecord soa, int cred, long maxttl) { this.name = name; this.type = type; long cttl = 0; if (soa != null) cttl = soa.getMinimum(); this.credibility = cred; this.expire = limitExpire(cttl, maxttl); } public int getType() { return type; } public final boolean expired() { int now = (int)(System.currentTimeMillis() / 1000); return (now >= expire); } public final int compareCredibility(int cred) { return credibility - cred; } public String toString() { StringBuffer sb = new StringBuffer(); if (type == 0) sb.append("NXDOMAIN " + name); else sb.append("NXRRSET " + name + " " + Type.string(type)); sb.append(" cl = "); sb.append(credibility); return sb.toString(); } } private static class CacheMap extends LinkedHashMap { private int maxsize = -1; CacheMap(int maxsize) { super(16, (float) 0.75, true); this.maxsize = maxsize; } int getMaxSize() { return maxsize; } void setMaxSize(int maxsize) { /* * Note that this doesn't shrink the size of the map if * the maximum size is lowered, but it should shrink as * entries expire. */ this.maxsize = maxsize; } protected boolean removeEldestEntry(Map.Entry eldest) { return maxsize >= 0 && size() > maxsize; } } private CacheMap data; private int maxncache = -1; private int maxcache = -1; private int dclass; private static final int defaultMaxEntries = 50000; /** * Creates an empty Cache * * @param dclass The DNS class of this cache * @see DClass */ public Cache(int dclass) { this.dclass = dclass; data = new CacheMap(defaultMaxEntries); } /** * Creates an empty Cache for class IN. * @see DClass */ public Cache() { this(DClass.IN); } /** * Creates a Cache which initially contains all records in the specified file. */ public Cache(String file) throws IOException { data = new CacheMap(defaultMaxEntries); Master m = new Master(file); Record record; while ((record = m.nextRecord()) != null) addRecord(record, Credibility.HINT, m); } private synchronized Object exactName(Name name) { return data.get(name); } private synchronized void removeName(Name name) { data.remove(name); } private synchronized Element [] allElements(Object types) { if (types instanceof List) { List typelist = (List) types; int size = typelist.size(); return (Element []) typelist.toArray(new Element[size]); } else { Element set = (Element) types; return new Element[] {set}; } } private synchronized Element oneElement(Name name, Object types, int type, int minCred) { Element found = null; if (type == Type.ANY) throw new IllegalArgumentException("oneElement(ANY)"); if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { Element set = (Element) list.get(i); if (set.getType() == type) { found = set; break; } } } else { Element set = (Element) types; if (set.getType() == type) found = set; } if (found == null) return null; if (found.expired()) { removeElement(name, type); return null; } if (found.compareCredibility(minCred) < 0) return null; return found; } private synchronized Element findElement(Name name, int type, int minCred) { Object types = exactName(name); if (types == null) return null; return oneElement(name, types, type, minCred); } private synchronized void addElement(Name name, Element element) { Object types = data.get(name); if (types == null) { data.put(name, element); return; } int type = element.getType(); if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { Element elt = (Element) list.get(i); if (elt.getType() == type) { list.set(i, element); return; } } list.add(element); } else { Element elt = (Element) types; if (elt.getType() == type) data.put(name, element); else { LinkedList list = new LinkedList(); list.add(elt); list.add(element); data.put(name, list); } } } private synchronized void removeElement(Name name, int type) { Object types = data.get(name); if (types == null) { return; } if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { Element elt = (Element) list.get(i); if (elt.getType() == type) { list.remove(i); if (list.size() == 0) data.remove(name); return; } } } else { Element elt = (Element) types; if (elt.getType() != type) return; data.remove(name); } } /** Empties the Cache. */ public synchronized void clearCache() { data.clear(); } /** * Adds a record to the Cache. * @param r The record to be added * @param cred The credibility of the record * @param o The source of the record (this could be a Message, for example) * @see Record */ public synchronized void addRecord(Record r, int cred, Object o) { Name name = r.getName(); int type = r.getRRsetType(); if (!Type.isRR(type)) return; Element element = findElement(name, type, cred); if (element == null) { CacheRRset crrset = new CacheRRset(r, cred, maxcache); addRRset(crrset, cred); } else if (element.compareCredibility(cred) == 0) { if (element instanceof CacheRRset) { CacheRRset crrset = (CacheRRset) element; crrset.addRR(r); } } } /** * Adds an RRset to the Cache. * @param rrset The RRset to be added * @param cred The credibility of these records * @see RRset */ public synchronized void addRRset(RRset rrset, int cred) { long ttl = rrset.getTTL(); Name name = rrset.getName(); int type = rrset.getType(); Element element = findElement(name, type, 0); if (ttl == 0) { if (element != null && element.compareCredibility(cred) <= 0) removeElement(name, type); } else { if (element != null && element.compareCredibility(cred) <= 0) element = null; if (element == null) { CacheRRset crrset; if (rrset instanceof CacheRRset) crrset = (CacheRRset) rrset; else crrset = new CacheRRset(rrset, cred, maxcache); addElement(name, crrset); } } } /** * Adds a negative entry to the Cache. * @param name The name of the negative entry * @param type The type of the negative entry * @param soa The SOA record to add to the negative cache entry, or null. * The negative cache ttl is derived from the SOA. * @param cred The credibility of the negative entry */ public synchronized void addNegative(Name name, int type, SOARecord soa, int cred) { long ttl = 0; if (soa != null) ttl = soa.getTTL(); Element element = findElement(name, type, 0); if (ttl == 0) { if (element != null && element.compareCredibility(cred) <= 0) removeElement(name, type); } else { if (element != null && element.compareCredibility(cred) <= 0) element = null; if (element == null) addElement(name, new NegativeElement(name, type, soa, cred, maxncache)); } } /** * Finds all matching sets or something that causes the lookup to stop. */ protected synchronized SetResponse lookup(Name name, int type, int minCred) { int labels; int tlabels; Element element; Name tname; Object types; SetResponse sr; labels = name.labels(); for (tlabels = labels; tlabels >= 1; tlabels--) { boolean isRoot = (tlabels == 1); boolean isExact = (tlabels == labels); if (isRoot) tname = Name.root; else if (isExact) tname = name; else tname = new Name(name, labels - tlabels); types = data.get(tname); if (types == null) continue; /* * If this is the name, look for the actual type or a CNAME * (unless it's an ANY query, where we return everything). * Otherwise, look for a DNAME. */ if (isExact && type == Type.ANY) { sr = new SetResponse(SetResponse.SUCCESSFUL); Element [] elements = allElements(types); int added = 0; for (int i = 0; i < elements.length; i++) { element = elements[i]; if (element.expired()) { removeElement(tname, element.getType()); continue; } if (!(element instanceof CacheRRset)) continue; if (element.compareCredibility(minCred) < 0) continue; sr.addRRset((CacheRRset)element); added++; } /* There were positive entries */ if (added > 0) return sr; } else if (isExact) { element = oneElement(tname, types, type, minCred); if (element != null && element instanceof CacheRRset) { sr = new SetResponse(SetResponse.SUCCESSFUL); sr.addRRset((CacheRRset) element); return sr; } else if (element != null) { sr = new SetResponse(SetResponse.NXRRSET); return sr; } element = oneElement(tname, types, Type.CNAME, minCred); if (element != null && element instanceof CacheRRset) { return new SetResponse(SetResponse.CNAME, (CacheRRset) element); } } else { element = oneElement(tname, types, Type.DNAME, minCred); if (element != null && element instanceof CacheRRset) { return new SetResponse(SetResponse.DNAME, (CacheRRset) element); } } /* Look for an NS */ element = oneElement(tname, types, Type.NS, minCred); if (element != null && element instanceof CacheRRset) return new SetResponse(SetResponse.DELEGATION, (CacheRRset) element); /* Check for the special NXDOMAIN element. */ if (isExact) { element = oneElement(tname, types, 0, minCred); if (element != null) return SetResponse.ofType(SetResponse.NXDOMAIN); } } return SetResponse.ofType(SetResponse.UNKNOWN); } /** * Looks up Records in the Cache. This follows CNAMEs and handles negatively * cached data. * @param name The name to look up * @param type The type to look up * @param minCred The minimum acceptable credibility * @return A SetResponse object * @see SetResponse * @see Credibility */ public SetResponse lookupRecords(Name name, int type, int minCred) { return lookup(name, type, minCred); } private RRset [] findRecords(Name name, int type, int minCred) { SetResponse cr = lookupRecords(name, type, minCred); if (cr.isSuccessful()) return cr.answers(); else return null; } /** * Looks up credible Records in the Cache (a wrapper around lookupRecords). * Unlike lookupRecords, this given no indication of why failure occurred. * @param name The name to look up * @param type The type to look up * @return An array of RRsets, or null * @see Credibility */ public RRset [] findRecords(Name name, int type) { return findRecords(name, type, Credibility.NORMAL); } /** * Looks up Records in the Cache (a wrapper around lookupRecords). Unlike * lookupRecords, this given no indication of why failure occurred. * @param name The name to look up * @param type The type to look up * @return An array of RRsets, or null * @see Credibility */ public RRset [] findAnyRecords(Name name, int type) { return findRecords(name, type, Credibility.GLUE); } private final int getCred(int section, boolean isAuth) { if (section == Section.ANSWER) { if (isAuth) return Credibility.AUTH_ANSWER; else return Credibility.NONAUTH_ANSWER; } else if (section == Section.AUTHORITY) { if (isAuth) return Credibility.AUTH_AUTHORITY; else return Credibility.NONAUTH_AUTHORITY; } else if (section == Section.ADDITIONAL) { return Credibility.ADDITIONAL; } else throw new IllegalArgumentException("getCred: invalid section"); } private static void markAdditional(RRset rrset, Set names) { Record first = rrset.first(); if (first.getAdditionalName() == null) return; Iterator it = rrset.rrs(); while (it.hasNext()) { Record r = (Record) it.next(); Name name = r.getAdditionalName(); if (name != null) names.add(name); } } /** * Adds all data from a Message into the Cache. Each record is added with * the appropriate credibility, and negative answers are cached as such. * @param in The Message to be added * @return A SetResponse that reflects what would be returned from a cache * lookup, or null if nothing useful could be cached from the message. * @see Message */ public SetResponse addMessage(Message in) { boolean isAuth = in.getHeader().getFlag(Flags.AA); Record question = in.getQuestion(); Name qname; Name curname; int qtype; int qclass; int cred; int rcode = in.getHeader().getRcode(); boolean completed = false; RRset [] answers, auth, addl; SetResponse response = null; boolean verbose = Options.check("verbosecache"); HashSet additionalNames; if ((rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN) || question == null) return null; qname = question.getName(); qtype = question.getType(); qclass = question.getDClass(); curname = qname; additionalNames = new HashSet(); answers = in.getSectionRRsets(Section.ANSWER); for (int i = 0; i < answers.length; i++) { if (answers[i].getDClass() != qclass) continue; int type = answers[i].getType(); Name name = answers[i].getName(); cred = getCred(Section.ANSWER, isAuth); if ((type == qtype || qtype == Type.ANY) && name.equals(curname)) { addRRset(answers[i], cred); completed = true; if (curname == qname) { if (response == null) response = new SetResponse( SetResponse.SUCCESSFUL); response.addRRset(answers[i]); } markAdditional(answers[i], additionalNames); } else if (type == Type.CNAME && name.equals(curname)) { CNAMERecord cname; addRRset(answers[i], cred); if (curname == qname) response = new SetResponse(SetResponse.CNAME, answers[i]); cname = (CNAMERecord) answers[i].first(); curname = cname.getTarget(); } else if (type == Type.DNAME && curname.subdomain(name)) { DNAMERecord dname; addRRset(answers[i], cred); if (curname == qname) response = new SetResponse(SetResponse.DNAME, answers[i]); dname = (DNAMERecord) answers[i].first(); try { curname = curname.fromDNAME(dname); } catch (NameTooLongException e) { break; } } } auth = in.getSectionRRsets(Section.AUTHORITY); RRset soa = null, ns = null; for (int i = 0; i < auth.length; i++) { if (auth[i].getType() == Type.SOA && curname.subdomain(auth[i].getName())) soa = auth[i]; else if (auth[i].getType() == Type.NS && curname.subdomain(auth[i].getName())) ns = auth[i]; } if (!completed) { /* This is a negative response or a referral. */ int cachetype = (rcode == Rcode.NXDOMAIN) ? 0 : qtype; if (rcode == Rcode.NXDOMAIN || soa != null || ns == null) { /* Negative response */ cred = getCred(Section.AUTHORITY, isAuth); SOARecord soarec = null; if (soa != null) soarec = (SOARecord) soa.first(); addNegative(curname, cachetype, soarec, cred); if (response == null) { int responseType; if (rcode == Rcode.NXDOMAIN) responseType = SetResponse.NXDOMAIN; else responseType = SetResponse.NXRRSET; response = SetResponse.ofType(responseType); } /* DNSSEC records are not cached. */ } else { /* Referral response */ cred = getCred(Section.AUTHORITY, isAuth); addRRset(ns, cred); markAdditional(ns, additionalNames); if (response == null) response = new SetResponse( SetResponse.DELEGATION, ns); } } else if (rcode == Rcode.NOERROR && ns != null) { /* Cache the NS set from a positive response. */ cred = getCred(Section.AUTHORITY, isAuth); addRRset(ns, cred); markAdditional(ns, additionalNames); } addl = in.getSectionRRsets(Section.ADDITIONAL); for (int i = 0; i < addl.length; i++) { int type = addl[i].getType(); if (type != Type.A && type != Type.AAAA && type != Type.A6) continue; Name name = addl[i].getName(); if (!additionalNames.contains(name)) continue; cred = getCred(Section.ADDITIONAL, isAuth); addRRset(addl[i], cred); } if (verbose) System.out.println("addMessage: " + response); return (response); } /** * Flushes an RRset from the cache * @param name The name of the records to be flushed * @param type The type of the records to be flushed * @see RRset */ public void flushSet(Name name, int type) { removeElement(name, type); } /** * Flushes all RRsets with a given name from the cache * @param name The name of the records to be flushed * @see RRset */ public void flushName(Name name) { removeName(name); } /** * Sets the maximum length of time that a negative response will be stored * in this Cache. A negative value disables this feature (that is, sets * no limit). */ public void setMaxNCache(int seconds) { maxncache = seconds; } /** * Gets the maximum length of time that a negative response will be stored * in this Cache. A negative value indicates no limit. */ public int getMaxNCache() { return maxncache; } /** * Sets the maximum length of time that records will be stored in this * Cache. A negative value disables this feature (that is, sets no limit). */ public void setMaxCache(int seconds) { maxcache = seconds; } /** * Gets the maximum length of time that records will be stored * in this Cache. A negative value indicates no limit. */ public int getMaxCache() { return maxcache; } /** * Gets the current number of entries in the Cache, where an entry consists * of all records with a specific Name. */ public int getSize() { return data.size(); } /** * Gets the maximum number of entries in the Cache, where an entry consists * of all records with a specific Name. A negative value is treated as an * infinite limit. */ public int getMaxEntries() { return data.getMaxSize(); } /** * Sets the maximum number of entries in the Cache, where an entry consists * of all records with a specific Name. A negative value is treated as an * infinite limit. * * Note that setting this to a value lower than the current number * of entries will not cause the Cache to shrink immediately. * * The default maximum number of entries is 50000. * * @param entries The maximum number of entries in the Cache. */ public void setMaxEntries(int entries) { data.setMaxSize(entries); } /** * Returns the DNS class of this cache. */ public int getDClass() { return dclass; } /** * Returns the contents of the Cache as a string. */ public String toString() { StringBuffer sb = new StringBuffer(); synchronized (this) { Iterator it = data.values().iterator(); while (it.hasNext()) { Element [] elements = allElements(it.next()); for (int i = 0; i < elements.length; i++) { sb.append(elements[i]); sb.append("\n"); } } } return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/Client.java100644 0 0 2330 11234677663 14717 0ustar 0 0 // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; import java.nio.channels.*; import org.xbill.DNS.utils.hexdump; class Client { protected long endTime; protected SelectionKey key; protected Client(SelectableChannel channel, long endTime) throws IOException { boolean done = false; Selector selector = null; this.endTime = endTime; try { selector = Selector.open(); channel.configureBlocking(false); key = channel.register(selector, SelectionKey.OP_READ); done = true; } finally { if (!done && selector != null) selector.close(); if (!done) channel.close(); } } static protected void blockUntil(SelectionKey key, long endTime) throws IOException { long timeout = endTime - System.currentTimeMillis(); int nkeys = 0; if (timeout > 0) nkeys = key.selector().select(timeout); else if (timeout == 0) nkeys = key.selector().selectNow(); if (nkeys == 0) throw new SocketTimeoutException(); } static protected void verboseLog(String prefix, byte [] data) { if (Options.check("verbosemsg")) System.err.println(hexdump.dump(prefix, data)); } void cleanup() throws IOException { key.selector().close(); key.channel().close(); } } dnsjava-2.1.5/org/xbill/DNS/ClientSubnetOption.java100644 0 0 12147 11562372215 17305 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.net.*; import java.util.regex.*; /** * The Client Subnet EDNS Option, defined in * http://tools.ietf.org/html/draft-vandergaast-edns-client-subnet-00 * ("Client subnet in DNS requests"). * * The option is used to convey information about the IP address of the * originating client, so that an authoritative server can make decisions * based on this address, rather than the address of the intermediate * caching name server. * * The option is transmitted as part of an OPTRecord in the additional section * of a DNS message, as defined by RFC 2671 (EDNS0). * * An option code has not been assigned by IANA; the value 20730 (used here) is * also used by several other implementations. * * The wire format of the option contains a 2-byte length field (1 for IPv4, 2 * for IPv6), a 1-byte source netmask, a 1-byte scope netmask, and an address * truncated to the source netmask length (where the final octet is padded with * bits set to 0) * * * @see OPTRecord * * @author Brian Wellington * @author Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks */ public class ClientSubnetOption extends EDNSOption { private static final long serialVersionUID = -3868158449890266347L; private int family; private int sourceNetmask; private int scopeNetmask; private InetAddress address; ClientSubnetOption() { super(EDNSOption.Code.CLIENT_SUBNET); } private static int checkMaskLength(String field, int family, int val) { int max = Address.addressLength(family) * 8; if (val < 0 || val > max) throw new IllegalArgumentException("\"" + field + "\" " + val + " must be in the range " + "[0.." + max + "]"); return val; } /** * Construct a Client Subnet option. Note that the number of significant bits in * the address must not be greater than the supplied source netmask. * XXX something about Java's mapped addresses * @param sourceNetmask The length of the netmask pertaining to the query. * In replies, it mirrors the same value as in the requests. * @param scopeNetmask The length of the netmask pertaining to the reply. * In requests, it MUST be set to 0. In responses, this may or may not match * the source netmask. * @param address The address of the client. */ public ClientSubnetOption(int sourceNetmask, int scopeNetmask, InetAddress address) { super(EDNSOption.Code.CLIENT_SUBNET); this.family = Address.familyOf(address); this.sourceNetmask = checkMaskLength("source netmask", this.family, sourceNetmask); this.scopeNetmask = checkMaskLength("scope netmask", this.family, scopeNetmask); this.address = Address.truncate(address, sourceNetmask); if (!address.equals(this.address)) throw new IllegalArgumentException("source netmask is not " + "valid for address"); } /** * Construct a Client Subnet option with scope netmask set to 0. * @param sourceNetmask The length of the netmask pertaining to the query. * In replies, it mirrors the same value as in the requests. * @param address The address of the client. * @see ClientSubnetOption */ public ClientSubnetOption(int sourceNetmask, InetAddress address) { this(sourceNetmask, 0, address); } /** * Returns the family of the network address. This will be either IPv4 (1) * or IPv6 (2). */ public int getFamily() { return family; } /** Returns the source netmask. */ public int getSourceNetmask() { return sourceNetmask; } /** Returns the scope netmask. */ public int getScopeNetmask() { return scopeNetmask; } /** Returns the IP address of the client. */ public InetAddress getAddress() { return address; } void optionFromWire(DNSInput in) throws WireParseException { family = in.readU16(); if (family != Address.IPv4 && family != Address.IPv6) throw new WireParseException("unknown address family"); sourceNetmask = in.readU8(); if (sourceNetmask > Address.addressLength(family) * 8) throw new WireParseException("invalid source netmask"); scopeNetmask = in.readU8(); if (scopeNetmask > Address.addressLength(family) * 8) throw new WireParseException("invalid scope netmask"); // Read the truncated address byte [] addr = in.readByteArray(); if (addr.length != (sourceNetmask + 7) / 8) throw new WireParseException("invalid address"); // Convert it to a full length address. byte [] fulladdr = new byte[Address.addressLength(family)]; System.arraycopy(addr, 0, fulladdr, 0, addr.length); try { address = InetAddress.getByAddress(fulladdr); } catch (UnknownHostException e) { throw new WireParseException("invalid address", e); } InetAddress tmp = Address.truncate(address, sourceNetmask); if (!tmp.equals(address)) throw new WireParseException("invalid padding"); } void optionToWire(DNSOutput out) { out.writeU16(family); out.writeU8(sourceNetmask); out.writeU8(scopeNetmask); out.writeByteArray(address.getAddress(), 0, (sourceNetmask + 7) / 8); } String optionToString() { StringBuffer sb = new StringBuffer(); sb.append(address.getHostAddress()); sb.append("/"); sb.append(sourceNetmask); sb.append(", scope netmask "); sb.append(scopeNetmask); return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/Compression.java100644 0 0 3105 10750521351 15763 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * DNS Name Compression object. * @see Message * @see Name * * @author Brian Wellington */ public class Compression { private static class Entry { Name name; int pos; Entry next; } private static final int TABLE_SIZE = 17; private static final int MAX_POINTER = 0x3FFF; private Entry [] table; private boolean verbose = Options.check("verbosecompression"); /** * Creates a new Compression object. */ public Compression() { table = new Entry[TABLE_SIZE]; } /** * Adds a compression entry mapping a name to a position in a message. * @param pos The position at which the name is added. * @param name The name being added to the message. */ public void add(int pos, Name name) { if (pos > MAX_POINTER) return; int row = (name.hashCode() & 0x7FFFFFFF) % TABLE_SIZE; Entry entry = new Entry(); entry.name = name; entry.pos = pos; entry.next = table[row]; table[row] = entry; if (verbose) System.err.println("Adding " + name + " at " + pos); } /** * Retrieves the position of the given name, if it has been previously * included in the message. * @param name The name to find in the compression table. * @return The position of the name, or -1 if not found. */ public int get(Name name) { int row = (name.hashCode() & 0x7FFFFFFF) % TABLE_SIZE; int pos = -1; for (Entry entry = table[row]; entry != null; entry = entry.next) { if (entry.name.equals(name)) pos = entry.pos; } if (verbose) System.err.println("Looking for " + name + ", found " + pos); return pos; } } dnsjava-2.1.5/org/xbill/DNS/Credibility.java100644 0 0 2321 10010035055 15712 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants relating to the credibility of cached data, which is based on * the data's source. The constants NORMAL and ANY should be used by most * callers. * @see Cache * @see Section * * @author Brian Wellington */ public final class Credibility { private Credibility() {} /** A hint or cache file on disk. */ public static final int HINT = 0; /** The additional section of a response. */ public static final int ADDITIONAL = 1; /** The additional section of a response. */ public static final int GLUE = 2; /** The authority section of a nonauthoritative response. */ public static final int NONAUTH_AUTHORITY = 3; /** The answer section of a nonauthoritative response. */ public static final int NONAUTH_ANSWER = 3; /** The authority section of an authoritative response. */ public static final int AUTH_AUTHORITY = 4; /** The answer section of a authoritative response. */ public static final int AUTH_ANSWER = 4; /** A zone. */ public static final int ZONE = 5; /** Credible data. */ public static final int NORMAL = 3; /** Data not required to be credible. */ public static final int ANY = 1; } dnsjava-2.1.5/org/xbill/DNS/DClass.java100644 0 0 3540 11214556657 14653 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to DNS classes. This is called DClass * to avoid confusion with Class. * * @author Brian Wellington */ public final class DClass { /** Internet */ public static final int IN = 1; /** Chaos network (MIT) */ public static final int CH = 3; /** Chaos network (MIT, alternate name) */ public static final int CHAOS = 3; /** Hesiod name server (MIT) */ public static final int HS = 4; /** Hesiod name server (MIT, alternate name) */ public static final int HESIOD = 4; /** Special value used in dynamic update messages */ public static final int NONE = 254; /** Matches any class */ public static final int ANY = 255; private static class DClassMnemonic extends Mnemonic { public DClassMnemonic() { super("DClass", CASE_UPPER); setPrefix("CLASS"); } public void check(int val) { DClass.check(val); } } private static Mnemonic classes = new DClassMnemonic(); static { classes.add(IN, "IN"); classes.add(CH, "CH"); classes.addAlias(CH, "CHAOS"); classes.add(HS, "HS"); classes.addAlias(HS, "HESIOD"); classes.add(NONE, "NONE"); classes.add(ANY, "ANY"); } private DClass() {} /** * Checks that a numeric DClass is valid. * @throws InvalidDClassException The class is out of range. */ public static void check(int i) { if (i < 0 || i > 0xFFFF) throw new InvalidDClassException(i); } /** * Converts a numeric DClass into a String * @return The canonical string representation of the class * @throws InvalidDClassException The class is out of range. */ public static String string(int i) { return classes.getText(i); } /** * Converts a String representation of a DClass into its numeric value * @return The class code, or -1 on error. */ public static int value(String s) { return classes.getValue(s); } } dnsjava-2.1.5/org/xbill/DNS/DHCIDRecord.java100644 0 0 2115 11254312416 15434 0ustar 0 0 // Copyright (c) 2008 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.base64; /** * DHCID - Dynamic Host Configuration Protocol (DHCP) ID (RFC 4701) * * @author Brian Wellington */ public class DHCIDRecord extends Record { private static final long serialVersionUID = -8214820200808997707L; private byte [] data; DHCIDRecord() {} Record getObject() { return new DHCIDRecord(); } /** * Creates an DHCID Record from the given data * @param data The binary data, which is opaque to DNS. */ public DHCIDRecord(Name name, int dclass, long ttl, byte [] data) { super(name, Type.DHCID, dclass, ttl); this.data = data; } void rrFromWire(DNSInput in) throws IOException { data = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { data = st.getBase64(); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(data); } String rrToString() { return base64.toString(data); } /** * Returns the binary data. */ public byte [] getData() { return data; } } dnsjava-2.1.5/org/xbill/DNS/DLVRecord.java100644 0 0 4663 11361745707 15274 0ustar 0 0 // Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * DLV - contains a Delegation Lookaside Validation record, which acts * as the equivalent of a DS record in a lookaside zone. * @see DNSSEC * @see DSRecord * * @author David Blacka * @author Brian Wellington */ public class DLVRecord extends Record { public static final int SHA1_DIGEST_ID = DSRecord.Digest.SHA1; public static final int SHA256_DIGEST_ID = DSRecord.Digest.SHA1; private static final long serialVersionUID = 1960742375677534148L; private int footprint; private int alg; private int digestid; private byte [] digest; DLVRecord() {} Record getObject() { return new DLVRecord(); } /** * Creates a DLV Record from the given data * @param footprint The original KEY record's footprint (keyid). * @param alg The original key algorithm. * @param digestid The digest id code. * @param digest A hash of the original key. */ public DLVRecord(Name name, int dclass, long ttl, int footprint, int alg, int digestid, byte [] digest) { super(name, Type.DLV, dclass, ttl); this.footprint = checkU16("footprint", footprint); this.alg = checkU8("alg", alg); this.digestid = checkU8("digestid", digestid); this.digest = digest; } void rrFromWire(DNSInput in) throws IOException { footprint = in.readU16(); alg = in.readU8(); digestid = in.readU8(); digest = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { footprint = st.getUInt16(); alg = st.getUInt8(); digestid = st.getUInt8(); digest = st.getHex(); } /** * Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(footprint); sb.append(" "); sb.append(alg); sb.append(" "); sb.append(digestid); if (digest != null) { sb.append(" "); sb.append(base16.toString(digest)); } return sb.toString(); } /** * Returns the key's algorithm. */ public int getAlgorithm() { return alg; } /** * Returns the key's Digest ID. */ public int getDigestID() { return digestid; } /** * Returns the binary hash of the key. */ public byte [] getDigest() { return digest; } /** * Returns the key's footprint. */ public int getFootprint() { return footprint; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(footprint); out.writeU8(alg); out.writeU8(digestid); if (digest != null) out.writeByteArray(digest); } } dnsjava-2.1.5/org/xbill/DNS/DNAMERecord.java100644 0 0 1510 11254312416 15443 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * DNAME Record - maps a nonterminal alias (subtree) to a different domain * * @author Brian Wellington */ public class DNAMERecord extends SingleNameBase { private static final long serialVersionUID = 2670767677200844154L; DNAMERecord() {} Record getObject() { return new DNAMERecord(); } /** * Creates a new DNAMERecord with the given data * @param alias The name to which the DNAME alias points */ public DNAMERecord(Name name, int dclass, long ttl, Name alias) { super(name, Type.DNAME, dclass, ttl, alias, "alias"); } /** * Gets the target of the DNAME Record */ public Name getTarget() { return getSingleName(); } /** Gets the alias specified by the DNAME Record */ public Name getAlias() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/DNSInput.java100644 0 0 12510 11562365423 15156 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An class for parsing DNS messages. * * @author Brian Wellington */ public class DNSInput { private byte [] array; private int pos; private int end; private int saved_pos; private int saved_end; /** * Creates a new DNSInput * @param input The byte array to read from */ public DNSInput(byte [] input) { array = input; pos = 0; end = array.length; saved_pos = -1; saved_end = -1; } /** * Returns the current position. */ public int current() { return pos; } /** * Returns the number of bytes that can be read from this stream before * reaching the end. */ public int remaining() { return end - pos; } private void require(int n) throws WireParseException{ if (n > remaining()) { throw new WireParseException("end of input"); } } /** * Marks the following bytes in the stream as active. * @param len The number of bytes in the active region. * @throws IllegalArgumentException The number of bytes in the active region * is longer than the remainder of the input. */ public void setActive(int len) { if (len > array.length - pos) { throw new IllegalArgumentException("cannot set active " + "region past end of input"); } end = pos + len; } /** * Clears the active region of the string. Further operations are not * restricted to part of the input. */ public void clearActive() { end = array.length; } /** * Returns the position of the end of the current active region. */ public int saveActive() { return end; } /** * Restores the previously set active region. This differs from setActive() in * that restoreActive() takes an absolute position, and setActive takes an * offset from the current location. * @param pos The end of the active region. */ public void restoreActive(int pos) { if (pos > array.length) { throw new IllegalArgumentException("cannot set active " + "region past end of input"); } end = pos; } /** * Resets the current position of the input stream to the specified index, * and clears the active region. * @param index The position to continue parsing at. * @throws IllegalArgumentException The index is not within the input. */ public void jump(int index) { if (index >= array.length) { throw new IllegalArgumentException("cannot jump past " + "end of input"); } pos = index; end = array.length; } /** * Saves the current state of the input stream. Both the current position and * the end of the active region are saved. * @throws IllegalArgumentException The index is not within the input. */ public void save() { saved_pos = pos; saved_end = end; } /** * Restores the input stream to its state before the call to {@link #save}. */ public void restore() { if (saved_pos < 0) { throw new IllegalStateException("no previous state"); } pos = saved_pos; end = saved_end; saved_pos = -1; saved_end = -1; } /** * Reads an unsigned 8 bit value from the stream, as an int. * @return An unsigned 8 bit value. * @throws WireParseException The end of the stream was reached. */ public int readU8() throws WireParseException { require(1); return (array[pos++] & 0xFF); } /** * Reads an unsigned 16 bit value from the stream, as an int. * @return An unsigned 16 bit value. * @throws WireParseException The end of the stream was reached. */ public int readU16() throws WireParseException { require(2); int b1 = array[pos++] & 0xFF; int b2 = array[pos++] & 0xFF; return ((b1 << 8) + b2); } /** * Reads an unsigned 32 bit value from the stream, as a long. * @return An unsigned 32 bit value. * @throws WireParseException The end of the stream was reached. */ public long readU32() throws WireParseException { require(4); int b1 = array[pos++] & 0xFF; int b2 = array[pos++] & 0xFF; int b3 = array[pos++] & 0xFF; int b4 = array[pos++] & 0xFF; return (((long)b1 << 24) + (b2 << 16) + (b3 << 8) + b4); } /** * Reads a byte array of a specified length from the stream into an existing * array. * @param b The array to read into. * @param off The offset of the array to start copying data into. * @param len The number of bytes to copy. * @throws WireParseException The end of the stream was reached. */ public void readByteArray(byte [] b, int off, int len) throws WireParseException { require(len); System.arraycopy(array, pos, b, off, len); pos += len; } /** * Reads a byte array of a specified length from the stream. * @return The byte array. * @throws WireParseException The end of the stream was reached. */ public byte [] readByteArray(int len) throws WireParseException { require(len); byte [] out = new byte[len]; System.arraycopy(array, pos, out, 0, len); pos += len; return out; } /** * Reads a byte array consisting of the remainder of the stream (or the * active region, if one is set. * @return The byte array. */ public byte [] readByteArray() { int len = remaining(); byte [] out = new byte[len]; System.arraycopy(array, pos, out, 0, len); pos += len; return out; } /** * Reads a counted string from the stream. A counted string is a one byte * value indicating string length, followed by bytes of data. * @return A byte array containing the string. * @throws WireParseException The end of the stream was reached. */ public byte [] readCountedString() throws WireParseException { require(1); int len = array[pos++] & 0xFF; return readByteArray(len); } } dnsjava-2.1.5/org/xbill/DNS/DNSKEYRecord.java100644 0 0 4274 11367375723 15645 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.security.PublicKey; /** * Key - contains a cryptographic public key for use by DNS. * The data can be converted to objects implementing * java.security.interfaces.PublicKey * @see DNSSEC * * @author Brian Wellington */ public class DNSKEYRecord extends KEYBase { public static class Protocol { private Protocol() {} /** Key will be used for DNSSEC */ public static final int DNSSEC = 3; } public static class Flags { private Flags() {} /** Key is a zone key */ public static final int ZONE_KEY = 0x100; /** Key is a secure entry point key */ public static final int SEP_KEY = 0x1; /** Key has been revoked */ public static final int REVOKE = 0x80; } private static final long serialVersionUID = -8679800040426675002L; DNSKEYRecord() {} Record getObject() { return new DNSKEYRecord(); } /** * Creates a DNSKEY Record from the given data * @param flags Flags describing the key's properties * @param proto The protocol that the key was created for * @param alg The key's algorithm * @param key Binary representation of the key */ public DNSKEYRecord(Name name, int dclass, long ttl, int flags, int proto, int alg, byte [] key) { super(name, Type.DNSKEY, dclass, ttl, flags, proto, alg, key); } /** * Creates a DNSKEY Record from the given data * @param flags Flags describing the key's properties * @param proto The protocol that the key was created for * @param alg The key's algorithm * @param key The key as a PublicKey * @throws DNSSEC.DNSSECException The PublicKey could not be converted into DNS * format. */ public DNSKEYRecord(Name name, int dclass, long ttl, int flags, int proto, int alg, PublicKey key) throws DNSSEC.DNSSECException { super(name, Type.DNSKEY, dclass, ttl, flags, proto, alg, DNSSEC.fromPublicKey(key, alg)); publicKey = key; } void rdataFromString(Tokenizer st, Name origin) throws IOException { flags = st.getUInt16(); proto = st.getUInt8(); String algString = st.getString(); alg = DNSSEC.Algorithm.value(algString); if (alg < 0) throw st.exception("Invalid algorithm: " + algString); key = st.getBase64(); } } dnsjava-2.1.5/org/xbill/DNS/DNSOutput.java100644 0 0 7743 11562365536 15360 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * A class for rendering DNS messages. * * @author Brian Wellington */ public class DNSOutput { private byte [] array; private int pos; private int saved_pos; /** * Create a new DNSOutput with a specified size. * @param size The initial size */ public DNSOutput(int size) { array = new byte[size]; pos = 0; saved_pos = -1; } /** * Create a new DNSOutput */ public DNSOutput() { this(32); } /** * Returns the current position. */ public int current() { return pos; } private void check(long val, int bits) { long max = 1; max <<= bits; if (val < 0 || val > max) { throw new IllegalArgumentException(val + " out of range for " + bits + " bit value"); } } private void need(int n) { if (array.length - pos >= n) { return; } int newsize = array.length * 2; if (newsize < pos + n) { newsize = pos + n; } byte [] newarray = new byte[newsize]; System.arraycopy(array, 0, newarray, 0, pos); array = newarray; } /** * Resets the current position of the output stream to the specified index. * @param index The new current position. * @throws IllegalArgumentException The index is not within the output. */ public void jump(int index) { if (index > pos) { throw new IllegalArgumentException("cannot jump past " + "end of data"); } pos = index; } /** * Saves the current state of the output stream. * @throws IllegalArgumentException The index is not within the output. */ public void save() { saved_pos = pos; } /** * Restores the input stream to its state before the call to {@link #save}. */ public void restore() { if (saved_pos < 0) { throw new IllegalStateException("no previous state"); } pos = saved_pos; saved_pos = -1; } /** * Writes an unsigned 8 bit value to the stream. * @param val The value to be written */ public void writeU8(int val) { check(val, 8); need(1); array[pos++] = (byte)(val & 0xFF); } /** * Writes an unsigned 16 bit value to the stream. * @param val The value to be written */ public void writeU16(int val) { check(val, 16); need(2); array[pos++] = (byte)((val >>> 8) & 0xFF); array[pos++] = (byte)(val & 0xFF); } /** * Writes an unsigned 16 bit value to the specified position in the stream. * @param val The value to be written * @param where The position to write the value. */ public void writeU16At(int val, int where) { check(val, 16); if (where > pos - 2) throw new IllegalArgumentException("cannot write past " + "end of data"); array[where++] = (byte)((val >>> 8) & 0xFF); array[where++] = (byte)(val & 0xFF); } /** * Writes an unsigned 32 bit value to the stream. * @param val The value to be written */ public void writeU32(long val) { check(val, 32); need(4); array[pos++] = (byte)((val >>> 24) & 0xFF); array[pos++] = (byte)((val >>> 16) & 0xFF); array[pos++] = (byte)((val >>> 8) & 0xFF); array[pos++] = (byte)(val & 0xFF); } /** * Writes a byte array to the stream. * @param b The array to write. * @param off The offset of the array to start copying data from. * @param len The number of bytes to write. */ public void writeByteArray(byte [] b, int off, int len) { need(len); System.arraycopy(b, off, array, pos, len); pos += len; } /** * Writes a byte array to the stream. * @param b The array to write. */ public void writeByteArray(byte [] b) { writeByteArray(b, 0, b.length); } /** * Writes a counted string from the stream. A counted string is a one byte * value indicating string length, followed by bytes of data. * @param s The string to write. */ public void writeCountedString(byte [] s) { if (s.length > 0xFF) { throw new IllegalArgumentException("Invalid counted string"); } need(1 + s.length); array[pos++] = (byte)(s.length & 0xFF); writeByteArray(s, 0, s.length); } /** * Returns a byte array containing the current contents of the stream. */ public byte [] toByteArray() { byte [] out = new byte[pos]; System.arraycopy(array, 0, out, 0, pos); return out; } } dnsjava-2.1.5/org/xbill/DNS/DNSSEC.java100644 0 0 66046 12121713302 14467 0ustar 0 0 // Copyright (c) 1999-2010 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.math.*; import java.security.*; import java.security.interfaces.*; import java.security.spec.*; import java.util.*; /** * Constants and methods relating to DNSSEC. * * DNSSEC provides authentication for DNS information. * @see RRSIGRecord * @see DNSKEYRecord * @see RRset * * @author Brian Wellington */ public class DNSSEC { public static class Algorithm { private Algorithm() {} /** RSA/MD5 public key (deprecated) */ public static final int RSAMD5 = 1; /** Diffie Hellman key */ public static final int DH = 2; /** DSA public key */ public static final int DSA = 3; /** RSA/SHA1 public key */ public static final int RSASHA1 = 5; /** DSA/SHA1, NSEC3-aware public key */ public static final int DSA_NSEC3_SHA1 = 6; /** RSA/SHA1, NSEC3-aware public key */ public static final int RSA_NSEC3_SHA1 = 7; /** RSA/SHA256 public key */ public static final int RSASHA256 = 8; /** RSA/SHA512 public key */ public static final int RSASHA512 = 10; /** ECDSA Curve P-256 with SHA-256 public key **/ public static final int ECDSAP256SHA256 = 13; /** ECDSA Curve P-384 with SHA-384 public key **/ public static final int ECDSAP384SHA384 = 14; /** Indirect keys; the actual key is elsewhere. */ public static final int INDIRECT = 252; /** Private algorithm, specified by domain name */ public static final int PRIVATEDNS = 253; /** Private algorithm, specified by OID */ public static final int PRIVATEOID = 254; private static Mnemonic algs = new Mnemonic("DNSSEC algorithm", Mnemonic.CASE_UPPER); static { algs.setMaximum(0xFF); algs.setNumericAllowed(true); algs.add(RSAMD5, "RSAMD5"); algs.add(DH, "DH"); algs.add(DSA, "DSA"); algs.add(RSASHA1, "RSASHA1"); algs.add(DSA_NSEC3_SHA1, "DSA-NSEC3-SHA1"); algs.add(RSA_NSEC3_SHA1, "RSA-NSEC3-SHA1"); algs.add(RSASHA256, "RSASHA256"); algs.add(RSASHA512, "RSASHA512"); algs.add(ECDSAP256SHA256, "ECDSAP256SHA256"); algs.add(ECDSAP384SHA384, "ECDSAP384SHA384"); algs.add(INDIRECT, "INDIRECT"); algs.add(PRIVATEDNS, "PRIVATEDNS"); algs.add(PRIVATEOID, "PRIVATEOID"); } /** * Converts an algorithm into its textual representation */ public static String string(int alg) { return algs.getText(alg); } /** * Converts a textual representation of an algorithm into its numeric * code. Integers in the range 0..255 are also accepted. * @param s The textual representation of the algorithm * @return The algorithm code, or -1 on error. */ public static int value(String s) { return algs.getValue(s); } } private DNSSEC() { } private static void digestSIG(DNSOutput out, SIGBase sig) { out.writeU16(sig.getTypeCovered()); out.writeU8(sig.getAlgorithm()); out.writeU8(sig.getLabels()); out.writeU32(sig.getOrigTTL()); out.writeU32(sig.getExpire().getTime() / 1000); out.writeU32(sig.getTimeSigned().getTime() / 1000); out.writeU16(sig.getFootprint()); sig.getSigner().toWireCanonical(out); } /** * Creates a byte array containing the concatenation of the fields of the * SIG record and the RRsets to be signed/verified. This does not perform * a cryptographic digest. * @param rrsig The RRSIG record used to sign/verify the rrset. * @param rrset The data to be signed/verified. * @return The data to be cryptographically signed or verified. */ public static byte [] digestRRset(RRSIGRecord rrsig, RRset rrset) { DNSOutput out = new DNSOutput(); digestSIG(out, rrsig); int size = rrset.size(); Record [] records = new Record[size]; Iterator it = rrset.rrs(); Name name = rrset.getName(); Name wild = null; int sigLabels = rrsig.getLabels() + 1; // Add the root label back. if (name.labels() > sigLabels) wild = name.wild(name.labels() - sigLabels); while (it.hasNext()) records[--size] = (Record) it.next(); Arrays.sort(records); DNSOutput header = new DNSOutput(); if (wild != null) wild.toWireCanonical(header); else name.toWireCanonical(header); header.writeU16(rrset.getType()); header.writeU16(rrset.getDClass()); header.writeU32(rrsig.getOrigTTL()); for (int i = 0; i < records.length; i++) { out.writeByteArray(header.toByteArray()); int lengthPosition = out.current(); out.writeU16(0); out.writeByteArray(records[i].rdataToWireCanonical()); int rrlength = out.current() - lengthPosition - 2; out.save(); out.jump(lengthPosition); out.writeU16(rrlength); out.restore(); } return out.toByteArray(); } /** * Creates a byte array containing the concatenation of the fields of the * SIG(0) record and the message to be signed. This does not perform * a cryptographic digest. * @param sig The SIG record used to sign the rrset. * @param msg The message to be signed. * @param previous If this is a response, the signature from the query. * @return The data to be cryptographically signed. */ public static byte [] digestMessage(SIGRecord sig, Message msg, byte [] previous) { DNSOutput out = new DNSOutput(); digestSIG(out, sig); if (previous != null) out.writeByteArray(previous); msg.toWire(out); return out.toByteArray(); } /** * A DNSSEC exception. */ public static class DNSSECException extends Exception { DNSSECException(String s) { super(s); } } /** * An algorithm is unsupported by this DNSSEC implementation. */ public static class UnsupportedAlgorithmException extends DNSSECException { UnsupportedAlgorithmException(int alg) { super("Unsupported algorithm: " + alg); } } /** * The cryptographic data in a DNSSEC key is malformed. */ public static class MalformedKeyException extends DNSSECException { MalformedKeyException(KEYBase rec) { super("Invalid key data: " + rec.rdataToString()); } } /** * A DNSSEC verification failed because fields in the DNSKEY and RRSIG records * do not match. */ public static class KeyMismatchException extends DNSSECException { private KEYBase key; private SIGBase sig; KeyMismatchException(KEYBase key, SIGBase sig) { super("key " + key.getName() + "/" + DNSSEC.Algorithm.string(key.getAlgorithm()) + "/" + key.getFootprint() + " " + "does not match signature " + sig.getSigner() + "/" + DNSSEC.Algorithm.string(sig.getAlgorithm()) + "/" + sig.getFootprint()); } } /** * A DNSSEC verification failed because the signature has expired. */ public static class SignatureExpiredException extends DNSSECException { private Date when, now; SignatureExpiredException(Date when, Date now) { super("signature expired"); this.when = when; this.now = now; } /** * @return When the signature expired */ public Date getExpiration() { return when; } /** * @return When the verification was attempted */ public Date getVerifyTime() { return now; } } /** * A DNSSEC verification failed because the signature has not yet become valid. */ public static class SignatureNotYetValidException extends DNSSECException { private Date when, now; SignatureNotYetValidException(Date when, Date now) { super("signature is not yet valid"); this.when = when; this.now = now; } /** * @return When the signature will become valid */ public Date getExpiration() { return when; } /** * @return When the verification was attempted */ public Date getVerifyTime() { return now; } } /** * A DNSSEC verification failed because the cryptographic signature * verification failed. */ public static class SignatureVerificationException extends DNSSECException { SignatureVerificationException() { super("signature verification failed"); } } /** * The key data provided is inconsistent. */ public static class IncompatibleKeyException extends IllegalArgumentException { IncompatibleKeyException() { super("incompatible keys"); } } private static int BigIntegerLength(BigInteger i) { return (i.bitLength() + 7) / 8; } private static BigInteger readBigInteger(DNSInput in, int len) throws IOException { byte [] b = in.readByteArray(len); return new BigInteger(1, b); } private static BigInteger readBigInteger(DNSInput in) { byte [] b = in.readByteArray(); return new BigInteger(1, b); } private static void writeBigInteger(DNSOutput out, BigInteger val) { byte [] b = val.toByteArray(); if (b[0] == 0) out.writeByteArray(b, 1, b.length - 1); else out.writeByteArray(b); } private static PublicKey toRSAPublicKey(KEYBase r) throws IOException, GeneralSecurityException { DNSInput in = new DNSInput(r.getKey()); int exponentLength = in.readU8(); if (exponentLength == 0) exponentLength = in.readU16(); BigInteger exponent = readBigInteger(in, exponentLength); BigInteger modulus = readBigInteger(in); KeyFactory factory = KeyFactory.getInstance("RSA"); return factory.generatePublic(new RSAPublicKeySpec(modulus, exponent)); } private static PublicKey toDSAPublicKey(KEYBase r) throws IOException, GeneralSecurityException, MalformedKeyException { DNSInput in = new DNSInput(r.getKey()); int t = in.readU8(); if (t > 8) throw new MalformedKeyException(r); BigInteger q = readBigInteger(in, 20); BigInteger p = readBigInteger(in, 64 + t*8); BigInteger g = readBigInteger(in, 64 + t*8); BigInteger y = readBigInteger(in, 64 + t*8); KeyFactory factory = KeyFactory.getInstance("DSA"); return factory.generatePublic(new DSAPublicKeySpec(y, p, q, g)); } private static class ECKeyInfo { int length; public BigInteger p, a, b, gx, gy, n; EllipticCurve curve; ECParameterSpec spec; ECKeyInfo(int length, String p_str, String a_str, String b_str, String gx_str, String gy_str, String n_str) { this.length = length; p = new BigInteger(p_str, 16); a = new BigInteger(a_str, 16); b = new BigInteger(b_str, 16); gx = new BigInteger(gx_str, 16); gy = new BigInteger(gy_str, 16); n = new BigInteger(n_str, 16); curve = new EllipticCurve(new ECFieldFp(p), a, b); spec = new ECParameterSpec(curve, new ECPoint(gx, gy), n, 1); } } // RFC 5114 Section 2.6 private static final ECKeyInfo ECDSA_P256 = new ECKeyInfo(32, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); // RFC 5114 Section 2.7 private static final ECKeyInfo ECDSA_P384 = new ECKeyInfo(48, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"); private static PublicKey toECDSAPublicKey(KEYBase r, ECKeyInfo keyinfo) throws IOException, GeneralSecurityException, MalformedKeyException { DNSInput in = new DNSInput(r.getKey()); // RFC 6605 Section 4 BigInteger x = readBigInteger(in, keyinfo.length); BigInteger y = readBigInteger(in, keyinfo.length); ECPoint q = new ECPoint(x, y); KeyFactory factory = KeyFactory.getInstance("EC"); return factory.generatePublic(new ECPublicKeySpec(q, keyinfo.spec)); } /** Converts a KEY/DNSKEY record into a PublicKey */ static PublicKey toPublicKey(KEYBase r) throws DNSSECException { int alg = r.getAlgorithm(); try { switch (alg) { case Algorithm.RSAMD5: case Algorithm.RSASHA1: case Algorithm.RSA_NSEC3_SHA1: case Algorithm.RSASHA256: case Algorithm.RSASHA512: return toRSAPublicKey(r); case Algorithm.DSA: case Algorithm.DSA_NSEC3_SHA1: return toDSAPublicKey(r); case Algorithm.ECDSAP256SHA256: return toECDSAPublicKey(r, ECDSA_P256); case Algorithm.ECDSAP384SHA384: return toECDSAPublicKey(r, ECDSA_P384); default: throw new UnsupportedAlgorithmException(alg); } } catch (IOException e) { throw new MalformedKeyException(r); } catch (GeneralSecurityException e) { throw new DNSSECException(e.toString()); } } private static byte [] fromRSAPublicKey(RSAPublicKey key) { DNSOutput out = new DNSOutput(); BigInteger exponent = key.getPublicExponent(); BigInteger modulus = key.getModulus(); int exponentLength = BigIntegerLength(exponent); if (exponentLength < 256) out.writeU8(exponentLength); else { out.writeU8(0); out.writeU16(exponentLength); } writeBigInteger(out, exponent); writeBigInteger(out, modulus); return out.toByteArray(); } private static byte [] fromDSAPublicKey(DSAPublicKey key) { DNSOutput out = new DNSOutput(); BigInteger q = key.getParams().getQ(); BigInteger p = key.getParams().getP(); BigInteger g = key.getParams().getG(); BigInteger y = key.getY(); int t = (p.toByteArray().length - 64) / 8; out.writeU8(t); writeBigInteger(out, q); writeBigInteger(out, p); writeBigInteger(out, g); writeBigInteger(out, y); return out.toByteArray(); } private static byte [] fromECDSAPublicKey(ECPublicKey key) { DNSOutput out = new DNSOutput(); BigInteger x = key.getW().getAffineX(); BigInteger y = key.getW().getAffineY(); writeBigInteger(out, x); writeBigInteger(out, y); return out.toByteArray(); } /** Builds a DNSKEY record from a PublicKey */ static byte [] fromPublicKey(PublicKey key, int alg) throws DNSSECException { switch (alg) { case Algorithm.RSAMD5: case Algorithm.RSASHA1: case Algorithm.RSA_NSEC3_SHA1: case Algorithm.RSASHA256: case Algorithm.RSASHA512: if (! (key instanceof RSAPublicKey)) throw new IncompatibleKeyException(); return fromRSAPublicKey((RSAPublicKey) key); case Algorithm.DSA: case Algorithm.DSA_NSEC3_SHA1: if (! (key instanceof DSAPublicKey)) throw new IncompatibleKeyException(); return fromDSAPublicKey((DSAPublicKey) key); case Algorithm.ECDSAP256SHA256: case Algorithm.ECDSAP384SHA384: if (! (key instanceof ECPublicKey)) throw new IncompatibleKeyException(); return fromECDSAPublicKey((ECPublicKey) key); default: throw new UnsupportedAlgorithmException(alg); } } /** * Convert an algorithm number to the corresponding JCA string. * @param alg The algorithm number. * @throws UnsupportedAlgorithmException The algorithm is unknown. */ public static String algString(int alg) throws UnsupportedAlgorithmException { switch (alg) { case Algorithm.RSAMD5: return "MD5withRSA"; case Algorithm.DSA: case Algorithm.DSA_NSEC3_SHA1: return "SHA1withDSA"; case Algorithm.RSASHA1: case Algorithm.RSA_NSEC3_SHA1: return "SHA1withRSA"; case Algorithm.RSASHA256: return "SHA256withRSA"; case Algorithm.RSASHA512: return "SHA512withRSA"; case Algorithm.ECDSAP256SHA256: return "SHA256withECDSA"; case Algorithm.ECDSAP384SHA384: return "SHA384withECDSA"; default: throw new UnsupportedAlgorithmException(alg); } } private static final int ASN1_SEQ = 0x30; private static final int ASN1_INT = 0x2; private static final int DSA_LEN = 20; private static byte [] DSASignaturefromDNS(byte [] dns) throws DNSSECException, IOException { if (dns.length != 1 + DSA_LEN * 2) throw new SignatureVerificationException(); DNSInput in = new DNSInput(dns); DNSOutput out = new DNSOutput(); int t = in.readU8(); byte [] r = in.readByteArray(DSA_LEN); int rlen = DSA_LEN; if (r[0] < 0) rlen++; byte [] s = in.readByteArray(DSA_LEN); int slen = DSA_LEN; if (s[0] < 0) slen++; out.writeU8(ASN1_SEQ); out.writeU8(rlen + slen + 4); out.writeU8(ASN1_INT); out.writeU8(rlen); if (rlen > DSA_LEN) out.writeU8(0); out.writeByteArray(r); out.writeU8(ASN1_INT); out.writeU8(slen); if (slen > DSA_LEN) out.writeU8(0); out.writeByteArray(s); return out.toByteArray(); } private static byte [] DSASignaturetoDNS(byte [] signature, int t) throws IOException { DNSInput in = new DNSInput(signature); DNSOutput out = new DNSOutput(); out.writeU8(t); int tmp = in.readU8(); if (tmp != ASN1_SEQ) throw new IOException(); int seqlen = in.readU8(); tmp = in.readU8(); if (tmp != ASN1_INT) throw new IOException(); int rlen = in.readU8(); if (rlen == DSA_LEN + 1) { if (in.readU8() != 0) throw new IOException(); } else if (rlen != DSA_LEN) throw new IOException(); byte [] bytes = in.readByteArray(DSA_LEN); out.writeByteArray(bytes); tmp = in.readU8(); if (tmp != ASN1_INT) throw new IOException(); int slen = in.readU8(); if (slen == DSA_LEN + 1) { if (in.readU8() != 0) throw new IOException(); } else if (slen != DSA_LEN) throw new IOException(); bytes = in.readByteArray(DSA_LEN); out.writeByteArray(bytes); return out.toByteArray(); } private static byte [] ECDSASignaturefromDNS(byte [] signature, ECKeyInfo keyinfo) throws DNSSECException, IOException { if (signature.length != keyinfo.length * 2) throw new SignatureVerificationException(); DNSInput in = new DNSInput(signature); DNSOutput out = new DNSOutput(); byte [] r = in.readByteArray(keyinfo.length); int rlen = keyinfo.length; if (r[0] < 0) rlen++; byte [] s = in.readByteArray(keyinfo.length); int slen = keyinfo.length; if (s[0] < 0) slen++; out.writeU8(ASN1_SEQ); out.writeU8(rlen + slen + 4); out.writeU8(ASN1_INT); out.writeU8(rlen); if (rlen > keyinfo.length) out.writeU8(0); out.writeByteArray(r); out.writeU8(ASN1_INT); out.writeU8(slen); if (slen > keyinfo.length) out.writeU8(0); out.writeByteArray(s); return out.toByteArray(); } private static byte [] ECDSASignaturetoDNS(byte [] signature, ECKeyInfo keyinfo) throws IOException { DNSInput in = new DNSInput(signature); DNSOutput out = new DNSOutput(); int tmp = in.readU8(); if (tmp != ASN1_SEQ) throw new IOException(); int seqlen = in.readU8(); tmp = in.readU8(); if (tmp != ASN1_INT) throw new IOException(); int rlen = in.readU8(); if (rlen == keyinfo.length + 1) { if (in.readU8() != 0) throw new IOException(); } else if (rlen != keyinfo.length) throw new IOException(); byte[] bytes = in.readByteArray(keyinfo.length); out.writeByteArray(bytes); tmp = in.readU8(); if (tmp != ASN1_INT) throw new IOException(); int slen = in.readU8(); if (slen == keyinfo.length + 1) { if (in.readU8() != 0) throw new IOException(); } else if (slen != keyinfo.length) throw new IOException(); bytes = in.readByteArray(keyinfo.length); out.writeByteArray(bytes); return out.toByteArray(); } private static void verify(PublicKey key, int alg, byte [] data, byte [] signature) throws DNSSECException { if (key instanceof DSAPublicKey) { try { signature = DSASignaturefromDNS(signature); } catch (IOException e) { throw new IllegalStateException(); } } else if (key instanceof ECPublicKey) { try { switch (alg) { case Algorithm.ECDSAP256SHA256: signature = ECDSASignaturefromDNS(signature, ECDSA_P256); break; case Algorithm.ECDSAP384SHA384: signature = ECDSASignaturefromDNS(signature, ECDSA_P384); break; default: throw new UnsupportedAlgorithmException(alg); } } catch (IOException e) { throw new IllegalStateException(); } } try { Signature s = Signature.getInstance(algString(alg)); s.initVerify(key); s.update(data); if (!s.verify(signature)) throw new SignatureVerificationException(); } catch (GeneralSecurityException e) { throw new DNSSECException(e.toString()); } } private static boolean matches(SIGBase sig, KEYBase key) { return (key.getAlgorithm() == sig.getAlgorithm() && key.getFootprint() == sig.getFootprint() && key.getName().equals(sig.getSigner())); } /** * Verify a DNSSEC signature. * @param rrset The data to be verified. * @param rrsig The RRSIG record containing the signature. * @param key The DNSKEY record to verify the signature with. * @throws UnsupportedAlgorithmException The algorithm is unknown * @throws MalformedKeyException The key is malformed * @throws KeyMismatchException The key and signature do not match * @throws SignatureExpiredException The signature has expired * @throws SignatureNotYetValidException The signature is not yet valid * @throws SignatureVerificationException The signature does not verify. * @throws DNSSECException Some other error occurred. */ public static void verify(RRset rrset, RRSIGRecord rrsig, DNSKEYRecord key) throws DNSSECException { if (!matches(rrsig, key)) throw new KeyMismatchException(key, rrsig); Date now = new Date(); if (now.compareTo(rrsig.getExpire()) > 0) throw new SignatureExpiredException(rrsig.getExpire(), now); if (now.compareTo(rrsig.getTimeSigned()) < 0) throw new SignatureNotYetValidException(rrsig.getTimeSigned(), now); verify(key.getPublicKey(), rrsig.getAlgorithm(), digestRRset(rrsig, rrset), rrsig.getSignature()); } private static byte [] sign(PrivateKey privkey, PublicKey pubkey, int alg, byte [] data, String provider) throws DNSSECException { byte [] signature; try { Signature s; if (provider != null) s = Signature.getInstance(algString(alg), provider); else s = Signature.getInstance(algString(alg)); s.initSign(privkey); s.update(data); signature = s.sign(); } catch (GeneralSecurityException e) { throw new DNSSECException(e.toString()); } if (pubkey instanceof DSAPublicKey) { try { DSAPublicKey dsa = (DSAPublicKey) pubkey; BigInteger P = dsa.getParams().getP(); int t = (BigIntegerLength(P) - 64) / 8; signature = DSASignaturetoDNS(signature, t); } catch (IOException e) { throw new IllegalStateException(); } } else if (pubkey instanceof ECPublicKey) { try { switch (alg) { case Algorithm.ECDSAP256SHA256: signature = ECDSASignaturetoDNS(signature, ECDSA_P256); break; case Algorithm.ECDSAP384SHA384: signature = ECDSASignaturetoDNS(signature, ECDSA_P384); break; default: throw new UnsupportedAlgorithmException(alg); } } catch (IOException e) { throw new IllegalStateException(); } } return signature; } static void checkAlgorithm(PrivateKey key, int alg) throws UnsupportedAlgorithmException { switch (alg) { case Algorithm.RSAMD5: case Algorithm.RSASHA1: case Algorithm.RSA_NSEC3_SHA1: case Algorithm.RSASHA256: case Algorithm.RSASHA512: if (! (key instanceof RSAPrivateKey)) throw new IncompatibleKeyException(); break; case Algorithm.DSA: case Algorithm.DSA_NSEC3_SHA1: if (! (key instanceof DSAPrivateKey)) throw new IncompatibleKeyException(); break; case Algorithm.ECDSAP256SHA256: case Algorithm.ECDSAP384SHA384: if (! (key instanceof ECPrivateKey)) throw new IncompatibleKeyException(); break; default: throw new UnsupportedAlgorithmException(alg); } } /** * Generate a DNSSEC signature. key and privateKey must refer to the * same underlying cryptographic key. * @param rrset The data to be signed * @param key The DNSKEY record to use as part of signing * @param privkey The PrivateKey to use when signing * @param inception The time at which the signatures should become valid * @param expiration The time at which the signatures should expire * @throws UnsupportedAlgorithmException The algorithm is unknown * @throws MalformedKeyException The key is malformed * @throws DNSSECException Some other error occurred. * @return The generated signature */ public static RRSIGRecord sign(RRset rrset, DNSKEYRecord key, PrivateKey privkey, Date inception, Date expiration) throws DNSSECException { return sign(rrset, key, privkey, inception, expiration, null); } /** * Generate a DNSSEC signature. key and privateKey must refer to the * same underlying cryptographic key. * @param rrset The data to be signed * @param key The DNSKEY record to use as part of signing * @param privkey The PrivateKey to use when signing * @param inception The time at which the signatures should become valid * @param expiration The time at which the signatures should expire * @param provider The name of the JCA provider. If non-null, it will be * passed to JCA getInstance() methods. * @throws UnsupportedAlgorithmException The algorithm is unknown * @throws MalformedKeyException The key is malformed * @throws DNSSECException Some other error occurred. * @return The generated signature */ public static RRSIGRecord sign(RRset rrset, DNSKEYRecord key, PrivateKey privkey, Date inception, Date expiration, String provider) throws DNSSECException { int alg = key.getAlgorithm(); checkAlgorithm(privkey, alg); RRSIGRecord rrsig = new RRSIGRecord(rrset.getName(), rrset.getDClass(), rrset.getTTL(), rrset.getType(), alg, rrset.getTTL(), expiration, inception, key.getFootprint(), key.getName(), null); rrsig.setSignature(sign(privkey, key.getPublicKey(), alg, digestRRset(rrsig, rrset), provider)); return rrsig; } static SIGRecord signMessage(Message message, SIGRecord previous, KEYRecord key, PrivateKey privkey, Date inception, Date expiration) throws DNSSECException { int alg = key.getAlgorithm(); checkAlgorithm(privkey, alg); SIGRecord sig = new SIGRecord(Name.root, DClass.ANY, 0, 0, alg, 0, expiration, inception, key.getFootprint(), key.getName(), null); DNSOutput out = new DNSOutput(); digestSIG(out, sig); if (previous != null) out.writeByteArray(previous.getSignature()); message.toWire(out); sig.setSignature(sign(privkey, key.getPublicKey(), alg, out.toByteArray(), null)); return sig; } static void verifyMessage(Message message, byte [] bytes, SIGRecord sig, SIGRecord previous, KEYRecord key) throws DNSSECException { if (!matches(sig, key)) throw new KeyMismatchException(key, sig); Date now = new Date(); if (now.compareTo(sig.getExpire()) > 0) throw new SignatureExpiredException(sig.getExpire(), now); if (now.compareTo(sig.getTimeSigned()) < 0) throw new SignatureNotYetValidException(sig.getTimeSigned(), now); DNSOutput out = new DNSOutput(); digestSIG(out, sig); if (previous != null) out.writeByteArray(previous.getSignature()); Header header = (Header) message.getHeader().clone(); header.decCount(Section.ADDITIONAL); out.writeByteArray(header.toWire()); out.writeByteArray(bytes, Header.LENGTH, message.sig0start - Header.LENGTH); verify(key.getPublicKey(), sig.getAlgorithm(), out.toByteArray(), sig.getSignature()); } /** * Generate the digest value for a DS key * @param key Which is covered by the DS record * @param digestid The type of digest * @return The digest value as an array of bytes */ static byte [] generateDSDigest(DNSKEYRecord key, int digestid) { MessageDigest digest; try { switch (digestid) { case DSRecord.Digest.SHA1: digest = MessageDigest.getInstance("sha-1"); break; case DSRecord.Digest.SHA256: digest = MessageDigest.getInstance("sha-256"); break; case DSRecord.Digest.SHA384: digest = MessageDigest.getInstance("sha-384"); break; default: throw new IllegalArgumentException( "unknown DS digest type " + digestid); } } catch (NoSuchAlgorithmException e) { throw new IllegalStateException("no message digest support"); } digest.update(key.getName().toWireCanonical()); digest.update(key.rdataToWireCanonical()); return digest.digest(); } } dnsjava-2.1.5/org/xbill/DNS/DSRecord.java100644 0 0 5723 12021540053 15130 0ustar 0 0 // Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * DS - contains a Delegation Signer record, which acts as a * placeholder for KEY records in the parent zone. * @see DNSSEC * * @author David Blacka * @author Brian Wellington */ public class DSRecord extends Record { public static class Digest { private Digest() {} /** SHA-1 */ public static final int SHA1 = 1; /** SHA-256 */ public static final int SHA256 = 2; /** SHA-384 */ public static final int SHA384 = 4; } public static final int SHA1_DIGEST_ID = Digest.SHA1; public static final int SHA256_DIGEST_ID = Digest.SHA256; public static final int SHA384_DIGEST_ID = Digest.SHA384; private static final long serialVersionUID = -9001819329700081493L; private int footprint; private int alg; private int digestid; private byte [] digest; DSRecord() {} Record getObject() { return new DSRecord(); } /** * Creates a DS Record from the given data * @param footprint The original KEY record's footprint (keyid). * @param alg The original key algorithm. * @param digestid The digest id code. * @param digest A hash of the original key. */ public DSRecord(Name name, int dclass, long ttl, int footprint, int alg, int digestid, byte [] digest) { super(name, Type.DS, dclass, ttl); this.footprint = checkU16("footprint", footprint); this.alg = checkU8("alg", alg); this.digestid = checkU8("digestid", digestid); this.digest = digest; } /** * Creates a DS Record from the given data * @param digestid The digest id code. * @param key The key to digest */ public DSRecord(Name name, int dclass, long ttl, int digestid, DNSKEYRecord key) { this(name, dclass, ttl, key.getFootprint(), key.getAlgorithm(), digestid, DNSSEC.generateDSDigest(key, digestid)); } void rrFromWire(DNSInput in) throws IOException { footprint = in.readU16(); alg = in.readU8(); digestid = in.readU8(); digest = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { footprint = st.getUInt16(); alg = st.getUInt8(); digestid = st.getUInt8(); digest = st.getHex(); } /** * Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(footprint); sb.append(" "); sb.append(alg); sb.append(" "); sb.append(digestid); if (digest != null) { sb.append(" "); sb.append(base16.toString(digest)); } return sb.toString(); } /** * Returns the key's algorithm. */ public int getAlgorithm() { return alg; } /** * Returns the key's Digest ID. */ public int getDigestID() { return digestid; } /** * Returns the binary hash of the key. */ public byte [] getDigest() { return digest; } /** * Returns the key's footprint. */ public int getFootprint() { return footprint; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(footprint); out.writeU8(alg); out.writeU8(digestid); if (digest != null) out.writeByteArray(digest); } } dnsjava-2.1.5/org/xbill/DNS/EDNSOption.java100644 0 0 11122 11563063265 15432 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.Arrays; /** * DNS extension options, as described in RFC 2671. The rdata of an OPT record * is defined as a list of options; this represents a single option. * * @author Brian Wellington * @author Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks */ public abstract class EDNSOption { public static class Code { private Code() {} /** Name Server Identifier, RFC 5001 */ public final static int NSID = 3; /** Client Subnet, defined in draft-vandergaast-edns-client-subnet-00 */ public final static int CLIENT_SUBNET = 20730; private static Mnemonic codes = new Mnemonic("EDNS Option Codes", Mnemonic.CASE_UPPER); static { codes.setMaximum(0xFFFF); codes.setPrefix("CODE"); codes.setNumericAllowed(true); codes.add(NSID, "NSID"); codes.add(CLIENT_SUBNET, "CLIENT_SUBNET"); } /** * Converts an EDNS Option Code into its textual representation */ public static String string(int code) { return codes.getText(code); } /** * Converts a textual representation of an EDNS Option Code into its * numeric value. * @param s The textual representation of the option code * @return The option code, or -1 on error. */ public static int value(String s) { return codes.getValue(s); } } private final int code; /** * * Creates an option with the given option code and data. */ public EDNSOption(int code) { this.code = Record.checkU16("code", code); } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("{"); sb.append(EDNSOption.Code.string(code)); sb.append(": "); sb.append(optionToString()); sb.append("}"); return sb.toString(); } /** * Returns the EDNS Option's code. * * @return the option code */ public int getCode() { return code; } /** * Returns the EDNS Option's data, as a byte array. * * @return the option data */ byte [] getData() { DNSOutput out = new DNSOutput(); optionToWire(out); return out.toByteArray(); } /** * Converts the wire format of an EDNS Option (the option data only) into the * type-specific format. * @param in The input Stream. */ abstract void optionFromWire(DNSInput in) throws IOException; /** * Converts the wire format of an EDNS Option (including code and length) into * the type-specific format. * @param out The input stream. */ static EDNSOption fromWire(DNSInput in) throws IOException { int code, length; code = in.readU16(); length = in.readU16(); if (in.remaining() < length) throw new WireParseException("truncated option"); int save = in.saveActive(); in.setActive(length); EDNSOption option; switch (code) { case Code.NSID: option = new NSIDOption(); break; case Code.CLIENT_SUBNET: option = new ClientSubnetOption(); break; default: option = new GenericEDNSOption(code); break; } option.optionFromWire(in); in.restoreActive(save); return option; } /** * Converts the wire format of an EDNS Option (including code and length) into * the type-specific format. * @return The option, in wire format. */ public static EDNSOption fromWire(byte [] b) throws IOException { return fromWire(new DNSInput(b)); } /** * Converts an EDNS Option (the type-specific option data only) into wire format. * @param out The output stream. */ abstract void optionToWire(DNSOutput out); /** * Converts an EDNS Option (including code and length) into wire format. * @param out The output stream. */ void toWire(DNSOutput out) { out.writeU16(code); int lengthPosition = out.current(); out.writeU16(0); /* until we know better */ optionToWire(out); int length = out.current() - lengthPosition - 2; out.writeU16At(length, lengthPosition); } /** * Converts an EDNS Option (including code and length) into wire format. * @return The option, in wire format. */ public byte [] toWire() throws IOException { DNSOutput out = new DNSOutput(); toWire(out); return out.toByteArray(); } /** * Determines if two EDNS Options are identical. * @param arg The option to compare to * @return true if the options are equal, false otherwise. */ public boolean equals(Object arg) { if (arg == null || !(arg instanceof EDNSOption)) return false; EDNSOption opt = (EDNSOption) arg; if (code != opt.code) return false; return Arrays.equals(getData(), opt.getData()); } /** * Generates a hash code based on the EDNS Option's data. */ public int hashCode() { byte [] array = getData(); int hashval = 0; for (int i = 0; i < array.length; i++) hashval += ((hashval << 3) + (array[i] & 0xFF)); return hashval; } abstract String optionToString(); } dnsjava-2.1.5/org/xbill/DNS/EmptyRecord.java100644 0 0 1271 11254312416 15721 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * A class implementing Records with no data; that is, records used in * the question section of messages and meta-records in dynamic update. * * @author Brian Wellington */ class EmptyRecord extends Record { private static final long serialVersionUID = 3601852050646429582L; EmptyRecord() {} Record getObject() { return new EmptyRecord(); } void rrFromWire(DNSInput in) throws IOException { } void rdataFromString(Tokenizer st, Name origin) throws IOException { } String rrToString() { return ""; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { } } dnsjava-2.1.5/org/xbill/DNS/ExtendedFlags.java100644 0 0 1443 10010034437 16173 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to EDNS flags. * * @author Brian Wellington */ public final class ExtendedFlags { private static Mnemonic extflags = new Mnemonic("EDNS Flag", Mnemonic.CASE_LOWER); /** dnssec ok */ public static final int DO = 0x8000; static { extflags.setMaximum(0xFFFF); extflags.setPrefix("FLAG"); extflags.setNumericAllowed(true); extflags.add(DO, "do"); } private ExtendedFlags() {} /** Converts a numeric extended flag into a String */ public static String string(int i) { return extflags.getText(i); } /** * Converts a textual representation of an extended flag into its numeric * value */ public static int value(String s) { return extflags.getValue(s); } } dnsjava-2.1.5/org/xbill/DNS/ExtendedResolver.java100644 0 0 24226 11256272724 17004 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; import java.io.*; import java.net.*; /** * An implementation of Resolver that can send queries to multiple servers, * sending the queries multiple times if necessary. * @see Resolver * * @author Brian Wellington */ public class ExtendedResolver implements Resolver { private static class Resolution implements ResolverListener { Resolver [] resolvers; int [] sent; Object [] inprogress; int retries; int outstanding; boolean done; Message query; Message response; Throwable thrown; ResolverListener listener; public Resolution(ExtendedResolver eres, Message query) { List l = eres.resolvers; resolvers = (Resolver []) l.toArray (new Resolver[l.size()]); if (eres.loadBalance) { int nresolvers = resolvers.length; /* * Note: this is not synchronized, since the * worst thing that can happen is a random * ordering, which is ok. */ int start = eres.lbStart++ % nresolvers; if (eres.lbStart > nresolvers) eres.lbStart %= nresolvers; if (start > 0) { Resolver [] shuffle = new Resolver[nresolvers]; for (int i = 0; i < nresolvers; i++) { int pos = (i + start) % nresolvers; shuffle[i] = resolvers[pos]; } resolvers = shuffle; } } sent = new int[resolvers.length]; inprogress = new Object[resolvers.length]; retries = eres.retries; this.query = query; } /* Asynchronously sends a message. */ public void send(int n) { sent[n]++; outstanding++; try { inprogress[n] = resolvers[n].sendAsync(query, this); } catch (Throwable t) { synchronized (this) { thrown = t; done = true; if (listener == null) { notifyAll(); return; } } } } /* Start a synchronous resolution */ public Message start() throws IOException { try { /* * First, try sending synchronously. If this works, * we're done. Otherwise, we'll get an exception * and continue. It would be easier to call send(0), * but this avoids a thread creation. If and when * SimpleResolver.sendAsync() can be made to not * create a thread, this could be changed. */ sent[0]++; outstanding++; inprogress[0] = new Object(); return resolvers[0].send(query); } catch (Exception e) { /* * This will either cause more queries to be sent * asynchronously or will set the 'done' flag. */ handleException(inprogress[0], e); } /* * Wait for a successful response or for each * subresolver to fail. */ synchronized (this) { while (!done) { try { wait(); } catch (InterruptedException e) { } } } /* Return the response or throw an exception */ if (response != null) return response; else if (thrown instanceof IOException) throw (IOException) thrown; else if (thrown instanceof RuntimeException) throw (RuntimeException) thrown; else if (thrown instanceof Error) throw (Error) thrown; else throw new IllegalStateException ("ExtendedResolver failure"); } /* Start an asynchronous resolution */ public void startAsync(ResolverListener listener) { this.listener = listener; send(0); } /* * Receive a response. If the resolution hasn't been completed, * either wake up the blocking thread or call the callback. */ public void receiveMessage(Object id, Message m) { if (Options.check("verbose")) System.err.println("ExtendedResolver: " + "received message"); synchronized (this) { if (done) return; response = m; done = true; if (listener == null) { notifyAll(); return; } } listener.receiveMessage(this, response); } /* * Receive an exception. If the resolution has been completed, * do nothing. Otherwise make progress. */ public void handleException(Object id, Exception e) { if (Options.check("verbose")) System.err.println("ExtendedResolver: got " + e); synchronized (this) { outstanding--; if (done) return; int n; for (n = 0; n < inprogress.length; n++) if (inprogress[n] == id) break; /* If we don't know what this is, do nothing. */ if (n == inprogress.length) return; boolean startnext = false; /* * If this is the first response from server n, * we should start sending queries to server n + 1. */ if (sent[n] == 1 && n < resolvers.length - 1) startnext = true; if (e instanceof InterruptedIOException) { /* Got a timeout; resend */ if (sent[n] < retries) send(n); if (thrown == null) thrown = e; } else if (e instanceof SocketException) { /* * Problem with the socket; don't resend * on it */ if (thrown == null || thrown instanceof InterruptedIOException) thrown = e; } else { /* * Problem with the response; don't resend * on the same socket. */ thrown = e; } if (done) return; if (startnext) send(n + 1); if (done) return; if (outstanding == 0) { /* * If we're done and this is synchronous, * wake up the blocking thread. */ done = true; if (listener == null) { notifyAll(); return; } } if (!done) return; } /* If we're done and this is asynchronous, call the callback. */ if (!(thrown instanceof Exception)) thrown = new RuntimeException(thrown.getMessage()); listener.handleException(this, (Exception) thrown); } } private static final int quantum = 5; private List resolvers; private boolean loadBalance = false; private int lbStart = 0; private int retries = 3; private void init() { resolvers = new ArrayList(); } /** * Creates a new Extended Resolver. The default ResolverConfig is used to * determine the servers for which SimpleResolver contexts should be * initialized. * @see SimpleResolver * @see ResolverConfig * @exception UnknownHostException Failure occured initializing SimpleResolvers */ public ExtendedResolver() throws UnknownHostException { init(); String [] servers = ResolverConfig.getCurrentConfig().servers(); if (servers != null) { for (int i = 0; i < servers.length; i++) { Resolver r = new SimpleResolver(servers[i]); r.setTimeout(quantum); resolvers.add(r); } } else resolvers.add(new SimpleResolver()); } /** * Creates a new Extended Resolver * @param servers An array of server names for which SimpleResolver * contexts should be initialized. * @see SimpleResolver * @exception UnknownHostException Failure occured initializing SimpleResolvers */ public ExtendedResolver(String [] servers) throws UnknownHostException { init(); for (int i = 0; i < servers.length; i++) { Resolver r = new SimpleResolver(servers[i]); r.setTimeout(quantum); resolvers.add(r); } } /** * Creates a new Extended Resolver * @param res An array of pre-initialized Resolvers is provided. * @see SimpleResolver * @exception UnknownHostException Failure occured initializing SimpleResolvers */ public ExtendedResolver(Resolver [] res) throws UnknownHostException { init(); for (int i = 0; i < res.length; i++) resolvers.add(res[i]); } public void setPort(int port) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setPort(port); } public void setTCP(boolean flag) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setTCP(flag); } public void setIgnoreTruncation(boolean flag) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setIgnoreTruncation(flag); } public void setEDNS(int level) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setEDNS(level); } public void setEDNS(int level, int payloadSize, int flags, List options) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setEDNS(level, payloadSize, flags, options); } public void setTSIGKey(TSIG key) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setTSIGKey(key); } public void setTimeout(int secs, int msecs) { for (int i = 0; i < resolvers.size(); i++) ((Resolver)resolvers.get(i)).setTimeout(secs, msecs); } public void setTimeout(int secs) { setTimeout(secs, 0); } /** * Sends a message and waits for a response. Multiple servers are queried, * and queries are sent multiple times until either a successful response * is received, or it is clear that there is no successful response. * @param query The query to send. * @return The response. * @throws IOException An error occurred while sending or receiving. */ public Message send(Message query) throws IOException { Resolution res = new Resolution(this, query); return res.start(); } /** * Asynchronously sends a message to multiple servers, potentially multiple * times, registering a listener to receive a callback on success or exception. * Multiple asynchronous lookups can be performed in parallel. Since the * callback may be invoked before the function returns, external * synchronization is necessary. * @param query The query to send * @param listener The object containing the callbacks. * @return An identifier, which is also a parameter in the callback */ public Object sendAsync(final Message query, final ResolverListener listener) { Resolution res = new Resolution(this, query); res.startAsync(listener); return res; } /** Returns the nth resolver used by this ExtendedResolver */ public Resolver getResolver(int n) { if (n < resolvers.size()) return (Resolver)resolvers.get(n); return null; } /** Returns all resolvers used by this ExtendedResolver */ public Resolver [] getResolvers() { return (Resolver []) resolvers.toArray(new Resolver[resolvers.size()]); } /** Adds a new resolver to be used by this ExtendedResolver */ public void addResolver(Resolver r) { resolvers.add(r); } /** Deletes a resolver used by this ExtendedResolver */ public void deleteResolver(Resolver r) { resolvers.remove(r); } /** Sets whether the servers should be load balanced. * @param flag If true, servers will be tried in round-robin order. If false, * servers will always be queried in the same order. */ public void setLoadBalance(boolean flag) { loadBalance = flag; } /** Sets the number of retries sent to each server per query */ public void setRetries(int retries) { this.retries = retries; } } dnsjava-2.1.5/org/xbill/DNS/Flags.java100644 0 0 3112 10231125627 14514 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to flags in the DNS header. * * @author Brian Wellington */ public final class Flags { private static Mnemonic flags = new Mnemonic("DNS Header Flag", Mnemonic.CASE_LOWER); /** query/response */ public static final byte QR = 0; /** authoritative answer */ public static final byte AA = 5; /** truncated */ public static final byte TC = 6; /** recursion desired */ public static final byte RD = 7; /** recursion available */ public static final byte RA = 8; /** authenticated data */ public static final byte AD = 10; /** (security) checking disabled */ public static final byte CD = 11; /** dnssec ok (extended) */ public static final int DO = ExtendedFlags.DO; static { flags.setMaximum(0xF); flags.setPrefix("FLAG"); flags.setNumericAllowed(true); flags.add(QR, "qr"); flags.add(AA, "aa"); flags.add(TC, "tc"); flags.add(RD, "rd"); flags.add(RA, "ra"); flags.add(AD, "ad"); flags.add(CD, "cd"); } private Flags() {} /** Converts a numeric Flag into a String */ public static String string(int i) { return flags.getText(i); } /** Converts a String representation of an Flag into its numeric value */ public static int value(String s) { return flags.getValue(s); } /** * Indicates if a bit in the flags field is a flag or not. If it's part of * the rcode or opcode, it's not. */ public static boolean isFlag(int index) { flags.check(index); if ((index >= 1 && index <= 4) || (index >= 12)) return false; return true; } } dnsjava-2.1.5/org/xbill/DNS/FormattedTime.java100644 0 0 3752 11261174717 16246 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Routines for converting time values to and from YYYYMMDDHHMMSS format. * * @author Brian Wellington */ import java.util.*; import java.text.*; final class FormattedTime { private static NumberFormat w2, w4; static { w2 = new DecimalFormat(); w2.setMinimumIntegerDigits(2); w4 = new DecimalFormat(); w4.setMinimumIntegerDigits(4); w4.setGroupingUsed(false); } private FormattedTime() {} /** * Converts a Date into a formatted string. * @param date The Date to convert. * @return The formatted string. */ public static String format(Date date) { Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC")); StringBuffer sb = new StringBuffer(); c.setTime(date); sb.append(w4.format(c.get(Calendar.YEAR))); sb.append(w2.format(c.get(Calendar.MONTH)+1)); sb.append(w2.format(c.get(Calendar.DAY_OF_MONTH))); sb.append(w2.format(c.get(Calendar.HOUR_OF_DAY))); sb.append(w2.format(c.get(Calendar.MINUTE))); sb.append(w2.format(c.get(Calendar.SECOND))); return sb.toString(); } /** * Parses a formatted time string into a Date. * @param s The string, in the form YYYYMMDDHHMMSS. * @return The Date object. * @throws TextParseExcetption The string was invalid. */ public static Date parse(String s) throws TextParseException { if (s.length() != 14) { throw new TextParseException("Invalid time encoding: " + s); } Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC")); c.clear(); try { int year = Integer.parseInt(s.substring(0, 4)); int month = Integer.parseInt(s.substring(4, 6)) - 1; int date = Integer.parseInt(s.substring(6, 8)); int hour = Integer.parseInt(s.substring(8, 10)); int minute = Integer.parseInt(s.substring(10, 12)); int second = Integer.parseInt(s.substring(12, 14)); c.set(year, month, date, hour, minute, second); } catch (NumberFormatException e) { throw new TextParseException("Invalid time encoding: " + s); } return c.getTime(); } } dnsjava-2.1.5/org/xbill/DNS/GPOSRecord.java100644 0 0 10573 11254312416 15420 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Geographical Location - describes the physical location of a host. * * @author Brian Wellington */ public class GPOSRecord extends Record { private static final long serialVersionUID = -6349714958085750705L; private byte [] latitude, longitude, altitude; GPOSRecord() {} Record getObject() { return new GPOSRecord(); } private void validate(double longitude, double latitude) throws IllegalArgumentException { if (longitude < -90.0 || longitude > 90.0) { throw new IllegalArgumentException("illegal longitude " + longitude); } if (latitude < -180.0 || latitude > 180.0) { throw new IllegalArgumentException("illegal latitude " + latitude); } } /** * Creates an GPOS Record from the given data * @param longitude The longitude component of the location. * @param latitude The latitude component of the location. * @param altitude The altitude component of the location (in meters above sea * level). */ public GPOSRecord(Name name, int dclass, long ttl, double longitude, double latitude, double altitude) { super(name, Type.GPOS, dclass, ttl); validate(longitude, latitude); this.longitude = Double.toString(longitude).getBytes(); this.latitude = Double.toString(latitude).getBytes(); this.altitude = Double.toString(altitude).getBytes(); } /** * Creates an GPOS Record from the given data * @param longitude The longitude component of the location. * @param latitude The latitude component of the location. * @param altitude The altitude component of the location (in meters above sea * level). */ public GPOSRecord(Name name, int dclass, long ttl, String longitude, String latitude, String altitude) { super(name, Type.GPOS, dclass, ttl); try { this.longitude = byteArrayFromString(longitude); this.latitude = byteArrayFromString(latitude); validate(getLongitude(), getLatitude()); this.altitude = byteArrayFromString(altitude); } catch (TextParseException e) { throw new IllegalArgumentException(e.getMessage()); } } void rrFromWire(DNSInput in) throws IOException { longitude = in.readCountedString(); latitude = in.readCountedString(); altitude = in.readCountedString(); try { validate(getLongitude(), getLatitude()); } catch(IllegalArgumentException e) { throw new WireParseException(e.getMessage()); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { try { longitude = byteArrayFromString(st.getString()); latitude = byteArrayFromString(st.getString()); altitude = byteArrayFromString(st.getString()); } catch (TextParseException e) { throw st.exception(e.getMessage()); } try { validate(getLongitude(), getLatitude()); } catch(IllegalArgumentException e) { throw new WireParseException(e.getMessage()); } } /** Convert to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(byteArrayToString(longitude, true)); sb.append(" "); sb.append(byteArrayToString(latitude, true)); sb.append(" "); sb.append(byteArrayToString(altitude, true)); return sb.toString(); } /** Returns the longitude as a string */ public String getLongitudeString() { return byteArrayToString(longitude, false); } /** * Returns the longitude as a double * @throws NumberFormatException The string does not contain a valid numeric * value. */ public double getLongitude() { return Double.parseDouble(getLongitudeString()); } /** Returns the latitude as a string */ public String getLatitudeString() { return byteArrayToString(latitude, false); } /** * Returns the latitude as a double * @throws NumberFormatException The string does not contain a valid numeric * value. */ public double getLatitude() { return Double.parseDouble(getLatitudeString()); } /** Returns the altitude as a string */ public String getAltitudeString() { return byteArrayToString(altitude, false); } /** * Returns the altitude as a double * @throws NumberFormatException The string does not contain a valid numeric * value. */ public double getAltitude() { return Double.parseDouble(getAltitudeString()); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeCountedString(longitude); out.writeCountedString(latitude); out.writeCountedString(altitude); } } dnsjava-2.1.5/org/xbill/DNS/Generator.java100644 0 0 15440 10212750362 15434 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A representation of a $GENERATE statement in a master file. * * @author Brian Wellington */ public class Generator { /** The start of the range. */ public long start; /** The end of the range. */ public long end; /** The step value of the range. */ public long step; /** The pattern to use for generating record names. */ public final String namePattern; /** The type of the generated records. */ public final int type; /** The class of the generated records. */ public final int dclass; /** The ttl of the generated records. */ public final long ttl; /** The pattern to use for generating record data. */ public final String rdataPattern; /** The origin to append to relative names. */ public final Name origin; private long current; /** * Indicates whether generation is supported for this type. * @throws InvalidTypeException The type is out of range. */ public static boolean supportedType(int type) { Type.check(type); return (type == Type.PTR || type == Type.CNAME || type == Type.DNAME || type == Type.A || type == Type.AAAA || type == Type.NS); } /** * Creates a specification for generating records, as a $GENERATE * statement in a master file. * @param start The start of the range. * @param end The end of the range. * @param step The step value of the range. * @param namePattern The pattern to use for generating record names. * @param type The type of the generated records. The supported types are * PTR, CNAME, DNAME, A, AAAA, and NS. * @param dclass The class of the generated records. * @param ttl The ttl of the generated records. * @param rdataPattern The pattern to use for generating record data. * @param origin The origin to append to relative names. * @throws IllegalArgumentException The range is invalid. * @throws IllegalArgumentException The type does not support generation. * @throws IllegalArgumentException The dclass is not a valid class. */ public Generator(long start, long end, long step, String namePattern, int type, int dclass, long ttl, String rdataPattern, Name origin) { if (start < 0 || end < 0 || start > end || step <= 0) throw new IllegalArgumentException ("invalid range specification"); if (!supportedType(type)) throw new IllegalArgumentException("unsupported type"); DClass.check(dclass); this.start = start; this.end = end; this.step = step; this.namePattern = namePattern; this.type = type; this.dclass = dclass; this.ttl = ttl; this.rdataPattern = rdataPattern; this.origin = origin; this.current = start; } private String substitute(String spec, long n) throws IOException { boolean escaped = false; byte [] str = spec.getBytes(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length; i++) { char c = (char)(str[i] & 0xFF); if (escaped) { sb.append(c); escaped = false; } else if (c == '\\') { if (i + 1 == str.length) throw new TextParseException ("invalid escape character"); escaped = true; } else if (c == '$') { boolean negative = false; long offset = 0; long width = 0; long base = 10; boolean wantUpperCase = false; if (i + 1 < str.length && str[i + 1] == '$') { // '$$' == literal '$' for backwards // compatibility with old versions of BIND. c = (char)(str[++i] & 0xFF); sb.append(c); continue; } else if (i + 1 < str.length && str[i + 1] == '{') { // It's a substitution with modifiers. i++; if (i + 1 < str.length && str[i + 1] == '-') { negative = true; i++; } while (i + 1 < str.length) { c = (char)(str[++i] & 0xFF); if (c == ',' || c == '}') break; if (c < '0' || c > '9') throw new TextParseException( "invalid offset"); c -= '0'; offset *= 10; offset += c; } if (negative) offset = -offset; if (c == ',') { while (i + 1 < str.length) { c = (char)(str[++i] & 0xFF); if (c == ',' || c == '}') break; if (c < '0' || c > '9') throw new TextParseException( "invalid width"); c -= '0'; width *= 10; width += c; } } if (c == ',') { if (i + 1 == str.length) throw new TextParseException( "invalid base"); c = (char)(str[++i] & 0xFF); if (c == 'o') base = 8; else if (c == 'x') base = 16; else if (c == 'X') { base = 16; wantUpperCase = true; } else if (c != 'd') throw new TextParseException( "invalid base"); } if (i + 1 == str.length || str[i + 1] != '}') throw new TextParseException ("invalid modifiers"); i++; } long v = n + offset; if (v < 0) throw new TextParseException ("invalid offset expansion"); String number; if (base == 8) number = Long.toOctalString(v); else if (base == 16) number = Long.toHexString(v); else number = Long.toString(v); if (wantUpperCase) number = number.toUpperCase(); if (width != 0 && width > number.length()) { int zeros = (int)width - number.length(); while (zeros-- > 0) sb.append('0'); } sb.append(number); } else { sb.append(c); } } return sb.toString(); } /** * Constructs and returns the next record in the expansion. * @throws IOException The name or rdata was invalid after substitutions were * performed. */ public Record nextRecord() throws IOException { if (current > end) return null; String namestr = substitute(namePattern, current); Name name = Name.fromString(namestr, origin); String rdata = substitute(rdataPattern, current); current += step; return Record.fromString(name, type, dclass, ttl, rdata, origin); } /** * Constructs and returns all records in the expansion. * @throws IOException The name or rdata of a record was invalid after * substitutions were performed. */ public Record [] expand() throws IOException { List list = new ArrayList(); for (long i = start; i < end; i += step) { String namestr = substitute(namePattern, current); Name name = Name.fromString(namestr, origin); String rdata = substitute(rdataPattern, current); list.add(Record.fromString(name, type, dclass, ttl, rdata, origin)); } return (Record []) list.toArray(new Record[list.size()]); } /** * Converts the generate specification to a string containing the corresponding * $GENERATE statement. */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("$GENERATE "); sb.append(start + "-" + end); if (step > 1) sb.append("/" + step); sb.append(" "); sb.append(namePattern + " "); sb.append(ttl + " "); if (dclass != DClass.IN || !Options.check("noPrintIN")) sb.append(DClass.string(dclass) + " "); sb.append(Type.string(type) + " "); sb.append(rdataPattern + " "); return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/GenericEDNSOption.java100644 0 0 1553 11562373127 16716 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.base16; /** * An EDNSOption with no internal structure. * * @author Ming Zhou <mizhou@bnivideo.com>, Beaumaris Networks * @author Brian Wellington */ public class GenericEDNSOption extends EDNSOption { private byte [] data; GenericEDNSOption(int code) { super(code); } /** * Construct a generic EDNS option. * @param data The contents of the option. */ public GenericEDNSOption(int code, byte [] data) { super(code); this.data = Record.checkByteArrayLength("option data", data, 0xFFFF); } void optionFromWire(DNSInput in) throws IOException { data = in.readByteArray(); } void optionToWire(DNSOutput out) { out.writeByteArray(data); } String optionToString() { return "<" + base16.toString(data) + ">"; } } dnsjava-2.1.5/org/xbill/DNS/HINFORecord.java100644 0 0 3457 11254312416 15476 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Host Information - describes the CPU and OS of a host * * @author Brian Wellington */ public class HINFORecord extends Record { private static final long serialVersionUID = -4732870630947452112L; private byte [] cpu, os; HINFORecord() {} Record getObject() { return new HINFORecord(); } /** * Creates an HINFO Record from the given data * @param cpu A string describing the host's CPU * @param os A string describing the host's OS * @throws IllegalArgumentException One of the strings has invalid escapes */ public HINFORecord(Name name, int dclass, long ttl, String cpu, String os) { super(name, Type.HINFO, dclass, ttl); try { this.cpu = byteArrayFromString(cpu); this.os = byteArrayFromString(os); } catch (TextParseException e) { throw new IllegalArgumentException(e.getMessage()); } } void rrFromWire(DNSInput in) throws IOException { cpu = in.readCountedString(); os = in.readCountedString(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { try { cpu = byteArrayFromString(st.getString()); os = byteArrayFromString(st.getString()); } catch (TextParseException e) { throw st.exception(e.getMessage()); } } /** * Returns the host's CPU */ public String getCPU() { return byteArrayToString(cpu, false); } /** * Returns the host's OS */ public String getOS() { return byteArrayToString(os, false); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeCountedString(cpu); out.writeCountedString(os); } /** * Converts to a string */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(byteArrayToString(cpu, true)); sb.append(" "); sb.append(byteArrayToString(os, true)); return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/Header.java100644 0 0 11754 11256272724 14714 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A DNS message header * @see Message * * @author Brian Wellington */ public class Header implements Cloneable { private int id; private int flags; private int [] counts; private static Random random = new Random(); /** The length of a DNS Header in wire format. */ public static final int LENGTH = 12; private void init() { counts = new int[4]; flags = 0; id = -1; } /** * Create a new empty header. * @param id The message id */ public Header(int id) { init(); setID(id); } /** * Create a new empty header with a random message id */ public Header() { init(); } /** * Parses a Header from a stream containing DNS wire format. */ Header(DNSInput in) throws IOException { this(in.readU16()); flags = in.readU16(); for (int i = 0; i < counts.length; i++) counts[i] = in.readU16(); } /** * Creates a new Header from its DNS wire format representation * @param b A byte array containing the DNS Header. */ public Header(byte [] b) throws IOException { this(new DNSInput(b)); } void toWire(DNSOutput out) { out.writeU16(getID()); out.writeU16(flags); for (int i = 0; i < counts.length; i++) out.writeU16(counts[i]); } public byte [] toWire() { DNSOutput out = new DNSOutput(); toWire(out); return out.toByteArray(); } static private boolean validFlag(int bit) { return (bit >= 0 && bit <= 0xF && Flags.isFlag(bit)); } static private void checkFlag(int bit) { if (!validFlag(bit)) throw new IllegalArgumentException("invalid flag bit " + bit); } /** * Sets a flag to the supplied value * @see Flags */ public void setFlag(int bit) { checkFlag(bit); // bits are indexed from left to right flags |= (1 << (15 - bit)); } /** * Sets a flag to the supplied value * @see Flags */ public void unsetFlag(int bit) { checkFlag(bit); // bits are indexed from left to right flags &= ~(1 << (15 - bit)); } /** * Retrieves a flag * @see Flags */ public boolean getFlag(int bit) { checkFlag(bit); // bits are indexed from left to right return (flags & (1 << (15 - bit))) != 0; } boolean [] getFlags() { boolean [] array = new boolean[16]; for (int i = 0; i < array.length; i++) if (validFlag(i)) array[i] = getFlag(i); return array; } /** * Retrieves the message ID */ public int getID() { if (id >= 0) return id; synchronized (this) { if (id < 0) id = random.nextInt(0xffff); return id; } } /** * Sets the message ID */ public void setID(int id) { if (id < 0 || id > 0xffff) throw new IllegalArgumentException("DNS message ID " + id + " is out of range"); this.id = id; } /** * Sets the message's rcode * @see Rcode */ public void setRcode(int value) { if (value < 0 || value > 0xF) throw new IllegalArgumentException("DNS Rcode " + value + " is out of range"); flags &= ~0xF; flags |= value; } /** * Retrieves the mesasge's rcode * @see Rcode */ public int getRcode() { return flags & 0xF; } /** * Sets the message's opcode * @see Opcode */ public void setOpcode(int value) { if (value < 0 || value > 0xF) throw new IllegalArgumentException("DNS Opcode " + value + "is out of range"); flags &= 0x87FF; flags |= (value << 11); } /** * Retrieves the mesasge's opcode * @see Opcode */ public int getOpcode() { return (flags >> 11) & 0xF; } void setCount(int field, int value) { if (value < 0 || value > 0xFFFF) throw new IllegalArgumentException("DNS section count " + value + " is out of range"); counts[field] = value; } void incCount(int field) { if (counts[field] == 0xFFFF) throw new IllegalStateException("DNS section count cannot " + "be incremented"); counts[field]++; } void decCount(int field) { if (counts[field] == 0) throw new IllegalStateException("DNS section count cannot " + "be decremented"); counts[field]--; } /** * Retrieves the record count for the given section * @see Section */ public int getCount(int field) { return counts[field]; } /** Converts the header's flags into a String */ public String printFlags() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 16; i++) if (validFlag(i) && getFlag(i)) { sb.append(Flags.string(i)); sb.append(" "); } return sb.toString(); } String toStringWithRcode(int newrcode) { StringBuffer sb = new StringBuffer(); sb.append(";; ->>HEADER<<- "); sb.append("opcode: " + Opcode.string(getOpcode())); sb.append(", status: " + Rcode.string(newrcode)); sb.append(", id: " + getID()); sb.append("\n"); sb.append(";; flags: " + printFlags()); sb.append("; "); for (int i = 0; i < 4; i++) sb.append(Section.string(i) + ": " + getCount(i) + " "); return sb.toString(); } /** Converts the header into a String */ public String toString() { return toStringWithRcode(getRcode()); } /* Creates a new Header identical to the current one */ public Object clone() { Header h = new Header(); h.id = id; h.flags = flags; System.arraycopy(counts, 0, h.counts, 0, counts.length); return h; } } dnsjava-2.1.5/org/xbill/DNS/IPSECKEYRecord.java100644 0 0 11737 11254312416 16067 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; import org.xbill.DNS.utils.*; /** * IPsec Keying Material (RFC 4025) * * @author Brian Wellington */ public class IPSECKEYRecord extends Record { private static final long serialVersionUID = 3050449702765909687L; public static class Algorithm { private Algorithm() {} public static final int DSA = 1; public static final int RSA = 2; } public static class Gateway { private Gateway() {} public static final int None = 0; public static final int IPv4 = 1; public static final int IPv6 = 2; public static final int Name = 3; } private int precedence; private int gatewayType; private int algorithmType; private Object gateway; private byte [] key; IPSECKEYRecord() {} Record getObject() { return new IPSECKEYRecord(); } /** * Creates an IPSECKEY Record from the given data. * @param precedence The record's precedence. * @param gatewayType The record's gateway type. * @param algorithmType The record's algorithm type. * @param gateway The record's gateway. * @param key The record's public key. */ public IPSECKEYRecord(Name name, int dclass, long ttl, int precedence, int gatewayType, int algorithmType, Object gateway, byte [] key) { super(name, Type.IPSECKEY, dclass, ttl); this.precedence = checkU8("precedence", precedence); this.gatewayType = checkU8("gatewayType", gatewayType); this.algorithmType = checkU8("algorithmType", algorithmType); switch (gatewayType) { case Gateway.None: this.gateway = null; break; case Gateway.IPv4: if (!(gateway instanceof InetAddress)) throw new IllegalArgumentException("\"gateway\" " + "must be an IPv4 " + "address"); this.gateway = gateway; break; case Gateway.IPv6: if (!(gateway instanceof Inet6Address)) throw new IllegalArgumentException("\"gateway\" " + "must be an IPv6 " + "address"); this.gateway = gateway; break; case Gateway.Name: if (!(gateway instanceof Name)) throw new IllegalArgumentException("\"gateway\" " + "must be a DNS " + "name"); this.gateway = checkName("gateway", (Name) gateway); break; default: throw new IllegalArgumentException("\"gatewayType\" " + "must be between 0 and 3"); } this.key = key; } void rrFromWire(DNSInput in) throws IOException { precedence = in.readU8(); gatewayType = in.readU8(); algorithmType = in.readU8(); switch (gatewayType) { case Gateway.None: gateway = null; break; case Gateway.IPv4: gateway = InetAddress.getByAddress(in.readByteArray(4)); break; case Gateway.IPv6: gateway = InetAddress.getByAddress(in.readByteArray(16)); break; case Gateway.Name: gateway = new Name(in); break; default: throw new WireParseException("invalid gateway type"); } if (in.remaining() > 0) key = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { precedence = st.getUInt8(); gatewayType = st.getUInt8(); algorithmType = st.getUInt8(); switch (gatewayType) { case Gateway.None: String s = st.getString(); if (!s.equals(".")) throw new TextParseException("invalid gateway format"); gateway = null; break; case Gateway.IPv4: gateway = st.getAddress(Address.IPv4); break; case Gateway.IPv6: gateway = st.getAddress(Address.IPv6); break; case Gateway.Name: gateway = st.getName(origin); break; default: throw new WireParseException("invalid gateway type"); } key = st.getBase64(false); } String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(precedence); sb.append(" "); sb.append(gatewayType); sb.append(" "); sb.append(algorithmType); sb.append(" "); switch (gatewayType) { case Gateway.None: sb.append("."); break; case Gateway.IPv4: case Gateway.IPv6: InetAddress gatewayAddr = (InetAddress) gateway; sb.append(gatewayAddr.getHostAddress()); break; case Gateway.Name: sb.append(gateway); break; } if (key != null) { sb.append(" "); sb.append(base64.toString(key)); } return sb.toString(); } /** Returns the record's precedence. */ public int getPrecedence() { return precedence; } /** Returns the record's gateway type. */ public int getGatewayType() { return gatewayType; } /** Returns the record's algorithm type. */ public int getAlgorithmType() { return algorithmType; } /** Returns the record's gateway. */ public Object getGateway() { return gateway; } /** Returns the record's public key */ public byte [] getKey() { return key; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(precedence); out.writeU8(gatewayType); out.writeU8(algorithmType); switch (gatewayType) { case Gateway.None: break; case Gateway.IPv4: case Gateway.IPv6: InetAddress gatewayAddr = (InetAddress) gateway; out.writeByteArray(gatewayAddr.getAddress()); break; case Gateway.Name: Name gatewayName = (Name) gateway; gatewayName.toWire(out, null, canonical); break; } if (key != null) out.writeByteArray(key); } } dnsjava-2.1.5/org/xbill/DNS/ISDNRecord.java100644 0 0 4304 11254312416 15360 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * ISDN - identifies the ISDN number and subaddress associated with a name. * * @author Brian Wellington */ public class ISDNRecord extends Record { private static final long serialVersionUID = -8730801385178968798L; private byte [] address; private byte [] subAddress; ISDNRecord() {} Record getObject() { return new ISDNRecord(); } /** * Creates an ISDN Record from the given data * @param address The ISDN number associated with the domain. * @param subAddress The subaddress, if any. * @throws IllegalArgumentException One of the strings is invalid. */ public ISDNRecord(Name name, int dclass, long ttl, String address, String subAddress) { super(name, Type.ISDN, dclass, ttl); try { this.address = byteArrayFromString(address); if (subAddress != null) this.subAddress = byteArrayFromString(subAddress); } catch (TextParseException e) { throw new IllegalArgumentException(e.getMessage()); } } void rrFromWire(DNSInput in) throws IOException { address = in.readCountedString(); if (in.remaining() > 0) subAddress = in.readCountedString(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { try { address = byteArrayFromString(st.getString()); Tokenizer.Token t = st.get(); if (t.isString()) { subAddress = byteArrayFromString(t.value); } else { st.unget(); } } catch (TextParseException e) { throw st.exception(e.getMessage()); } } /** * Returns the ISDN number associated with the domain. */ public String getAddress() { return byteArrayToString(address, false); } /** * Returns the ISDN subaddress, or null if there is none. */ public String getSubAddress() { if (subAddress == null) return null; return byteArrayToString(subAddress, false); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeCountedString(address); if (subAddress != null) out.writeCountedString(subAddress); } String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(byteArrayToString(address, true)); if (subAddress != null) { sb.append(" "); sb.append(byteArrayToString(subAddress, true)); } return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/InvalidDClassException.java100644 0 0 544 10231125627 20005 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when an invalid dclass code is specified. * * @author Brian Wellington */ public class InvalidDClassException extends IllegalArgumentException { public InvalidDClassException(int dclass) { super("Invalid DNS class: " + dclass); } } dnsjava-2.1.5/org/xbill/DNS/InvalidTTLException.java100644 0 0 517 7775216774 17306 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when an invalid TTL is specified. * * @author Brian Wellington */ public class InvalidTTLException extends IllegalArgumentException { public InvalidTTLException(long ttl) { super("Invalid DNS TTL: " + ttl); } } dnsjava-2.1.5/org/xbill/DNS/InvalidTypeException.java100644 0 0 531 10231125627 17551 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when an invalid type code is specified. * * @author Brian Wellington */ public class InvalidTypeException extends IllegalArgumentException { public InvalidTypeException(int type) { super("Invalid DNS type: " + type); } } dnsjava-2.1.5/org/xbill/DNS/KEYBase.java100644 0 0 6007 11367375723 14730 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.security.PublicKey; import org.xbill.DNS.utils.*; /** * The base class for KEY/DNSKEY records, which have identical formats * * @author Brian Wellington */ abstract class KEYBase extends Record { private static final long serialVersionUID = 3469321722693285454L; protected int flags, proto, alg; protected byte [] key; protected int footprint = -1; protected PublicKey publicKey = null; protected KEYBase() {} public KEYBase(Name name, int type, int dclass, long ttl, int flags, int proto, int alg, byte [] key) { super(name, type, dclass, ttl); this.flags = checkU16("flags", flags); this.proto = checkU8("proto", proto); this.alg = checkU8("alg", alg); this.key = key; } void rrFromWire(DNSInput in) throws IOException { flags = in.readU16(); proto = in.readU8(); alg = in.readU8(); if (in.remaining() > 0) key = in.readByteArray(); } /** Converts the DNSKEY/KEY Record to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(flags); sb.append(" "); sb.append(proto); sb.append(" "); sb.append(alg); if (key != null) { if (Options.check("multiline")) { sb.append(" (\n"); sb.append(base64.formatString(key, 64, "\t", true)); sb.append(" ; key_tag = "); sb.append(getFootprint()); } else { sb.append(" "); sb.append(base64.toString(key)); } } return sb.toString(); } /** * Returns the flags describing the key's properties */ public int getFlags() { return flags; } /** * Returns the protocol that the key was created for */ public int getProtocol() { return proto; } /** * Returns the key's algorithm */ public int getAlgorithm() { return alg; } /** * Returns the binary data representing the key */ public byte [] getKey() { return key; } /** * Returns the key's footprint (after computing it) */ public int getFootprint() { if (footprint >= 0) return footprint; int foot = 0; DNSOutput out = new DNSOutput(); rrToWire(out, null, false); byte [] rdata = out.toByteArray(); if (alg == DNSSEC.Algorithm.RSAMD5) { int d1 = rdata[rdata.length - 3] & 0xFF; int d2 = rdata[rdata.length - 2] & 0xFF; foot = (d1 << 8) + d2; } else { int i; for (i = 0; i < rdata.length - 1; i += 2) { int d1 = rdata[i] & 0xFF; int d2 = rdata[i + 1] & 0xFF; foot += ((d1 << 8) + d2); } if (i < rdata.length) { int d1 = rdata[i] & 0xFF; foot += (d1 << 8); } foot += ((foot >> 16) & 0xFFFF); } footprint = (foot & 0xFFFF); return footprint; } /** * Returns a PublicKey corresponding to the data in this key. * @throws DNSSEC.DNSSECException The key could not be converted. */ public PublicKey getPublicKey() throws DNSSEC.DNSSECException { if (publicKey != null) return publicKey; publicKey = DNSSEC.toPublicKey(this); return publicKey; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(flags); out.writeU8(proto); out.writeU8(alg); if (key != null) out.writeByteArray(key); } } dnsjava-2.1.5/org/xbill/DNS/KEYRecord.java100644 0 0 20670 11367375723 15316 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.security.PublicKey; import java.util.*; /** * Key - contains a cryptographic public key. The data can be converted * to objects implementing java.security.interfaces.PublicKey * @see DNSSEC * * @author Brian Wellington */ public class KEYRecord extends KEYBase { private static final long serialVersionUID = 6385613447571488906L; public static class Protocol { /** * KEY protocol identifiers. */ private Protocol() {} /** No defined protocol. */ public static final int NONE = 0; /** Transaction Level Security */ public static final int TLS = 1; /** Email */ public static final int EMAIL = 2; /** DNSSEC */ public static final int DNSSEC = 3; /** IPSEC Control */ public static final int IPSEC = 4; /** Any protocol */ public static final int ANY = 255; private static Mnemonic protocols = new Mnemonic("KEY protocol", Mnemonic.CASE_UPPER); static { protocols.setMaximum(0xFF); protocols.setNumericAllowed(true); protocols.add(NONE, "NONE"); protocols.add(TLS, "TLS"); protocols.add(EMAIL, "EMAIL"); protocols.add(DNSSEC, "DNSSEC"); protocols.add(IPSEC, "IPSEC"); protocols.add(ANY, "ANY"); } /** * Converts an KEY protocol value into its textual representation */ public static String string(int type) { return protocols.getText(type); } /** * Converts a textual representation of a KEY protocol into its * numeric code. Integers in the range 0..255 are also accepted. * @param s The textual representation of the protocol * @return The protocol code, or -1 on error. */ public static int value(String s) { return protocols.getValue(s); } } public static class Flags { /** * KEY flags identifiers. */ private Flags() {} /** KEY cannot be used for confidentiality */ public static final int NOCONF = 0x4000; /** KEY cannot be used for authentication */ public static final int NOAUTH = 0x8000; /** No key present */ public static final int NOKEY = 0xC000; /** Bitmask of the use fields */ public static final int USE_MASK = 0xC000; /** Flag 2 (unused) */ public static final int FLAG2 = 0x2000; /** Flags extension */ public static final int EXTEND = 0x1000; /** Flag 4 (unused) */ public static final int FLAG4 = 0x0800; /** Flag 5 (unused) */ public static final int FLAG5 = 0x0400; /** Key is owned by a user. */ public static final int USER = 0x0000; /** Key is owned by a zone. */ public static final int ZONE = 0x0100; /** Key is owned by a host. */ public static final int HOST = 0x0200; /** Key owner type 3 (reserved). */ public static final int NTYP3 = 0x0300; /** Key owner bitmask. */ public static final int OWNER_MASK = 0x0300; /** Flag 8 (unused) */ public static final int FLAG8 = 0x0080; /** Flag 9 (unused) */ public static final int FLAG9 = 0x0040; /** Flag 10 (unused) */ public static final int FLAG10 = 0x0020; /** Flag 11 (unused) */ public static final int FLAG11 = 0x0010; /** Signatory value 0 */ public static final int SIG0 = 0; /** Signatory value 1 */ public static final int SIG1 = 1; /** Signatory value 2 */ public static final int SIG2 = 2; /** Signatory value 3 */ public static final int SIG3 = 3; /** Signatory value 4 */ public static final int SIG4 = 4; /** Signatory value 5 */ public static final int SIG5 = 5; /** Signatory value 6 */ public static final int SIG6 = 6; /** Signatory value 7 */ public static final int SIG7 = 7; /** Signatory value 8 */ public static final int SIG8 = 8; /** Signatory value 9 */ public static final int SIG9 = 9; /** Signatory value 10 */ public static final int SIG10 = 10; /** Signatory value 11 */ public static final int SIG11 = 11; /** Signatory value 12 */ public static final int SIG12 = 12; /** Signatory value 13 */ public static final int SIG13 = 13; /** Signatory value 14 */ public static final int SIG14 = 14; /** Signatory value 15 */ public static final int SIG15 = 15; private static Mnemonic flags = new Mnemonic("KEY flags", Mnemonic.CASE_UPPER); static { flags.setMaximum(0xFFFF); flags.setNumericAllowed(false); flags.add(NOCONF, "NOCONF"); flags.add(NOAUTH, "NOAUTH"); flags.add(NOKEY, "NOKEY"); flags.add(FLAG2, "FLAG2"); flags.add(EXTEND, "EXTEND"); flags.add(FLAG4, "FLAG4"); flags.add(FLAG5, "FLAG5"); flags.add(USER, "USER"); flags.add(ZONE, "ZONE"); flags.add(HOST, "HOST"); flags.add(NTYP3, "NTYP3"); flags.add(FLAG8, "FLAG8"); flags.add(FLAG9, "FLAG9"); flags.add(FLAG10, "FLAG10"); flags.add(FLAG11, "FLAG11"); flags.add(SIG0, "SIG0"); flags.add(SIG1, "SIG1"); flags.add(SIG2, "SIG2"); flags.add(SIG3, "SIG3"); flags.add(SIG4, "SIG4"); flags.add(SIG5, "SIG5"); flags.add(SIG6, "SIG6"); flags.add(SIG7, "SIG7"); flags.add(SIG8, "SIG8"); flags.add(SIG9, "SIG9"); flags.add(SIG10, "SIG10"); flags.add(SIG11, "SIG11"); flags.add(SIG12, "SIG12"); flags.add(SIG13, "SIG13"); flags.add(SIG14, "SIG14"); flags.add(SIG15, "SIG15"); } /** * Converts a textual representation of KEY flags into its * numeric code. Integers in the range 0..65535 are also accepted. * @param s The textual representation of the protocol * @return The protocol code, or -1 on error. */ public static int value(String s) { int value; try { value = Integer.parseInt(s); if (value >= 0 && value <= 0xFFFF) { return value; } return -1; } catch (NumberFormatException e) { } StringTokenizer st = new StringTokenizer(s, "|"); value = 0; while (st.hasMoreTokens()) { int val = flags.getValue(st.nextToken()); if (val < 0) { return -1; } value |= val; } return value; } } /* flags */ /** This key cannot be used for confidentiality (encryption) */ public static final int FLAG_NOCONF = Flags.NOCONF; /** This key cannot be used for authentication */ public static final int FLAG_NOAUTH = Flags.NOAUTH; /** This key cannot be used for authentication or confidentiality */ public static final int FLAG_NOKEY = Flags.NOKEY; /** A zone key */ public static final int OWNER_ZONE = Flags.ZONE; /** A host/end entity key */ public static final int OWNER_HOST = Flags.HOST; /** A user key */ public static final int OWNER_USER = Flags.USER; /* protocols */ /** Key was created for use with transaction level security */ public static final int PROTOCOL_TLS = Protocol.TLS; /** Key was created for use with email */ public static final int PROTOCOL_EMAIL = Protocol.EMAIL; /** Key was created for use with DNSSEC */ public static final int PROTOCOL_DNSSEC = Protocol.DNSSEC; /** Key was created for use with IPSEC */ public static final int PROTOCOL_IPSEC = Protocol.IPSEC; /** Key was created for use with any protocol */ public static final int PROTOCOL_ANY = Protocol.ANY; KEYRecord() {} Record getObject() { return new KEYRecord(); } /** * Creates a KEY Record from the given data * @param flags Flags describing the key's properties * @param proto The protocol that the key was created for * @param alg The key's algorithm * @param key Binary data representing the key */ public KEYRecord(Name name, int dclass, long ttl, int flags, int proto, int alg, byte [] key) { super(name, Type.KEY, dclass, ttl, flags, proto, alg, key); } /** * Creates a KEY Record from the given data * @param flags Flags describing the key's properties * @param proto The protocol that the key was created for * @param alg The key's algorithm * @param key The key as a PublicKey * @throws DNSSEC.DNSSECException The PublicKey could not be converted into DNS * format. */ public KEYRecord(Name name, int dclass, long ttl, int flags, int proto, int alg, PublicKey key) throws DNSSEC.DNSSECException { super(name, Type.KEY, dclass, ttl, flags, proto, alg, DNSSEC.fromPublicKey(key, alg)); publicKey = key; } void rdataFromString(Tokenizer st, Name origin) throws IOException { String flagString = st.getIdentifier(); flags = Flags.value(flagString); if (flags < 0) throw st.exception("Invalid flags: " + flagString); String protoString = st.getIdentifier(); proto = Protocol.value(protoString); if (proto < 0) throw st.exception("Invalid protocol: " + protoString); String algString = st.getIdentifier(); alg = DNSSEC.Algorithm.value(algString); if (alg < 0) throw st.exception("Invalid algorithm: " + algString); /* If this is a null KEY, there's no key data */ if ((flags & Flags.USE_MASK) == Flags.NOKEY) key = null; else key = st.getBase64(); } } dnsjava-2.1.5/org/xbill/DNS/KXRecord.java100644 0 0 1727 11254312416 15153 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Key Exchange - delegation of authority * * @author Brian Wellington */ public class KXRecord extends U16NameBase { private static final long serialVersionUID = 7448568832769757809L; KXRecord() {} Record getObject() { return new KXRecord(); } /** * Creates a KX Record from the given data * @param preference The preference of this KX. Records with lower priority * are preferred. * @param target The host that authority is delegated to */ public KXRecord(Name name, int dclass, long ttl, int preference, Name target) { super(name, Type.KX, dclass, ttl, preference, "preference", target, "target"); } /** Returns the target of the KX record */ public Name getTarget() { return getNameField(); } /** Returns the preference of this KX record */ public int getPreference() { return getU16Field(); } public Name getAdditionalName() { return getNameField(); } } dnsjava-2.1.5/org/xbill/DNS/LOCRecord.java100644 0 0 16401 11422075174 15265 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.text.*; /** * Location - describes the physical location of hosts, networks, subnets. * * @author Brian Wellington */ public class LOCRecord extends Record { private static final long serialVersionUID = 9058224788126750409L; private static NumberFormat w2, w3; private long size, hPrecision, vPrecision; private long latitude, longitude, altitude; static { w2 = new DecimalFormat(); w2.setMinimumIntegerDigits(2); w3 = new DecimalFormat(); w3.setMinimumIntegerDigits(3); } LOCRecord() {} Record getObject() { return new LOCRecord(); } /** * Creates an LOC Record from the given data * @param latitude The latitude of the center of the sphere * @param longitude The longitude of the center of the sphere * @param altitude The altitude of the center of the sphere, in m * @param size The diameter of a sphere enclosing the described entity, in m. * @param hPrecision The horizontal precision of the data, in m. * @param vPrecision The vertical precision of the data, in m. */ public LOCRecord(Name name, int dclass, long ttl, double latitude, double longitude, double altitude, double size, double hPrecision, double vPrecision) { super(name, Type.LOC, dclass, ttl); this.latitude = (long)(latitude * 3600 * 1000 + (1L << 31)); this.longitude = (long)(longitude * 3600 * 1000 + (1L << 31)); this.altitude = (long)((altitude + 100000) * 100); this.size = (long)(size * 100); this.hPrecision = (long)(hPrecision * 100); this.vPrecision = (long)(vPrecision * 100); } void rrFromWire(DNSInput in) throws IOException { int version; version = in.readU8(); if (version != 0) throw new WireParseException("Invalid LOC version"); size = parseLOCformat(in.readU8()); hPrecision = parseLOCformat(in.readU8()); vPrecision = parseLOCformat(in.readU8()); latitude = in.readU32(); longitude = in.readU32(); altitude = in.readU32(); } private double parseFixedPoint(String s) { if (s.matches("^-?\\d+$")) return Integer.parseInt(s); else if (s.matches("^-?\\d+\\.\\d*$")) { String [] parts = s.split("\\."); double value = Integer.parseInt(parts[0]); double fraction = Integer.parseInt(parts[1]); if (value < 0) fraction *= -1; int digits = parts[1].length(); return value + (fraction / Math.pow(10, digits)); } else throw new NumberFormatException(); } private long parsePosition(Tokenizer st, String type) throws IOException { boolean isLatitude = type.equals("latitude"); int deg = 0, min = 0; double sec = 0; long value; String s; deg = st.getUInt16(); if (deg > 180 || (deg > 90 && isLatitude)) throw st.exception("Invalid LOC " + type + " degrees"); s = st.getString(); try { min = Integer.parseInt(s); if (min < 0 || min > 59) throw st.exception("Invalid LOC " + type + " minutes"); s = st.getString(); sec = parseFixedPoint(s); if (sec < 0 || sec >= 60) throw st.exception("Invalid LOC " + type + " seconds"); s = st.getString(); } catch (NumberFormatException e) { } if (s.length() != 1) throw st.exception("Invalid LOC " + type); value = (long) (1000 * (sec + 60L * (min + 60L * deg))); char c = Character.toUpperCase(s.charAt(0)); if ((isLatitude && c == 'S') || (!isLatitude && c == 'W')) value = -value; else if ((isLatitude && c != 'N') || (!isLatitude && c != 'E')) throw st.exception("Invalid LOC " + type); value += (1L << 31); return value; } private long parseDouble(Tokenizer st, String type, boolean required, long min, long max, long defaultValue) throws IOException { Tokenizer.Token token = st.get(); if (token.isEOL()) { if (required) throw st.exception("Invalid LOC " + type); st.unget(); return defaultValue; } String s = token.value; if (s.length() > 1 && s.charAt(s.length() - 1) == 'm') s = s.substring(0, s.length() - 1); try { long value = (long)(100 * parseFixedPoint(s)); if (value < min || value > max) throw st.exception("Invalid LOC " + type); return value; } catch (NumberFormatException e) { throw st.exception("Invalid LOC " + type); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { latitude = parsePosition(st, "latitude"); longitude = parsePosition(st, "longitude"); altitude = parseDouble(st, "altitude", true, -10000000, 4284967295L, 0) + 10000000; size = parseDouble(st, "size", false, 0, 9000000000L, 100); hPrecision = parseDouble(st, "horizontal precision", false, 0, 9000000000L, 1000000); vPrecision = parseDouble(st, "vertical precision", false, 0, 9000000000L, 1000); } private void renderFixedPoint(StringBuffer sb, NumberFormat formatter, long value, long divisor) { sb.append(value / divisor); value %= divisor; if (value != 0) { sb.append("."); sb.append(formatter.format(value)); } } private String positionToString(long value, char pos, char neg) { StringBuffer sb = new StringBuffer(); char direction; long temp = value - (1L << 31); if (temp < 0) { temp = -temp; direction = neg; } else direction = pos; sb.append(temp / (3600 * 1000)); /* degrees */ temp = temp % (3600 * 1000); sb.append(" "); sb.append(temp / (60 * 1000)); /* minutes */ temp = temp % (60 * 1000); sb.append(" "); renderFixedPoint(sb, w3, temp, 1000); /* seconds */ sb.append(" "); sb.append(direction); return sb.toString(); } /** Convert to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); /* Latitude */ sb.append(positionToString(latitude, 'N', 'S')); sb.append(" "); /* Latitude */ sb.append(positionToString(longitude, 'E', 'W')); sb.append(" "); /* Altitude */ renderFixedPoint(sb, w2, altitude - 10000000, 100); sb.append("m "); /* Size */ renderFixedPoint(sb, w2, size, 100); sb.append("m "); /* Horizontal precision */ renderFixedPoint(sb, w2, hPrecision, 100); sb.append("m "); /* Vertical precision */ renderFixedPoint(sb, w2, vPrecision, 100); sb.append("m"); return sb.toString(); } /** Returns the latitude */ public double getLatitude() { return ((double)(latitude - (1L << 31))) / (3600 * 1000); } /** Returns the longitude */ public double getLongitude() { return ((double)(longitude - (1L << 31))) / (3600 * 1000); } /** Returns the altitude */ public double getAltitude() { return ((double)(altitude - 10000000)) / 100; } /** Returns the diameter of the enclosing sphere */ public double getSize() { return ((double)size) / 100; } /** Returns the horizontal precision */ public double getHPrecision() { return ((double)hPrecision) / 100; } /** Returns the horizontal precision */ public double getVPrecision() { return ((double)vPrecision) / 100; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(0); /* version */ out.writeU8(toLOCformat(size)); out.writeU8(toLOCformat(hPrecision)); out.writeU8(toLOCformat(vPrecision)); out.writeU32(latitude); out.writeU32(longitude); out.writeU32(altitude); } private static long parseLOCformat(int b) throws WireParseException { long out = b >> 4; int exp = b & 0xF; if (out > 9 || exp > 9) throw new WireParseException("Invalid LOC Encoding"); while (exp-- > 0) out *= 10; return (out); } private int toLOCformat(long l) { byte exp = 0; while (l > 9) { exp++; l /= 10; } return (int)((l << 4) + exp); } } dnsjava-2.1.5/org/xbill/DNS/Lookup.java100644 0 0 40623 11523043534 14762 0ustar 0 0 // Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; import java.io.*; import java.net.*; /** * The Lookup object issues queries to caching DNS servers. The input consists * of a name, an optional type, and an optional class. Caching is enabled * by default and used when possible to reduce the number of DNS requests. * A Resolver, which defaults to an ExtendedResolver initialized with the * resolvers located by the ResolverConfig class, performs the queries. A * search path of domain suffixes is used to resolve relative names, and is * also determined by the ResolverConfig class. * * A Lookup object may be reused, but should not be used by multiple threads. * * @see Cache * @see Resolver * @see ResolverConfig * * @author Brian Wellington */ public final class Lookup { private static Resolver defaultResolver; private static Name [] defaultSearchPath; private static Map defaultCaches; private static int defaultNdots; private Resolver resolver; private Name [] searchPath; private Cache cache; private boolean temporary_cache; private int credibility; private Name name; private int type; private int dclass; private boolean verbose; private int iterations; private boolean foundAlias; private boolean done; private boolean doneCurrent; private List aliases; private Record [] answers; private int result; private String error; private boolean nxdomain; private boolean badresponse; private String badresponse_error; private boolean networkerror; private boolean timedout; private boolean nametoolong; private boolean referral; private static final Name [] noAliases = new Name[0]; /** The lookup was successful. */ public static final int SUCCESSFUL = 0; /** * The lookup failed due to a data or server error. Repeating the lookup * would not be helpful. */ public static final int UNRECOVERABLE = 1; /** * The lookup failed due to a network error. Repeating the lookup may be * helpful. */ public static final int TRY_AGAIN = 2; /** The host does not exist. */ public static final int HOST_NOT_FOUND = 3; /** The host exists, but has no records associated with the queried type. */ public static final int TYPE_NOT_FOUND = 4; public static synchronized void refreshDefault() { try { defaultResolver = new ExtendedResolver(); } catch (UnknownHostException e) { throw new RuntimeException("Failed to initialize resolver"); } defaultSearchPath = ResolverConfig.getCurrentConfig().searchPath(); defaultCaches = new HashMap(); defaultNdots = ResolverConfig.getCurrentConfig().ndots(); } static { refreshDefault(); } /** * Gets the Resolver that will be used as the default by future Lookups. * @return The default resolver. */ public static synchronized Resolver getDefaultResolver() { return defaultResolver; } /** * Sets the default Resolver to be used as the default by future Lookups. * @param resolver The default resolver. */ public static synchronized void setDefaultResolver(Resolver resolver) { defaultResolver = resolver; } /** * Gets the Cache that will be used as the default for the specified * class by future Lookups. * @param dclass The class whose cache is being retrieved. * @return The default cache for the specified class. */ public static synchronized Cache getDefaultCache(int dclass) { DClass.check(dclass); Cache c = (Cache) defaultCaches.get(Mnemonic.toInteger(dclass)); if (c == null) { c = new Cache(dclass); defaultCaches.put(Mnemonic.toInteger(dclass), c); } return c; } /** * Sets the Cache to be used as the default for the specified class by future * Lookups. * @param cache The default cache for the specified class. * @param dclass The class whose cache is being set. */ public static synchronized void setDefaultCache(Cache cache, int dclass) { DClass.check(dclass); defaultCaches.put(Mnemonic.toInteger(dclass), cache); } /** * Gets the search path that will be used as the default by future Lookups. * @return The default search path. */ public static synchronized Name [] getDefaultSearchPath() { return defaultSearchPath; } /** * Sets the search path to be used as the default by future Lookups. * @param domains The default search path. */ public static synchronized void setDefaultSearchPath(Name [] domains) { defaultSearchPath = domains; } /** * Sets the search path that will be used as the default by future Lookups. * @param domains The default search path. * @throws TextParseException A name in the array is not a valid DNS name. */ public static synchronized void setDefaultSearchPath(String [] domains) throws TextParseException { if (domains == null) { defaultSearchPath = null; return; } Name [] newdomains = new Name[domains.length]; for (int i = 0; i < domains.length; i++) newdomains[i] = Name.fromString(domains[i], Name.root); defaultSearchPath = newdomains; } private final void reset() { iterations = 0; foundAlias = false; done = false; doneCurrent = false; aliases = null; answers = null; result = -1; error = null; nxdomain = false; badresponse = false; badresponse_error = null; networkerror = false; timedout = false; nametoolong = false; referral = false; if (temporary_cache) cache.clearCache(); } /** * Create a Lookup object that will find records of the given name, type, * and class. The lookup will use the default cache, resolver, and search * path, and look for records that are reasonably credible. * @param name The name of the desired records * @param type The type of the desired records * @param dclass The class of the desired records * @throws IllegalArgumentException The type is a meta type other than ANY. * @see Cache * @see Resolver * @see Credibility * @see Name * @see Type * @see DClass */ public Lookup(Name name, int type, int dclass) { Type.check(type); DClass.check(dclass); if (!Type.isRR(type) && type != Type.ANY) throw new IllegalArgumentException("Cannot query for " + "meta-types other than ANY"); this.name = name; this.type = type; this.dclass = dclass; synchronized (Lookup.class) { this.resolver = getDefaultResolver(); this.searchPath = getDefaultSearchPath(); this.cache = getDefaultCache(dclass); } this.credibility = Credibility.NORMAL; this.verbose = Options.check("verbose"); this.result = -1; } /** * Create a Lookup object that will find records of the given name and type * in the IN class. * @param name The name of the desired records * @param type The type of the desired records * @throws IllegalArgumentException The type is a meta type other than ANY. * @see #Lookup(Name,int,int) */ public Lookup(Name name, int type) { this(name, type, DClass.IN); } /** * Create a Lookup object that will find records of type A at the given name * in the IN class. * @param name The name of the desired records * @see #Lookup(Name,int,int) */ public Lookup(Name name) { this(name, Type.A, DClass.IN); } /** * Create a Lookup object that will find records of the given name, type, * and class. * @param name The name of the desired records * @param type The type of the desired records * @param dclass The class of the desired records * @throws TextParseException The name is not a valid DNS name * @throws IllegalArgumentException The type is a meta type other than ANY. * @see #Lookup(Name,int,int) */ public Lookup(String name, int type, int dclass) throws TextParseException { this(Name.fromString(name), type, dclass); } /** * Create a Lookup object that will find records of the given name and type * in the IN class. * @param name The name of the desired records * @param type The type of the desired records * @throws TextParseException The name is not a valid DNS name * @throws IllegalArgumentException The type is a meta type other than ANY. * @see #Lookup(Name,int,int) */ public Lookup(String name, int type) throws TextParseException { this(Name.fromString(name), type, DClass.IN); } /** * Create a Lookup object that will find records of type A at the given name * in the IN class. * @param name The name of the desired records * @throws TextParseException The name is not a valid DNS name * @see #Lookup(Name,int,int) */ public Lookup(String name) throws TextParseException { this(Name.fromString(name), Type.A, DClass.IN); } /** * Sets the resolver to use when performing this lookup. This overrides the * default value. * @param resolver The resolver to use. */ public void setResolver(Resolver resolver) { this.resolver = resolver; } /** * Sets the search path to use when performing this lookup. This overrides the * default value. * @param domains An array of names containing the search path. */ public void setSearchPath(Name [] domains) { this.searchPath = domains; } /** * Sets the search path to use when performing this lookup. This overrides the * default value. * @param domains An array of names containing the search path. * @throws TextParseException A name in the array is not a valid DNS name. */ public void setSearchPath(String [] domains) throws TextParseException { if (domains == null) { this.searchPath = null; return; } Name [] newdomains = new Name[domains.length]; for (int i = 0; i < domains.length; i++) newdomains[i] = Name.fromString(domains[i], Name.root); this.searchPath = newdomains; } /** * Sets the cache to use when performing this lookup. This overrides the * default value. If the results of this lookup should not be permanently * cached, null can be provided here. * @param cache The cache to use. */ public void setCache(Cache cache) { if (cache == null) { this.cache = new Cache(dclass); this.temporary_cache = true; } else { this.cache = cache; this.temporary_cache = false; } } /** * Sets ndots to use when performing this lookup, overriding the default value. * Specifically, this refers to the number of "dots" which, if present in a * name, indicate that a lookup for the absolute name should be attempted * before appending any search path elements. * @param ndots The ndots value to use, which must be greater than or equal to * 0. */ public void setNdots(int ndots) { if (ndots < 0) throw new IllegalArgumentException("Illegal ndots value: " + ndots); defaultNdots = ndots; } /** * Sets the minimum credibility level that will be accepted when performing * the lookup. This defaults to Credibility.NORMAL. * @param credibility The minimum credibility level. */ public void setCredibility(int credibility) { this.credibility = credibility; } private void follow(Name name, Name oldname) { foundAlias = true; badresponse = false; networkerror = false; timedout = false; nxdomain = false; referral = false; iterations++; if (iterations >= 6 || name.equals(oldname)) { result = UNRECOVERABLE; error = "CNAME loop"; done = true; return; } if (aliases == null) aliases = new ArrayList(); aliases.add(oldname); lookup(name); } private void processResponse(Name name, SetResponse response) { if (response.isSuccessful()) { RRset [] rrsets = response.answers(); List l = new ArrayList(); Iterator it; int i; for (i = 0; i < rrsets.length; i++) { it = rrsets[i].rrs(); while (it.hasNext()) l.add(it.next()); } result = SUCCESSFUL; answers = (Record []) l.toArray(new Record[l.size()]); done = true; } else if (response.isNXDOMAIN()) { nxdomain = true; doneCurrent = true; if (iterations > 0) { result = HOST_NOT_FOUND; done = true; } } else if (response.isNXRRSET()) { result = TYPE_NOT_FOUND; answers = null; done = true; } else if (response.isCNAME()) { CNAMERecord cname = response.getCNAME(); follow(cname.getTarget(), name); } else if (response.isDNAME()) { DNAMERecord dname = response.getDNAME(); try { follow(name.fromDNAME(dname), name); } catch (NameTooLongException e) { result = UNRECOVERABLE; error = "Invalid DNAME target"; done = true; } } else if (response.isDelegation()) { // We shouldn't get a referral. Ignore it. referral = true; } } private void lookup(Name current) { SetResponse sr = cache.lookupRecords(current, type, credibility); if (verbose) { System.err.println("lookup " + current + " " + Type.string(type)); System.err.println(sr); } processResponse(current, sr); if (done || doneCurrent) return; Record question = Record.newRecord(current, type, dclass); Message query = Message.newQuery(question); Message response = null; try { response = resolver.send(query); } catch (IOException e) { // A network error occurred. Press on. if (e instanceof InterruptedIOException) timedout = true; else networkerror = true; return; } int rcode = response.getHeader().getRcode(); if (rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN) { // The server we contacted is broken or otherwise unhelpful. // Press on. badresponse = true; badresponse_error = Rcode.string(rcode); return; } if (!query.getQuestion().equals(response.getQuestion())) { // The answer doesn't match the question. That's not good. badresponse = true; badresponse_error = "response does not match query"; return; } sr = cache.addMessage(response); if (sr == null) sr = cache.lookupRecords(current, type, credibility); if (verbose) { System.err.println("queried " + current + " " + Type.string(type)); System.err.println(sr); } processResponse(current, sr); } private void resolve(Name current, Name suffix) { doneCurrent = false; Name tname = null; if (suffix == null) tname = current; else { try { tname = Name.concatenate(current, suffix); } catch (NameTooLongException e) { nametoolong = true; return; } } lookup(tname); } /** * Performs the lookup, using the specified Cache, Resolver, and search path. * @return The answers, or null if none are found. */ public Record [] run() { if (done) reset(); if (name.isAbsolute()) resolve(name, null); else if (searchPath == null) resolve(name, Name.root); else { if (name.labels() > defaultNdots) resolve(name, Name.root); if (done) return answers; for (int i = 0; i < searchPath.length; i++) { resolve(name, searchPath[i]); if (done) return answers; else if (foundAlias) break; } } if (!done) { if (badresponse) { result = TRY_AGAIN; error = badresponse_error; done = true; } else if (timedout) { result = TRY_AGAIN; error = "timed out"; done = true; } else if (networkerror) { result = TRY_AGAIN; error = "network error"; done = true; } else if (nxdomain) { result = HOST_NOT_FOUND; done = true; } else if (referral) { result = UNRECOVERABLE; error = "referral"; done = true; } else if (nametoolong) { result = UNRECOVERABLE; error = "name too long"; done = true; } } return answers; } private void checkDone() { if (done && result != -1) return; StringBuffer sb = new StringBuffer("Lookup of " + name + " "); if (dclass != DClass.IN) sb.append(DClass.string(dclass) + " "); sb.append(Type.string(type) + " isn't done"); throw new IllegalStateException(sb.toString()); } /** * Returns the answers from the lookup. * @return The answers, or null if none are found. * @throws IllegalStateException The lookup has not completed. */ public Record [] getAnswers() { checkDone(); return answers; } /** * Returns all known aliases for this name. Whenever a CNAME/DNAME is * followed, an alias is added to this array. The last element in this * array will be the owner name for records in the answer, if there are any. * @return The aliases. * @throws IllegalStateException The lookup has not completed. */ public Name [] getAliases() { checkDone(); if (aliases == null) return noAliases; return (Name []) aliases.toArray(new Name[aliases.size()]); } /** * Returns the result code of the lookup. * @return The result code, which can be SUCCESSFUL, UNRECOVERABLE, TRY_AGAIN, * HOST_NOT_FOUND, or TYPE_NOT_FOUND. * @throws IllegalStateException The lookup has not completed. */ public int getResult() { checkDone(); return result; } /** * Returns an error string describing the result code of this lookup. * @return A string, which may either directly correspond the result code * or be more specific. * @throws IllegalStateException The lookup has not completed. */ public String getErrorString() { checkDone(); if (error != null) return error; switch (result) { case SUCCESSFUL: return "successful"; case UNRECOVERABLE: return "unrecoverable error"; case TRY_AGAIN: return "try again"; case HOST_NOT_FOUND: return "host not found"; case TYPE_NOT_FOUND: return "type not found"; } throw new IllegalStateException("unknown result"); } } dnsjava-2.1.5/org/xbill/DNS/MBRecord.java100644 0 0 1404 11254312416 15117 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mailbox Record - specifies a host containing a mailbox. * * @author Brian Wellington */ public class MBRecord extends SingleNameBase { private static final long serialVersionUID = 532349543479150419L; MBRecord() {} Record getObject() { return new MBRecord(); } /** * Creates a new MB Record with the given data * @param mailbox The host containing the mailbox for the domain. */ public MBRecord(Name name, int dclass, long ttl, Name mailbox) { super(name, Type.MB, dclass, ttl, mailbox, "mailbox"); } /** Gets the mailbox for the domain */ public Name getMailbox() { return getSingleName(); } public Name getAdditionalName() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/MDRecord.java100644 0 0 1475 11254312416 15131 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mail Destination Record - specifies a mail agent which delivers mail * for a domain (obsolete) * * @author Brian Wellington */ public class MDRecord extends SingleNameBase { private static final long serialVersionUID = 5268878603762942202L; MDRecord() {} Record getObject() { return new MDRecord(); } /** * Creates a new MD Record with the given data * @param mailAgent The mail agent that delivers mail for the domain. */ public MDRecord(Name name, int dclass, long ttl, Name mailAgent) { super(name, Type.MD, dclass, ttl, mailAgent, "mail agent"); } /** Gets the mail agent for the domain */ public Name getMailAgent() { return getSingleName(); } public Name getAdditionalName() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/MFRecord.java100644 0 0 1474 11254312416 15132 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mail Forwarder Record - specifies a mail agent which forwards mail * for a domain (obsolete) * * @author Brian Wellington */ public class MFRecord extends SingleNameBase { private static final long serialVersionUID = -6670449036843028169L; MFRecord() {} Record getObject() { return new MFRecord(); } /** * Creates a new MF Record with the given data * @param mailAgent The mail agent that forwards mail for the domain. */ public MFRecord(Name name, int dclass, long ttl, Name mailAgent) { super(name, Type.MF, dclass, ttl, mailAgent, "mail agent"); } /** Gets the mail agent for the domain */ public Name getMailAgent() { return getSingleName(); } public Name getAdditionalName() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/MGRecord.java100644 0 0 1414 11254312416 15125 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mail Group Record - specifies a mailbox which is a member of a mail group. * * @author Brian Wellington */ public class MGRecord extends SingleNameBase { private static final long serialVersionUID = -3980055550863644582L; MGRecord() {} Record getObject() { return new MGRecord(); } /** * Creates a new MG Record with the given data * @param mailbox The mailbox that is a member of the group specified by the * domain. */ public MGRecord(Name name, int dclass, long ttl, Name mailbox) { super(name, Type.MG, dclass, ttl, mailbox, "mailbox"); } /** Gets the mailbox in the mail group specified by the domain */ public Name getMailbox() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/MINFORecord.java100644 0 0 3754 11254312416 15503 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Mailbox information Record - lists the address responsible for a mailing * list/mailbox and the address to receive error messages relating to the * mailing list/mailbox. * * @author Brian Wellington */ public class MINFORecord extends Record { private static final long serialVersionUID = -3962147172340353796L; private Name responsibleAddress; private Name errorAddress; MINFORecord() {} Record getObject() { return new MINFORecord(); } /** * Creates an MINFO Record from the given data * @param responsibleAddress The address responsible for the * mailing list/mailbox. * @param errorAddress The address to receive error messages relating to the * mailing list/mailbox. */ public MINFORecord(Name name, int dclass, long ttl, Name responsibleAddress, Name errorAddress) { super(name, Type.MINFO, dclass, ttl); this.responsibleAddress = checkName("responsibleAddress", responsibleAddress); this.errorAddress = checkName("errorAddress", errorAddress); } void rrFromWire(DNSInput in) throws IOException { responsibleAddress = new Name(in); errorAddress = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { responsibleAddress = st.getName(origin); errorAddress = st.getName(origin); } /** Converts the MINFO Record to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(responsibleAddress); sb.append(" "); sb.append(errorAddress); return sb.toString(); } /** Gets the address responsible for the mailing list/mailbox. */ public Name getResponsibleAddress() { return responsibleAddress; } /** * Gets the address to receive error messages relating to the mailing * list/mailbox. */ public Name getErrorAddress() { return errorAddress; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { responsibleAddress.toWire(out, null, canonical); errorAddress.toWire(out, null, canonical); } } dnsjava-2.1.5/org/xbill/DNS/MRRecord.java100644 0 0 1363 11254312416 15143 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mailbox Rename Record - specifies a rename of a mailbox. * * @author Brian Wellington */ public class MRRecord extends SingleNameBase { private static final long serialVersionUID = -5617939094209927533L; MRRecord() {} Record getObject() { return new MRRecord(); } /** * Creates a new MR Record with the given data * @param newName The new name of the mailbox specified by the domain. * domain. */ public MRRecord(Name name, int dclass, long ttl, Name newName) { super(name, Type.MR, dclass, ttl, newName, "new name"); } /** Gets the new name of the mailbox specified by the domain */ public Name getNewName() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/MXRecord.java100644 0 0 2125 11254312416 15146 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Mail Exchange - specifies where mail to a domain is sent * * @author Brian Wellington */ public class MXRecord extends U16NameBase { private static final long serialVersionUID = 2914841027584208546L; MXRecord() {} Record getObject() { return new MXRecord(); } /** * Creates an MX Record from the given data * @param priority The priority of this MX. Records with lower priority * are preferred. * @param target The host that mail is sent to */ public MXRecord(Name name, int dclass, long ttl, int priority, Name target) { super(name, Type.MX, dclass, ttl, priority, "priority", target, "target"); } /** Returns the target of the MX record */ public Name getTarget() { return getNameField(); } /** Returns the priority of this MX record */ public int getPriority() { return getU16Field(); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(u16Field); nameField.toWire(out, c, canonical); } public Name getAdditionalName() { return getNameField(); } } dnsjava-2.1.5/org/xbill/DNS/Master.java100644 0 0 24032 11064057175 14746 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A DNS master file parser. This incrementally parses the file, returning * one record at a time. When directives are seen, they are added to the * state and used when parsing future records. * * @author Brian Wellington */ public class Master { private Name origin; private File file; private Record last = null; private long defaultTTL; private Master included = null; private Tokenizer st; private int currentType; private int currentDClass; private long currentTTL; private boolean needSOATTL; private Generator generator; private List generators; private boolean noExpandGenerate; Master(File file, Name origin, long initialTTL) throws IOException { if (origin != null && !origin.isAbsolute()) { throw new RelativeNameException(origin); } this.file = file; st = new Tokenizer(file); this.origin = origin; defaultTTL = initialTTL; } /** * Initializes the master file reader and opens the specified master file. * @param filename The master file. * @param origin The initial origin to append to relative names. * @param ttl The initial default TTL. * @throws IOException The master file could not be opened. */ public Master(String filename, Name origin, long ttl) throws IOException { this(new File(filename), origin, ttl); } /** * Initializes the master file reader and opens the specified master file. * @param filename The master file. * @param origin The initial origin to append to relative names. * @throws IOException The master file could not be opened. */ public Master(String filename, Name origin) throws IOException { this(new File(filename), origin, -1); } /** * Initializes the master file reader and opens the specified master file. * @param filename The master file. * @throws IOException The master file could not be opened. */ public Master(String filename) throws IOException { this(new File(filename), null, -1); } /** * Initializes the master file reader. * @param in The input stream containing a master file. * @param origin The initial origin to append to relative names. * @param ttl The initial default TTL. */ public Master(InputStream in, Name origin, long ttl) { if (origin != null && !origin.isAbsolute()) { throw new RelativeNameException(origin); } st = new Tokenizer(in); this.origin = origin; defaultTTL = ttl; } /** * Initializes the master file reader. * @param in The input stream containing a master file. * @param origin The initial origin to append to relative names. */ public Master(InputStream in, Name origin) { this(in, origin, -1); } /** * Initializes the master file reader. * @param in The input stream containing a master file. */ public Master(InputStream in) { this(in, null, -1); } private Name parseName(String s, Name origin) throws TextParseException { try { return Name.fromString(s, origin); } catch (TextParseException e) { throw st.exception(e.getMessage()); } } private void parseTTLClassAndType() throws IOException { String s; boolean seen_class = false; // This is a bit messy, since any of the following are legal: // class ttl type // ttl class type // class type // ttl type // type seen_class = false; s = st.getString(); if ((currentDClass = DClass.value(s)) >= 0) { s = st.getString(); seen_class = true; } currentTTL = -1; try { currentTTL = TTL.parseTTL(s); s = st.getString(); } catch (NumberFormatException e) { if (defaultTTL >= 0) currentTTL = defaultTTL; else if (last != null) currentTTL = last.getTTL(); } if (!seen_class) { if ((currentDClass = DClass.value(s)) >= 0) { s = st.getString(); } else { currentDClass = DClass.IN; } } if ((currentType = Type.value(s)) < 0) throw st.exception("Invalid type '" + s + "'"); // BIND allows a missing TTL for the initial SOA record, and uses // the SOA minimum value. If the SOA is not the first record, // this is an error. if (currentTTL < 0) { if (currentType != Type.SOA) throw st.exception("missing TTL"); needSOATTL = true; currentTTL = 0; } } private long parseUInt32(String s) { if (!Character.isDigit(s.charAt(0))) return -1; try { long l = Long.parseLong(s); if (l < 0 || l > 0xFFFFFFFFL) return -1; return l; } catch (NumberFormatException e) { return -1; } } private void startGenerate() throws IOException { String s; int n; // The first field is of the form start-end[/step] // Regexes would be useful here. s = st.getIdentifier(); n = s.indexOf("-"); if (n < 0) throw st.exception("Invalid $GENERATE range specifier: " + s); String startstr = s.substring(0, n); String endstr = s.substring(n + 1); String stepstr = null; n = endstr.indexOf("/"); if (n >= 0) { stepstr = endstr.substring(n + 1); endstr = endstr.substring(0, n); } long start = parseUInt32(startstr); long end = parseUInt32(endstr); long step; if (stepstr != null) step = parseUInt32(stepstr); else step = 1; if (start < 0 || end < 0 || start > end || step <= 0) throw st.exception("Invalid $GENERATE range specifier: " + s); // The next field is the name specification. String nameSpec = st.getIdentifier(); // Then the ttl/class/type, in the same form as a normal record. // Only some types are supported. parseTTLClassAndType(); if (!Generator.supportedType(currentType)) throw st.exception("$GENERATE does not support " + Type.string(currentType) + " records"); // Next comes the rdata specification. String rdataSpec = st.getIdentifier(); // That should be the end. However, we don't want to move past the // line yet, so put back the EOL after reading it. st.getEOL(); st.unget(); generator = new Generator(start, end, step, nameSpec, currentType, currentDClass, currentTTL, rdataSpec, origin); if (generators == null) generators = new ArrayList(1); generators.add(generator); } private void endGenerate() throws IOException { // Read the EOL that we put back before. st.getEOL(); generator = null; } private Record nextGenerated() throws IOException { try { return generator.nextRecord(); } catch (Tokenizer.TokenizerException e) { throw st.exception("Parsing $GENERATE: " + e.getBaseMessage()); } catch (TextParseException e) { throw st.exception("Parsing $GENERATE: " + e.getMessage()); } } /** * Returns the next record in the master file. This will process any * directives before the next record. * @return The next record. * @throws IOException The master file could not be read, or was syntactically * invalid. */ public Record _nextRecord() throws IOException { Tokenizer.Token token; String s; if (included != null) { Record rec = included.nextRecord(); if (rec != null) return rec; included = null; } if (generator != null) { Record rec = nextGenerated(); if (rec != null) return rec; endGenerate(); } while (true) { Name name; token = st.get(true, false); if (token.type == Tokenizer.WHITESPACE) { Tokenizer.Token next = st.get(); if (next.type == Tokenizer.EOL) continue; else if (next.type == Tokenizer.EOF) return null; else st.unget(); if (last == null) throw st.exception("no owner"); name = last.getName(); } else if (token.type == Tokenizer.EOL) continue; else if (token.type == Tokenizer.EOF) return null; else if (((String) token.value).charAt(0) == '$') { s = token.value; if (s.equalsIgnoreCase("$ORIGIN")) { origin = st.getName(Name.root); st.getEOL(); continue; } else if (s.equalsIgnoreCase("$TTL")) { defaultTTL = st.getTTL(); st.getEOL(); continue; } else if (s.equalsIgnoreCase("$INCLUDE")) { String filename = st.getString(); File newfile; if (file != null) { String parent = file.getParent(); newfile = new File(parent, filename); } else { newfile = new File(filename); } Name incorigin = origin; token = st.get(); if (token.isString()) { incorigin = parseName(token.value, Name.root); st.getEOL(); } included = new Master(newfile, incorigin, defaultTTL); /* * If we continued, we wouldn't be looking in * the new file. Recursing works better. */ return nextRecord(); } else if (s.equalsIgnoreCase("$GENERATE")) { if (generator != null) throw new IllegalStateException ("cannot nest $GENERATE"); startGenerate(); if (noExpandGenerate) { endGenerate(); continue; } return nextGenerated(); } else { throw st.exception("Invalid directive: " + s); } } else { s = token.value; name = parseName(s, origin); if (last != null && name.equals(last.getName())) { name = last.getName(); } } parseTTLClassAndType(); last = Record.fromString(name, currentType, currentDClass, currentTTL, st, origin); if (needSOATTL) { long ttl = ((SOARecord)last).getMinimum(); last.setTTL(ttl); defaultTTL = ttl; needSOATTL = false; } return last; } } /** * Returns the next record in the master file. This will process any * directives before the next record. * @return The next record. * @throws IOException The master file could not be read, or was syntactically * invalid. */ public Record nextRecord() throws IOException { Record rec = null; try { rec = _nextRecord(); } finally { if (rec == null) { st.close(); } } return rec; } /** * Specifies whether $GENERATE statements should be expanded. Whether * expanded or not, the specifications for generated records are available * by calling {@link #generators}. This must be called before a $GENERATE * statement is seen during iteration to have an effect. */ public void expandGenerate(boolean wantExpand) { noExpandGenerate = !wantExpand; } /** * Returns an iterator over the generators specified in the master file; that * is, the parsed contents of $GENERATE statements. * @see Generator */ public Iterator generators() { if (generators != null) return Collections.unmodifiableList(generators).iterator(); else return Collections.EMPTY_LIST.iterator(); } protected void finalize() { st.close(); } } dnsjava-2.1.5/org/xbill/DNS/Message.java100644 0 0 33114 12042300726 15066 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; import java.io.*; /** * A DNS Message. A message is the basic unit of communication between * the client and server of a DNS operation. A message consists of a Header * and 4 message sections. * @see Resolver * @see Header * @see Section * * @author Brian Wellington */ public class Message implements Cloneable { /** The maximum length of a message in wire format. */ public static final int MAXLENGTH = 65535; private Header header; private List [] sections; private int size; private TSIG tsigkey; private TSIGRecord querytsig; private int tsigerror; int tsigstart; int tsigState; int sig0start; /* The message was not signed */ static final int TSIG_UNSIGNED = 0; /* The message was signed and verification succeeded */ static final int TSIG_VERIFIED = 1; /* The message was an unsigned message in multiple-message response */ static final int TSIG_INTERMEDIATE = 2; /* The message was signed and no verification was attempted. */ static final int TSIG_SIGNED = 3; /* * The message was signed and verification failed, or was not signed * when it should have been. */ static final int TSIG_FAILED = 4; private static Record [] emptyRecordArray = new Record[0]; private static RRset [] emptyRRsetArray = new RRset[0]; private Message(Header header) { sections = new List[4]; this.header = header; } /** Creates a new Message with the specified Message ID */ public Message(int id) { this(new Header(id)); } /** Creates a new Message with a random Message ID */ public Message() { this(new Header()); } /** * Creates a new Message with a random Message ID suitable for sending as a * query. * @param r A record containing the question */ public static Message newQuery(Record r) { Message m = new Message(); m.header.setOpcode(Opcode.QUERY); m.header.setFlag(Flags.RD); m.addRecord(r, Section.QUESTION); return m; } /** * Creates a new Message to contain a dynamic update. A random Message ID * and the zone are filled in. * @param zone The zone to be updated */ public static Message newUpdate(Name zone) { return new Update(zone); } Message(DNSInput in) throws IOException { this(new Header(in)); boolean isUpdate = (header.getOpcode() == Opcode.UPDATE); boolean truncated = header.getFlag(Flags.TC); try { for (int i = 0; i < 4; i++) { int count = header.getCount(i); if (count > 0) sections[i] = new ArrayList(count); for (int j = 0; j < count; j++) { int pos = in.current(); Record rec = Record.fromWire(in, i, isUpdate); sections[i].add(rec); if (i == Section.ADDITIONAL) { if (rec.getType() == Type.TSIG) tsigstart = pos; if (rec.getType() == Type.SIG) { SIGRecord sig = (SIGRecord) rec; if (sig.getTypeCovered() == 0) sig0start = pos; } } } } } catch (WireParseException e) { if (!truncated) throw e; } size = in.current(); } /** * Creates a new Message from its DNS wire format representation * @param b A byte array containing the DNS Message. */ public Message(byte [] b) throws IOException { this(new DNSInput(b)); } /** * Replaces the Header with a new one. * @see Header */ public void setHeader(Header h) { header = h; } /** * Retrieves the Header. * @see Header */ public Header getHeader() { return header; } /** * Adds a record to a section of the Message, and adjusts the header. * @see Record * @see Section */ public void addRecord(Record r, int section) { if (sections[section] == null) sections[section] = new LinkedList(); header.incCount(section); sections[section].add(r); } /** * Removes a record from a section of the Message, and adjusts the header. * @see Record * @see Section */ public boolean removeRecord(Record r, int section) { if (sections[section] != null && sections[section].remove(r)) { header.decCount(section); return true; } else return false; } /** * Removes all records from a section of the Message, and adjusts the header. * @see Record * @see Section */ public void removeAllRecords(int section) { sections[section] = null; header.setCount(section, 0); } /** * Determines if the given record is already present in the given section. * @see Record * @see Section */ public boolean findRecord(Record r, int section) { return (sections[section] != null && sections[section].contains(r)); } /** * Determines if the given record is already present in any section. * @see Record * @see Section */ public boolean findRecord(Record r) { for (int i = Section.ANSWER; i <= Section.ADDITIONAL; i++) if (sections[i] != null && sections[i].contains(r)) return true; return false; } /** * Determines if an RRset with the given name and type is already * present in the given section. * @see RRset * @see Section */ public boolean findRRset(Name name, int type, int section) { if (sections[section] == null) return false; for (int i = 0; i < sections[section].size(); i++) { Record r = (Record) sections[section].get(i); if (r.getType() == type && name.equals(r.getName())) return true; } return false; } /** * Determines if an RRset with the given name and type is already * present in any section. * @see RRset * @see Section */ public boolean findRRset(Name name, int type) { return (findRRset(name, type, Section.ANSWER) || findRRset(name, type, Section.AUTHORITY) || findRRset(name, type, Section.ADDITIONAL)); } /** * Returns the first record in the QUESTION section. * @see Record * @see Section */ public Record getQuestion() { List l = sections[Section.QUESTION]; if (l == null || l.size() == 0) return null; return (Record) l.get(0); } /** * Returns the TSIG record from the ADDITIONAL section, if one is present. * @see TSIGRecord * @see TSIG * @see Section */ public TSIGRecord getTSIG() { int count = header.getCount(Section.ADDITIONAL); if (count == 0) return null; List l = sections[Section.ADDITIONAL]; Record rec = (Record) l.get(count - 1); if (rec.type != Type.TSIG) return null; return (TSIGRecord) rec; } /** * Was this message signed by a TSIG? * @see TSIG */ public boolean isSigned() { return (tsigState == TSIG_SIGNED || tsigState == TSIG_VERIFIED || tsigState == TSIG_FAILED); } /** * If this message was signed by a TSIG, was the TSIG verified? * @see TSIG */ public boolean isVerified() { return (tsigState == TSIG_VERIFIED); } /** * Returns the OPT record from the ADDITIONAL section, if one is present. * @see OPTRecord * @see Section */ public OPTRecord getOPT() { Record [] additional = getSectionArray(Section.ADDITIONAL); for (int i = 0; i < additional.length; i++) if (additional[i] instanceof OPTRecord) return (OPTRecord) additional[i]; return null; } /** * Returns the message's rcode (error code). This incorporates the EDNS * extended rcode. */ public int getRcode() { int rcode = header.getRcode(); OPTRecord opt = getOPT(); if (opt != null) rcode += (opt.getExtendedRcode() << 4); return rcode; } /** * Returns an array containing all records in the given section, or an * empty array if the section is empty. * @see Record * @see Section */ public Record [] getSectionArray(int section) { if (sections[section] == null) return emptyRecordArray; List l = sections[section]; return (Record []) l.toArray(new Record[l.size()]); } private static boolean sameSet(Record r1, Record r2) { return (r1.getRRsetType() == r2.getRRsetType() && r1.getDClass() == r2.getDClass() && r1.getName().equals(r2.getName())); } /** * Returns an array containing all records in the given section grouped into * RRsets. * @see RRset * @see Section */ public RRset [] getSectionRRsets(int section) { if (sections[section] == null) return emptyRRsetArray; List sets = new LinkedList(); Record [] recs = getSectionArray(section); Set hash = new HashSet(); for (int i = 0; i < recs.length; i++) { Name name = recs[i].getName(); boolean newset = true; if (hash.contains(name)) { for (int j = sets.size() - 1; j >= 0; j--) { RRset set = (RRset) sets.get(j); if (set.getType() == recs[i].getRRsetType() && set.getDClass() == recs[i].getDClass() && set.getName().equals(name)) { set.addRR(recs[i]); newset = false; break; } } } if (newset) { RRset set = new RRset(recs[i]); sets.add(set); hash.add(name); } } return (RRset []) sets.toArray(new RRset[sets.size()]); } void toWire(DNSOutput out) { header.toWire(out); Compression c = new Compression(); for (int i = 0; i < 4; i++) { if (sections[i] == null) continue; for (int j = 0; j < sections[i].size(); j++) { Record rec = (Record)sections[i].get(j); rec.toWire(out, i, c); } } } /* Returns the number of records not successfully rendered. */ private int sectionToWire(DNSOutput out, int section, Compression c, int maxLength) { int n = sections[section].size(); int pos = out.current(); int rendered = 0; Record lastrec = null; for (int i = 0; i < n; i++) { Record rec = (Record)sections[section].get(i); if (lastrec != null && !sameSet(rec, lastrec)) { pos = out.current(); rendered = i; } lastrec = rec; rec.toWire(out, section, c); if (out.current() > maxLength) { out.jump(pos); return n - rendered; } } return 0; } /* Returns true if the message could be rendered. */ private boolean toWire(DNSOutput out, int maxLength) { if (maxLength < Header.LENGTH) return false; Header newheader = null; int tempMaxLength = maxLength; if (tsigkey != null) tempMaxLength -= tsigkey.recordLength(); int startpos = out.current(); header.toWire(out); Compression c = new Compression(); for (int i = 0; i < 4; i++) { int skipped; if (sections[i] == null) continue; skipped = sectionToWire(out, i, c, tempMaxLength); if (skipped != 0) { if (newheader == null) newheader = (Header) header.clone(); if (i != Section.ADDITIONAL) newheader.setFlag(Flags.TC); int count = newheader.getCount(i); newheader.setCount(i, count - skipped); for (int j = i + 1; j < 4; j++) newheader.setCount(j, 0); out.save(); out.jump(startpos); newheader.toWire(out); out.restore(); break; } } if (tsigkey != null) { TSIGRecord tsigrec = tsigkey.generate(this, out.toByteArray(), tsigerror, querytsig); if (newheader == null) newheader = (Header) header.clone(); tsigrec.toWire(out, Section.ADDITIONAL, c); newheader.incCount(Section.ADDITIONAL); out.save(); out.jump(startpos); newheader.toWire(out); out.restore(); } return true; } /** * Returns an array containing the wire format representation of the Message. */ public byte [] toWire() { DNSOutput out = new DNSOutput(); toWire(out); size = out.current(); return out.toByteArray(); } /** * Returns an array containing the wire format representation of the Message * with the specified maximum length. This will generate a truncated * message (with the TC bit) if the message doesn't fit, and will also * sign the message with the TSIG key set by a call to setTSIG(). This * method may return null if the message could not be rendered at all; this * could happen if maxLength is smaller than a DNS header, for example. * @param maxLength The maximum length of the message. * @return The wire format of the message, or null if the message could not be * rendered into the specified length. * @see Flags * @see TSIG */ public byte [] toWire(int maxLength) { DNSOutput out = new DNSOutput(); toWire(out, maxLength); size = out.current(); return out.toByteArray(); } /** * Sets the TSIG key and other necessary information to sign a message. * @param key The TSIG key. * @param error The value of the TSIG error field. * @param querytsig If this is a response, the TSIG from the request. */ public void setTSIG(TSIG key, int error, TSIGRecord querytsig) { this.tsigkey = key; this.tsigerror = error; this.querytsig = querytsig; } /** * Returns the size of the message. Only valid if the message has been * converted to or from wire format. */ public int numBytes() { return size; } /** * Converts the given section of the Message to a String. * @see Section */ public String sectionToString(int i) { if (i > 3) return null; StringBuffer sb = new StringBuffer(); Record [] records = getSectionArray(i); for (int j = 0; j < records.length; j++) { Record rec = records[j]; if (i == Section.QUESTION) { sb.append(";;\t" + rec.name); sb.append(", type = " + Type.string(rec.type)); sb.append(", class = " + DClass.string(rec.dclass)); } else sb.append(rec); sb.append("\n"); } return sb.toString(); } /** * Converts the Message to a String. */ public String toString() { StringBuffer sb = new StringBuffer(); OPTRecord opt = getOPT(); if (opt != null) sb.append(header.toStringWithRcode(getRcode()) + "\n"); else sb.append(header + "\n"); if (isSigned()) { sb.append(";; TSIG "); if (isVerified()) sb.append("ok"); else sb.append("invalid"); sb.append('\n'); } for (int i = 0; i < 4; i++) { if (header.getOpcode() != Opcode.UPDATE) sb.append(";; " + Section.longString(i) + ":\n"); else sb.append(";; " + Section.updString(i) + ":\n"); sb.append(sectionToString(i) + "\n"); } sb.append(";; Message size: " + numBytes() + " bytes"); return sb.toString(); } /** * Creates a copy of this Message. This is done by the Resolver before adding * TSIG and OPT records, for example. * @see Resolver * @see TSIGRecord * @see OPTRecord */ public Object clone() { Message m = new Message(); for (int i = 0; i < sections.length; i++) { if (sections[i] != null) m.sections[i] = new LinkedList(sections[i]); } m.header = (Header) header.clone(); m.size = size; return m; } } dnsjava-2.1.5/org/xbill/DNS/Mnemonic.java100644 0 0 10645 10230437223 15253 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.HashMap; /** * A utility class for converting between numeric codes and mnemonics * for those codes. Mnemonics are case insensitive. * * @author Brian Wellington */ class Mnemonic { private static Integer cachedInts[] = new Integer[64]; static { for (int i = 0; i < cachedInts.length; i++) { cachedInts[i] = new Integer(i); } } /* Strings are case-sensitive. */ static final int CASE_SENSITIVE = 1; /* Strings will be stored/searched for in uppercase. */ static final int CASE_UPPER = 2; /* Strings will be stored/searched for in lowercase. */ static final int CASE_LOWER = 3; private HashMap strings; private HashMap values; private String description; private int wordcase; private String prefix; private int max; private boolean numericok; /** * Creates a new Mnemonic table. * @param description A short description of the mnemonic to use when * @param wordcase Whether to convert strings into uppercase, lowercase, * or leave them unchanged. * throwing exceptions. */ public Mnemonic(String description, int wordcase) { this.description = description; this.wordcase = wordcase; strings = new HashMap(); values = new HashMap(); max = Integer.MAX_VALUE; } /** Sets the maximum numeric value */ public void setMaximum(int max) { this.max = max; } /** * Sets the prefix to use when converting to and from values that don't * have mnemonics. */ public void setPrefix(String prefix) { this.prefix = sanitize(prefix); } /** * Sets whether numeric values stored in strings are acceptable. */ public void setNumericAllowed(boolean numeric) { this.numericok = numeric; } /** * Converts an int into a possibly cached Integer. */ public static Integer toInteger(int val) { if (val >= 0 && val < cachedInts.length) return (cachedInts[val]); return new Integer(val); } /** * Checks that a numeric value is within the range [0..max] */ public void check(int val) { if (val < 0 || val > max) { throw new IllegalArgumentException(description + " " + val + "is out of range"); } } /* Converts a String to the correct case. */ private String sanitize(String str) { if (wordcase == CASE_UPPER) return str.toUpperCase(); else if (wordcase == CASE_LOWER) return str.toLowerCase(); return str; } private int parseNumeric(String s) { try { int val = Integer.parseInt(s); if (val >= 0 && val <= max) return val; } catch (NumberFormatException e) { } return -1; } /** * Defines the text representation of a numeric value. * @param val The numeric value * @param string The text string */ public void add(int val, String str) { check(val); Integer value = toInteger(val); str = sanitize(str); strings.put(str, value); values.put(value, str); } /** * Defines an additional text representation of a numeric value. This will * be used by getValue(), but not getText(). * @param val The numeric value * @param string The text string */ public void addAlias(int val, String str) { check(val); Integer value = toInteger(val); str = sanitize(str); strings.put(str, value); } /** * Copies all mnemonics from one table into another. * @param val The numeric value * @param string The text string * @throws IllegalArgumentException The wordcases of the Mnemonics do not * match. */ public void addAll(Mnemonic source) { if (wordcase != source.wordcase) throw new IllegalArgumentException(source.description + ": wordcases do not match"); strings.putAll(source.strings); values.putAll(source.values); } /** * Gets the text mnemonic corresponding to a numeric value. * @param val The numeric value * @return The corresponding text mnemonic. */ public String getText(int val) { check(val); String str = (String) values.get(toInteger(val)); if (str != null) return str; str = Integer.toString(val); if (prefix != null) return prefix + str; return str; } /** * Gets the numeric value corresponding to a text mnemonic. * @param str The text mnemonic * @return The corresponding numeric value, or -1 if there is none */ public int getValue(String str) { str = sanitize(str); Integer value = (Integer) strings.get(str); if (value != null) { return value.intValue(); } if (prefix != null) { if (str.startsWith(prefix)) { int val = parseNumeric(str.substring(prefix.length())); if (val >= 0) { return val; } } } if (numericok) { return parseNumeric(str); } return -1; } } dnsjava-2.1.5/org/xbill/DNS/NAPTRRecord.java100644 0 0 7061 11254312416 15512 0ustar 0 0 // Copyright (c) 2000-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Name Authority Pointer Record - specifies rewrite rule, that when applied * to an existing string will produce a new domain. * * @author Chuck Santos */ public class NAPTRRecord extends Record { private static final long serialVersionUID = 5191232392044947002L; private int order, preference; private byte [] flags, service, regexp; private Name replacement; NAPTRRecord() {} Record getObject() { return new NAPTRRecord(); } /** * Creates an NAPTR Record from the given data * @param order The order of this NAPTR. Records with lower order are * preferred. * @param preference The preference, used to select between records at the * same order. * @param flags The control aspects of the NAPTRRecord. * @param service The service or protocol available down the rewrite path. * @param regexp The regular/substitution expression. * @param replacement The domain-name to query for the next DNS resource * record, depending on the value of the flags field. * @throws IllegalArgumentException One of the strings has invalid escapes */ public NAPTRRecord(Name name, int dclass, long ttl, int order, int preference, String flags, String service, String regexp, Name replacement) { super(name, Type.NAPTR, dclass, ttl); this.order = checkU16("order", order); this.preference = checkU16("preference", preference); try { this.flags = byteArrayFromString(flags); this.service = byteArrayFromString(service); this.regexp = byteArrayFromString(regexp); } catch (TextParseException e) { throw new IllegalArgumentException(e.getMessage()); } this.replacement = checkName("replacement", replacement); } void rrFromWire(DNSInput in) throws IOException { order = in.readU16(); preference = in.readU16(); flags = in.readCountedString(); service = in.readCountedString(); regexp = in.readCountedString(); replacement = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { order = st.getUInt16(); preference = st.getUInt16(); try { flags = byteArrayFromString(st.getString()); service = byteArrayFromString(st.getString()); regexp = byteArrayFromString(st.getString()); } catch (TextParseException e) { throw st.exception(e.getMessage()); } replacement = st.getName(origin); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(order); sb.append(" "); sb.append(preference); sb.append(" "); sb.append(byteArrayToString(flags, true)); sb.append(" "); sb.append(byteArrayToString(service, true)); sb.append(" "); sb.append(byteArrayToString(regexp, true)); sb.append(" "); sb.append(replacement); return sb.toString(); } /** Returns the order */ public int getOrder() { return order; } /** Returns the preference */ public int getPreference() { return preference; } /** Returns flags */ public String getFlags() { return byteArrayToString(flags, false); } /** Returns service */ public String getService() { return byteArrayToString(service, false); } /** Returns regexp */ public String getRegexp() { return byteArrayToString(regexp, false); } /** Returns the replacement domain-name */ public Name getReplacement() { return replacement; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(order); out.writeU16(preference); out.writeCountedString(flags); out.writeCountedString(service); out.writeCountedString(regexp); replacement.toWire(out, null, canonical); } public Name getAdditionalName() { return replacement; } } dnsjava-2.1.5/org/xbill/DNS/NSAPRecord.java100644 0 0 4044 11254312416 15365 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * NSAP Address Record. * * @author Brian Wellington */ public class NSAPRecord extends Record { private static final long serialVersionUID = -1037209403185658593L; private byte [] address; NSAPRecord() {} Record getObject() { return new NSAPRecord(); } private static final byte [] checkAndConvertAddress(String address) { if (!address.substring(0, 2).equalsIgnoreCase("0x")) { return null; } ByteArrayOutputStream bytes = new ByteArrayOutputStream(); boolean partial = false; int current = 0; for (int i = 2; i < address.length(); i++) { char c = address.charAt(i); if (c == '.') { continue; } int value = Character.digit(c, 16); if (value == -1) { return null; } if (partial) { current += value; bytes.write(current); partial = false; } else { current = value << 4; partial = true; } } if (partial) { return null; } return bytes.toByteArray(); } /** * Creates an NSAP Record from the given data * @param address The NSAP address. * @throws IllegalArgumentException The address is not a valid NSAP address. */ public NSAPRecord(Name name, int dclass, long ttl, String address) { super(name, Type.NSAP, dclass, ttl); this.address = checkAndConvertAddress(address); if (this.address == null) { throw new IllegalArgumentException("invalid NSAP address " + address); } } void rrFromWire(DNSInput in) throws IOException { address = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { String addr = st.getString(); this.address = checkAndConvertAddress(addr); if (this.address == null) throw st.exception("invalid NSAP address " + addr); } /** * Returns the NSAP address. */ public String getAddress() { return byteArrayToString(address, false); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(address); } String rrToString() { return "0x" + base16.toString(address); } } dnsjava-2.1.5/org/xbill/DNS/NSAP_PTRRecord.java100644 0 0 1404 11254312416 16107 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * NSAP Pointer Record - maps a domain name representing an NSAP Address to * a hostname. * * @author Brian Wellington */ public class NSAP_PTRRecord extends SingleNameBase { private static final long serialVersionUID = 2386284746382064904L; NSAP_PTRRecord() {} Record getObject() { return new NSAP_PTRRecord(); } /** * Creates a new NSAP_PTR Record with the given data * @param target The name of the host with this address */ public NSAP_PTRRecord(Name name, int dclass, long ttl, Name target) { super(name, Type.NSAP_PTR, dclass, ttl, target, "target"); } /** Gets the target of the NSAP_PTR Record */ public Name getTarget() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/NSEC3PARAMRecord.java100644 0 0 7040 11257277311 16226 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.IOException; import java.security.NoSuchAlgorithmException; import org.xbill.DNS.utils.base16; /** * Next SECure name 3 Parameters - this record contains the parameters (hash * algorithm, salt, iterations) used for a valid, complete NSEC3 chain present * in a zone. Zones signed using NSEC3 must include this record at the zone apex * to inform authoritative servers that NSEC3 is being used with the given * parameters. * * @author Brian Wellington * @author David Blacka */ public class NSEC3PARAMRecord extends Record { private static final long serialVersionUID = -8689038598776316533L; private int hashAlg; private int flags; private int iterations; private byte salt[]; NSEC3PARAMRecord() {} Record getObject() { return new NSEC3PARAMRecord(); } /** * Creates an NSEC3PARAM record from the given data. * * @param name The ownername of the NSEC3PARAM record (generally the zone name). * @param dclass The class. * @param ttl The TTL. * @param hashAlg The hash algorithm. * @param flags The value of the flags field. * @param iterations The number of hash iterations. * @param salt The salt to use (may be null). */ public NSEC3PARAMRecord(Name name, int dclass, long ttl, int hashAlg, int flags, int iterations, byte [] salt) { super(name, Type.NSEC3PARAM, dclass, ttl); this.hashAlg = checkU8("hashAlg", hashAlg); this.flags = checkU8("flags", flags); this.iterations = checkU16("iterations", iterations); if (salt != null) { if (salt.length > 255) throw new IllegalArgumentException("Invalid salt " + "length"); if (salt.length > 0) { this.salt = new byte[salt.length]; System.arraycopy(salt, 0, this.salt, 0, salt.length); } } } void rrFromWire(DNSInput in) throws IOException { hashAlg = in.readU8(); flags = in.readU8(); iterations = in.readU16(); int salt_length = in.readU8(); if (salt_length > 0) salt = in.readByteArray(salt_length); else salt = null; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(hashAlg); out.writeU8(flags); out.writeU16(iterations); if (salt != null) { out.writeU8(salt.length); out.writeByteArray(salt); } else out.writeU8(0); } void rdataFromString(Tokenizer st, Name origin) throws IOException { hashAlg = st.getUInt8(); flags = st.getUInt8(); iterations = st.getUInt16(); String s = st.getString(); if (s.equals("-")) salt = null; else { st.unget(); salt = st.getHexString(); if (salt.length > 255) throw st.exception("salt value too long"); } } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(hashAlg); sb.append(' '); sb.append(flags); sb.append(' '); sb.append(iterations); sb.append(' '); if (salt == null) sb.append('-'); else sb.append(base16.toString(salt)); return sb.toString(); } /** Returns the hash algorithm */ public int getHashAlgorithm() { return hashAlg; } /** Returns the flags */ public int getFlags() { return flags; } /** Returns the number of iterations */ public int getIterations() { return iterations; } /** Returns the salt */ public byte [] getSalt() { return salt; } /** * Hashes a name with the parameters of this NSEC3PARAM record. * @param name The name to hash * @return The hashed version of the name * @throws NoSuchAlgorithmException The hash algorithm is unknown. */ public byte [] hashName(Name name) throws NoSuchAlgorithmException { return NSEC3Record.hashName(name, hashAlg, iterations, salt); } } dnsjava-2.1.5/org/xbill/DNS/NSEC3Record.java100644 0 0 13054 11361745707 15474 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.security.*; import org.xbill.DNS.utils.*; /** * Next SECure name 3 - this record contains the next hashed name in an * ordered list of hashed names in the zone, and a set of types for which * records exist for this name. The presence of this record in a response * signifies a negative response from a DNSSEC-signed zone. * * This replaces the NSEC and NXT records, when used. * * @author Brian Wellington * @author David Blacka */ public class NSEC3Record extends Record { public static class Flags { /** * NSEC3 flags identifiers. */ private Flags() {} /** Unsigned delegation are not included in the NSEC3 chain. * */ public static final int OPT_OUT = 0x01; } public static class Digest { private Digest() {} /** SHA-1 */ public static final int SHA1 = 1; } public static final int SHA1_DIGEST_ID = Digest.SHA1; private static final long serialVersionUID = -7123504635968932855L; private int hashAlg; private int flags; private int iterations; private byte [] salt; private byte [] next; private TypeBitmap types; private static final base32 b32 = new base32(base32.Alphabet.BASE32HEX, false, false); NSEC3Record() {} Record getObject() { return new NSEC3Record(); } /** * Creates an NSEC3 record from the given data. * * @param name The ownername of the NSEC3 record (base32'd hash plus zonename). * @param dclass The class. * @param ttl The TTL. * @param hashAlg The hash algorithm. * @param flags The value of the flags field. * @param iterations The number of hash iterations. * @param salt The salt to use (may be null). * @param next The next hash (may not be null). * @param types The types present at the original ownername. */ public NSEC3Record(Name name, int dclass, long ttl, int hashAlg, int flags, int iterations, byte [] salt, byte [] next, int [] types) { super(name, Type.NSEC3, dclass, ttl); this.hashAlg = checkU8("hashAlg", hashAlg); this.flags = checkU8("flags", flags); this.iterations = checkU16("iterations", iterations); if (salt != null) { if (salt.length > 255) throw new IllegalArgumentException("Invalid salt"); if (salt.length > 0) { this.salt = new byte[salt.length]; System.arraycopy(salt, 0, this.salt, 0, salt.length); } } if (next.length > 255) { throw new IllegalArgumentException("Invalid next hash"); } this.next = new byte[next.length]; System.arraycopy(next, 0, this.next, 0, next.length); this.types = new TypeBitmap(types); } void rrFromWire(DNSInput in) throws IOException { hashAlg = in.readU8(); flags = in.readU8(); iterations = in.readU16(); int salt_length = in.readU8(); if (salt_length > 0) salt = in.readByteArray(salt_length); else salt = null; int next_length = in.readU8(); next = in.readByteArray(next_length); types = new TypeBitmap(in); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(hashAlg); out.writeU8(flags); out.writeU16(iterations); if (salt != null) { out.writeU8(salt.length); out.writeByteArray(salt); } else out.writeU8(0); out.writeU8(next.length); out.writeByteArray(next); types.toWire(out); } void rdataFromString(Tokenizer st, Name origin) throws IOException { hashAlg = st.getUInt8(); flags = st.getUInt8(); iterations = st.getUInt16(); String s = st.getString(); if (s.equals("-")) salt = null; else { st.unget(); salt = st.getHexString(); if (salt.length > 255) throw st.exception("salt value too long"); } next = st.getBase32String(b32); types = new TypeBitmap(st); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(hashAlg); sb.append(' '); sb.append(flags); sb.append(' '); sb.append(iterations); sb.append(' '); if (salt == null) sb.append('-'); else sb.append(base16.toString(salt)); sb.append(' '); sb.append(b32.toString(next)); if (!types.empty()) { sb.append(' '); sb.append(types.toString()); } return sb.toString(); } /** Returns the hash algorithm */ public int getHashAlgorithm() { return hashAlg; } /** Returns the flags */ public int getFlags() { return flags; } /** Returns the number of iterations */ public int getIterations() { return iterations; } /** Returns the salt */ public byte [] getSalt() { return salt; } /** Returns the next hash */ public byte [] getNext() { return next; } /** Returns the set of types defined for this name */ public int [] getTypes() { return types.toArray(); } /** Returns whether a specific type is in the set of types. */ public boolean hasType(int type) { return types.contains(type); } static byte [] hashName(Name name, int hashAlg, int iterations, byte [] salt) throws NoSuchAlgorithmException { MessageDigest digest; switch (hashAlg) { case Digest.SHA1: digest = MessageDigest.getInstance("sha-1"); break; default: throw new NoSuchAlgorithmException("Unknown NSEC3 algorithm" + "identifier: " + hashAlg); } byte [] hash = null; for (int i = 0; i <= iterations; i++) { digest.reset(); if (i == 0) digest.update(name.toWireCanonical()); else digest.update(hash); if (salt != null) digest.update(salt); hash = digest.digest(); } return hash; } /** * Hashes a name with the parameters of this NSEC3 record. * @param name The name to hash * @return The hashed version of the name * @throws NoSuchAlgorithmException The hash algorithm is unknown. */ public byte [] hashName(Name name) throws NoSuchAlgorithmException { return hashName(name, hashAlg, iterations, salt); } } dnsjava-2.1.5/org/xbill/DNS/NSECRecord.java100644 0 0 4017 11254312416 15354 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Next SECure name - this record contains the following name in an * ordered list of names in the zone, and a set of types for which * records exist for this name. The presence of this record in a response * signifies a negative response from a DNSSEC-signed zone. * * This replaces the NXT record. * * @author Brian Wellington * @author David Blacka */ public class NSECRecord extends Record { private static final long serialVersionUID = -5165065768816265385L; private Name next; private TypeBitmap types; NSECRecord() {} Record getObject() { return new NSECRecord(); } /** * Creates an NSEC Record from the given data. * @param next The following name in an ordered list of the zone * @param types An array containing the types present. */ public NSECRecord(Name name, int dclass, long ttl, Name next, int [] types) { super(name, Type.NSEC, dclass, ttl); this.next = checkName("next", next); for (int i = 0; i < types.length; i++) { Type.check(types[i]); } this.types = new TypeBitmap(types); } void rrFromWire(DNSInput in) throws IOException { next = new Name(in); types = new TypeBitmap(in); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { // Note: The next name is not lowercased. next.toWire(out, null, false); types.toWire(out); } void rdataFromString(Tokenizer st, Name origin) throws IOException { next = st.getName(origin); types = new TypeBitmap(st); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(next); if (!types.empty()) { sb.append(' '); sb.append(types.toString()); } return sb.toString(); } /** Returns the next name */ public Name getNext() { return next; } /** Returns the set of types defined for this name */ public int [] getTypes() { return types.toArray(); } /** Returns whether a specific type is in the set of types. */ public boolean hasType(int type) { return types.contains(type); } } dnsjava-2.1.5/org/xbill/DNS/NSIDOption.java100644 0 0 1024 11562373127 15416 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * The Name Server Identifier Option, define in RFC 5001. * * @see OPTRecord * * @author Brian Wellington */ public class NSIDOption extends GenericEDNSOption { private static final long serialVersionUID = 74739759292589056L; NSIDOption() { super(EDNSOption.Code.NSID); } /** * Construct an NSID option. * @param data The contents of the option. */ public NSIDOption(byte [] data) { super(EDNSOption.Code.NSID, data); } } dnsjava-2.1.5/org/xbill/DNS/NSRecord.java100644 0 0 1414 11254312416 15142 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Name Server Record - contains the name server serving the named zone * * @author Brian Wellington */ public class NSRecord extends SingleCompressedNameBase { private static final long serialVersionUID = 487170758138268838L; NSRecord() {} Record getObject() { return new NSRecord(); } /** * Creates a new NS Record with the given data * @param target The name server for the given domain */ public NSRecord(Name name, int dclass, long ttl, Name target) { super(name, Type.NS, dclass, ttl, target, "target"); } /** Gets the target of the NS Record */ public Name getTarget() { return getSingleName(); } public Name getAdditionalName() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/NULLRecord.java100644 0 0 2304 11254312416 15373 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * The NULL Record. This has no defined purpose, but can be used to * hold arbitrary data. * * @author Brian Wellington */ public class NULLRecord extends Record { private static final long serialVersionUID = -5796493183235216538L; private byte [] data; NULLRecord() {} Record getObject() { return new NULLRecord(); } /** * Creates a NULL record from the given data. * @param data The contents of the record. */ public NULLRecord(Name name, int dclass, long ttl, byte [] data) { super(name, Type.NULL, dclass, ttl); if (data.length > 0xFFFF) { throw new IllegalArgumentException("data must be <65536 bytes"); } this.data = data; } void rrFromWire(DNSInput in) throws IOException { data = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { throw st.exception("no defined text format for NULL records"); } String rrToString() { return unknownToString(data); } /** Returns the contents of this record. */ public byte [] getData() { return data; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(data); } } dnsjava-2.1.5/org/xbill/DNS/NXTRecord.java100644 0 0 4617 11254312416 15303 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * Next name - this record contains the following name in an ordered list * of names in the zone, and a set of types for which records exist for * this name. The presence of this record in a response signifies a * failed query for data in a DNSSEC-signed zone. * * @author Brian Wellington */ public class NXTRecord extends Record { private static final long serialVersionUID = -8851454400765507520L; private Name next; private BitSet bitmap; NXTRecord() {} Record getObject() { return new NXTRecord(); } /** * Creates an NXT Record from the given data * @param next The following name in an ordered list of the zone * @param bitmap The set of type for which records exist at this name */ public NXTRecord(Name name, int dclass, long ttl, Name next, BitSet bitmap) { super(name, Type.NXT, dclass, ttl); this.next = checkName("next", next); this.bitmap = bitmap; } void rrFromWire(DNSInput in) throws IOException { next = new Name(in); bitmap = new BitSet(); int bitmapLength = in.remaining(); for (int i = 0; i < bitmapLength; i++) { int t = in.readU8(); for (int j = 0; j < 8; j++) if ((t & (1 << (7 - j))) != 0) bitmap.set(i * 8 + j); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { next = st.getName(origin); bitmap = new BitSet(); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; int typecode = Type.value(t.value, true); if (typecode <= 0 || typecode > 128) throw st.exception("Invalid type: " + t.value); bitmap.set(typecode); } st.unget(); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(next); int length = bitmap.length(); for (short i = 0; i < length; i++) if (bitmap.get(i)) { sb.append(" "); sb.append(Type.string(i)); } return sb.toString(); } /** Returns the next name */ public Name getNext() { return next; } /** Returns the set of types defined for this name */ public BitSet getBitmap() { return bitmap; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { next.toWire(out, null, canonical); int length = bitmap.length(); for (int i = 0, t = 0; i < length; i++) { t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0); if (i % 8 == 7 || i == length - 1) { out.writeU8(t); t = 0; } } } } dnsjava-2.1.5/org/xbill/DNS/Name.java100644 0 0 51411 12110757404 14367 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.text.*; /** * A representation of a domain name. It may either be absolute (fully * qualified) or relative. * * @author Brian Wellington */ public class Name implements Comparable, Serializable { private static final long serialVersionUID = -7257019940971525644L; private static final int LABEL_NORMAL = 0; private static final int LABEL_COMPRESSION = 0xC0; private static final int LABEL_MASK = 0xC0; /* The name data */ private byte [] name; /* * Effectively an 8 byte array, where the low order byte stores the number * of labels and the 7 higher order bytes store per-label offsets. */ private long offsets; /* Precomputed hashcode. */ private int hashcode; private static final byte [] emptyLabel = new byte[] {(byte)0}; private static final byte [] wildLabel = new byte[] {(byte)1, (byte)'*'}; /** The root name */ public static final Name root; /** The root name */ public static final Name empty; /** The maximum length of a Name */ private static final int MAXNAME = 255; /** The maximum length of a label a Name */ private static final int MAXLABEL = 63; /** The maximum number of labels in a Name */ private static final int MAXLABELS = 128; /** The maximum number of cached offsets */ private static final int MAXOFFSETS = 7; /* Used for printing non-printable characters */ private static final DecimalFormat byteFormat = new DecimalFormat(); /* Used to efficiently convert bytes to lowercase */ private static final byte lowercase[] = new byte[256]; /* Used in wildcard names. */ private static final Name wild; static { byteFormat.setMinimumIntegerDigits(3); for (int i = 0; i < lowercase.length; i++) { if (i < 'A' || i > 'Z') lowercase[i] = (byte)i; else lowercase[i] = (byte)(i - 'A' + 'a'); } root = new Name(); root.appendSafe(emptyLabel, 0, 1); empty = new Name(); empty.name = new byte[0]; wild = new Name(); wild.appendSafe(wildLabel, 0, 1); } private Name() { } private final void setoffset(int n, int offset) { if (n >= MAXOFFSETS) return; int shift = 8 * (7 - n); offsets &= (~(0xFFL << shift)); offsets |= ((long)offset << shift); } private final int offset(int n) { if (n == 0 && getlabels() == 0) return 0; if (n < 0 || n >= getlabels()) throw new IllegalArgumentException("label out of range"); if (n < MAXOFFSETS) { int shift = 8 * (7 - n); return ((int)(offsets >>> shift) & 0xFF); } else { int pos = offset(MAXOFFSETS - 1); for (int i = MAXOFFSETS - 1; i < n; i++) pos += (name[pos] + 1); return (pos); } } private final void setlabels(int labels) { offsets &= ~(0xFF); offsets |= labels; } private final int getlabels() { return (int)(offsets & 0xFF); } private static final void copy(Name src, Name dst) { if (src.offset(0) == 0) { dst.name = src.name; dst.offsets = src.offsets; } else { int offset0 = src.offset(0); int namelen = src.name.length - offset0; int labels = src.labels(); dst.name = new byte[namelen]; System.arraycopy(src.name, offset0, dst.name, 0, namelen); for (int i = 0; i < labels && i < MAXOFFSETS; i++) dst.setoffset(i, src.offset(i) - offset0); dst.setlabels(labels); } } private final void append(byte [] array, int start, int n) throws NameTooLongException { int length = (name == null ? 0 : (name.length - offset(0))); int alength = 0; for (int i = 0, pos = start; i < n; i++) { int len = array[pos]; if (len > MAXLABEL) throw new IllegalStateException("invalid label"); len++; pos += len; alength += len; } int newlength = length + alength; if (newlength > MAXNAME) throw new NameTooLongException(); int labels = getlabels(); int newlabels = labels + n; if (newlabels > MAXLABELS) throw new IllegalStateException("too many labels"); byte [] newname = new byte[newlength]; if (length != 0) System.arraycopy(name, offset(0), newname, 0, length); System.arraycopy(array, start, newname, length, alength); name = newname; for (int i = 0, pos = length; i < n; i++) { setoffset(labels + i, pos); pos += (newname[pos] + 1); } setlabels(newlabels); } private static TextParseException parseException(String str, String message) { return new TextParseException("'" + str + "': " + message); } private final void appendFromString(String fullName, byte [] array, int start, int n) throws TextParseException { try { append(array, start, n); } catch (NameTooLongException e) { throw parseException(fullName, "Name too long"); } } private final void appendSafe(byte [] array, int start, int n) { try { append(array, start, n); } catch (NameTooLongException e) { } } /** * Create a new name from a string and an origin. This does not automatically * make the name absolute; it will be absolute if it has a trailing dot or an * absolute origin is appended. * @param s The string to be converted * @param origin If the name is not absolute, the origin to be appended. * @throws TextParseException The name is invalid. */ public Name(String s, Name origin) throws TextParseException { if (s.equals("")) throw parseException(s, "empty name"); else if (s.equals("@")) { if (origin == null) copy(empty, this); else copy(origin, this); return; } else if (s.equals(".")) { copy(root, this); return; } int labelstart = -1; int pos = 1; byte [] label = new byte[MAXLABEL + 1]; boolean escaped = false; int digits = 0; int intval = 0; boolean absolute = false; for (int i = 0; i < s.length(); i++) { byte b = (byte) s.charAt(i); if (escaped) { if (b >= '0' && b <= '9' && digits < 3) { digits++; intval *= 10; intval += (b - '0'); if (intval > 255) throw parseException(s, "bad escape"); if (digits < 3) continue; b = (byte) intval; } else if (digits > 0 && digits < 3) throw parseException(s, "bad escape"); if (pos > MAXLABEL) throw parseException(s, "label too long"); labelstart = pos; label[pos++] = b; escaped = false; } else if (b == '\\') { escaped = true; digits = 0; intval = 0; } else if (b == '.') { if (labelstart == -1) throw parseException(s, "invalid empty label"); label[0] = (byte)(pos - 1); appendFromString(s, label, 0, 1); labelstart = -1; pos = 1; } else { if (labelstart == -1) labelstart = i; if (pos > MAXLABEL) throw parseException(s, "label too long"); label[pos++] = b; } } if (digits > 0 && digits < 3) throw parseException(s, "bad escape"); if (escaped) throw parseException(s, "bad escape"); if (labelstart == -1) { appendFromString(s, emptyLabel, 0, 1); absolute = true; } else { label[0] = (byte)(pos - 1); appendFromString(s, label, 0, 1); } if (origin != null && !absolute) appendFromString(s, origin.name, 0, origin.getlabels()); } /** * Create a new name from a string. This does not automatically make the name * absolute; it will be absolute if it has a trailing dot. * @param s The string to be converted * @throws TextParseException The name is invalid. */ public Name(String s) throws TextParseException { this(s, null); } /** * Create a new name from a string and an origin. This does not automatically * make the name absolute; it will be absolute if it has a trailing dot or an * absolute origin is appended. This is identical to the constructor, except * that it will avoid creating new objects in some cases. * @param s The string to be converted * @param origin If the name is not absolute, the origin to be appended. * @throws TextParseException The name is invalid. */ public static Name fromString(String s, Name origin) throws TextParseException { if (s.equals("@") && origin != null) return origin; else if (s.equals(".")) return (root); return new Name(s, origin); } /** * Create a new name from a string. This does not automatically make the name * absolute; it will be absolute if it has a trailing dot. This is identical * to the constructor, except that it will avoid creating new objects in some * cases. * @param s The string to be converted * @throws TextParseException The name is invalid. */ public static Name fromString(String s) throws TextParseException { return fromString(s, null); } /** * Create a new name from a constant string. This should only be used when the name is known to be good - that is, when it is constant. * @param s The string to be converted * @throws IllegalArgumentException The name is invalid. */ public static Name fromConstantString(String s) { try { return fromString(s, null); } catch (TextParseException e) { throw new IllegalArgumentException("Invalid name '" + s + "'"); } } /** * Create a new name from DNS a wire format message * @param in A stream containing the DNS message which is currently * positioned at the start of the name to be read. */ public Name(DNSInput in) throws WireParseException { int len, pos; boolean done = false; byte [] label = new byte[MAXLABEL + 1]; boolean savedState = false; while (!done) { len = in.readU8(); switch (len & LABEL_MASK) { case LABEL_NORMAL: if (getlabels() >= MAXLABELS) throw new WireParseException("too many labels"); if (len == 0) { append(emptyLabel, 0, 1); done = true; } else { label[0] = (byte)len; in.readByteArray(label, 1, len); append(label, 0, 1); } break; case LABEL_COMPRESSION: pos = in.readU8(); pos += ((len & ~LABEL_MASK) << 8); if (Options.check("verbosecompression")) System.err.println("currently " + in.current() + ", pointer to " + pos); if (pos >= in.current() - 2) throw new WireParseException("bad compression"); if (!savedState) { in.save(); savedState = true; } in.jump(pos); if (Options.check("verbosecompression")) System.err.println("current name '" + this + "', seeking to " + pos); break; default: throw new WireParseException("bad label type"); } } if (savedState) { in.restore(); } } /** * Create a new name from DNS wire format * @param b A byte array containing the wire format of the name. */ public Name(byte [] b) throws IOException { this(new DNSInput(b)); } /** * Create a new name by removing labels from the beginning of an existing Name * @param src An existing Name * @param n The number of labels to remove from the beginning in the copy */ public Name(Name src, int n) { int slabels = src.labels(); if (n > slabels) throw new IllegalArgumentException("attempted to remove too " + "many labels"); name = src.name; setlabels(slabels - n); for (int i = 0; i < MAXOFFSETS && i < slabels - n; i++) setoffset(i, src.offset(i + n)); } /** * Creates a new name by concatenating two existing names. * @param prefix The prefix name. * @param suffix The suffix name. * @return The concatenated name. * @throws NameTooLongException The name is too long. */ public static Name concatenate(Name prefix, Name suffix) throws NameTooLongException { if (prefix.isAbsolute()) return (prefix); Name newname = new Name(); copy(prefix, newname); newname.append(suffix.name, suffix.offset(0), suffix.getlabels()); return newname; } /** * If this name is a subdomain of origin, return a new name relative to * origin with the same value. Otherwise, return the existing name. * @param origin The origin to remove. * @return The possibly relativized name. */ public Name relativize(Name origin) { if (origin == null || !subdomain(origin)) return this; Name newname = new Name(); copy(this, newname); int length = length() - origin.length(); int labels = newname.labels() - origin.labels(); newname.setlabels(labels); newname.name = new byte[length]; System.arraycopy(name, offset(0), newname.name, 0, length); return newname; } /** * Generates a new Name with the first n labels replaced by a wildcard * @return The wildcard name */ public Name wild(int n) { if (n < 1) throw new IllegalArgumentException("must replace 1 or more " + "labels"); try { Name newname = new Name(); copy(wild, newname); newname.append(name, offset(n), getlabels() - n); return newname; } catch (NameTooLongException e) { throw new IllegalStateException ("Name.wild: concatenate failed"); } } /** * Returns a canonicalized version of the Name (all lowercase). This may be * the same name, if the input Name is already canonical. */ public Name canonicalize() { boolean canonical = true; for (int i = 0; i < name.length; i++) { if (lowercase[name[i] & 0xFF] != name[i]) { canonical = false; break; } } if (canonical) return this; Name newname = new Name(); newname.appendSafe(name, offset(0), getlabels()); for (int i = 0; i < newname.name.length; i++) newname.name[i] = lowercase[newname.name[i] & 0xFF]; return newname; } /** * Generates a new Name to be used when following a DNAME. * @param dname The DNAME record to follow. * @return The constructed name. * @throws NameTooLongException The resulting name is too long. */ public Name fromDNAME(DNAMERecord dname) throws NameTooLongException { Name dnameowner = dname.getName(); Name dnametarget = dname.getTarget(); if (!subdomain(dnameowner)) return null; int plabels = labels() - dnameowner.labels(); int plength = length() - dnameowner.length(); int pstart = offset(0); int dlabels = dnametarget.labels(); int dlength = dnametarget.length(); if (plength + dlength > MAXNAME) throw new NameTooLongException(); Name newname = new Name(); newname.setlabels(plabels + dlabels); newname.name = new byte[plength + dlength]; System.arraycopy(name, pstart, newname.name, 0, plength); System.arraycopy(dnametarget.name, 0, newname.name, plength, dlength); for (int i = 0, pos = 0; i < MAXOFFSETS && i < plabels + dlabels; i++) { newname.setoffset(i, pos); pos += (newname.name[pos] + 1); } return newname; } /** * Is this name a wildcard? */ public boolean isWild() { if (labels() == 0) return false; return (name[0] == (byte)1 && name[1] == (byte)'*'); } /** * Is this name absolute? */ public boolean isAbsolute() { if (labels() == 0) return false; return (name[name.length - 1] == 0); } /** * The length of the name. */ public short length() { if (getlabels() == 0) return 0; return (short)(name.length - offset(0)); } /** * The number of labels in the name. */ public int labels() { return getlabels(); } /** * Is the current Name a subdomain of the specified name? */ public boolean subdomain(Name domain) { int labels = labels(); int dlabels = domain.labels(); if (dlabels > labels) return false; if (dlabels == labels) return equals(domain); return domain.equals(name, offset(labels - dlabels)); } private String byteString(byte [] array, int pos) { StringBuffer sb = new StringBuffer(); int len = array[pos++]; for (int i = pos; i < pos + len; i++) { int b = array[i] & 0xFF; if (b <= 0x20 || b >= 0x7f) { sb.append('\\'); sb.append(byteFormat.format(b)); } else if (b == '"' || b == '(' || b == ')' || b == '.' || b == ';' || b == '\\' || b == '@' || b == '$') { sb.append('\\'); sb.append((char)b); } else sb.append((char)b); } return sb.toString(); } /** * Convert a Name to a String * @param omitFinalDot If true, and the name is absolute, omit the final dot. * @return The representation of this name as a (printable) String. */ public String toString(boolean omitFinalDot) { int labels = labels(); if (labels == 0) return "@"; else if (labels == 1 && name[offset(0)] == 0) return "."; StringBuffer sb = new StringBuffer(); for (int i = 0, pos = offset(0); i < labels; i++) { int len = name[pos]; if (len > MAXLABEL) throw new IllegalStateException("invalid label"); if (len == 0) { if (!omitFinalDot) sb.append('.'); break; } if (i > 0) sb.append('.'); sb.append(byteString(name, pos)); pos += (1 + len); } return sb.toString(); } /** * Convert a Name to a String * @return The representation of this name as a (printable) String. */ public String toString() { return toString(false); } /** * Retrieve the nth label of a Name. This makes a copy of the label; changing * this does not change the Name. * @param n The label to be retrieved. The first label is 0. */ public byte [] getLabel(int n) { int pos = offset(n); byte len = (byte)(name[pos] + 1); byte [] label = new byte[len]; System.arraycopy(name, pos, label, 0, len); return label; } /** * Convert the nth label in a Name to a String * @param n The label to be converted to a (printable) String. The first * label is 0. */ public String getLabelString(int n) { int pos = offset(n); return byteString(name, pos); } /** * Emit a Name in DNS wire format * @param out The output stream containing the DNS message. * @param c The compression context, or null of no compression is desired. * @throws IllegalArgumentException The name is not absolute. */ public void toWire(DNSOutput out, Compression c) { if (!isAbsolute()) throw new IllegalArgumentException("toWire() called on " + "non-absolute name"); int labels = labels(); for (int i = 0; i < labels - 1; i++) { Name tname; if (i == 0) tname = this; else tname = new Name(this, i); int pos = -1; if (c != null) pos = c.get(tname); if (pos >= 0) { pos |= (LABEL_MASK << 8); out.writeU16(pos); return; } else { if (c != null) c.add(out.current(), tname); int off = offset(i); out.writeByteArray(name, off, name[off] + 1); } } out.writeU8(0); } /** * Emit a Name in DNS wire format * @throws IllegalArgumentException The name is not absolute. */ public byte [] toWire() { DNSOutput out = new DNSOutput(); toWire(out, null); return out.toByteArray(); } /** * Emit a Name in canonical DNS wire format (all lowercase) * @param out The output stream to which the message is written. */ public void toWireCanonical(DNSOutput out) { byte [] b = toWireCanonical(); out.writeByteArray(b); } /** * Emit a Name in canonical DNS wire format (all lowercase) * @return The canonical form of the name. */ public byte [] toWireCanonical() { int labels = labels(); if (labels == 0) return (new byte[0]); byte [] b = new byte[name.length - offset(0)]; for (int i = 0, spos = offset(0), dpos = 0; i < labels; i++) { int len = name[spos]; if (len > MAXLABEL) throw new IllegalStateException("invalid label"); b[dpos++] = name[spos++]; for (int j = 0; j < len; j++) b[dpos++] = lowercase[(name[spos++] & 0xFF)]; } return b; } /** * Emit a Name in DNS wire format * @param out The output stream containing the DNS message. * @param c The compression context, or null of no compression is desired. * @param canonical If true, emit the name in canonicalized form * (all lowercase). * @throws IllegalArgumentException The name is not absolute. */ public void toWire(DNSOutput out, Compression c, boolean canonical) { if (canonical) toWireCanonical(out); else toWire(out, c); } private final boolean equals(byte [] b, int bpos) { int labels = labels(); for (int i = 0, pos = offset(0); i < labels; i++) { if (name[pos] != b[bpos]) return false; int len = name[pos++]; bpos++; if (len > MAXLABEL) throw new IllegalStateException("invalid label"); for (int j = 0; j < len; j++) if (lowercase[(name[pos++] & 0xFF)] != lowercase[(b[bpos++] & 0xFF)]) return false; } return true; } /** * Are these two Names equivalent? */ public boolean equals(Object arg) { if (arg == this) return true; if (arg == null || !(arg instanceof Name)) return false; Name d = (Name) arg; if (d.hashcode == 0) d.hashCode(); if (hashcode == 0) hashCode(); if (d.hashcode != hashcode) return false; if (d.labels() != labels()) return false; return equals(d.name, d.offset(0)); } /** * Computes a hashcode based on the value */ public int hashCode() { if (hashcode != 0) return (hashcode); int code = 0; for (int i = offset(0); i < name.length; i++) code += ((code << 3) + lowercase[(name[i] & 0xFF)]); hashcode = code; return hashcode; } /** * Compares this Name to another Object. * @param o The Object to be compared. * @return The value 0 if the argument is a name equivalent to this name; * a value less than 0 if the argument is less than this name in the canonical * ordering, and a value greater than 0 if the argument is greater than this * name in the canonical ordering. * @throws ClassCastException if the argument is not a Name. */ public int compareTo(Object o) { Name arg = (Name) o; if (this == arg) return (0); int labels = labels(); int alabels = arg.labels(); int compares = labels > alabels ? alabels : labels; for (int i = 1; i <= compares; i++) { int start = offset(labels - i); int astart = arg.offset(alabels - i); int length = name[start]; int alength = arg.name[astart]; for (int j = 0; j < length && j < alength; j++) { int n = lowercase[(name[j + start + 1]) & 0xFF] - lowercase[(arg.name[j + astart + 1]) & 0xFF]; if (n != 0) return (n); } if (length != alength) return (length - alength); } return (labels - alabels); } } dnsjava-2.1.5/org/xbill/DNS/NameTooLongException.java100644 0 0 576 10231125627 17514 0ustar 0 0 // Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when a name is longer than the maximum length of a DNS * name. * * @author Brian Wellington */ public class NameTooLongException extends WireParseException { public NameTooLongException() { super(); } public NameTooLongException(String s) { super(s); } } dnsjava-2.1.5/org/xbill/DNS/OPTRecord.java100644 0 0 11153 11562372215 15312 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * Options - describes Extended DNS (EDNS) properties of a Message. * No specific options are defined other than those specified in the * header. An OPT should be generated by Resolver. * * EDNS is a method to extend the DNS protocol while providing backwards * compatibility and not significantly changing the protocol. This * implementation of EDNS is mostly complete at level 0. * * @see Message * @see Resolver * * @author Brian Wellington */ public class OPTRecord extends Record { private static final long serialVersionUID = -6254521894809367938L; private List options; OPTRecord() {} Record getObject() { return new OPTRecord(); } /** * Creates an OPT Record. This is normally called by SimpleResolver, but can * also be called by a server. * @param payloadSize The size of a packet that can be reassembled on the * sending host. * @param xrcode The value of the extended rcode field. This is the upper * 16 bits of the full rcode. * @param flags Additional message flags. * @param version The EDNS version that this DNS implementation supports. * This should be 0 for dnsjava. * @param options The list of options that comprise the data field. There * are currently no defined options. * @see ExtendedFlags */ public OPTRecord(int payloadSize, int xrcode, int version, int flags, List options) { super(Name.root, Type.OPT, payloadSize, 0); checkU16("payloadSize", payloadSize); checkU8("xrcode", xrcode); checkU8("version", version); checkU16("flags", flags); ttl = ((long)xrcode << 24) + ((long)version << 16) + flags; if (options != null) { this.options = new ArrayList(options); } } /** * Creates an OPT Record with no data. This is normally called by * SimpleResolver, but can also be called by a server. * @param payloadSize The size of a packet that can be reassembled on the * sending host. * @param xrcode The value of the extended rcode field. This is the upper * 16 bits of the full rcode. * @param flags Additional message flags. * @param version The EDNS version that this DNS implementation supports. * This should be 0 for dnsjava. * @see ExtendedFlags */ public OPTRecord(int payloadSize, int xrcode, int version, int flags) { this(payloadSize, xrcode, version, flags, null); } /** * Creates an OPT Record with no data. This is normally called by * SimpleResolver, but can also be called by a server. */ public OPTRecord(int payloadSize, int xrcode, int version) { this(payloadSize, xrcode, version, 0, null); } void rrFromWire(DNSInput in) throws IOException { if (in.remaining() > 0) options = new ArrayList(); while (in.remaining() > 0) { EDNSOption option = EDNSOption.fromWire(in); options.add(option); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { throw st.exception("no text format defined for OPT"); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); if (options != null) { sb.append(options); sb.append(" "); } sb.append(" ; payload "); sb.append(getPayloadSize()); sb.append(", xrcode "); sb.append(getExtendedRcode()); sb.append(", version "); sb.append(getVersion()); sb.append(", flags "); sb.append(getFlags()); return sb.toString(); } /** Returns the maximum allowed payload size. */ public int getPayloadSize() { return dclass; } /** * Returns the extended Rcode * @see Rcode */ public int getExtendedRcode() { return (int)(ttl >>> 24); } /** Returns the highest supported EDNS version */ public int getVersion() { return (int)((ttl >>> 16) & 0xFF); } /** Returns the EDNS flags */ public int getFlags() { return (int)(ttl & 0xFFFF); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { if (options == null) return; Iterator it = options.iterator(); while (it.hasNext()) { EDNSOption option = (EDNSOption) it.next(); option.toWire(out); } } /** * Gets all options in the OPTRecord. This returns a list of EDNSOptions. */ public List getOptions() { if (options == null) return Collections.EMPTY_LIST; return Collections.unmodifiableList(options); } /** * Gets all options in the OPTRecord with a specific code. This returns a list * of EDNSOptions. */ public List getOptions(int code) { if (options == null) return Collections.EMPTY_LIST; List list = Collections.EMPTY_LIST; for (Iterator it = options.iterator(); it.hasNext(); ) { EDNSOption opt = (EDNSOption) it.next(); if (opt.getCode() == code) { if (list == Collections.EMPTY_LIST) list = new ArrayList(); list.add(opt); } } return list; } } dnsjava-2.1.5/org/xbill/DNS/Opcode.java100644 0 0 2355 10231125627 14701 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to DNS opcodes * * @author Brian Wellington */ public final class Opcode { /** A standard query */ public static final int QUERY = 0; /** An inverse query (deprecated) */ public static final int IQUERY = 1; /** A server status request (not used) */ public static final int STATUS = 2; /** * A message from a primary to a secondary server to initiate a zone transfer */ public static final int NOTIFY = 4; /** A dynamic update message */ public static final int UPDATE = 5; private static Mnemonic opcodes = new Mnemonic("DNS Opcode", Mnemonic.CASE_UPPER); static { opcodes.setMaximum(0xF); opcodes.setPrefix("RESERVED"); opcodes.setNumericAllowed(true); opcodes.add(QUERY, "QUERY"); opcodes.add(IQUERY, "IQUERY"); opcodes.add(STATUS, "STATUS"); opcodes.add(NOTIFY, "NOTIFY"); opcodes.add(UPDATE, "UPDATE"); } private Opcode() {} /** Converts a numeric Opcode into a String */ public static String string(int i) { return opcodes.getText(i); } /** Converts a String representation of an Opcode into its numeric value */ public static int value(String s) { return opcodes.getValue(s); } } dnsjava-2.1.5/org/xbill/DNS/Options.java100644 0 0 5143 10230641751 15121 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * Boolean options:
* bindttl - Print TTLs in BIND format
* multiline - Print records in multiline format
* noprintin - Don't print the class of a record if it's IN
* verbose - Turn on general debugging statements
* verbosemsg - Print all messages sent or received by SimpleResolver
* verbosecompression - Print messages related to name compression
* verbosesec - Print messages related to signature verification
* verbosecache - Print messages related to cache lookups
*
* Valued options:
* tsigfudge=n - Sets the default TSIG fudge value (in seconds)
* sig0validity=n - Sets the default SIG(0) validity period (in seconds)
* * @author Brian Wellington */ public final class Options { private static Map table; static { try { refresh(); } catch (SecurityException e) { } } private Options() {} public static void refresh() { String s = System.getProperty("dnsjava.options"); if (s != null) { StringTokenizer st = new StringTokenizer(s, ","); while (st.hasMoreTokens()) { String token = st.nextToken(); int index = token.indexOf('='); if (index == -1) set(token); else { String option = token.substring(0, index); String value = token.substring(index + 1); set(option, value); } } } } /** Clears all defined options */ public static void clear() { table = null; } /** Sets an option to "true" */ public static void set(String option) { if (table == null) table = new HashMap(); table.put(option.toLowerCase(), "true"); } /** Sets an option to the the supplied value */ public static void set(String option, String value) { if (table == null) table = new HashMap(); table.put(option.toLowerCase(), value.toLowerCase()); } /** Removes an option */ public static void unset(String option) { if (table == null) return; table.remove(option.toLowerCase()); } /** Checks if an option is defined */ public static boolean check(String option) { if (table == null) return false; return (table.get(option.toLowerCase()) != null); } /** Returns the value of an option */ public static String value(String option) { if (table == null) return null; return ((String)table.get(option.toLowerCase())); } /** * Returns the value of an option as an integer, or -1 if not defined. */ public static int intValue(String option) { String s = value(option); if (s != null) { try { int val = Integer.parseInt(s); if (val > 0) return (val); } catch (NumberFormatException e) { } } return (-1); } } dnsjava-2.1.5/org/xbill/DNS/PTRRecord.java100644 0 0 1356 11254312416 15274 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Pointer Record - maps a domain name representing an Internet Address to * a hostname. * * @author Brian Wellington */ public class PTRRecord extends SingleCompressedNameBase { private static final long serialVersionUID = -8321636610425434192L; PTRRecord() {} Record getObject() { return new PTRRecord(); } /** * Creates a new PTR Record with the given data * @param target The name of the machine with this address */ public PTRRecord(Name name, int dclass, long ttl, Name target) { super(name, Type.PTR, dclass, ttl, target, "target"); } /** Gets the target of the PTR Record */ public Name getTarget() { return getSingleName(); } } dnsjava-2.1.5/org/xbill/DNS/PXRecord.java100644 0 0 3570 11254312416 15156 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * X.400 mail mapping record. * * @author Brian Wellington */ public class PXRecord extends Record { private static final long serialVersionUID = 1811540008806660667L; private int preference; private Name map822; private Name mapX400; PXRecord() {} Record getObject() { return new PXRecord(); } /** * Creates an PX Record from the given data * @param preference The preference of this mail address. * @param map822 The RFC 822 component of the mail address. * @param mapX400 The X.400 component of the mail address. */ public PXRecord(Name name, int dclass, long ttl, int preference, Name map822, Name mapX400) { super(name, Type.PX, dclass, ttl); this.preference = checkU16("preference", preference); this.map822 = checkName("map822", map822); this.mapX400 = checkName("mapX400", mapX400); } void rrFromWire(DNSInput in) throws IOException { preference = in.readU16(); map822 = new Name(in); mapX400 = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { preference = st.getUInt16(); map822 = st.getName(origin); mapX400 = st.getName(origin); } /** Converts the PX Record to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(preference); sb.append(" "); sb.append(map822); sb.append(" "); sb.append(mapX400); return sb.toString(); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(preference); map822.toWire(out, null, canonical); mapX400.toWire(out, null, canonical); } /** Gets the preference of the route. */ public int getPreference() { return preference; } /** Gets the RFC 822 component of the mail address. */ public Name getMap822() { return map822; } /** Gets the X.400 component of the mail address. */ public Name getMapX400() { return mapX400; } } dnsjava-2.1.5/org/xbill/DNS/RPRecord.java100644 0 0 3254 11254312416 15147 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Responsible Person Record - lists the mail address of a responsible person * and a domain where TXT records are available. * * @author Tom Scola * @author Brian Wellington */ public class RPRecord extends Record { private static final long serialVersionUID = 8124584364211337460L; private Name mailbox; private Name textDomain; RPRecord() {} Record getObject() { return new RPRecord(); } /** * Creates an RP Record from the given data * @param mailbox The responsible person * @param textDomain The address where TXT records can be found */ public RPRecord(Name name, int dclass, long ttl, Name mailbox, Name textDomain) { super(name, Type.RP, dclass, ttl); this.mailbox = checkName("mailbox", mailbox); this.textDomain = checkName("textDomain", textDomain); } void rrFromWire(DNSInput in) throws IOException { mailbox = new Name(in); textDomain = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { mailbox = st.getName(origin); textDomain = st.getName(origin); } /** Converts the RP Record to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(mailbox); sb.append(" "); sb.append(textDomain); return sb.toString(); } /** Gets the mailbox address of the RP Record */ public Name getMailbox() { return mailbox; } /** Gets the text domain info of the RP Record */ public Name getTextDomain() { return textDomain; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { mailbox.toWire(out, null, canonical); textDomain.toWire(out, null, canonical); } } dnsjava-2.1.5/org/xbill/DNS/RRSIGRecord.java100644 0 0 2643 11254312416 15515 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * Recource Record Signature - An RRSIG provides the digital signature of an * RRset, so that the data can be authenticated by a DNSSEC-capable resolver. * The signature is generated by a key contained in a DNSKEY Record. * @see RRset * @see DNSSEC * @see KEYRecord * * @author Brian Wellington */ public class RRSIGRecord extends SIGBase { private static final long serialVersionUID = -2609150673537226317L; RRSIGRecord() {} Record getObject() { return new RRSIGRecord(); } /** * Creates an RRSIG Record from the given data * @param covered The RRset type covered by this signature * @param alg The cryptographic algorithm of the key that generated the * signature * @param origttl The original TTL of the RRset * @param expire The time at which the signature expires * @param timeSigned The time at which this signature was generated * @param footprint The footprint/key id of the signing key. * @param signer The owner of the signing key * @param signature Binary data representing the signature */ public RRSIGRecord(Name name, int dclass, long ttl, int covered, int alg, long origttl, Date expire, Date timeSigned, int footprint, Name signer, byte [] signature) { super(name, Type.RRSIG, dclass, ttl, covered, alg, origttl, expire, timeSigned, footprint, signer, signature); } } dnsjava-2.1.5/org/xbill/DNS/RRset.java100644 0 0 11507 11256272724 14557 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.Serializable; import java.util.*; /** * A set of Records with the same name, type, and class. Also included * are all RRSIG records signing the data records. * @see Record * @see RRSIGRecord * * @author Brian Wellington */ public class RRset implements Serializable { private static final long serialVersionUID = -3270249290171239695L; /* * rrs contains both normal and RRSIG records, with the RRSIG records * at the end. */ private List rrs; private short nsigs; private short position; /** Creates an empty RRset */ public RRset() { rrs = new ArrayList(1); nsigs = 0; position = 0; } /** Creates an RRset and sets its contents to the specified record */ public RRset(Record record) { this(); safeAddRR(record); } /** Creates an RRset with the contents of an existing RRset */ public RRset(RRset rrset) { synchronized (rrset) { rrs = (List) ((ArrayList)rrset.rrs).clone(); nsigs = rrset.nsigs; position = rrset.position; } } private void safeAddRR(Record r) { if (!(r instanceof RRSIGRecord)) { if (nsigs == 0) rrs.add(r); else rrs.add(rrs.size() - nsigs, r); } else { rrs.add(r); nsigs++; } } /** Adds a Record to an RRset */ public synchronized void addRR(Record r) { if (rrs.size() == 0) { safeAddRR(r); return; } Record first = first(); if (!r.sameRRset(first)) throw new IllegalArgumentException("record does not match " + "rrset"); if (r.getTTL() != first.getTTL()) { if (r.getTTL() > first.getTTL()) { r = r.cloneRecord(); r.setTTL(first.getTTL()); } else { for (int i = 0; i < rrs.size(); i++) { Record tmp = (Record) rrs.get(i); tmp = tmp.cloneRecord(); tmp.setTTL(r.getTTL()); rrs.set(i, tmp); } } } if (!rrs.contains(r)) safeAddRR(r); } /** Deletes a Record from an RRset */ public synchronized void deleteRR(Record r) { if (rrs.remove(r) && (r instanceof RRSIGRecord)) nsigs--; } /** Deletes all Records from an RRset */ public synchronized void clear() { rrs.clear(); position = 0; nsigs = 0; } private synchronized Iterator iterator(boolean data, boolean cycle) { int size, start, total; total = rrs.size(); if (data) size = total - nsigs; else size = nsigs; if (size == 0) return Collections.EMPTY_LIST.iterator(); if (data) { if (!cycle) start = 0; else { if (position >= size) position = 0; start = position++; } } else { start = total - nsigs; } List list = new ArrayList(size); if (data) { list.addAll(rrs.subList(start, size)); if (start != 0) list.addAll(rrs.subList(0, start)); } else { list.addAll(rrs.subList(start, total)); } return list.iterator(); } /** * Returns an Iterator listing all (data) records. * @param cycle If true, cycle through the records so that each Iterator will * start with a different record. */ public synchronized Iterator rrs(boolean cycle) { return iterator(true, cycle); } /** * Returns an Iterator listing all (data) records. This cycles through * the records, so each Iterator will start with a different record. */ public synchronized Iterator rrs() { return iterator(true, true); } /** Returns an Iterator listing all signature records */ public synchronized Iterator sigs() { return iterator(false, false); } /** Returns the number of (data) records */ public synchronized int size() { return rrs.size() - nsigs; } /** * Returns the name of the records * @see Name */ public Name getName() { return first().getName(); } /** * Returns the type of the records * @see Type */ public int getType() { return first().getRRsetType(); } /** * Returns the class of the records * @see DClass */ public int getDClass() { return first().getDClass(); } /** Returns the ttl of the records */ public synchronized long getTTL() { return first().getTTL(); } /** * Returns the first record * @throws IllegalStateException if the rrset is empty */ public synchronized Record first() { if (rrs.size() == 0) throw new IllegalStateException("rrset is empty"); return (Record) rrs.get(0); } private String iteratorToString(Iterator it) { StringBuffer sb = new StringBuffer(); while (it.hasNext()) { Record rr = (Record) it.next(); sb.append("["); sb.append(rr.rdataToString()); sb.append("]"); if (it.hasNext()) sb.append(" "); } return sb.toString(); } /** Converts the RRset to a String */ public String toString() { if (rrs == null) return ("{empty}"); StringBuffer sb = new StringBuffer(); sb.append("{ "); sb.append(getName() + " "); sb.append(getTTL() + " "); sb.append(DClass.string(getDClass()) + " "); sb.append(Type.string(getType()) + " "); sb.append(iteratorToString(iterator(true, false))); if (nsigs > 0) { sb.append(" sigs: "); sb.append(iteratorToString(iterator(false, false))); } sb.append(" }"); return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/RTRecord.java100644 0 0 1761 11254312416 15154 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Route Through Record - lists a route preference and intermediate host. * * @author Brian Wellington */ public class RTRecord extends U16NameBase { private static final long serialVersionUID = -3206215651648278098L; RTRecord() {} Record getObject() { return new RTRecord(); } /** * Creates an RT Record from the given data * @param preference The preference of the route. Smaller numbers indicate * more preferred routes. * @param intermediateHost The domain name of the host to use as a router. */ public RTRecord(Name name, int dclass, long ttl, int preference, Name intermediateHost) { super(name, Type.RT, dclass, ttl, preference, "preference", intermediateHost, "intermediateHost"); } /** Gets the preference of the route. */ public int getPreference() { return getU16Field(); } /** Gets the host to use as a router. */ public Name getIntermediateHost() { return getNameField(); } } dnsjava-2.1.5/org/xbill/DNS/Rcode.java100644 0 0 5747 10231125627 14534 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to DNS rcodes (error values) * * @author Brian Wellington */ public final class Rcode { private static Mnemonic rcodes = new Mnemonic("DNS Rcode", Mnemonic.CASE_UPPER); private static Mnemonic tsigrcodes = new Mnemonic("TSIG rcode", Mnemonic.CASE_UPPER); /** No error */ public static final int NOERROR = 0; /** Format error */ public static final int FORMERR = 1; /** Server failure */ public static final int SERVFAIL = 2; /** The name does not exist */ public static final int NXDOMAIN = 3; /** The operation requested is not implemented */ public static final int NOTIMP = 4; /** Deprecated synonym for NOTIMP. */ public static final int NOTIMPL = 4; /** The operation was refused by the server */ public static final int REFUSED = 5; /** The name exists */ public static final int YXDOMAIN = 6; /** The RRset (name, type) exists */ public static final int YXRRSET = 7; /** The RRset (name, type) does not exist */ public static final int NXRRSET = 8; /** The requestor is not authorized to perform this operation */ public static final int NOTAUTH = 9; /** The zone specified is not a zone */ public static final int NOTZONE = 10; /* EDNS extended rcodes */ /** Unsupported EDNS level */ public static final int BADVERS = 16; /* TSIG/TKEY only rcodes */ /** The signature is invalid (TSIG/TKEY extended error) */ public static final int BADSIG = 16; /** The key is invalid (TSIG/TKEY extended error) */ public static final int BADKEY = 17; /** The time is out of range (TSIG/TKEY extended error) */ public static final int BADTIME = 18; /** The mode is invalid (TKEY extended error) */ public static final int BADMODE = 19; static { rcodes.setMaximum(0xFFF); rcodes.setPrefix("RESERVED"); rcodes.setNumericAllowed(true); rcodes.add(NOERROR, "NOERROR"); rcodes.add(FORMERR, "FORMERR"); rcodes.add(SERVFAIL, "SERVFAIL"); rcodes.add(NXDOMAIN, "NXDOMAIN"); rcodes.add(NOTIMP, "NOTIMP"); rcodes.addAlias(NOTIMP, "NOTIMPL"); rcodes.add(REFUSED, "REFUSED"); rcodes.add(YXDOMAIN, "YXDOMAIN"); rcodes.add(YXRRSET, "YXRRSET"); rcodes.add(NXRRSET, "NXRRSET"); rcodes.add(NOTAUTH, "NOTAUTH"); rcodes.add(NOTZONE, "NOTZONE"); rcodes.add(BADVERS, "BADVERS"); tsigrcodes.setMaximum(0xFFFF); tsigrcodes.setPrefix("RESERVED"); tsigrcodes.setNumericAllowed(true); tsigrcodes.addAll(rcodes); tsigrcodes.add(BADSIG, "BADSIG"); tsigrcodes.add(BADKEY, "BADKEY"); tsigrcodes.add(BADTIME, "BADTIME"); tsigrcodes.add(BADMODE, "BADMODE"); } private Rcode() {} /** Converts a numeric Rcode into a String */ public static String string(int i) { return rcodes.getText(i); } /** Converts a numeric TSIG extended Rcode into a String */ public static String TSIGstring(int i) { return tsigrcodes.getText(i); } /** Converts a String representation of an Rcode into its numeric value */ public static int value(String s) { return rcodes.getValue(s); } } dnsjava-2.1.5/org/xbill/DNS/Record.java100644 0 0 42500 11642415751 14731 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.text.*; import java.util.*; import org.xbill.DNS.utils.*; /** * A generic DNS resource record. The specific record types extend this class. * A record contains a name, type, class, ttl, and rdata. * * @author Brian Wellington */ public abstract class Record implements Cloneable, Comparable, Serializable { private static final long serialVersionUID = 2694906050116005466L; protected Name name; protected int type, dclass; protected long ttl; private static final DecimalFormat byteFormat = new DecimalFormat(); static { byteFormat.setMinimumIntegerDigits(3); } protected Record() {} Record(Name name, int type, int dclass, long ttl) { if (!name.isAbsolute()) throw new RelativeNameException(name); Type.check(type); DClass.check(dclass); TTL.check(ttl); this.name = name; this.type = type; this.dclass = dclass; this.ttl = ttl; } /** * Creates an empty record of the correct type; must be overriden */ abstract Record getObject(); private static final Record getEmptyRecord(Name name, int type, int dclass, long ttl, boolean hasData) { Record proto, rec; if (hasData) { proto = Type.getProto(type); if (proto != null) rec = proto.getObject(); else rec = new UNKRecord(); } else rec = new EmptyRecord(); rec.name = name; rec.type = type; rec.dclass = dclass; rec.ttl = ttl; return rec; } /** * Converts the type-specific RR to wire format - must be overriden */ abstract void rrFromWire(DNSInput in) throws IOException; private static Record newRecord(Name name, int type, int dclass, long ttl, int length, DNSInput in) throws IOException { Record rec; rec = getEmptyRecord(name, type, dclass, ttl, in != null); if (in != null) { if (in.remaining() < length) throw new WireParseException("truncated record"); in.setActive(length); rec.rrFromWire(in); if (in.remaining() > 0) throw new WireParseException("invalid record length"); in.clearActive(); } return rec; } /** * Creates a new record, with the given parameters. * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @param length The length of the record's data. * @param data The rdata of the record, in uncompressed DNS wire format. Only * the first length bytes are used. */ public static Record newRecord(Name name, int type, int dclass, long ttl, int length, byte [] data) { if (!name.isAbsolute()) throw new RelativeNameException(name); Type.check(type); DClass.check(dclass); TTL.check(ttl); DNSInput in; if (data != null) in = new DNSInput(data); else in = null; try { return newRecord(name, type, dclass, ttl, length, in); } catch (IOException e) { return null; } } /** * Creates a new record, with the given parameters. * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @param data The complete rdata of the record, in uncompressed DNS wire * format. */ public static Record newRecord(Name name, int type, int dclass, long ttl, byte [] data) { return newRecord(name, type, dclass, ttl, data.length, data); } /** * Creates a new empty record, with the given parameters. * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @return An object of a subclass of Record */ public static Record newRecord(Name name, int type, int dclass, long ttl) { if (!name.isAbsolute()) throw new RelativeNameException(name); Type.check(type); DClass.check(dclass); TTL.check(ttl); return getEmptyRecord(name, type, dclass, ttl, false); } /** * Creates a new empty record, with the given parameters. This method is * designed to create records that will be added to the QUERY section * of a message. * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @return An object of a subclass of Record */ public static Record newRecord(Name name, int type, int dclass) { return newRecord(name, type, dclass, 0); } static Record fromWire(DNSInput in, int section, boolean isUpdate) throws IOException { int type, dclass; long ttl; int length; Name name; Record rec; name = new Name(in); type = in.readU16(); dclass = in.readU16(); if (section == Section.QUESTION) return newRecord(name, type, dclass); ttl = in.readU32(); length = in.readU16(); if (length == 0 && isUpdate && (section == Section.PREREQ || section == Section.UPDATE)) return newRecord(name, type, dclass, ttl); rec = newRecord(name, type, dclass, ttl, length, in); return rec; } static Record fromWire(DNSInput in, int section) throws IOException { return fromWire(in, section, false); } /** * Builds a Record from DNS uncompressed wire format. */ public static Record fromWire(byte [] b, int section) throws IOException { return fromWire(new DNSInput(b), section, false); } void toWire(DNSOutput out, int section, Compression c) { name.toWire(out, c); out.writeU16(type); out.writeU16(dclass); if (section == Section.QUESTION) return; out.writeU32(ttl); int lengthPosition = out.current(); out.writeU16(0); /* until we know better */ rrToWire(out, c, false); int rrlength = out.current() - lengthPosition - 2; out.writeU16At(rrlength, lengthPosition); } /** * Converts a Record into DNS uncompressed wire format. */ public byte [] toWire(int section) { DNSOutput out = new DNSOutput(); toWire(out, section, null); return out.toByteArray(); } private void toWireCanonical(DNSOutput out, boolean noTTL) { name.toWireCanonical(out); out.writeU16(type); out.writeU16(dclass); if (noTTL) { out.writeU32(0); } else { out.writeU32(ttl); } int lengthPosition = out.current(); out.writeU16(0); /* until we know better */ rrToWire(out, null, true); int rrlength = out.current() - lengthPosition - 2; out.writeU16At(rrlength, lengthPosition); } /* * Converts a Record into canonical DNS uncompressed wire format (all names are * converted to lowercase), optionally ignoring the TTL. */ private byte [] toWireCanonical(boolean noTTL) { DNSOutput out = new DNSOutput(); toWireCanonical(out, noTTL); return out.toByteArray(); } /** * Converts a Record into canonical DNS uncompressed wire format (all names are * converted to lowercase). */ public byte [] toWireCanonical() { return toWireCanonical(false); } /** * Converts the rdata in a Record into canonical DNS uncompressed wire format * (all names are converted to lowercase). */ public byte [] rdataToWireCanonical() { DNSOutput out = new DNSOutput(); rrToWire(out, null, true); return out.toByteArray(); } /** * Converts the type-specific RR to text format - must be overriden */ abstract String rrToString(); /** * Converts the rdata portion of a Record into a String representation */ public String rdataToString() { return rrToString(); } /** * Converts a Record into a String representation */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append(name); if (sb.length() < 8) sb.append("\t"); if (sb.length() < 16) sb.append("\t"); sb.append("\t"); if (Options.check("BINDTTL")) sb.append(TTL.format(ttl)); else sb.append(ttl); sb.append("\t"); if (dclass != DClass.IN || !Options.check("noPrintIN")) { sb.append(DClass.string(dclass)); sb.append("\t"); } sb.append(Type.string(type)); String rdata = rrToString(); if (!rdata.equals("")) { sb.append("\t"); sb.append(rdata); } return sb.toString(); } /** * Converts the text format of an RR to the internal format - must be overriden */ abstract void rdataFromString(Tokenizer st, Name origin) throws IOException; /** * Converts a String into a byte array. */ protected static byte [] byteArrayFromString(String s) throws TextParseException { byte [] array = s.getBytes(); boolean escaped = false; boolean hasEscapes = false; for (int i = 0; i < array.length; i++) { if (array[i] == '\\') { hasEscapes = true; break; } } if (!hasEscapes) { if (array.length > 255) { throw new TextParseException("text string too long"); } return array; } ByteArrayOutputStream os = new ByteArrayOutputStream(); int digits = 0; int intval = 0; for (int i = 0; i < array.length; i++) { byte b = array[i]; if (escaped) { if (b >= '0' && b <= '9' && digits < 3) { digits++; intval *= 10; intval += (b - '0'); if (intval > 255) throw new TextParseException ("bad escape"); if (digits < 3) continue; b = (byte) intval; } else if (digits > 0 && digits < 3) throw new TextParseException("bad escape"); os.write(b); escaped = false; } else if (array[i] == '\\') { escaped = true; digits = 0; intval = 0; } else os.write(array[i]); } if (digits > 0 && digits < 3) throw new TextParseException("bad escape"); array = os.toByteArray(); if (array.length > 255) { throw new TextParseException("text string too long"); } return os.toByteArray(); } /** * Converts a byte array into a String. */ protected static String byteArrayToString(byte [] array, boolean quote) { StringBuffer sb = new StringBuffer(); if (quote) sb.append('"'); for (int i = 0; i < array.length; i++) { int b = array[i] & 0xFF; if (b < 0x20 || b >= 0x7f) { sb.append('\\'); sb.append(byteFormat.format(b)); } else if (b == '"' || b == '\\') { sb.append('\\'); sb.append((char)b); } else sb.append((char)b); } if (quote) sb.append('"'); return sb.toString(); } /** * Converts a byte array into the unknown RR format. */ protected static String unknownToString(byte [] data) { StringBuffer sb = new StringBuffer(); sb.append("\\# "); sb.append(data.length); sb.append(" "); sb.append(base16.toString(data)); return sb.toString(); } /** * Builds a new Record from its textual representation * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @param st A tokenizer containing the textual representation of the rdata. * @param origin The default origin to be appended to relative domain names. * @return The new record * @throws IOException The text format was invalid. */ public static Record fromString(Name name, int type, int dclass, long ttl, Tokenizer st, Name origin) throws IOException { Record rec; if (!name.isAbsolute()) throw new RelativeNameException(name); Type.check(type); DClass.check(dclass); TTL.check(ttl); Tokenizer.Token t = st.get(); if (t.type == Tokenizer.IDENTIFIER && t.value.equals("\\#")) { int length = st.getUInt16(); byte [] data = st.getHex(); if (data == null) { data = new byte[0]; } if (length != data.length) throw st.exception("invalid unknown RR encoding: " + "length mismatch"); DNSInput in = new DNSInput(data); return newRecord(name, type, dclass, ttl, length, in); } st.unget(); rec = getEmptyRecord(name, type, dclass, ttl, true); rec.rdataFromString(st, origin); t = st.get(); if (t.type != Tokenizer.EOL && t.type != Tokenizer.EOF) { throw st.exception("unexpected tokens at end of record"); } return rec; } /** * Builds a new Record from its textual representation * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @param s The textual representation of the rdata. * @param origin The default origin to be appended to relative domain names. * @return The new record * @throws IOException The text format was invalid. */ public static Record fromString(Name name, int type, int dclass, long ttl, String s, Name origin) throws IOException { return fromString(name, type, dclass, ttl, new Tokenizer(s), origin); } /** * Returns the record's name * @see Name */ public Name getName() { return name; } /** * Returns the record's type * @see Type */ public int getType() { return type; } /** * Returns the type of RRset that this record would belong to. For all types * except RRSIG, this is equivalent to getType(). * @return The type of record, if not RRSIG. If the type is RRSIG, * the type covered is returned. * @see Type * @see RRset * @see SIGRecord */ public int getRRsetType() { if (type == Type.RRSIG) { RRSIGRecord sig = (RRSIGRecord) this; return sig.getTypeCovered(); } return type; } /** * Returns the record's class */ public int getDClass() { return dclass; } /** * Returns the record's TTL */ public long getTTL() { return ttl; } /** * Converts the type-specific RR to wire format - must be overriden */ abstract void rrToWire(DNSOutput out, Compression c, boolean canonical); /** * Determines if two Records could be part of the same RRset. * This compares the name, type, and class of the Records; the ttl and * rdata are not compared. */ public boolean sameRRset(Record rec) { return (getRRsetType() == rec.getRRsetType() && dclass == rec.dclass && name.equals(rec.name)); } /** * Determines if two Records are identical. This compares the name, type, * class, and rdata (with names canonicalized). The TTLs are not compared. * @param arg The record to compare to * @return true if the records are equal, false otherwise. */ public boolean equals(Object arg) { if (arg == null || !(arg instanceof Record)) return false; Record r = (Record) arg; if (type != r.type || dclass != r.dclass || !name.equals(r.name)) return false; byte [] array1 = rdataToWireCanonical(); byte [] array2 = r.rdataToWireCanonical(); return Arrays.equals(array1, array2); } /** * Generates a hash code based on the Record's data. */ public int hashCode() { byte [] array = toWireCanonical(true); int code = 0; for (int i = 0; i < array.length; i++) code += ((code << 3) + (array[i] & 0xFF)); return code; } Record cloneRecord() { try { return (Record) clone(); } catch (CloneNotSupportedException e) { throw new IllegalStateException(); } } /** * Creates a new record identical to the current record, but with a different * name. This is most useful for replacing the name of a wildcard record. */ public Record withName(Name name) { if (!name.isAbsolute()) throw new RelativeNameException(name); Record rec = cloneRecord(); rec.name = name; return rec; } /** * Creates a new record identical to the current record, but with a different * class and ttl. This is most useful for dynamic update. */ Record withDClass(int dclass, long ttl) { Record rec = cloneRecord(); rec.dclass = dclass; rec.ttl = ttl; return rec; } /* Sets the TTL to the specified value. This is intentionally not public. */ void setTTL(long ttl) { this.ttl = ttl; } /** * Compares this Record to another Object. * @param o The Object to be compared. * @return The value 0 if the argument is a record equivalent to this record; * a value less than 0 if the argument is less than this record in the * canonical ordering, and a value greater than 0 if the argument is greater * than this record in the canonical ordering. The canonical ordering * is defined to compare by name, class, type, and rdata. * @throws ClassCastException if the argument is not a Record. */ public int compareTo(Object o) { Record arg = (Record) o; if (this == arg) return (0); int n = name.compareTo(arg.name); if (n != 0) return (n); n = dclass - arg.dclass; if (n != 0) return (n); n = type - arg.type; if (n != 0) return (n); byte [] rdata1 = rdataToWireCanonical(); byte [] rdata2 = arg.rdataToWireCanonical(); for (int i = 0; i < rdata1.length && i < rdata2.length; i++) { n = (rdata1[i] & 0xFF) - (rdata2[i] & 0xFF); if (n != 0) return (n); } return (rdata1.length - rdata2.length); } /** * Returns the name for which additional data processing should be done * for this record. This can be used both for building responses and * parsing responses. * @return The name to used for additional data processing, or null if this * record type does not require additional data processing. */ public Name getAdditionalName() { return null; } /* Checks that an int contains an unsigned 8 bit value */ static int checkU8(String field, int val) { if (val < 0 || val > 0xFF) throw new IllegalArgumentException("\"" + field + "\" " + val + " must be an unsigned 8 " + "bit value"); return val; } /* Checks that an int contains an unsigned 16 bit value */ static int checkU16(String field, int val) { if (val < 0 || val > 0xFFFF) throw new IllegalArgumentException("\"" + field + "\" " + val + " must be an unsigned 16 " + "bit value"); return val; } /* Checks that a long contains an unsigned 32 bit value */ static long checkU32(String field, long val) { if (val < 0 || val > 0xFFFFFFFFL) throw new IllegalArgumentException("\"" + field + "\" " + val + " must be an unsigned 32 " + "bit value"); return val; } /* Checks that a name is absolute */ static Name checkName(String field, Name name) { if (!name.isAbsolute()) throw new RelativeNameException(name); return name; } static byte [] checkByteArrayLength(String field, byte [] array, int maxLength) { if (array.length > 0xFFFF) throw new IllegalArgumentException("\"" + field + "\" array " + "must have no more than " + maxLength + " elements"); byte [] out = new byte[array.length]; System.arraycopy(array, 0, out, 0, array.length); return out; } } dnsjava-2.1.5/org/xbill/DNS/RelativeNameException.java100644 0 0 721 10231125627 17676 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when a relative name is passed as an argument to * a method requiring an absolute name. * * @author Brian Wellington */ public class RelativeNameException extends IllegalArgumentException { public RelativeNameException(Name name) { super("'" + name + "' is not an absolute name"); } public RelativeNameException(String s) { super(s); } } dnsjava-2.1.5/org/xbill/DNS/ResolveThread.java100644 0 0 1512 7775216774 16240 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * A special-purpose thread used by Resolvers (both SimpleResolver and * ExtendedResolver) to perform asynchronous queries. * * @author Brian Wellington */ class ResolveThread extends Thread { private Message query; private Object id; private ResolverListener listener; private Resolver res; /** Creates a new ResolveThread */ public ResolveThread(Resolver res, Message query, Object id, ResolverListener listener) { this.res = res; this.query = query; this.id = id; this.listener = listener; } /** * Performs the query, and executes the callback. */ public void run() { try { Message response = res.send(query); listener.receiveMessage(id, response); } catch (Exception e) { listener.handleException(id, e); } } } dnsjava-2.1.5/org/xbill/DNS/Resolver.java100644 0 0 5460 10450145255 15273 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * Interface describing a resolver. * * @author Brian Wellington */ public interface Resolver { /** * Sets the port to communicate with on the server * @param port The port to send messages to */ void setPort(int port); /** * Sets whether TCP connections will be sent by default * @param flag Indicates whether TCP connections are made */ void setTCP(boolean flag); /** * Sets whether truncated responses will be ignored. If not, a truncated * response over UDP will cause a retransmission over TCP. * @param flag Indicates whether truncated responses should be ignored. */ void setIgnoreTruncation(boolean flag); /** * Sets the EDNS version used on outgoing messages. * @param level The EDNS level to use. 0 indicates EDNS0 and -1 indicates no * EDNS. * @throws IllegalArgumentException An invalid level was indicated. */ void setEDNS(int level); /** * Sets the EDNS information on outgoing messages. * @param level The EDNS level to use. 0 indicates EDNS0 and -1 indicates no * EDNS. * @param payloadSize The maximum DNS packet size that this host is capable * of receiving over UDP. If 0 is specified, the default (1280) is used. * @param flags EDNS extended flags to be set in the OPT record. * @param options EDNS options to be set in the OPT record, specified as a * List of OPTRecord.Option elements. * @throws IllegalArgumentException An invalid field was specified. * @see OPTRecord */ void setEDNS(int level, int payloadSize, int flags, List options); /** * Specifies the TSIG key that messages will be signed with * @param key The key */ void setTSIGKey(TSIG key); /** * Sets the amount of time to wait for a response before giving up. * @param secs The number of seconds to wait. * @param msecs The number of milliseconds to wait. */ void setTimeout(int secs, int msecs); /** * Sets the amount of time to wait for a response before giving up. * @param secs The number of seconds to wait. */ void setTimeout(int secs); /** * Sends a message and waits for a response. * @param query The query to send. * @return The response * @throws IOException An error occurred while sending or receiving. */ Message send(Message query) throws IOException; /** * Asynchronously sends a message registering a listener to receive a callback * on success or exception. Multiple asynchronous lookups can be performed * in parallel. Since the callback may be invoked before the function returns, * external synchronization is necessary. * @param query The query to send * @param listener The object containing the callbacks. * @return An identifier, which is also a parameter in the callback */ Object sendAsync(final Message query, final ResolverListener listener); } dnsjava-2.1.5/org/xbill/DNS/ResolverConfig.java100644 0 0 30717 11523043534 16443 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.lang.reflect.*; import java.util.*; /** * A class that tries to locate name servers and the search path to * be appended to unqualified names. * * The following are attempted, in order, until one succeeds. *
    *
  • The properties 'dns.server' and 'dns.search' (comma delimited lists) * are checked. The servers can either be IP addresses or hostnames * (which are resolved using Java's built in DNS support). *
  • The sun.net.dns.ResolverConfiguration class is queried. *
  • On Unix, /etc/resolv.conf is parsed. *
  • On Windows, ipconfig/winipcfg is called and its output parsed. This * may fail for non-English versions on Windows. *
  • "localhost" is used as the nameserver, and the search path is empty. *
* * These routines will be called internally when creating Resolvers/Lookups * without explicitly specifying server names, and can also be called * directly if desired. * * @author Brian Wellington * @author Yannick Meudal * @author Arnt Gulbrandsen */ public class ResolverConfig { private String [] servers = null; private Name [] searchlist = null; private int ndots = -1; private static ResolverConfig currentConfig; static { refresh(); } public ResolverConfig() { if (findProperty()) return; if (findSunJVM()) return; if (servers == null || searchlist == null) { String OS = System.getProperty("os.name"); String vendor = System.getProperty("java.vendor"); if (OS.indexOf("Windows") != -1) { if (OS.indexOf("95") != -1 || OS.indexOf("98") != -1 || OS.indexOf("ME") != -1) find95(); else findNT(); } else if (OS.indexOf("NetWare") != -1) { findNetware(); } else if (vendor.indexOf("Android") != -1) { findAndroid(); } else { findUnix(); } } } private void addServer(String server, List list) { if (list.contains(server)) return; if (Options.check("verbose")) System.out.println("adding server " + server); list.add(server); } private void addSearch(String search, List list) { Name name; if (Options.check("verbose")) System.out.println("adding search " + search); try { name = Name.fromString(search, Name.root); } catch (TextParseException e) { return; } if (list.contains(name)) return; list.add(name); } private int parseNdots(String token) { token = token.substring(6); try { int ndots = Integer.parseInt(token); if (ndots >= 0) { if (Options.check("verbose")) System.out.println("setting ndots " + token); return ndots; } } catch (NumberFormatException e) { } return -1; } private void configureFromLists(List lserver, List lsearch) { if (servers == null && lserver.size() > 0) servers = (String []) lserver.toArray(new String[0]); if (searchlist == null && lsearch.size() > 0) searchlist = (Name []) lsearch.toArray(new Name[0]); } private void configureNdots(int lndots) { if (ndots < 0 && lndots > 0) ndots = lndots; } /** * Looks in the system properties to find servers and a search path. * Servers are defined by dns.server=server1,server2... * The search path is defined by dns.search=domain1,domain2... */ private boolean findProperty() { String prop; List lserver = new ArrayList(0); List lsearch = new ArrayList(0); StringTokenizer st; prop = System.getProperty("dns.server"); if (prop != null) { st = new StringTokenizer(prop, ","); while (st.hasMoreTokens()) addServer(st.nextToken(), lserver); } prop = System.getProperty("dns.search"); if (prop != null) { st = new StringTokenizer(prop, ","); while (st.hasMoreTokens()) addSearch(st.nextToken(), lsearch); } configureFromLists(lserver, lsearch); return (servers != null && searchlist != null); } /** * Uses the undocumented Sun DNS implementation to determine the configuration. * This doesn't work or even compile with all JVMs (gcj, for example). */ private boolean findSunJVM() { List lserver = new ArrayList(0); List lserver_tmp; List lsearch = new ArrayList(0); List lsearch_tmp; try { Class [] noClasses = new Class[0]; Object [] noObjects = new Object[0]; String resConfName = "sun.net.dns.ResolverConfiguration"; Class resConfClass = Class.forName(resConfName); Object resConf; // ResolverConfiguration resConf = ResolverConfiguration.open(); Method open = resConfClass.getDeclaredMethod("open", noClasses); resConf = open.invoke(null, noObjects); // lserver_tmp = resConf.nameservers(); Method nameservers = resConfClass.getMethod("nameservers", noClasses); lserver_tmp = (List) nameservers.invoke(resConf, noObjects); // lsearch_tmp = resConf.searchlist(); Method searchlist = resConfClass.getMethod("searchlist", noClasses); lsearch_tmp = (List) searchlist.invoke(resConf, noObjects); } catch (Exception e) { return false; } if (lserver_tmp.size() == 0) return false; if (lserver_tmp.size() > 0) { Iterator it = lserver_tmp.iterator(); while (it.hasNext()) addServer((String) it.next(), lserver); } if (lsearch_tmp.size() > 0) { Iterator it = lsearch_tmp.iterator(); while (it.hasNext()) addSearch((String) it.next(), lsearch); } configureFromLists(lserver, lsearch); return true; } /** * Looks in /etc/resolv.conf to find servers and a search path. * "nameserver" lines specify servers. "domain" and "search" lines * define the search path. */ private void findResolvConf(String file) { InputStream in = null; try { in = new FileInputStream(file); } catch (FileNotFoundException e) { return; } InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); List lserver = new ArrayList(0); List lsearch = new ArrayList(0); int lndots = -1; try { String line; while ((line = br.readLine()) != null) { if (line.startsWith("nameserver")) { StringTokenizer st = new StringTokenizer(line); st.nextToken(); /* skip nameserver */ addServer(st.nextToken(), lserver); } else if (line.startsWith("domain")) { StringTokenizer st = new StringTokenizer(line); st.nextToken(); /* skip domain */ if (!st.hasMoreTokens()) continue; if (lsearch.isEmpty()) addSearch(st.nextToken(), lsearch); } else if (line.startsWith("search")) { if (!lsearch.isEmpty()) lsearch.clear(); StringTokenizer st = new StringTokenizer(line); st.nextToken(); /* skip search */ while (st.hasMoreTokens()) addSearch(st.nextToken(), lsearch); } else if(line.startsWith("options")) { StringTokenizer st = new StringTokenizer(line); st.nextToken(); /* skip options */ while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.startsWith("ndots:")) { lndots = parseNdots(token); } } } } br.close(); } catch (IOException e) { } configureFromLists(lserver, lsearch); configureNdots(lndots); } private void findUnix() { findResolvConf("/etc/resolv.conf"); } private void findNetware() { findResolvConf("sys:/etc/resolv.cfg"); } /** * Parses the output of winipcfg or ipconfig. */ private void findWin(InputStream in, Locale locale) { String packageName = ResolverConfig.class.getPackage().getName(); String resPackageName = packageName + ".windows.DNSServer"; ResourceBundle res; if (locale != null) res = ResourceBundle.getBundle(resPackageName, locale); else res = ResourceBundle.getBundle(resPackageName); String host_name = res.getString("host_name"); String primary_dns_suffix = res.getString("primary_dns_suffix"); String dns_suffix = res.getString("dns_suffix"); String dns_servers = res.getString("dns_servers"); BufferedReader br = new BufferedReader(new InputStreamReader(in)); try { List lserver = new ArrayList(); List lsearch = new ArrayList(); String line = null; boolean readingServers = false; boolean readingSearches = false; while ((line = br.readLine()) != null) { StringTokenizer st = new StringTokenizer(line); if (!st.hasMoreTokens()) { readingServers = false; readingSearches = false; continue; } String s = st.nextToken(); if (line.indexOf(":") != -1) { readingServers = false; readingSearches = false; } if (line.indexOf(host_name) != -1) { while (st.hasMoreTokens()) s = st.nextToken(); Name name; try { name = Name.fromString(s, null); } catch (TextParseException e) { continue; } if (name.labels() == 1) continue; addSearch(s, lsearch); } else if (line.indexOf(primary_dns_suffix) != -1) { while (st.hasMoreTokens()) s = st.nextToken(); if (s.equals(":")) continue; addSearch(s, lsearch); readingSearches = true; } else if (readingSearches || line.indexOf(dns_suffix) != -1) { while (st.hasMoreTokens()) s = st.nextToken(); if (s.equals(":")) continue; addSearch(s, lsearch); readingSearches = true; } else if (readingServers || line.indexOf(dns_servers) != -1) { while (st.hasMoreTokens()) s = st.nextToken(); if (s.equals(":")) continue; addServer(s, lserver); readingServers = true; } } configureFromLists(lserver, lsearch); } catch (IOException e) { } return; } private void findWin(InputStream in) { String property = "org.xbill.DNS.windows.parse.buffer"; final int defaultBufSize = 8 * 1024; int bufSize = Integer.getInteger(property, defaultBufSize).intValue(); BufferedInputStream b = new BufferedInputStream(in, bufSize); b.mark(bufSize); findWin(b, null); if (servers == null) { try { b.reset(); } catch (IOException e) { return; } findWin(b, new Locale("", "")); } } /** * Calls winipcfg and parses the result to find servers and a search path. */ private void find95() { String s = "winipcfg.out"; try { Process p; p = Runtime.getRuntime().exec("winipcfg /all /batch " + s); p.waitFor(); File f = new File(s); findWin(new FileInputStream(f)); new File(s).delete(); } catch (Exception e) { return; } } /** * Calls ipconfig and parses the result to find servers and a search path. */ private void findNT() { try { Process p; p = Runtime.getRuntime().exec("ipconfig /all"); findWin(p.getInputStream()); p.destroy(); } catch (Exception e) { return; } } /** * Parses the output of getprop, which is the only way to get DNS * info on Android. getprop might disappear in future releases, so * this code comes with a use-by date. */ private void findAndroid() { // This originally looked for all lines containing .dns; but // http://code.google.com/p/android/issues/detail?id=2207#c73 // indicates that net.dns* should always be the active nameservers, so // we use those. String re1 = "^\\d+(\\.\\d+){3}$"; String re2 = "^[0-9a-f]+(:[0-9a-f]*)+:[0-9a-f]+$"; try { ArrayList lserver = new ArrayList(); ArrayList lsearch = new ArrayList(); String line; Process p = Runtime.getRuntime().exec("getprop"); InputStream in = p.getInputStream(); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null ) { StringTokenizer t = new StringTokenizer(line, ":"); String name = t.nextToken(); if (name.indexOf( "net.dns" ) > -1) { String v = t.nextToken(); v = v.replaceAll("[ \\[\\]]", ""); if ((v.matches(re1) || v.matches(re2)) && !lserver.contains(v)) lserver.add(v); } } configureFromLists(lserver, lsearch); } catch ( Exception e ) { // ignore resolutely } } /** Returns all located servers */ public String [] servers() { return servers; } /** Returns the first located server */ public String server() { if (servers == null) return null; return servers[0]; } /** Returns all entries in the located search path */ public Name [] searchPath() { return searchlist; } /** * Returns the located ndots value, or the default (1) if not configured. * Note that ndots can only be configured in a resolv.conf file, and will only * take effect if ResolverConfig uses resolv.conf directly (that is, if the * JVM does not include the sun.net.dns.ResolverConfiguration class). */ public int ndots() { if (ndots < 0) return 1; return ndots; } /** Gets the current configuration */ public static synchronized ResolverConfig getCurrentConfig() { return currentConfig; } /** Gets the current configuration */ public static void refresh() { ResolverConfig newConfig = new ResolverConfig(); synchronized (ResolverConfig.class) { currentConfig = newConfig; } } } dnsjava-2.1.5/org/xbill/DNS/ResolverListener.java100644 0 0 1340 7775216774 16777 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.EventListener; /** * An interface to the asynchronous resolver. * @see Resolver * * @author Brian Wellington */ public interface ResolverListener extends EventListener { /** * The callback used by an asynchronous resolver * @param id The identifier returned by Resolver.sendAsync() * @param m The response message as returned by the Resolver */ void receiveMessage(Object id, Message m); /** * The callback used by an asynchronous resolver when an exception is thrown * @param id The identifier returned by Resolver.sendAsync() * @param e The thrown exception */ void handleException(Object id, Exception e); } dnsjava-2.1.5/org/xbill/DNS/ReverseMap.java100644 0 0 7563 11254053717 15555 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.net.*; /** * A set functions designed to deal with DNS names used in reverse mappings. * For the IPv4 address a.b.c.d, the reverse map name is d.c.b.a.in-addr.arpa. * For an IPv6 address, the reverse map name is ...ip6.arpa. * * @author Brian Wellington */ public final class ReverseMap { private static Name inaddr4 = Name.fromConstantString("in-addr.arpa."); private static Name inaddr6 = Name.fromConstantString("ip6.arpa."); /* Otherwise the class could be instantiated */ private ReverseMap() {} /** * Creates a reverse map name corresponding to an address contained in * an array of 4 bytes (for an IPv4 address) or 16 bytes (for an IPv6 address). * @param addr The address from which to build a name. * @return The name corresponding to the address in the reverse map. */ public static Name fromAddress(byte [] addr) { if (addr.length != 4 && addr.length != 16) throw new IllegalArgumentException("array must contain " + "4 or 16 elements"); StringBuffer sb = new StringBuffer(); if (addr.length == 4) { for (int i = addr.length - 1; i >= 0; i--) { sb.append(addr[i] & 0xFF); if (i > 0) sb.append("."); } } else { int [] nibbles = new int[2]; for (int i = addr.length - 1; i >= 0; i--) { nibbles[0] = (addr[i] & 0xFF) >> 4; nibbles[1] = (addr[i] & 0xFF) & 0xF; for (int j = nibbles.length - 1; j >= 0; j--) { sb.append(Integer.toHexString(nibbles[j])); if (i > 0 || j > 0) sb.append("."); } } } try { if (addr.length == 4) return Name.fromString(sb.toString(), inaddr4); else return Name.fromString(sb.toString(), inaddr6); } catch (TextParseException e) { throw new IllegalStateException("name cannot be invalid"); } } /** * Creates a reverse map name corresponding to an address contained in * an array of 4 integers between 0 and 255 (for an IPv4 address) or 16 * integers between 0 and 255 (for an IPv6 address). * @param addr The address from which to build a name. * @return The name corresponding to the address in the reverse map. */ public static Name fromAddress(int [] addr) { byte [] bytes = new byte[addr.length]; for (int i = 0; i < addr.length; i++) { if (addr[i] < 0 || addr[i] > 0xFF) throw new IllegalArgumentException("array must " + "contain values " + "between 0 and 255"); bytes[i] = (byte) addr[i]; } return fromAddress(bytes); } /** * Creates a reverse map name corresponding to an address contained in * an InetAddress. * @param addr The address from which to build a name. * @return The name corresponding to the address in the reverse map. */ public static Name fromAddress(InetAddress addr) { return fromAddress(addr.getAddress()); } /** * Creates a reverse map name corresponding to an address contained in * a String. * @param addr The address from which to build a name. * @return The name corresponding to the address in the reverse map. * @throws UnknownHostException The string does not contain a valid address. */ public static Name fromAddress(String addr, int family) throws UnknownHostException { byte [] array = Address.toByteArray(addr, family); if (array == null) throw new UnknownHostException("Invalid IP address"); return fromAddress(array); } /** * Creates a reverse map name corresponding to an address contained in * a String. * @param addr The address from which to build a name. * @return The name corresponding to the address in the reverse map. * @throws UnknownHostException The string does not contain a valid address. */ public static Name fromAddress(String addr) throws UnknownHostException { byte [] array = Address.toByteArray(addr, Address.IPv4); if (array == null) array = Address.toByteArray(addr, Address.IPv6); if (array == null) throw new UnknownHostException("Invalid IP address"); return fromAddress(array); } } dnsjava-2.1.5/org/xbill/DNS/SIG0.java100644 0 0 4335 11441567747 14213 0ustar 0 0 // Copyright (c) 2001-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.security.PrivateKey; import java.util.Date; /** * Creates SIG(0) transaction signatures. * * @author Pasi Eronen * @author Brian Wellington */ public class SIG0 { /** * The default validity period for outgoing SIG(0) signed messages. * Can be overriden by the sig0validity option. */ private static final short VALIDITY = 300; private SIG0() { } /** * Sign a message with SIG(0). The DNS key and private key must refer to the * same underlying cryptographic key. * @param message The message to be signed * @param key The DNSKEY record to use as part of signing * @param privkey The PrivateKey to use when signing * @param previous If this message is a response, the SIG(0) from the query */ public static void signMessage(Message message, KEYRecord key, PrivateKey privkey, SIGRecord previous) throws DNSSEC.DNSSECException { int validity = Options.intValue("sig0validity"); if (validity < 0) validity = VALIDITY; long now = System.currentTimeMillis(); Date timeSigned = new Date(now); Date timeExpires = new Date(now + validity * 1000); SIGRecord sig = DNSSEC.signMessage(message, previous, key, privkey, timeSigned, timeExpires); message.addRecord(sig, Section.ADDITIONAL); } /** * Verify a message using SIG(0). * @param message The message to be signed * @param b An array containing the message in unparsed form. This is * necessary since SIG(0) signs the message in wire format, and we can't * recreate the exact wire format (with the same name compression). * @param key The KEY record to verify the signature with. * @param previous If this message is a response, the SIG(0) from the query */ public static void verifyMessage(Message message, byte [] b, KEYRecord key, SIGRecord previous) throws DNSSEC.DNSSECException { SIGRecord sig = null; Record [] additional = message.getSectionArray(Section.ADDITIONAL); for (int i = 0; i < additional.length; i++) { if (additional[i].getType() != Type.SIG) continue; if (((SIGRecord) additional[i]).getTypeCovered() != 0) continue; sig = (SIGRecord) additional[i]; break; } DNSSEC.verifyMessage(message, b, sig, previous, key); } } dnsjava-2.1.5/org/xbill/DNS/SIGBase.java100644 0 0 10325 11367375723 14740 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; import org.xbill.DNS.utils.*; /** * The base class for SIG/RRSIG records, which have identical formats * * @author Brian Wellington */ abstract class SIGBase extends Record { private static final long serialVersionUID = -3738444391533812369L; protected int covered; protected int alg, labels; protected long origttl; protected Date expire, timeSigned; protected int footprint; protected Name signer; protected byte [] signature; protected SIGBase() {} public SIGBase(Name name, int type, int dclass, long ttl, int covered, int alg, long origttl, Date expire, Date timeSigned, int footprint, Name signer, byte [] signature) { super(name, type, dclass, ttl); Type.check(covered); TTL.check(origttl); this.covered = covered; this.alg = checkU8("alg", alg); this.labels = name.labels() - 1; if (name.isWild()) this.labels--; this.origttl = origttl; this.expire = expire; this.timeSigned = timeSigned; this.footprint = checkU16("footprint", footprint); this.signer = checkName("signer", signer); this.signature = signature; } void rrFromWire(DNSInput in) throws IOException { covered = in.readU16(); alg = in.readU8(); labels = in.readU8(); origttl = in.readU32(); expire = new Date(1000 * in.readU32()); timeSigned = new Date(1000 * in.readU32()); footprint = in.readU16(); signer = new Name(in); signature = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { String typeString = st.getString(); covered = Type.value(typeString); if (covered < 0) throw st.exception("Invalid type: " + typeString); String algString = st.getString(); alg = DNSSEC.Algorithm.value(algString); if (alg < 0) throw st.exception("Invalid algorithm: " + algString); labels = st.getUInt8(); origttl = st.getTTL(); expire = FormattedTime.parse(st.getString()); timeSigned = FormattedTime.parse(st.getString()); footprint = st.getUInt16(); signer = st.getName(origin); signature = st.getBase64(); } /** Converts the RRSIG/SIG Record to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append (Type.string(covered)); sb.append (" "); sb.append (alg); sb.append (" "); sb.append (labels); sb.append (" "); sb.append (origttl); sb.append (" "); if (Options.check("multiline")) sb.append ("(\n\t"); sb.append (FormattedTime.format(expire)); sb.append (" "); sb.append (FormattedTime.format(timeSigned)); sb.append (" "); sb.append (footprint); sb.append (" "); sb.append (signer); if (Options.check("multiline")) { sb.append("\n"); sb.append(base64.formatString(signature, 64, "\t", true)); } else { sb.append (" "); sb.append(base64.toString(signature)); } return sb.toString(); } /** Returns the RRset type covered by this signature */ public int getTypeCovered() { return covered; } /** * Returns the cryptographic algorithm of the key that generated the signature */ public int getAlgorithm() { return alg; } /** * Returns the number of labels in the signed domain name. This may be * different than the record's domain name if the record is a wildcard * record. */ public int getLabels() { return labels; } /** Returns the original TTL of the RRset */ public long getOrigTTL() { return origttl; } /** Returns the time at which the signature expires */ public Date getExpire() { return expire; } /** Returns the time at which this signature was generated */ public Date getTimeSigned() { return timeSigned; } /** Returns The footprint/key id of the signing key. */ public int getFootprint() { return footprint; } /** Returns the owner of the signing key */ public Name getSigner() { return signer; } /** Returns the binary data representing the signature */ public byte [] getSignature() { return signature; } void setSignature(byte [] signature) { this.signature = signature; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(covered); out.writeU8(alg); out.writeU8(labels); out.writeU32(origttl); out.writeU32(expire.getTime() / 1000); out.writeU32(timeSigned.getTime() / 1000); out.writeU16(footprint); signer.toWire(out, null, canonical); out.writeByteArray(signature); } } dnsjava-2.1.5/org/xbill/DNS/SIGRecord.java100644 0 0 2603 11254312416 15245 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * Signature - A SIG provides the digital signature of an RRset, so that * the data can be authenticated by a DNSSEC-capable resolver. The * signature is usually generated by a key contained in a KEYRecord * @see RRset * @see DNSSEC * @see KEYRecord * * @author Brian Wellington */ public class SIGRecord extends SIGBase { private static final long serialVersionUID = 4963556060953589058L; SIGRecord() {} Record getObject() { return new SIGRecord(); } /** * Creates an SIG Record from the given data * @param covered The RRset type covered by this signature * @param alg The cryptographic algorithm of the key that generated the * signature * @param origttl The original TTL of the RRset * @param expire The time at which the signature expires * @param timeSigned The time at which this signature was generated * @param footprint The footprint/key id of the signing key. * @param signer The owner of the signing key * @param signature Binary data representing the signature */ public SIGRecord(Name name, int dclass, long ttl, int covered, int alg, long origttl, Date expire, Date timeSigned, int footprint, Name signer, byte [] signature) { super(name, Type.SIG, dclass, ttl, covered, alg, origttl, expire, timeSigned, footprint, signer, signature); } } dnsjava-2.1.5/org/xbill/DNS/SOARecord.java100644 0 0 7027 11254312416 15252 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Start of Authority - describes properties of a zone. * * @author Brian Wellington */ public class SOARecord extends Record { private static final long serialVersionUID = 1049740098229303931L; private Name host, admin; private long serial, refresh, retry, expire, minimum; SOARecord() {} Record getObject() { return new SOARecord(); } /** * Creates an SOA Record from the given data * @param host The primary name server for the zone * @param admin The zone administrator's address * @param serial The zone's serial number * @param refresh The amount of time until a secondary checks for a new serial * number * @param retry The amount of time between a secondary's checks for a new * serial number * @param expire The amount of time until a secondary expires a zone * @param minimum The minimum TTL for records in the zone */ public SOARecord(Name name, int dclass, long ttl, Name host, Name admin, long serial, long refresh, long retry, long expire, long minimum) { super(name, Type.SOA, dclass, ttl); this.host = checkName("host", host); this.admin = checkName("admin", admin); this.serial = checkU32("serial", serial); this.refresh = checkU32("refresh", refresh); this.retry = checkU32("retry", retry); this.expire = checkU32("expire", expire); this.minimum = checkU32("minimum", minimum); } void rrFromWire(DNSInput in) throws IOException { host = new Name(in); admin = new Name(in); serial = in.readU32(); refresh = in.readU32(); retry = in.readU32(); expire = in.readU32(); minimum = in.readU32(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { host = st.getName(origin); admin = st.getName(origin); serial = st.getUInt32(); refresh = st.getTTLLike(); retry = st.getTTLLike(); expire = st.getTTLLike(); minimum = st.getTTLLike(); } /** Convert to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(host); sb.append(" "); sb.append(admin); if (Options.check("multiline")) { sb.append(" (\n\t\t\t\t\t"); sb.append(serial); sb.append("\t; serial\n\t\t\t\t\t"); sb.append(refresh); sb.append("\t; refresh\n\t\t\t\t\t"); sb.append(retry); sb.append("\t; retry\n\t\t\t\t\t"); sb.append(expire); sb.append("\t; expire\n\t\t\t\t\t"); sb.append(minimum); sb.append(" )\t; minimum"); } else { sb.append(" "); sb.append(serial); sb.append(" "); sb.append(refresh); sb.append(" "); sb.append(retry); sb.append(" "); sb.append(expire); sb.append(" "); sb.append(minimum); } return sb.toString(); } /** Returns the primary name server */ public Name getHost() { return host; } /** Returns the zone administrator's address */ public Name getAdmin() { return admin; } /** Returns the zone's serial number */ public long getSerial() { return serial; } /** Returns the zone refresh interval */ public long getRefresh() { return refresh; } /** Returns the zone retry interval */ public long getRetry() { return retry; } /** Returns the time until a secondary expires a zone */ public long getExpire() { return expire; } /** Returns the minimum TTL for records in the zone */ public long getMinimum() { return minimum; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { host.toWire(out, c, canonical); admin.toWire(out, c, canonical); out.writeU32(serial); out.writeU32(refresh); out.writeU32(retry); out.writeU32(expire); out.writeU32(minimum); } } dnsjava-2.1.5/org/xbill/DNS/SPFRecord.java100644 0 0 1635 11254312416 15257 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * Sender Policy Framework (RFC 4408, experimental) * * @author Brian Wellington */ public class SPFRecord extends TXTBase { private static final long serialVersionUID = -2100754352801658722L; SPFRecord() {} Record getObject() { return new SPFRecord(); } /** * Creates a SPF Record from the given data * @param strings The text strings * @throws IllegalArgumentException One of the strings has invalid escapes */ public SPFRecord(Name name, int dclass, long ttl, List strings) { super(name, Type.SPF, dclass, ttl, strings); } /** * Creates a SPF Record from the given data * @param string One text string * @throws IllegalArgumentException The string has invalid escapes */ public SPFRecord(Name name, int dclass, long ttl, String string) { super(name, Type.SPF, dclass, ttl, string); } } dnsjava-2.1.5/org/xbill/DNS/SRVRecord.java100644 0 0 4570 11443737364 15317 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Server Selection Record - finds hosts running services in a domain. An * SRV record will normally be named _<service>._<protocol>.domain * - examples would be _sips._tcp.example.org (for the secure SIP protocol) and * _http._tcp.example.com (if HTTP used SRV records) * * @author Brian Wellington */ public class SRVRecord extends Record { private static final long serialVersionUID = -3886460132387522052L; private int priority, weight, port; private Name target; SRVRecord() {} Record getObject() { return new SRVRecord(); } /** * Creates an SRV Record from the given data * @param priority The priority of this SRV. Records with lower priority * are preferred. * @param weight The weight, used to select between records at the same * priority. * @param port The TCP/UDP port that the service uses * @param target The host running the service */ public SRVRecord(Name name, int dclass, long ttl, int priority, int weight, int port, Name target) { super(name, Type.SRV, dclass, ttl); this.priority = checkU16("priority", priority); this.weight = checkU16("weight", weight); this.port = checkU16("port", port); this.target = checkName("target", target); } void rrFromWire(DNSInput in) throws IOException { priority = in.readU16(); weight = in.readU16(); port = in.readU16(); target = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { priority = st.getUInt16(); weight = st.getUInt16(); port = st.getUInt16(); target = st.getName(origin); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(priority + " "); sb.append(weight + " "); sb.append(port + " "); sb.append(target); return sb.toString(); } /** Returns the priority */ public int getPriority() { return priority; } /** Returns the weight */ public int getWeight() { return weight; } /** Returns the port that the service runs on */ public int getPort() { return port; } /** Returns the host running that the service */ public Name getTarget() { return target; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(priority); out.writeU16(weight); out.writeU16(port); target.toWire(out, null, canonical); } public Name getAdditionalName() { return target; } } dnsjava-2.1.5/org/xbill/DNS/SSHFPRecord.java100644 0 0 4054 11254312416 15510 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * SSH Fingerprint - stores the fingerprint of an SSH host key. * * @author Brian Wellington */ public class SSHFPRecord extends Record { private static final long serialVersionUID = -8104701402654687025L; public static class Algorithm { private Algorithm() {} public static final int RSA = 1; public static final int DSS = 2; } public static class Digest { private Digest() {} public static final int SHA1 = 1; } private int alg; private int digestType; private byte [] fingerprint; SSHFPRecord() {} Record getObject() { return new SSHFPRecord(); } /** * Creates an SSHFP Record from the given data. * @param alg The public key's algorithm. * @param digestType The public key's digest type. * @param fingerprint The public key's fingerprint. */ public SSHFPRecord(Name name, int dclass, long ttl, int alg, int digestType, byte [] fingerprint) { super(name, Type.SSHFP, dclass, ttl); this.alg = checkU8("alg", alg); this.digestType = checkU8("digestType", digestType); this.fingerprint = fingerprint; } void rrFromWire(DNSInput in) throws IOException { alg = in.readU8(); digestType = in.readU8(); fingerprint = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { alg = st.getUInt8(); digestType = st.getUInt8(); fingerprint = st.getHex(true); } String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(alg); sb.append(" "); sb.append(digestType); sb.append(" "); sb.append(base16.toString(fingerprint)); return sb.toString(); } /** Returns the public key's algorithm. */ public int getAlgorithm() { return alg; } /** Returns the public key's digest type. */ public int getDigestType() { return digestType; } /** Returns the fingerprint */ public byte [] getFingerPrint() { return fingerprint; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(alg); out.writeU8(digestType); out.writeByteArray(fingerprint); } } dnsjava-2.1.5/org/xbill/DNS/Section.java100644 0 0 4321 10231125627 15067 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Constants and functions relating to DNS message sections * * @author Brian Wellington */ public final class Section { /** The question (first) section */ public static final int QUESTION = 0; /** The answer (second) section */ public static final int ANSWER = 1; /** The authority (third) section */ public static final int AUTHORITY = 2; /** The additional (fourth) section */ public static final int ADDITIONAL = 3; /* Aliases for dynamic update */ /** The zone (first) section of a dynamic update message */ public static final int ZONE = 0; /** The prerequisite (second) section of a dynamic update message */ public static final int PREREQ = 1; /** The update (third) section of a dynamic update message */ public static final int UPDATE = 2; private static Mnemonic sections = new Mnemonic("Message Section", Mnemonic.CASE_LOWER); private static String [] longSections = new String[4]; private static String [] updateSections = new String[4]; static { sections.setMaximum(3); sections.setNumericAllowed(true); sections.add(QUESTION, "qd"); sections.add(ANSWER, "an"); sections.add(AUTHORITY, "au"); sections.add(ADDITIONAL, "ad"); longSections[QUESTION] = "QUESTIONS"; longSections[ANSWER] = "ANSWERS"; longSections[AUTHORITY] = "AUTHORITY RECORDS"; longSections[ADDITIONAL] = "ADDITIONAL RECORDS"; updateSections[ZONE] = "ZONE"; updateSections[PREREQ] = "PREREQUISITES"; updateSections[UPDATE] = "UPDATE RECORDS"; updateSections[ADDITIONAL] = "ADDITIONAL RECORDS"; } private Section() {} /** Converts a numeric Section into an abbreviation String */ public static String string(int i) { return sections.getText(i); } /** Converts a numeric Section into a full description String */ public static String longString(int i) { sections.check(i); return longSections[i]; } /** * Converts a numeric Section into a full description String for an update * Message. */ public static String updString(int i) { sections.check(i); return updateSections[i]; } /** Converts a String representation of a Section into its numeric value */ public static int value(String s) { return sections.getValue(s); } } dnsjava-2.1.5/org/xbill/DNS/Serial.java100644 0 0 3337 10227642463 14717 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Helper functions for doing serial arithmetic. These should be used when * setting/checking SOA serial numbers. SOA serial number arithmetic is * defined in RFC 1982. * * @author Brian Wellington */ public final class Serial { private static final long MAX32 = 0xFFFFFFFFL; private Serial() { } /** * Compares two numbers using serial arithmetic. The numbers are assumed * to be 32 bit unsigned integers stored in longs. * @param serial1 The first integer * @param serial2 The second integer * @return 0 if the 2 numbers are equal, a positive number if serial1 is greater * than serial2, and a negative number if serial2 is greater than serial1. * @throws IllegalArgumentException serial1 or serial2 is out of range */ public static int compare(long serial1, long serial2) { if (serial1 < 0 || serial1 > MAX32) throw new IllegalArgumentException(serial1 + " out of range"); if (serial2 < 0 || serial2 > MAX32) throw new IllegalArgumentException(serial2 + " out of range"); long diff = serial1 - serial2; if (diff >= MAX32) diff -= (MAX32 + 1); else if (diff < -MAX32) diff += (MAX32 + 1); return (int)diff; } /** * Increments a serial number. The number is assumed to be a 32 bit unsigned * integer stored in a long. This basically adds 1 and resets the value to * 0 if it is 2^32. * @param serial The serial number * @return The incremented serial number * @throws IllegalArgumentException serial is out of range */ public static long increment(long serial) { if (serial < 0 || serial > MAX32) throw new IllegalArgumentException(serial + " out of range"); if (serial == MAX32) return 0; return serial + 1; } } dnsjava-2.1.5/org/xbill/DNS/SetResponse.java100644 0 0 7776 11256272724 15767 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * The Response from a query to Cache.lookupRecords() or Zone.findRecords() * @see Cache * @see Zone * * @author Brian Wellington */ public class SetResponse { /** * The Cache contains no information about the requested name/type */ static final int UNKNOWN = 0; /** * The Zone does not contain the requested name, or the Cache has * determined that the name does not exist. */ static final int NXDOMAIN = 1; /** * The Zone contains the name, but no data of the requested type, * or the Cache has determined that the name exists and has no data * of the requested type. */ static final int NXRRSET = 2; /** * A delegation enclosing the requested name was found. */ static final int DELEGATION = 3; /** * The Cache/Zone found a CNAME when looking for the name. * @see CNAMERecord */ static final int CNAME = 4; /** * The Cache/Zone found a DNAME when looking for the name. * @see DNAMERecord */ static final int DNAME = 5; /** * The Cache/Zone has successfully answered the question for the * requested name/type/class. */ static final int SUCCESSFUL = 6; private static final SetResponse unknown = new SetResponse(UNKNOWN); private static final SetResponse nxdomain = new SetResponse(NXDOMAIN); private static final SetResponse nxrrset = new SetResponse(NXRRSET); private int type; private Object data; private SetResponse() {} SetResponse(int type, RRset rrset) { if (type < 0 || type > 6) throw new IllegalArgumentException("invalid type"); this.type = type; this.data = rrset; } SetResponse(int type) { if (type < 0 || type > 6) throw new IllegalArgumentException("invalid type"); this.type = type; this.data = null; } static SetResponse ofType(int type) { switch (type) { case UNKNOWN: return unknown; case NXDOMAIN: return nxdomain; case NXRRSET: return nxrrset; case DELEGATION: case CNAME: case DNAME: case SUCCESSFUL: SetResponse sr = new SetResponse(); sr.type = type; sr.data = null; return sr; default: throw new IllegalArgumentException("invalid type"); } } void addRRset(RRset rrset) { if (data == null) data = new ArrayList(); List l = (List) data; l.add(rrset); } /** Is the answer to the query unknown? */ public boolean isUnknown() { return (type == UNKNOWN); } /** Is the answer to the query that the name does not exist? */ public boolean isNXDOMAIN() { return (type == NXDOMAIN); } /** Is the answer to the query that the name exists, but the type does not? */ public boolean isNXRRSET() { return (type == NXRRSET); } /** Is the result of the lookup that the name is below a delegation? */ public boolean isDelegation() { return (type == DELEGATION); } /** Is the result of the lookup a CNAME? */ public boolean isCNAME() { return (type == CNAME); } /** Is the result of the lookup a DNAME? */ public boolean isDNAME() { return (type == DNAME); } /** Was the query successful? */ public boolean isSuccessful() { return (type == SUCCESSFUL); } /** If the query was successful, return the answers */ public RRset [] answers() { if (type != SUCCESSFUL) return null; List l = (List) data; return (RRset []) l.toArray(new RRset[l.size()]); } /** * If the query encountered a CNAME, return it. */ public CNAMERecord getCNAME() { return (CNAMERecord)((RRset)data).first(); } /** * If the query encountered a DNAME, return it. */ public DNAMERecord getDNAME() { return (DNAMERecord)((RRset)data).first(); } /** * If the query hit a delegation point, return the NS set. */ public RRset getNS() { return (RRset)data; } /** Prints the value of the SetResponse */ public String toString() { switch (type) { case UNKNOWN: return "unknown"; case NXDOMAIN: return "NXDOMAIN"; case NXRRSET: return "NXRRSET"; case DELEGATION: return "delegation: " + data; case CNAME: return "CNAME: " + data; case DNAME: return "DNAME: " + data; case SUCCESSFUL: return "successful"; default: throw new IllegalStateException(); } } } dnsjava-2.1.5/org/xbill/DNS/SimpleResolver.java100644 0 0 21130 11605462236 16461 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; import java.io.*; import java.net.*; /** * An implementation of Resolver that sends one query to one server. * SimpleResolver handles TCP retries, transaction security (TSIG), and * EDNS 0. * @see Resolver * @see TSIG * @see OPTRecord * * @author Brian Wellington */ public class SimpleResolver implements Resolver { /** The default port to send queries to */ public static final int DEFAULT_PORT = 53; /** The default EDNS payload size */ public static final int DEFAULT_EDNS_PAYLOADSIZE = 1280; private InetSocketAddress address; private InetSocketAddress localAddress; private boolean useTCP, ignoreTruncation; private OPTRecord queryOPT; private TSIG tsig; private long timeoutValue = 10 * 1000; private static final short DEFAULT_UDPSIZE = 512; private static String defaultResolver = "localhost"; private static int uniqueID = 0; /** * Creates a SimpleResolver that will query the specified host * @exception UnknownHostException Failure occurred while finding the host */ public SimpleResolver(String hostname) throws UnknownHostException { if (hostname == null) { hostname = ResolverConfig.getCurrentConfig().server(); if (hostname == null) hostname = defaultResolver; } InetAddress addr; if (hostname.equals("0")) addr = InetAddress.getLocalHost(); else addr = InetAddress.getByName(hostname); address = new InetSocketAddress(addr, DEFAULT_PORT); } /** * Creates a SimpleResolver. The host to query is either found by using * ResolverConfig, or the default host is used. * @see ResolverConfig * @exception UnknownHostException Failure occurred while finding the host */ public SimpleResolver() throws UnknownHostException { this(null); } /** * Gets the destination address associated with this SimpleResolver. * Messages sent using this SimpleResolver will be sent to this address. * @return The destination address associated with this SimpleResolver. */ InetSocketAddress getAddress() { return address; } /** Sets the default host (initially localhost) to query */ public static void setDefaultResolver(String hostname) { defaultResolver = hostname; } public void setPort(int port) { address = new InetSocketAddress(address.getAddress(), port); } /** * Sets the address of the server to communicate with. * @param addr The address of the DNS server */ public void setAddress(InetSocketAddress addr) { address = addr; } /** * Sets the address of the server to communicate with (on the default * DNS port) * @param addr The address of the DNS server */ public void setAddress(InetAddress addr) { address = new InetSocketAddress(addr, address.getPort()); } /** * Sets the local address to bind to when sending messages. * @param addr The local address to send messages from. */ public void setLocalAddress(InetSocketAddress addr) { localAddress = addr; } /** * Sets the local address to bind to when sending messages. A random port * will be used. * @param addr The local address to send messages from. */ public void setLocalAddress(InetAddress addr) { localAddress = new InetSocketAddress(addr, 0); } public void setTCP(boolean flag) { this.useTCP = flag; } public void setIgnoreTruncation(boolean flag) { this.ignoreTruncation = flag; } public void setEDNS(int level, int payloadSize, int flags, List options) { if (level != 0 && level != -1) throw new IllegalArgumentException("invalid EDNS level - " + "must be 0 or -1"); if (payloadSize == 0) payloadSize = DEFAULT_EDNS_PAYLOADSIZE; queryOPT = new OPTRecord(payloadSize, 0, level, flags, options); } public void setEDNS(int level) { setEDNS(level, 0, 0, null); } public void setTSIGKey(TSIG key) { tsig = key; } TSIG getTSIGKey() { return tsig; } public void setTimeout(int secs, int msecs) { timeoutValue = (long)secs * 1000 + msecs; } public void setTimeout(int secs) { setTimeout(secs, 0); } long getTimeout() { return timeoutValue; } private Message parseMessage(byte [] b) throws WireParseException { try { return (new Message(b)); } catch (IOException e) { if (Options.check("verbose")) e.printStackTrace(); if (!(e instanceof WireParseException)) e = new WireParseException("Error parsing message"); throw (WireParseException) e; } } private void verifyTSIG(Message query, Message response, byte [] b, TSIG tsig) { if (tsig == null) return; int error = tsig.verify(response, b, query.getTSIG()); if (Options.check("verbose")) System.err.println("TSIG verify: " + Rcode.TSIGstring(error)); } private void applyEDNS(Message query) { if (queryOPT == null || query.getOPT() != null) return; query.addRecord(queryOPT, Section.ADDITIONAL); } private int maxUDPSize(Message query) { OPTRecord opt = query.getOPT(); if (opt == null) return DEFAULT_UDPSIZE; else return opt.getPayloadSize(); } /** * Sends a message to a single server and waits for a response. No checking * is done to ensure that the response is associated with the query. * @param query The query to send. * @return The response. * @throws IOException An error occurred while sending or receiving. */ public Message send(Message query) throws IOException { if (Options.check("verbose")) System.err.println("Sending to " + address.getAddress().getHostAddress() + ":" + address.getPort()); if (query.getHeader().getOpcode() == Opcode.QUERY) { Record question = query.getQuestion(); if (question != null && question.getType() == Type.AXFR) return sendAXFR(query); } query = (Message) query.clone(); applyEDNS(query); if (tsig != null) tsig.apply(query, null); byte [] out = query.toWire(Message.MAXLENGTH); int udpSize = maxUDPSize(query); boolean tcp = false; long endTime = System.currentTimeMillis() + timeoutValue; do { byte [] in; if (useTCP || out.length > udpSize) tcp = true; if (tcp) in = TCPClient.sendrecv(localAddress, address, out, endTime); else in = UDPClient.sendrecv(localAddress, address, out, udpSize, endTime); /* * Check that the response is long enough. */ if (in.length < Header.LENGTH) { throw new WireParseException("invalid DNS header - " + "too short"); } /* * Check that the response ID matches the query ID. We want * to check this before actually parsing the message, so that * if there's a malformed response that's not ours, it * doesn't confuse us. */ int id = ((in[0] & 0xFF) << 8) + (in[1] & 0xFF); int qid = query.getHeader().getID(); if (id != qid) { String error = "invalid message id: expected " + qid + "; got id " + id; if (tcp) { throw new WireParseException(error); } else { if (Options.check("verbose")) { System.err.println(error); } continue; } } Message response = parseMessage(in); verifyTSIG(query, response, in, tsig); if (!tcp && !ignoreTruncation && response.getHeader().getFlag(Flags.TC)) { tcp = true; continue; } return response; } while (true); } /** * Asynchronously sends a message to a single server, registering a listener * to receive a callback on success or exception. Multiple asynchronous * lookups can be performed in parallel. Since the callback may be invoked * before the function returns, external synchronization is necessary. * @param query The query to send * @param listener The object containing the callbacks. * @return An identifier, which is also a parameter in the callback */ public Object sendAsync(final Message query, final ResolverListener listener) { final Object id; synchronized (this) { id = new Integer(uniqueID++); } Record question = query.getQuestion(); String qname; if (question != null) qname = question.getName().toString(); else qname = "(none)"; String name = this.getClass() + ": " + qname; Thread thread = new ResolveThread(this, query, id, listener); thread.setName(name); thread.setDaemon(true); thread.start(); return id; } private Message sendAXFR(Message query) throws IOException { Name qname = query.getQuestion().getName(); ZoneTransferIn xfrin = ZoneTransferIn.newAXFR(qname, address, tsig); xfrin.setTimeout((int)(getTimeout() / 1000)); xfrin.setLocalAddress(localAddress); try { xfrin.run(); } catch (ZoneTransferException e) { throw new WireParseException(e.getMessage()); } List records = xfrin.getAXFR(); Message response = new Message(query.getHeader().getID()); response.getHeader().setFlag(Flags.AA); response.getHeader().setFlag(Flags.QR); response.addRecord(query.getQuestion(), Section.QUESTION); Iterator it = records.iterator(); while (it.hasNext()) response.addRecord((Record)it.next(), Section.ANSWER); return response; } } dnsjava-2.1.5/org/xbill/DNS/SingleCompressedNameBase.java100644 0 0 1300 11254312416 20317 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Implements common functionality for the many record types whose format * is a single compressed name. * * @author Brian Wellington */ abstract class SingleCompressedNameBase extends SingleNameBase { private static final long serialVersionUID = -236435396815460677L; protected SingleCompressedNameBase() {} protected SingleCompressedNameBase(Name name, int type, int dclass, long ttl, Name singleName, String description) { super(name, type, dclass, ttl, singleName, description); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { singleName.toWire(out, c, canonical); } } dnsjava-2.1.5/org/xbill/DNS/SingleNameBase.java100644 0 0 2152 11254312416 16300 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Implements common functionality for the many record types whose format * is a single name. * * @author Brian Wellington */ abstract class SingleNameBase extends Record { private static final long serialVersionUID = -18595042501413L; protected Name singleName; protected SingleNameBase() {} protected SingleNameBase(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } protected SingleNameBase(Name name, int type, int dclass, long ttl, Name singleName, String description) { super(name, type, dclass, ttl); this.singleName = checkName(description, singleName); } void rrFromWire(DNSInput in) throws IOException { singleName = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { singleName = st.getName(origin); } String rrToString() { return singleName.toString(); } protected Name getSingleName() { return singleName; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { singleName.toWire(out, null, canonical); } } dnsjava-2.1.5/org/xbill/DNS/TCPClient.java100644 0 0 5622 10571346254 15265 0ustar 0 0 // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; final class TCPClient extends Client { public TCPClient(long endTime) throws IOException { super(SocketChannel.open(), endTime); } void bind(SocketAddress addr) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); channel.socket().bind(addr); } void connect(SocketAddress addr) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); if (channel.connect(addr)) return; key.interestOps(SelectionKey.OP_CONNECT); try { while (!channel.finishConnect()) { if (!key.isConnectable()) blockUntil(key, endTime); } } finally { if (key.isValid()) key.interestOps(0); } } void send(byte [] data) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); verboseLog("TCP write", data); byte [] lengthArray = new byte[2]; lengthArray[0] = (byte)(data.length >>> 8); lengthArray[1] = (byte)(data.length & 0xFF); ByteBuffer [] buffers = new ByteBuffer[2]; buffers[0] = ByteBuffer.wrap(lengthArray); buffers[1] = ByteBuffer.wrap(data); int nsent = 0; key.interestOps(SelectionKey.OP_WRITE); try { while (nsent < data.length + 2) { if (key.isWritable()) { long n = channel.write(buffers); if (n < 0) throw new EOFException(); nsent += (int) n; if (nsent < data.length + 2 && System.currentTimeMillis() > endTime) throw new SocketTimeoutException(); } else blockUntil(key, endTime); } } finally { if (key.isValid()) key.interestOps(0); } } private byte [] _recv(int length) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); int nrecvd = 0; byte [] data = new byte[length]; ByteBuffer buffer = ByteBuffer.wrap(data); key.interestOps(SelectionKey.OP_READ); try { while (nrecvd < length) { if (key.isReadable()) { long n = channel.read(buffer); if (n < 0) throw new EOFException(); nrecvd += (int) n; if (nrecvd < length && System.currentTimeMillis() > endTime) throw new SocketTimeoutException(); } else blockUntil(key, endTime); } } finally { if (key.isValid()) key.interestOps(0); } return data; } byte [] recv() throws IOException { byte [] buf = _recv(2); int length = ((buf[0] & 0xFF) << 8) + (buf[1] & 0xFF); byte [] data = _recv(length); verboseLog("TCP read", data); return data; } static byte [] sendrecv(SocketAddress local, SocketAddress remote, byte [] data, long endTime) throws IOException { TCPClient client = new TCPClient(endTime); try { if (local != null) client.bind(local); client.connect(remote); client.send(data); return client.recv(); } finally { client.cleanup(); } } static byte [] sendrecv(SocketAddress addr, byte [] data, long endTime) throws IOException { return sendrecv(null, addr, data, endTime); } } dnsjava-2.1.5/org/xbill/DNS/TKEYRecord.java100644 0 0 11457 11254312416 15426 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; import org.xbill.DNS.utils.*; /** * Transaction Key - used to compute and/or securely transport a shared * secret to be used with TSIG. * @see TSIG * * @author Brian Wellington */ public class TKEYRecord extends Record { private static final long serialVersionUID = 8828458121926391756L; private Name alg; private Date timeInception; private Date timeExpire; private int mode, error; private byte [] key; private byte [] other; /** The key is assigned by the server (unimplemented) */ public static final int SERVERASSIGNED = 1; /** The key is computed using a Diffie-Hellman key exchange */ public static final int DIFFIEHELLMAN = 2; /** The key is computed using GSS_API (unimplemented) */ public static final int GSSAPI = 3; /** The key is assigned by the resolver (unimplemented) */ public static final int RESOLVERASSIGNED = 4; /** The key should be deleted */ public static final int DELETE = 5; TKEYRecord() {} Record getObject() { return new TKEYRecord(); } /** * Creates a TKEY Record from the given data. * @param alg The shared key's algorithm * @param timeInception The beginning of the validity period of the shared * secret or keying material * @param timeExpire The end of the validity period of the shared * secret or keying material * @param mode The mode of key agreement * @param error The extended error field. Should be 0 in queries * @param key The shared secret * @param other The other data field. Currently unused * responses. */ public TKEYRecord(Name name, int dclass, long ttl, Name alg, Date timeInception, Date timeExpire, int mode, int error, byte [] key, byte other[]) { super(name, Type.TKEY, dclass, ttl); this.alg = checkName("alg", alg); this.timeInception = timeInception; this.timeExpire = timeExpire; this.mode = checkU16("mode", mode); this.error = checkU16("error", error); this.key = key; this.other = other; } void rrFromWire(DNSInput in) throws IOException { alg = new Name(in); timeInception = new Date(1000 * in.readU32()); timeExpire = new Date(1000 * in.readU32()); mode = in.readU16(); error = in.readU16(); int keylen = in.readU16(); if (keylen > 0) key = in.readByteArray(keylen); else key = null; int otherlen = in.readU16(); if (otherlen > 0) other = in.readByteArray(otherlen); else other = null; } void rdataFromString(Tokenizer st, Name origin) throws IOException { throw st.exception("no text format defined for TKEY"); } protected String modeString() { switch (mode) { case SERVERASSIGNED: return "SERVERASSIGNED"; case DIFFIEHELLMAN: return "DIFFIEHELLMAN"; case GSSAPI: return "GSSAPI"; case RESOLVERASSIGNED: return "RESOLVERASSIGNED"; case DELETE: return "DELETE"; default: return Integer.toString(mode); } } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(alg); sb.append(" "); if (Options.check("multiline")) sb.append("(\n\t"); sb.append(FormattedTime.format(timeInception)); sb.append(" "); sb.append(FormattedTime.format(timeExpire)); sb.append(" "); sb.append(modeString()); sb.append(" "); sb.append(Rcode.TSIGstring(error)); if (Options.check("multiline")) { sb.append("\n"); if (key != null) { sb.append(base64.formatString(key, 64, "\t", false)); sb.append("\n"); } if (other != null) sb.append(base64.formatString(other, 64, "\t", false)); sb.append(" )"); } else { sb.append(" "); if (key != null) { sb.append(base64.toString(key)); sb.append(" "); } if (other != null) sb.append(base64.toString(other)); } return sb.toString(); } /** Returns the shared key's algorithm */ public Name getAlgorithm() { return alg; } /** * Returns the beginning of the validity period of the shared secret or * keying material */ public Date getTimeInception() { return timeInception; } /** * Returns the end of the validity period of the shared secret or * keying material */ public Date getTimeExpire() { return timeExpire; } /** Returns the key agreement mode */ public int getMode() { return mode; } /** Returns the extended error */ public int getError() { return error; } /** Returns the shared secret or keying material */ public byte [] getKey() { return key; } /** Returns the other data */ public byte [] getOther() { return other; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { alg.toWire(out, null, canonical); out.writeU32(timeInception.getTime() / 1000); out.writeU32(timeExpire.getTime() / 1000); out.writeU16(mode); out.writeU16(error); if (key != null) { out.writeU16(key.length); out.writeByteArray(key); } else out.writeU16(0); if (other != null) { out.writeU16(other.length); out.writeByteArray(other); } else out.writeU16(0); } } dnsjava-2.1.5/org/xbill/DNS/TLSARecord.java100644 0 0 7412 12020244661 15367 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import org.xbill.DNS.utils.*; /** * Transport Layer Security Authentication * * @author Brian Wellington */ public class TLSARecord extends Record { private static final long serialVersionUID = 356494267028580169L; public static class CertificateUsage { private CertificateUsage() {} public static final int CA_CONSTRAINT = 0; public static final int SERVICE_CERTIFICATE_CONSTRAINT = 1; public static final int TRUST_ANCHOR_ASSERTION = 2; public static final int DOMAIN_ISSUED_CERTIFICATE = 3; } public static class Selector { private Selector() {} /** * Full certificate; the Certificate binary structure defined in * [RFC5280] */ public static final int FULL_CERTIFICATE = 0; /** * SubjectPublicKeyInfo; DER-encoded binary structure defined in * [RFC5280] */ public static final int SUBJECT_PUBLIC_KEY_INFO = 1; } public static class MatchingType { private MatchingType() {} /** Exact match on selected content */ public static final int EXACT = 0; /** SHA-256 hash of selected content [RFC6234] */ public static final int SHA256 = 1; /** SHA-512 hash of selected content [RFC6234] */ public static final int SHA512 = 2; } private int certificateUsage; private int selector; private int matchingType; private byte [] certificateAssociationData; TLSARecord() {} Record getObject() { return new TLSARecord(); } /** * Creates an TLSA Record from the given data * @param certificateUsage The provided association that will be used to * match the certificate presented in the TLS handshake. * @param selector The part of the TLS certificate presented by the server * that will be matched against the association data. * @param matchingType How the certificate association is presented. * @param certificateAssociationData The "certificate association data" to be * matched. */ public TLSARecord(Name name, int dclass, long ttl, int certificateUsage, int selector, int matchingType, byte [] certificateAssociationData) { super(name, Type.TLSA, dclass, ttl); this.certificateUsage = checkU8("certificateUsage", certificateUsage); this.selector = checkU8("selector", selector); this.matchingType = checkU8("matchingType", matchingType); this.certificateAssociationData = checkByteArrayLength( "certificateAssociationData", certificateAssociationData, 0xFFFF); } void rrFromWire(DNSInput in) throws IOException { certificateUsage = in.readU8(); selector = in.readU8(); matchingType = in.readU8(); certificateAssociationData = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { certificateUsage = st.getUInt8(); selector = st.getUInt8(); matchingType = st.getUInt8(); certificateAssociationData = st.getHex(); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(certificateUsage); sb.append(" "); sb.append(selector); sb.append(" "); sb.append(matchingType); sb.append(" "); sb.append(base16.toString(certificateAssociationData)); return sb.toString(); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU8(certificateUsage); out.writeU8(selector); out.writeU8(matchingType); out.writeByteArray(certificateAssociationData); } /** Returns the certificate usage of the TLSA record */ public int getCertificateUsage() { return certificateUsage; } /** Returns the selector of the TLSA record */ public int getSelector() { return selector; } /** Returns the matching type of the TLSA record */ public int getMatchingType() { return matchingType; } /** Returns the certificate associate data of this TLSA record */ public final byte [] getCertificateAssociationData() { return certificateAssociationData; } } dnsjava-2.1.5/org/xbill/DNS/TSIG.java100644 0 0 42106 11567055670 14271 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; import org.xbill.DNS.utils.*; /** * Transaction signature handling. This class generates and verifies * TSIG records on messages, which provide transaction security. * @see TSIGRecord * * @author Brian Wellington */ public class TSIG { private static final String HMAC_MD5_STR = "HMAC-MD5.SIG-ALG.REG.INT."; private static final String HMAC_SHA1_STR = "hmac-sha1."; private static final String HMAC_SHA224_STR = "hmac-sha224."; private static final String HMAC_SHA256_STR = "hmac-sha256."; private static final String HMAC_SHA384_STR = "hmac-sha384."; private static final String HMAC_SHA512_STR = "hmac-sha512."; /** The domain name representing the HMAC-MD5 algorithm. */ public static final Name HMAC_MD5 = Name.fromConstantString(HMAC_MD5_STR); /** The domain name representing the HMAC-MD5 algorithm (deprecated). */ public static final Name HMAC = HMAC_MD5; /** The domain name representing the HMAC-SHA1 algorithm. */ public static final Name HMAC_SHA1 = Name.fromConstantString(HMAC_SHA1_STR); /** * The domain name representing the HMAC-SHA224 algorithm. * Note that SHA224 is not supported by Java out-of-the-box, this requires use * of a third party provider like BouncyCastle.org. */ public static final Name HMAC_SHA224 = Name.fromConstantString(HMAC_SHA224_STR); /** The domain name representing the HMAC-SHA256 algorithm. */ public static final Name HMAC_SHA256 = Name.fromConstantString(HMAC_SHA256_STR); /** The domain name representing the HMAC-SHA384 algorithm. */ public static final Name HMAC_SHA384 = Name.fromConstantString(HMAC_SHA384_STR); /** The domain name representing the HMAC-SHA512 algorithm. */ public static final Name HMAC_SHA512 = Name.fromConstantString(HMAC_SHA512_STR); /** * The default fudge value for outgoing packets. Can be overriden by the * tsigfudge option. */ public static final short FUDGE = 300; private Name name, alg; private String digest; private int digestBlockLength; private byte [] key; private void getDigest() { if (alg.equals(HMAC_MD5)) { digest = "md5"; digestBlockLength = 64; } else if (alg.equals(HMAC_SHA1)) { digest = "sha-1"; digestBlockLength = 64; } else if (alg.equals(HMAC_SHA224)) { digest = "sha-224"; digestBlockLength = 64; } else if (alg.equals(HMAC_SHA256)) { digest = "sha-256"; digestBlockLength = 64; } else if (alg.equals(HMAC_SHA512)) { digest = "sha-512"; digestBlockLength = 128; } else if (alg.equals(HMAC_SHA384)) { digest = "sha-384"; digestBlockLength = 128; } else throw new IllegalArgumentException("Invalid algorithm"); } /** * Creates a new TSIG key, which can be used to sign or verify a message. * @param algorithm The algorithm of the shared key. * @param name The name of the shared key. * @param key The shared key's data. */ public TSIG(Name algorithm, Name name, byte [] key) { this.name = name; this.alg = algorithm; this.key = key; getDigest(); } /** * Creates a new TSIG key with the hmac-md5 algorithm, which can be used to * sign or verify a message. * @param name The name of the shared key. * @param key The shared key's data. */ public TSIG(Name name, byte [] key) { this(HMAC_MD5, name, key); } /** * Creates a new TSIG object, which can be used to sign or verify a message. * @param name The name of the shared key. * @param key The shared key's data represented as a base64 encoded string. * @throws IllegalArgumentException The key name is an invalid name * @throws IllegalArgumentException The key data is improperly encoded */ public TSIG(Name algorithm, String name, String key) { this.key = base64.fromString(key); if (this.key == null) throw new IllegalArgumentException("Invalid TSIG key string"); try { this.name = Name.fromString(name, Name.root); } catch (TextParseException e) { throw new IllegalArgumentException("Invalid TSIG key name"); } this.alg = algorithm; getDigest(); } /** * Creates a new TSIG object, which can be used to sign or verify a message. * @param name The name of the shared key. * @param algorithm The algorithm of the shared key. The legal values are * "hmac-md5", "hmac-sha1", "hmac-sha224", "hmac-sha256", "hmac-sha384", and * "hmac-sha512". * @param key The shared key's data represented as a base64 encoded string. * @throws IllegalArgumentException The key name is an invalid name * @throws IllegalArgumentException The key data is improperly encoded */ public TSIG(String algorithm, String name, String key) { this(HMAC_MD5, name, key); if (algorithm.equalsIgnoreCase("hmac-md5")) this.alg = HMAC_MD5; else if (algorithm.equalsIgnoreCase("hmac-sha1")) this.alg = HMAC_SHA1; else if (algorithm.equalsIgnoreCase("hmac-sha224")) this.alg = HMAC_SHA224; else if (algorithm.equalsIgnoreCase("hmac-sha256")) this.alg = HMAC_SHA256; else if (algorithm.equalsIgnoreCase("hmac-sha384")) this.alg = HMAC_SHA384; else if (algorithm.equalsIgnoreCase("hmac-sha512")) this.alg = HMAC_SHA512; else throw new IllegalArgumentException("Invalid TSIG algorithm"); getDigest(); } /** * Creates a new TSIG object with the hmac-md5 algorithm, which can be used to * sign or verify a message. * @param name The name of the shared key * @param key The shared key's data, represented as a base64 encoded string. * @throws IllegalArgumentException The key name is an invalid name * @throws IllegalArgumentException The key data is improperly encoded */ public TSIG(String name, String key) { this(HMAC_MD5, name, key); } /** * Creates a new TSIG object, which can be used to sign or verify a message. * @param str The TSIG key, in the form name:secret, name/secret, * alg:name:secret, or alg/name/secret. If an algorithm is specified, it must * be "hmac-md5", "hmac-sha1", or "hmac-sha256". * @throws IllegalArgumentException The string does not contain both a name * and secret. * @throws IllegalArgumentException The key name is an invalid name * @throws IllegalArgumentException The key data is improperly encoded */ static public TSIG fromString(String str) { String [] parts = str.split("[:/]", 3); if (parts.length < 2) throw new IllegalArgumentException("Invalid TSIG key " + "specification"); if (parts.length == 3) { try { return new TSIG(parts[0], parts[1], parts[2]); } catch (IllegalArgumentException e) { parts = str.split("[:/]", 2); } } return new TSIG(HMAC_MD5, parts[0], parts[1]); } /** * Generates a TSIG record with a specific error for a message that has * been rendered. * @param m The message * @param b The rendered message * @param error The error * @param old If this message is a response, the TSIG from the request * @return The TSIG record to be added to the message */ public TSIGRecord generate(Message m, byte [] b, int error, TSIGRecord old) { Date timeSigned; if (error != Rcode.BADTIME) timeSigned = new Date(); else timeSigned = old.getTimeSigned(); int fudge; HMAC hmac = null; if (error == Rcode.NOERROR || error == Rcode.BADTIME) hmac = new HMAC(digest, digestBlockLength, key); fudge = Options.intValue("tsigfudge"); if (fudge < 0 || fudge > 0x7FFF) fudge = FUDGE; if (old != null) { DNSOutput out = new DNSOutput(); out.writeU16(old.getSignature().length); if (hmac != null) { hmac.update(out.toByteArray()); hmac.update(old.getSignature()); } } /* Digest the message */ if (hmac != null) hmac.update(b); DNSOutput out = new DNSOutput(); name.toWireCanonical(out); out.writeU16(DClass.ANY); /* class */ out.writeU32(0); /* ttl */ alg.toWireCanonical(out); long time = timeSigned.getTime() / 1000; int timeHigh = (int) (time >> 32); long timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); out.writeU16(fudge); out.writeU16(error); out.writeU16(0); /* No other data */ if (hmac != null) hmac.update(out.toByteArray()); byte [] signature; if (hmac != null) signature = hmac.sign(); else signature = new byte[0]; byte [] other = null; if (error == Rcode.BADTIME) { out = new DNSOutput(); time = new Date().getTime() / 1000; timeHigh = (int) (time >> 32); timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); other = out.toByteArray(); } return (new TSIGRecord(name, DClass.ANY, 0, alg, timeSigned, fudge, signature, m.getHeader().getID(), error, other)); } /** * Generates a TSIG record with a specific error for a message and adds it * to the message. * @param m The message * @param error The error * @param old If this message is a response, the TSIG from the request */ public void apply(Message m, int error, TSIGRecord old) { Record r = generate(m, m.toWire(), error, old); m.addRecord(r, Section.ADDITIONAL); m.tsigState = Message.TSIG_SIGNED; } /** * Generates a TSIG record for a message and adds it to the message * @param m The message * @param old If this message is a response, the TSIG from the request */ public void apply(Message m, TSIGRecord old) { apply(m, Rcode.NOERROR, old); } /** * Generates a TSIG record for a message and adds it to the message * @param m The message * @param old If this message is a response, the TSIG from the request */ public void applyStream(Message m, TSIGRecord old, boolean first) { if (first) { apply(m, old); return; } Date timeSigned = new Date(); int fudge; HMAC hmac = new HMAC(digest, digestBlockLength, key); fudge = Options.intValue("tsigfudge"); if (fudge < 0 || fudge > 0x7FFF) fudge = FUDGE; DNSOutput out = new DNSOutput(); out.writeU16(old.getSignature().length); hmac.update(out.toByteArray()); hmac.update(old.getSignature()); /* Digest the message */ hmac.update(m.toWire()); out = new DNSOutput(); long time = timeSigned.getTime() / 1000; int timeHigh = (int) (time >> 32); long timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); out.writeU16(fudge); hmac.update(out.toByteArray()); byte [] signature = hmac.sign(); byte [] other = null; Record r = new TSIGRecord(name, DClass.ANY, 0, alg, timeSigned, fudge, signature, m.getHeader().getID(), Rcode.NOERROR, other); m.addRecord(r, Section.ADDITIONAL); m.tsigState = Message.TSIG_SIGNED; } /** * Verifies a TSIG record on an incoming message. Since this is only called * in the context where a TSIG is expected to be present, it is an error * if one is not present. After calling this routine, Message.isVerified() may * be called on this message. * @param m The message * @param b An array containing the message in unparsed form. This is * necessary since TSIG signs the message in wire format, and we can't * recreate the exact wire format (with the same name compression). * @param length The length of the message in the array. * @param old If this message is a response, the TSIG from the request * @return The result of the verification (as an Rcode) * @see Rcode */ public byte verify(Message m, byte [] b, int length, TSIGRecord old) { m.tsigState = Message.TSIG_FAILED; TSIGRecord tsig = m.getTSIG(); HMAC hmac = new HMAC(digest, digestBlockLength, key); if (tsig == null) return Rcode.FORMERR; if (!tsig.getName().equals(name) || !tsig.getAlgorithm().equals(alg)) { if (Options.check("verbose")) System.err.println("BADKEY failure"); return Rcode.BADKEY; } long now = System.currentTimeMillis(); long then = tsig.getTimeSigned().getTime(); long fudge = tsig.getFudge(); if (Math.abs(now - then) > fudge * 1000) { if (Options.check("verbose")) System.err.println("BADTIME failure"); return Rcode.BADTIME; } if (old != null && tsig.getError() != Rcode.BADKEY && tsig.getError() != Rcode.BADSIG) { DNSOutput out = new DNSOutput(); out.writeU16(old.getSignature().length); hmac.update(out.toByteArray()); hmac.update(old.getSignature()); } m.getHeader().decCount(Section.ADDITIONAL); byte [] header = m.getHeader().toWire(); m.getHeader().incCount(Section.ADDITIONAL); hmac.update(header); int len = m.tsigstart - header.length; hmac.update(b, header.length, len); DNSOutput out = new DNSOutput(); tsig.getName().toWireCanonical(out); out.writeU16(tsig.dclass); out.writeU32(tsig.ttl); tsig.getAlgorithm().toWireCanonical(out); long time = tsig.getTimeSigned().getTime() / 1000; int timeHigh = (int) (time >> 32); long timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); out.writeU16(tsig.getFudge()); out.writeU16(tsig.getError()); if (tsig.getOther() != null) { out.writeU16(tsig.getOther().length); out.writeByteArray(tsig.getOther()); } else { out.writeU16(0); } hmac.update(out.toByteArray()); byte [] signature = tsig.getSignature(); int digestLength = hmac.digestLength(); int minDigestLength = digest.equals("md5") ? 10 : digestLength / 2; if (signature.length > digestLength) { if (Options.check("verbose")) System.err.println("BADSIG: signature too long"); return Rcode.BADSIG; } else if (signature.length < minDigestLength) { if (Options.check("verbose")) System.err.println("BADSIG: signature too short"); return Rcode.BADSIG; } else if (!hmac.verify(signature, true)) { if (Options.check("verbose")) System.err.println("BADSIG: signature verification"); return Rcode.BADSIG; } m.tsigState = Message.TSIG_VERIFIED; return Rcode.NOERROR; } /** * Verifies a TSIG record on an incoming message. Since this is only called * in the context where a TSIG is expected to be present, it is an error * if one is not present. After calling this routine, Message.isVerified() may * be called on this message. * @param m The message * @param b The message in unparsed form. This is necessary since TSIG * signs the message in wire format, and we can't recreate the exact wire * format (with the same name compression). * @param old If this message is a response, the TSIG from the request * @return The result of the verification (as an Rcode) * @see Rcode */ public int verify(Message m, byte [] b, TSIGRecord old) { return verify(m, b, b.length, old); } /** * Returns the maximum length of a TSIG record generated by this key. * @see TSIGRecord */ public int recordLength() { return (name.length() + 10 + alg.length() + 8 + // time signed, fudge 18 + // 2 byte MAC length, 16 byte MAC 4 + // original id, error 8); // 2 byte error length, 6 byte max error field. } public static class StreamVerifier { /** * A helper class for verifying multiple message responses. */ private TSIG key; private HMAC verifier; private int nresponses; private int lastsigned; private TSIGRecord lastTSIG; /** Creates an object to verify a multiple message response */ public StreamVerifier(TSIG tsig, TSIGRecord old) { key = tsig; verifier = new HMAC(key.digest, key.digestBlockLength, key.key); nresponses = 0; lastTSIG = old; } /** * Verifies a TSIG record on an incoming message that is part of a * multiple message response. * TSIG records must be present on the first and last messages, and * at least every 100 records in between. * After calling this routine, Message.isVerified() may be called on * this message. * @param m The message * @param b The message in unparsed form * @return The result of the verification (as an Rcode) * @see Rcode */ public int verify(Message m, byte [] b) { TSIGRecord tsig = m.getTSIG(); nresponses++; if (nresponses == 1) { int result = key.verify(m, b, lastTSIG); if (result == Rcode.NOERROR) { byte [] signature = tsig.getSignature(); DNSOutput out = new DNSOutput(); out.writeU16(signature.length); verifier.update(out.toByteArray()); verifier.update(signature); } lastTSIG = tsig; return result; } if (tsig != null) m.getHeader().decCount(Section.ADDITIONAL); byte [] header = m.getHeader().toWire(); if (tsig != null) m.getHeader().incCount(Section.ADDITIONAL); verifier.update(header); int len; if (tsig == null) len = b.length - header.length; else len = m.tsigstart - header.length; verifier.update(b, header.length, len); if (tsig != null) { lastsigned = nresponses; lastTSIG = tsig; } else { boolean required = (nresponses - lastsigned >= 100); if (required) { m.tsigState = Message.TSIG_FAILED; return Rcode.FORMERR; } else { m.tsigState = Message.TSIG_INTERMEDIATE; return Rcode.NOERROR; } } if (!tsig.getName().equals(key.name) || !tsig.getAlgorithm().equals(key.alg)) { if (Options.check("verbose")) System.err.println("BADKEY failure"); m.tsigState = Message.TSIG_FAILED; return Rcode.BADKEY; } DNSOutput out = new DNSOutput(); long time = tsig.getTimeSigned().getTime() / 1000; int timeHigh = (int) (time >> 32); long timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); out.writeU16(tsig.getFudge()); verifier.update(out.toByteArray()); if (verifier.verify(tsig.getSignature()) == false) { if (Options.check("verbose")) System.err.println("BADSIG failure"); m.tsigState = Message.TSIG_FAILED; return Rcode.BADSIG; } verifier.clear(); out = new DNSOutput(); out.writeU16(tsig.getSignature().length); verifier.update(out.toByteArray()); verifier.update(tsig.getSignature()); m.tsigState = Message.TSIG_VERIFIED; return Rcode.NOERROR; } } } dnsjava-2.1.5/org/xbill/DNS/TSIGRecord.java100644 0 0 11462 11254312416 15414 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; import org.xbill.DNS.utils.*; /** * Transaction Signature - this record is automatically generated by the * resolver. TSIG records provide transaction security between the * sender and receiver of a message, using a shared key. * @see Resolver * @see TSIG * * @author Brian Wellington */ public class TSIGRecord extends Record { private static final long serialVersionUID = -88820909016649306L; private Name alg; private Date timeSigned; private int fudge; private byte [] signature; private int originalID; private int error; private byte [] other; TSIGRecord() {} Record getObject() { return new TSIGRecord(); } /** * Creates a TSIG Record from the given data. This is normally called by * the TSIG class * @param alg The shared key's algorithm * @param timeSigned The time that this record was generated * @param fudge The fudge factor for time - if the time that the message is * received is not in the range [now - fudge, now + fudge], the signature * fails * @param signature The signature * @param originalID The message ID at the time of its generation * @param error The extended error field. Should be 0 in queries. * @param other The other data field. Currently used only in BADTIME * responses. * @see TSIG */ public TSIGRecord(Name name, int dclass, long ttl, Name alg, Date timeSigned, int fudge, byte [] signature, int originalID, int error, byte other[]) { super(name, Type.TSIG, dclass, ttl); this.alg = checkName("alg", alg); this.timeSigned = timeSigned; this.fudge = checkU16("fudge", fudge); this.signature = signature; this.originalID = checkU16("originalID", originalID); this.error = checkU16("error", error); this.other = other; } void rrFromWire(DNSInput in) throws IOException { alg = new Name(in); long timeHigh = in.readU16(); long timeLow = in.readU32(); long time = (timeHigh << 32) + timeLow; timeSigned = new Date(time * 1000); fudge = in.readU16(); int sigLen = in.readU16(); signature = in.readByteArray(sigLen); originalID = in.readU16(); error = in.readU16(); int otherLen = in.readU16(); if (otherLen > 0) other = in.readByteArray(otherLen); else other = null; } void rdataFromString(Tokenizer st, Name origin) throws IOException { throw st.exception("no text format defined for TSIG"); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(alg); sb.append(" "); if (Options.check("multiline")) sb.append("(\n\t"); sb.append (timeSigned.getTime() / 1000); sb.append (" "); sb.append (fudge); sb.append (" "); sb.append (signature.length); if (Options.check("multiline")) { sb.append ("\n"); sb.append (base64.formatString(signature, 64, "\t", false)); } else { sb.append (" "); sb.append (base64.toString(signature)); } sb.append (" "); sb.append (Rcode.TSIGstring(error)); sb.append (" "); if (other == null) sb.append (0); else { sb.append (other.length); if (Options.check("multiline")) sb.append("\n\n\n\t"); else sb.append(" "); if (error == Rcode.BADTIME) { if (other.length != 6) { sb.append(""); } else { long time = ((long)(other[0] & 0xFF) << 40) + ((long)(other[1] & 0xFF) << 32) + ((other[2] & 0xFF) << 24) + ((other[3] & 0xFF) << 16) + ((other[4] & 0xFF) << 8) + ((other[5] & 0xFF) ); sb.append(""); } } else { sb.append("<"); sb.append(base64.toString(other)); sb.append(">"); } } if (Options.check("multiline")) sb.append(" )"); return sb.toString(); } /** Returns the shared key's algorithm */ public Name getAlgorithm() { return alg; } /** Returns the time that this record was generated */ public Date getTimeSigned() { return timeSigned; } /** Returns the time fudge factor */ public int getFudge() { return fudge; } /** Returns the signature */ public byte [] getSignature() { return signature; } /** Returns the original message ID */ public int getOriginalID() { return originalID; } /** Returns the extended error */ public int getError() { return error; } /** Returns the other data */ public byte [] getOther() { return other; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { alg.toWire(out, null, canonical); long time = timeSigned.getTime() / 1000; int timeHigh = (int) (time >> 32); long timeLow = (time & 0xFFFFFFFFL); out.writeU16(timeHigh); out.writeU32(timeLow); out.writeU16(fudge); out.writeU16(signature.length); out.writeByteArray(signature); out.writeU16(originalID); out.writeU16(error); if (other != null) { out.writeU16(other.length); out.writeByteArray(other); } else out.writeU16(0); } } dnsjava-2.1.5/org/xbill/DNS/TTL.java100644 0 0 5400 10232544751 14131 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Routines for parsing BIND-style TTL values. These values consist of * numbers followed by 1 letter units of time (W - week, D - day, H - hour, * M - minute, S - second). * * @author Brian Wellington */ public final class TTL { public static final long MAX_VALUE = 0x7FFFFFFFL; private TTL() {} static void check(long i) { if (i < 0 || i > MAX_VALUE) throw new InvalidTTLException(i); } /** * Parses a TTL-like value, which can either be expressed as a number or a * BIND-style string with numbers and units. * @param s The string representing the numeric value. * @param clamp Whether to clamp values in the range [MAX_VALUE + 1, 2^32 -1] * to MAX_VALUE. This should be donw for TTLs, but not other values which * can be expressed in this format. * @return The value as a number of seconds * @throws NumberFormatException The string was not in a valid TTL format. */ public static long parse(String s, boolean clamp) { if (s == null || s.length() == 0 || !Character.isDigit(s.charAt(0))) throw new NumberFormatException(); long value = 0; long ttl = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); long oldvalue = value; if (Character.isDigit(c)) { value = (value * 10) + Character.getNumericValue(c); if (value < oldvalue) throw new NumberFormatException(); } else { switch (Character.toUpperCase(c)) { case 'W': value *= 7; case 'D': value *= 24; case 'H': value *= 60; case 'M': value *= 60; case 'S': break; default: throw new NumberFormatException(); } ttl += value; value = 0; if (ttl > 0xFFFFFFFFL) throw new NumberFormatException(); } } if (ttl == 0) ttl = value; if (ttl > 0xFFFFFFFFL) throw new NumberFormatException(); else if (ttl > MAX_VALUE && clamp) ttl = MAX_VALUE; return ttl; } /** * Parses a TTL, which can either be expressed as a number or a BIND-style * string with numbers and units. * @param s The string representing the TTL * @return The TTL as a number of seconds * @throws NumberFormatException The string was not in a valid TTL format. */ public static long parseTTL(String s) { return parse(s, true); } public static String format(long ttl) { TTL.check(ttl); StringBuffer sb = new StringBuffer(); long secs, mins, hours, days, weeks; secs = ttl % 60; ttl /= 60; mins = ttl % 60; ttl /= 60; hours = ttl % 24; ttl /= 24; days = ttl % 7; ttl /= 7; weeks = ttl; if (weeks > 0) sb.append(weeks + "W"); if (days > 0) sb.append(days + "D"); if (hours > 0) sb.append(hours + "H"); if (mins > 0) sb.append(mins + "M"); if (secs > 0 || (weeks == 0 && days == 0 && hours == 0 && mins == 0)) sb.append(secs + "S"); return sb.toString(); } } dnsjava-2.1.5/org/xbill/DNS/TXTBase.java100644 0 0 5074 11254312416 14743 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * Implements common functionality for the many record types whose format * is a list of strings. * * @author Brian Wellington */ abstract class TXTBase extends Record { private static final long serialVersionUID = -4319510507246305931L; protected List strings; protected TXTBase() {} protected TXTBase(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } protected TXTBase(Name name, int type, int dclass, long ttl, List strings) { super(name, type, dclass, ttl); if (strings == null) throw new IllegalArgumentException("strings must not be null"); this.strings = new ArrayList(strings.size()); Iterator it = strings.iterator(); try { while (it.hasNext()) { String s = (String) it.next(); this.strings.add(byteArrayFromString(s)); } } catch (TextParseException e) { throw new IllegalArgumentException(e.getMessage()); } } protected TXTBase(Name name, int type, int dclass, long ttl, String string) { this(name, type, dclass, ttl, Collections.singletonList(string)); } void rrFromWire(DNSInput in) throws IOException { strings = new ArrayList(2); while (in.remaining() > 0) { byte [] b = in.readCountedString(); strings.add(b); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { strings = new ArrayList(2); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; try { strings.add(byteArrayFromString(t.value)); } catch (TextParseException e) { throw st.exception(e.getMessage()); } } st.unget(); } /** converts to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); Iterator it = strings.iterator(); while (it.hasNext()) { byte [] array = (byte []) it.next(); sb.append(byteArrayToString(array, true)); if (it.hasNext()) sb.append(" "); } return sb.toString(); } /** * Returns the text strings * @return A list of Strings corresponding to the text strings. */ public List getStrings() { List list = new ArrayList(strings.size()); for (int i = 0; i < strings.size(); i++) list.add(byteArrayToString((byte []) strings.get(i), false)); return list; } /** * Returns the text strings * @return A list of byte arrays corresponding to the text strings. */ public List getStringsAsByteArrays() { return strings; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { Iterator it = strings.iterator(); while (it.hasNext()) { byte [] b = (byte []) it.next(); out.writeCountedString(b); } } } dnsjava-2.1.5/org/xbill/DNS/TXTRecord.java100644 0 0 1607 11254312416 15305 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.*; /** * Text - stores text strings * * @author Brian Wellington */ public class TXTRecord extends TXTBase { private static final long serialVersionUID = -5780785764284221342L; TXTRecord() {} Record getObject() { return new TXTRecord(); } /** * Creates a TXT Record from the given data * @param strings The text strings * @throws IllegalArgumentException One of the strings has invalid escapes */ public TXTRecord(Name name, int dclass, long ttl, List strings) { super(name, Type.TXT, dclass, ttl, strings); } /** * Creates a TXT Record from the given data * @param string One text string * @throws IllegalArgumentException The string has invalid escapes */ public TXTRecord(Name name, int dclass, long ttl, String string) { super(name, Type.TXT, dclass, ttl, string); } } dnsjava-2.1.5/org/xbill/DNS/TextParseException.java100644 0 0 537 7775216774 17255 0ustar 0 0 // Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * An exception thrown when unable to parse text. * * @author Brian Wellington */ public class TextParseException extends IOException { public TextParseException() { super(); } public TextParseException(String s) { super(s); } } dnsjava-2.1.5/org/xbill/DNS/Tokenizer.java100644 0 0 43452 11256272724 15476 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) // // Copyright (C) 2003-2004 Nominum, Inc. // // Permission to use, copy, modify, and distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT // OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // package org.xbill.DNS; import java.io.*; import java.net.*; import org.xbill.DNS.utils.*; /** * Tokenizer is used to parse DNS records and zones from text format, * * @author Brian Wellington * @author Bob Halley */ public class Tokenizer { private static String delim = " \t\n;()\""; private static String quotes = "\""; /** End of file */ public static final int EOF = 0; /** End of line */ public static final int EOL = 1; /** Whitespace; only returned when wantWhitespace is set */ public static final int WHITESPACE = 2; /** An identifier (unquoted string) */ public static final int IDENTIFIER = 3; /** A quoted string */ public static final int QUOTED_STRING = 4; /** A comment; only returned when wantComment is set */ public static final int COMMENT = 5; private PushbackInputStream is; private boolean ungottenToken; private int multiline; private boolean quoting; private String delimiters; private Token current; private StringBuffer sb; private boolean wantClose; private String filename; private int line; public static class Token { /** The type of token. */ public int type; /** The value of the token, or null for tokens without values. */ public String value; private Token() { type = -1; value = null; } private Token set(int type, StringBuffer value) { if (type < 0) throw new IllegalArgumentException(); this.type = type; this.value = value == null ? null : value.toString(); return this; } /** * Converts the token to a string containing a representation useful * for debugging. */ public String toString() { switch (type) { case EOF: return ""; case EOL: return ""; case WHITESPACE: return ""; case IDENTIFIER: return ""; case QUOTED_STRING: return ""; case COMMENT: return ""; default: return ""; } } /** Indicates whether this token contains a string. */ public boolean isString() { return (type == IDENTIFIER || type == QUOTED_STRING); } /** Indicates whether this token contains an EOL or EOF. */ public boolean isEOL() { return (type == EOL || type == EOF); } } static class TokenizerException extends TextParseException { String message; public TokenizerException(String filename, int line, String message) { super(filename + ":" + line + ": " + message); this.message = message; } public String getBaseMessage() { return message; } } /** * Creates a Tokenizer from an arbitrary input stream. * @param is The InputStream to tokenize. */ public Tokenizer(InputStream is) { if (!(is instanceof BufferedInputStream)) is = new BufferedInputStream(is); this.is = new PushbackInputStream(is, 2); ungottenToken = false; multiline = 0; quoting = false; delimiters = delim; current = new Token(); sb = new StringBuffer(); filename = ""; line = 1; } /** * Creates a Tokenizer from a string. * @param s The String to tokenize. */ public Tokenizer(String s) { this(new ByteArrayInputStream(s.getBytes())); } /** * Creates a Tokenizer from a file. * @param f The File to tokenize. */ public Tokenizer(File f) throws FileNotFoundException { this(new FileInputStream(f)); wantClose = true; filename = f.getName(); } private int getChar() throws IOException { int c = is.read(); if (c == '\r') { int next = is.read(); if (next != '\n') is.unread(next); c = '\n'; } if (c == '\n') line++; return c; } private void ungetChar(int c) throws IOException { if (c == -1) return; is.unread(c); if (c == '\n') line--; } private int skipWhitespace() throws IOException { int skipped = 0; while (true) { int c = getChar(); if (c != ' ' && c != '\t') { if (!(c == '\n' && multiline > 0)) { ungetChar(c); return skipped; } } skipped++; } } private void checkUnbalancedParens() throws TextParseException { if (multiline > 0) throw exception("unbalanced parentheses"); } /** * Gets the next token from a tokenizer. * @param wantWhitespace If true, leading whitespace will be returned as a * token. * @param wantComment If true, comments are returned as tokens. * @return The next token in the stream. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public Token get(boolean wantWhitespace, boolean wantComment) throws IOException { int type; int c; if (ungottenToken) { ungottenToken = false; if (current.type == WHITESPACE) { if (wantWhitespace) return current; } else if (current.type == COMMENT) { if (wantComment) return current; } else { if (current.type == EOL) line++; return current; } } int skipped = skipWhitespace(); if (skipped > 0 && wantWhitespace) return current.set(WHITESPACE, null); type = IDENTIFIER; sb.setLength(0); while (true) { c = getChar(); if (c == -1 || delimiters.indexOf(c) != -1) { if (c == -1) { if (quoting) throw exception("EOF in " + "quoted string"); else if (sb.length() == 0) return current.set(EOF, null); else return current.set(type, sb); } if (sb.length() == 0 && type != QUOTED_STRING) { if (c == '(') { multiline++; skipWhitespace(); continue; } else if (c == ')') { if (multiline <= 0) throw exception("invalid " + "close " + "parenthesis"); multiline--; skipWhitespace(); continue; } else if (c == '"') { if (!quoting) { quoting = true; delimiters = quotes; type = QUOTED_STRING; } else { quoting = false; delimiters = delim; skipWhitespace(); } continue; } else if (c == '\n') { return current.set(EOL, null); } else if (c == ';') { while (true) { c = getChar(); if (c == '\n' || c == -1) break; sb.append((char)c); } if (wantComment) { ungetChar(c); return current.set(COMMENT, sb); } else if (c == -1 && type != QUOTED_STRING) { checkUnbalancedParens(); return current.set(EOF, null); } else if (multiline > 0) { skipWhitespace(); sb.setLength(0); continue; } else return current.set(EOL, null); } else throw new IllegalStateException(); } else ungetChar(c); break; } else if (c == '\\') { c = getChar(); if (c == -1) throw exception("unterminated escape sequence"); sb.append('\\'); } else if (quoting && c == '\n') { throw exception("newline in quoted string"); } sb.append((char)c); } if (sb.length() == 0 && type != QUOTED_STRING) { checkUnbalancedParens(); return current.set(EOF, null); } return current.set(type, sb); } /** * Gets the next token from a tokenizer, ignoring whitespace and comments. * @return The next token in the stream. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public Token get() throws IOException { return get(false, false); } /** * Returns a token to the stream, so that it will be returned by the next call * to get(). * @throws IllegalStateException There are already ungotten tokens. */ public void unget() { if (ungottenToken) throw new IllegalStateException ("Cannot unget multiple tokens"); if (current.type == EOL) line--; ungottenToken = true; } /** * Gets the next token from a tokenizer and converts it to a string. * @return The next token in the stream, as a string. * @throws TextParseException The input was invalid or not a string. * @throws IOException An I/O error occurred. */ public String getString() throws IOException { Token next = get(); if (!next.isString()) { throw exception("expected a string"); } return next.value; } private String _getIdentifier(String expected) throws IOException { Token next = get(); if (next.type != IDENTIFIER) throw exception("expected " + expected); return next.value; } /** * Gets the next token from a tokenizer, ensures it is an unquoted string, * and converts it to a string. * @return The next token in the stream, as a string. * @throws TextParseException The input was invalid or not an unquoted string. * @throws IOException An I/O error occurred. */ public String getIdentifier() throws IOException { return _getIdentifier("an identifier"); } /** * Gets the next token from a tokenizer and converts it to a long. * @return The next token in the stream, as a long. * @throws TextParseException The input was invalid or not a long. * @throws IOException An I/O error occurred. */ public long getLong() throws IOException { String next = _getIdentifier("an integer"); if (!Character.isDigit(next.charAt(0))) throw exception("expected an integer"); try { return Long.parseLong(next); } catch (NumberFormatException e) { throw exception("expected an integer"); } } /** * Gets the next token from a tokenizer and converts it to an unsigned 32 bit * integer. * @return The next token in the stream, as an unsigned 32 bit integer. * @throws TextParseException The input was invalid or not an unsigned 32 * bit integer. * @throws IOException An I/O error occurred. */ public long getUInt32() throws IOException { long l = getLong(); if (l < 0 || l > 0xFFFFFFFFL) throw exception("expected an 32 bit unsigned integer"); return l; } /** * Gets the next token from a tokenizer and converts it to an unsigned 16 bit * integer. * @return The next token in the stream, as an unsigned 16 bit integer. * @throws TextParseException The input was invalid or not an unsigned 16 * bit integer. * @throws IOException An I/O error occurred. */ public int getUInt16() throws IOException { long l = getLong(); if (l < 0 || l > 0xFFFFL) throw exception("expected an 16 bit unsigned integer"); return (int) l; } /** * Gets the next token from a tokenizer and converts it to an unsigned 8 bit * integer. * @return The next token in the stream, as an unsigned 8 bit integer. * @throws TextParseException The input was invalid or not an unsigned 8 * bit integer. * @throws IOException An I/O error occurred. */ public int getUInt8() throws IOException { long l = getLong(); if (l < 0 || l > 0xFFL) throw exception("expected an 8 bit unsigned integer"); return (int) l; } /** * Gets the next token from a tokenizer and parses it as a TTL. * @return The next token in the stream, as an unsigned 32 bit integer. * @throws TextParseException The input was not valid. * @throws IOException An I/O error occurred. * @see TTL */ public long getTTL() throws IOException { String next = _getIdentifier("a TTL value"); try { return TTL.parseTTL(next); } catch (NumberFormatException e) { throw exception("expected a TTL value"); } } /** * Gets the next token from a tokenizer and parses it as if it were a TTL. * @return The next token in the stream, as an unsigned 32 bit integer. * @throws TextParseException The input was not valid. * @throws IOException An I/O error occurred. * @see TTL */ public long getTTLLike() throws IOException { String next = _getIdentifier("a TTL-like value"); try { return TTL.parse(next, false); } catch (NumberFormatException e) { throw exception("expected a TTL-like value"); } } /** * Gets the next token from a tokenizer and converts it to a name. * @param origin The origin to append to relative names. * @return The next token in the stream, as a name. * @throws TextParseException The input was invalid or not a valid name. * @throws IOException An I/O error occurred. * @throws RelativeNameException The parsed name was relative, even with the * origin. * @see Name */ public Name getName(Name origin) throws IOException { String next = _getIdentifier("a name"); try { Name name = Name.fromString(next, origin); if (!name.isAbsolute()) throw new RelativeNameException(name); return name; } catch (TextParseException e) { throw exception(e.getMessage()); } } /** * Gets the next token from a tokenizer and converts it to an IP Address. * @param family The address family. * @return The next token in the stream, as an InetAddress * @throws TextParseException The input was invalid or not a valid address. * @throws IOException An I/O error occurred. * @see Address */ public InetAddress getAddress(int family) throws IOException { String next = _getIdentifier("an address"); try { return Address.getByAddress(next, family); } catch (UnknownHostException e) { throw exception(e.getMessage()); } } /** * Gets the next token from a tokenizer, which must be an EOL or EOF. * @throws TextParseException The input was invalid or not an EOL or EOF token. * @throws IOException An I/O error occurred. */ public void getEOL() throws IOException { Token next = get(); if (next.type != EOL && next.type != EOF) { throw exception("expected EOL or EOF"); } } /** * Returns a concatenation of the remaining strings from a Tokenizer. */ private String remainingStrings() throws IOException { StringBuffer buffer = null; while (true) { Tokenizer.Token t = get(); if (!t.isString()) break; if (buffer == null) buffer = new StringBuffer(); buffer.append(t.value); } unget(); if (buffer == null) return null; return buffer.toString(); } /** * Gets the remaining string tokens until an EOL/EOF is seen, concatenates * them together, and converts the base64 encoded data to a byte array. * @param required If true, an exception will be thrown if no strings remain; * otherwise null be be returned. * @return The byte array containing the decoded strings, or null if there * were no strings to decode. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getBase64(boolean required) throws IOException { String s = remainingStrings(); if (s == null) { if (required) throw exception("expected base64 encoded string"); else return null; } byte [] array = base64.fromString(s); if (array == null) throw exception("invalid base64 encoding"); return array; } /** * Gets the remaining string tokens until an EOL/EOF is seen, concatenates * them together, and converts the base64 encoded data to a byte array. * @return The byte array containing the decoded strings, or null if there * were no strings to decode. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getBase64() throws IOException { return getBase64(false); } /** * Gets the remaining string tokens until an EOL/EOF is seen, concatenates * them together, and converts the hex encoded data to a byte array. * @param required If true, an exception will be thrown if no strings remain; * otherwise null be be returned. * @return The byte array containing the decoded strings, or null if there * were no strings to decode. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getHex(boolean required) throws IOException { String s = remainingStrings(); if (s == null) { if (required) throw exception("expected hex encoded string"); else return null; } byte [] array = base16.fromString(s); if (array == null) throw exception("invalid hex encoding"); return array; } /** * Gets the remaining string tokens until an EOL/EOF is seen, concatenates * them together, and converts the hex encoded data to a byte array. * @return The byte array containing the decoded strings, or null if there * were no strings to decode. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getHex() throws IOException { return getHex(false); } /** * Gets the next token from a tokenizer and decodes it as hex. * @return The byte array containing the decoded string. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getHexString() throws IOException { String next = _getIdentifier("a hex string"); byte [] array = base16.fromString(next); if (array == null) throw exception("invalid hex encoding"); return array; } /** * Gets the next token from a tokenizer and decodes it as base32. * @param b32 The base32 context to decode with. * @return The byte array containing the decoded string. * @throws TextParseException The input was invalid. * @throws IOException An I/O error occurred. */ public byte [] getBase32String(base32 b32) throws IOException { String next = _getIdentifier("a base32 string"); byte [] array = b32.fromString(next); if (array == null) throw exception("invalid base32 encoding"); return array; } /** * Creates an exception which includes the current state in the error message * @param s The error message to include. * @return The exception to be thrown */ public TextParseException exception(String s) { return new TokenizerException(filename, line, s); } /** * Closes any files opened by this tokenizer. */ public void close() { if (wantClose) { try { is.close(); } catch (IOException e) { } } } protected void finalize() { close(); } } dnsjava-2.1.5/org/xbill/DNS/Type.java100644 0 0 20604 12020244661 14424 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.HashMap; /** * Constants and functions relating to DNS Types * * @author Brian Wellington */ public final class Type { /** Address */ public static final int A = 1; /** Name server */ public static final int NS = 2; /** Mail destination */ public static final int MD = 3; /** Mail forwarder */ public static final int MF = 4; /** Canonical name (alias) */ public static final int CNAME = 5; /** Start of authority */ public static final int SOA = 6; /** Mailbox domain name */ public static final int MB = 7; /** Mail group member */ public static final int MG = 8; /** Mail rename name */ public static final int MR = 9; /** Null record */ public static final int NULL = 10; /** Well known services */ public static final int WKS = 11; /** Domain name pointer */ public static final int PTR = 12; /** Host information */ public static final int HINFO = 13; /** Mailbox information */ public static final int MINFO = 14; /** Mail routing information */ public static final int MX = 15; /** Text strings */ public static final int TXT = 16; /** Responsible person */ public static final int RP = 17; /** AFS cell database */ public static final int AFSDB = 18; /** X.25 calling address */ public static final int X25 = 19; /** ISDN calling address */ public static final int ISDN = 20; /** Router */ public static final int RT = 21; /** NSAP address */ public static final int NSAP = 22; /** Reverse NSAP address (deprecated) */ public static final int NSAP_PTR = 23; /** Signature */ public static final int SIG = 24; /** Key */ public static final int KEY = 25; /** X.400 mail mapping */ public static final int PX = 26; /** Geographical position (withdrawn) */ public static final int GPOS = 27; /** IPv6 address */ public static final int AAAA = 28; /** Location */ public static final int LOC = 29; /** Next valid name in zone */ public static final int NXT = 30; /** Endpoint identifier */ public static final int EID = 31; /** Nimrod locator */ public static final int NIMLOC = 32; /** Server selection */ public static final int SRV = 33; /** ATM address */ public static final int ATMA = 34; /** Naming authority pointer */ public static final int NAPTR = 35; /** Key exchange */ public static final int KX = 36; /** Certificate */ public static final int CERT = 37; /** IPv6 address (experimental) */ public static final int A6 = 38; /** Non-terminal name redirection */ public static final int DNAME = 39; /** Options - contains EDNS metadata */ public static final int OPT = 41; /** Address Prefix List */ public static final int APL = 42; /** Delegation Signer */ public static final int DS = 43; /** SSH Key Fingerprint */ public static final int SSHFP = 44; /** IPSEC key */ public static final int IPSECKEY = 45; /** Resource Record Signature */ public static final int RRSIG = 46; /** Next Secure Name */ public static final int NSEC = 47; /** DNSSEC Key */ public static final int DNSKEY = 48; /** Dynamic Host Configuration Protocol (DHCP) ID */ public static final int DHCID = 49; /** Next SECure, 3rd edition, RFC 5155 */ public static final int NSEC3 = 50; /** Next SECure PARAMeter, RFC 5155 */ public static final int NSEC3PARAM = 51; /** Transport Layer Security Authentication, draft-ietf-dane-protocol-23 */ public static final int TLSA = 52; /** Sender Policy Framework (experimental) */ public static final int SPF = 99; /** Transaction key - used to compute a shared secret or exchange a key */ public static final int TKEY = 249; /** Transaction signature */ public static final int TSIG = 250; /** Incremental zone transfer */ public static final int IXFR = 251; /** Zone transfer */ public static final int AXFR = 252; /** Transfer mailbox records */ public static final int MAILB = 253; /** Transfer mail agent records */ public static final int MAILA = 254; /** Matches any type */ public static final int ANY = 255; /** DNSSEC Lookaside Validation, RFC 4431 . */ public static final int DLV = 32769; private static class TypeMnemonic extends Mnemonic { private HashMap objects; public TypeMnemonic() { super("Type", CASE_UPPER); setPrefix("TYPE"); objects = new HashMap(); } public void add(int val, String str, Record proto) { super.add(val, str); objects.put(Mnemonic.toInteger(val), proto); } public void check(int val) { Type.check(val); } public Record getProto(int val) { check(val); return (Record) objects.get(toInteger(val)); } } private static TypeMnemonic types = new TypeMnemonic(); static { types.add(A, "A", new ARecord()); types.add(NS, "NS", new NSRecord()); types.add(MD, "MD", new MDRecord()); types.add(MF, "MF", new MFRecord()); types.add(CNAME, "CNAME", new CNAMERecord()); types.add(SOA, "SOA", new SOARecord()); types.add(MB, "MB", new MBRecord()); types.add(MG, "MG", new MGRecord()); types.add(MR, "MR", new MRRecord()); types.add(NULL, "NULL", new NULLRecord()); types.add(WKS, "WKS", new WKSRecord()); types.add(PTR, "PTR", new PTRRecord()); types.add(HINFO, "HINFO", new HINFORecord()); types.add(MINFO, "MINFO", new MINFORecord()); types.add(MX, "MX", new MXRecord()); types.add(TXT, "TXT", new TXTRecord()); types.add(RP, "RP", new RPRecord()); types.add(AFSDB, "AFSDB", new AFSDBRecord()); types.add(X25, "X25", new X25Record()); types.add(ISDN, "ISDN", new ISDNRecord()); types.add(RT, "RT", new RTRecord()); types.add(NSAP, "NSAP", new NSAPRecord()); types.add(NSAP_PTR, "NSAP-PTR", new NSAP_PTRRecord()); types.add(SIG, "SIG", new SIGRecord()); types.add(KEY, "KEY", new KEYRecord()); types.add(PX, "PX", new PXRecord()); types.add(GPOS, "GPOS", new GPOSRecord()); types.add(AAAA, "AAAA", new AAAARecord()); types.add(LOC, "LOC", new LOCRecord()); types.add(NXT, "NXT", new NXTRecord()); types.add(EID, "EID"); types.add(NIMLOC, "NIMLOC"); types.add(SRV, "SRV", new SRVRecord()); types.add(ATMA, "ATMA"); types.add(NAPTR, "NAPTR", new NAPTRRecord()); types.add(KX, "KX", new KXRecord()); types.add(CERT, "CERT", new CERTRecord()); types.add(A6, "A6", new A6Record()); types.add(DNAME, "DNAME", new DNAMERecord()); types.add(OPT, "OPT", new OPTRecord()); types.add(APL, "APL", new APLRecord()); types.add(DS, "DS", new DSRecord()); types.add(SSHFP, "SSHFP", new SSHFPRecord()); types.add(IPSECKEY, "IPSECKEY", new IPSECKEYRecord()); types.add(RRSIG, "RRSIG", new RRSIGRecord()); types.add(NSEC, "NSEC", new NSECRecord()); types.add(DNSKEY, "DNSKEY", new DNSKEYRecord()); types.add(DHCID, "DHCID", new DHCIDRecord()); types.add(NSEC3, "NSEC3", new NSEC3Record()); types.add(NSEC3PARAM, "NSEC3PARAM", new NSEC3PARAMRecord()); types.add(TLSA, "TLSA", new TLSARecord()); types.add(SPF, "SPF", new SPFRecord()); types.add(TKEY, "TKEY", new TKEYRecord()); types.add(TSIG, "TSIG", new TSIGRecord()); types.add(IXFR, "IXFR"); types.add(AXFR, "AXFR"); types.add(MAILB, "MAILB"); types.add(MAILA, "MAILA"); types.add(ANY, "ANY"); types.add(DLV, "DLV", new DLVRecord()); } private Type() { } /** * Checks that a numeric Type is valid. * @throws InvalidTypeException The type is out of range. */ public static void check(int val) { if (val < 0 || val > 0xFFFF) throw new InvalidTypeException(val); } /** * Converts a numeric Type into a String * @param val The type value. * @return The canonical string representation of the type * @throws InvalidTypeException The type is out of range. */ public static String string(int val) { return types.getText(val); } /** * Converts a String representation of an Type into its numeric value. * @param s The string representation of the type * @param numberok Whether a number will be accepted or not. * @return The type code, or -1 on error. */ public static int value(String s, boolean numberok) { int val = types.getValue(s); if (val == -1 && numberok) { val = types.getValue("TYPE" + s); } return val; } /** * Converts a String representation of an Type into its numeric value * @return The type code, or -1 on error. */ public static int value(String s) { return value(s, false); } static Record getProto(int val) { return types.getProto(val); } /** Is this type valid for a record (a non-meta type)? */ public static boolean isRR(int type) { switch (type) { case OPT: case TKEY: case TSIG: case IXFR: case AXFR: case MAILB: case MAILA: case ANY: return false; default: return true; } } } dnsjava-2.1.5/org/xbill/DNS/TypeBitmap.java100644 0 0 6156 11574245370 15562 0ustar 0 0 // Copyright (c) 2004-2009 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * Routines for deal with the lists of types found in NSEC/NSEC3 records. * * @author Brian Wellington */ import java.io.*; import java.util.*; final class TypeBitmap implements Serializable { private static final long serialVersionUID = -125354057735389003L; private TreeSet types; private TypeBitmap() { types = new TreeSet(); } public TypeBitmap(int [] array) { this(); for (int i = 0; i < array.length; i++) { Type.check(array[i]); types.add(new Integer(array[i])); } } public TypeBitmap(DNSInput in) throws WireParseException { this(); int lastbase = -1; while (in.remaining() > 0) { if (in.remaining() < 2) throw new WireParseException ("invalid bitmap descriptor"); int mapbase = in.readU8(); if (mapbase < lastbase) throw new WireParseException("invalid ordering"); int maplength = in.readU8(); if (maplength > in.remaining()) throw new WireParseException("invalid bitmap"); for (int i = 0; i < maplength; i++) { int current = in.readU8(); if (current == 0) continue; for (int j = 0; j < 8; j++) { if ((current & (1 << (7 - j))) == 0) continue; int typecode = mapbase * 256 + + i * 8 + j; types.add(Mnemonic.toInteger(typecode)); } } } } public TypeBitmap(Tokenizer st) throws IOException { this(); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; int typecode = Type.value(t.value); if (typecode < 0) { throw st.exception("Invalid type: " + t.value); } types.add(Mnemonic.toInteger(typecode)); } st.unget(); } public int [] toArray() { int [] array = new int[types.size()]; int n = 0; for (Iterator it = types.iterator(); it.hasNext(); ) array[n++] = ((Integer)it.next()).intValue(); return array; } public String toString() { StringBuffer sb = new StringBuffer(); for (Iterator it = types.iterator(); it.hasNext(); ) { int t = ((Integer)it.next()).intValue(); sb.append(Type.string(t)); if (it.hasNext()) sb.append(' '); } return sb.toString(); } private static void mapToWire(DNSOutput out, TreeSet map, int mapbase) { int arraymax = (((Integer)map.last()).intValue()) & 0xFF; int arraylength = (arraymax / 8) + 1; int [] array = new int[arraylength]; out.writeU8(mapbase); out.writeU8(arraylength); for (Iterator it = map.iterator(); it.hasNext(); ) { int typecode = ((Integer)it.next()).intValue(); array[(typecode & 0xFF) / 8] |= (1 << ( 7 - typecode % 8)); } for (int j = 0; j < arraylength; j++) out.writeU8(array[j]); } public void toWire(DNSOutput out) { if (types.size() == 0) return; int mapbase = -1; TreeSet map = new TreeSet(); for (Iterator it = types.iterator(); it.hasNext(); ) { int t = ((Integer)it.next()).intValue(); int base = t >> 8; if (base != mapbase) { if (map.size() > 0) { mapToWire(out, map, mapbase); map.clear(); } mapbase = base; } map.add(new Integer(t)); } mapToWire(out, map, mapbase); } public boolean empty() { return types.isEmpty(); } public boolean contains(int typecode) { return types.contains(Mnemonic.toInteger(typecode)); } } dnsjava-2.1.5/org/xbill/DNS/U16NameBase.java100644 0 0 2723 11254312416 15436 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * Implements common functionality for the many record types whose format * is an unsigned 16 bit integer followed by a name. * * @author Brian Wellington */ abstract class U16NameBase extends Record { private static final long serialVersionUID = -8315884183112502995L; protected int u16Field; protected Name nameField; protected U16NameBase() {} protected U16NameBase(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } protected U16NameBase(Name name, int type, int dclass, long ttl, int u16Field, String u16Description, Name nameField, String nameDescription) { super(name, type, dclass, ttl); this.u16Field = checkU16(u16Description, u16Field); this.nameField = checkName(nameDescription, nameField); } void rrFromWire(DNSInput in) throws IOException { u16Field = in.readU16(); nameField = new Name(in); } void rdataFromString(Tokenizer st, Name origin) throws IOException { u16Field = st.getUInt16(); nameField = st.getName(origin); } String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(u16Field); sb.append(" "); sb.append(nameField); return sb.toString(); } protected int getU16Field() { return u16Field; } protected Name getNameField() { return nameField; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeU16(u16Field); nameField.toWire(out, null, canonical); } } dnsjava-2.1.5/org/xbill/DNS/UDPClient.java100644 0 0 7564 11363525452 15275 0ustar 0 0 // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.net.*; import java.security.SecureRandom; import java.nio.*; import java.nio.channels.*; final class UDPClient extends Client { private static final int EPHEMERAL_START = 1024; private static final int EPHEMERAL_STOP = 65535; private static final int EPHEMERAL_RANGE = EPHEMERAL_STOP - EPHEMERAL_START; private static SecureRandom prng = new SecureRandom(); private static volatile boolean prng_initializing = true; /* * On some platforms (Windows), the SecureRandom module initialization involves * a call to InetAddress.getLocalHost(), which can end up here if using a * dnsjava name service provider. * * This can cause problems in multiple ways. * - If the SecureRandom seed generation process calls into here, and this * module attempts to seed the local SecureRandom object, the thread hangs. * - If something else calls InetAddress.getLocalHost(), and that causes this * module to seed the local SecureRandom object, the thread hangs. * * To avoid both of these, check at initialization time to see if InetAddress * is in the call chain. If so, initialize the SecureRandom object in a new * thread, and disable port randomization until it completes. */ static { new Thread(new Runnable() { public void run() { int n = prng.nextInt(); prng_initializing = false; }}).start(); } private boolean bound = false; public UDPClient(long endTime) throws IOException { super(DatagramChannel.open(), endTime); } private void bind_random(InetSocketAddress addr) throws IOException { if (prng_initializing) { try { Thread.sleep(2); } catch (InterruptedException e) { } if (prng_initializing) return; } DatagramChannel channel = (DatagramChannel) key.channel(); InetSocketAddress temp; for (int i = 0; i < 1024; i++) { try { int port = prng.nextInt(EPHEMERAL_RANGE) + EPHEMERAL_START; if (addr != null) temp = new InetSocketAddress(addr.getAddress(), port); else temp = new InetSocketAddress(port); channel.socket().bind(temp); bound = true; return; } catch (SocketException e) { } } } void bind(SocketAddress addr) throws IOException { if (addr == null || (addr instanceof InetSocketAddress && ((InetSocketAddress)addr).getPort() == 0)) { bind_random((InetSocketAddress) addr); if (bound) return; } if (addr != null) { DatagramChannel channel = (DatagramChannel) key.channel(); channel.socket().bind(addr); bound = true; } } void connect(SocketAddress addr) throws IOException { if (!bound) bind(null); DatagramChannel channel = (DatagramChannel) key.channel(); channel.connect(addr); } void send(byte [] data) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); verboseLog("UDP write", data); channel.write(ByteBuffer.wrap(data)); } byte [] recv(int max) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); byte [] temp = new byte[max]; key.interestOps(SelectionKey.OP_READ); try { while (!key.isReadable()) blockUntil(key, endTime); } finally { if (key.isValid()) key.interestOps(0); } long ret = channel.read(ByteBuffer.wrap(temp)); if (ret <= 0) throw new EOFException(); int len = (int) ret; byte [] data = new byte[len]; System.arraycopy(temp, 0, data, 0, len); verboseLog("UDP read", data); return data; } static byte [] sendrecv(SocketAddress local, SocketAddress remote, byte [] data, int max, long endTime) throws IOException { UDPClient client = new UDPClient(endTime); try { client.bind(local); client.connect(remote); client.send(data); return client.recv(max); } finally { client.cleanup(); } } static byte [] sendrecv(SocketAddress addr, byte [] data, int max, long endTime) throws IOException { return sendrecv(null, addr, data, max, endTime); } } dnsjava-2.1.5/org/xbill/DNS/UNKRecord.java100644 0 0 1745 11254312416 15266 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * A class implementing Records of unknown and/or unimplemented types. This * class can only be initialized using static Record initializers. * * @author Brian Wellington */ public class UNKRecord extends Record { private static final long serialVersionUID = -4193583311594626915L; private byte [] data; UNKRecord() {} Record getObject() { return new UNKRecord(); } void rrFromWire(DNSInput in) throws IOException { data = in.readByteArray(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { throw st.exception("invalid unknown RR encoding"); } /** Converts this Record to the String "unknown format" */ String rrToString() { return unknownToString(data); } /** Returns the contents of this record. */ public byte [] getData() { return data; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(data); } } dnsjava-2.1.5/org/xbill/DNS/Update.java100644 0 0 17324 7775216774 14743 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A helper class for constructing dynamic DNS (DDNS) update messages. * * @author Brian Wellington */ public class Update extends Message { private Name origin; private int dclass; /** * Creates an update message. * @param zone The name of the zone being updated. * @param dclass The class of the zone being updated. */ public Update(Name zone, int dclass) { super(); if (!zone.isAbsolute()) throw new RelativeNameException(zone); DClass.check(dclass); getHeader().setOpcode(Opcode.UPDATE); Record soa = Record.newRecord(zone, Type.SOA, DClass.IN); addRecord(soa, Section.QUESTION); this.origin = zone; this.dclass = dclass; } /** * Creates an update message. The class is assumed to be IN. * @param zone The name of the zone being updated. */ public Update(Name zone) { this(zone, DClass.IN); } private void newPrereq(Record rec) { addRecord(rec, Section.PREREQ); } private void newUpdate(Record rec) { addRecord(rec, Section.UPDATE); } /** * Inserts a prerequisite that the specified name exists; that is, there * exist records with the given name in the zone. */ public void present(Name name) { newPrereq(Record.newRecord(name, Type.ANY, DClass.ANY, 0)); } /** * Inserts a prerequisite that the specified rrset exists; that is, there * exist records with the given name and type in the zone. */ public void present(Name name, int type) { newPrereq(Record.newRecord(name, type, DClass.ANY, 0)); } /** * Parses a record from the string, and inserts a prerequisite that the * record exists. Due to the way value-dependent prequisites work, the * condition that must be met is that the set of all records with the same * and type in the update message must be identical to the set of all records * with that name and type on the server. * @throws IOException The record could not be parsed. */ public void present(Name name, int type, String record) throws IOException { newPrereq(Record.fromString(name, type, dclass, 0, record, origin)); } /** * Parses a record from the tokenizer, and inserts a prerequisite that the * record exists. Due to the way value-dependent prequisites work, the * condition that must be met is that the set of all records with the same * and type in the update message must be identical to the set of all records * with that name and type on the server. * @throws IOException The record could not be parsed. */ public void present(Name name, int type, Tokenizer tokenizer) throws IOException { newPrereq(Record.fromString(name, type, dclass, 0, tokenizer, origin)); } /** * Inserts a prerequisite that the specified record exists. Due to the way * value-dependent prequisites work, the condition that must be met is that * the set of all records with the same and type in the update message must * be identical to the set of all records with that name and type on the server. */ public void present(Record record) { newPrereq(record); } /** * Inserts a prerequisite that the specified name does not exist; that is, * there are no records with the given name in the zone. */ public void absent(Name name) { newPrereq(Record.newRecord(name, Type.ANY, DClass.NONE, 0)); } /** * Inserts a prerequisite that the specified rrset does not exist; that is, * there are no records with the given name and type in the zone. */ public void absent(Name name, int type) { newPrereq(Record.newRecord(name, type, DClass.NONE, 0)); } /** * Parses a record from the string, and indicates that the record * should be inserted into the zone. * @throws IOException The record could not be parsed. */ public void add(Name name, int type, long ttl, String record) throws IOException { newUpdate(Record.fromString(name, type, dclass, ttl, record, origin)); } /** * Parses a record from the tokenizer, and indicates that the record * should be inserted into the zone. * @throws IOException The record could not be parsed. */ public void add(Name name, int type, long ttl, Tokenizer tokenizer) throws IOException { newUpdate(Record.fromString(name, type, dclass, ttl, tokenizer, origin)); } /** * Indicates that the record should be inserted into the zone. */ public void add(Record record) { newUpdate(record); } /** * Indicates that the records should be inserted into the zone. */ public void add(Record [] records) { for (int i = 0; i < records.length; i++) add(records[i]); } /** * Indicates that all of the records in the rrset should be inserted into the * zone. */ public void add(RRset rrset) { for (Iterator it = rrset.rrs(); it.hasNext(); ) add((Record) it.next()); } /** * Indicates that all records with the given name should be deleted from * the zone. */ public void delete(Name name) { newUpdate(Record.newRecord(name, Type.ANY, DClass.ANY, 0)); } /** * Indicates that all records with the given name and type should be deleted * from the zone. */ public void delete(Name name, int type) { newUpdate(Record.newRecord(name, type, DClass.ANY, 0)); } /** * Parses a record from the string, and indicates that the record * should be deleted from the zone. * @throws IOException The record could not be parsed. */ public void delete(Name name, int type, String record) throws IOException { newUpdate(Record.fromString(name, type, DClass.NONE, 0, record, origin)); } /** * Parses a record from the tokenizer, and indicates that the record * should be deleted from the zone. * @throws IOException The record could not be parsed. */ public void delete(Name name, int type, Tokenizer tokenizer) throws IOException { newUpdate(Record.fromString(name, type, DClass.NONE, 0, tokenizer, origin)); } /** * Indicates that the specified record should be deleted from the zone. */ public void delete(Record record) { newUpdate(record.withDClass(DClass.NONE, 0)); } /** * Indicates that the records should be deleted from the zone. */ public void delete(Record [] records) { for (int i = 0; i < records.length; i++) delete(records[i]); } /** * Indicates that all of the records in the rrset should be deleted from the * zone. */ public void delete(RRset rrset) { for (Iterator it = rrset.rrs(); it.hasNext(); ) delete((Record) it.next()); } /** * Parses a record from the string, and indicates that the record * should be inserted into the zone replacing any other records with the * same name and type. * @throws IOException The record could not be parsed. */ public void replace(Name name, int type, long ttl, String record) throws IOException { delete(name, type); add(name, type, ttl, record); } /** * Parses a record from the tokenizer, and indicates that the record * should be inserted into the zone replacing any other records with the * same name and type. * @throws IOException The record could not be parsed. */ public void replace(Name name, int type, long ttl, Tokenizer tokenizer) throws IOException { delete(name, type); add(name, type, ttl, tokenizer); } /** * Indicates that the record should be inserted into the zone replacing any * other records with the same name and type. */ public void replace(Record record) { delete(record.getName(), record.getType()); add(record); } /** * Indicates that the records should be inserted into the zone replacing any * other records with the same name and type as each one. */ public void replace(Record [] records) { for (int i = 0; i < records.length; i++) replace(records[i]); } /** * Indicates that all of the records in the rrset should be inserted into the * zone replacing any other records with the same name and type. */ public void replace(RRset rrset) { delete(rrset.getName(), rrset.getType()); for (Iterator it = rrset.rrs(); it.hasNext(); ) add((Record) it.next()); } } dnsjava-2.1.5/org/xbill/DNS/WKSRecord.java100644 0 0 42160 11254312416 15311 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.net.*; import java.io.*; import java.util.*; /** * Well Known Services - Lists services offered by this host. * * @author Brian Wellington */ public class WKSRecord extends Record { private static final long serialVersionUID = -9104259763909119805L; public static class Protocol { /** * IP protocol identifiers. This is basically copied out of RFC 1010. */ private Protocol() {} /** Internet Control Message */ public static final int ICMP = 1; /** Internet Group Management */ public static final int IGMP = 2; /** Gateway-to-Gateway */ public static final int GGP = 3; /** Stream */ public static final int ST = 5; /** Transmission Control */ public static final int TCP = 6; /** UCL */ public static final int UCL = 7; /** Exterior Gateway Protocol */ public static final int EGP = 8; /** any private interior gateway */ public static final int IGP = 9; /** BBN RCC Monitoring */ public static final int BBN_RCC_MON = 10; /** Network Voice Protocol */ public static final int NVP_II = 11; /** PUP */ public static final int PUP = 12; /** ARGUS */ public static final int ARGUS = 13; /** EMCON */ public static final int EMCON = 14; /** Cross Net Debugger */ public static final int XNET = 15; /** Chaos */ public static final int CHAOS = 16; /** User Datagram */ public static final int UDP = 17; /** Multiplexing */ public static final int MUX = 18; /** DCN Measurement Subsystems */ public static final int DCN_MEAS = 19; /** Host Monitoring */ public static final int HMP = 20; /** Packet Radio Measurement */ public static final int PRM = 21; /** XEROX NS IDP */ public static final int XNS_IDP = 22; /** Trunk-1 */ public static final int TRUNK_1 = 23; /** Trunk-2 */ public static final int TRUNK_2 = 24; /** Leaf-1 */ public static final int LEAF_1 = 25; /** Leaf-2 */ public static final int LEAF_2 = 26; /** Reliable Data Protocol */ public static final int RDP = 27; /** Internet Reliable Transaction */ public static final int IRTP = 28; /** ISO Transport Protocol Class 4 */ public static final int ISO_TP4 = 29; /** Bulk Data Transfer Protocol */ public static final int NETBLT = 30; /** MFE Network Services Protocol */ public static final int MFE_NSP = 31; /** MERIT Internodal Protocol */ public static final int MERIT_INP = 32; /** Sequential Exchange Protocol */ public static final int SEP = 33; /** CFTP */ public static final int CFTP = 62; /** SATNET and Backroom EXPAK */ public static final int SAT_EXPAK = 64; /** MIT Subnet Support */ public static final int MIT_SUBNET = 65; /** MIT Remote Virtual Disk Protocol */ public static final int RVD = 66; /** Internet Pluribus Packet Core */ public static final int IPPC = 67; /** SATNET Monitoring */ public static final int SAT_MON = 69; /** Internet Packet Core Utility */ public static final int IPCV = 71; /** Backroom SATNET Monitoring */ public static final int BR_SAT_MON = 76; /** WIDEBAND Monitoring */ public static final int WB_MON = 78; /** WIDEBAND EXPAK */ public static final int WB_EXPAK = 79; private static Mnemonic protocols = new Mnemonic("IP protocol", Mnemonic.CASE_LOWER); static { protocols.setMaximum(0xFF); protocols.setNumericAllowed(true); protocols.add(ICMP, "icmp"); protocols.add(IGMP, "igmp"); protocols.add(GGP, "ggp"); protocols.add(ST, "st"); protocols.add(TCP, "tcp"); protocols.add(UCL, "ucl"); protocols.add(EGP, "egp"); protocols.add(IGP, "igp"); protocols.add(BBN_RCC_MON, "bbn-rcc-mon"); protocols.add(NVP_II, "nvp-ii"); protocols.add(PUP, "pup"); protocols.add(ARGUS, "argus"); protocols.add(EMCON, "emcon"); protocols.add(XNET, "xnet"); protocols.add(CHAOS, "chaos"); protocols.add(UDP, "udp"); protocols.add(MUX, "mux"); protocols.add(DCN_MEAS, "dcn-meas"); protocols.add(HMP, "hmp"); protocols.add(PRM, "prm"); protocols.add(XNS_IDP, "xns-idp"); protocols.add(TRUNK_1, "trunk-1"); protocols.add(TRUNK_2, "trunk-2"); protocols.add(LEAF_1, "leaf-1"); protocols.add(LEAF_2, "leaf-2"); protocols.add(RDP, "rdp"); protocols.add(IRTP, "irtp"); protocols.add(ISO_TP4, "iso-tp4"); protocols.add(NETBLT, "netblt"); protocols.add(MFE_NSP, "mfe-nsp"); protocols.add(MERIT_INP, "merit-inp"); protocols.add(SEP, "sep"); protocols.add(CFTP, "cftp"); protocols.add(SAT_EXPAK, "sat-expak"); protocols.add(MIT_SUBNET, "mit-subnet"); protocols.add(RVD, "rvd"); protocols.add(IPPC, "ippc"); protocols.add(SAT_MON, "sat-mon"); protocols.add(IPCV, "ipcv"); protocols.add(BR_SAT_MON, "br-sat-mon"); protocols.add(WB_MON, "wb-mon"); protocols.add(WB_EXPAK, "wb-expak"); } /** * Converts an IP protocol value into its textual representation */ public static String string(int type) { return protocols.getText(type); } /** * Converts a textual representation of an IP protocol into its * numeric code. Integers in the range 0..255 are also accepted. * @param s The textual representation of the protocol * @return The protocol code, or -1 on error. */ public static int value(String s) { return protocols.getValue(s); } } public static class Service { /** * TCP/UDP services. This is basically copied out of RFC 1010, * with MIT-ML-DEV removed, as it is not unique, and the description * of SWIFT-RVF fixed. */ private Service() {} /** Remote Job Entry */ public static final int RJE = 5; /** Echo */ public static final int ECHO = 7; /** Discard */ public static final int DISCARD = 9; /** Active Users */ public static final int USERS = 11; /** Daytime */ public static final int DAYTIME = 13; /** Quote of the Day */ public static final int QUOTE = 17; /** Character Generator */ public static final int CHARGEN = 19; /** File Transfer [Default Data] */ public static final int FTP_DATA = 20; /** File Transfer [Control] */ public static final int FTP = 21; /** Telnet */ public static final int TELNET = 23; /** Simple Mail Transfer */ public static final int SMTP = 25; /** NSW User System FE */ public static final int NSW_FE = 27; /** MSG ICP */ public static final int MSG_ICP = 29; /** MSG Authentication */ public static final int MSG_AUTH = 31; /** Display Support Protocol */ public static final int DSP = 33; /** Time */ public static final int TIME = 37; /** Resource Location Protocol */ public static final int RLP = 39; /** Graphics */ public static final int GRAPHICS = 41; /** Host Name Server */ public static final int NAMESERVER = 42; /** Who Is */ public static final int NICNAME = 43; /** MPM FLAGS Protocol */ public static final int MPM_FLAGS = 44; /** Message Processing Module [recv] */ public static final int MPM = 45; /** MPM [default send] */ public static final int MPM_SND = 46; /** NI FTP */ public static final int NI_FTP = 47; /** Login Host Protocol */ public static final int LOGIN = 49; /** IMP Logical Address Maintenance */ public static final int LA_MAINT = 51; /** Domain Name Server */ public static final int DOMAIN = 53; /** ISI Graphics Language */ public static final int ISI_GL = 55; /** NI MAIL */ public static final int NI_MAIL = 61; /** VIA Systems - FTP */ public static final int VIA_FTP = 63; /** TACACS-Database Service */ public static final int TACACS_DS = 65; /** Bootstrap Protocol Server */ public static final int BOOTPS = 67; /** Bootstrap Protocol Client */ public static final int BOOTPC = 68; /** Trivial File Transfer */ public static final int TFTP = 69; /** Remote Job Service */ public static final int NETRJS_1 = 71; /** Remote Job Service */ public static final int NETRJS_2 = 72; /** Remote Job Service */ public static final int NETRJS_3 = 73; /** Remote Job Service */ public static final int NETRJS_4 = 74; /** Finger */ public static final int FINGER = 79; /** HOSTS2 Name Server */ public static final int HOSTS2_NS = 81; /** SU/MIT Telnet Gateway */ public static final int SU_MIT_TG = 89; /** MIT Dover Spooler */ public static final int MIT_DOV = 91; /** Device Control Protocol */ public static final int DCP = 93; /** SUPDUP */ public static final int SUPDUP = 95; /** Swift Remote Virtual File Protocol */ public static final int SWIFT_RVF = 97; /** TAC News */ public static final int TACNEWS = 98; /** Metagram Relay */ public static final int METAGRAM = 99; /** NIC Host Name Server */ public static final int HOSTNAME = 101; /** ISO-TSAP */ public static final int ISO_TSAP = 102; /** X400 */ public static final int X400 = 103; /** X400-SND */ public static final int X400_SND = 104; /** Mailbox Name Nameserver */ public static final int CSNET_NS = 105; /** Remote Telnet Service */ public static final int RTELNET = 107; /** Post Office Protocol - Version 2 */ public static final int POP_2 = 109; /** SUN Remote Procedure Call */ public static final int SUNRPC = 111; /** Authentication Service */ public static final int AUTH = 113; /** Simple File Transfer Protocol */ public static final int SFTP = 115; /** UUCP Path Service */ public static final int UUCP_PATH = 117; /** Network News Transfer Protocol */ public static final int NNTP = 119; /** HYDRA Expedited Remote Procedure */ public static final int ERPC = 121; /** Network Time Protocol */ public static final int NTP = 123; /** Locus PC-Interface Net Map Server */ public static final int LOCUS_MAP = 125; /** Locus PC-Interface Conn Server */ public static final int LOCUS_CON = 127; /** Password Generator Protocol */ public static final int PWDGEN = 129; /** CISCO FNATIVE */ public static final int CISCO_FNA = 130; /** CISCO TNATIVE */ public static final int CISCO_TNA = 131; /** CISCO SYSMAINT */ public static final int CISCO_SYS = 132; /** Statistics Service */ public static final int STATSRV = 133; /** INGRES-NET Service */ public static final int INGRES_NET = 134; /** Location Service */ public static final int LOC_SRV = 135; /** PROFILE Naming System */ public static final int PROFILE = 136; /** NETBIOS Name Service */ public static final int NETBIOS_NS = 137; /** NETBIOS Datagram Service */ public static final int NETBIOS_DGM = 138; /** NETBIOS Session Service */ public static final int NETBIOS_SSN = 139; /** EMFIS Data Service */ public static final int EMFIS_DATA = 140; /** EMFIS Control Service */ public static final int EMFIS_CNTL = 141; /** Britton-Lee IDM */ public static final int BL_IDM = 142; /** Survey Measurement */ public static final int SUR_MEAS = 243; /** LINK */ public static final int LINK = 245; private static Mnemonic services = new Mnemonic("TCP/UDP service", Mnemonic.CASE_LOWER); static { services.setMaximum(0xFFFF); services.setNumericAllowed(true); services.add(RJE, "rje"); services.add(ECHO, "echo"); services.add(DISCARD, "discard"); services.add(USERS, "users"); services.add(DAYTIME, "daytime"); services.add(QUOTE, "quote"); services.add(CHARGEN, "chargen"); services.add(FTP_DATA, "ftp-data"); services.add(FTP, "ftp"); services.add(TELNET, "telnet"); services.add(SMTP, "smtp"); services.add(NSW_FE, "nsw-fe"); services.add(MSG_ICP, "msg-icp"); services.add(MSG_AUTH, "msg-auth"); services.add(DSP, "dsp"); services.add(TIME, "time"); services.add(RLP, "rlp"); services.add(GRAPHICS, "graphics"); services.add(NAMESERVER, "nameserver"); services.add(NICNAME, "nicname"); services.add(MPM_FLAGS, "mpm-flags"); services.add(MPM, "mpm"); services.add(MPM_SND, "mpm-snd"); services.add(NI_FTP, "ni-ftp"); services.add(LOGIN, "login"); services.add(LA_MAINT, "la-maint"); services.add(DOMAIN, "domain"); services.add(ISI_GL, "isi-gl"); services.add(NI_MAIL, "ni-mail"); services.add(VIA_FTP, "via-ftp"); services.add(TACACS_DS, "tacacs-ds"); services.add(BOOTPS, "bootps"); services.add(BOOTPC, "bootpc"); services.add(TFTP, "tftp"); services.add(NETRJS_1, "netrjs-1"); services.add(NETRJS_2, "netrjs-2"); services.add(NETRJS_3, "netrjs-3"); services.add(NETRJS_4, "netrjs-4"); services.add(FINGER, "finger"); services.add(HOSTS2_NS, "hosts2-ns"); services.add(SU_MIT_TG, "su-mit-tg"); services.add(MIT_DOV, "mit-dov"); services.add(DCP, "dcp"); services.add(SUPDUP, "supdup"); services.add(SWIFT_RVF, "swift-rvf"); services.add(TACNEWS, "tacnews"); services.add(METAGRAM, "metagram"); services.add(HOSTNAME, "hostname"); services.add(ISO_TSAP, "iso-tsap"); services.add(X400, "x400"); services.add(X400_SND, "x400-snd"); services.add(CSNET_NS, "csnet-ns"); services.add(RTELNET, "rtelnet"); services.add(POP_2, "pop-2"); services.add(SUNRPC, "sunrpc"); services.add(AUTH, "auth"); services.add(SFTP, "sftp"); services.add(UUCP_PATH, "uucp-path"); services.add(NNTP, "nntp"); services.add(ERPC, "erpc"); services.add(NTP, "ntp"); services.add(LOCUS_MAP, "locus-map"); services.add(LOCUS_CON, "locus-con"); services.add(PWDGEN, "pwdgen"); services.add(CISCO_FNA, "cisco-fna"); services.add(CISCO_TNA, "cisco-tna"); services.add(CISCO_SYS, "cisco-sys"); services.add(STATSRV, "statsrv"); services.add(INGRES_NET, "ingres-net"); services.add(LOC_SRV, "loc-srv"); services.add(PROFILE, "profile"); services.add(NETBIOS_NS, "netbios-ns"); services.add(NETBIOS_DGM, "netbios-dgm"); services.add(NETBIOS_SSN, "netbios-ssn"); services.add(EMFIS_DATA, "emfis-data"); services.add(EMFIS_CNTL, "emfis-cntl"); services.add(BL_IDM, "bl-idm"); services.add(SUR_MEAS, "sur-meas"); services.add(LINK, "link"); } /** * Converts a TCP/UDP service port number into its textual * representation. */ public static String string(int type) { return services.getText(type); } /** * Converts a textual representation of a TCP/UDP service into its * port number. Integers in the range 0..65535 are also accepted. * @param s The textual representation of the service. * @return The port number, or -1 on error. */ public static int value(String s) { return services.getValue(s); } } private byte [] address; private int protocol; private int [] services; WKSRecord() {} Record getObject() { return new WKSRecord(); } /** * Creates a WKS Record from the given data * @param address The IP address * @param protocol The IP protocol number * @param services An array of supported services, represented by port number. */ public WKSRecord(Name name, int dclass, long ttl, InetAddress address, int protocol, int [] services) { super(name, Type.WKS, dclass, ttl); if (Address.familyOf(address) != Address.IPv4) throw new IllegalArgumentException("invalid IPv4 address"); this.address = address.getAddress(); this.protocol = checkU8("protocol", protocol); for (int i = 0; i < services.length; i++) { checkU16("service", services[i]); } this.services = new int[services.length]; System.arraycopy(services, 0, this.services, 0, services.length); Arrays.sort(this.services); } void rrFromWire(DNSInput in) throws IOException { address = in.readByteArray(4); protocol = in.readU8(); byte [] array = in.readByteArray(); List list = new ArrayList(); for (int i = 0; i < array.length; i++) { for (int j = 0; j < 8; j++) { int octet = array[i] & 0xFF; if ((octet & (1 << (7 - j))) != 0) { list.add(new Integer(i * 8 + j)); } } } services = new int[list.size()]; for (int i = 0; i < list.size(); i++) { services[i] = ((Integer) list.get(i)).intValue(); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { String s = st.getString(); address = Address.toByteArray(s, Address.IPv4); if (address == null) throw st.exception("invalid address"); s = st.getString(); protocol = Protocol.value(s); if (protocol < 0) { throw st.exception("Invalid IP protocol: " + s); } List list = new ArrayList(); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; int service = Service.value(t.value); if (service < 0) { throw st.exception("Invalid TCP/UDP service: " + t.value); } list.add(new Integer(service)); } st.unget(); services = new int[list.size()]; for (int i = 0; i < list.size(); i++) { services[i] = ((Integer) list.get(i)).intValue(); } } /** * Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(Address.toDottedQuad(address)); sb.append(" "); sb.append(protocol); for (int i = 0; i < services.length; i++) { sb.append(" " + services[i]); } return sb.toString(); } /** * Returns the IP address. */ public InetAddress getAddress() { try { return InetAddress.getByAddress(address); } catch (UnknownHostException e) { return null; } } /** * Returns the IP protocol. */ public int getProtocol() { return protocol; } /** * Returns the services provided by the host on the specified address. */ public int [] getServices() { return services; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeByteArray(address); out.writeU8(protocol); int highestPort = services[services.length - 1]; byte [] array = new byte[highestPort / 8 + 1]; for (int i = 0; i < services.length; i++) { int port = services[i]; array[port / 8] |= (1 << (7 - port % 8)); } out.writeByteArray(array); } } dnsjava-2.1.5/org/xbill/DNS/WireParseException.java100644 0 0 673 11563136673 17245 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * An exception thrown when a DNS message is invalid. * * @author Brian Wellington */ public class WireParseException extends IOException { public WireParseException() { super(); } public WireParseException(String s) { super(s); } public WireParseException(String s, Throwable cause) { super(s); initCause(cause); } } dnsjava-2.1.5/org/xbill/DNS/X25Record.java100644 0 0 3412 11254312416 15200 0ustar 0 0 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; /** * X25 - identifies the PSDN (Public Switched Data Network) address in the * X.121 numbering plan associated with a name. * * @author Brian Wellington */ public class X25Record extends Record { private static final long serialVersionUID = 4267576252335579764L; private byte [] address; X25Record() {} Record getObject() { return new X25Record(); } private static final byte [] checkAndConvertAddress(String address) { int length = address.length(); byte [] out = new byte [length]; for (int i = 0; i < length; i++) { char c = address.charAt(i); if (!Character.isDigit(c)) return null; out[i] = (byte) c; } return out; } /** * Creates an X25 Record from the given data * @param address The X.25 PSDN address. * @throws IllegalArgumentException The address is not a valid PSDN address. */ public X25Record(Name name, int dclass, long ttl, String address) { super(name, Type.X25, dclass, ttl); this.address = checkAndConvertAddress(address); if (this.address == null) { throw new IllegalArgumentException("invalid PSDN address " + address); } } void rrFromWire(DNSInput in) throws IOException { address = in.readCountedString(); } void rdataFromString(Tokenizer st, Name origin) throws IOException { String addr = st.getString(); this.address = checkAndConvertAddress(addr); if (this.address == null) throw st.exception("invalid PSDN address " + addr); } /** * Returns the X.25 PSDN address. */ public String getAddress() { return byteArrayToString(address, false); } void rrToWire(DNSOutput out, Compression c, boolean canonical) { out.writeCountedString(address); } String rrToString() { return byteArrayToString(address, true); } } dnsjava-2.1.5/org/xbill/DNS/Zone.java100644 0 0 27521 11370365226 14433 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * A DNS Zone. This encapsulates all data related to a Zone, and provides * convenient lookup methods. * * @author Brian Wellington */ public class Zone implements Serializable { private static final long serialVersionUID = -9220510891189510942L; /** A primary zone */ public static final int PRIMARY = 1; /** A secondary zone */ public static final int SECONDARY = 2; private Map data; private Name origin; private Object originNode; private int dclass = DClass.IN; private RRset NS; private SOARecord SOA; private boolean hasWild; class ZoneIterator implements Iterator { private Iterator zentries; private RRset [] current; private int count; private boolean wantLastSOA; ZoneIterator(boolean axfr) { synchronized (Zone.this) { zentries = data.entrySet().iterator(); } wantLastSOA = axfr; RRset [] sets = allRRsets(originNode); current = new RRset[sets.length]; for (int i = 0, j = 2; i < sets.length; i++) { int type = sets[i].getType(); if (type == Type.SOA) current[0] = sets[i]; else if (type == Type.NS) current[1] = sets[i]; else current[j++] = sets[i]; } } public boolean hasNext() { return (current != null || wantLastSOA); } public Object next() { if (!hasNext()) { throw new NoSuchElementException(); } if (current == null) { wantLastSOA = false; return oneRRset(originNode, Type.SOA); } Object set = current[count++]; if (count == current.length) { current = null; while (zentries.hasNext()) { Map.Entry entry = (Map.Entry) zentries.next(); if (entry.getKey().equals(origin)) continue; RRset [] sets = allRRsets(entry.getValue()); if (sets.length == 0) continue; current = sets; count = 0; break; } } return set; } public void remove() { throw new UnsupportedOperationException(); } } private void validate() throws IOException { originNode = exactName(origin); if (originNode == null) throw new IOException(origin + ": no data specified"); RRset rrset = oneRRset(originNode, Type.SOA); if (rrset == null || rrset.size() != 1) throw new IOException(origin + ": exactly 1 SOA must be specified"); Iterator it = rrset.rrs(); SOA = (SOARecord) it.next(); NS = oneRRset(originNode, Type.NS); if (NS == null) throw new IOException(origin + ": no NS set specified"); } private final void maybeAddRecord(Record record) throws IOException { int rtype = record.getType(); Name name = record.getName(); if (rtype == Type.SOA && !name.equals(origin)) { throw new IOException("SOA owner " + name + " does not match zone origin " + origin); } if (name.subdomain(origin)) addRecord(record); } /** * Creates a Zone from the records in the specified master file. * @param zone The name of the zone. * @param file The master file to read from. * @see Master */ public Zone(Name zone, String file) throws IOException { data = new TreeMap(); if (zone == null) throw new IllegalArgumentException("no zone name specified"); Master m = new Master(file, zone); Record record; origin = zone; while ((record = m.nextRecord()) != null) maybeAddRecord(record); validate(); } /** * Creates a Zone from an array of records. * @param zone The name of the zone. * @param records The records to add to the zone. * @see Master */ public Zone(Name zone, Record [] records) throws IOException { data = new TreeMap(); if (zone == null) throw new IllegalArgumentException("no zone name specified"); origin = zone; for (int i = 0; i < records.length; i++) maybeAddRecord(records[i]); validate(); } private void fromXFR(ZoneTransferIn xfrin) throws IOException, ZoneTransferException { data = new TreeMap(); origin = xfrin.getName(); List records = xfrin.run(); for (Iterator it = records.iterator(); it.hasNext(); ) { Record record = (Record) it.next(); maybeAddRecord(record); } if (!xfrin.isAXFR()) throw new IllegalArgumentException("zones can only be " + "created from AXFRs"); validate(); } /** * Creates a Zone by doing the specified zone transfer. * @param xfrin The incoming zone transfer to execute. * @see ZoneTransferIn */ public Zone(ZoneTransferIn xfrin) throws IOException, ZoneTransferException { fromXFR(xfrin); } /** * Creates a Zone by performing a zone transfer to the specified host. * @see ZoneTransferIn */ public Zone(Name zone, int dclass, String remote) throws IOException, ZoneTransferException { ZoneTransferIn xfrin = ZoneTransferIn.newAXFR(zone, remote, null); xfrin.setDClass(dclass); fromXFR(xfrin); } /** Returns the Zone's origin */ public Name getOrigin() { return origin; } /** Returns the Zone origin's NS records */ public RRset getNS() { return NS; } /** Returns the Zone's SOA record */ public SOARecord getSOA() { return SOA; } /** Returns the Zone's class */ public int getDClass() { return dclass; } private synchronized Object exactName(Name name) { return data.get(name); } private synchronized RRset [] allRRsets(Object types) { if (types instanceof List) { List typelist = (List) types; return (RRset []) typelist.toArray(new RRset[typelist.size()]); } else { RRset set = (RRset) types; return new RRset [] {set}; } } private synchronized RRset oneRRset(Object types, int type) { if (type == Type.ANY) throw new IllegalArgumentException("oneRRset(ANY)"); if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { RRset set = (RRset) list.get(i); if (set.getType() == type) return set; } } else { RRset set = (RRset) types; if (set.getType() == type) return set; } return null; } private synchronized RRset findRRset(Name name, int type) { Object types = exactName(name); if (types == null) return null; return oneRRset(types, type); } private synchronized void addRRset(Name name, RRset rrset) { if (!hasWild && name.isWild()) hasWild = true; Object types = data.get(name); if (types == null) { data.put(name, rrset); return; } int rtype = rrset.getType(); if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { RRset set = (RRset) list.get(i); if (set.getType() == rtype) { list.set(i, rrset); return; } } list.add(rrset); } else { RRset set = (RRset) types; if (set.getType() == rtype) data.put(name, rrset); else { LinkedList list = new LinkedList(); list.add(set); list.add(rrset); data.put(name, list); } } } private synchronized void removeRRset(Name name, int type) { Object types = data.get(name); if (types == null) { return; } if (types instanceof List) { List list = (List) types; for (int i = 0; i < list.size(); i++) { RRset set = (RRset) list.get(i); if (set.getType() == type) { list.remove(i); if (list.size() == 0) data.remove(name); return; } } } else { RRset set = (RRset) types; if (set.getType() != type) return; data.remove(name); } } private synchronized SetResponse lookup(Name name, int type) { int labels; int olabels; int tlabels; RRset rrset; Name tname; Object types; SetResponse sr; if (!name.subdomain(origin)) return SetResponse.ofType(SetResponse.NXDOMAIN); labels = name.labels(); olabels = origin.labels(); for (tlabels = olabels; tlabels <= labels; tlabels++) { boolean isOrigin = (tlabels == olabels); boolean isExact = (tlabels == labels); if (isOrigin) tname = origin; else if (isExact) tname = name; else tname = new Name(name, labels - tlabels); types = exactName(tname); if (types == null) continue; /* If this is a delegation, return that. */ if (!isOrigin) { RRset ns = oneRRset(types, Type.NS); if (ns != null) return new SetResponse(SetResponse.DELEGATION, ns); } /* If this is an ANY lookup, return everything. */ if (isExact && type == Type.ANY) { sr = new SetResponse(SetResponse.SUCCESSFUL); RRset [] sets = allRRsets(types); for (int i = 0; i < sets.length; i++) sr.addRRset(sets[i]); return sr; } /* * If this is the name, look for the actual type or a CNAME. * Otherwise, look for a DNAME. */ if (isExact) { rrset = oneRRset(types, type); if (rrset != null) { sr = new SetResponse(SetResponse.SUCCESSFUL); sr.addRRset(rrset); return sr; } rrset = oneRRset(types, Type.CNAME); if (rrset != null) return new SetResponse(SetResponse.CNAME, rrset); } else { rrset = oneRRset(types, Type.DNAME); if (rrset != null) return new SetResponse(SetResponse.DNAME, rrset); } /* We found the name, but not the type. */ if (isExact) return SetResponse.ofType(SetResponse.NXRRSET); } if (hasWild) { for (int i = 0; i < labels - olabels; i++) { tname = name.wild(i + 1); types = exactName(tname); if (types == null) continue; rrset = oneRRset(types, type); if (rrset != null) { sr = new SetResponse(SetResponse.SUCCESSFUL); sr.addRRset(rrset); return sr; } } } return SetResponse.ofType(SetResponse.NXDOMAIN); } /** * Looks up Records in the Zone. This follows CNAMEs and wildcards. * @param name The name to look up * @param type The type to look up * @return A SetResponse object * @see SetResponse */ public SetResponse findRecords(Name name, int type) { return lookup(name, type); } /** * Looks up Records in the zone, finding exact matches only. * @param name The name to look up * @param type The type to look up * @return The matching RRset * @see RRset */ public RRset findExactMatch(Name name, int type) { Object types = exactName(name); if (types == null) return null; return oneRRset(types, type); } /** * Adds an RRset to the Zone * @param rrset The RRset to be added * @see RRset */ public void addRRset(RRset rrset) { Name name = rrset.getName(); addRRset(name, rrset); } /** * Adds a Record to the Zone * @param r The record to be added * @see Record */ public void addRecord(Record r) { Name name = r.getName(); int rtype = r.getRRsetType(); synchronized (this) { RRset rrset = findRRset(name, rtype); if (rrset == null) { rrset = new RRset(r); addRRset(name, rrset); } else { rrset.addRR(r); } } } /** * Removes a record from the Zone * @param r The record to be removed * @see Record */ public void removeRecord(Record r) { Name name = r.getName(); int rtype = r.getRRsetType(); synchronized (this) { RRset rrset = findRRset(name, rtype); if (rrset == null) return; if (rrset.size() == 1 && rrset.first().equals(r)) removeRRset(name, rtype); else rrset.deleteRR(r); } } /** * Returns an Iterator over the RRsets in the zone. */ public Iterator iterator() { return new ZoneIterator(false); } /** * Returns an Iterator over the RRsets in the zone that can be used to * construct an AXFR response. This is identical to {@link #iterator} except * that the SOA is returned at the end as well as the beginning. */ public Iterator AXFR() { return new ZoneIterator(true); } private void nodeToString(StringBuffer sb, Object node) { RRset [] sets = allRRsets(node); for (int i = 0; i < sets.length; i++) { RRset rrset = sets[i]; Iterator it = rrset.rrs(); while (it.hasNext()) sb.append(it.next() + "\n"); it = rrset.sigs(); while (it.hasNext()) sb.append(it.next() + "\n"); } } /** * Returns the contents of the Zone in master file format. */ public synchronized String toMasterFile() { Iterator zentries = data.entrySet().iterator(); StringBuffer sb = new StringBuffer(); nodeToString(sb, originNode); while (zentries.hasNext()) { Map.Entry entry = (Map.Entry) zentries.next(); if (!origin.equals(entry.getKey())) nodeToString(sb, entry.getValue()); } return sb.toString(); } /** * Returns the contents of the Zone as a string (in master file format). */ public String toString() { return toMasterFile(); } } dnsjava-2.1.5/org/xbill/DNS/ZoneTransferException.java100644 0 0 524 7775216774 17752 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; /** * An exception thrown when a zone transfer fails. * * @author Brian Wellington */ public class ZoneTransferException extends Exception { public ZoneTransferException() { super(); } public ZoneTransferException(String s) { super(s); } } dnsjava-2.1.5/org/xbill/DNS/ZoneTransferIn.java100644 0 0 41711 11660536427 16431 0ustar 0 0 // Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) // Parts of this are derived from lib/dns/xfrin.c from BIND 9; its copyright // notice follows. /* * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package org.xbill.DNS; import java.io.*; import java.net.*; import java.util.*; /** * An incoming DNS Zone Transfer. To use this class, first initialize an * object, then call the run() method. If run() doesn't throw an exception * the result will either be an IXFR-style response, an AXFR-style response, * or an indication that the zone is up to date. * * @author Brian Wellington */ public class ZoneTransferIn { private static final int INITIALSOA = 0; private static final int FIRSTDATA = 1; private static final int IXFR_DELSOA = 2; private static final int IXFR_DEL = 3; private static final int IXFR_ADDSOA = 4; private static final int IXFR_ADD = 5; private static final int AXFR = 6; private static final int END = 7; private Name zname; private int qtype; private int dclass; private long ixfr_serial; private boolean want_fallback; private ZoneTransferHandler handler; private SocketAddress localAddress; private SocketAddress address; private TCPClient client; private TSIG tsig; private TSIG.StreamVerifier verifier; private long timeout = 900 * 1000; private int state; private long end_serial; private long current_serial; private Record initialsoa; private int rtype; public static class Delta { /** * All changes between two versions of a zone in an IXFR response. */ /** The starting serial number of this delta. */ public long start; /** The ending serial number of this delta. */ public long end; /** A list of records added between the start and end versions */ public List adds; /** A list of records deleted between the start and end versions */ public List deletes; private Delta() { adds = new ArrayList(); deletes = new ArrayList(); } } public static interface ZoneTransferHandler { /** * Handles a Zone Transfer. */ /** * Called when an AXFR transfer begins. */ public void startAXFR() throws ZoneTransferException; /** * Called when an IXFR transfer begins. */ public void startIXFR() throws ZoneTransferException; /** * Called when a series of IXFR deletions begins. * @param soa The starting SOA. */ public void startIXFRDeletes(Record soa) throws ZoneTransferException; /** * Called when a series of IXFR adds begins. * @param soa The starting SOA. */ public void startIXFRAdds(Record soa) throws ZoneTransferException; /** * Called for each content record in an AXFR. * @param r The DNS record. */ public void handleRecord(Record r) throws ZoneTransferException; }; private static class BasicHandler implements ZoneTransferHandler { private List axfr; private List ixfr; public void startAXFR() { axfr = new ArrayList(); } public void startIXFR() { ixfr = new ArrayList(); } public void startIXFRDeletes(Record soa) { Delta delta = new Delta(); delta.deletes.add(soa); delta.start = getSOASerial(soa); ixfr.add(delta); } public void startIXFRAdds(Record soa) { Delta delta = (Delta) ixfr.get(ixfr.size() - 1); delta.adds.add(soa); delta.end = getSOASerial(soa); } public void handleRecord(Record r) { List list; if (ixfr != null) { Delta delta = (Delta) ixfr.get(ixfr.size() - 1); if (delta.adds.size() > 0) list = delta.adds; else list = delta.deletes; } else list = axfr; list.add(r); } }; private ZoneTransferIn() {} private ZoneTransferIn(Name zone, int xfrtype, long serial, boolean fallback, SocketAddress address, TSIG key) { this.address = address; this.tsig = key; if (zone.isAbsolute()) zname = zone; else { try { zname = Name.concatenate(zone, Name.root); } catch (NameTooLongException e) { throw new IllegalArgumentException("ZoneTransferIn: " + "name too long"); } } qtype = xfrtype; dclass = DClass.IN; ixfr_serial = serial; want_fallback = fallback; state = INITIALSOA; } /** * Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer). * @param zone The zone to transfer. * @param address The host/port from which to transfer the zone. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newAXFR(Name zone, SocketAddress address, TSIG key) { return new ZoneTransferIn(zone, Type.AXFR, 0, false, address, key); } /** * Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer). * @param zone The zone to transfer. * @param host The host from which to transfer the zone. * @param port The port to connect to on the server, or 0 for the default. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newAXFR(Name zone, String host, int port, TSIG key) throws UnknownHostException { if (port == 0) port = SimpleResolver.DEFAULT_PORT; return newAXFR(zone, new InetSocketAddress(host, port), key); } /** * Instantiates a ZoneTransferIn object to do an AXFR (full zone transfer). * @param zone The zone to transfer. * @param host The host from which to transfer the zone. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newAXFR(Name zone, String host, TSIG key) throws UnknownHostException { return newAXFR(zone, host, 0, key); } /** * Instantiates a ZoneTransferIn object to do an IXFR (incremental zone * transfer). * @param zone The zone to transfer. * @param serial The existing serial number. * @param fallback If true, fall back to AXFR if IXFR is not supported. * @param address The host/port from which to transfer the zone. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newIXFR(Name zone, long serial, boolean fallback, SocketAddress address, TSIG key) { return new ZoneTransferIn(zone, Type.IXFR, serial, fallback, address, key); } /** * Instantiates a ZoneTransferIn object to do an IXFR (incremental zone * transfer). * @param zone The zone to transfer. * @param serial The existing serial number. * @param fallback If true, fall back to AXFR if IXFR is not supported. * @param host The host from which to transfer the zone. * @param port The port to connect to on the server, or 0 for the default. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newIXFR(Name zone, long serial, boolean fallback, String host, int port, TSIG key) throws UnknownHostException { if (port == 0) port = SimpleResolver.DEFAULT_PORT; return newIXFR(zone, serial, fallback, new InetSocketAddress(host, port), key); } /** * Instantiates a ZoneTransferIn object to do an IXFR (incremental zone * transfer). * @param zone The zone to transfer. * @param serial The existing serial number. * @param fallback If true, fall back to AXFR if IXFR is not supported. * @param host The host from which to transfer the zone. * @param key The TSIG key used to authenticate the transfer, or null. * @return The ZoneTransferIn object. * @throws UnknownHostException The host does not exist. */ public static ZoneTransferIn newIXFR(Name zone, long serial, boolean fallback, String host, TSIG key) throws UnknownHostException { return newIXFR(zone, serial, fallback, host, 0, key); } /** * Gets the name of the zone being transferred. */ public Name getName() { return zname; } /** * Gets the type of zone transfer (either AXFR or IXFR). */ public int getType() { return qtype; } /** * Sets a timeout on this zone transfer. The default is 900 seconds (15 * minutes). * @param secs The maximum amount of time that this zone transfer can take. */ public void setTimeout(int secs) { if (secs < 0) throw new IllegalArgumentException("timeout cannot be " + "negative"); timeout = 1000L * secs; } /** * Sets an alternate DNS class for this zone transfer. * @param dclass The class to use instead of class IN. */ public void setDClass(int dclass) { DClass.check(dclass); this.dclass = dclass; } /** * Sets the local address to bind to when sending messages. * @param addr The local address to send messages from. */ public void setLocalAddress(SocketAddress addr) { this.localAddress = addr; } private void openConnection() throws IOException { long endTime = System.currentTimeMillis() + timeout; client = new TCPClient(endTime); if (localAddress != null) client.bind(localAddress); client.connect(address); } private void sendQuery() throws IOException { Record question = Record.newRecord(zname, qtype, dclass); Message query = new Message(); query.getHeader().setOpcode(Opcode.QUERY); query.addRecord(question, Section.QUESTION); if (qtype == Type.IXFR) { Record soa = new SOARecord(zname, dclass, 0, Name.root, Name.root, ixfr_serial, 0, 0, 0, 0); query.addRecord(soa, Section.AUTHORITY); } if (tsig != null) { tsig.apply(query, null); verifier = new TSIG.StreamVerifier(tsig, query.getTSIG()); } byte [] out = query.toWire(Message.MAXLENGTH); client.send(out); } private static long getSOASerial(Record rec) { SOARecord soa = (SOARecord) rec; return soa.getSerial(); } private void logxfr(String s) { if (Options.check("verbose")) System.out.println(zname + ": " + s); } private void fail(String s) throws ZoneTransferException { throw new ZoneTransferException(s); } private void fallback() throws ZoneTransferException { if (!want_fallback) fail("server doesn't support IXFR"); logxfr("falling back to AXFR"); qtype = Type.AXFR; state = INITIALSOA; } private void parseRR(Record rec) throws ZoneTransferException { int type = rec.getType(); Delta delta; switch (state) { case INITIALSOA: if (type != Type.SOA) fail("missing initial SOA"); initialsoa = rec; // Remember the serial number in the initial SOA; we need it // to recognize the end of an IXFR. end_serial = getSOASerial(rec); if (qtype == Type.IXFR && Serial.compare(end_serial, ixfr_serial) <= 0) { logxfr("up to date"); state = END; break; } state = FIRSTDATA; break; case FIRSTDATA: // If the transfer begins with 1 SOA, it's an AXFR. // If it begins with 2 SOAs, it's an IXFR. if (qtype == Type.IXFR && type == Type.SOA && getSOASerial(rec) == ixfr_serial) { rtype = Type.IXFR; handler.startIXFR(); logxfr("got incremental response"); state = IXFR_DELSOA; } else { rtype = Type.AXFR; handler.startAXFR(); handler.handleRecord(initialsoa); logxfr("got nonincremental response"); state = AXFR; } parseRR(rec); // Restart... return; case IXFR_DELSOA: handler.startIXFRDeletes(rec); state = IXFR_DEL; break; case IXFR_DEL: if (type == Type.SOA) { current_serial = getSOASerial(rec); state = IXFR_ADDSOA; parseRR(rec); // Restart... return; } handler.handleRecord(rec); break; case IXFR_ADDSOA: handler.startIXFRAdds(rec); state = IXFR_ADD; break; case IXFR_ADD: if (type == Type.SOA) { long soa_serial = getSOASerial(rec); if (soa_serial == end_serial) { state = END; break; } else if (soa_serial != current_serial) { fail("IXFR out of sync: expected serial " + current_serial + " , got " + soa_serial); } else { state = IXFR_DELSOA; parseRR(rec); // Restart... return; } } handler.handleRecord(rec); break; case AXFR: // Old BINDs sent cross class A records for non IN classes. if (type == Type.A && rec.getDClass() != dclass) break; handler.handleRecord(rec); if (type == Type.SOA) { state = END; } break; case END: fail("extra data"); break; default: fail("invalid state"); break; } } private void closeConnection() { try { if (client != null) client.cleanup(); } catch (IOException e) { } } private Message parseMessage(byte [] b) throws WireParseException { try { return new Message(b); } catch (IOException e) { if (e instanceof WireParseException) throw (WireParseException) e; throw new WireParseException("Error parsing message"); } } private void doxfr() throws IOException, ZoneTransferException { sendQuery(); while (state != END) { byte [] in = client.recv(); Message response = parseMessage(in); if (response.getHeader().getRcode() == Rcode.NOERROR && verifier != null) { TSIGRecord tsigrec = response.getTSIG(); int error = verifier.verify(response, in); if (error != Rcode.NOERROR) fail("TSIG failure"); } Record [] answers = response.getSectionArray(Section.ANSWER); if (state == INITIALSOA) { int rcode = response.getRcode(); if (rcode != Rcode.NOERROR) { if (qtype == Type.IXFR && rcode == Rcode.NOTIMP) { fallback(); doxfr(); return; } fail(Rcode.string(rcode)); } Record question = response.getQuestion(); if (question != null && question.getType() != qtype) { fail("invalid question section"); } if (answers.length == 0 && qtype == Type.IXFR) { fallback(); doxfr(); return; } } for (int i = 0; i < answers.length; i++) { parseRR(answers[i]); } if (state == END && verifier != null && !response.isVerified()) fail("last message must be signed"); } } /** * Does the zone transfer. * @param handler The callback object that handles the zone transfer data. * @throws IOException The zone transfer failed to due an IO problem. * @throws ZoneTransferException The zone transfer failed to due a problem * with the zone transfer itself. */ public void run(ZoneTransferHandler handler) throws IOException, ZoneTransferException { this.handler = handler; try { openConnection(); doxfr(); } finally { closeConnection(); } } /** * Does the zone transfer. * @return A list, which is either an AXFR-style response (List of Records), * and IXFR-style response (List of Deltas), or null, which indicates that * an IXFR was performed and the zone is up to date. * @throws IOException The zone transfer failed to due an IO problem. * @throws ZoneTransferException The zone transfer failed to due a problem * with the zone transfer itself. */ public List run() throws IOException, ZoneTransferException { BasicHandler handler = new BasicHandler(); run(handler); if (handler.axfr != null) return handler.axfr; return handler.ixfr; } private BasicHandler getBasicHandler() throws IllegalArgumentException { if (handler instanceof BasicHandler) return (BasicHandler) handler; throw new IllegalArgumentException("ZoneTransferIn used callback " + "interface"); } /** * Returns true if the response is an AXFR-style response (List of Records). * This will be true if either an IXFR was performed, an IXFR was performed * and the server provided a full zone transfer, or an IXFR failed and * fallback to AXFR occurred. */ public boolean isAXFR() { return (rtype == Type.AXFR); } /** * Gets the AXFR-style response. * @throws IllegalArgumentException The transfer used the callback interface, * so the response was not stored. */ public List getAXFR() { BasicHandler handler = getBasicHandler(); return handler.axfr; } /** * Returns true if the response is an IXFR-style response (List of Deltas). * This will be true only if an IXFR was performed and the server provided * an incremental zone transfer. */ public boolean isIXFR() { return (rtype == Type.IXFR); } /** * Gets the IXFR-style response. * @throws IllegalArgumentException The transfer used the callback interface, * so the response was not stored. */ public List getIXFR() { BasicHandler handler = getBasicHandler(); return handler.ixfr; } /** * Returns true if the response indicates that the zone is up to date. * This will be true only if an IXFR was performed. * @throws IllegalArgumentException The transfer used the callback interface, * so the response was not stored. */ public boolean isCurrent() { BasicHandler handler = getBasicHandler(); return (handler.axfr == null && handler.ixfr == null); } } dnsjava-2.1.5/org/xbill/DNS/spi/DNSJavaNameService.java100644 0 0 11632 11320507440 17646 0ustar 0 0 // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.spi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.StringTokenizer; import org.xbill.DNS.AAAARecord; import org.xbill.DNS.ARecord; import org.xbill.DNS.ExtendedResolver; import org.xbill.DNS.Lookup; import org.xbill.DNS.Name; import org.xbill.DNS.PTRRecord; import org.xbill.DNS.Record; import org.xbill.DNS.Resolver; import org.xbill.DNS.ReverseMap; import org.xbill.DNS.TextParseException; import org.xbill.DNS.Type; /** * This class implements a Name Service Provider, which Java can use * (starting with version 1.4), to perform DNS resolutions instead of using * the standard calls. *

* This Name Service Provider uses dnsjava. *

* To use this provider, you must set the following system property: * sun.net.spi.nameservice.provider.1=dns,dnsjava * * @author Brian Wellington * @author Paul Cowan (pwc21@yahoo.com) */ public class DNSJavaNameService implements InvocationHandler { private static final String nsProperty = "sun.net.spi.nameservice.nameservers"; private static final String domainProperty = "sun.net.spi.nameservice.domain"; private static final String v6Property = "java.net.preferIPv6Addresses"; private boolean preferV6 = false; /** * Creates a DNSJavaNameService instance. *

* Uses the * sun.net.spi.nameservice.nameservers, * sun.net.spi.nameservice.domain, and * java.net.preferIPv6Addresses properties for configuration. */ protected DNSJavaNameService() { String nameServers = System.getProperty(nsProperty); String domain = System.getProperty(domainProperty); String v6 = System.getProperty(v6Property); if (nameServers != null) { StringTokenizer st = new StringTokenizer(nameServers, ","); String [] servers = new String[st.countTokens()]; int n = 0; while (st.hasMoreTokens()) servers[n++] = st.nextToken(); try { Resolver res = new ExtendedResolver(servers); Lookup.setDefaultResolver(res); } catch (UnknownHostException e) { System.err.println("DNSJavaNameService: invalid " + nsProperty); } } if (domain != null) { try { Lookup.setDefaultSearchPath(new String[] {domain}); } catch (TextParseException e) { System.err.println("DNSJavaNameService: invalid " + domainProperty); } } if (v6 != null && v6.equalsIgnoreCase("true")) preferV6 = true; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (method.getName().equals("getHostByAddr")) { return this.getHostByAddr((byte[]) args[0]); } else if (method.getName().equals("lookupAllHostAddr")) { InetAddress[] addresses; addresses = this.lookupAllHostAddr((String) args[0]); Class returnType = method.getReturnType(); if (returnType.equals(InetAddress[].class)) { // method for Java >= 1.6 return addresses; } else if (returnType.equals(byte[][].class)) { // method for Java <= 1.5 int naddrs = addresses.length; byte [][] byteAddresses = new byte[naddrs][]; byte [] addr; for (int i = 0; i < naddrs; i++) { addr = addresses[i].getAddress(); byteAddresses[i] = addr; } return byteAddresses; } } } catch (Throwable e) { System.err.println("DNSJavaNameService: Unexpected error."); e.printStackTrace(); throw e; } throw new IllegalArgumentException( "Unknown function name or arguments."); } /** * Performs a forward DNS lookup for the host name. * @param host The host name to resolve. * @return All the ip addresses found for the host name. */ public InetAddress [] lookupAllHostAddr(String host) throws UnknownHostException { Name name = null; try { name = new Name(host); } catch (TextParseException e) { throw new UnknownHostException(host); } Record [] records = null; if (preferV6) records = new Lookup(name, Type.AAAA).run(); if (records == null) records = new Lookup(name, Type.A).run(); if (records == null && !preferV6) records = new Lookup(name, Type.AAAA).run(); if (records == null) throw new UnknownHostException(host); InetAddress[] array = new InetAddress[records.length]; for (int i = 0; i < records.length; i++) { Record record = records[i]; if (records[i] instanceof ARecord) { ARecord a = (ARecord) records[i]; array[i] = a.getAddress(); } else { AAAARecord aaaa = (AAAARecord) records[i]; array[i] = aaaa.getAddress(); } } return array; } /** * Performs a reverse DNS lookup. * @param addr The ip address to lookup. * @return The host name found for the ip address. */ public String getHostByAddr(byte [] addr) throws UnknownHostException { Name name = ReverseMap.fromAddress(InetAddress.getByAddress(addr)); Record [] records = new Lookup(name, Type.PTR).run(); if (records == null) throw new UnknownHostException(); return ((PTRRecord) records[0]).getTarget().toString(); } } dnsjava-2.1.5/org/xbill/DNS/spi/DNSJavaNameServiceDescriptor.java100644 0 0 1523 11320507440 21663 0ustar 0 0 // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.spi; import java.lang.reflect.Proxy; import sun.net.spi.nameservice.*; /** * The descriptor class for the dnsjava name service provider. * * @author Brian Wellington * @author Paul Cowan (pwc21@yahoo.com) */ public class DNSJavaNameServiceDescriptor implements NameServiceDescriptor { private static NameService nameService; static { ClassLoader loader = NameService.class.getClassLoader(); nameService = (NameService) Proxy.newProxyInstance(loader, new Class[] { NameService.class }, new DNSJavaNameService()); } /** * Returns a reference to a dnsjava name server provider. */ public NameService createNameService() { return nameService; } public String getType() { return "dns"; } public String getProviderName() { return "dnsjava"; } } dnsjava-2.1.5/org/xbill/DNS/spi/services/sun.net.spi.nameservice.NameServiceDescriptor100644 0 0 57 10224131523 26040 0ustar 0 0 org.xbill.DNS.spi.DNSJavaNameServiceDescriptor dnsjava-2.1.5/org/xbill/DNS/tests/primary.java100644 0 0 2263 10224111550 16303 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.tests; import java.util.*; import org.xbill.DNS.*; public class primary { private static void usage() { System.out.println("usage: primary [-t] [-a | -i] origin file"); System.exit(1); } public static void main(String [] args) throws Exception { boolean time = false; boolean axfr = false; boolean iterator = false; int arg = 0; if (args.length < 2) usage(); while (args.length - arg > 2) { if (args[0].equals("-t")) time = true; else if (args[0].equals("-a")) axfr = true; else if (args[0].equals("-i")) iterator = true; arg++; } Name origin = Name.fromString(args[arg++], Name.root); String file = args[arg++]; long start = System.currentTimeMillis(); Zone zone = new Zone(origin, file); long end = System.currentTimeMillis(); if (axfr) { Iterator it = zone.AXFR(); while (it.hasNext()) { System.out.println(it.next()); } } else if (iterator) { Iterator it = zone.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } else { System.out.println(zone); } if (time) System.out.println("; Load time: " + (end - start) + " ms"); } } dnsjava-2.1.5/org/xbill/DNS/tests/xfrin.java100644 0 0 5462 10223345704 15763 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.tests; import java.util.*; import org.xbill.DNS.*; public class xfrin { private static void usage(String s) { System.out.println("Error: " + s); System.out.println("usage: xfrin [-i serial] [-k keyname/secret] " + "[-s server] [-p port] [-f] zone"); System.exit(1); } public static void main(String [] args) throws Exception { ZoneTransferIn xfrin; TSIG key = null; int ixfr_serial = -1; String server = null; int port = SimpleResolver.DEFAULT_PORT; boolean fallback = false; Name zname; int arg = 0; while (arg < args.length) { if (args[arg].equals("-i")) { ixfr_serial = Integer.parseInt(args[++arg]); if (ixfr_serial < 0) usage("invalid serial number"); } else if (args[arg].equals("-k")) { String s = args[++arg]; int index = s.indexOf('/'); if (index < 0) usage("invalid key"); key = new TSIG(s.substring(0, index), s.substring(index+1)); } else if (args[arg].equals("-s")) { server = args[++arg]; } else if (args[arg].equals("-p")) { port = Integer.parseInt(args[++arg]); if (port < 0 || port > 0xFFFF) usage("invalid port"); } else if (args[arg].equals("-f")) { fallback = true; } else if (args[arg].startsWith("-")) { usage("invalid option"); } else { break; } arg++; } if (arg >= args.length) usage("no zone name specified"); zname = Name.fromString(args[arg]); if (server == null) { Lookup l = new Lookup(zname, Type.NS); Record [] ns = l.run(); if (ns == null) { System.out.println("failed to look up NS record: " + l.getErrorString()); System.exit(1); } server = ns[0].rdataToString(); System.out.println("sending to server '" + server + "'"); } if (ixfr_serial >= 0) xfrin = ZoneTransferIn.newIXFR(zname, ixfr_serial, fallback, server, port, key); else xfrin = ZoneTransferIn.newAXFR(zname, server, port, key); List response = xfrin.run(); if (xfrin.isAXFR()) { if (ixfr_serial >= 0) System.out.println("AXFR-like IXFR response"); else System.out.println("AXFR response"); Iterator it = response.iterator(); while (it.hasNext()) System.out.println(it.next()); } else if (xfrin.isIXFR()) { System.out.println("IXFR response"); Iterator it = response.iterator(); while (it.hasNext()) { ZoneTransferIn.Delta delta; delta = (ZoneTransferIn.Delta) it.next(); System.out.println("delta from " + delta.start + " to " + delta.end); System.out.println("deletes"); Iterator it2 = delta.deletes.iterator(); while (it2.hasNext()) System.out.println(it2.next()); System.out.println("adds"); it2 = delta.adds.iterator(); while (it2.hasNext()) System.out.println(it2.next()); } } else if (xfrin.isCurrent()) { System.out.println("up to date"); } } } dnsjava-2.1.5/org/xbill/DNS/utils/HMAC.java100644 0 0 10365 11642415564 15371 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.utils; import java.util.Arrays; import java.security.*; /** * An implementation of the HMAC message authentication code. * * @author Brian Wellington */ public class HMAC { private MessageDigest digest; private int blockLength; private byte [] ipad, opad; private static final byte IPAD = 0x36; private static final byte OPAD = 0x5c; private void init(byte [] key) { int i; if (key.length > blockLength) { key = digest.digest(key); digest.reset(); } ipad = new byte[blockLength]; opad = new byte[blockLength]; for (i = 0; i < key.length; i++) { ipad[i] = (byte) (key[i] ^ IPAD); opad[i] = (byte) (key[i] ^ OPAD); } for (; i < blockLength; i++) { ipad[i] = IPAD; opad[i] = OPAD; } digest.update(ipad); } /** * Creates a new HMAC instance * @param digest The message digest object. * @param blockLength The block length of the message digest. * @param key The secret key */ public HMAC(MessageDigest digest, int blockLength, byte [] key) { digest.reset(); this.digest = digest; this.blockLength = blockLength; init(key); } /** * Creates a new HMAC instance * @param digestName The name of the message digest function. * @param blockLength The block length of the message digest. * @param key The secret key. */ public HMAC(String digestName, int blockLength, byte [] key) { try { digest = MessageDigest.getInstance(digestName); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException("unknown digest algorithm " + digestName); } this.blockLength = blockLength; init(key); } /** * Creates a new HMAC instance * @param digest The message digest object. * @param key The secret key * @deprecated won't work with digests using a padding length other than 64; * use {@code HMAC(MessageDigest digest, int blockLength, * byte [] key)} instead. * @see HMAC#HMAC(MessageDigest digest, int blockLength, byte [] key) */ public HMAC(MessageDigest digest, byte [] key) { this(digest, 64, key); } /** * Creates a new HMAC instance * @param digestName The name of the message digest function. * @param key The secret key. * @deprecated won't work with digests using a padding length other than 64; * use {@code HMAC(String digestName, int blockLength, byte [] key)} * instead * @see HMAC#HMAC(String digestName, int blockLength, byte [] key) */ public HMAC(String digestName, byte [] key) { this(digestName, 64, key); } /** * Adds data to the current hash * @param b The data * @param offset The index at which to start adding to the hash * @param length The number of bytes to hash */ public void update(byte [] b, int offset, int length) { digest.update(b, offset, length); } /** * Adds data to the current hash * @param b The data */ public void update(byte [] b) { digest.update(b); } /** * Signs the data (computes the secure hash) * @return An array with the signature */ public byte [] sign() { byte [] output = digest.digest(); digest.reset(); digest.update(opad); return digest.digest(output); } /** * Verifies the data (computes the secure hash and compares it to the input) * @param signature The signature to compare against * @return true if the signature matches, false otherwise */ public boolean verify(byte [] signature) { return verify(signature, false); } /** * Verifies the data (computes the secure hash and compares it to the input) * @param signature The signature to compare against * @param truncation_ok If true, the signature may be truncated; only the * number of bytes in the provided signature are compared. * @return true if the signature matches, false otherwise */ public boolean verify(byte [] signature, boolean truncation_ok) { byte [] expected = sign(); if (truncation_ok && signature.length < expected.length) { byte [] truncated = new byte[signature.length]; System.arraycopy(expected, 0, truncated, 0, truncated.length); expected = truncated; } return Arrays.equals(signature, expected); } /** * Resets the HMAC object for further use */ public void clear() { digest.reset(); digest.update(ipad); } /** * Returns the length of the digest. */ public int digestLength() { return digest.getDigestLength(); } } dnsjava-2.1.5/org/xbill/DNS/utils/base16.java100644 0 0 3342 7775216774 15715 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.utils; import java.io.*; /** * Routines for converting between Strings of hex-encoded data and arrays of * binary data. This is not actually used by DNS. * * @author Brian Wellington */ public class base16 { private static final String Base16 = "0123456789ABCDEF"; private base16() {} /** * Convert binary data to a hex-encoded String * @param b An array containing binary data * @return A String containing the encoded data */ public static String toString(byte [] b) { ByteArrayOutputStream os = new ByteArrayOutputStream(); for (int i = 0; i < b.length; i++) { short value = (short) (b[i] & 0xFF); byte high = (byte) (value >> 4); byte low = (byte) (value & 0xF); os.write(Base16.charAt(high)); os.write(Base16.charAt(low)); } return new String(os.toByteArray()); } /** * Convert a hex-encoded String to binary data * @param str A String containing the encoded data * @return An array containing the binary data, or null if the string is invalid */ public static byte [] fromString(String str) { ByteArrayOutputStream bs = new ByteArrayOutputStream(); byte [] raw = str.getBytes(); for (int i = 0; i < raw.length; i++) { if (!Character.isWhitespace((char)raw[i])) bs.write(raw[i]); } byte [] in = bs.toByteArray(); if (in.length % 2 != 0) { return null; } bs.reset(); DataOutputStream ds = new DataOutputStream(bs); for (int i = 0; i < in.length; i += 2) { byte high = (byte) Base16.indexOf(Character.toUpperCase((char)in[i])); byte low = (byte) Base16.indexOf(Character.toUpperCase((char)in[i+1])); try { ds.writeByte((high << 4) + low); } catch (IOException e) { } } return bs.toByteArray(); } } dnsjava-2.1.5/org/xbill/DNS/utils/base32.java100644 0 0 11466 11207636076 15743 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.utils; import java.io.*; /** * Routines for converting between Strings of base32-encoded data and arrays * of binary data. This currently supports the base32 and base32hex alphabets * specified in RFC 4648, sections 6 and 7. * * @author Brian Wellington */ public class base32 { public static class Alphabet { private Alphabet() {} public static final String BASE32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="; public static final String BASE32HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV="; }; private String alphabet; private boolean padding, lowercase; /** * Creates an object that can be used to do base32 conversions. * @param alphabet Which alphabet should be used * @param padding Whether padding should be used * @param lowercase Whether lowercase characters should be used. * default parameters (The standard base32 alphabet, no padding, uppercase) */ public base32(String alphabet, boolean padding, boolean lowercase) { this.alphabet = alphabet; this.padding = padding; this.lowercase = lowercase; } static private int blockLenToPadding(int blocklen) { switch (blocklen) { case 1: return 6; case 2: return 4; case 3: return 3; case 4: return 1; case 5: return 0; default: return -1; } } static private int paddingToBlockLen(int padlen) { switch (padlen) { case 6: return 1; case 4: return 2; case 3: return 3; case 1: return 4; case 0: return 5; default : return -1; } } /** * Convert binary data to a base32-encoded String * * @param b An array containing binary data * @return A String containing the encoded data */ public String toString(byte [] b) { ByteArrayOutputStream os = new ByteArrayOutputStream(); for (int i = 0; i < (b.length + 4) / 5; i++) { short s[] = new short[5]; int t[] = new int[8]; int blocklen = 5; for (int j = 0; j < 5; j++) { if ((i * 5 + j) < b.length) s[j] = (short) (b[i * 5 + j] & 0xFF); else { s[j] = 0; blocklen--; } } int padlen = blockLenToPadding(blocklen); // convert the 5 byte block into 8 characters (values 0-31). // upper 5 bits from first byte t[0] = (byte) ((s[0] >> 3) & 0x1F); // lower 3 bits from 1st byte, upper 2 bits from 2nd. t[1] = (byte) (((s[0] & 0x07) << 2) | ((s[1] >> 6) & 0x03)); // bits 5-1 from 2nd. t[2] = (byte) ((s[1] >> 1) & 0x1F); // lower 1 bit from 2nd, upper 4 from 3rd t[3] = (byte) (((s[1] & 0x01) << 4) | ((s[2] >> 4) & 0x0F)); // lower 4 from 3rd, upper 1 from 4th. t[4] = (byte) (((s[2] & 0x0F) << 1) | ((s[3] >> 7) & 0x01)); // bits 6-2 from 4th t[5] = (byte) ((s[3] >> 2) & 0x1F); // lower 2 from 4th, upper 3 from 5th; t[6] = (byte) (((s[3] & 0x03) << 3) | ((s[4] >> 5) & 0x07)); // lower 5 from 5th; t[7] = (byte) (s[4] & 0x1F); // write out the actual characters. for (int j = 0; j < t.length - padlen; j++) { char c = alphabet.charAt(t[j]); if (lowercase) c = Character.toLowerCase(c); os.write(c); } // write out the padding (if any) if (padding) { for (int j = t.length - padlen; j < t.length; j++) os.write('='); } } return new String(os.toByteArray()); } /** * Convert a base32-encoded String to binary data * * @param str A String containing the encoded data * @return An array containing the binary data, or null if the string is invalid */ public byte[] fromString(String str) { ByteArrayOutputStream bs = new ByteArrayOutputStream(); byte [] raw = str.getBytes(); for (int i = 0; i < raw.length; i++) { char c = (char) raw[i]; if (!Character.isWhitespace(c)) { c = Character.toUpperCase(c); bs.write((byte) c); } } if (padding) { if (bs.size() % 8 != 0) return null; } else { while (bs.size() % 8 != 0) bs.write('='); } byte [] in = bs.toByteArray(); bs.reset(); DataOutputStream ds = new DataOutputStream(bs); for (int i = 0; i < in.length / 8; i++) { short[] s = new short[8]; int[] t = new int[5]; int padlen = 8; for (int j = 0; j < 8; j++) { char c = (char) in[i * 8 + j]; if (c == '=') break; s[j] = (short) alphabet.indexOf(in[i * 8 + j]); if (s[j] < 0) return null; padlen--; } int blocklen = paddingToBlockLen(padlen); if (blocklen < 0) return null; // all 5 bits of 1st, high 3 (of 5) of 2nd t[0] = (s[0] << 3) | s[1] >> 2; // lower 2 of 2nd, all 5 of 3rd, high 1 of 4th t[1] = ((s[1] & 0x03) << 6) | (s[2] << 1) | (s[3] >> 4); // lower 4 of 4th, high 4 of 5th t[2] = ((s[3] & 0x0F) << 4) | ((s[4] >> 1) & 0x0F); // lower 1 of 5th, all 5 of 6th, high 2 of 7th t[3] = (s[4] << 7) | (s[5] << 2) | (s[6] >> 3); // lower 3 of 7th, all of 8th t[4] = ((s[6] & 0x07) << 5) | s[7]; try { for (int j = 0; j < blocklen; j++) ds.writeByte((byte) (t[j] & 0xFF)); } catch (IOException e) { } } return bs.toByteArray(); } } dnsjava-2.1.5/org/xbill/DNS/utils/base64.java100644 0 0 6653 7775216774 15730 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.utils; import java.io.*; /** * Routines for converting between Strings of base64-encoded data and arrays of * binary data. * * @author Brian Wellington */ public class base64 { private static final String Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; private base64() {} /** * Convert binary data to a base64-encoded String * @param b An array containing binary data * @return A String containing the encoded data */ public static String toString(byte [] b) { ByteArrayOutputStream os = new ByteArrayOutputStream(); for (int i = 0; i < (b.length + 2) / 3; i++) { short [] s = new short[3]; short [] t = new short[4]; for (int j = 0; j < 3; j++) { if ((i * 3 + j) < b.length) s[j] = (short) (b[i*3+j] & 0xFF); else s[j] = -1; } t[0] = (short) (s[0] >> 2); if (s[1] == -1) t[1] = (short) (((s[0] & 0x3) << 4)); else t[1] = (short) (((s[0] & 0x3) << 4) + (s[1] >> 4)); if (s[1] == -1) t[2] = t[3] = 64; else if (s[2] == -1) { t[2] = (short) (((s[1] & 0xF) << 2)); t[3] = 64; } else { t[2] = (short) (((s[1] & 0xF) << 2) + (s[2] >> 6)); t[3] = (short) (s[2] & 0x3F); } for (int j = 0; j < 4; j++) os.write(Base64.charAt(t[j])); } return new String(os.toByteArray()); } /** * Formats data into a nicely formatted base64 encoded String * @param b An array containing binary data * @param lineLength The number of characters per line * @param prefix A string prefixing the characters on each line * @param addClose Whether to add a close parenthesis or not * @return A String representing the formatted output */ public static String formatString(byte [] b, int lineLength, String prefix, boolean addClose) { String s = toString(b); StringBuffer sb = new StringBuffer(); for (int i = 0; i < s.length(); i += lineLength) { sb.append (prefix); if (i + lineLength >= s.length()) { sb.append(s.substring(i)); if (addClose) sb.append(" )"); } else { sb.append(s.substring(i, i + lineLength)); sb.append("\n"); } } return sb.toString(); } /** * Convert a base64-encoded String to binary data * @param str A String containing the encoded data * @return An array containing the binary data, or null if the string is invalid */ public static byte [] fromString(String str) { ByteArrayOutputStream bs = new ByteArrayOutputStream(); byte [] raw = str.getBytes(); for (int i = 0; i < raw.length; i++) { if (!Character.isWhitespace((char)raw[i])) bs.write(raw[i]); } byte [] in = bs.toByteArray(); if (in.length % 4 != 0) { return null; } bs.reset(); DataOutputStream ds = new DataOutputStream(bs); for (int i = 0; i < (in.length + 3) / 4; i++) { short [] s = new short[4]; short [] t = new short[3]; for (int j = 0; j < 4; j++) s[j] = (short) Base64.indexOf(in[i*4+j]); t[0] = (short) ((s[0] << 2) + (s[1] >> 4)); if (s[2] == 64) { t[1] = t[2] = (short) (-1); if ((s[1] & 0xF) != 0) return null; } else if (s[3] == 64) { t[1] = (short) (((s[1] << 4) + (s[2] >> 2)) & 0xFF); t[2] = (short) (-1); if ((s[2] & 0x3) != 0) return null; } else { t[1] = (short) (((s[1] << 4) + (s[2] >> 2)) & 0xFF); t[2] = (short) (((s[2] << 6) + s[3]) & 0xFF); } try { for (int j = 0; j < 3; j++) if (t[j] >= 0) ds.writeByte(t[j]); } catch (IOException e) { } } return bs.toByteArray(); } } dnsjava-2.1.5/org/xbill/DNS/utils/hexdump.java100644 0 0 2444 7775216774 16310 0ustar 0 0 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS.utils; /** * A routine to produce a nice looking hex dump * * @author Brian Wellington */ public class hexdump { private static final char [] hex = "0123456789ABCDEF".toCharArray(); /** * Dumps a byte array into hex format. * @param description If not null, a description of the data. * @param b The data to be printed. * @param offset The start of the data in the array. * @param length The length of the data in the array. */ public static String dump(String description, byte [] b, int offset, int length) { StringBuffer sb = new StringBuffer(); sb.append(length + "b"); if (description != null) sb.append(" (" + description + ")"); sb.append(':'); int prefixlen = sb.toString().length(); prefixlen = (prefixlen + 8) & ~ 7; sb.append('\t'); int perline = (80 - prefixlen) / 3; for (int i = 0; i < length; i++) { if (i != 0 && i % perline == 0) { sb.append('\n'); for (int j = 0; j < prefixlen / 8 ; j++) sb.append('\t'); } int value = (int)(b[i + offset]) & 0xFF; sb.append(hex[(value >> 4)]); sb.append(hex[(value & 0xF)]); sb.append(' '); } sb.append('\n'); return sb.toString(); } public static String dump(String s, byte [] b) { return dump(s, b, 0, b.length); } } dnsjava-2.1.5/org/xbill/DNS/windows/DNSServer.properties100644 0 0 150 10202322652 20212 0ustar 0 0 host_name=Host Name primary_dns_suffix=Primary Dns Suffix dns_suffix=DNS Suffix dns_servers=DNS Servers dnsjava-2.1.5/org/xbill/DNS/windows/DNSServer_de.properties100644 0 0 165 10202322652 20670 0ustar 0 0 host_name=Hostname primary_dns_suffix=Prim\u00E4res DNS-Suffix dns_suffix=DNS-Suffixsuchliste dns_servers=DNS-Server dnsjava-2.1.5/org/xbill/DNS/windows/DNSServer_fr.properties100644 0 0 221 10463210054 20701 0ustar 0 0 host_name=Nom de l'h\u00F4te primary_dns_suffix=Suffixe DNS principal dns_suffix=Suffixe DNS propre \u00E0 la connexion dns_servers=Serveurs DNS dnsjava-2.1.5/org/xbill/DNS/windows/DNSServer_ja.properties100644 0 0 333 11372716515 20705 0ustar 0 0 host_name=\u30db\u30b9\u30c8\u540d primary_dns_suffix=\u30d7\u30e9\u30a4\u30de\u30ea DNS \u30b5\u30d5\u30a3\u30c3\u30af\u30b9 dns_suffix=DNS \u30b5\u30d5\u30a3\u30c3\u30af\u30b9 dns_servers=DNS \u30b5\u30fc\u30d0\u30fc dnsjava-2.1.5/org/xbill/DNS/windows/DNSServer_pl.properties100644 0 0 226 10202322652 20711 0ustar 0 0 host_name=Nazwa hosta primary_dns_suffix=Sufiks podstawowej domeny DNS dns_suffix=Sufiks DNS konkretnego po\u0142\u0105czenia dns_servers=Serwery DNS dnsjava-2.1.5/tests/org/xbill/DNS/A6RecordTest.java100644 0 0 17114 10242022601 17104 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class A6RecordTest extends TestCase { Name m_an, m_an2, m_rn; InetAddress m_addr; String m_addr_string, m_addr_string_canonical; byte[] m_addr_bytes; int m_prefix_bits; long m_ttl; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_an2 = Name.fromString("My.Second.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_addr_string = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334"; m_addr_string_canonical = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr = InetAddress.getByName(m_addr_string); m_addr_bytes = m_addr.getAddress(); m_ttl = 0x13579; m_prefix_bits = 9; } public void test_ctor_0arg() { A6Record ar = new A6Record(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); } public void test_getObject() { A6Record ar = new A6Record(); Record r = ar.getObject(); assertTrue(r instanceof A6Record); } public void test_ctor_6arg() { A6Record ar = new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, m_addr, null); assertEquals(m_an, ar.getName()); assertEquals(Type.A6, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_prefix_bits, ar.getPrefixBits()); assertEquals(m_addr, ar.getSuffix()); assertNull(ar.getPrefix()); // with the prefix name ar = new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, m_addr, m_an2); assertEquals(m_an, ar.getName()); assertEquals(Type.A6, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_prefix_bits, ar.getPrefixBits()); assertEquals(m_addr, ar.getSuffix()); assertEquals(m_an2, ar.getPrefix()); // a relative name try { new A6Record(m_rn, DClass.IN, m_ttl, m_prefix_bits, m_addr, null); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} // a relative prefix name try { new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, m_addr, m_rn); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} // invalid prefix bits try { new A6Record(m_rn, DClass.IN, m_ttl, 0x100, m_addr, null); fail("IllegalArgumentException not thrown"); } catch( RelativeNameException e ){} // an IPv4 address try { new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, InetAddress.getByName("192.168.0.1"), null); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} catch( UnknownHostException e ){ fail(e.getMessage()); } } public void test_rrFromWire() throws CloneNotSupportedException, IOException, UnknownHostException { // record with no prefix DNSOutput dout = new DNSOutput(); dout.writeU8(0); dout.writeByteArray(m_addr_bytes); DNSInput din = new DNSInput(dout.toByteArray()); A6Record ar = new A6Record(); ar.rrFromWire(din); assertEquals(0, ar.getPrefixBits()); assertEquals(m_addr, ar.getSuffix()); assertNull(ar.getPrefix()); // record with 9 bit prefix (should result in 15 bytes of the address) dout = new DNSOutput(); dout.writeU8(9); dout.writeByteArray(m_addr_bytes, 1, 15); dout.writeByteArray(m_an2.toWire()); din = new DNSInput(dout.toByteArray()); ar = new A6Record(); ar.rrFromWire(din); assertEquals(9, ar.getPrefixBits()); byte[] addr_bytes = (byte[])m_addr_bytes.clone(); addr_bytes[0] = 0; InetAddress exp = InetAddress.getByAddress(addr_bytes); assertEquals(exp, ar.getSuffix()); assertEquals(m_an2, ar.getPrefix()); } public void test_rdataFromString() throws CloneNotSupportedException, IOException, UnknownHostException { // record with no prefix Tokenizer t = new Tokenizer("0 " + m_addr_string); A6Record ar = new A6Record(); ar.rdataFromString(t, null); assertEquals(0, ar.getPrefixBits()); assertEquals(m_addr, ar.getSuffix()); assertNull(ar.getPrefix()); // record with 9 bit prefix. In contrast to the rrFromWire method, // rdataFromString expects the entire 128 bits to be represented // in the string t = new Tokenizer("9 " + m_addr_string + " " + m_an2); ar = new A6Record(); ar.rdataFromString(t, null); assertEquals(9, ar.getPrefixBits()); assertEquals(m_addr, ar.getSuffix()); assertEquals(m_an2, ar.getPrefix()); // record with invalid prefixBits t = new Tokenizer("129"); ar = new A6Record(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} // record with invalid ipv6 address t = new Tokenizer("0 " + m_addr_string.substring(4)); ar = new A6Record(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_rrToString() { A6Record ar = new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, m_addr, m_an2); String exp = "" + m_prefix_bits + " " + m_addr_string_canonical + " " + m_an2; String out = ar.rrToString(); assertEquals(exp, out); } public void test_rrToWire() { // canonical form A6Record ar = new A6Record(m_an, DClass.IN, m_ttl, m_prefix_bits, m_addr, m_an2); DNSOutput dout = new DNSOutput(); dout.writeU8(m_prefix_bits); dout.writeByteArray(m_addr_bytes, 1, 15); dout.writeByteArray(m_an2.toWireCanonical()); byte[] exp = dout.toByteArray(); dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); // case sensitiveform dout = new DNSOutput(); dout.writeU8(m_prefix_bits); dout.writeByteArray(m_addr_bytes, 1, 15); dout.writeByteArray(m_an2.toWire()); exp = dout.toByteArray(); dout = new DNSOutput(); ar.rrToWire(dout, null, false); assertTrue(Arrays.equals(exp, dout.toByteArray())); } } dnsjava-2.1.5/tests/org/xbill/DNS/AAAARecordTest.java100644 0 0 11167 10242022601 17323 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class AAAARecordTest extends TestCase { Name m_an, m_rn; InetAddress m_addr; String m_addr_string; byte[] m_addr_bytes; long m_ttl; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_addr_string = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr = InetAddress.getByName(m_addr_string); m_addr_bytes = m_addr.getAddress(); m_ttl = 0x13579; } public void test_ctor_0arg() throws UnknownHostException { AAAARecord ar = new AAAARecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertNull(ar.getAddress()); } public void test_getObject() { AAAARecord ar = new AAAARecord(); Record r = ar.getObject(); assertTrue(r instanceof AAAARecord); } public void test_ctor_4arg() { AAAARecord ar = new AAAARecord(m_an, DClass.IN, m_ttl, m_addr); assertEquals(m_an, ar.getName()); assertEquals(Type.AAAA, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_addr, ar.getAddress()); // a relative name try { new AAAARecord(m_rn, DClass.IN, m_ttl, m_addr); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} // an IPv4 address try { new AAAARecord(m_an, DClass.IN, m_ttl, InetAddress.getByName("192.168.0.1")); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} catch( UnknownHostException e ){ fail(e.getMessage()); } } public void test_rrFromWire() throws IOException { DNSInput di = new DNSInput(m_addr_bytes); AAAARecord ar = new AAAARecord(); ar.rrFromWire(di); assertEquals(m_addr, ar.getAddress()); } public void test_rdataFromString() throws IOException { Tokenizer t = new Tokenizer(m_addr_string); AAAARecord ar = new AAAARecord(); ar.rdataFromString(t, null); assertEquals(m_addr, ar.getAddress()); // invalid address t = new Tokenizer("193.160.232.1"); ar = new AAAARecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_rrToString() { AAAARecord ar = new AAAARecord(m_an, DClass.IN, m_ttl, m_addr); assertEquals(m_addr_string, ar.rrToString()); } public void test_rrToWire() { AAAARecord ar = new AAAARecord(m_an, DClass.IN, m_ttl, m_addr); // canonical DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(m_addr_bytes, dout.toByteArray())); // case sensitive dout = new DNSOutput(); ar.rrToWire(dout, null, false); assertTrue(Arrays.equals(m_addr_bytes, dout.toByteArray())); } } dnsjava-2.1.5/tests/org/xbill/DNS/AFSDBRecordTest.java100644 0 0 4601 10242022601 17432 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Arrays; import junit.framework.TestCase; public class AFSDBRecordTest extends TestCase { public void test_getObject() { AFSDBRecord d = new AFSDBRecord(); Record r = d.getObject(); assertTrue(r instanceof AFSDBRecord); } public void test_ctor_5arg() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.OtherName."); AFSDBRecord d = new AFSDBRecord(n, DClass.IN, 0xABCDEL, 0xF1, m); assertEquals(n, d.getName()); assertEquals(Type.AFSDB, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(0xF1, d.getSubtype()); assertEquals(m, d.getHost()); } } dnsjava-2.1.5/tests/org/xbill/DNS/APLRecordTest.java100644 0 0 47326 10242022601 17262 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.ArrayList; import java.util.List; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.xbill.DNS.APLRecord.Element; public class APLRecordTest { public static class Test_Element_init extends TestCase { InetAddress m_addr4; InetAddress m_addr6; protected void setUp() throws TextParseException, UnknownHostException { m_addr4 = InetAddress.getByName("193.160.232.5"); m_addr6 = InetAddress.getByName("2001:db8:85a3:8d3:1319:8a2e:370:7334"); } public void test_valid_IPv4() { Element el = new Element(true, m_addr4, 16); assertEquals(Address.IPv4, el.family); assertEquals(true, el.negative); assertEquals(m_addr4, el.address); assertEquals(16, el.prefixLength); } public void test_invalid_IPv4() { try { new Element(true, m_addr4, 33); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_valid_IPv6() { Element el = new Element(false, m_addr6, 74); assertEquals(Address.IPv6, el.family); assertEquals(false, el.negative); assertEquals(m_addr6, el.address); assertEquals(74, el.prefixLength); } public void test_invalid_IPv6() { try { new Element(true, m_addr6, 129); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } } public static class Test_init extends TestCase { Name m_an, m_rn; long m_ttl; ArrayList m_elements; InetAddress m_addr4; String m_addr4_string; byte[] m_addr4_bytes; InetAddress m_addr6; String m_addr6_string; byte[] m_addr6_bytes; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_ttl = 0x13579; m_addr4_string = "193.160.232.5"; m_addr4 = InetAddress.getByName(m_addr4_string); m_addr4_bytes = m_addr4.getAddress(); m_addr6_string = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr6 = InetAddress.getByName(m_addr6_string); m_addr6_bytes = m_addr6.getAddress(); m_elements = new ArrayList(2); Element e = new Element(true, m_addr4, 12); m_elements.add(e); e = new Element(false, m_addr6, 64); m_elements.add(e); } public void test_0arg() throws UnknownHostException { APLRecord ar = new APLRecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertNull(ar.getElements()); } public void test_getObject() { APLRecord ar = new APLRecord(); Record r = ar.getObject(); assertTrue(r instanceof APLRecord); } public void test_4arg_basic() { APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, m_elements); assertEquals(m_an, ar.getName()); assertEquals(Type.APL, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_elements, ar.getElements()); } public void test_4arg_empty_elements() { APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, new ArrayList()); assertEquals(new ArrayList(), ar.getElements()); } public void test_4arg_relative_name() { try { new APLRecord(m_rn, DClass.IN, m_ttl, m_elements); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_4arg_invalid_elements() { m_elements = new ArrayList(); m_elements.add(new Object()); try { new APLRecord(m_an, DClass.IN, m_ttl, m_elements); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } } public static class Test_rrFromWire extends TestCase { InetAddress m_addr4; byte[] m_addr4_bytes; InetAddress m_addr6; byte[] m_addr6_bytes; protected void setUp() throws TextParseException, UnknownHostException { m_addr4 = InetAddress.getByName("193.160.232.5"); m_addr4_bytes = m_addr4.getAddress(); m_addr6 = InetAddress.getByName("2001:db8:85a3:8d3:1319:8a2e:370:7334"); m_addr6_bytes = m_addr6.getAddress(); } public void test_validIPv4() throws IOException { byte[] raw = new byte[] { 0, 1, 8, (byte)0x84, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3] }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); ar.rrFromWire(di); ArrayList exp = new ArrayList(); exp.add(new Element(true, m_addr4, 8)); assertEquals(exp, ar.getElements()); } public void test_validIPv4_short_address() throws IOException { byte[] raw = new byte[] { 0, 1, 20, (byte)0x83, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2] }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); ar.rrFromWire(di); InetAddress a = InetAddress.getByName("193.160.232.0"); ArrayList exp = new ArrayList(); exp.add(new Element(true, a, 20)); assertEquals(exp, ar.getElements()); } public void test_invalid_IPv4_prefix() throws IOException { byte[] raw = new byte[] { 0, 1, 33, (byte)0x84, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3] }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); try { ar.rrFromWire(di); fail("WireParseException not thrown"); } catch( WireParseException e ){} } public void test_invalid_IPv4_length() throws IOException { byte[] raw = new byte[] { 0, 1, 8, (byte)0x85, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3], 10 }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); try { ar.rrFromWire(di); fail("WireParseException not thrown"); } catch( WireParseException e ){} } public void test_multiple_validIPv4() throws IOException { byte[] raw = new byte[] { 0, 1, 8, (byte)0x84, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3], 0, 1, 30, (byte)0x4, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3], }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); ar.rrFromWire(di); ArrayList exp = new ArrayList(); exp.add(new Element(true, m_addr4, 8)); exp.add(new Element(false, m_addr4, 30)); assertEquals(exp, ar.getElements()); } public void test_validIPv6() throws IOException { byte[] raw = new byte[] { 0, 2, (byte)115, (byte)0x10, m_addr6_bytes[0], m_addr6_bytes[1], m_addr6_bytes[2], m_addr6_bytes[3], m_addr6_bytes[4], m_addr6_bytes[5], m_addr6_bytes[6], m_addr6_bytes[7], m_addr6_bytes[8], m_addr6_bytes[9], m_addr6_bytes[10], m_addr6_bytes[11], m_addr6_bytes[12], m_addr6_bytes[13], m_addr6_bytes[14], m_addr6_bytes[15] }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); ar.rrFromWire(di); ArrayList exp = new ArrayList(); exp.add(new Element(false, m_addr6, 115)); assertEquals(exp, ar.getElements()); } public void test_valid_nonIP() throws IOException { byte[] raw = new byte[] { 0, 3, (byte)130, (byte)0x85, 1, 2, 3, 4, 5 }; DNSInput di = new DNSInput(raw); APLRecord ar = new APLRecord(); ar.rrFromWire(di); List l = ar.getElements(); assertEquals(1, l.size()); Element el = (Element)l.get(0); assertEquals(3, el.family); assertEquals(true, el.negative); assertEquals(130, el.prefixLength); assertTrue(Arrays.equals(new byte[] { 1, 2, 3, 4, 5 }, (byte[])el.address)); } } public static class Test_rdataFromString extends TestCase { InetAddress m_addr4; String m_addr4_string; byte[] m_addr4_bytes; InetAddress m_addr6; String m_addr6_string; byte[] m_addr6_bytes; protected void setUp() throws TextParseException, UnknownHostException { m_addr4_string = "193.160.232.5"; m_addr4 = InetAddress.getByName(m_addr4_string); m_addr4_bytes = m_addr4.getAddress(); m_addr6_string = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr6 = InetAddress.getByName(m_addr6_string); m_addr6_bytes = m_addr6.getAddress(); } public void test_validIPv4() throws IOException { Tokenizer t = new Tokenizer("1:" + m_addr4_string + "/11\n"); APLRecord ar = new APLRecord(); ar.rdataFromString(t, null); ArrayList exp = new ArrayList(); exp.add(new Element(false, m_addr4, 11)); assertEquals(exp, ar.getElements()); // make sure extra token is put back assertEquals(Tokenizer.EOL, t.get().type); } public void test_valid_multi() throws IOException { Tokenizer t = new Tokenizer("1:" + m_addr4_string + "/11 !2:" + m_addr6_string + "/100"); APLRecord ar = new APLRecord(); ar.rdataFromString(t, null); ArrayList exp = new ArrayList(); exp.add(new Element(false, m_addr4, 11)); exp.add(new Element(true, m_addr6, 100)); assertEquals(exp, ar.getElements()); } public void test_validIPv6() throws IOException { Tokenizer t = new Tokenizer("!2:" + m_addr6_string + "/36\n"); APLRecord ar = new APLRecord(); ar.rdataFromString(t, null); ArrayList exp = new ArrayList(); exp.add(new Element(true, m_addr6, 36)); assertEquals(exp, ar.getElements()); // make sure extra token is put back assertEquals(Tokenizer.EOL, t.get().type); } public void test_no_colon() throws IOException { Tokenizer t = new Tokenizer("!1192.68.0.1/20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_colon_and_slash_swapped() throws IOException { Tokenizer t = new Tokenizer("!1/192.68.0.1:20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_no_slash() throws IOException { Tokenizer t = new Tokenizer("!1:192.68.0.1|20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_empty_family() throws IOException { Tokenizer t = new Tokenizer("!:192.68.0.1/20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_malformed_family() throws IOException { Tokenizer t = new Tokenizer("family:192.68.0.1/20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_invalid_family() throws IOException { Tokenizer t = new Tokenizer("3:192.68.0.1/20"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_empty_prefix() throws IOException { Tokenizer t = new Tokenizer("1:192.68.0.1/"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_malformed_prefix() throws IOException { Tokenizer t = new Tokenizer("1:192.68.0.1/prefix"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_invalid_prefix() throws IOException { Tokenizer t = new Tokenizer("1:192.68.0.1/33"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_empty_address() throws IOException { Tokenizer t = new Tokenizer("1:/33"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_malformed_address() throws IOException { Tokenizer t = new Tokenizer("1:A.B.C.D/33"); APLRecord ar = new APLRecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } } public static class Test_rrToString extends TestCase { Name m_an, m_rn; long m_ttl; ArrayList m_elements; InetAddress m_addr4; String m_addr4_string; byte[] m_addr4_bytes; InetAddress m_addr6; String m_addr6_string; byte[] m_addr6_bytes; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_ttl = 0x13579; m_addr4_string = "193.160.232.5"; m_addr4 = InetAddress.getByName(m_addr4_string); m_addr4_bytes = m_addr4.getAddress(); m_addr6_string = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr6 = InetAddress.getByName(m_addr6_string); m_addr6_bytes = m_addr6.getAddress(); m_elements = new ArrayList(2); Element e = new Element(true, m_addr4, 12); m_elements.add(e); e = new Element(false, m_addr6, 64); m_elements.add(e); } public void test() { APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, m_elements); assertEquals("!1:" + m_addr4_string + "/12 2:" + m_addr6_string + "/64", ar.rrToString()); } } public static class Test_rrToWire extends TestCase { Name m_an, m_rn; long m_ttl; ArrayList m_elements; InetAddress m_addr4; String m_addr4_string; byte[] m_addr4_bytes; InetAddress m_addr6; String m_addr6_string; byte[] m_addr6_bytes; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_ttl = 0x13579; m_addr4_string = "193.160.232.5"; m_addr4 = InetAddress.getByName(m_addr4_string); m_addr4_bytes = m_addr4.getAddress(); m_addr6_string = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; m_addr6 = InetAddress.getByName(m_addr6_string); m_addr6_bytes = m_addr6.getAddress(); m_elements = new ArrayList(2); Element e = new Element(true, m_addr4, 12); m_elements.add(e); e = new Element(false, m_addr6, 64); m_elements.add(e); } public void test_empty() { APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, new ArrayList()); DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(new byte[0], dout.toByteArray())); } public void test_basic() { APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, m_elements); byte[] exp = new byte[] { 0, 1, 12, (byte)0x84, m_addr4_bytes[0], m_addr4_bytes[1], m_addr4_bytes[2], m_addr4_bytes[3], 0, 2, 64, 0x10, m_addr6_bytes[0], m_addr6_bytes[1], m_addr6_bytes[2], m_addr6_bytes[3], m_addr6_bytes[4], m_addr6_bytes[5], m_addr6_bytes[6], m_addr6_bytes[7], m_addr6_bytes[8], m_addr6_bytes[9], m_addr6_bytes[10], m_addr6_bytes[11], m_addr6_bytes[12], m_addr6_bytes[13], m_addr6_bytes[14], m_addr6_bytes[15] }; DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); } public void test_non_IP() throws IOException { byte[] exp = new byte[] { 0, 3, (byte)130, (byte)0x85, 1, 2, 3, 4, 5 }; DNSInput di = new DNSInput(exp); APLRecord ar = new APLRecord(); ar.rrFromWire(di); DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); } public void test_address_with_embedded_zero() throws UnknownHostException { InetAddress a = InetAddress.getByName("232.0.11.1"); ArrayList elements = new ArrayList(); elements.add(new Element(true, a, 31)); APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, elements); byte[] exp = new byte[] { 0, 1, 31, (byte)0x84, (byte)232, 0, 11, 1 }; DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); } public void test_short_address() throws UnknownHostException { InetAddress a = InetAddress.getByName("232.0.11.0"); ArrayList elements = new ArrayList(); elements.add(new Element(true, a, 31)); APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, elements); byte[] exp = new byte[] { 0, 1, 31, (byte)0x83, (byte)232, 0, 11 }; DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); } public void test_wildcard_address() throws UnknownHostException { InetAddress a = InetAddress.getByName("0.0.0.0"); ArrayList elements = new ArrayList(); elements.add(new Element(true, a, 31)); APLRecord ar = new APLRecord(m_an, DClass.IN, m_ttl, elements); byte[] exp = new byte[] { 0, 1, 31, (byte)0x80 }; DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(exp, dout.toByteArray())); } } public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(Test_Element_init.class); s.addTestSuite(Test_init.class); s.addTestSuite(Test_rrFromWire.class); s.addTestSuite(Test_rdataFromString.class); s.addTestSuite(Test_rrToString.class); s.addTestSuite(Test_rrToWire.class); return s; } } dnsjava-2.1.5/tests/org/xbill/DNS/ARecordTest.java100644 0 0 11101 10242022601 17004 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class ARecordTest extends TestCase { Name m_an, m_rn; InetAddress m_addr; String m_addr_string; byte[] m_addr_bytes; long m_ttl; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_addr_string = "193.160.232.5"; m_addr = InetAddress.getByName(m_addr_string); m_addr_bytes = m_addr.getAddress(); m_ttl = 0x13579; } public void test_ctor_0arg() throws UnknownHostException { ARecord ar = new ARecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertEquals(InetAddress.getByName("0.0.0.0"), ar.getAddress()); } public void test_getObject() { ARecord ar = new ARecord(); Record r = ar.getObject(); assertTrue(r instanceof ARecord); } public void test_ctor_4arg() { ARecord ar = new ARecord(m_an, DClass.IN, m_ttl, m_addr); assertEquals(m_an, ar.getName()); assertEquals(Type.A, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_addr, ar.getAddress()); // a relative name try { new ARecord(m_rn, DClass.IN, m_ttl, m_addr); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} // an IPv6 address try { new ARecord(m_an, DClass.IN, m_ttl, InetAddress.getByName("2001:0db8:85a3:08d3:1319:8a2e:0370:7334")); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} catch( UnknownHostException e ){ fail(e.getMessage()); } } public void test_rrFromWire() throws IOException { DNSInput di = new DNSInput(m_addr_bytes); ARecord ar = new ARecord(); ar.rrFromWire(di); assertEquals(m_addr, ar.getAddress()); } public void test_rdataFromString() throws IOException { Tokenizer t = new Tokenizer(m_addr_string); ARecord ar = new ARecord(); ar.rdataFromString(t, null); assertEquals(m_addr, ar.getAddress()); // invalid address t = new Tokenizer("193.160.232"); ar = new ARecord(); try { ar.rdataFromString(t, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_rrToString() { ARecord ar = new ARecord(m_an, DClass.IN, m_ttl, m_addr); assertEquals(m_addr_string, ar.rrToString()); } public void test_rrToWire() { ARecord ar = new ARecord(m_an, DClass.IN, m_ttl, m_addr); DNSOutput dout = new DNSOutput(); ar.rrToWire(dout, null, true); assertTrue(Arrays.equals(m_addr_bytes, dout.toByteArray())); dout = new DNSOutput(); ar.rrToWire(dout, null, false); assertTrue(Arrays.equals(m_addr_bytes, dout.toByteArray())); } } dnsjava-2.1.5/tests/org/xbill/DNS/AddressTest.java100644 0 0 31107 12020250426 17066 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class AddressTest extends TestCase { private void assertEquals( byte[] exp, byte[] act ) { assertTrue(Arrays.equals(exp, act)); } private void assertEquals( int[] exp, int[] act ) { assertEquals( exp.length, act.length ); for( int i=0; i 1); for( int i=0; i // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class CNAMERecordTest extends TestCase { public void test_ctor_0arg() { CNAMERecord d = new CNAMERecord(); assertNull(d.getName()); assertNull(d.getTarget()); assertNull(d.getAlias()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); CNAMERecord d = new CNAMERecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.CNAME, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getTarget()); assertEquals(a, d.getAlias()); } public void test_getObject() { CNAMERecord d = new CNAMERecord(); Record r = d.getObject(); assertTrue(r instanceof CNAMERecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/CompressionTest.java100644 0 0 4273 10242022601 17762 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; import org.xbill.DNS.Compression; import org.xbill.DNS.Name; public class CompressionTest extends TestCase { public void setUp() { Options.set("verbosecompression"); } public void test() throws TextParseException { Compression c = new Compression(); Name n = Name.fromString("www.amazon.com."); c.add(10, n); assertEquals(10, c.get(n)); Name n2 = Name.fromString("www.cnn.com."); c.add(10, n2); assertEquals(10, c.get(n2)); } } dnsjava-2.1.5/tests/org/xbill/DNS/DClassTest.java100644 0 0 5370 10242022601 16631 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class DClassTest extends TestCase { public void test_string() { // a regular one assertEquals("IN", DClass.string(DClass.IN)); // one with an alias assertEquals("CH", DClass.string(DClass.CH)); // one that doesn't exist assertTrue(DClass.string(20).startsWith("CLASS")); try { DClass.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xFFFF) try { DClass.string(0x10000); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(DClass.NONE, DClass.value("NONE")); // one with alias assertEquals(DClass.HS, DClass.value("HS")); assertEquals(DClass.HS, DClass.value("HESIOD")); // one thats undefined but within range assertEquals(21, DClass.value("CLASS21")); // something that unknown assertEquals(-1, DClass.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, DClass.value("")); } } dnsjava-2.1.5/tests/org/xbill/DNS/DNAMERecordTest.java100644 0 0 4776 10242022601 17454 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class DNAMERecordTest extends TestCase { public void test_ctor_0arg() { DNAMERecord d = new DNAMERecord(); assertNull(d.getName()); assertNull(d.getTarget()); assertNull(d.getAlias()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); DNAMERecord d = new DNAMERecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.DNAME, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getTarget()); assertEquals(a, d.getAlias()); } public void test_getObject() { DNAMERecord d = new DNAMERecord(); Record r = d.getObject(); assertTrue(r instanceof DNAMERecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/DNSInputTest.java100644 0 0 17051 10242022601 17143 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Arrays; import junit.framework.TestCase; public class DNSInputTest extends TestCase { private byte[] m_raw; private DNSInput m_di; private void assertEquals( byte[] exp, byte[] act ) { assertTrue(Arrays.equals(exp, act)); } public void setUp() { m_raw = new byte[] { 0, 1, 2, 3, 4, 5, (byte)255, (byte)255, (byte)255, (byte)255 }; m_di = new DNSInput( m_raw ); } public void test_initial_state() { assertEquals( 0, m_di.current() ); assertEquals( 10, m_di.remaining() ); } public void test_jump1() { m_di.jump( 1 ); assertEquals( 1, m_di.current() ); assertEquals( 9, m_di.remaining() ); } public void test_jump2() { m_di.jump( 9 ); assertEquals( 9, m_di.current() ); assertEquals( 1, m_di.remaining() ); } public void test_jump_invalid() { try { m_di.jump( 10 ); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_setActive() { m_di.setActive( 5 ); assertEquals( 0, m_di.current() ); assertEquals( 5, m_di.remaining() ); } public void test_setActive_boundary1() { m_di.setActive( 10 ); assertEquals( 0, m_di.current() ); assertEquals( 10, m_di.remaining() ); } public void test_setActive_boundary2() { m_di.setActive( 0 ); assertEquals( 0, m_di.current() ); assertEquals( 0, m_di.remaining() ); } public void test_setActive_invalid() { try { m_di.setActive( 11 ); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_clearActive() { // first without setting active: m_di.clearActive(); assertEquals( 0, m_di.current() ); assertEquals( 10, m_di.remaining() ); m_di.setActive( 5 ); m_di.clearActive(); assertEquals( 0, m_di.current() ); assertEquals( 10, m_di.remaining() ); } public void test_restore_invalid() { try { m_di.restore(); fail( "IllegalStateException not thrown" ); } catch( IllegalStateException e ){ // pass } } public void test_save_restore() { m_di.jump( 4 ); assertEquals( 4, m_di.current() ); assertEquals( 6, m_di.remaining() ); m_di.save(); m_di.jump( 0 ); assertEquals( 0, m_di.current() ); assertEquals( 10, m_di.remaining() ); m_di.restore(); assertEquals( 4, m_di.current() ); assertEquals( 6, m_di.remaining() ); } public void test_readU8_basic() throws WireParseException { int v1 = m_di.readU8(); assertEquals( 1, m_di.current() ); assertEquals( 9, m_di.remaining() ); assertEquals( 0, v1 ); } public void test_readU8_maxval() throws WireParseException { m_di.jump( 9 ); int v1 = m_di.readU8(); assertEquals( 10, m_di.current() ); assertEquals( 0, m_di.remaining() ); assertEquals( 255, v1 ); try { v1 = m_di.readU8(); fail( "WireParseException not thrown" ); } catch( WireParseException e ){ // pass } } public void test_readU16_basic() throws WireParseException { int v1 = m_di.readU16(); assertEquals( 2, m_di.current() ); assertEquals( 8, m_di.remaining() ); assertEquals( 1, v1 ); m_di.jump( 1 ); v1 = m_di.readU16(); assertEquals( 258, v1 ); } public void test_readU16_maxval() throws WireParseException { m_di.jump(8); int v = m_di.readU16(); assertEquals( 10, m_di.current() ); assertEquals( 0, m_di.remaining() ); assertEquals( 0xFFFF, v ); try { m_di.jump( 9 ); m_di.readU16(); fail( "WireParseException not thrown" ); } catch( WireParseException e ){ // pass } } public void test_readU32_basic() throws WireParseException { long v1 = m_di.readU32(); assertEquals( 4, m_di.current() ); assertEquals( 6, m_di.remaining() ); assertEquals( 66051, v1 ); } public void test_readU32_maxval() throws WireParseException { m_di.jump(6); long v = m_di.readU32(); assertEquals( 10, m_di.current() ); assertEquals( 0, m_di.remaining() ); assertEquals( 0xFFFFFFFFL, v ); try { m_di.jump( 7 ); m_di.readU32(); fail( "WireParseException not thrown" ); } catch( WireParseException e ){ // pass } } public void test_readByteArray_0arg() throws WireParseException { m_di.jump( 1 ); byte[] out = m_di.readByteArray(); assertEquals( 10, m_di.current() ); assertEquals( 0, m_di.remaining() ); assertEquals( 9, out.length ); for( int i=0; i<9; ++i ){ assertEquals( m_raw[i+1], out[i] ); } } public void test_readByteArray_0arg_boundary() throws WireParseException { m_di.jump(9); m_di.readU8(); byte[] out = m_di.readByteArray(); assertEquals( 0, out.length ); } public void test_readByteArray_1arg() throws WireParseException { byte[] out = m_di.readByteArray( 2 ); assertEquals( 2, m_di.current() ); assertEquals( 8, m_di.remaining() ); assertEquals( 2, out.length ); assertEquals( 0, out[0] ); assertEquals( 1, out[1] ); } public void test_readByteArray_1arg_boundary() throws WireParseException { byte[] out = m_di.readByteArray( 10 ); assertEquals( 10, m_di.current() ); assertEquals( 0, m_di.remaining() ); assertEquals( m_raw, out ); } public void test_readByteArray_1arg_invalid() { try { m_di.readByteArray( 11 ); fail( "WireParseException not thrown" ); } catch( WireParseException e ){ // pass } } public void test_readByteArray_3arg() throws WireParseException { byte[] data = new byte [ 5 ]; m_di.jump(4); m_di.readByteArray( data, 1, 4 ); assertEquals( 8, m_di.current() ); assertEquals( 0, data[0] ); for( int i=0; i<4; ++i ){ assertEquals( m_raw[i+4], data[i+1] ); } } public void test_readCountedSting() throws WireParseException { m_di.jump( 1 ); byte[] out = m_di.readCountedString(); assertEquals( 1, out.length ); assertEquals( 3, m_di.current() ); assertEquals( out[0], 2 ); } } dnsjava-2.1.5/tests/org/xbill/DNS/DNSKEYRecordTest.java100644 0 0 7643 10242022601 17621 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class DNSKEYRecordTest extends TestCase { public void test_ctor_0arg() throws UnknownHostException { DNSKEYRecord ar = new DNSKEYRecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertEquals(0, ar.getAlgorithm()); assertEquals(0, ar.getFlags()); assertEquals(0, ar.getFootprint()); assertEquals(0, ar.getProtocol()); assertNull(ar.getKey()); } public void test_getObject() { DNSKEYRecord ar = new DNSKEYRecord(); Record r = ar.getObject(); assertTrue(r instanceof DNSKEYRecord); } public void test_ctor_7arg() throws TextParseException { Name n = Name.fromString("My.Absolute.Name."); Name r = Name.fromString("My.Relative.Name"); byte[] key = new byte[] { 0, 1, 3, 5, 7, 9 }; DNSKEYRecord kr = new DNSKEYRecord(n, DClass.IN, 0x24AC, 0x9832, 0x12, 0x67, key); assertEquals(n, kr.getName()); assertEquals(Type.DNSKEY, kr.getType()); assertEquals(DClass.IN, kr.getDClass()); assertEquals(0x24AC, kr.getTTL()); assertEquals(0x9832, kr.getFlags()); assertEquals(0x12, kr.getProtocol()); assertEquals(0x67, kr.getAlgorithm()); assertTrue(Arrays.equals(key, kr.getKey())); // a relative name try { new DNSKEYRecord(r, DClass.IN, 0x24AC, 0x9832, 0x12, 0x67, key); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_rdataFromString() throws IOException, TextParseException { // basic DNSKEYRecord kr = new DNSKEYRecord(); Tokenizer st = new Tokenizer(0xABCD + " " + 0x81 + " RSASHA1 AQIDBAUGBwgJ"); kr.rdataFromString(st, null); assertEquals(0xABCD, kr.getFlags()); assertEquals(0x81, kr.getProtocol()); assertEquals(DNSSEC.Algorithm.RSASHA1, kr.getAlgorithm()); assertTrue(Arrays.equals(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, kr.getKey())); // invalid algorithm kr = new DNSKEYRecord(); st = new Tokenizer(0x1212 + " " + 0xAA + " ZONE AQIDBAUGBwgJ"); try { kr.rdataFromString(st, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/DNSOutputTest.java100644 0 0 15463 10242022601 17351 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class DNSOutputTest extends TestCase { private DNSOutput m_do; public void setUp() { m_do = new DNSOutput( 1 ); } private void assertEquals( byte[] exp, byte[] act ) { assertTrue(java.util.Arrays.equals(exp, act)); } public void test_default_ctor() { m_do = new DNSOutput(); assertEquals( 0, m_do.current() ); } public void test_initial_state() { assertEquals( 0, m_do.current() ); try { m_do.restore(); fail( "IllegalStateException not thrown" ); } catch( IllegalStateException e ){ // pass } try { m_do.jump(1); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_writeU8_basic() { m_do.writeU8(1); assertEquals( 1, m_do.current() ); byte[] curr = m_do.toByteArray(); assertEquals( 1, curr.length ); assertEquals( 1, curr[0] ); } public void test_writeU8_expand() { // starts off at 1; m_do.writeU8(1); m_do.writeU8(2); assertEquals( 2, m_do.current() ); byte[] curr = m_do.toByteArray(); assertEquals( 2, curr.length ); assertEquals( 1, curr[0] ); assertEquals( 2, curr[1] ); } public void test_writeU8_max() { m_do.writeU8(0xFF); byte[] curr = m_do.toByteArray(); assertEquals( (byte)0xFF, (byte)curr[0] ); } public void test_writeU8_toobig() { try { m_do.writeU8( 0x1FF ); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_writeU16_basic() { m_do.writeU16(0x100); assertEquals( 2, m_do.current() ); byte[] curr = m_do.toByteArray(); assertEquals( 2, curr.length ); assertEquals( 1, curr[0] ); assertEquals( 0, curr[1] ); } public void test_writeU16_max() { m_do.writeU16(0xFFFF); byte[] curr = m_do.toByteArray(); assertEquals( (byte)0xFF, (byte)curr[0] ); assertEquals( (byte)0XFF, (byte)curr[1] ); } public void test_writeU16_toobig() { try { m_do.writeU16( 0x1FFFF ); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_writeU32_basic() { m_do.writeU32(0x11001011); assertEquals( 4, m_do.current() ); byte[] curr = m_do.toByteArray(); assertEquals( 4, curr.length ); assertEquals( 0x11, curr[0] ); assertEquals( 0x00, curr[1] ); assertEquals( 0x10, curr[2] ); assertEquals( 0x11, curr[3] ); } public void test_writeU32_max() { m_do.writeU32(0xFFFFFFFFL); byte[] curr = m_do.toByteArray(); assertEquals( (byte)0xFF, (byte)curr[0] ); assertEquals( (byte)0XFF, (byte)curr[1] ); assertEquals( (byte)0XFF, (byte)curr[2] ); assertEquals( (byte)0XFF, (byte)curr[3] ); } public void test_writeU32_toobig() { try { m_do.writeU32( 0x1FFFFFFFFL ); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_jump_basic() { m_do.writeU32(0x11223344L); assertEquals( 4, m_do.current() ); m_do.jump( 2 ); assertEquals( 2, m_do.current() ); m_do.writeU8( 0x99 ); byte[] curr = m_do.toByteArray(); assertEquals( 3, curr.length ); assertEquals( 0x11, curr[0] ); assertEquals( 0x22, curr[1] ); assertEquals( (byte)0x99, (byte)curr[2] ); } public void test_writeByteArray_1arg() { byte[] in = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12, (byte)0x34 }; m_do.writeByteArray( in ); assertEquals( 5, m_do.current() ); byte[] curr = m_do.toByteArray(); assertEquals( in, curr ); } public void test_writeByteArray_3arg() { byte[] in = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12, (byte)0x34 }; m_do.writeByteArray( in, 2, 3 ); assertEquals( 3, m_do.current() ); byte[] exp = new byte[] { in[2], in[3], in[4] }; byte[] curr = m_do.toByteArray(); assertEquals( exp, curr ); } public void test_writeCountedString_basic() { byte[] in = new byte[] { 'h', 'e', 'l', 'L', '0' }; m_do.writeCountedString( in ); assertEquals( in.length + 1, m_do.current() ); byte[] curr = m_do.toByteArray(); byte[] exp = new byte[] { (byte)(in.length), in[0], in[1], in[2], in[3], in[4] }; assertEquals( exp, curr ); } public void test_writeCountedString_empty() { byte[] in = new byte[] {}; m_do.writeCountedString( in ); assertEquals( in.length + 1, m_do.current() ); byte[] curr = m_do.toByteArray(); byte[] exp = new byte[] { (byte)(in.length) }; assertEquals( exp, curr ); } public void test_writeCountedString_toobig() { byte[] in = new byte [ 256 ]; try { m_do.writeCountedString(in); fail( "IllegalArgumentException not thrown" ); } catch( IllegalArgumentException e ){ // pass } } public void test_save_restore() { m_do.writeU32( 0x12345678L ); assertEquals( 4, m_do.current() ); m_do.save(); m_do.writeU16( 0xABCD ); assertEquals( 6, m_do.current() ); m_do.restore(); assertEquals( 4, m_do.current() ); try { m_do.restore(); fail( "IllegalArgumentException not thrown" ); } catch( IllegalStateException e ){ // pass } } } dnsjava-2.1.5/tests/org/xbill/DNS/DNSSECWithLunaProviderTest.java100644 0 0 6136 11536065673 21656 0ustar 0 0 package org.xbill.DNS; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; import java.security.Signature; import junit.framework.TestCase; import org.xbill.DNS.DNSSEC.Algorithm; import com.chrysalisits.crypto.LunaJCAProvider; import com.chrysalisits.crypto.LunaTokenManager; import com.chrysalisits.cryptox.LunaJCEProvider; public class DNSSECWithLunaProviderTest extends TestCase { private static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; private static final String KEY_ALGORITHM = "RSA"; int algorithm = Algorithm.RSASHA1; String partitionName = "dns"; String partitionPassword = "xX0x-XXXX-XxXx-xXxX"; LunaTokenManager tokenManager = LunaTokenManager.getInstance(); String lunaJCEProvider = "LunaJCEProvider"; String lunaJCAProvider = "LunaJCAProvider"; byte[] toSign = "The quick brown fox jumped over the lazy dog.".getBytes(); public void setUp() { Security.addProvider(new LunaJCEProvider()); Security.addProvider(new LunaJCAProvider()); tokenManager.Login(partitionName, partitionPassword); } public void tearDown() { tokenManager.Logout(); } public void testSignHSM() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM, lunaJCAProvider); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Signature signer = Signature.getInstance(SIGNATURE_ALGORITHM, lunaJCAProvider); signer.initSign(keyPair.getPrivate()); signer.update(toSign); byte[] signature = signer.sign(); assertNotNull(signature); // verify the signature Signature verifier = Signature.getInstance(SIGNATURE_ALGORITHM, lunaJCAProvider); verifier.initVerify(keyPair.getPublic()); verifier.update(toSign); boolean verify = verifier.verify(signature); assertTrue(verify); } public void testSignWithDNSSECAndHSM() throws Exception { // generate a signature KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM, lunaJCAProvider); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); byte[] signature = DNSSEC.sign(keyPair.getPrivate(), keyPair.getPublic(), algorithm, toSign, lunaJCAProvider); assertNotNull(signature); // verify the signature Signature verifier = Signature.getInstance(DNSSEC.algString(algorithm), lunaJCAProvider); verifier.initVerify(keyPair.getPublic()); verifier.update(toSign); boolean verify = verifier.verify(signature); assertTrue(verify); } public void testSignWithDNSSECAndSoftware() throws Exception { // generate a signature KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); byte[] signature = DNSSEC.sign(keyPair.getPrivate(), keyPair.getPublic(), algorithm, toSign); assertNotNull(signature); // verify the signature Signature verifier = Signature.getInstance(DNSSEC.algString(algorithm)); verifier.initVerify(keyPair.getPublic()); verifier.update(toSign); boolean verify = verifier.verify(signature); assertTrue(verify); } } dnsjava-2.1.5/tests/org/xbill/DNS/DNSSECWithProviderTest.java100644 0 0 2330 11536065673 21026 0ustar 0 0 package org.xbill.DNS; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; import java.security.Signature; import junit.framework.TestCase; import org.xbill.DNS.DNSSEC.Algorithm; public class DNSSECWithProviderTest extends TestCase { private static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; private static final String KEY_ALGORITHM = "RSA"; int algorithm = Algorithm.RSASHA1; byte[] toSign = "The quick brown fox jumped over the lazy dog.".getBytes(); public void setUp() { } public void tearDown() { } public void testSignSoftware() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Signature signer = Signature.getInstance(SIGNATURE_ALGORITHM); signer.initSign(keyPair.getPrivate()); signer.update(toSign); byte[] signature = signer.sign(); assertNotNull(signature); // verify the signature Signature verifier = Signature.getInstance(SIGNATURE_ALGORITHM); verifier.initVerify(keyPair.getPublic()); verifier.update(toSign); boolean verify = verifier.verify(signature); assertTrue(verify); } } dnsjava-2.1.5/tests/org/xbill/DNS/DSRecordTest.java100644 0 0 17075 10242022601 17152 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class DSRecordTest extends TestCase { public void test_ctor_0arg() { DSRecord dr = new DSRecord(); assertNull(dr.getName()); assertEquals(0, dr.getType()); assertEquals(0, dr.getDClass()); assertEquals(0, dr.getTTL()); assertEquals(0, dr.getAlgorithm()); assertEquals(0, dr.getDigestID()); assertNull(dr.getDigest()); assertEquals(0, dr.getFootprint()); } public void test_getObject() { DSRecord dr = new DSRecord(); Record r = dr.getObject(); assertTrue(r instanceof DSRecord); } public static class Test_Ctor_7arg extends TestCase { private Name m_n; private long m_ttl; private int m_footprint; private int m_algorithm; private int m_digestid; private byte[] m_digest; protected void setUp() throws TextParseException { m_n = Name.fromString("The.Name."); m_ttl = 0xABCDL; m_footprint = 0xEF01; m_algorithm = 0x23; m_digestid = 0x45; m_digest = new byte[] { (byte)0x67, (byte)0x89, (byte)0xAB, (byte)0xCD, (byte)0xEF }; } public void test_basic() throws TextParseException { DSRecord dr = new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, m_algorithm, m_digestid, m_digest); assertEquals(m_n, dr.getName()); assertEquals(DClass.IN, dr.getDClass()); assertEquals(Type.DS, dr.getType()); assertEquals(m_ttl, dr.getTTL()); assertEquals(m_footprint, dr.getFootprint()); assertEquals(m_algorithm, dr.getAlgorithm()); assertEquals(m_digestid, dr.getDigestID()); assertTrue(Arrays.equals(m_digest, dr.getDigest())); } public void test_toosmall_footprint() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, -1, m_algorithm, m_digestid, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_footprint() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, 0x10000, m_algorithm, m_digestid, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toosmall_algorithm() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, -1, m_digestid, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_algorithm() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, 0x10000, m_digestid, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toosmall_digestid() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, m_algorithm, -1, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_digestid() throws TextParseException { try { new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, m_algorithm, 0x10000, m_digest); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_null_digest() { DSRecord dr = new DSRecord(m_n, DClass.IN, m_ttl, m_footprint, m_algorithm, m_digestid, null); assertEquals(m_n, dr.getName()); assertEquals(DClass.IN, dr.getDClass()); assertEquals(Type.DS, dr.getType()); assertEquals(m_ttl, dr.getTTL()); assertEquals(m_footprint, dr.getFootprint()); assertEquals(m_algorithm, dr.getAlgorithm()); assertEquals(m_digestid, dr.getDigestID()); assertNull(dr.getDigest()); } } public void test_rrFromWire() throws IOException { byte[] raw = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89 }; DNSInput in = new DNSInput(raw); DSRecord dr = new DSRecord(); dr.rrFromWire(in); assertEquals(0xABCD, dr.getFootprint()); assertEquals(0xEF, dr.getAlgorithm()); assertEquals(0x01, dr.getDigestID()); assertTrue(Arrays.equals(new byte[] { (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89 }, dr.getDigest())); } public void test_rdataFromString() throws IOException { byte[] raw = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89 }; Tokenizer t = new Tokenizer(0xABCD + " " + 0xEF + " " + 0x01 + " 23456789AB"); DSRecord dr = new DSRecord(); dr.rdataFromString(t, null); assertEquals(0xABCD, dr.getFootprint()); assertEquals(0xEF, dr.getAlgorithm()); assertEquals(0x01, dr.getDigestID()); assertTrue(Arrays.equals(new byte[] { (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89, (byte)0xAB }, dr.getDigest())); } public void test_rrToString() throws TextParseException { String exp = 0xABCD + " " + 0xEF + " " + 0x01 + " 23456789AB"; DSRecord dr = new DSRecord(Name.fromString("The.Name."), DClass.IN, 0x123, 0xABCD, 0xEF, 0x01, new byte[] { (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89, (byte)0xAB }); assertEquals(exp, dr.rrToString()); } public void test_rrToWire() throws TextParseException { DSRecord dr = new DSRecord(Name.fromString("The.Name."), DClass.IN, 0x123, 0xABCD, 0xEF, 0x01, new byte[] { (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89, (byte)0xAB }); byte[] exp = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x89, (byte)0xAB }; DNSOutput out = new DNSOutput(); dr.rrToWire(out, null, true); assertTrue(Arrays.equals(exp, out.toByteArray())); } public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(Test_Ctor_7arg.class); s.addTestSuite(DSRecordTest.class); return s; } } dnsjava-2.1.5/tests/org/xbill/DNS/EmptyRecordTest.java100644 0 0 6410 10242022601 17711 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class EmptyRecordTest extends TestCase { public void test_ctor() throws UnknownHostException { EmptyRecord ar = new EmptyRecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); } public void test_getObject() { EmptyRecord ar = new EmptyRecord(); Record r = ar.getObject(); assertTrue(r instanceof EmptyRecord); } public void test_rrFromWire() throws IOException { DNSInput i = new DNSInput(new byte[] { 1, 2, 3, 4, 5 }); i.jump(3); EmptyRecord er = new EmptyRecord(); er.rrFromWire(i); assertEquals(3, i.current()); assertNull(er.getName()); assertEquals(0, er.getType()); assertEquals(0, er.getDClass()); assertEquals(0, er.getTTL()); } public void test_rdataFromString() throws IOException { Tokenizer t = new Tokenizer("these are the tokens"); EmptyRecord er = new EmptyRecord(); er.rdataFromString(t, null); assertNull(er.getName()); assertEquals(0, er.getType()); assertEquals(0, er.getDClass()); assertEquals(0, er.getTTL()); assertEquals("these", t.getString()); } public void test_rrToString() { EmptyRecord er = new EmptyRecord(); assertEquals("", er.rrToString()); } public void test_rrToWire() { EmptyRecord er = new EmptyRecord(); DNSOutput out = new DNSOutput(); er.rrToWire(out, null, true); assertEquals(0, out.toByteArray().length); } } dnsjava-2.1.5/tests/org/xbill/DNS/ExceptionTest.java100644 0 0 7215 10242022601 17416 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import junit.framework.TestCase; public class ExceptionTest extends TestCase { public void test_InvalidDClassException() { IllegalArgumentException e = new InvalidDClassException(10); assertEquals( "Invalid DNS class: 10", e.getMessage() ); } public void test_InvalidTTLException() { IllegalArgumentException e = new InvalidTTLException(32345); assertEquals( "Invalid DNS TTL: 32345", e.getMessage() ); } public void test_InvalidTypeException() { IllegalArgumentException e = new InvalidTypeException(32345); assertEquals( "Invalid DNS type: 32345", e.getMessage() ); } public void test_NameTooLongException() { WireParseException e = new NameTooLongException(); assertNull( e.getMessage() ); e = new NameTooLongException("This is my too long name"); assertEquals( "This is my too long name", e.getMessage() ); } public void test_RelativeNameException() throws TextParseException { IllegalArgumentException e = new RelativeNameException("This is my relative name"); assertEquals( "This is my relative name", e.getMessage() ); e = new RelativeNameException(Name.fromString("relative")); assertEquals("'relative' is not an absolute name", e.getMessage()); } public void test_TextParseException() { IOException e = new TextParseException(); assertNull( e.getMessage() ); e = new TextParseException( "This is my message" ); assertEquals( "This is my message", e.getMessage() ); } public void test_WireParseException() { IOException e = new WireParseException(); assertNull( e.getMessage() ); e = new WireParseException( "This is my message" ); assertEquals( "This is my message", e.getMessage() ); } public void test_ZoneTransferException() { Exception e = new ZoneTransferException(); assertNull( e.getMessage() ); e = new ZoneTransferException( "This is my message" ); assertEquals( "This is my message", e.getMessage() ); } } dnsjava-2.1.5/tests/org/xbill/DNS/ExtendedFlagsTest.java100644 0 0 5350 10242022601 20173 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class ExtendedFlagsTest extends TestCase { public void test_string() { // a regular one assertEquals("do", ExtendedFlags.string(ExtendedFlags.DO)); // one that doesn't exist assertTrue(ExtendedFlags.string(1).startsWith("flag")); try { ExtendedFlags.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xFFFF) try { ExtendedFlags.string(0x10000); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(ExtendedFlags.DO, ExtendedFlags.value("do")); // one thats undefined but within range assertEquals(16, ExtendedFlags.value("FLAG16")); // one thats undefined but out of range assertEquals(-1, ExtendedFlags.value("FLAG" + 0x10000)); // something that unknown assertEquals(-1, ExtendedFlags.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, ExtendedFlags.value("")); } } dnsjava-2.1.5/tests/org/xbill/DNS/FlagsTest.java100644 0 0 6633 10242022601 16517 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class FlagsTest extends TestCase { public void test_string() { // a regular one assertEquals("aa", Flags.string(Flags.AA)); // one that doesn't exist assertTrue(Flags.string(12).startsWith("flag")); try { Flags.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xF) try { Flags.string(0x10); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(Flags.CD, Flags.value("cd")); // one thats undefined but within range assertEquals(13, Flags.value("FLAG13")); // one thats undefined but out of range assertEquals(-1, Flags.value("FLAG" + 0x10)); // something that unknown assertEquals(-1, Flags.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, Flags.value("")); } public void test_isFlag() { try { Flags.isFlag(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } assertTrue(Flags.isFlag(0)); assertFalse(Flags.isFlag(1)); // opcode assertFalse(Flags.isFlag(2)); assertFalse(Flags.isFlag(3)); assertFalse(Flags.isFlag(4)); assertTrue(Flags.isFlag(5)); assertTrue(Flags.isFlag(6)); assertTrue(Flags.isFlag(7)); assertTrue(Flags.isFlag(8)); assertTrue(Flags.isFlag(9)); assertTrue(Flags.isFlag(10)); assertTrue(Flags.isFlag(11)); assertFalse(Flags.isFlag(12)); assertFalse(Flags.isFlag(13)); assertFalse(Flags.isFlag(14)); assertFalse(Flags.isFlag(14)); try { Flags.isFlag(16); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } } dnsjava-2.1.5/tests/org/xbill/DNS/FormattedTimeTest.java100644 0 0 6261 10242022601 20224 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Date; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import junit.framework.TestCase; import org.xbill.DNS.FormattedTime; public class FormattedTimeTest extends TestCase { public void test_format() { GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); cal.set(2005, 2, 19, 4, 4, 5); String out = FormattedTime.format(cal.getTime()); assertEquals("20050319040405", out); } public void test_parse() throws TextParseException { // have to make sure to clear out the milliseconds since there // is occasionally a difference between when cal and cal2 are // instantiated. GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); cal.set(2005, 2, 19, 4, 4, 5); cal.set(Calendar.MILLISECOND, 0); Date out = FormattedTime.parse("20050319040405"); GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("UTC")); cal2.setTimeInMillis(out.getTime()); cal2.set(Calendar.MILLISECOND, 0); assertEquals(cal, cal2); } public void test_parse_invalid() { try { FormattedTime.parse("2004010101010"); fail("TextParseException not thrown"); } catch( TextParseException e ){ } try { FormattedTime.parse("200401010101010"); fail("TextParseException not thrown"); } catch( TextParseException e ){ } try { FormattedTime.parse("2004010101010A"); fail("TextParseException not thrown"); } catch( TextParseException e ){ } } } dnsjava-2.1.5/tests/org/xbill/DNS/GPOSRecordTest.java100644 0 0 27564 10242022601 17420 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class GPOSRecordTest extends TestCase { public void test_ctor_0arg() { GPOSRecord gr = new GPOSRecord(); assertNull(gr.getName()); assertEquals(0, gr.getType()); assertEquals(0, gr.getDClass()); assertEquals(0, gr.getTTL()); } public void test_getObject() { GPOSRecord gr = new GPOSRecord(); Record r = gr.getObject(); assertTrue(r instanceof GPOSRecord); } public static class Test_Ctor_6arg_doubles extends TestCase { private Name m_n; private long m_ttl; private double m_lat, m_long, m_alt; protected void setUp() throws TextParseException { m_n = Name.fromString("The.Name."); m_ttl = 0xABCDL; m_lat = -10.43; m_long = 76.12; m_alt = 100.101; } public void test_basic() throws TextParseException { GPOSRecord gr = new GPOSRecord(m_n, DClass.IN, m_ttl, m_long, m_lat, m_alt); assertEquals(m_n, gr.getName()); assertEquals(DClass.IN, gr.getDClass()); assertEquals(Type.GPOS, gr.getType()); assertEquals(m_ttl, gr.getTTL()); assertEquals(new Double(m_long), new Double(gr.getLongitude())); assertEquals(new Double(m_lat), new Double(gr.getLatitude())); assertEquals(new Double(m_alt), new Double(gr.getAltitude())); assertEquals(new Double(m_long).toString(), gr.getLongitudeString()); assertEquals(new Double(m_lat).toString(), gr.getLatitudeString()); assertEquals(new Double(m_alt).toString(), gr.getAltitudeString()); } public void test_toosmall_longitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, -90.001, m_lat, m_alt); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_longitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, 90.001, m_lat, m_alt); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toosmall_latitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, m_long, -180.001, m_alt); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_latitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, m_long, 180.001, m_alt); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_invalid_string() { try { new GPOSRecord(m_n, DClass.IN, m_ttl, new Double(m_long).toString(), "120.\\00ABC", new Double(m_alt).toString()); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } } public static class Test_Ctor_6arg_Strings extends TestCase { private Name m_n; private long m_ttl; private double m_lat, m_long, m_alt; protected void setUp() throws TextParseException { m_n = Name.fromString("The.Name."); m_ttl = 0xABCDL; m_lat = -10.43; m_long = 76.12; m_alt = 100.101; } public void test_basic() throws TextParseException { GPOSRecord gr = new GPOSRecord(m_n, DClass.IN, m_ttl, new Double(m_long).toString(), new Double(m_lat).toString(), new Double(m_alt).toString()); assertEquals(m_n, gr.getName()); assertEquals(DClass.IN, gr.getDClass()); assertEquals(Type.GPOS, gr.getType()); assertEquals(m_ttl, gr.getTTL()); assertEquals(new Double(m_long), new Double(gr.getLongitude())); assertEquals(new Double(m_lat), new Double(gr.getLatitude())); assertEquals(new Double(m_alt), new Double(gr.getAltitude())); assertEquals(new Double(m_long).toString(), gr.getLongitudeString()); assertEquals(new Double(m_lat).toString(), gr.getLatitudeString()); assertEquals(new Double(m_alt).toString(), gr.getAltitudeString()); } public void test_toosmall_longitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, "-90.001", new Double(m_lat).toString(), new Double(m_alt).toString()); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_longitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, "90.001", new Double(m_lat).toString(), new Double(m_alt).toString()); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toosmall_latitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, new Double(m_long).toString(), "-180.001", new Double(m_alt).toString()); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_toobig_latitude() throws TextParseException { try { new GPOSRecord(m_n, DClass.IN, m_ttl, new Double(m_long).toString(), "180.001", new Double(m_alt).toString()); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } } public static class Test_rrFromWire extends TestCase { public void test_basic() throws IOException { byte[] raw = new byte[] { 5, '-', '8', '.', '1', '2', 6, '1', '2', '3', '.', '0', '7', 3, '0', '.', '0' }; DNSInput in = new DNSInput(raw); GPOSRecord gr = new GPOSRecord(); gr.rrFromWire(in); assertEquals(new Double(-8.12), new Double(gr.getLongitude())); assertEquals(new Double(123.07), new Double(gr.getLatitude())); assertEquals(new Double(0.0), new Double(gr.getAltitude())); } public void test_longitude_toosmall() throws IOException { byte[] raw = new byte[] { 5, '-', '9', '5', '.', '0', 6, '1', '2', '3', '.', '0', '7', 3, '0', '.', '0' }; DNSInput in = new DNSInput(raw); GPOSRecord gr = new GPOSRecord(); try { gr.rrFromWire(in); fail("WireParseException not thrown"); } catch(WireParseException e){} } public void test_longitude_toobig() throws IOException { byte[] raw = new byte[] { 5, '1', '8', '5', '.', '0', 6, '1', '2', '3', '.', '0', '7', 3, '0', '.', '0' }; DNSInput in = new DNSInput(raw); GPOSRecord gr = new GPOSRecord(); try { gr.rrFromWire(in); fail("WireParseException not thrown"); } catch(WireParseException e){} } public void test_latitude_toosmall() throws IOException { byte[] raw = new byte[] { 5, '-', '8', '5', '.', '0', 6, '-', '1', '9', '0', '.', '0', 3, '0', '.', '0' }; DNSInput in = new DNSInput(raw); GPOSRecord gr = new GPOSRecord(); try { gr.rrFromWire(in); fail("WireParseException not thrown"); } catch(WireParseException e){} } public void test_latitude_toobig() throws IOException { byte[] raw = new byte[] { 5, '-', '8', '5', '.', '0', 6, '2', '1', '9', '0', '.', '0', 3, '0', '.', '0' }; DNSInput in = new DNSInput(raw); GPOSRecord gr = new GPOSRecord(); try { gr.rrFromWire(in); fail("WireParseException not thrown"); } catch(WireParseException e){} } } public static class Test_rdataFromString extends TestCase { public void test_basic() throws IOException { Tokenizer t = new Tokenizer("10.45 171.121212 1010787"); GPOSRecord gr = new GPOSRecord(); gr.rdataFromString(t, null); assertEquals(new Double(10.45), new Double(gr.getLongitude())); assertEquals(new Double(171.121212), new Double(gr.getLatitude())); assertEquals(new Double(1010787), new Double(gr.getAltitude())); } public void test_longitude_toosmall() throws IOException { Tokenizer t = new Tokenizer("-100.390 171.121212 1010787"); GPOSRecord gr = new GPOSRecord(); try { gr.rdataFromString(t, null); fail("IOException not thrown"); } catch(IOException e){} } public void test_longitude_toobig() throws IOException { Tokenizer t = new Tokenizer("90.00001 171.121212 1010787"); GPOSRecord gr = new GPOSRecord(); try { gr.rdataFromString(t, null); fail("IOException not thrown"); } catch(IOException e){} } public void test_latitude_toosmall() throws IOException { Tokenizer t = new Tokenizer("0.0 -180.01 1010787"); GPOSRecord gr = new GPOSRecord(); try { gr.rdataFromString(t, null); fail("IOException not thrown"); } catch(IOException e){} } public void test_latitude_toobig() throws IOException { Tokenizer t = new Tokenizer("0.0 180.01 1010787"); GPOSRecord gr = new GPOSRecord(); try { gr.rdataFromString(t, null); fail("IOException not thrown"); } catch(IOException e){} } public void test_invalid_string() throws IOException { Tokenizer t = new Tokenizer("1.0 2.0 \\435"); try { GPOSRecord gr = new GPOSRecord(); gr.rdataFromString(t, null); } catch(TextParseException e){}} } public void test_rrToString() throws TextParseException { String exp = "\"10.45\" \"171.121212\" \"1010787.0\""; GPOSRecord gr = new GPOSRecord(Name.fromString("The.Name."), DClass.IN, 0x123, 10.45, 171.121212, 1010787); assertEquals(exp, gr.rrToString()); } public void test_rrToWire() throws TextParseException { GPOSRecord gr = new GPOSRecord(Name.fromString("The.Name."), DClass.IN, 0x123, -10.45, 120.0, 111.0); byte[] exp = new byte[] { 6, '-', '1', '0', '.', '4', '5', 5, '1', '2', '0', '.', '0', 5, '1', '1', '1', '.', '0' }; DNSOutput out = new DNSOutput(); gr.rrToWire(out, null, true); byte[] bar = out.toByteArray(); assertEquals(exp.length, bar.length); for( int i=0; i // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import junit.framework.TestCase; import org.xbill.DNS.DNSInput; import org.xbill.DNS.DNSOutput; import org.xbill.DNS.Header; import org.xbill.DNS.Opcode; import org.xbill.DNS.Rcode; import org.xbill.DNS.Flags; public class HeaderTest extends TestCase { private Header m_h; public void setUp() { m_h = new Header(0xABCD); // 43981 } public void test_fixture_state() { assertEquals(0xABCD, m_h.getID()); boolean[] flags = m_h.getFlags(); for( int i=0; i= 0 && id < 0xffff); m_h.setID(0xDCBA); assertEquals(0xDCBA, m_h.getID()); } public void test_setID_invalid() { try { m_h.setID(0x10000); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } try { m_h.setID(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_Rcode() { assertEquals(0, m_h.getRcode()); m_h.setRcode(0xA); // 1010 assertEquals(0xA, m_h.getRcode()); for( int i=0; i<12; ++i){ if( ( i > 0 && i < 5 ) || i > 11 ){ continue; } assertFalse(m_h.getFlag(i)); } } public void test_setRcode_invalid() { try { m_h.setRcode(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } try { m_h.setRcode(0x100); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_Opcode() { assertEquals(0, m_h.getOpcode()); m_h.setOpcode(0xE); // 1110 assertEquals(0xE, m_h.getOpcode()); assertFalse(m_h.getFlag(0)); for( int i=5; i<12; ++i){ assertFalse(m_h.getFlag(i)); } assertEquals(0, m_h.getRcode()); } public void test_setOpcode_invalid() { try { m_h.setOpcode(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } try { m_h.setOpcode(0x100); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_Count() { m_h.setCount(2, 0x1E); assertEquals(0, m_h.getCount(0)); assertEquals(0, m_h.getCount(1)); assertEquals(0x1E, m_h.getCount(2)); assertEquals(0, m_h.getCount(3)); m_h.incCount(0); assertEquals(1, m_h.getCount(0)); m_h.decCount(2); assertEquals(0x1E-1, m_h.getCount(2)); } public void test_setCount_invalid() { try {m_h.setCount(-1, 0); fail("ArrayIndexOutOfBoundsException not thrown");} catch( ArrayIndexOutOfBoundsException e ){} try {m_h.setCount(4, 0); fail("ArrayIndexOutOfBoundsException not thrown");} catch( ArrayIndexOutOfBoundsException e ){} try {m_h.setCount(0, -1); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {m_h.setCount(3, 0x10000); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} } public void test_getCount_invalid() { try {m_h.getCount(-1); fail("ArrayIndexOutOfBoundsException not thrown");} catch( ArrayIndexOutOfBoundsException e ){} try {m_h.getCount(4); fail("ArrayIndexOutOfBoundsException not thrown");} catch( ArrayIndexOutOfBoundsException e ){} } public void test_incCount_invalid() { m_h.setCount(1, 0xFFFF); try {m_h.incCount(1); fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} } public void test_decCount_invalid() { m_h.setCount(2, 0); try {m_h.decCount(2); fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} } public void test_toString() { m_h.setOpcode(Opcode.value("STATUS")); m_h.setRcode(Rcode.value("NXDOMAIN")); m_h.setFlag(0); // qr m_h.setFlag(7); // rd m_h.setFlag(8); // ra m_h.setFlag(11); // cd m_h.setCount(1, 0xFF); m_h.setCount(2, 0x0A); String text = m_h.toString(); assertFalse(text.indexOf("id: 43981") == -1); assertFalse(text.indexOf("opcode: STATUS") == -1); assertFalse(text.indexOf("status: NXDOMAIN") == -1); assertFalse(text.indexOf(" qr ") == -1); assertFalse(text.indexOf(" rd ") == -1); assertFalse(text.indexOf(" ra ") == -1); assertFalse(text.indexOf(" cd ") == -1); assertFalse(text.indexOf("qd: 0 ") == -1); assertFalse(text.indexOf("an: 255 ") == -1); assertFalse(text.indexOf("au: 10 ") == -1); assertFalse(text.indexOf("ad: 0 ") == -1); } public void test_clone() { m_h.setOpcode(Opcode.value("IQUERY")); m_h.setRcode(Rcode.value("SERVFAIL")); m_h.setFlag(0); // qr m_h.setFlag(7); // rd m_h.setFlag(8); // ra m_h.setFlag(11); // cd m_h.setCount(1, 0xFF); m_h.setCount(2, 0x0A); Header h2 = (Header)m_h.clone(); assertNotSame(m_h, h2); assertEquals(m_h.getID(), h2.getID()); for( int i=0; i<16; ++i){ if( (i>0 && i<5) || i > 11){ continue; } assertEquals(m_h.getFlag(i), h2.getFlag(i)); } for( int i=0; i<4; ++i){ assertEquals(m_h.getCount(i), h2.getCount(i)); } } } dnsjava-2.1.5/tests/org/xbill/DNS/KEYBaseTest.java100644 0 0 14000 10242022601 16711 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.util.Arrays; import junit.framework.TestCase; import org.xbill.DNS.utils.base64; public class KEYBaseTest extends TestCase { private static class TestClass extends KEYBase { public TestClass(){} public TestClass(Name name, int type, int dclass, long ttl, int flags, int proto, int alg, byte[] key ) { super(name, type, dclass, ttl, flags, proto, alg, key); } public Record getObject() { return null; } void rdataFromString(Tokenizer st, Name origin) throws IOException { } } public void test_ctor() throws TextParseException { TestClass tc = new TestClass(); assertEquals(0, tc.getFlags()); assertEquals(0, tc.getProtocol()); assertEquals(0, tc.getAlgorithm()); assertNull(tc.getKey()); Name n = Name.fromString("my.name."); byte[] key = new byte[] { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0xFF, 0xF, 0xE, key); assertSame(n, tc.getName()); assertEquals(Type.KEY, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(100L, tc.getTTL()); assertEquals(0xFF, tc.getFlags()); assertEquals(0xF, tc.getProtocol()); assertEquals(0xE, tc.getAlgorithm()); assertTrue(Arrays.equals(key, tc.getKey())); } public void test_rrFromWire() throws IOException { byte[] raw = new byte[] { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x19, 1, 2, 3, 4, 5 }; DNSInput in = new DNSInput(raw); TestClass tc = new TestClass(); tc.rrFromWire(in); assertEquals(0xABCD, tc.getFlags()); assertEquals(0xEF, tc.getProtocol()); assertEquals(0x19, tc.getAlgorithm()); assertTrue(Arrays.equals(new byte[] { 1, 2, 3, 4, 5 }, tc.getKey())); raw = new byte[] { (byte)0xBA, (byte)0xDA, (byte)0xFF, (byte)0x28 }; in = new DNSInput(raw); tc = new TestClass(); tc.rrFromWire(in); assertEquals(0xBADA, tc.getFlags()); assertEquals(0xFF, tc.getProtocol()); assertEquals(0x28, tc.getAlgorithm()); assertNull(tc.getKey()); } public void test_rrToString() throws IOException, TextParseException { Name n = Name.fromString("my.name."); byte[] key = new byte[] { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; TestClass tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0xFF, 0xF, 0xE, null); String out = tc.rrToString(); assertEquals("255 15 14", out); tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0xFF, 0xF, 0xE, key); out = tc.rrToString(); assertEquals("255 15 14 " + base64.toString(key), out); Options.set("multiline"); out = tc.rrToString(); assertEquals("255 15 14 (\n\t" + base64.toString(key) + " ) ; key_tag = 18509", out); Options.unset("multiline"); } public void test_getFootprint() throws TextParseException { Name n = Name.fromString("my.name."); byte[] key = new byte[] { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; TestClass tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0xFF, 0xF, DNSSEC.Algorithm.RSAMD5, key); int foot = tc.getFootprint(); // second-to-last and third-to-last bytes of key for RSAMD5 assertEquals(0xD0E, foot); assertEquals(foot, tc.getFootprint()); // key with an odd number of bytes tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0x89AB, 0xCD, 0xEF, new byte [] { 0x12, 0x34, 0x56 } ); // rrToWire gives: { 0x89, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56 } // 89AB + CDEF + 1234 + 5600 = 1BCFE // 1BFCE + 1 = 1BFCF & FFFF = BFCF foot = tc.getFootprint(); assertEquals(0xBFCF, foot); assertEquals(foot, tc.getFootprint()); // empty tc = new TestClass(); assertEquals(0, tc.getFootprint()); } public void test_rrToWire() throws IOException, TextParseException { Name n = Name.fromString("my.name."); byte[] key = new byte[] { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; TestClass tc = new TestClass(n, Type.KEY, DClass.IN, 100L, 0x7689, 0xAB, 0xCD, key); byte[] exp = new byte[] { (byte)0x76, (byte)0x89, (byte)0xAB, (byte)0xCD, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; DNSOutput o = new DNSOutput(); // canonical tc.rrToWire(o, null, true); assertTrue(Arrays.equals(exp, o.toByteArray())); // not canonical o = new DNSOutput(); tc.rrToWire(o, null, false); assertTrue(Arrays.equals(exp, o.toByteArray())); } } dnsjava-2.1.5/tests/org/xbill/DNS/KEYRecordTest.java100644 0 0 14736 12110757232 17310 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class KEYRecordTest extends TestCase { public void test_ctor_0arg() throws UnknownHostException { KEYRecord ar = new KEYRecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertEquals(0, ar.getAlgorithm()); assertEquals(0, ar.getFlags()); assertEquals(0, ar.getFootprint()); assertEquals(0, ar.getProtocol()); assertNull(ar.getKey()); } public void test_getObject() { KEYRecord ar = new KEYRecord(); Record r = ar.getObject(); assertTrue(r instanceof KEYRecord); } public void test_ctor_7arg() throws TextParseException { Name n = Name.fromString("My.Absolute.Name."); Name r = Name.fromString("My.Relative.Name"); byte[] key = new byte[] { 0, 1, 3, 5, 7, 9 }; KEYRecord kr = new KEYRecord(n, DClass.IN, 0x24AC, 0x9832, 0x12, 0x67, key); assertEquals(n, kr.getName()); assertEquals(Type.KEY, kr.getType()); assertEquals(DClass.IN, kr.getDClass()); assertEquals(0x24AC, kr.getTTL()); assertEquals(0x9832, kr.getFlags()); assertEquals(0x12, kr.getProtocol()); assertEquals(0x67, kr.getAlgorithm()); assertTrue(Arrays.equals(key, kr.getKey())); // a relative name try { new KEYRecord(r, DClass.IN, 0x24AC, 0x9832, 0x12, 0x67, key); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_Protocol_string() { // a regular one assertEquals("DNSSEC", KEYRecord.Protocol.string(KEYRecord.Protocol.DNSSEC)); // a unassigned value within range assertEquals("254", KEYRecord.Protocol.string(0xFE)); // too low try { KEYRecord.Protocol.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} // too high try { KEYRecord.Protocol.string(0x100); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_Protocol_value() { // a regular one assertEquals(KEYRecord.Protocol.IPSEC, KEYRecord.Protocol.value("IPSEC")); // a unassigned value within range assertEquals(254, KEYRecord.Protocol.value("254")); // too low assertEquals(-1, KEYRecord.Protocol.value("-2")); // too high assertEquals(-1, KEYRecord.Protocol.value("256")); } public void test_Flags_value() { // numeric // lower bound assertEquals(-1, KEYRecord.Flags.value("-2")); assertEquals(0, KEYRecord.Flags.value("0")); // in the middle assertEquals(0xAB35, KEYRecord.Flags.value(0xAB35+"")); // upper bound assertEquals(0xFFFF, KEYRecord.Flags.value(0xFFFF+"")); assertEquals(-1, KEYRecord.Flags.value(0x10000+"")); // textual // single assertEquals(KEYRecord.Flags.EXTEND, KEYRecord.Flags.value("EXTEND")); // single invalid assertEquals(-1, KEYRecord.Flags.value("NOT_A_VALID_NAME")); // multiple assertEquals(KEYRecord.Flags.NOAUTH|KEYRecord.Flags.FLAG10|KEYRecord.Flags.ZONE, KEYRecord.Flags.value("NOAUTH|ZONE|FLAG10")); // multiple invalid assertEquals(-1, KEYRecord.Flags.value("NOAUTH|INVALID_NAME|FLAG10")); // pathological assertEquals(0, KEYRecord.Flags.value("|")); } public void test_rdataFromString() throws IOException, TextParseException { // basic KEYRecord kr = new KEYRecord(); Tokenizer st = new Tokenizer("NOAUTH|ZONE|FLAG10 EMAIL RSASHA1 AQIDBAUGBwgJ"); kr.rdataFromString(st, null); assertEquals(KEYRecord.Flags.NOAUTH|KEYRecord.Flags.FLAG10|KEYRecord.Flags.ZONE, kr.getFlags()); assertEquals(KEYRecord.Protocol.EMAIL, kr.getProtocol()); assertEquals(DNSSEC.Algorithm.RSASHA1, kr.getAlgorithm()); assertTrue(Arrays.equals(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, kr.getKey())); // basic w/o key kr = new KEYRecord(); st = new Tokenizer("NOAUTH|NOKEY|FLAG10 TLS 3"); kr.rdataFromString(st, null); assertEquals(KEYRecord.Flags.NOAUTH|KEYRecord.Flags.FLAG10|KEYRecord.Flags.NOKEY, kr.getFlags()); assertEquals(KEYRecord.Protocol.TLS, kr.getProtocol()); assertEquals(3, kr.getAlgorithm()); // Was ECC assertNull(kr.getKey()); // invalid flags kr = new KEYRecord(); st = new Tokenizer("NOAUTH|ZONE|JUNK EMAIL RSASHA1 AQIDBAUGBwgJ"); try { kr.rdataFromString(st, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} // invalid protocol kr = new KEYRecord(); st = new Tokenizer("NOAUTH|ZONE RSASHA1 3 AQIDBAUGBwgJ"); try { kr.rdataFromString(st, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} // invalid algorithm kr = new KEYRecord(); st = new Tokenizer("NOAUTH|ZONE EMAIL ZONE AQIDBAUGBwgJ"); try { kr.rdataFromString(st, null); fail("TextParseException not thrown"); } catch( TextParseException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/KXRecordTest.java100644 0 0 4632 10242022601 17141 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Arrays; import junit.framework.TestCase; public class KXRecordTest extends TestCase { public void test_getObject() { KXRecord d = new KXRecord(); Record r = d.getObject(); assertTrue(r instanceof KXRecord); } public void test_ctor_5arg() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.OtherName."); KXRecord d = new KXRecord(n, DClass.IN, 0xABCDEL, 0xF1, m); assertEquals(n, d.getName()); assertEquals(Type.KX, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(0xF1, d.getPreference()); assertEquals(m, d.getTarget()); assertEquals(m, d.getAdditionalName()); } } dnsjava-2.1.5/tests/org/xbill/DNS/MBRecordTest.java100644 0 0 4767 10242022601 17126 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class MBRecordTest extends TestCase { public void test_ctor_0arg() { MBRecord d = new MBRecord(); assertNull(d.getName()); assertNull(d.getAdditionalName()); assertNull(d.getMailbox()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); MBRecord d = new MBRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.MB, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getAdditionalName()); assertEquals(a, d.getMailbox()); } public void test_getObject() { MBRecord d = new MBRecord(); Record r = d.getObject(); assertTrue(r instanceof MBRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/MDRecordTest.java100644 0 0 4773 10242022601 17125 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class MDRecordTest extends TestCase { public void test_ctor_0arg() { MDRecord d = new MDRecord(); assertNull(d.getName()); assertNull(d.getAdditionalName()); assertNull(d.getMailAgent()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); MDRecord d = new MDRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.MD, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getAdditionalName()); assertEquals(a, d.getMailAgent()); } public void test_getObject() { MDRecord d = new MDRecord(); Record r = d.getObject(); assertTrue(r instanceof MDRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/MFRecordTest.java100644 0 0 4773 10242022601 17127 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class MFRecordTest extends TestCase { public void test_ctor_0arg() { MFRecord d = new MFRecord(); assertNull(d.getName()); assertNull(d.getAdditionalName()); assertNull(d.getMailAgent()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); MFRecord d = new MFRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.MF, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getAdditionalName()); assertEquals(a, d.getMailAgent()); } public void test_getObject() { MFRecord d = new MFRecord(); Record r = d.getObject(); assertTrue(r instanceof MFRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/MGRecordTest.java100644 0 0 4652 10242022601 17124 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class MGRecordTest extends TestCase { public void test_ctor_0arg() { MGRecord d = new MGRecord(); assertNull(d.getName()); assertNull(d.getMailbox()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); MGRecord d = new MGRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.MG, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getMailbox()); } public void test_getObject() { MGRecord d = new MGRecord(); Record r = d.getObject(); assertTrue(r instanceof MGRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/MRRecordTest.java100644 0 0 4652 10242022601 17137 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class MRRecordTest extends TestCase { public void test_ctor_0arg() { MRRecord d = new MRRecord(); assertNull(d.getName()); assertNull(d.getNewName()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); MRRecord d = new MRRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.MR, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getNewName()); } public void test_getObject() { MRRecord d = new MRRecord(); Record r = d.getObject(); assertTrue(r instanceof MRRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/MXRecordTest.java100644 0 0 6027 10242022601 17143 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Arrays; import junit.framework.TestCase; public class MXRecordTest extends TestCase { public void test_getObject() { MXRecord d = new MXRecord(); Record r = d.getObject(); assertTrue(r instanceof MXRecord); } public void test_ctor_5arg() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.OtherName."); MXRecord d = new MXRecord(n, DClass.IN, 0xABCDEL, 0xF1, m); assertEquals(n, d.getName()); assertEquals(Type.MX, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(0xF1, d.getPriority()); assertEquals(m, d.getTarget()); assertEquals(m, d.getAdditionalName()); } public void test_rrToWire() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("M.O.n."); MXRecord mr = new MXRecord(n, DClass.IN, 0xB12FL, 0x1F2B, m ); // canonical DNSOutput dout = new DNSOutput(); mr.rrToWire(dout, null, true); byte[] out = dout.toByteArray(); byte[] exp = new byte[] { 0x1F, 0x2B, 1, 'm', 1, 'o', 1, 'n', 0 }; assertTrue(Arrays.equals(exp, out)); // case sensitive dout = new DNSOutput(); mr.rrToWire(dout, null, false); out = dout.toByteArray(); exp = new byte[] { 0x1F, 0x2B, 1, 'M', 1, 'O', 1, 'n', 0 }; assertTrue(Arrays.equals(exp, out)); } } dnsjava-2.1.5/tests/org/xbill/DNS/MessageTest.java100644 0 0 10371 10242022601 17061 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class MessageTest { public static class Test_init extends TestCase { public void test_0arg() { Message m = new Message(); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(0))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(1))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(2))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(3))); try { m.getSectionArray(4); fail("IndexOutOfBoundsException not thrown"); } catch(IndexOutOfBoundsException e){} Header h = m.getHeader(); assertEquals(0, h.getCount(0)); assertEquals(0, h.getCount(1)); assertEquals(0, h.getCount(2)); assertEquals(0, h.getCount(3)); } public void test_1arg() { Message m = new Message(10); assertEquals(new Header(10).toString(), m.getHeader().toString()); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(0))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(1))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(2))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(3))); try { m.getSectionArray(4); fail("IndexOutOfBoundsException not thrown"); } catch(IndexOutOfBoundsException e){} Header h = m.getHeader(); assertEquals(0, h.getCount(0)); assertEquals(0, h.getCount(1)); assertEquals(0, h.getCount(2)); assertEquals(0, h.getCount(3)); } public void test_newQuery() throws TextParseException, UnknownHostException { Name n = Name.fromString("The.Name."); ARecord ar = new ARecord(n, DClass.IN, 1, InetAddress.getByName("192.168.101.110")); Message m = Message.newQuery(ar); assertTrue(Arrays.equals(new Record[]{ ar }, m.getSectionArray(0))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(1))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(2))); assertTrue(Arrays.equals(new Record[0], m.getSectionArray(3))); Header h = m.getHeader(); assertEquals(1, h.getCount(0)); assertEquals(0, h.getCount(1)); assertEquals(0, h.getCount(2)); assertEquals(0, h.getCount(3)); assertEquals(Opcode.QUERY, h.getOpcode()); assertEquals(true, h.getFlag(Flags.RD)); } } public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(Test_init.class); return s; } } dnsjava-2.1.5/tests/org/xbill/DNS/MnemonicTest.java100644 0 0 16560 10242022601 17250 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; // Mnemonic has package-level access. import junit.framework.TestCase; public class MnemonicTest extends TestCase { private Mnemonic m_mn; public MnemonicTest( String name ) { super( name ); } public void setUp() { m_mn = new Mnemonic(MnemonicTest.class.getName() + " UPPER", Mnemonic.CASE_UPPER); } public void test_toInteger() { Integer i = Mnemonic.toInteger(64); assertEquals( new Integer(64), i ); Integer i2 = Mnemonic.toInteger(64); assertEquals( i, i2 ); assertNotSame( i, i2 ); i = Mnemonic.toInteger(-1); assertEquals( new Integer(-1), i ); i2 = Mnemonic.toInteger(-1); assertEquals( i, i2 ); assertNotSame( i, i2 ); i = Mnemonic.toInteger(0); assertEquals( new Integer(0), i ); i2 = Mnemonic.toInteger(0); assertEquals( i, i2 ); assertSame( i, i2 ); i = Mnemonic.toInteger(63); assertEquals( new Integer(63), i ); i2 = Mnemonic.toInteger(63); assertEquals( i, i2 ); assertSame( i, i2 ); } public void test_no_maximum() { try {m_mn.check(-1); fail( "IllegalArgumentException not thrown" );} catch( IllegalArgumentException e ){} try {m_mn.check(0);} catch( IllegalArgumentException e ){fail(e.getMessage());} try {m_mn.check(Integer.MAX_VALUE);} catch( IllegalArgumentException e ){fail(e.getMessage());} m_mn.setNumericAllowed(true); int val = m_mn.getValue("-2"); assertEquals( -1, val ); val = m_mn.getValue("0"); assertEquals( 0, val ); val = m_mn.getValue("" + Integer.MAX_VALUE); assertEquals( Integer.MAX_VALUE, val ); } public void test_setMaximum() { m_mn.setMaximum(15); try {m_mn.check(-1); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {m_mn.check(0);} catch( IllegalArgumentException e ){fail( e.getMessage() );} try {m_mn.check(15);} catch( IllegalArgumentException e ){fail( e.getMessage() );} try {m_mn.check(16); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} // need numericok to exercise the usage of max in parseNumeric m_mn.setNumericAllowed(true); int val = m_mn.getValue("-2"); assertEquals( -1, val ); val = m_mn.getValue( "0" ); assertEquals( 0, val ); val = m_mn.getValue( "15" ); assertEquals( 15, val ); val = m_mn.getValue( "16" ); assertEquals( -1, val ); } public void test_setPrefix() { final String prefix = "A mixed CASE Prefix".toUpperCase(); m_mn.setPrefix(prefix); String out = m_mn.getText(10); assertEquals( prefix + "10", out ); int i = m_mn.getValue( out ); assertEquals( 10, i ); } public void test_basic_operation() { // setUp creates Mnemonic with CASE_UPPER m_mn.add( 10, "Ten" ); m_mn.add( 20, "Twenty" ); m_mn.addAlias( 20, "Veinte" ); m_mn.add( 30, "Thirty" ); String text = m_mn.getText(10); assertEquals( "TEN", text ); text = m_mn.getText(20); assertEquals( "TWENTY", text ); text = m_mn.getText(30); assertEquals( "THIRTY", text ); text = m_mn.getText(40); assertEquals( "40", text ); int value = m_mn.getValue("tEn"); assertEquals(10, value); value = m_mn.getValue("twenty"); assertEquals(20, value); value = m_mn.getValue("VeiNTe"); assertEquals(20, value); value = m_mn.getValue("THIRTY"); assertEquals(30, value); } public void test_basic_operation_lower() { m_mn = new Mnemonic(MnemonicTest.class.getName() + " LOWER", Mnemonic.CASE_LOWER); m_mn.add( 10, "Ten" ); m_mn.add( 20, "Twenty" ); m_mn.addAlias( 20, "Veinte" ); m_mn.add( 30, "Thirty" ); String text = m_mn.getText(10); assertEquals( "ten", text ); text = m_mn.getText(20); assertEquals( "twenty", text ); text = m_mn.getText(30); assertEquals( "thirty", text ); text = m_mn.getText(40); assertEquals( "40", text ); int value = m_mn.getValue("tEn"); assertEquals(10, value); value = m_mn.getValue("twenty"); assertEquals(20, value); value = m_mn.getValue("VeiNTe"); assertEquals(20, value); value = m_mn.getValue("THIRTY"); assertEquals(30, value); } public void test_basic_operation_sensitive() { m_mn = new Mnemonic(MnemonicTest.class.getName() + " SENSITIVE", Mnemonic.CASE_SENSITIVE); m_mn.add( 10, "Ten" ); m_mn.add( 20, "Twenty" ); m_mn.addAlias( 20, "Veinte" ); m_mn.add( 30, "Thirty" ); String text = m_mn.getText(10); assertEquals( "Ten", text ); text = m_mn.getText(20); assertEquals( "Twenty", text ); text = m_mn.getText(30); assertEquals( "Thirty", text ); text = m_mn.getText(40); assertEquals( "40", text ); int value = m_mn.getValue("Ten"); assertEquals(10, value); value = m_mn.getValue("twenty"); assertEquals(-1, value); value = m_mn.getValue("Twenty"); assertEquals(20, value); value = m_mn.getValue("VEINTE"); assertEquals(-1, value); value = m_mn.getValue("Veinte"); assertEquals(20, value); value = m_mn.getValue("Thirty"); assertEquals(30, value); } public void test_invalid_numeric() { m_mn.setNumericAllowed(true); int value = m_mn.getValue("Not-A-Number"); assertEquals(-1, value); } public void test_addAll() { m_mn.add( 10, "Ten" ); m_mn.add( 20, "Twenty" ); Mnemonic mn2 = new Mnemonic("second test Mnemonic", Mnemonic.CASE_UPPER); mn2.add( 20, "Twenty" ); mn2.addAlias( 20, "Veinte" ); mn2.add( 30, "Thirty" ); m_mn.addAll( mn2 ); String text = m_mn.getText(10); assertEquals( "TEN", text ); text = m_mn.getText(20); assertEquals( "TWENTY", text ); text = m_mn.getText(30); assertEquals( "THIRTY", text ); text = m_mn.getText(40); assertEquals( "40", text ); int value = m_mn.getValue("tEn"); assertEquals(10, value); value = m_mn.getValue("twenty"); assertEquals(20, value); value = m_mn.getValue("VeiNTe"); assertEquals(20, value); value = m_mn.getValue("THIRTY"); assertEquals(30, value); } } dnsjava-2.1.5/tests/org/xbill/DNS/NSAP_PTRRecordTest.java100644 0 0 4736 10242022601 20112 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class NSAP_PTRRecordTest extends TestCase { public void test_ctor_0arg() { NSAP_PTRRecord d = new NSAP_PTRRecord(); assertNull(d.getName()); assertNull(d.getTarget()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); NSAP_PTRRecord d = new NSAP_PTRRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.NSAP_PTR, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getTarget()); } public void test_getObject() { NSAP_PTRRecord d = new NSAP_PTRRecord(); Record r = d.getObject(); assertTrue(r instanceof NSAP_PTRRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/NSRecordTest.java100644 0 0 4765 10242022601 17146 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class NSRecordTest extends TestCase { public void test_ctor_0arg() { NSRecord d = new NSRecord(); assertNull(d.getName()); assertNull(d.getTarget()); assertNull(d.getAdditionalName()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name a = Name.fromString("my.alias."); NSRecord d = new NSRecord(n, DClass.IN, 0xABCDEL, a); assertEquals(n, d.getName()); assertEquals(Type.NS, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(a, d.getTarget()); assertEquals(a, d.getAdditionalName()); } public void test_getObject() { NSRecord d = new NSRecord(); Record r = d.getObject(); assertTrue(r instanceof NSRecord); } } dnsjava-2.1.5/tests/org/xbill/DNS/NameTest.java100644 0 0 124664 12111024144 16411 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.xbill.DNS.Name; import org.xbill.DNS.TextParseException; public class NameTest extends TestCase { public static class Test_String_init extends TestCase { private final String m_abs = "WWW.DnsJava.org."; private Name m_abs_origin; private final String m_rel = "WWW.DnsJava"; private Name m_rel_origin; protected void setUp() throws TextParseException { m_abs_origin = Name.fromString("Orig."); m_rel_origin = Name.fromString("Orig"); } public void test_ctor_empty() { try { new Name(""); fail("TextParseException not thrown"); } catch(TextParseException e ){} } public void test_ctor_at_null_origin() throws TextParseException { Name n = new Name("@"); assertFalse(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(0, n.labels()); assertEquals(0, n.length()); } public void test_ctor_at_abs_origin() throws TextParseException { Name n = new Name("@", m_abs_origin); assertEquals(m_abs_origin, n); } public void test_ctor_at_rel_origin() throws TextParseException { Name n = new Name("@", m_rel_origin); assertEquals(m_rel_origin, n); } public void test_ctor_dot() throws TextParseException { Name n = new Name("."); assertEquals(Name.root, n); assertNotSame(Name.root, n); assertEquals(1, n.labels()); assertEquals(1, n.length()); } public void test_ctor_wildcard() throws TextParseException { Name n = new Name("*"); assertFalse(n.isAbsolute()); assertTrue(n.isWild()); assertEquals(1, n.labels()); assertEquals(2, n.length()); assertTrue(Arrays.equals(new byte[] { 1, '*' }, n.getLabel(0))); assertEquals("*", n.getLabelString(0)); } public void test_ctor_abs() throws TextParseException { Name n = new Name(m_abs); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(4, n.labels()); assertEquals(17, n.length()); assertTrue(Arrays.equals(new byte[] { 3, 'W', 'W', 'W' }, n.getLabel(0))); assertEquals("WWW", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 7, 'D', 'n', 's', 'J', 'a', 'v', 'a' }, n.getLabel(1))); assertEquals("DnsJava", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 3, 'o', 'r', 'g' }, n.getLabel(2))); assertEquals("org", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(3))); assertEquals("", n.getLabelString(3)); } public void test_ctor_rel() throws TextParseException { Name n = new Name(m_rel); assertFalse(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(2, n.labels()); assertEquals(12, n.length()); assertTrue(Arrays.equals(new byte[] { 3, 'W', 'W', 'W' }, n.getLabel(0))); assertEquals("WWW", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 7, 'D', 'n', 's', 'J', 'a', 'v', 'a' }, n.getLabel(1))); assertEquals("DnsJava", n.getLabelString(1)); } public void test_ctor_7label() throws TextParseException { // 7 is the number of label positions that are cached Name n = new Name("a.b.c.d.e.f."); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(7, n.labels()); assertEquals(13, n.length()); assertTrue(Arrays.equals(new byte[] { 1, 'a' }, n.getLabel(0))); assertEquals("a", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 1, 'b' }, n.getLabel(1))); assertEquals("b", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 1, 'c' }, n.getLabel(2))); assertEquals("c", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 1, 'd' }, n.getLabel(3))); assertEquals("d", n.getLabelString(3)); assertTrue(Arrays.equals(new byte[] { 1, 'e' }, n.getLabel(4))); assertEquals("e", n.getLabelString(4)); assertTrue(Arrays.equals(new byte[] { 1, 'f' }, n.getLabel(5))); assertEquals("f", n.getLabelString(5)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(6))); assertEquals("", n.getLabelString(6)); } public void test_ctor_8label() throws TextParseException { // 7 is the number of label positions that are cached Name n = new Name("a.b.c.d.e.f.g."); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(8, n.labels()); assertEquals(15, n.length()); assertTrue(Arrays.equals(new byte[] { 1, 'a' }, n.getLabel(0))); assertEquals("a", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 1, 'b' }, n.getLabel(1))); assertEquals("b", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 1, 'c' }, n.getLabel(2))); assertEquals("c", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 1, 'd' }, n.getLabel(3))); assertEquals("d", n.getLabelString(3)); assertTrue(Arrays.equals(new byte[] { 1, 'e' }, n.getLabel(4))); assertEquals("e", n.getLabelString(4)); assertTrue(Arrays.equals(new byte[] { 1, 'f' }, n.getLabel(5))); assertEquals("f", n.getLabelString(5)); assertTrue(Arrays.equals(new byte[] { 1, 'g' }, n.getLabel(6))); assertEquals("g", n.getLabelString(6)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(7))); assertEquals("", n.getLabelString(7)); } public void test_ctor_abs_abs_origin() throws TextParseException { Name n = new Name(m_abs, m_abs_origin); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(4, n.labels()); assertEquals(17, n.length()); assertTrue(Arrays.equals(new byte[] { 3, 'W', 'W', 'W' }, n.getLabel(0))); assertEquals("WWW", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 7, 'D', 'n', 's', 'J', 'a', 'v', 'a' }, n.getLabel(1))); assertEquals("DnsJava", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 3, 'o', 'r', 'g' }, n.getLabel(2))); assertEquals("org", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(3))); assertEquals("", n.getLabelString(3)); } public void test_ctor_abs_rel_origin() throws TextParseException { Name n = new Name(m_abs, m_rel_origin); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(4, n.labels()); assertEquals(17, n.length()); assertTrue(Arrays.equals(new byte[] { 3, 'W', 'W', 'W' }, n.getLabel(0))); assertEquals("WWW", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 7, 'D', 'n', 's', 'J', 'a', 'v', 'a' }, n.getLabel(1))); assertEquals("DnsJava", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 3, 'o', 'r', 'g' }, n.getLabel(2))); assertEquals("org", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(3))); assertEquals("", n.getLabelString(3)); } public void test_ctor_rel_abs_origin() throws TextParseException { Name n = new Name(m_rel, m_abs_origin); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(4, n.labels()); assertEquals(18, n.length()); assertTrue(Arrays.equals(new byte[] { 3, 'W', 'W', 'W' }, n.getLabel(0))); assertEquals("WWW", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 7, 'D', 'n', 's', 'J', 'a', 'v', 'a' }, n.getLabel(1))); assertEquals("DnsJava", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 4, 'O', 'r', 'i', 'g'}, n.getLabel(2))); assertEquals("Orig", n.getLabelString(2)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(3))); assertEquals("", n.getLabelString(3)); } public void test_ctor_invalid_label() { try { new Name("junk..junk."); fail("TextParseException not thrown"); } catch(TextParseException e){} } public void test_ctor_max_label() throws TextParseException { // name with a 63 char label Name n = new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b."); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(3, n.labels()); assertEquals(67, n.length()); assertTrue(Arrays.equals(new byte[] { 63, 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a' }, n.getLabel(0))); assertEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", n.getLabelString(0)); assertTrue(Arrays.equals(new byte[] { 1, 'b' }, n.getLabel(1))); assertEquals("b", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(2))); assertEquals("", n.getLabelString(2)); } public void test_ctor_toobig_label() { // name with a 64 char label try { new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b."); fail("TextParseException not thrown"); } catch(TextParseException e ){} } public void test_ctor_max_length_rel() throws TextParseException { // relative name with three 63-char labels and a 62-char label Name n = new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"); assertFalse(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(4, n.labels()); assertEquals(255, n.length()); } public void test_ctor_max_length_abs() throws TextParseException { // absolute name with three 63-char labels and a 61-char label Name n = new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd."); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(5, n.labels()); assertEquals(255, n.length()); } public void test_ctor_escaped() throws TextParseException { Name n = new Name("ab\\123cd"); assertFalse(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(1, n.labels()); assertEquals(6, n.length()); assertTrue(Arrays.equals(new byte[] { 5, 'a', 'b', (byte)123, 'c', 'd' }, n.getLabel(0))); } public void test_ctor_escaped_end() throws TextParseException { Name n = new Name("abcd\\123"); assertFalse(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(1, n.labels()); assertEquals(6, n.length()); assertTrue(Arrays.equals(new byte[] { 5, 'a', 'b', 'c', 'd', (byte)123 }, n.getLabel(0))); } public void test_ctor_short_escaped() throws TextParseException { try { new Name("ab\\12cd"); fail("TextParseException not throw"); } catch(TextParseException e){} } public void test_ctor_short_escaped_end() throws TextParseException { try { new Name("ab\\12"); fail("TextParseException not throw"); } catch(TextParseException e){} } public void test_ctor_empty_escaped_end() throws TextParseException { try { new Name("ab\\"); fail("TextParseException not throw"); } catch(TextParseException e){} } public void test_ctor_toobig_escaped() throws TextParseException { try { new Name("ab\\256cd"); fail("TextParseException not throw"); } catch(TextParseException e){} } public void test_ctor_toobig_escaped_end() throws TextParseException { try { new Name("ab\\256"); fail("TextParseException not throw"); } catch(TextParseException e){} } public void test_ctor_max_label_escaped() throws TextParseException { // name with a 63 char label containing an escape Name n = new Name("aaaa\\100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b."); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(3, n.labels()); assertEquals(67, n.length()); assertTrue(Arrays.equals(new byte[] { 63, 'a','a','a','a',(byte)100,'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a' }, n.getLabel(0))); assertTrue(Arrays.equals(new byte[] { 1, 'b' }, n.getLabel(1))); assertEquals("b", n.getLabelString(1)); assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(2))); assertEquals("", n.getLabelString(2)); } public void test_ctor_max_labels() throws TextParseException { StringBuffer sb = new StringBuffer(); for(int i=0; i<127; ++i){ sb.append("a."); } Name n = new Name(sb.toString()); assertTrue(n.isAbsolute()); assertFalse(n.isWild()); assertEquals(128, n.labels()); assertEquals(255, n.length()); for(int i=0; i<127; ++i){ assertTrue(Arrays.equals(new byte[] { 1, 'a' }, n.getLabel(i))); assertEquals("a", n.getLabelString(i)); } assertTrue(Arrays.equals(new byte[] { 0 }, n.getLabel(127))); assertEquals("", n.getLabelString(127)); } public void test_ctor_toobig_label_escaped_end() throws TextParseException { try { // name with a 64 char label containing an escape at the end new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\090.b."); fail("TextParseException not thrown"); } catch(TextParseException e){} } public void test_ctor_toobig_label_escaped() throws TextParseException { try { // name with a 64 char label containing an escape at the end new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\\001aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b."); fail("TextParseException not thrown"); } catch(TextParseException e){} } public void test_fromString() throws TextParseException { Name n = new Name(m_rel, m_abs_origin); Name n2 = Name.fromString(m_rel, m_abs_origin); assertEquals(n, n2); } public void test_fromString_at() throws TextParseException { Name n = Name.fromString("@", m_rel_origin); assertSame(m_rel_origin, n); } public void test_fromString_dot() throws TextParseException { Name n = Name.fromString("."); assertSame(Name.root, n); } public void test_fromConstantString() throws TextParseException { Name n = new Name(m_abs); Name n2 = Name.fromConstantString(m_abs); assertEquals(n, n2); } public void test_fromConstantString_invalid() { try { Name.fromConstantString("junk..junk"); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } } public static class Test_DNSInput_init extends TestCase { public void test_basic() throws IOException, TextParseException, WireParseException { final byte[] raw = new byte[] { 3, 'W', 'w', 'w', 7, 'D', 'n', 's', 'J', 'a', 'v', 'a', 3, 'o', 'r', 'g', 0 }; Name e = Name.fromString("Www.DnsJava.org."); Name n = new Name(raw); assertEquals(e, n); } public void test_incomplete() throws IOException { try { new Name(new byte[] { 3, 'W', 'w', 'w' }); fail("WireParseException not thrown"); } catch(WireParseException e ){} } public void test_root() throws WireParseException { final byte[] raw = new byte[] { 0 }; Name n = new Name(new DNSInput(raw)); assertEquals(Name.root, n); } public void test_invalid_length() throws IOException { try { new Name(new byte[] { 4, 'W', 'w', 'w' }); fail("WireParseException not thrown"); } catch(WireParseException e ){} } public void test_max_label_length() throws TextParseException, WireParseException { byte[] raw = new byte[] { 63, 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 0 }; Name e = Name.fromString("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."); Name n = new Name(new DNSInput(raw)); assertEquals(e, n); } public void test_max_name() throws TextParseException, WireParseException { // absolute name with three 63-char labels and a 61-char label Name e = new Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd."); byte[] raw = new byte[] { 63, 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 63, 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 63, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 61, 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 0 }; Name n = new Name(new DNSInput(raw)); assertEquals(e, n); } public void test_toolong_name() throws TextParseException, WireParseException { // absolute name with three 63-char labels and a 62-char label byte[] raw = new byte[] { 63, 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 63, 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 63, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 62, 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 0 }; try { new Name(new DNSInput(raw)); fail("WireParseException not thrown"); } catch(WireParseException e ){} } public void test_max_labels() throws TextParseException, WireParseException { byte[] raw = new byte[] { 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 0 }; Name e = Name.fromString("a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a."); Name n = new Name(new DNSInput(raw)); assertEquals(128, n.labels()); assertEquals(e, n); } public void test_toomany_labels() throws TextParseException, WireParseException { byte[] raw = new byte[] { 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 0 }; try { new Name(new DNSInput(raw)); fail("WireParseException not thrown"); } catch(WireParseException e ){} } public void test_basic_compression() throws TextParseException, WireParseException { byte[] raw = new byte[] { 10, 3, 'a', 'b', 'c', 0, (byte)0xC0, 1 }; Name e = Name.fromString("abc."); DNSInput in = new DNSInput(raw); in.jump(6); Options.set("verbosecompression"); Name n = new Name(in); Options.unset("verbosecompression"); assertEquals(e, n); } public void test_two_pointer_compression() throws TextParseException, WireParseException { byte[] raw = new byte[] { 10, 3, 'a', 'b', 'c', 0, (byte)0xC0, 1, (byte)0xC0, 6 }; Name e = Name.fromString("abc."); DNSInput in = new DNSInput(raw); in.jump(8); Name n = new Name(in); assertEquals(e, n); } public void test_two_part_compression() throws TextParseException, WireParseException { byte[] raw = new byte[] { 10, 3, 'a', 'b', 'c', 0, 1, 'B', (byte)0xC0, 1 }; Name e = Name.fromString("B.abc."); DNSInput in = new DNSInput(raw); in.jump(6); Name n = new Name(in); assertEquals(e, n); } public void test_long_jump_compression() throws TextParseException, WireParseException { // pointer to name beginning at index 256 byte[] raw = new byte[] { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 3, 'a', 'b', 'c', 0, (byte)0xC1, 0 }; Name e = Name.fromString("abc."); DNSInput in = new DNSInput(raw); in.jump(261); Name n = new Name(in); assertEquals(e, n); } public void test_bad_compression() throws TextParseException, WireParseException { byte[] raw = new byte[] { (byte)0xC0, 2, 0 }; try { new Name(new DNSInput(raw)); fail("WireParseException not thrown"); } catch(WireParseException e ){} } public void test_basic_compression_state_restore() throws TextParseException, WireParseException { byte[] raw = new byte[] { 10, 3, 'a', 'b', 'c', 0, (byte)0xC0, 1, 3, 'd', 'e', 'f', 0 }; Name e = Name.fromString("abc."); Name e2 = Name.fromString("def."); DNSInput in = new DNSInput(raw); in.jump(6); Name n = new Name(in); assertEquals(e, n); n = new Name(in); assertEquals(e2, n); } public void test_two_part_compression_state_restore() throws TextParseException, WireParseException { byte[] raw = new byte[] { 10, 3, 'a', 'b', 'c', 0, 1, 'B', (byte)0xC0, 1, 3, 'd', 'e', 'f', 0 }; Name e = Name.fromString("B.abc."); Name e2 = Name.fromString("def."); DNSInput in = new DNSInput(raw); in.jump(6); Name n = new Name(in); assertEquals(e, n); n = new Name(in); assertEquals(e2, n); } } public void test_init_from_name() throws TextParseException { Name n = new Name("A.B.c.d."); Name e = new Name("B.c.d."); Name o = new Name(n, 1); assertEquals(e, o); } public void test_init_from_name_root() throws TextParseException { Name n = new Name("A.B.c.d."); Name o = new Name(n, 4); assertEquals(Name.root, o); } public void test_init_from_name_empty() throws TextParseException { Name n = new Name("A.B.c.d."); Name n2 = new Name(n, 5); assertFalse(n2.isAbsolute()); assertFalse(n2.isWild()); assertEquals(0, n2.labels()); assertEquals(0, n2.length()); } public void test_concatenate_basic() throws NameTooLongException, TextParseException { Name p = Name.fromString("A.B"); Name s = Name.fromString("c.d."); Name e = Name.fromString("A.B.c.d."); Name n = Name.concatenate(p, s); assertEquals(e, n); } public void test_concatenate_abs_prefix() throws NameTooLongException, TextParseException { Name p = Name.fromString("A.B."); Name s = Name.fromString("c.d."); Name e = Name.fromString("A.B."); Name n = Name.concatenate(p, s); assertEquals(e, n); } public void test_concatenate_too_long() throws TextParseException { Name p = Name.fromString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); Name s = Name.fromString("ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd."); try { Name.concatenate(p, s); fail("NameTooLongException not thrown"); } catch(NameTooLongException e ){} } public void test_relativize() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name dom = Name.fromString("c."); Name exp = Name.fromString("a.b"); Name n = sub.relativize(dom); assertEquals(exp, n); } public void test_relativize_null_origin() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name dom = null; Name n = sub.relativize(dom); assertEquals(sub, n); } public void test_relativize_disjoint() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name dom = Name.fromString("e.f."); Name n = sub.relativize(dom); assertEquals(sub, n); } public void test_relativize_root() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name dom = Name.fromString("."); Name exp = Name.fromString("a.b.c"); Name n = sub.relativize(dom); assertEquals(exp, n); } public void test_wild() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name exp = Name.fromString("*.b.c."); Name n = sub.wild(1); assertEquals(exp, n); } public void test_wild_abs() throws TextParseException { Name sub = Name.fromString("a.b.c."); Name exp = Name.fromString("*."); Name n = sub.wild(3); assertEquals(exp, n); } public void test_wild_toobig() throws TextParseException { Name sub = Name.fromString("a.b.c."); try { sub.wild(4); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_wild_toosmall() throws TextParseException { Name sub = Name.fromString("a.b.c."); try { sub.wild(0); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_fromDNAME() throws NameTooLongException, TextParseException { Name own = new Name("the.owner."); Name alias = new Name("the.alias."); DNAMERecord dnr = new DNAMERecord(own, DClass.IN, 0xABCD, alias); Name sub = new Name("sub.the.owner."); Name exp = new Name("sub.the.alias."); Name n = sub.fromDNAME(dnr); assertEquals(exp, n); } public void test_fromDNAME_toobig() throws NameTooLongException, TextParseException { Name own = new Name("the.owner."); Name alias = new Name("the.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."); DNAMERecord dnr = new DNAMERecord(own, DClass.IN, 0xABCD, alias); Name sub = new Name("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.the.owner."); try { sub.fromDNAME(dnr); fail("NameTooLongException not thrown"); } catch(NameTooLongException e){} } public void test_fromDNAME_disjoint() throws NameTooLongException, TextParseException { Name own = new Name("the.owner."); Name alias = new Name("the.alias."); DNAMERecord dnr = new DNAMERecord(own, DClass.IN, 0xABCD, alias); Name sub = new Name("sub.the.other"); assertNull(sub.fromDNAME(dnr)); } public void test_subdomain_abs() throws TextParseException { Name dom = new Name("the.domain."); Name sub = new Name("sub.of.the.domain."); assertTrue(sub.subdomain(dom)); assertFalse(dom.subdomain(sub)); } public void test_subdomain_rel() throws TextParseException { Name dom = new Name("the.domain"); Name sub = new Name("sub.of.the.domain"); assertTrue(sub.subdomain(dom)); assertFalse(dom.subdomain(sub)); } public void test_subdomain_equal() throws TextParseException { Name dom = new Name("the.domain"); Name sub = new Name("the.domain"); assertTrue(sub.subdomain(dom)); assertTrue(dom.subdomain(sub)); } public void test_toString_abs() throws TextParseException { String in = "This.Is.My.Absolute.Name."; Name n = new Name(in); assertEquals(in, n.toString()); } public void test_toString_rel() throws TextParseException { String in = "This.Is.My.Relative.Name"; Name n = new Name(in); assertEquals(in, n.toString()); } public void test_toString_at() throws TextParseException { Name n = new Name("@", null); assertEquals("@", n.toString()); } public void test_toString_root() throws TextParseException { assertEquals(".", Name.root.toString()); } public void test_toString_wild() throws TextParseException { String in = "*.A.b.c.e"; Name n = new Name(in); assertEquals(in, n.toString()); } public void test_toString_escaped() throws TextParseException { String in = "my.escaped.junk\\128.label."; Name n = new Name(in); assertEquals(in, n.toString()); } public void test_toString_special_char() throws TextParseException, WireParseException { byte[] raw = new byte[] { 1, '"', 1, '(', 1, ')', 1, '.', 1, ';', 1, '\\', 1, '@', 1, '$', 0 }; String exp = "\\\".\\(.\\).\\..\\;.\\\\.\\@.\\$."; Name n = new Name(new DNSInput(raw)); assertEquals(exp, n.toString()); } public static class Test_toWire extends TestCase { public void test_rel() throws TextParseException { Name n = new Name("A.Relative.Name"); try { n.toWire(new DNSOutput(), null); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_null_Compression() throws TextParseException { byte[] raw = new byte[] { 1, 'A', 5, 'B', 'a', 's', 'i', 'c', 4, 'N', 'a', 'm', 'e', 0 }; Name n = new Name("A.Basic.Name."); DNSOutput o = new DNSOutput(); n.toWire(o, null); assertTrue(Arrays.equals(raw, o.toByteArray())); } public void test_empty_Compression() throws TextParseException { byte[] raw = new byte[] { 1, 'A', 5, 'B', 'a', 's', 'i', 'c', 4, 'N', 'a', 'm', 'e', 0 }; Name n = new Name("A.Basic.Name."); Compression c = new Compression(); DNSOutput o = new DNSOutput(); n.toWire(o, c); assertTrue(Arrays.equals(raw, o.toByteArray())); assertEquals(0, c.get(n)); } public void test_with_exact_Compression() throws TextParseException { Name n = new Name("A.Basic.Name."); Compression c = new Compression(); c.add(256, n); byte[] exp = new byte[] { (byte)0xC1, 0x0 }; DNSOutput o = new DNSOutput(); n.toWire(o, c); assertTrue(Arrays.equals(exp, o.toByteArray())); assertEquals(256, c.get(n)); } public void test_with_partial_Compression() throws TextParseException { Name d = new Name("Basic.Name."); Name n = new Name("A.Basic.Name."); Compression c = new Compression(); c.add(257, d); byte[] exp = new byte[] { 1, 'A', (byte)0xC1, 0x1 }; DNSOutput o = new DNSOutput(); n.toWire(o, c); assertTrue(Arrays.equals(exp, o.toByteArray())); assertEquals(257, c.get(d)); assertEquals(0, c.get(n)); } public void test_0arg_rel() throws TextParseException { Name n = new Name("A.Relative.Name"); try { n.toWire(); fail("IllegalArgumentException not thrown"); } catch(IllegalArgumentException e){} } public void test_0arg() throws TextParseException { byte[] raw = new byte[] { 1, 'A', 5, 'B', 'a', 's', 'i', 'c', 4, 'N', 'a', 'm', 'e', 0 }; Name n = new Name("A.Basic.Name."); byte[] out = n.toWire(); assertTrue(Arrays.equals(raw, out)); } public void test_root() { byte[] out = Name.root.toWire(); assertTrue(Arrays.equals(new byte[] { 0 }, out)); } public void test_3arg() throws TextParseException { Name d = new Name("Basic.Name."); Name n = new Name("A.Basic.Name."); Compression c = new Compression(); c.add(257, d); byte[] exp = new byte[] { 1, 'A', (byte)0xC1, 0x1 }; DNSOutput o = new DNSOutput(); n.toWire(o, c, false); assertTrue(Arrays.equals(exp, o.toByteArray())); assertEquals(257, c.get(d)); assertEquals(0, c.get(n)); } } public static class Test_toWireCanonical extends TestCase { public void test_basic() throws TextParseException { byte[] raw = new byte[] { 1, 'a', 5, 'b', 'a', 's', 'i', 'c', 4, 'n', 'a', 'm', 'e', 0 }; Name n = new Name("A.Basic.Name."); DNSOutput o = new DNSOutput(); n.toWireCanonical(o); assertTrue(Arrays.equals(raw, o.toByteArray())); } public void test_0arg() throws TextParseException { byte[] raw = new byte[] { 1, 'a', 5, 'b', 'a', 's', 'i', 'c', 4, 'n', 'a', 'm', 'e', 0 }; Name n = new Name("A.Basic.Name."); byte[] out = n.toWireCanonical(); assertTrue(Arrays.equals(raw, out)); } public void test_root() { byte[] out = Name.root.toWireCanonical(); assertTrue(Arrays.equals(new byte[] { 0 }, out)); } public void test_empty() throws TextParseException { Name n = new Name("@", null); byte[] out = n.toWireCanonical(); assertTrue(Arrays.equals(new byte[0], out)); } public void test_3arg() throws TextParseException { Name d = new Name("Basic.Name."); Name n = new Name("A.Basic.Name."); Compression c = new Compression(); c.add(257, d); byte[] exp = new byte[] { 1, 'a', 5, 'b', 'a', 's', 'i', 'c', 4, 'n', 'a', 'm', 'e', 0 }; DNSOutput o = new DNSOutput(); n.toWire(o, c, true); assertTrue(Arrays.equals(exp, o.toByteArray())); assertEquals(257, c.get(d)); assertEquals(-1, c.get(n)); } } public static class Test_equals extends TestCase { public void test_same() throws TextParseException { Name n = new Name("A.Name."); assertTrue(n.equals(n)); } public void test_null() throws TextParseException { Name n = new Name("A.Name."); assertFalse(n.equals(null)); } public void test_notName() throws TextParseException { Name n = new Name("A.Name."); assertFalse(n.equals(new Object())); } public void test_abs() throws TextParseException { Name n = new Name("A.Name."); Name n2 = new Name("a.name."); assertTrue(n.equals(n2)); assertTrue(n2.equals(n)); } public void test_rel() throws TextParseException { Name n1 = new Name("A.Relative.Name"); Name n2 = new Name("a.relative.name"); assertTrue(n1.equals(n2)); assertTrue(n2.equals(n1)); } public void test_mixed() throws TextParseException { Name n1 = new Name("A.Name"); Name n2 = new Name("a.name."); assertFalse(n1.equals(n2)); assertFalse(n2.equals(n1)); } public void test_weird() throws TextParseException { Name n1 = new Name("ab.c"); Name n2 = new Name("abc."); assertFalse(n1.equals(n2)); assertFalse(n2.equals(n1)); } } public static class Test_compareTo extends TestCase { public void test_notName() throws TextParseException { Name n = new Name("A.Name"); try { n.compareTo(new Object()); fail("ClassCastException not thrown"); } catch(ClassCastException e ){} } public void test_same() throws TextParseException { Name n = new Name("A.Name"); assertEquals(0, n.compareTo(n)); } public void test_equal() throws TextParseException { Name n1 = new Name("A.Name."); Name n2 = new Name("a.name."); assertEquals(0, n1.compareTo(n2)); assertEquals(0, n2.compareTo(n1)); } public void test_close() throws TextParseException { Name n1 = new Name("a.name"); Name n2 = new Name("a.name."); assertTrue(n1.compareTo(n2) > 0); assertTrue(n2.compareTo(n1) < 0); } public void test_disjoint() throws TextParseException { Name n1 = new Name("b"); Name n2 = new Name("c"); assertTrue(n1.compareTo(n2) < 0); assertTrue(n2.compareTo(n1) > 0); } public void test_label_prefix() throws TextParseException { Name n1 = new Name("thisIs.a."); Name n2 = new Name("thisIsGreater.a."); assertTrue(n1.compareTo(n2) < 0); assertTrue(n2.compareTo(n1) > 0); } public void test_more_labels() throws TextParseException { Name n1 = new Name("c.b.a."); Name n2 = new Name("d.c.b.a."); assertTrue(n1.compareTo(n2) < 0); assertTrue(n2.compareTo(n1) > 0); } } public void test_canonicalize() throws TextParseException { Name n1 = new Name("ABC.com"); Name n2 = new Name("abc.com"); Name n3 = new Name("\\193.com"); Name cn1 = n1.canonicalize(); Name cn2 = n2.canonicalize(); Name cn3 = n3.canonicalize(); assertNotSame(n1, cn1); assertEquals(n1, cn1); assertSame(n2, cn2); assertSame(n3, cn3); assertEquals(cn1.toString(), cn2.toString()); assertFalse(n1.toString().equals(n2.toString())); assertEquals(cn1.toString(), cn2.toString()); } public void test_to_string() throws TextParseException { Name n1 = new Name("abc.com"); Name n2 = new Name("abc.com."); assertEquals(n1.toString(true), n1.toString(true)); assertFalse(n2.toString(true).equals(n2.toString(false))); assertEquals(n2.toString(true) + ".", n2.toString(false)); assertEquals(Name.root.toString(true), Name.root.toString(false)); assertEquals(Name.empty.toString(true), Name.empty.toString(false)); } public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(Test_String_init.class); s.addTestSuite(Test_DNSInput_init.class); s.addTestSuite(NameTest.class); s.addTestSuite(Test_toWire.class); s.addTestSuite(Test_toWireCanonical.class); s.addTestSuite(Test_equals.class); s.addTestSuite(Test_compareTo.class); return s; } } dnsjava-2.1.5/tests/org/xbill/DNS/OpcodeTest.java100644 0 0 5245 10242022601 16672 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class OpcodeTest extends TestCase { public void test_string() { // a regular one assertEquals("IQUERY", Opcode.string(Opcode.IQUERY)); // one that doesn't exist assertTrue(Opcode.string(6).startsWith("RESERVED")); try { Opcode.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xF) try { Opcode.string(0x10); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(Opcode.STATUS, Opcode.value("STATUS")); // one thats undefined but within range assertEquals(6, Opcode.value("RESERVED6")); // one thats undefined but out of range assertEquals(-1, Opcode.value("RESERVED" + 0x10)); // something that unknown assertEquals(-1, Opcode.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, Opcode.value("")); } } dnsjava-2.1.5/tests/org/xbill/DNS/OptionsTest.java100644 0 0 11474 10242022601 17135 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class OptionsTest extends TestCase { public void setUp() { // reset the options table before each test Options.clear(); } public void test_set_1arg() { Options.set("Option1"); assertEquals("true", Options.value("option1")); Options.set("OPTION2"); assertEquals("true", Options.value("option1")); assertEquals("true", Options.value("OpTIOn2")); Options.set("option2"); assertEquals("true", Options.value("option2")); } public void test_set_2arg() { Options.set("OPTION1", "Value1"); assertEquals("value1", Options.value("Option1")); Options.set("option2", "value2"); assertEquals("value1", Options.value("Option1")); assertEquals("value2", Options.value("OPTION2")); Options.set("OPTION2", "value2b"); assertEquals("value1", Options.value("Option1")); assertEquals("value2b", Options.value("option2")); } public void test_check() { assertFalse(Options.check("No Options yet")); Options.set("First Option"); assertFalse(Options.check("Not a valid option name")); assertTrue(Options.check("First Option")); assertTrue(Options.check("FIRST option")); } public void test_unset() { // unset something non-existant Options.unset("Not an option Name"); Options.set("Temporary Option"); assertTrue(Options.check("Temporary Option")); Options.unset("Temporary Option"); assertFalse(Options.check("Temporary Option")); Options.set("Temporary Option"); assertTrue(Options.check("Temporary Option")); Options.unset("temporary option"); assertFalse(Options.check("Temporary Option")); // unset something now that the table is non-null Options.unset("Still Not an Option Name"); } public void test_value() { assertNull(Options.value("Table is Null")); Options.set("Testing Option"); assertNull(Options.value("Not an Option Name")); assertEquals("true", Options.value("Testing OPTION")); } public void test_intValue() { assertEquals(-1, Options.intValue("Table is Null")); Options.set("A Boolean Option"); Options.set("An Int Option", "13"); Options.set("Not An Int Option", "NotAnInt"); Options.set("A Negative Int Value", "-1000"); assertEquals(-1, Options.intValue("A Boolean Option")); assertEquals(-1, Options.intValue("Not an Option NAME")); assertEquals(13, Options.intValue("an int option")); assertEquals(-1, Options.intValue("NOT an INT option")); assertEquals(-1, Options.intValue("A negative int Value")); } public void test_systemProperty() { System.setProperty("dnsjava.options", "booleanOption,valuedOption1=10,valuedOption2=NotAnInteger"); Options.refresh(); assertTrue(Options.check("booleanOPTION")); assertTrue(Options.check("booleanOption")); assertTrue(Options.check("valuedOption1")); assertTrue(Options.check("ValuedOption2")); assertEquals("true", Options.value("booleanOption")); assertEquals(-1, Options.intValue("BOOLEANOPTION")); assertEquals("10", Options.value("valuedOption1")); assertEquals(10, Options.intValue("valuedOption1")); assertEquals("notaninteger", Options.value("VALUEDOPTION2")); assertEquals(-1, Options.intValue("valuedOption2")); } } dnsjava-2.1.5/tests/org/xbill/DNS/RRsetTest.java100644 0 0 21353 10446621165 16556 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Date; import java.util.Iterator; import junit.framework.TestCase; import org.xbill.DNS.ARecord; import org.xbill.DNS.CNAMERecord; import org.xbill.DNS.DClass; import org.xbill.DNS.Name; import org.xbill.DNS.RRset; import org.xbill.DNS.Record; import org.xbill.DNS.RRSIGRecord; import org.xbill.DNS.TextParseException; import org.xbill.DNS.Type; public class RRsetTest extends TestCase { private RRset m_rs; Name m_name, m_name2; long m_ttl; ARecord m_a1, m_a2; RRSIGRecord m_s1, m_s2; public void setUp() throws TextParseException, UnknownHostException { m_rs = new RRset(); m_name = Name.fromString("this.is.a.test."); m_name2 = Name.fromString("this.is.another.test."); m_ttl = 0xABCDL; m_a1 = new ARecord(m_name, DClass.IN, m_ttl, InetAddress.getByName("192.169.232.11")); m_a2 = new ARecord(m_name, DClass.IN, m_ttl+1, InetAddress.getByName("192.169.232.12")); m_s1 = new RRSIGRecord(m_name, DClass.IN, m_ttl, Type.A, 0xF, 0xABCDEL, new Date(), new Date(), 0xA, m_name, new byte[ 0 ]); m_s2 = new RRSIGRecord(m_name, DClass.IN, m_ttl, Type.A, 0xF, 0xABCDEL, new Date(), new Date(), 0xA, m_name2, new byte[ 0 ]); } public void test_ctor_0arg() { assertEquals(0, m_rs.size()); try {m_rs.getDClass(); fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} try {m_rs.getType();fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} try {m_rs.getTTL();fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} try {m_rs.getName();fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} try {m_rs.first();fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} try {m_rs.toString();fail("IllegalStateException not thrown");} catch( IllegalStateException e ){} Iterator itr = m_rs.rrs(); assertNotNull(itr); assertFalse(itr.hasNext()); itr = m_rs.sigs(); assertNotNull(itr); assertFalse(itr.hasNext()); } public void test_basics() throws TextParseException, UnknownHostException { m_rs.addRR(m_a1); assertEquals(1, m_rs.size()); assertEquals(DClass.IN, m_rs.getDClass()); assertEquals(m_a1, m_rs.first()); assertEquals(m_name, m_rs.getName()); assertEquals(m_ttl, m_rs.getTTL()); assertEquals(Type.A, m_rs.getType()); // add it again, and make sure nothing changed m_rs.addRR(m_a1); assertEquals(1, m_rs.size()); assertEquals(DClass.IN, m_rs.getDClass()); assertEquals(m_a1, m_rs.first()); assertEquals(m_name, m_rs.getName()); assertEquals(m_ttl, m_rs.getTTL()); assertEquals(Type.A, m_rs.getType()); m_rs.addRR(m_a2); assertEquals(2, m_rs.size()); assertEquals(DClass.IN, m_rs.getDClass()); Record r = m_rs.first(); assertEquals(m_a1, r); assertEquals(m_name, m_rs.getName()); assertEquals(m_ttl, m_rs.getTTL()); assertEquals(Type.A, m_rs.getType()); Iterator itr = m_rs.rrs(); assertEquals(m_a1, itr.next()); assertEquals(m_a2, itr.next()); // make sure that it rotates itr = m_rs.rrs(); assertEquals(m_a2, itr.next()); assertEquals(m_a1, itr.next()); itr = m_rs.rrs(); assertEquals(m_a1, itr.next()); assertEquals(m_a2, itr.next()); m_rs.deleteRR(m_a1); assertEquals(1, m_rs.size()); assertEquals(DClass.IN, m_rs.getDClass()); assertEquals(m_a2, m_rs.first()); assertEquals(m_name, m_rs.getName()); assertEquals(m_ttl, m_rs.getTTL()); assertEquals(Type.A, m_rs.getType()); // the signature records m_rs.addRR(m_s1); assertEquals(1, m_rs.size()); itr = m_rs.sigs(); assertEquals(m_s1, itr.next()); assertFalse(itr.hasNext()); m_rs.addRR(m_s1); itr = m_rs.sigs(); assertEquals(m_s1, itr.next()); assertFalse(itr.hasNext()); m_rs.addRR(m_s2); itr = m_rs.sigs(); assertEquals(m_s1, itr.next()); assertEquals(m_s2, itr.next()); assertFalse(itr.hasNext()); m_rs.deleteRR(m_s1); itr = m_rs.sigs(); assertEquals(m_s2, itr.next()); assertFalse(itr.hasNext()); // clear it all m_rs.clear(); assertEquals(0, m_rs.size()); assertFalse(m_rs.rrs().hasNext()); assertFalse(m_rs.sigs().hasNext()); } public void test_ctor_1arg() { m_rs.addRR(m_a1); m_rs.addRR(m_a2); m_rs.addRR(m_s1); m_rs.addRR(m_s2); RRset rs2 = new RRset( m_rs ); assertEquals(2, rs2.size()); assertEquals(m_a1, rs2.first()); Iterator itr = rs2.rrs(); assertEquals(m_a1, itr.next()); assertEquals(m_a2, itr.next()); assertFalse(itr.hasNext()); itr = rs2.sigs(); assertTrue(itr.hasNext()); assertEquals(m_s1, itr.next()); assertTrue(itr.hasNext()); assertEquals(m_s2, itr.next()); assertFalse(itr.hasNext()); } public void test_toString() { m_rs.addRR(m_a1); m_rs.addRR(m_a2); m_rs.addRR(m_s1); m_rs.addRR(m_s2); String out = m_rs.toString(); assertTrue(out.indexOf(m_name.toString()) != -1); assertTrue(out.indexOf(" IN A ") != -1); assertTrue(out.indexOf("[192.169.232.11]") != -1); assertTrue(out.indexOf("[192.169.232.12]") != -1); } public void test_addRR_invalidType() throws TextParseException { m_rs.addRR(m_a1); CNAMERecord c = new CNAMERecord(m_name, DClass.IN, m_ttl, Name.fromString("an.alias.")); try { m_rs.addRR(c); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_addRR_invalidName() throws TextParseException, UnknownHostException { m_rs.addRR(m_a1); m_a2 = new ARecord(m_name2, DClass.IN, m_ttl, InetAddress.getByName("192.169.232.11")); try { m_rs.addRR(m_a2); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_addRR_invalidDClass() throws TextParseException, UnknownHostException { m_rs.addRR(m_a1); m_a2 = new ARecord(m_name, DClass.CHAOS, m_ttl, InetAddress.getByName("192.169.232.11")); try { m_rs.addRR(m_a2); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_TTLcalculation() { m_rs.addRR(m_a2); assertEquals(m_a2.getTTL(), m_rs.getTTL()); m_rs.addRR(m_a1); assertEquals(m_a1.getTTL(), m_rs.getTTL()); Iterator itr = m_rs.rrs(); while( itr.hasNext() ){ Record r = (Record)itr.next(); assertEquals( m_a1.getTTL(), r.getTTL()); } } public void test_Record_placement() { m_rs.addRR(m_a1); m_rs.addRR(m_s1); m_rs.addRR(m_a2); Iterator itr = m_rs.rrs(); assertTrue(itr.hasNext()); assertEquals(m_a1, itr.next()); assertTrue(itr.hasNext()); assertEquals(m_a2, itr.next()); assertFalse(itr.hasNext()); itr = m_rs.sigs(); assertTrue(itr.hasNext()); assertEquals(m_s1, itr.next()); assertFalse(itr.hasNext()); } public void test_noncycling_iterator() { m_rs.addRR(m_a1); m_rs.addRR(m_a2); Iterator itr = m_rs.rrs(false); assertTrue(itr.hasNext()); assertEquals(m_a1, itr.next()); assertTrue(itr.hasNext()); assertEquals(m_a2, itr.next()); itr = m_rs.rrs(false); assertTrue(itr.hasNext()); assertEquals(m_a1, itr.next()); assertTrue(itr.hasNext()); assertEquals(m_a2, itr.next()); } } dnsjava-2.1.5/tests/org/xbill/DNS/RTRecordTest.java100644 0 0 4573 10242022601 17150 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.util.Arrays; import junit.framework.TestCase; public class RTRecordTest extends TestCase { public void test_getObject() { RTRecord d = new RTRecord(); Record r = d.getObject(); assertTrue(r instanceof RTRecord); } public void test_ctor_5arg() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.OtherName."); RTRecord d = new RTRecord(n, DClass.IN, 0xABCDEL, 0xF1, m); assertEquals(n, d.getName()); assertEquals(Type.RT, d.getType()); assertEquals(DClass.IN, d.getDClass()); assertEquals(0xABCDEL, d.getTTL()); assertEquals(0xF1, d.getPreference()); assertEquals(m, d.getIntermediateHost()); } } dnsjava-2.1.5/tests/org/xbill/DNS/RcodeTest.java100644 0 0 6532 10242022601 16515 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class RcodeTest extends TestCase { public void test_string() { // a regular one assertEquals("NXDOMAIN", Rcode.string(Rcode.NXDOMAIN)); // one with an alias assertEquals("NOTIMP", Rcode.string(Rcode.NOTIMP)); // one that doesn't exist assertTrue(Rcode.string(20).startsWith("RESERVED")); try { Rcode.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xFFF) try { Rcode.string(0x1000); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_TSIGstring() { // a regular one assertEquals("BADSIG", Rcode.TSIGstring(Rcode.BADSIG)); // one that doesn't exist assertTrue(Rcode.TSIGstring(20).startsWith("RESERVED")); try { Rcode.TSIGstring(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 0xFFFF) try { Rcode.string(0x10000); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(Rcode.FORMERR, Rcode.value("FORMERR")); // one with alias assertEquals(Rcode.NOTIMP, Rcode.value("NOTIMP")); assertEquals(Rcode.NOTIMP, Rcode.value("NOTIMPL")); // one thats undefined but within range assertEquals(35, Rcode.value("RESERVED35")); // one thats undefined but out of range assertEquals(-1, Rcode.value("RESERVED" + 0x1000)); // something that unknown assertEquals(-1, Rcode.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, Rcode.value("")); } } dnsjava-2.1.5/tests/org/xbill/DNS/RecordTest.java100644 0 0 65612 11320507735 16741 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.Date; import junit.framework.TestCase; public class RecordTest extends TestCase { private static class SubRecord extends Record { public SubRecord(){} public SubRecord(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } public Record getObject() { return null; } public void rrFromWire(DNSInput in) throws IOException {} public String rrToString() { return "{SubRecord: rrToString}"; } public void rdataFromString(Tokenizer t, Name origin) throws IOException {} public void rrToWire(DNSOutput out, Compression c, boolean canonical) {} // makes it callable by test code public static byte[] byteArrayFromString(String in) throws TextParseException { return Record.byteArrayFromString(in); } // make it callable by test code public static String byteArrayToString(byte[] in, boolean quote) { return Record.byteArrayToString(in, quote); } // make it callable by test code public static String unknownToString(byte[] in) { return Record.unknownToString(in); } public Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); } } public void test_ctor_0arg() { SubRecord sr = new SubRecord(); assertNull(sr.getName()); assertEquals(0, sr.getType()); assertEquals(0, sr.getTTL()); assertEquals(0, sr.getDClass()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("my.name."); int t = Type.A; int d = DClass.IN; long ttl = 0xABCDEL; SubRecord r = new SubRecord(n, t, d, ttl); assertEquals(n, r.getName()); assertEquals(t, r.getType()); assertEquals(d, r.getDClass()); assertEquals(ttl, r.getTTL()); } public void test_ctor_4arg_invalid() throws TextParseException { Name n = Name.fromString("my.name."); Name r = Name.fromString("my.relative.name"); int t = Type.A; int d = DClass.IN; long ttl = 0xABCDEL; try { new SubRecord(r, t, d, ttl); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} try { new SubRecord(n, -1, d, ttl); fail("InvalidTypeException not thrown"); } catch( InvalidTypeException e ){} try { new SubRecord(n, t, -1, ttl); fail("InvalidDClassException not thrown"); } catch( InvalidDClassException e ){} try { new SubRecord(n, t, d, -1); fail("InvalidTTLException not thrown"); } catch( InvalidTTLException e ){} } public void test_newRecord_3arg() throws TextParseException { Name n = Name.fromString("my.name."); Name r = Name.fromString("my.relative.name"); int t = Type.A; int d = DClass.IN; Record rec = Record.newRecord(n, t, d); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(0, rec.getTTL()); try { Record.newRecord(r, t, d); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_newRecord_4arg() throws TextParseException { Name n = Name.fromString("my.name."); Name r = Name.fromString("my.relative.name"); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; Record rec = Record.newRecord(n, t, d, ttl); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); try { Record.newRecord(r, t, d, ttl); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_newRecord_5arg() throws TextParseException, UnknownHostException { Name n = Name.fromString("my.name."); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; InetAddress exp = InetAddress.getByName("123.232.0.255"); Record rec = Record.newRecord(n, t, d, ttl, data); assertTrue(rec instanceof ARecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertEquals(exp, ((ARecord)rec).getAddress()); } public void test_newRecord_6arg() throws TextParseException, UnknownHostException { Name n = Name.fromString("my.name."); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; InetAddress exp = InetAddress.getByName("123.232.0.255"); Record rec = Record.newRecord(n, t, d, ttl, 0, null); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); rec = Record.newRecord(n, t, d, ttl, data.length, data); assertTrue(rec instanceof ARecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertEquals(exp, ((ARecord)rec).getAddress()); rec = Record.newRecord(n, Type.NIMLOC, d, ttl, data.length, data); assertTrue(rec instanceof UNKRecord); assertEquals(n, rec.getName()); assertEquals(Type.NIMLOC, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertTrue(Arrays.equals(data, ((UNKRecord)rec).getData())); } public void test_newRecord_6arg_invalid() throws TextParseException { Name n = Name.fromString("my.name."); Name r = Name.fromString("my.relative.name"); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; assertNull(Record.newRecord(n, t, d, ttl, 0, new byte[ 0 ])); assertNull(Record.newRecord(n, t, d, ttl, 1, new byte[ 0 ])); assertNull(Record.newRecord(n, t, d, ttl, data.length+1, data)); assertNull(Record.newRecord(n, t, d, ttl, 5, new byte[] { data[0], data[1], data[2], data[3], 0 })); try { Record.newRecord(r, t, d, ttl, 0, null); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_fromWire() throws IOException, TextParseException, UnknownHostException { Name n = Name.fromString("my.name."); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; InetAddress exp = InetAddress.getByName("123.232.0.255"); DNSOutput out = new DNSOutput(); n.toWire(out, null); out.writeU16(t); out.writeU16(d); out.writeU32(ttl); out.writeU16(data.length); out.writeByteArray(data); DNSInput in = new DNSInput(out.toByteArray()); Record rec = Record.fromWire(in, Section.ANSWER, false); assertTrue(rec instanceof ARecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertEquals(exp, ((ARecord)rec).getAddress()); in = new DNSInput(out.toByteArray()); rec = Record.fromWire(in, Section.QUESTION, false); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(0, rec.getTTL()); in = new DNSInput(out.toByteArray()); rec = Record.fromWire(in, Section.QUESTION); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(0, rec.getTTL()); rec = Record.fromWire(out.toByteArray(), Section.QUESTION); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(0, rec.getTTL()); out = new DNSOutput(); n.toWire(out, null); out.writeU16(t); out.writeU16(d); out.writeU32(ttl); out.writeU16(0); in = new DNSInput(out.toByteArray()); rec = Record.fromWire(in, Section.ANSWER, true); assertTrue(rec instanceof EmptyRecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); } public void test_toWire() throws IOException, TextParseException, UnknownHostException { Name n = Name.fromString("my.name."); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; // a non-QUESTION DNSOutput out = new DNSOutput(); n.toWire(out, null); out.writeU16(t); out.writeU16(d); out.writeU32(ttl); out.writeU16(data.length); out.writeByteArray(data); byte[] exp = out.toByteArray(); Record rec = Record.newRecord(n, t, d, ttl, data.length, data); out = new DNSOutput(); rec.toWire(out, Section.ANSWER, null); byte[] after = out.toByteArray(); assertTrue(Arrays.equals(exp, after)); // an equivalent call after = rec.toWire(Section.ANSWER); assertTrue(Arrays.equals(exp, after)); // a QUESTION entry out = new DNSOutput(); n.toWire(out, null); out.writeU16(t); out.writeU16(d); exp = out.toByteArray(); out = new DNSOutput(); rec.toWire(out, Section.QUESTION, null); after = out.toByteArray(); assertTrue(Arrays.equals(exp, after)); } public void test_toWireCanonical() throws IOException, TextParseException, UnknownHostException { Name n = Name.fromString("My.Name."); int t = Type.A; int d = DClass.IN; int ttl = 0xDBE8; byte[] data = new byte[] { (byte)123, (byte)232, (byte)0, (byte)255 }; DNSOutput out = new DNSOutput(); n.toWireCanonical(out); out.writeU16(t); out.writeU16(d); out.writeU32(ttl); out.writeU16(data.length); out.writeByteArray(data); byte[] exp = out.toByteArray(); Record rec = Record.newRecord(n, t, d, ttl, data.length, data); byte[] after = rec.toWireCanonical(); assertTrue(Arrays.equals(exp, after)); } public void test_rdataToWireCanonical() throws IOException, TextParseException, UnknownHostException { Name n = Name.fromString("My.Name."); Name n2 = Name.fromString("My.Second.Name."); int t = Type.NS; int d = DClass.IN; int ttl = 0xABE99; DNSOutput out = new DNSOutput(); n2.toWire(out, null); byte[] data = out.toByteArray(); out = new DNSOutput(); n2.toWireCanonical(out); byte[] exp = out.toByteArray(); Record rec = Record.newRecord(n, t, d, ttl, data.length, data); assertTrue(rec instanceof NSRecord); byte[] after = rec.rdataToWireCanonical(); assertTrue(Arrays.equals(exp, after)); } public void test_rdataToString() throws IOException, TextParseException, UnknownHostException { Name n = Name.fromString("My.Name."); Name n2 = Name.fromString("My.Second.Name."); int t = Type.NS; int d = DClass.IN; int ttl = 0xABE99; DNSOutput out = new DNSOutput(); n2.toWire(out, null); byte[] data = out.toByteArray(); Record rec = Record.newRecord(n, t, d, ttl, data.length, data); assertTrue(rec instanceof NSRecord); assertEquals(rec.rrToString(), rec.rdataToString()); } public void test_toString() throws TextParseException { Name n = Name.fromString("My.N."); Name n2 = Name.fromString("My.Second.Name."); int t = Type.NS; int d = DClass.IN; int ttl = 0xABE99; DNSOutput o = new DNSOutput(); n2.toWire(o, null); byte[] data = o.toByteArray(); Record rec = Record.newRecord(n, t, d, ttl, data.length, data); String out = rec.toString(); assertFalse(out.indexOf(n.toString()) == -1); assertFalse(out.indexOf(n2.toString()) == -1); assertFalse(out.indexOf("NS") == -1); assertFalse(out.indexOf("IN") == -1); assertFalse(out.indexOf(ttl+"") == -1); Options.set("BINDTTL"); out = rec.toString(); assertFalse(out.indexOf(n.toString()) == -1); assertFalse(out.indexOf(n2.toString()) == -1); assertFalse(out.indexOf("NS") == -1); assertFalse(out.indexOf("IN") == -1); assertFalse(out.indexOf(TTL.format(ttl)) == -1); Options.set("noPrintIN"); out = rec.toString(); assertFalse(out.indexOf(n.toString()) == -1); assertFalse(out.indexOf(n2.toString()) == -1); assertFalse(out.indexOf("NS") == -1); assertTrue(out.indexOf("IN") == -1); assertFalse(out.indexOf(TTL.format(ttl)) == -1); } public void test_byteArrayFromString() throws TextParseException { String in = "the 98 \" \' quick 0xAB brown"; byte[] out = SubRecord.byteArrayFromString(in); assertTrue(Arrays.equals(in.getBytes(), out)); in = " \\031Aa\\;\\\"\\\\~\\127\\255"; byte[] exp = new byte[] { ' ', 0x1F, 'A', 'a', ';', '"', '\\', 0x7E, 0x7F, (byte)0xFF }; out = SubRecord.byteArrayFromString(in); assertTrue(Arrays.equals(exp, out)); } public void test_byteArrayFromString_invalid() { StringBuffer b = new StringBuffer(); for( int i=0; i<257; ++i){ b.append('A'); } try { SubRecord.byteArrayFromString(b.toString()); fail("TextParseException not thrown"); } catch( TextParseException e ){} try { SubRecord.byteArrayFromString("\\256"); fail("TextParseException not thrown"); } catch( TextParseException e ){} try { SubRecord.byteArrayFromString("\\25a"); fail("TextParseException not thrown"); } catch( TextParseException e ){} try { SubRecord.byteArrayFromString("\\25"); fail("TextParseException not thrown"); } catch( TextParseException e ){} b.append("\\233"); try { SubRecord.byteArrayFromString(b.toString()); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_byteArrayToString() { byte[] in = new byte[] { ' ', 0x1F, 'A', 'a', ';', '"', '\\', 0x7E, 0x7F, (byte)0xFF }; String exp = "\" \\031Aa;\\\"\\\\~\\127\\255\""; assertEquals(exp, SubRecord.byteArrayToString(in, true)); } public void test_unknownToString() { byte[] data = new byte[] { (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x9A, (byte)0xBC, (byte)0xDE, (byte)0xFF }; String out = SubRecord.unknownToString(data); assertFalse(out.indexOf("" + data.length) == -1); assertFalse(out.indexOf("123456789ABCDEFF") == -1); } public void test_fromString() throws IOException, TextParseException { Name n = Name.fromString("My.N."); Name n2 = Name.fromString("My.Second.Name."); int t = Type.A; int d = DClass.IN; int ttl = 0xABE99; String sa = "191.234.43.10"; InetAddress addr = InetAddress.getByName(sa); byte[] b = new byte[] { (byte)191, (byte)234, (byte)43, (byte)10 }; Tokenizer st = new Tokenizer(sa); Record rec = Record.fromString(n, t, d, ttl, st, n2); assertTrue(rec instanceof ARecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertEquals(addr, ((ARecord)rec).getAddress()); String unkData = SubRecord.unknownToString(b); st = new Tokenizer(unkData); rec = Record.fromString(n, t, d, ttl, st, n2); assertTrue(rec instanceof ARecord); assertEquals(n, rec.getName()); assertEquals(t, rec.getType()); assertEquals(d, rec.getDClass()); assertEquals(ttl, rec.getTTL()); assertEquals(addr, ((ARecord)rec).getAddress()); } public void test_fromString_invalid() throws IOException, TextParseException { Name n = Name.fromString("My.N."); Name rel = Name.fromString("My.R"); Name n2 = Name.fromString("My.Second.Name."); int t = Type.A; int d = DClass.IN; int ttl = 0xABE99; InetAddress addr = InetAddress.getByName("191.234.43.10"); Tokenizer st = new Tokenizer("191.234.43.10"); try { Record.fromString(rel, t, d, ttl, st, n2); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} st = new Tokenizer("191.234.43.10 another_token"); try { Record.fromString(n, t, d, ttl, st, n2); fail("TextParseException not thrown"); } catch( TextParseException e ){} st = new Tokenizer("\\# 100 ABCDE"); try { Record.fromString(n, t, d, ttl, st, n2); fail("TextParseException not thrown"); } catch( TextParseException e ){} try { Record.fromString(n, t, d, ttl, "\\# 100", n2); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getRRsetType() throws TextParseException { Name n = Name.fromString("My.N."); Record r = Record.newRecord(n, Type.A, DClass.IN, 0); assertEquals(Type.A, r.getRRsetType()); r = new RRSIGRecord(n, DClass.IN, 0, Type.A, 1, 0, new Date(), new Date(), 10, n, new byte[ 0 ]); assertEquals(Type.A, r.getRRsetType()); } public void test_sameRRset() throws TextParseException { Name n = Name.fromString("My.N."); Name m = Name.fromString("My.M."); Record r1 = Record.newRecord(n, Type.A, DClass.IN, 0); Record r2 = new RRSIGRecord(n, DClass.IN, 0, Type.A, 1, 0, new Date(), new Date(), 10, n, new byte[ 0 ]); assertTrue(r1.sameRRset(r2)); assertTrue(r2.sameRRset(r1)); r1 = Record.newRecord(n, Type.A, DClass.HS, 0); r2 = new RRSIGRecord(n, DClass.IN, 0, Type.A, 1, 0, new Date(), new Date(), 10, n, new byte[ 0 ]); assertFalse(r1.sameRRset(r2)); assertFalse(r2.sameRRset(r1)); r1 = Record.newRecord(n, Type.A, DClass.IN, 0); r2 = new RRSIGRecord(m, DClass.IN, 0, Type.A, 1, 0, new Date(), new Date(), 10, n, new byte[ 0 ]); assertFalse(r1.sameRRset(r2)); assertFalse(r2.sameRRset(r1)); } public void test_equals() throws TextParseException { Name n = Name.fromString("My.N."); Name n2 = Name.fromString("my.n."); Name m = Name.fromString("My.M."); Record r1 = Record.newRecord(n, Type.A, DClass.IN, 0); assertFalse(r1.equals(null)); assertFalse(r1.equals(new Object())); Record r2 = Record.newRecord(n, Type.A, DClass.IN, 0); assertEquals(r1, r2); assertEquals(r2, r1); r2 = Record.newRecord(n2, Type.A, DClass.IN, 0); assertEquals(r1, r2); assertEquals(r2, r1); r2 = Record.newRecord(n2, Type.A, DClass.IN, 0xABCDE); assertEquals(r1, r2); assertEquals(r2, r1); r2 = Record.newRecord(m, Type.A, DClass.IN, 0xABCDE); assertFalse(r1.equals(r2)); assertFalse(r2.equals(r1)); r2 = Record.newRecord(n2, Type.MX, DClass.IN, 0xABCDE); assertFalse(r1.equals(r2)); assertFalse(r2.equals(r1)); r2 = Record.newRecord(n2, Type.A, DClass.CHAOS, 0xABCDE); assertFalse(r1.equals(r2)); assertFalse(r2.equals(r1)); byte[] d1 = new byte[] { 23, 12, 9, (byte)129 }; byte[] d2 = new byte[] { (byte)220, 1, (byte)131, (byte)212 }; r1 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d1); r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d1); assertEquals(r1, r2); assertEquals(r2, r1); r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d2); assertFalse(r1.equals(r2)); assertFalse(r2.equals(r1)); } public void test_hashCode() throws TextParseException { Name n = Name.fromString("My.N."); Name n2 = Name.fromString("my.n."); Name m = Name.fromString("My.M."); byte[] d1 = new byte[] { 23, 12, 9, (byte)129 }; byte[] d2 = new byte[] { (byte)220, 1, (byte)131, (byte)212 }; Record r1 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d1); // same record has same hash code Record r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d1); assertEquals(r1.hashCode(), r2.hashCode()); // case of names should not matter r2 = Record.newRecord(n2, Type.A, DClass.IN, 0xABCDE9, d1); assertEquals(r1.hashCode(), r2.hashCode()); // different names r2 = Record.newRecord(m, Type.A, DClass.IN, 0xABCDE9, d1); assertFalse(r1.hashCode() == r2.hashCode()); // different class r2 = Record.newRecord(n, Type.A, DClass.CHAOS, 0xABCDE9, d1); assertFalse(r1.hashCode() == r2.hashCode()); // different TTL does not matter r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE, d1); assertEquals(r1.hashCode(), r2.hashCode()); // different data r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d2); assertFalse(r1.hashCode() == r2.hashCode()); } public void test_cloneRecord() throws TextParseException { Name n = Name.fromString("My.N."); byte[] d = new byte[] { 23, 12, 9, (byte)129 }; Record r = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); Record r2 = r.cloneRecord(); assertNotSame(r, r2); assertEquals(r, r2); r = new SubRecord(n, Type.A, DClass.IN, 0xABCDE9); try { r.cloneRecord(); fail("IllegalStateException not thrown"); } catch( IllegalStateException e ){} } public void test_withName() throws TextParseException { Name n = Name.fromString("My.N."); Name m = Name.fromString("My.M.Name."); Name rel = Name.fromString("My.Relative.Name"); byte[] d = new byte[] { 23, 12, 9, (byte)129 }; Record r = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); Record r1 = r.withName(m); assertEquals(m, r1.getName()); assertEquals(Type.A, r1.getType()); assertEquals(DClass.IN, r1.getDClass()); assertEquals(0xABCDE9, r1.getTTL()); assertEquals(((ARecord)r).getAddress(), ((ARecord)r1).getAddress()); try { r.withName(rel); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_withDClass() throws TextParseException { Name n = Name.fromString("My.N."); byte[] d = new byte[] { 23, 12, 9, (byte)129 }; Record r = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); Record r1 = r.withDClass(DClass.HESIOD, 0x9876); assertEquals(n, r1.getName()); assertEquals(Type.A, r1.getType()); assertEquals(DClass.HESIOD, r1.getDClass()); assertEquals(0x9876, r1.getTTL()); assertEquals(((ARecord)r).getAddress(), ((ARecord)r1).getAddress()); } public void test_setTTL() throws TextParseException, UnknownHostException { Name n = Name.fromString("My.N."); byte[] d = new byte[] { 23, 12, 9, (byte)129 }; InetAddress exp = InetAddress.getByName("23.12.9.129"); Record r = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); assertEquals(0xABCDE9, r.getTTL()); r.setTTL(0x9876); assertEquals(n, r.getName()); assertEquals(Type.A, r.getType()); assertEquals(DClass.IN, r.getDClass()); assertEquals(0x9876, r.getTTL()); assertEquals(exp, ((ARecord)r).getAddress()); } public void test_compareTo() throws TextParseException { Name n = Name.fromString("My.N."); Name n2 = Name.fromString("my.n."); Name m = Name.fromString("My.M."); byte[] d = new byte[] { 23, 12, 9, (byte)129 }; byte[] d2 = new byte[] { 23, 12, 9, (byte)128 }; Record r1 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); Record r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d); assertEquals(0, r1.compareTo(r1)); assertEquals(0, r1.compareTo(r2)); assertEquals(0, r2.compareTo(r1)); // name comparison should be canonical r2 = Record.newRecord(n2, Type.A, DClass.IN, 0xABCDE9, d); assertEquals(0, r1.compareTo(r2)); assertEquals(0, r2.compareTo(r1)); // different name r2 = Record.newRecord(m, Type.A, DClass.IN, 0xABCDE9, d); assertEquals(n.compareTo(m), r1.compareTo(r2)); assertEquals(m.compareTo(n), r2.compareTo(r1)); // different DClass r2 = Record.newRecord(n, Type.A, DClass.CHAOS, 0xABCDE9, d); assertEquals(DClass.IN-DClass.CHAOS, r1.compareTo(r2)); assertEquals(DClass.CHAOS-DClass.IN, r2.compareTo(r1)); // different Type r2 = Record.newRecord(n, Type.NS, DClass.IN, 0xABCDE9, m.toWire()); assertEquals(Type.A-Type.NS, r1.compareTo(r2)); assertEquals(Type.NS-Type.A, r2.compareTo(r1)); // different data (same length) r2 = Record.newRecord(n, Type.A, DClass.IN, 0xABCDE9, d2); assertEquals(1, r1.compareTo(r2)); assertEquals(-1, r2.compareTo(r1)); // different data (one a prefix of the other) m = Name.fromString("My.N.L."); r1 = Record.newRecord(n, Type.NS, DClass.IN, 0xABCDE9, n.toWire()); r2 = Record.newRecord(n, Type.NS, DClass.IN, 0xABCDE9, m.toWire()); assertEquals(-1, r1.compareTo(r2)); assertEquals(1, r2.compareTo(r1)); } public void test_getAdditionalName() throws TextParseException { Name n = Name.fromString("My.N."); Record r = new SubRecord(n, Type.A, DClass.IN, 0xABCDE9); assertNull(r.getAdditionalName()); } public void test_checkU8() { try {Record.checkU8("field", -1); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} assertEquals(0, Record.checkU8("field", 0)); assertEquals(0x9D, Record.checkU8("field", 0x9D)); assertEquals(0xFF, Record.checkU8("field", 0xFF)); try {Record.checkU8("field", 0x100); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} } public void test_checkU16() { try {Record.checkU16("field", -1); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} assertEquals(0, Record.checkU16("field", 0)); assertEquals(0x9DA1, Record.checkU16("field", 0x9DA1)); assertEquals(0xFFFF, Record.checkU16("field", 0xFFFF)); try {Record.checkU16("field", 0x10000); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} } public void test_checkU32() { try {Record.checkU32("field", -1); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} assertEquals(0, Record.checkU32("field", 0)); assertEquals(0x9DA1F02DL, Record.checkU32("field", 0x9DA1F02DL)); assertEquals(0xFFFFFFFFL, Record.checkU32("field", 0xFFFFFFFFL)); try {Record.checkU32("field", 0x100000000L); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} } public void test_checkName() throws TextParseException { Name n = Name.fromString("My.N."); Name m = Name.fromString("My.m"); assertEquals(n, Record.checkName("field", n)); try { Record.checkName("field", m); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/ReverseMapTest.java100644 0 0 10340 10242022601 17542 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.net.InetAddress; import java.net.UnknownHostException; import junit.framework.TestCase; public class ReverseMapTest extends TestCase { public void test_fromAddress_ipv4() throws UnknownHostException, TextParseException { Name exp = Name.fromString("1.0.168.192.in-addr.arpa."); String addr = "192.168.0.1"; assertEquals(exp, ReverseMap.fromAddress(addr)); assertEquals(exp, ReverseMap.fromAddress(addr, Address.IPv4)); assertEquals(exp, ReverseMap.fromAddress(InetAddress.getByName(addr))); assertEquals(exp, ReverseMap.fromAddress(new byte[] { (byte)192, (byte)168, (byte)0, (byte)1 })); assertEquals(exp, ReverseMap.fromAddress(new int[] { 192, 168, 0, 1 })); } public void test_fromAddress_ipv6() throws UnknownHostException, TextParseException { Name exp = Name.fromString("4.3.3.7.0.7.3.0.E.2.A.8.9.1.3.1.3.D.8.0.3.A.5.8.8.B.D.0.1.0.0.2.ip6.arpa."); String addr = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334"; byte[] dat = new byte[] { (byte)32, (byte)1, (byte)13, (byte)184, (byte)133, (byte)163, (byte)8, (byte)211, (byte)19, (byte)25, (byte)138, (byte)46, (byte)3, (byte)112, (byte)115, (byte)52 }; int[] idat = new int[] { 32, 1, 13, 184, 133, 163, 8, 211, 19, 25, 138, 46, 3, 112, 115, 52 }; assertEquals(exp, ReverseMap.fromAddress(addr, Address.IPv6)); assertEquals(exp, ReverseMap.fromAddress(InetAddress.getByName(addr))); assertEquals(exp, ReverseMap.fromAddress(dat)); assertEquals(exp, ReverseMap.fromAddress(idat)); } public void test_fromAddress_invalid() { try { ReverseMap.fromAddress("A.B.C.D", Address.IPv4); fail("UnknownHostException not thrown"); } catch( UnknownHostException e ){ } try {ReverseMap.fromAddress(new byte [ 0 ] ); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {ReverseMap.fromAddress(new byte [ 3 ] ); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {ReverseMap.fromAddress(new byte [ 5 ] ); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {ReverseMap.fromAddress(new byte [ 15 ] ); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try {ReverseMap.fromAddress(new byte [ 17 ] ); fail("IllegalArgumentException not thrown");} catch( IllegalArgumentException e ){} try { int[] dat = new int[] { 0, 1, 2, 256 }; ReverseMap.fromAddress(dat); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } } dnsjava-2.1.5/tests/org/xbill/DNS/SOARecordTest.java100644 0 0 34311 10242022601 17256 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.Random; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class SOARecordTest { private final static Random m_random = new Random(); private static long randomU16() { return m_random.nextLong() >>> 48; } private static long randomU32() { return m_random.nextLong() >>> 32; } public static class Test_init extends TestCase { private Name m_an, m_rn, m_host, m_admin; private long m_ttl, m_serial, m_refresh, m_retry, m_expire, m_minimum; protected void setUp() throws TextParseException, UnknownHostException { m_an = Name.fromString("My.Absolute.Name."); m_rn = Name.fromString("My.Relative.Name"); m_host = Name.fromString("My.Host.Name."); m_admin = Name.fromString("My.Administrative.Name."); m_ttl = randomU16(); m_serial = randomU32(); m_refresh = randomU32(); m_retry = randomU32(); m_expire = randomU32(); m_minimum = randomU32(); } public void test_0arg() throws UnknownHostException { SOARecord ar = new SOARecord(); assertNull(ar.getName()); assertEquals(0, ar.getType()); assertEquals(0, ar.getDClass()); assertEquals(0, ar.getTTL()); assertNull(ar.getHost()); assertNull(ar.getAdmin()); assertEquals(0, ar.getSerial()); assertEquals(0, ar.getRefresh()); assertEquals(0, ar.getRetry()); assertEquals(0, ar.getExpire()); assertEquals(0, ar.getMinimum()); } public void test_getObject() { SOARecord ar = new SOARecord(); Record r = ar.getObject(); assertTrue(r instanceof SOARecord); } public void test_10arg() { SOARecord ar = new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); assertEquals(m_an, ar.getName()); assertEquals(Type.SOA, ar.getType()); assertEquals(DClass.IN, ar.getDClass()); assertEquals(m_ttl, ar.getTTL()); assertEquals(m_host, ar.getHost()); assertEquals(m_admin, ar.getAdmin()); assertEquals(m_serial, ar.getSerial()); assertEquals(m_refresh, ar.getRefresh()); assertEquals(m_retry, ar.getRetry()); assertEquals(m_expire, ar.getExpire()); assertEquals(m_minimum, ar.getMinimum()); } public void test_10arg_relative_name() { try { new SOARecord(m_rn, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_10arg_relative_host() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_rn, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_10arg_relative_admin() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_rn, m_serial, m_refresh, m_retry, m_expire, m_minimum); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_10arg_negative_serial() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, -1, m_refresh, m_retry, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_toobig_serial() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, 0x100000000L, m_refresh, m_retry, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_negative_refresh() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, -1, m_retry, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_toobig_refresh() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, 0x100000000L, m_retry, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_negative_retry() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, -1, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_toobig_retry() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, 0x100000000L, m_expire, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_negative_expire() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, -1, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_toobig_expire() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, 0x100000000L, m_minimum); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_negative_minimun() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, -1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } public void test_10arg_toobig_minimum() { try { new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, 0x100000000L); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} } } public static class Test_rrFromWire extends TestCase { private Name m_host, m_admin; private long m_serial, m_refresh, m_retry, m_expire, m_minimum; protected void setUp() throws TextParseException, UnknownHostException { m_host = Name.fromString("M.h.N."); m_admin = Name.fromString("M.a.n."); m_serial = 0xABCDEF12L; m_refresh = 0xCDEF1234L; m_retry = 0xEF123456L; m_expire = 0x12345678L; m_minimum = 0x3456789AL; } public void test() throws IOException { byte[] raw = new byte[] { 1, 'm', 1, 'h', 1, 'n', 0, // host 1, 'm', 1, 'a', 1, 'n', 0, // admin (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12, // serial (byte)0xCD, (byte)0xEF, (byte)0x12, (byte)0x34, // refresh (byte)0xEF, (byte)0x12, (byte)0x34, (byte)0x56, // retry (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, // expire (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x9A }; // minimum DNSInput di = new DNSInput(raw); SOARecord ar = new SOARecord(); ar.rrFromWire(di); assertEquals(m_host, ar.getHost()); assertEquals(m_admin, ar.getAdmin()); assertEquals(m_serial, ar.getSerial()); assertEquals(m_refresh, ar.getRefresh()); assertEquals(m_retry, ar.getRetry()); assertEquals(m_expire, ar.getExpire()); assertEquals(m_minimum, ar.getMinimum()); } } public static class Test_rdataFromString extends TestCase { private Name m_host, m_admin, m_origin; private long m_serial, m_refresh, m_retry, m_expire, m_minimum; protected void setUp() throws TextParseException, UnknownHostException { m_origin = Name.fromString("O."); m_host = Name.fromString("M.h", m_origin); m_admin = Name.fromString("M.a.n."); m_serial = 0xABCDEF12L; m_refresh = 0xCDEF1234L; m_retry = 0xEF123456L; m_expire = 0x12345678L; m_minimum = 0x3456789AL; } public void test_valid() throws IOException { Tokenizer t = new Tokenizer("M.h " + m_admin + " " + m_serial + " " + m_refresh + " " + m_retry + " " + m_expire + " " + m_minimum); SOARecord ar = new SOARecord(); ar.rdataFromString(t, m_origin); assertEquals(m_host, ar.getHost()); assertEquals(m_admin, ar.getAdmin()); assertEquals(m_serial, ar.getSerial()); assertEquals(m_refresh, ar.getRefresh()); assertEquals(m_retry, ar.getRetry()); assertEquals(m_expire, ar.getExpire()); assertEquals(m_minimum, ar.getMinimum()); } public void test_relative_name() throws IOException { Tokenizer t = new Tokenizer("M.h " + m_admin + " " + m_serial + " " + m_refresh + " " + m_retry + " " + m_expire + " " + m_minimum); SOARecord ar = new SOARecord(); try { ar.rdataFromString(t, null); fail("RelativeNameException not thrown"); } catch(RelativeNameException e){} } } public static class Test_rrToString extends TestCase { private Name m_an, m_host, m_admin; private long m_ttl, m_serial, m_refresh, m_retry, m_expire, m_minimum; protected void setUp() throws TextParseException { m_an = Name.fromString("My.absolute.name."); m_ttl = 0x13A8; m_host = Name.fromString("M.h.N."); m_admin = Name.fromString("M.a.n."); m_serial = 0xABCDEF12L; m_refresh = 0xCDEF1234L; m_retry = 0xEF123456L; m_expire = 0x12345678L; m_minimum = 0x3456789AL; } public void test_singleLine() { SOARecord ar = new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); String exp = m_host + " " + m_admin + " " + m_serial + " " + m_refresh + " " + m_retry + " " + m_expire + " " + m_minimum; String out = ar.rrToString(); assertEquals(exp, out); } public void test_multiLine() { SOARecord ar = new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); String re = "^.*\\(\\n" + "\\s*" + m_serial + "\\s*;\\s*serial\\n" + // serial "\\s*" + m_refresh + "\\s*;\\s*refresh\\n" + // refresh "\\s*" + m_retry + "\\s*;\\s*retry\\n" + // retry "\\s*" + m_expire + "\\s*;\\s*expire\\n" + // expire "\\s*" + m_minimum + "\\s*\\)\\s*;\\s*minimum$"; // minimum Options.set("multiline"); String out = ar.rrToString(); Options.unset("multiline"); assertTrue(out.matches(re)); } } public static class Test_rrToWire extends TestCase { private Name m_an, m_host, m_admin; private long m_ttl, m_serial, m_refresh, m_retry, m_expire, m_minimum; protected void setUp() throws TextParseException { m_an = Name.fromString("My.Abs.Name."); m_ttl = 0x13A8; m_host = Name.fromString("M.h.N."); m_admin = Name.fromString("M.a.n."); m_serial = 0xABCDEF12L; m_refresh = 0xCDEF1234L; m_retry = 0xEF123456L; m_expire = 0x12345678L; m_minimum = 0x3456789AL; } public void test_canonical() { byte[] exp = new byte[] { 1, 'm', 1, 'h', 1, 'n', 0, // host 1, 'm', 1, 'a', 1, 'n', 0, // admin (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12, // serial (byte)0xCD, (byte)0xEF, (byte)0x12, (byte)0x34, // refresh (byte)0xEF, (byte)0x12, (byte)0x34, (byte)0x56, // retry (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, // expire (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x9A }; // minimum SOARecord ar = new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); DNSOutput o = new DNSOutput(); ar.rrToWire(o, null, true); assertTrue(Arrays.equals(exp, o.toByteArray())); } public void test_case_sensitive() { byte[] exp = new byte[] { 1, 'M', 1, 'h', 1, 'N', 0, // host 1, 'M', 1, 'a', 1, 'n', 0, // admin (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12, // serial (byte)0xCD, (byte)0xEF, (byte)0x12, (byte)0x34, // refresh (byte)0xEF, (byte)0x12, (byte)0x34, (byte)0x56, // retry (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, // expire (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x9A }; // minimum SOARecord ar = new SOARecord(m_an, DClass.IN, m_ttl, m_host, m_admin, m_serial, m_refresh, m_retry, m_expire, m_minimum); DNSOutput o = new DNSOutput(); ar.rrToWire(o, null, false); assertTrue(Arrays.equals(exp, o.toByteArray())); } } public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(Test_init.class); s.addTestSuite(Test_rrFromWire.class); s.addTestSuite(Test_rdataFromString.class); s.addTestSuite(Test_rrToString.class); s.addTestSuite(Test_rrToWire.class); return s; } } dnsjava-2.1.5/tests/org/xbill/DNS/SectionTest.java100644 0 0 5631 10242022601 17064 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class SectionTest extends TestCase { public void test_string() { // a regular one assertEquals("au", Section.string(Section.AUTHORITY)); try { Section.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } // (max is 3) try { Section.string(4); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(Section.ADDITIONAL, Section.value("ad")); // something that unknown assertEquals(-1, Section.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, Section.value("")); } public void test_longString() { assertEquals("ADDITIONAL RECORDS", Section.longString(Section.ADDITIONAL)); try {Section.longString(-1);} catch( IllegalArgumentException e ){} try {Section.longString(4);} catch( IllegalArgumentException e ){} } public void test_updString() { assertEquals("ZONE", Section.updString(Section.ZONE)); try {Section.longString(-1);} catch( IllegalArgumentException e ){} try {Section.longString(4);} catch( IllegalArgumentException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/SerialTest.java100644 0 0 10200 10242022601 16703 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class SerialTest extends TestCase { public void test_compare_NegativeArg1() { long arg1 = -1; long arg2 = 1; try { Serial.compare( arg1, arg2 ); fail( "compare accepted negative argument 1" ); } catch( IllegalArgumentException e ){ // pass } } public void test_compare_OOBArg1() { long arg1 = 0xFFFFFFFFL + 1; long arg2 = 1; try { Serial.compare( arg1, arg2 ); fail( "compare accepted out-of-bounds argument 1" ); } catch( IllegalArgumentException e ){ // pass } } public void test_compare_NegativeArg2() { long arg1 = 1; long arg2 = -1; try { Serial.compare( arg1, arg2 ); fail( "compare accepted negative argument 2" ); } catch( IllegalArgumentException e ){ // pass } } public void test_compare_OOBArg2() { long arg1 = 1; long arg2 = 0xFFFFFFFFL + 1; try { Serial.compare( arg1, arg2 ); fail( "compare accepted out-of-bounds argument 1" ); } catch( IllegalArgumentException e ){ // pass } } public void test_compare_Arg1Greater() { long arg1 = 10; long arg2 = 9; int ret = Serial.compare( arg1, arg2 ); assertTrue( ret > 0 ); } public void test_compare_Arg2Greater() { long arg1 = 9; long arg2 = 10; int ret = Serial.compare( arg1, arg2 ); assertTrue( ret < 0 ); } public void test_compare_ArgsEqual() { long arg1 = 10; long arg2 = 10; int ret = Serial.compare( arg1, arg2 ); assertEquals( ret, 0 ); } public void test_compare_boundary() { long arg1 = 0xFFFFFFFFL; long arg2 = 0; int ret = Serial.compare( arg1, arg2 ); assertEquals( -1, ret ); ret = Serial.compare( arg2, arg1 ); assertEquals( 1, ret ); } public void test_increment_NegativeArg() { long arg = -1; try { Serial.increment( arg ); fail( "increment accepted negative argument" ); } catch( IllegalArgumentException e ){ // pass } } public void test_increment_OOBArg() { long arg = 0xFFFFFFFFL + 1; try { Serial.increment( arg ); fail( "increment accepted out-of-bounds argument" ); } catch( IllegalArgumentException e ){ // pass } } public void test_increment_reset() { long arg = 0xFFFFFFFFL; long ret = Serial.increment( arg ); assertEquals( 0, ret ); } public void test_increment_normal() { long arg = 10; long ret = Serial.increment( arg ); assertEquals( arg+1, ret ); } } dnsjava-2.1.5/tests/org/xbill/DNS/SetResponseTest.java100644 0 0 22672 10242022601 17756 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import junit.framework.TestCase; public class SetResponseTest extends TestCase { public void test_ctor_1arg() { final int[] types = new int[] { SetResponse.UNKNOWN, SetResponse.NXDOMAIN, SetResponse.NXRRSET, SetResponse.DELEGATION, SetResponse.CNAME, SetResponse.DNAME, SetResponse.SUCCESSFUL }; for( int i=0; i // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import junit.framework.TestCase; public class SingleCompressedNameBaseTest extends TestCase { private void assertEquals( byte[] exp, byte[] act ) { assertTrue(java.util.Arrays.equals(exp, act)); } private static class TestClass extends SingleCompressedNameBase { public TestClass(){} public TestClass(Name name, int type, int dclass, long ttl, Name singleName, String desc ) { super(name, type, dclass, ttl, singleName, desc); } public Name getSingleName() { return super.getSingleName(); } public Record getObject() { return null; } } public void test_ctor() throws TextParseException { TestClass tc = new TestClass(); assertNull(tc.getSingleName()); Name n = Name.fromString("my.name."); Name sn = Name.fromString("my.single.name."); tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); assertSame(n, tc.getName()); assertEquals(Type.A, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(100L, tc.getTTL()); assertSame(sn, tc.getSingleName()); } public void test_rrToWire() throws IOException, TextParseException { Name n = Name.fromString("my.name."); Name sn = Name.fromString("My.Single.Name."); // non-canonical (case sensitive) TestClass tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); byte[] exp = new byte[] { 2, 'M', 'y', 6, 'S', 'i', 'n', 'g', 'l', 'e', 4, 'N', 'a', 'm', 'e', 0 }; DNSOutput dout = new DNSOutput(); tc.rrToWire(dout, null, false); byte[] out = dout.toByteArray(); assertEquals(exp, out); // canonical (lowercase) tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); exp = new byte[] { 2, 'm', 'y', 6, 's', 'i', 'n', 'g', 'l', 'e', 4, 'n', 'a', 'm', 'e', 0 }; dout = new DNSOutput(); tc.rrToWire(dout, null, true); out = dout.toByteArray(); assertEquals(exp, out); } } dnsjava-2.1.5/tests/org/xbill/DNS/SingleNameBaseTest.java100644 0 0 11754 10242022601 20320 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import junit.framework.TestCase; public class SingleNameBaseTest extends TestCase { private void assertEquals( byte[] exp, byte[] act ) { assertTrue(java.util.Arrays.equals(exp, act)); } private static class TestClass extends SingleNameBase { public TestClass(){} public TestClass(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } public TestClass(Name name, int type, int dclass, long ttl, Name singleName, String desc ) { super(name, type, dclass, ttl, singleName, desc); } public Name getSingleName() { return super.getSingleName(); } public Record getObject() { return null; } } public void test_ctor() throws TextParseException { TestClass tc = new TestClass(); assertNull(tc.getSingleName()); Name n = Name.fromString("my.name."); Name sn = Name.fromString("my.single.name."); tc = new TestClass(n, Type.A, DClass.IN, 100L); assertSame(n, tc.getName()); assertEquals(Type.A, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(100L, tc.getTTL()); tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); assertSame(n, tc.getName()); assertEquals(Type.A, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(100L, tc.getTTL()); assertSame(sn, tc.getSingleName()); } public void test_rrFromWire() throws IOException { byte[] raw = new byte[] { 2, 'm', 'y', 6, 's', 'i', 'n', 'g', 'l', 'e', 4, 'n', 'a', 'm', 'e', 0 }; DNSInput in = new DNSInput(raw); TestClass tc = new TestClass(); tc.rrFromWire(in); Name exp = Name.fromString("my.single.name."); assertEquals(exp, tc.getSingleName()); } public void test_rdataFromString() throws IOException { Name exp = Name.fromString("my.single.name."); Tokenizer t = new Tokenizer("my.single.name."); TestClass tc = new TestClass(); tc.rdataFromString(t, null); assertEquals(exp, tc.getSingleName()); t = new Tokenizer("my.relative.name"); tc = new TestClass(); try { tc.rdataFromString(t, null); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_rrToString() throws IOException, TextParseException { Name exp = Name.fromString("my.single.name."); Tokenizer t = new Tokenizer("my.single.name."); TestClass tc = new TestClass(); tc.rdataFromString(t, null); assertEquals(exp, tc.getSingleName()); String out = tc.rrToString(); assertEquals(out, exp.toString()); } public void test_rrToWire() throws IOException, TextParseException { Name n = Name.fromString("my.name."); Name sn = Name.fromString("My.Single.Name."); // non-canonical (case sensitive) TestClass tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); byte[] exp = new byte[] { 2, 'M', 'y', 6, 'S', 'i', 'n', 'g', 'l', 'e', 4, 'N', 'a', 'm', 'e', 0 }; DNSOutput dout = new DNSOutput(); tc.rrToWire(dout, null, false); byte[] out = dout.toByteArray(); assertEquals(exp, out); // canonical (lowercase) tc = new TestClass(n, Type.A, DClass.IN, 100L, sn, "The Description"); exp = new byte[] { 2, 'm', 'y', 6, 's', 'i', 'n', 'g', 'l', 'e', 4, 'n', 'a', 'm', 'e', 0 }; dout = new DNSOutput(); tc.rrToWire(dout, null, true); out = dout.toByteArray(); assertEquals(exp, out); } } dnsjava-2.1.5/tests/org/xbill/DNS/TTLTest.java100644 0 0 10566 10242022601 16146 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class TTLTest extends TestCase { private final long S = 1; private final long M = 60*S; private final long H = 60*M; private final long D = 24*H; private final long W = 7*D; public void test_parseTTL() { assertEquals(9876, TTL.parseTTL("9876")); assertEquals(0, TTL.parseTTL("0S")); assertEquals(0, TTL.parseTTL("0M")); assertEquals(0, TTL.parseTTL("0H")); assertEquals(0, TTL.parseTTL("0D")); assertEquals(0, TTL.parseTTL("0W")); assertEquals(S, TTL.parseTTL("1s")); assertEquals(M, TTL.parseTTL("1m")); assertEquals(H, TTL.parseTTL("1h")); assertEquals(D, TTL.parseTTL("1d")); assertEquals(W, TTL.parseTTL("1w")); assertEquals(98*S, TTL.parseTTL("98S")); assertEquals(76*M, TTL.parseTTL("76M")); assertEquals(54*H, TTL.parseTTL("54H")); assertEquals(32*D, TTL.parseTTL("32D")); assertEquals(10*W, TTL.parseTTL("10W")); assertEquals(98*S+11*M+1234*H+2*D+W, TTL.parseTTL("98S11M1234H2D01W")); } public void test_parseTTL_invalid() { try {TTL.parseTTL(null); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} try {TTL.parseTTL(""); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} try {TTL.parseTTL("S"); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} try {TTL.parseTTL("10S4B"); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} try {TTL.parseTTL("1S"+0xFFFFFFFFL+"S"); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} try {TTL.parseTTL(""+0x100000000L); fail("NumberFormatException not throw");} catch( NumberFormatException e ){} } public void test_format() { assertEquals("0S", TTL.format(0)); assertEquals("1S", TTL.format(1)); assertEquals("59S", TTL.format(59)); assertEquals("1M", TTL.format(60)); assertEquals("59M", TTL.format(59*M)); assertEquals("1M33S", TTL.format(M+33)); assertEquals("59M59S", TTL.format(59*M+59*S)); assertEquals("1H", TTL.format(H)); assertEquals("10H1M21S", TTL.format(10*H+M+21)); assertEquals("23H59M59S", TTL.format(23*H+59*M+59)); assertEquals("1D", TTL.format(D)); assertEquals("4D18H45M30S", TTL.format(4*D+18*H+45*M+30)); assertEquals("6D23H59M59S", TTL.format(6*D+23*H+59*M+59)); assertEquals("1W", TTL.format(W)); assertEquals("10W4D1H21M29S", TTL.format(10*W+4*D+H+21*M+29)); assertEquals("3550W5D3H14M7S", TTL.format(0x7FFFFFFFL)); } public void test_format_invalid() { try {TTL.format(-1); fail("InvalidTTLException not thrown"); } catch( InvalidTTLException e ){} try {TTL.format(0x100000000L); fail("InvalidTTLException not thrown"); } catch( InvalidTTLException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/TokenizerTest.java100644 0 0 35314 10242022601 17453 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import junit.framework.TestCase; public class TokenizerTest extends TestCase { private Tokenizer m_t; protected void setUp() { m_t = null; } private void assertEquals( byte[] exp, byte[] act ) { assertTrue(java.util.Arrays.equals(exp, act)); } public void test_get() throws IOException { m_t = new Tokenizer(new BufferedInputStream(new ByteArrayInputStream("AnIdentifier \"a quoted \\\" string\"\r\n; this is \"my\"\t(comment)\nanotherIdentifier (\ramultilineIdentifier\n)".getBytes()))); Tokenizer.Token tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertTrue(tt.isString()); assertFalse(tt.isEOL()); assertEquals("AnIdentifier", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.WHITESPACE, tt.type); assertFalse(tt.isString()); assertFalse(tt.isEOL()); assertNull(tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.QUOTED_STRING, tt.type); assertTrue(tt.isString()); assertFalse(tt.isEOL()); assertEquals("a quoted \\\" string", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.EOL, tt.type); assertFalse(tt.isString()); assertTrue(tt.isEOL()); assertNull(tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.COMMENT, tt.type); assertFalse(tt.isString()); assertFalse(tt.isEOL()); assertEquals(" this is \"my\"\t(comment)", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.EOL, tt.type); assertFalse(tt.isString()); assertTrue(tt.isEOL()); assertNull(tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertTrue(tt.isString()); assertFalse(tt.isEOL()); assertEquals("anotherIdentifier", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.WHITESPACE, tt.type); tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertTrue(tt.isString()); assertFalse(tt.isEOL()); assertEquals("amultilineIdentifier", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.WHITESPACE, tt.type); tt = m_t.get(true, true); assertEquals(Tokenizer.EOF, tt.type); assertFalse(tt.isString()); assertTrue(tt.isEOL()); assertNull(tt.value); // should be able to do this repeatedly tt = m_t.get(true, true); assertEquals(Tokenizer.EOF, tt.type); assertFalse(tt.isString()); assertTrue(tt.isEOL()); assertNull(tt.value); m_t = new Tokenizer("onlyOneIdentifier"); tt = m_t.get(); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("onlyOneIdentifier", tt.value); m_t = new Tokenizer("identifier ;"); tt = m_t.get(); assertEquals("identifier", tt.value); tt = m_t.get(); assertEquals(Tokenizer.EOF, tt.type); // some ungets m_t = new Tokenizer("identifier \nidentifier2; junk comment"); tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("identifier", tt.value); m_t.unget(); tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("identifier", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.WHITESPACE, tt.type); m_t.unget(); tt = m_t.get(true, true); assertEquals(Tokenizer.WHITESPACE, tt.type); tt = m_t.get(true, true); assertEquals(Tokenizer.EOL, tt.type); m_t.unget(); tt = m_t.get(true, true); assertEquals(Tokenizer.EOL, tt.type); tt = m_t.get(true, true); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("identifier2", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.COMMENT, tt.type); assertEquals(" junk comment", tt.value); m_t.unget(); tt = m_t.get(true, true); assertEquals(Tokenizer.COMMENT, tt.type); assertEquals(" junk comment", tt.value); tt = m_t.get(true, true); assertEquals(Tokenizer.EOF, tt.type); m_t = new Tokenizer("identifier ( junk ; comment\n )"); tt = m_t.get(); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals(Tokenizer.IDENTIFIER, m_t.get().type); assertEquals(Tokenizer.EOF, m_t.get().type); } public void test_get_invalid() throws IOException { m_t = new Tokenizer("(this ;"); m_t.get(); try {m_t.get(); fail("TextParseException not thrown");} catch( TextParseException e ){} m_t = new Tokenizer("\"bad"); try {m_t.get(); fail("TextParseException not thrown");} catch( TextParseException e ){} m_t = new Tokenizer(")"); try {m_t.get(); fail("TextParseException not thrown");} catch( TextParseException e ){} m_t = new Tokenizer("\\"); try {m_t.get(); fail("TextParseException not thrown");} catch( TextParseException e ){} m_t = new Tokenizer("\"\n"); try {m_t.get(); fail("TextParseException not thrown");} catch( TextParseException e ){} } public void test_File_input() throws IOException { File tmp = File.createTempFile("dnsjava", "tmp"); try { FileWriter fw = new FileWriter(tmp); fw.write("file\ninput; test"); fw.close(); m_t = new Tokenizer(tmp); Tokenizer.Token tt = m_t.get(); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("file", tt.value); tt = m_t.get(); assertEquals(Tokenizer.EOL, tt.type); tt = m_t.get(); assertEquals(Tokenizer.IDENTIFIER, tt.type); assertEquals("input", tt.value); tt = m_t.get(false, true); assertEquals(Tokenizer.COMMENT, tt.type); assertEquals(" test", tt.value); m_t.close(); } finally { tmp.delete(); } } public void test_unwanted_comment() throws IOException { m_t = new Tokenizer("; this whole thing is a comment\n"); Tokenizer.Token tt = m_t.get(); assertEquals(Tokenizer.EOL, tt.type); } public void test_unwanted_ungotten_whitespace() throws IOException { m_t = new Tokenizer(" "); Tokenizer.Token tt = m_t.get(true, true); m_t.unget(); tt = m_t.get(); assertEquals(Tokenizer.EOF, tt.type); } public void test_unwanted_ungotten_comment() throws IOException { m_t = new Tokenizer("; this whole thing is a comment"); Tokenizer.Token tt = m_t.get(true, true); m_t.unget(); tt = m_t.get(); assertEquals(Tokenizer.EOF, tt.type); } public void test_empty_string() throws IOException { m_t = new Tokenizer(""); Tokenizer.Token tt = m_t.get(); assertEquals(Tokenizer.EOF, tt.type); m_t = new Tokenizer(" "); tt = m_t.get(); assertEquals(Tokenizer.EOF, tt.type); } public void test_multiple_ungets() throws IOException { m_t = new Tokenizer("a simple one"); Tokenizer.Token tt = m_t.get(); m_t.unget(); try { m_t.unget(); fail("IllegalStateException not thrown"); } catch( IllegalStateException e ){} } public void test_getString() throws IOException { m_t = new Tokenizer("just_an_identifier"); String out = m_t.getString(); assertEquals("just_an_identifier", out); m_t = new Tokenizer("\"just a string\""); out = m_t.getString(); assertEquals("just a string", out); m_t = new Tokenizer("; just a comment"); try { out = m_t.getString(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getIdentifier() throws IOException { m_t = new Tokenizer("just_an_identifier"); String out = m_t.getIdentifier(); assertEquals("just_an_identifier", out); m_t = new Tokenizer("\"just a string\""); try { m_t.getIdentifier(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getLong() throws IOException { m_t = new Tokenizer((Integer.MAX_VALUE+1L) + ""); long out = m_t.getLong(); assertEquals((Integer.MAX_VALUE+1L), out); m_t = new Tokenizer("-10"); try { m_t.getLong(); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("19_identifier"); try { m_t.getLong(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getUInt32() throws IOException { m_t = new Tokenizer(0xABCDEF12L + ""); long out = m_t.getUInt32(); assertEquals(0xABCDEF12L, out); m_t = new Tokenizer(0x100000000L + ""); try { m_t.getUInt32(); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("-12345"); try { m_t.getUInt32(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getUInt16() throws IOException { m_t = new Tokenizer(0xABCDL + ""); int out = m_t.getUInt16(); assertEquals(0xABCDL, out); m_t = new Tokenizer(0x10000 + ""); try { m_t.getUInt16(); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("-125"); try { m_t.getUInt16(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getUInt8() throws IOException { m_t = new Tokenizer(0xCDL + ""); int out = m_t.getUInt8(); assertEquals(0xCDL, out); m_t = new Tokenizer(0x100 + ""); try { m_t.getUInt8(); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("-12"); try { m_t.getUInt8(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getTTL() throws IOException { m_t = new Tokenizer("59S"); assertEquals(59, m_t.getTTL()); m_t = new Tokenizer(TTL.MAX_VALUE + ""); assertEquals(TTL.MAX_VALUE, m_t.getTTL()); m_t = new Tokenizer((TTL.MAX_VALUE+1L) + ""); assertEquals(TTL.MAX_VALUE, m_t.getTTL()); m_t = new Tokenizer("Junk"); try { m_t.getTTL(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getTTLLike() throws IOException { m_t = new Tokenizer("59S"); assertEquals(59, m_t.getTTLLike()); m_t = new Tokenizer(TTL.MAX_VALUE + ""); assertEquals(TTL.MAX_VALUE, m_t.getTTLLike()); m_t = new Tokenizer((TTL.MAX_VALUE+1L) + ""); assertEquals(TTL.MAX_VALUE+1L, m_t.getTTLLike()); m_t = new Tokenizer("Junk"); try { m_t.getTTLLike(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getName() throws IOException, TextParseException { Name root = Name.fromString("."); m_t = new Tokenizer("junk"); Name exp = Name.fromString("junk."); Name out = m_t.getName(root); assertEquals(exp, out); Name rel = Name.fromString("you.dig"); m_t = new Tokenizer("junk"); try { m_t.getName(rel); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} m_t = new Tokenizer(""); try { m_t.getName(root); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getEOL() throws IOException { m_t = new Tokenizer("id"); m_t.getIdentifier(); try { m_t.getEOL(); } catch( TextParseException e ){ fail(e.getMessage()); } m_t = new Tokenizer("\n"); try { m_t.getEOL(); m_t.getEOL(); } catch( TextParseException e ){ fail(e.getMessage()); } m_t = new Tokenizer("id"); try { m_t.getEOL(); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getBase64() throws IOException { byte[] exp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // basic m_t = new Tokenizer("AQIDBAUGBwgJ"); byte[] out = m_t.getBase64(); assertEquals(exp, out); // with some whitespace m_t = new Tokenizer("AQIDB AUGB wgJ"); out = m_t.getBase64(); assertEquals(exp, out); // two base64s separated by newline m_t = new Tokenizer("AQIDBAUGBwgJ\nAB23DK"); out = m_t.getBase64(); assertEquals(exp, out); // no remaining strings m_t = new Tokenizer("\n"); assertNull( m_t.getBase64() ); m_t = new Tokenizer("\n"); try { m_t.getBase64(true); fail("TextParseException not thrown"); } catch( TextParseException e ){} // invalid encoding m_t = new Tokenizer("not_base64"); try { m_t.getBase64(false); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("not_base64"); try { m_t.getBase64(true); fail("TextParseException not thrown"); } catch( TextParseException e ){} } public void test_getHex() throws IOException { byte[] exp = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; // basic m_t = new Tokenizer("0102030405060708090A0B0C0D0E0F"); byte[] out = m_t.getHex(); assertEquals(exp, out); // with some whitespace m_t = new Tokenizer("0102030 405 060708090A0B0C 0D0E0F"); out = m_t.getHex(); assertEquals(exp, out); // two hexs separated by newline m_t = new Tokenizer("0102030405060708090A0B0C0D0E0F\n01AB3FE"); out = m_t.getHex(); assertEquals(exp, out); // no remaining strings m_t = new Tokenizer("\n"); assertNull( m_t.getHex() ); m_t = new Tokenizer("\n"); try { m_t.getHex(true); fail("TextParseException not thrown"); } catch( TextParseException e ){} // invalid encoding m_t = new Tokenizer("not_hex"); try { m_t.getHex(false); fail("TextParseException not thrown"); } catch( TextParseException e ){} m_t = new Tokenizer("not_hex"); try { m_t.getHex(true); fail("TextParseException not thrown"); } catch( TextParseException e ){} } } dnsjava-2.1.5/tests/org/xbill/DNS/TypeBitmapTest.java100644 0 0 4212 11574245370 17553 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2011, org.xbill.DNS // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class TypeBitmapTest extends TestCase { public void test_empty() { TypeBitmap typeBitmap = new TypeBitmap(new int[]{}); assertEquals(typeBitmap.toString(), ""); } public void test_typeA() { TypeBitmap typeBitmap = new TypeBitmap(new int[]{1}); assertEquals(typeBitmap.toString(), "A"); } public void test_typeNSandSOA() { TypeBitmap typeBitmap = new TypeBitmap(new int[]{2, 6}); assertEquals(typeBitmap.toString(), "NS SOA"); } } dnsjava-2.1.5/tests/org/xbill/DNS/TypeTest.java100644 0 0 5147 10242022601 16403 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import junit.framework.TestCase; public class TypeTest extends TestCase { public void test_string() { // a regular one assertEquals("CNAME", Type.string(Type.CNAME)); // one that doesn't exist assertTrue(Type.string(256).startsWith("TYPE")); try { Type.string(-1); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){ } } public void test_value() { // regular one assertEquals(Type.MAILB, Type.value("MAILB")); // one thats undefined but within range assertEquals(300, Type.value("TYPE300")); // something that unknown assertEquals(-1, Type.value("THIS IS DEFINITELY UNKNOWN")); // empty string assertEquals(-1, Type.value("")); } public void test_value_2arg() { assertEquals(301, Type.value("301", true)); } public void test_isRR() { assertTrue(Type.isRR(Type.CNAME)); assertFalse(Type.isRR(Type.IXFR)); } } dnsjava-2.1.5/tests/org/xbill/DNS/U16NameBaseTest.java100644 0 0 14324 10242022601 17446 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS; import java.io.IOException; import java.util.Arrays; import junit.framework.TestCase; public class U16NameBaseTest extends TestCase { private void assertEquals( byte[] exp, byte[] act ) { assertTrue(java.util.Arrays.equals(exp, act)); } private static class TestClass extends U16NameBase { public TestClass(){} public TestClass(Name name, int type, int dclass, long ttl) { super(name, type, dclass, ttl); } public TestClass(Name name, int type, int dclass, long ttl, int u16Field, String u16Description, Name nameField, String nameDescription) { super(name, type, dclass, ttl, u16Field, u16Description, nameField, nameDescription); } public int getU16Field() { return super.getU16Field(); } public Name getNameField() { return super.getNameField(); } public Record getObject() { return null; } } public void test_ctor_0arg() { TestClass tc = new TestClass(); assertNull(tc.getName()); assertEquals(0, tc.getType()); assertEquals(0, tc.getDClass()); assertEquals(0, tc.getTTL()); assertEquals(0, tc.getU16Field()); assertNull(tc.getNameField()); } public void test_ctor_4arg() throws TextParseException { Name n = Name.fromString("My.Name."); TestClass tc = new TestClass(n, Type.MX, DClass.IN, 0xBCDA); assertSame(n, tc.getName()); assertEquals(Type.MX, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(0xBCDA, tc.getTTL()); assertEquals(0, tc.getU16Field()); assertNull(tc.getNameField()); } public void test_ctor_8arg() throws TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.Other.Name."); TestClass tc = new TestClass(n, Type.MX, DClass.IN, 0xB12FL, 0x1F2B, "u16 description", m, "name description"); assertSame(n, tc.getName()); assertEquals(Type.MX, tc.getType()); assertEquals(DClass.IN, tc.getDClass()); assertEquals(0xB12FL, tc.getTTL()); assertEquals(0x1F2B, tc.getU16Field()); assertEquals(m, tc.getNameField()); // an invalid u16 value try { new TestClass(n, Type.MX, DClass.IN, 0xB12FL, 0x10000, "u16 description", m, "name description"); fail("IllegalArgumentException not thrown"); } catch( IllegalArgumentException e ){} // a relative name Name rel = Name.fromString("My.relative.Name"); try { new TestClass(n, Type.MX, DClass.IN, 0xB12FL, 0x1F2B, "u16 description", rel, "name description"); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_rrFromWire() throws IOException { byte[] raw = new byte[] { (byte)0xBC, (byte)0x1F, 2, 'M', 'y', 6, 's', 'i', 'N', 'g', 'l', 'E', 4, 'n', 'A', 'm', 'E', 0 }; DNSInput in = new DNSInput(raw); TestClass tc = new TestClass(); tc.rrFromWire(in); Name exp = Name.fromString("My.single.name."); assertEquals(0xBC1FL, tc.getU16Field()); assertEquals(exp, tc.getNameField()); } public void test_rdataFromString() throws IOException { Name exp = Name.fromString("My.Single.Name."); Tokenizer t = new Tokenizer(0x19A2 + " My.Single.Name."); TestClass tc = new TestClass(); tc.rdataFromString(t, null); assertEquals(0x19A2, tc.getU16Field()); assertEquals(exp, tc.getNameField()); t = new Tokenizer("10 My.Relative.Name"); tc = new TestClass(); try { tc.rdataFromString(t, null); fail("RelativeNameException not thrown"); } catch( RelativeNameException e ){} } public void test_rrToString() throws IOException, TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("My.Other.Name."); TestClass tc = new TestClass(n, Type.MX, DClass.IN, 0xB12FL, 0x1F2B, "u16 description", m, "name description"); String out = tc.rrToString(); String exp = 0x1F2B + " My.Other.Name."; assertEquals(exp, out); } public void test_rrToWire() throws IOException, TextParseException { Name n = Name.fromString("My.Name."); Name m = Name.fromString("M.O.n."); TestClass tc = new TestClass(n, Type.MX, DClass.IN, 0xB12FL, 0x1F2B, "u16 description", m, "name description"); // canonical DNSOutput dout = new DNSOutput(); tc.rrToWire(dout, null, true); byte[] out = dout.toByteArray(); byte[] exp = new byte[] { 0x1F, 0x2B, 1, 'm', 1, 'o', 1, 'n', 0 }; assertTrue(Arrays.equals(exp, out)); // case sensitive dout = new DNSOutput(); tc.rrToWire(dout, null, false); out = dout.toByteArray(); exp = new byte[] { 0x1F, 0x2B, 1, 'M', 1, 'O', 1, 'n', 0 }; assertTrue(Arrays.equals(exp, out)); } } dnsjava-2.1.5/tests/org/xbill/DNS/utils/HMACTest.java100644 0 0 13151 10242022601 17344 0ustar 0 0 // -*- Java -*- // // Copyright (c) 2005, Matthew J. Rutherford // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import junit.framework.TestCase; public class HMACTest extends TestCase { private static class test_data { public byte[] key; public byte[] data; public byte[] digest; } private static test_data[] tests; static { // These test cases come directly from RFC 2202 (for MD5) tests = new test_data[7]; for( int i=0; i // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS.utils; import junit.framework.TestCase; public class base16Test extends TestCase { public base16Test( String name ) { super(name); } public void test_toString_emptyArray() { String out = base16.toString( new byte[ 0 ] ); assertEquals( "", out ); } public void test_toString_singleByte1() { byte[] data = { (byte)1 }; String out = base16.toString( data ); assertEquals( "01", out ); } public void test_toString_singleByte2() { byte[] data = { (byte)16 }; String out = base16.toString( data ); assertEquals( "10", out ); } public void test_toString_singleByte3() { byte[] data = { (byte)255 }; String out = base16.toString( data ); assertEquals( "FF", out ); } public void test_toString_array1() { byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; String out = base16.toString( data ); assertEquals( "0102030405060708090A0B0C0D0E0F", out ); } public void test_fromString_emptyString() { String data = ""; byte[] out = base16.fromString( data ); assertEquals( 0, out.length ); } public void test_fromString_invalidStringLength() { String data = "1"; byte[] out = base16.fromString( data ); assertNull( out ); } public void test_fromString_nonHexChars() { String data = "GG"; byte[] out = base16.fromString( data ); /* * the output is basically encoded as (-1<<4) + -1, not sure * we want an assertion for this. */ } public void test_fromString_normal() { String data = "0102030405060708090A0B0C0D0E0F"; byte[] out = base16.fromString( data ); byte[] exp = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; assertEquals( exp.length, out.length ); for( int i=0; i // Copyright (c) 2005, University of Colorado at Boulder // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of the University of Colorado at Boulder nor the // names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package org.xbill.DNS.utils; import junit.framework.TestCase; public class base64Test extends TestCase { public base64Test( String name ) { super(name); } public void test_toString_empty() { byte[] data = new byte [ 0 ]; String out = base64.toString( data ); assertEquals( "", out ); } public void test_toString_basic1() { byte[] data = { 0 }; String out = base64.toString( data ); assertEquals( "AA==", out ); } public void test_toString_basic2() { byte[] data = { 0, 0 }; String out = base64.toString( data ); assertEquals( "AAA=", out ); } public void test_toString_basic3() { byte[] data = { 0, 0, 1 }; String out = base64.toString( data ); assertEquals( "AAAB", out ); } public void test_toString_basic4() { byte[] data = { (byte)0xFC, 0, 0 }; String out = base64.toString( data ); assertEquals( "/AAA", out ); } public void test_toString_basic5() { byte[] data = { (byte)0xFF, (byte)0xFF, (byte)0xFF }; String out = base64.toString( data ); assertEquals( "////", out ); } public void test_toString_basic6() { byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; String out = base64.toString( data ); assertEquals( "AQIDBAUGBwgJ", out ); } public void test_formatString_empty1() { String out = base64.formatString( new byte [ 0 ], 5, "", false ); assertEquals( "", out ); } public void test_formatString_shorter() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 13, "", false ); assertEquals( "AQIDBAUGBwgJ", out ); } public void test_formatString_sameLength() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 12, "", false ); assertEquals( "AQIDBAUGBwgJ", out ); } public void test_formatString_oneBreak() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 10, "", false ); assertEquals( "AQIDBAUGBw\ngJ", out ); } public void test_formatString_twoBreaks1() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 5, "", false ); assertEquals( "AQIDB\nAUGBw\ngJ", out ); } public void test_formatString_twoBreaks2() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 4, "", false ); assertEquals( "AQID\nBAUG\nBwgJ", out ); } public void test_formatString_shorterWithPrefix() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 13, "!_", false ); assertEquals( "!_AQIDBAUGBwgJ", out ); } public void test_formatString_sameLengthWithPrefix() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 12, "!_", false ); assertEquals( "!_AQIDBAUGBwgJ", out ); } public void test_formatString_oneBreakWithPrefix() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 10, "!_", false ); assertEquals( "!_AQIDBAUGBw\n!_gJ", out ); } public void test_formatString_twoBreaks1WithPrefix() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 5, "!_", false ); assertEquals( "!_AQIDB\n!_AUGBw\n!_gJ", out ); } public void test_formatString_twoBreaks2WithPrefix() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 4, "!_", false ); assertEquals( "!_AQID\n!_BAUG\n!_BwgJ", out ); } public void test_formatString_shorterWithPrefixAndClose() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 13, "!_", true ); assertEquals( "!_AQIDBAUGBwgJ )", out ); } public void test_formatString_sameLengthWithPrefixAndClose() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 12, "!_", true ); assertEquals( "!_AQIDBAUGBwgJ )", out ); } public void test_formatString_oneBreakWithPrefixAndClose() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 10, "!_", true ); assertEquals( "!_AQIDBAUGBw\n!_gJ )", out ); } public void test_formatString_twoBreaks1WithPrefixAndClose() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 5, "!_", true ); assertEquals( "!_AQIDB\n!_AUGBw\n!_gJ )", out ); } public void test_formatString_twoBreaks2WithPrefixAndClose() { byte[] in = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // "AQIDBAUGBwgJ" (12 chars) String out = base64.formatString( in, 4, "!_", true ); assertEquals( "!_AQID\n!_BAUG\n!_BwgJ )", out ); } private void assertEquals( byte[] exp, byte[] act ) { assertEquals( exp.length, act.length ); for( int i=0; i "); line = br.readLine(); if (line == null) { br.close(); inputs.remove(0); istreams.remove(0); if (inputs.isEmpty()) return; } } while (line == null); if (log != null) log.println("> " + line); if (line.length() == 0 || line.charAt(0) == '#') continue; /* Allows cut and paste from other update sessions */ if (line.charAt(0) == '>') line = line.substring(1); Tokenizer st = new Tokenizer(line); Tokenizer.Token token = st.get(); if (token.isEOL()) continue; String operation = token.value; if (operation.equals("server")) { server = st.getString(); res = new SimpleResolver(server); token = st.get(); if (token.isString()) { String portstr = token.value; res.setPort(Short.parseShort(portstr)); } } else if (operation.equals("key")) { String keyname = st.getString(); String keydata = st.getString(); if (res == null) res = new SimpleResolver(server); res.setTSIGKey(new TSIG(keyname, keydata)); } else if (operation.equals("edns")) { if (res == null) res = new SimpleResolver(server); res.setEDNS(st.getUInt16()); } else if (operation.equals("port")) { if (res == null) res = new SimpleResolver(server); res.setPort(st.getUInt16()); } else if (operation.equals("tcp")) { if (res == null) res = new SimpleResolver(server); res.setTCP(true); } else if (operation.equals("class")) { String classStr = st.getString(); int newClass = DClass.value(classStr); if (newClass > 0) defaultClass = newClass; else print("Invalid class " + classStr); } else if (operation.equals("ttl")) defaultTTL = st.getTTL(); else if (operation.equals("origin") || operation.equals("zone")) { zone = st.getName(Name.root); } else if (operation.equals("require")) doRequire(st); else if (operation.equals("prohibit")) doProhibit(st); else if (operation.equals("add")) doAdd(st); else if (operation.equals("delete")) doDelete(st); else if (operation.equals("glue")) doGlue(st); else if (operation.equals("help") || operation.equals("?")) { token = st.get(); if (token.isString()) help(token.value); else help(null); } else if (operation.equals("echo")) print(line.substring(4).trim()); else if (operation.equals("send")) { sendUpdate(); query = newMessage(); } else if (operation.equals("show")) { print(query); } else if (operation.equals("clear")) query = newMessage(); else if (operation.equals("query")) doQuery(st); else if (operation.equals("quit") || operation.equals("q")) { if (log != null) log.close(); Iterator it = inputs.iterator(); while (it.hasNext()) { BufferedReader tbr; tbr = (BufferedReader) it.next(); tbr.close(); } System.exit(0); } else if (operation.equals("file")) doFile(st, inputs, istreams); else if (operation.equals("log")) doLog(st); else if (operation.equals("assert")) { if (doAssert(st) == false) return; } else if (operation.equals("sleep")) { long interval = st.getUInt32(); try { Thread.sleep(interval); } catch (InterruptedException e) { } } else if (operation.equals("date")) { Date now = new Date(); token = st.get(); if (token.isString() && token.value.equals("-ms")) print(Long.toString(now.getTime())); else print(now); } else print("invalid keyword: " + operation); } catch (TextParseException tpe) { System.out.println(tpe.getMessage()); } catch (InterruptedIOException iioe) { System.out.println("Operation timed out"); } catch (SocketException se) { System.out.println("Socket error"); } catch (IOException ioe) { System.out.println(ioe); } } } void sendUpdate() throws IOException { if (query.getHeader().getCount(Section.UPDATE) == 0) { print("Empty update message. Ignoring."); return; } if (query.getHeader().getCount(Section.ZONE) == 0) { Name updzone; updzone = zone; int dclass = defaultClass; if (updzone == null) { Record [] recs = query.getSectionArray(Section.UPDATE); for (int i = 0; i < recs.length; i++) { if (updzone == null) updzone = new Name(recs[i].getName(), 1); if (recs[i].getDClass() != DClass.NONE && recs[i].getDClass() != DClass.ANY) { dclass = recs[i].getDClass(); break; } } } Record soa = Record.newRecord(updzone, Type.SOA, dclass); query.addRecord(soa, Section.ZONE); } if (res == null) res = new SimpleResolver(server); response = res.send(query); print(response); } /* * [ttl] [class] * Ignore the class, if present. */ Record parseRR(Tokenizer st, int classValue, long TTLValue) throws IOException { Name name = st.getName(zone); long ttl; int type; Record record; String s = st.getString(); try { ttl = TTL.parseTTL(s); s = st.getString(); } catch (NumberFormatException e) { ttl = TTLValue; } if (DClass.value(s) >= 0) { classValue = DClass.value(s); s = st.getString(); } if ((type = Type.value(s)) < 0) throw new IOException("Invalid type: " + s); record = Record.fromString(name, type, classValue, ttl, st, zone); if (record != null) return (record); else throw new IOException("Parse error"); } void doRequire(Tokenizer st) throws IOException { Tokenizer.Token token; Name name; Record record; int type; name = st.getName(zone); token = st.get(); if (token.isString()) { if ((type = Type.value(token.value)) < 0) throw new IOException("Invalid type: " + token.value); token = st.get(); boolean iseol = token.isEOL(); st.unget(); if (!iseol) { record = Record.fromString(name, type, defaultClass, 0, st, zone); } else record = Record.newRecord(name, type, DClass.ANY, 0); } else record = Record.newRecord(name, Type.ANY, DClass.ANY, 0); query.addRecord(record, Section.PREREQ); print(record); } void doProhibit(Tokenizer st) throws IOException { Tokenizer.Token token; Name name; Record record; int type; name = st.getName(zone); token = st.get(); if (token.isString()) { if ((type = Type.value(token.value)) < 0) throw new IOException("Invalid type: " + token.value); } else type = Type.ANY; record = Record.newRecord(name, type, DClass.NONE, 0); query.addRecord(record, Section.PREREQ); print(record); } void doAdd(Tokenizer st) throws IOException { Record record = parseRR(st, defaultClass, defaultTTL); query.addRecord(record, Section.UPDATE); print(record); } void doDelete(Tokenizer st) throws IOException { Tokenizer.Token token; String s; Name name; Record record; int type; name = st.getName(zone); token = st.get(); if (token.isString()) { s = token.value; if (DClass.value(s) >= 0) { s = st.getString(); } if ((type = Type.value(s)) < 0) throw new IOException("Invalid type: " + s); token = st.get(); boolean iseol = token.isEOL(); st.unget(); if (!iseol) { record = Record.fromString(name, type, DClass.NONE, 0, st, zone); } else record = Record.newRecord(name, type, DClass.ANY, 0); } else record = Record.newRecord(name, Type.ANY, DClass.ANY, 0); query.addRecord(record, Section.UPDATE); print(record); } void doGlue(Tokenizer st) throws IOException { Record record = parseRR(st, defaultClass, defaultTTL); query.addRecord(record, Section.ADDITIONAL); print(record); } void doQuery(Tokenizer st) throws IOException { Record rec; Tokenizer.Token token; Name name = null; int type = Type.A; int dclass = defaultClass; name = st.getName(zone); token = st.get(); if (token.isString()) { type = Type.value(token.value); if (type < 0) throw new IOException("Invalid type"); token = st.get(); if (token.isString()) { dclass = DClass.value(token.value); if (dclass < 0) throw new IOException("Invalid class"); } } rec = Record.newRecord(name, type, dclass); Message newQuery = Message.newQuery(rec); if (res == null) res = new SimpleResolver(server); response = res.send(newQuery); print(response); } void doFile(Tokenizer st, List inputs, List istreams) throws IOException { String s = st.getString(); InputStream is; try { if (s.equals("-")) is = System.in; else is = new FileInputStream(s); istreams.add(0, is); inputs.add(0, new BufferedReader(new InputStreamReader(is))); } catch (FileNotFoundException e) { print(s + " not found"); } } void doLog(Tokenizer st) throws IOException { String s = st.getString(); try { FileOutputStream fos = new FileOutputStream(s); log = new PrintStream(fos); } catch (Exception e) { print("Error opening " + s); } } boolean doAssert(Tokenizer st) throws IOException { String field = st.getString(); String expected = st.getString(); String value = null; boolean flag = true; int section; if (response == null) { print("No response has been received"); return true; } if (field.equalsIgnoreCase("rcode")) { int rcode = response.getHeader().getRcode(); if (rcode != Rcode.value(expected)) { value = Rcode.string(rcode); flag = false; } } else if (field.equalsIgnoreCase("serial")) { Record [] answers = response.getSectionArray(Section.ANSWER); if (answers.length < 1 || !(answers[0] instanceof SOARecord)) print("Invalid response (no SOA)"); else { SOARecord soa = (SOARecord) answers[0]; long serial = soa.getSerial(); if (serial != Long.parseLong(expected)) { value = Long.toString(serial); flag = false; } } } else if (field.equalsIgnoreCase("tsig")) { if (response.isSigned()) { if (response.isVerified()) value = "ok"; else value = "failed"; } else value = "unsigned"; if (!value.equalsIgnoreCase(expected)) flag = false; } else if ((section = Section.value(field)) >= 0) { int count = response.getHeader().getCount(section); if (count != Integer.parseInt(expected)) { value = new Integer(count).toString(); flag = false; } } else print("Invalid assertion keyword: " + field); if (flag == false) { print("Expected " + field + " " + expected + ", received " + value); while (true) { Tokenizer.Token token = st.get(); if (!token.isString()) break; print(token.value); } st.unget(); } return flag; } static void help(String topic) { System.out.println(); if (topic == null) { System.out.println("The following are supported commands:\n" + "add assert class clear date delete\n" + "echo edns file glue help key\n" + "log port prohibit query quit require\n" + "send server show sleep tcp ttl\n" + "zone #\n"); return; } topic = topic.toLowerCase(); if (topic.equals("add")) System.out.println( "add [ttl] [class] \n\n" + "specify a record to be added\n"); else if (topic.equals("assert")) System.out.println( "assert [msg]\n\n" + "asserts that the value of the field in the last\n" + "response matches the value specified. If not,\n" + "the message is printed (if present) and the\n" + "program exits. The field may be any of ,\n" + ", , , , , or .\n"); else if (topic.equals("class")) System.out.println( "class \n\n" + "class of the zone to be updated (default: IN)\n"); else if (topic.equals("clear")) System.out.println( "clear\n\n" + "clears the current update packet\n"); else if (topic.equals("date")) System.out.println( "date [-ms]\n\n" + "prints the current date and time in human readable\n" + "format or as the number of milliseconds since the\n" + "epoch"); else if (topic.equals("delete")) System.out.println( "delete [ttl] [class] \n" + "delete \n" + "delete \n\n" + "specify a record or set to be deleted, or that\n" + "all records at a name should be deleted\n"); else if (topic.equals("echo")) System.out.println( "echo \n\n" + "prints the text\n"); else if (topic.equals("edns")) System.out.println( "edns \n\n" + "EDNS level specified when sending messages\n"); else if (topic.equals("file")) System.out.println( "file \n\n" + "opens the specified file as the new input source\n" + "(- represents stdin)\n"); else if (topic.equals("glue")) System.out.println( "glue [ttl] [class] \n\n" + "specify an additional record\n"); else if (topic.equals("help")) System.out.println( "help\n" + "help [topic]\n\n" + "prints a list of commands or help about a specific\n" + "command\n"); else if (topic.equals("key")) System.out.println( "key \n\n" + "TSIG key used to sign messages\n"); else if (topic.equals("log")) System.out.println( "log \n\n" + "opens the specified file and uses it to log output\n"); else if (topic.equals("port")) System.out.println( "port \n\n" + "UDP/TCP port messages are sent to (default: 53)\n"); else if (topic.equals("prohibit")) System.out.println( "prohibit \n" + "prohibit \n\n" + "require that a set or name is not present\n"); else if (topic.equals("query")) System.out.println( "query [type [class]] \n\n" + "issues a query\n"); else if (topic.equals("q") || topic.equals("quit")) System.out.println( "quit\n\n" + "quits the program\n"); else if (topic.equals("require")) System.out.println( "require [ttl] [class] \n" + "require \n" + "require \n\n" + "require that a record, set, or name is present\n"); else if (topic.equals("send")) System.out.println( "send\n\n" + "sends and resets the current update packet\n"); else if (topic.equals("server")) System.out.println( "server [port]\n\n" + "server that receives send updates/queries\n"); else if (topic.equals("show")) System.out.println( "show\n\n" + "shows the current update packet\n"); else if (topic.equals("sleep")) System.out.println( "sleep \n\n" + "pause for interval before next command\n"); else if (topic.equals("tcp")) System.out.println( "tcp\n\n" + "TCP should be used to send all messages\n"); else if (topic.equals("ttl")) System.out.println( "ttl \n\n" + "default ttl of added records (default: 0)\n"); else if (topic.equals("zone") || topic.equals("origin")) System.out.println( "zone \n\n" + "zone to update (default: .\n"); else if (topic.equals("#")) System.out.println( "# \n\n" + "a comment\n"); else System.out.println ("Topic '" + topic + "' unrecognized\n"); } public static void main(String args[]) throws IOException { InputStream in = null; if (args.length >= 1) { try { in = new FileInputStream(args[0]); } catch (FileNotFoundException e) { System.out.println(args[0] + " not found."); System.exit(1); } } else in = System.in; update u = new update(in); } }